]> Git — Sourcephile - julm/julm-nix.git/blob - home-manager/profiles/nvim.nix
+use/op(nix): add nix-run to use nom
[julm/julm-nix.git] / home-manager / profiles / nvim.nix
1 {
2 inputs,
3 lib,
4 pkgs,
5 config,
6 ...
7 }:
8 let
9 nvim-impure = "/home/julm/work/sourcephile/nix/julm-nix/home-manager/profiles/nvim/";
10 optionalPlugin = plugin: {
11 inherit plugin;
12 optional = true;
13 };
14 in
15 {
16 # Explanation(maint/modifiability):
17 # home-manager provides a (convoluted) wrapper around pkgs.wrapNeovimUnstable,
18 # and writes a minimal ~/.config/nvim/init.lua
19 # which is here configured to source ./nvim from:
20 # - either ${nvim-impure} which is where I store ./nvim before it gets into the Nix store.
21 # - or ./nvim copied into the Nix store when rebuilding the system with home-manager.
22 #
23 # So, for quick feedback:
24 # - if only ./nvim has changed: relaunch nvim
25 # - or if only new plugin packages are required, rebuild nvim:
26 # nix -L build .#nixosConfigurations.nan2gua1.config.home-manager.users.julm.programs.neovim.finalPackage &&
27 # result/bin/nvim
28 # - or if external packages need to be install: reinstall normally
29 programs.neovim = {
30 enable = lib.mkDefault true;
31 extraLuaConfig = lib.concatStringsSep "\n" [
32 # Lua config for normal usage
33 "vim.opt.runtimepath:prepend('${./nvim}')"
34 # Lua config for quick feedback when changing ./nvim
35 "vim.opt.runtimepath:prepend('${nvim-impure}')"
36 # Load ./nvim/lua/config
37 "require('config')"
38 # Lazy load ./nvim/lua/plugins
39 "require('lz.n').load('plugins')"
40 # Overrides `require()` to also search for optional plugins and load them with lz.n
41 "require('lzn-auto-require').enable()"
42 ];
43 plugins = [
44 pkgs.vimPlugins.lz-n
45 pkgs.vimPlugins.lzn-auto-require
46 ]
47 ++ lib.map optionalPlugin [
48 pkgs.vimPlugins.blink-cmp
49 pkgs.vimPlugins.comment-nvim
50 pkgs.vimPlugins.conform-nvim
51 pkgs.vimPlugins.fastaction-nvim
52 #pkgs.vimPlugins.fine-cmdline-nvim
53 pkgs.vimPlugins.git-conflict-nvim
54 pkgs.vimPlugins.github-nvim-theme
55 pkgs.vimPlugins.gitlinker-nvim
56 pkgs.vimPlugins.gitsigns-nvim
57 pkgs.vimPlugins.haskell-tools-nvim
58 (pkgs.vimUtils.buildVimPlugin {
59 pname = "jj-diffconflicts.nvim";
60 version = "main";
61 src = inputs.jj-diffconflicts;
62 })
63 pkgs.vimPlugins.elixir-tools-nvim
64 pkgs.vimPlugins.hunk-nvim
65 pkgs.vimPlugins.image-nvim
66 (pkgs.vimUtils.buildVimPlugin {
67 pname = "jj.nvim";
68 version = "master";
69 src = inputs.jj-nvim;
70 })
71 pkgs.vimPlugins.lualine-nvim
72 /*
73 (pkgs.vimUtils.buildVimPlugin {
74 pname = "modes.nvim";
75 version = "master";
76 src = inputs.modes-nvim;
77 })
78 */
79 pkgs.vimPlugins.neo-tree-nvim
80 #pkgs.vimPlugins.neovim-ayu
81 pkgs.vimPlugins.nvim-colorizer-lua
82 pkgs.vimPlugins.nvim-fzf # For telescope
83 pkgs.vimPlugins.nvim-lint
84 pkgs.vimPlugins.nvim-navbuddy
85 pkgs.vimPlugins.nvim-navic # For navbuddy
86 pkgs.vimPlugins.nvim-rg
87 pkgs.vimPlugins.nvim-treesitter.withAllGrammars
88 pkgs.vimPlugins.nvim-web-devicons
89 /*
90 (pkgs.vimUtils.buildVimPlugin {
91 pname = "solarized-osaka.nvim";
92 version = "master";
93 src = inputs.solarized-osaka-nvim;
94 doCheck = false;
95 })
96 */
97 # pkgs.vimPlugins.sqlite-lua # For telescope-smart-history.nvim
98 pkgs.vimPlugins.telescope-fzf-native-nvim
99 pkgs.vimPlugins.telescope-git-conflicts-nvim
100 pkgs.vimPlugins.telescope-live-grep-args-nvim
101 pkgs.vimPlugins.telescope-nvim
102 pkgs.vimPlugins.telescope-smart-history-nvim
103 pkgs.vimPlugins.trouble-nvim
104 pkgs.vimPlugins.vim-illuminate
105 pkgs.vimPlugins.which-key-nvim
106 ];
107
108 viAlias = true;
109 vimAlias = false;
110
111 withNodeJs = false;
112 #withPerl = false;
113 withPython3 = false;
114 withRuby = false;
115 # For image-nvim
116 extraLuaPackages = ps: [ ps.magick ];
117 extraPackages = [ pkgs.imagemagick ];
118
119 # Jailing neovim
120 package =
121 pkgs.firejailWrap {
122 package = pkgs.neovim-unwrapped;
123 args = [
124 "--quiet"
125 "--profile=nvim"
126 ];
127 }
128 // {
129 inherit (pkgs.neovim-unwrapped) lua;
130 };
131 };
132 xdg.configFile."firejail/nvim.local".text = lib.concatStringsSep "\n" [
133 # For jj
134 "include ${firejail/allow-jujutsu.inc}"
135 # For image-nvim
136 "noblacklist /tmp/tmux-*"
137 # For git status, eg. ~/.config/git/ignore
138 "noblacklist \${HOME}/.config/git"
139 # Reallow cc for LSPs, including Haskell's LSP
140 "ignore include disable-devel.inc"
141 ];
142 home.packages = lib.mkIf config.programs.neovim.enable (
143 lib.flatten (
144 lib.attrValues {
145 formatters = [
146 pkgs.gdtoolkit_4
147 pkgs.nixfmt-rfc-style
148 #pkgs.fourmolu
149 #pkgs.rustfmt
150 pkgs.shfmt
151 pkgs.stylua
152 ];
153 linters = [
154 pkgs.statix
155 pkgs.deadnix
156 pkgs.shellcheck
157 #pkgs.hlint
158 ];
159 lsp = [
160 pkgs.bash-language-server
161 #pkgs.elixir-ls
162 pkgs.lua-language-server
163 #pkgs.next-ls
164 pkgs.nil
165 pkgs.nixd
166 #pkgs.rust-analyzer
167 ];
168 snacks = [
169 pkgs.fd
170 pkgs.ripgrep
171 ];
172 neovim = [
173 pkgs.ripgrep
174 ]
175 ++ lib.optionals pkgs.stdenv.hostPlatform.isLinux [
176 pkgs.xclip
177 pkgs.wl-clipboard
178 ];
179 }
180 )
181 );
182 }