109 lines
3.3 KiB
Nix
109 lines
3.3 KiB
Nix
{ config, pkgs, lib, ... }: with lib; let
|
|
rust-analyzer = if (pkgs ? rust-analyzer-nightly && config.class ? dev) then pkgs.rust-analyzer-nightly else pkgs.rust-analyzer;
|
|
rust-sdk = with pkgs; if config.class ? dev then
|
|
symlinkJoin
|
|
{
|
|
name = "nvim-fenix";
|
|
paths = [
|
|
(fenix.latest.withComponents [
|
|
"cargo"
|
|
"clippy-preview"
|
|
"rust-src"
|
|
"rust-std"
|
|
"rustc"
|
|
"rustfmt-preview"
|
|
])
|
|
cargo-watch
|
|
];
|
|
} else symlinkJoin { name = "nvim-rust"; paths = [ rustc cargo rustfmt clippy cargo-watch ]; };
|
|
in
|
|
{
|
|
|
|
programs.neovim = {
|
|
# https://github.com/nix-community/home-manager/blob/master/modules/programs/neovim.nix
|
|
enable = true;
|
|
vimAlias = true;
|
|
withNodeJs = true;
|
|
extraPackages = with pkgs; [ fzf xclip fish ];
|
|
plugins = with pkgs.vimPlugins; [
|
|
vim-fugitive
|
|
neogit
|
|
diffview-nvim
|
|
vim-airline
|
|
zephyr-nvim
|
|
vim-toml
|
|
elm-vim
|
|
vim-markdown
|
|
vim-mergetool
|
|
split-term-vim
|
|
# vim-grammarous
|
|
markdown-preview-nvim
|
|
rainbow
|
|
nvim-web-devicons
|
|
fzf-vim
|
|
editorconfig-nvim
|
|
vim-vsnip
|
|
# tmuxline-vim
|
|
nvim-dap
|
|
nvim-dap-ui
|
|
nvim-notify
|
|
nvim-cmp
|
|
cmp-nvim-lsp
|
|
cmp-nvim-lua
|
|
cmp-buffer
|
|
cmp-path
|
|
cmp-spell
|
|
cmp-vsnip
|
|
cmp-conventionalcommits
|
|
cmp-calc
|
|
cmp-cmdline
|
|
rustaceanvim
|
|
(if config.programs.neovim.package.version == "0.10.0" then throw "lsp-inlayhints-nvim may be removed" else lsp-inlayhints-nvim) # https://github.com/mrcjkb/rustaceanvim/discussions/46#discussioncomment-7620822
|
|
plenary-nvim
|
|
crates-nvim
|
|
nvim-lspconfig
|
|
telescope-nvim
|
|
telescope-undo-nvim
|
|
oil-nvim
|
|
];
|
|
|
|
extraLuaConfig =
|
|
let
|
|
# tries to compute a package set required to make package resolution in lua
|
|
# via deps["pkg"] work
|
|
packages = file:
|
|
let
|
|
out = builtins.readFile (pkgs.runCommandLocal "extract-deps"
|
|
{ nativeBuildInputs = [ pkgs.gnused ]; __contentAddressed = true; } ''
|
|
sed -nr 's/.*(deps\.(.*)_path|deps\["(.*)"\]).*/\2/p' ${file} | uniq > $out
|
|
'');
|
|
names = lib.splitString "\n" out;
|
|
in
|
|
filter (name: name != "") names;
|
|
paths = (listToAttrs (map (name: { inherit name; value = builtins.getAttr name pkgs; }) (packages "${confDir}/*.lua"))) // {
|
|
lldb = pkgs.lldb;
|
|
rust_analyzer = rust-analyzer;
|
|
typst_lsp = pkgs.typst-lsp;
|
|
};
|
|
pathsLua = let name = "nvim-deps.lua"; in (pkgs.writeTextDir "/${name}"
|
|
''
|
|
deps = {}
|
|
${concatStringsSep "\n" (mapAttrsToList (name: path: ''deps["${name}_path"] = "${path}"'') paths)}
|
|
return deps
|
|
'') + "/${name}";
|
|
|
|
confDir = lib.sourceFilesBySuffices ./. [ "lua" "vim" ];
|
|
in
|
|
with lib; ''
|
|
vim.cmd [[source ${confDir}/init.vim]]
|
|
package.path = package.path .. ";${confDir}/?.lua;${pathsLua};"
|
|
dofile("${confDir}/init.lua")
|
|
'';
|
|
};
|
|
programs.git.ignores = [ ".nvim_session" ];
|
|
home.sessionVariables = rec {
|
|
EDITOR = "nvim";
|
|
VISUAL_EDITOR = EDITOR;
|
|
};
|
|
}
|