nixos-configuration/home-manager/modules/neovim.nix
2023-07-12 12:35:37 +00:00

174 lines
5.5 KiB
Nix

{ lib, nixosConfig, config, pkgs, ... }:
{
home.sessionVariables = {
EDITOR = "nvim";
};
programs.neovim = {
enable = true;
vimAlias = true;
extraConfig = ''
" use space as leader
let mapleader = " "
colorscheme NeoSolarized
"""""""""""""""""
" Swap and undo "
set noswapfile
set nobackup
if has('persistent_undo')
" yay persistent undo
:silent !mkdir -p ~/.local/vim-undo
set undofile
set undodir=~/.local/vim-undo
endif
cabbr <expr> %% expand('%:p:h')
set listchars=trail:·,precedes:«,extends:»,eol:,tab:\
nmap <silent> <leader>c :set list!<CR>
set smartcase
set hlsearch
nnoremap <silent> <CR> :nohlsearch<CR>:set nolist<CR><CR>
" highlight whitespace
highlight ExtraWhitespace ctermbg=red guibg=red
highlight WrongIndent ctermbg=2 guibg=blue
match ExtraWhitespace /\s\+$/
augroup highlight_extra_whitespace
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()
augroup END
let g:deoplete#enable_at_startup = 1
sign define LspDiagnosticsSignError text=🟥
sign define LspDiagnosticsSignWarning text=🟠
sign define LspDiagnosticsSignInformation text=🟣
sign define LspDiagnosticsSignHint text=🟢
nnoremap <silent> gd <cmd>lua vim.lsp.buf.definition()<CR>
nnoremap <silent> gi <cmd>lua vim.lsp.buf.implementation()<CR>
nnoremap <silent> gr <cmd>lua vim.lsp.buf.references()<CR>
nnoremap <silent> gD <cmd>lua vim.lsp.buf.declaration()<CR>
nnoremap <silent> ge <cmd>lua vim.lsp.diagnostic.set_loclist()<CR>
nnoremap <silent> K <cmd>lua vim.lsp.buf.hover()<CR>
nnoremap <silent> <leader>f <cmd>lua vim.lsp.buf.formatting()<CR>
nnoremap <silent> <leader>rn <cmd>lua vim.lsp.buf.rename()<CR>
nnoremap <silent> <leader>a <cmd>lua vim.lsp.buf.code_action()<CR>
xmap <silent> <leader>a <cmd>lua vim.lsp.buf.range_code_action()<CR>
lua require('init')
'';
# nix-env -f '<nixpkgs>' -qaP -A vimPlugins
plugins = with pkgs.vimPlugins; [
#Valloric/MatchTagAlways
#frankier/neovim-colors-solarized-truecolor-only
#nvie/vim-rst-tables
NeoSolarized
deoplete-nvim
editorconfig-vim
nvim-lspconfig
vim-gitgutter
vim-indent-guides
vim-nix
vim-puppet
vim-terraform
];
};
xdg.configFile."nvim/lua/init.lua".text = builtins.concatStringsSep "\n" (
[
''
-- init.lua
-- this configuration applies to servers and workstations
''
] ++ lib.optional nixosConfig.jalr.workstation.enable (
''
-- this configuration applies to workstations only
-- https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
local lsp = require('lspconfig')
'' +
builtins.concatStringsSep "\n" (
lib.mapAttrsToList
(
lang: cfg: "lsp.${lang}.setup\n" + lib.generators.toLua { } cfg
)
{
# C and C++
ccls = {
cmd = [ "${pkgs.ccls}/bin/ccls" ];
};
# Nix
rnix = {
cmd = [ "${pkgs.rnix-lsp}/bin/rnix-lsp" ];
};
# Python
pylsp = {
cmd = [ "${pkgs.python310Packages.python-lsp-server}/bin/pylsp" ];
settings = {
# https://github.com/python-lsp/python-lsp-server/blob/develop/CONFIGURATION.md
pylsp = {
plugins = {
flake8 = {
enabled = true;
executable = "${pkgs.python310Packages.flake8}/bin/flake8";
};
jedi_completion = { enabled = true; };
jedi_definition = { enabled = true; };
jedi_hover = { enabled = true; };
jedi_references = { enabled = true; };
jedi_signature_help = { enabled = true; };
jedi_symbols = { enabled = true; };
mccabe = { enabled = true; };
preload = { enabled = true; };
pycodestyle = { enabled = true; };
pyflakes = { enabled = true; };
rope_completion = { enabled = true; };
yapf = { enabled = true; };
};
};
};
};
# Ruby
solargraph = {
cmd = [ "${pkgs.solargraph}/bin/solargraph" "stdio" ];
};
# Rust
rust_analyzer = {
cmd = [ "${pkgs.rust-analyzer}/bin/rust-analyzer" ];
};
# Bash
bashls = {
cmd = [ "${pkgs.nodePackages.bash-language-server}/bin/bash-language-server" "start" ];
};
# Terraform
terraform_lsp = {
cmd = [ "${pkgs.terraform-lsp}/bin/terraform-lsp" "serve" ];
};
# YAML
yamlls = {
cmd = [ "${pkgs.nodePackages.yaml-language-server}/bin/yaml-language-server" "--stdio" ];
settings = {
yaml = {
keyOrdering = false;
};
};
};
}
)
)
);
}