From f934caa9937e3ebde4fb84bdab7791e94354c193 Mon Sep 17 00:00:00 2001 From: Simon Bruder Date: Sat, 7 Nov 2020 16:58:18 +0100 Subject: [PATCH] home: Add neovim --- users/simon/base.nix | 1 + .../simon/files/nvim/UltiSnips/rust.snippets | 7 + users/simon/files/nvim/UltiSnips/tex.snippets | 19 ++ .../files/nvim/UltiSnips/texmath.snippets | 23 ++ users/simon/modules/neovim.nix | 234 ++++++++++++++++++ 5 files changed, 284 insertions(+) create mode 100644 users/simon/files/nvim/UltiSnips/rust.snippets create mode 100644 users/simon/files/nvim/UltiSnips/tex.snippets create mode 100644 users/simon/files/nvim/UltiSnips/texmath.snippets create mode 100644 users/simon/modules/neovim.nix diff --git a/users/simon/base.nix b/users/simon/base.nix index df75f1e..c08de05 100644 --- a/users/simon/base.nix +++ b/users/simon/base.nix @@ -37,6 +37,7 @@ in ./modules/htop.nix ./modules/misc.nix ./modules/mpd.nix + ./modules/neovim.nix ./modules/sway.nix ./modules/xcompose.nix ./modules/xdg.nix diff --git a/users/simon/files/nvim/UltiSnips/rust.snippets b/users/simon/files/nvim/UltiSnips/rust.snippets new file mode 100644 index 0000000..bd23a3b --- /dev/null +++ b/users/simon/files/nvim/UltiSnips/rust.snippets @@ -0,0 +1,7 @@ +snippet disp "Display trait implentation" +impl fmt::Display for ${1:Struct} { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "${2}", ${3}) + } +}${0} +endsnippet diff --git a/users/simon/files/nvim/UltiSnips/tex.snippets b/users/simon/files/nvim/UltiSnips/tex.snippets new file mode 100644 index 0000000..64359ba --- /dev/null +++ b/users/simon/files/nvim/UltiSnips/tex.snippets @@ -0,0 +1,19 @@ +extends tex + +snippet s "Section" b +\section{$1} + + +endsnippet + +snippet ss "Subsection" b +\subsection{$1} + + +endsnippet + +snippet sss "Subsubsection" b +\subsubsection{$1} + + +endsnippet diff --git a/users/simon/files/nvim/UltiSnips/texmath.snippets b/users/simon/files/nvim/UltiSnips/texmath.snippets new file mode 100644 index 0000000..13c76a1 --- /dev/null +++ b/users/simon/files/nvim/UltiSnips/texmath.snippets @@ -0,0 +1,23 @@ +extends texmath + +snippet qf "Quadratic formula (user is responsible for parentheses)" w +\frac{-${2:b} \pm \sqrt{$2^2 - 4 \cdot ${1:a} \cdot ${3:c}}}{2 \cdot $1}$0 +endsnippet + +snippet aligned "aligned environment (in math mode)" w +\begin{aligned} + $1 &= $0 \\\\ +\end{aligned} +endsnippet + +snippet si "Insert SI unit (only works with simple numbers)" w +\SI{${1:amount}}{${2:unit}} +endsnippet + +snippet ยท "Insert multiplication sign" A +\cdot $0 +endsnippet + +snippet // "Fraction" iA +\frac{$1}{$2}$0 +endsnippet diff --git a/users/simon/modules/neovim.nix b/users/simon/modules/neovim.nix new file mode 100644 index 0000000..c31d15c --- /dev/null +++ b/users/simon/modules/neovim.nix @@ -0,0 +1,234 @@ +{ config, pkgs, ... }: +let + languageClientSettings = pkgs.writeText "LanguageClient.json" (builtins.toJSON { + rust.clippy_preference = "on"; + }); + rainbow_csv = pkgs.vimUtils.buildVimPluginFrom2Nix rec { + name = "rainbow_csv"; + src = pkgs.fetchFromGitHub { + owner = "mechatroner"; + repo = name; + rev = "df89266d6c03479def77793fd7a0a651986865a5"; + sha256 = "0c9b1r49vw6r3yhm6g02janyxw6d9j6bkjmv8zpdav46avmk74fh"; + }; + }; + vim-openscad = pkgs.vimUtils.buildVimPluginFrom2Nix rec { + name = "vim-openscad"; + src = pkgs.fetchFromGitHub { + owner = "sirtaj"; + repo = name; + rev = "81db508b1888fdbea994d43ccef1acd86c8af3f7"; + sha256 = "1wcdfayjpb9h0lzwdi5nda4c0ch263fdr0379l9k1gf47bgq9cx2"; + }; + }; + Vim-Jinja2-Syntax = pkgs.vimUtils.buildVimPluginFrom2Nix rec { + name = "Vim-Jinja2-Syntax"; + src = pkgs.fetchFromGitHub { + owner = "Glench"; + repo = name; + rev = "5d2496eb5fd4415c7ce062ccbcd53a3f0de93aa3"; + sha256 = "1ss065b2psalli46bs3v13fhaplqydh13bg3jg3zr98wbdn70cws"; + }; + }; +in +{ + programs.neovim = { + enable = true; + extraConfig = '' + " Basic display + set number + set colorcolumn=80 + + " Persistent undo + set undofile + set undolevels=4096 + set undoreload=16384 + + " Search + set ignorecase + + " Hide search when enter is pressed + nnoremap :nohlsearch + + " Autoload settings from file + set modeline + + " Use system clipboard + set clipboard=unnamedplus + + " Support more file encodings + set fileencodings=ucs-bom,utf-8,default,sjis,latin1 + + " Scroll before reaching top/bottom + set scrolloff=5 + + " Conceal when line is not active + set conceallevel=1 + + " Just hide buffer instead of unloading + set hidden + + " Remap leader key + let mapleader = "," + + " Jump to the last position + au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") + \| exe "normal! g`\"" | endif + + set background=dark + silent! colorscheme solarized + + " Set unknown filetypes + autocmd BufRead,BufNewFile *.vpy set filetype=python + + " Filetype specific properties + autocmd Filetype arduino setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype c setlocal ts=4 sw=4 sts=4 expandtab + autocmd Filetype cpp setlocal ts=4 sw=4 sts=4 expandtab + autocmd Filetype css setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype dockerfile setlocal ts=4 sw=4 sts=4 expandtab + autocmd Filetype dot setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype gitcommit setlocal colorcolumn=72 + autocmd Filetype go setlocal ts=4 sw=4 sts=4 + autocmd Filetype haskell setlocal ts=4 sw=4 sts=4 expandtab + autocmd Filetype html setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype jinja.html setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype javascript setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype jinja setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype json setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype lua setlocal ts=4 sw=4 sts=4 expandtab + autocmd Filetype markdown setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype openscad setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype python setlocal ts=4 sw=4 sts=4 expandtab + autocmd Filetype sass setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype scss setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype sh setlocal ts=4 sw=4 sts=4 + autocmd Filetype tex setlocal ts=1 sw=1 sts=1 expandtab + autocmd Filetype toml setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype vim setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype vue setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype xml setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype yaml setlocal ts=2 sw=2 sts=2 expandtab + autocmd Filetype zsh setlocal ts=4 sw=4 sts=4 expandtab + ''; + plugins = (with pkgs.vimPlugins; [ + { + plugin = LanguageClient-neovim; + config = '' + let g:LanguageClient_serverCommands = { + \ 'rust': ['rustup', 'run', 'stable', 'rls'], + \ 'go': ['${pkgs.gopls}/bin/gopls'], + \ 'python': ['${pkgs.python3Packages.python-language-server}/bin/pyls'], + \ 'typescript': ['${pkgs.nodePackages.javascript-typescript-langserver}/bin/javascript-typescript-stdio'], + \ 'javascript': ['${pkgs.nodePackages.javascript-typescript-langserver}/bin/javascript-typescript-stdio'], + \ 'haskell': ['${pkgs.haskellPackages.haskell-language-server}/bin/haskell-language-server', '--lsp'], + \ } + + let g:LanguageClient_loggingFile = '${config.xdg.dataHome}/nvim/LanguageClient.log' + let g:LanguageClient_settingsPath = '${languageClientSettings}' + + function LC_maps() + if has_key(g:LanguageClient_serverCommands, &filetype) + nnoremap :call LanguageClient_contextMenu() + nnoremap K :call LanguageClient#textDocument_hover() + nnoremap gd :call LanguageClient#textDocument_definition() + nnoremap :call LanguageClient#textDocument_rename() + set formatexpr=LanguageClient#textDocument_rangeFormatting_sync() + endif + endfunction + + autocmd FileType * call LC_maps() + ''; + } + { + plugin = deoplete-nvim; + config = '' + let g:deoplete#enable_at_startup = 1 + ''; + } + editorconfig-vim + fzf-vim + { + plugin = nerdtree; + config = '' + map N :NERDTreeTabsToggle + map n :NERDTreeFocusToggle + ''; + } + nerdtree-git-plugin + { + plugin = rust-vim; + config = '' + let g:rustfmt_autosave_if_config_present = 1 + let g:rust_fold = 1 + map rt :RustTest + ''; + } + { + plugin = tagbar; + config = "nmap :TagbarToggle"; + } + { + plugin = ultisnips; + config = '' + let g:UltiSnipsExpandTrigger = '' + let g:UltiSnipsJumpForwardTrigger = '' + let g:UltiSnipsJumpBackwardTrigger = '' + ''; + } + { + plugin = vim-airline; + config = '' + let g:airline_powerline_fonts = 1 + let g:airline_solarized_bg='dark' + let g:airline_theme='solarized' + ''; + } + vim-airline-themes + vim-better-whitespace + vim-colors-solarized + vim-devicons + vim-fugitive + vim-nerdtree-tabs + vim-nix + vim-snippets + vim-toml + { + plugin = vimtex; + config = '' + let g:tex_flavor='latex' + let g:vimtex_view_method='zathura' + let g:tex_conceal='abdmg' + let g:vimtex_syntax_autoload_packages = [ + \'amsmath', + \'luacode', + \] + " this disables some helful warnings that often have a reason why I ignore them + let g:vimtex_quickfix_ignore_filters = [ + \'Underfull \\hbox (badness [0-9]*) in ', + \'Overfull \\hbox ([0-9]*.[0-9]*pt too wide) in ', + \'Overfull \\vbox ([0-9]*.[0-9]*pt too high) detected ', + \'Package hyperref Warning: Token not allowed in a PDF string', + \'Package typearea Warning: Bad type area settings!', + \] + " When using math environments vim does not know if if it currently is in one + " or outside of one unless it parses the file from the start. Parsing the + " file from the start each time fixes this but leads to a performance drop + " (depending on the number of lines). + " Also, somehow using FileType tex does not work, so this will enable slow + " syntax highlighting everywhere once a *.tex file is opened. + autocmd BufEnter *.tex syntax sync fromstart + ''; + } + ]) ++ [ + Vim-Jinja2-Syntax + rainbow_csv + vim-openscad + ]; + # TODO: add psf/black + }; + + xdg.configFile = { + "nvim/UltiSnips".source = ../files/nvim/UltiSnips; + }; +}