From aa682d12f56d094a6463050e4e4527a93f0d9054 Mon Sep 17 00:00:00 2001 From: kat witch Date: Sat, 28 Aug 2021 20:07:55 +0100 Subject: [PATCH] vim: Break up into base+dev. Move to .vim templating --- config/users/kat/base/vim/default.nix | 51 +++---- config/users/kat/base/vim/init.vim | 55 ++++++++ config/users/kat/base/vim/vimrc.nix | 193 -------------------------- config/users/kat/dev/default.nix | 1 + config/users/kat/dev/vim/coc.vim | 135 ++++++++++++++++++ config/users/kat/dev/vim/default.nix | 51 +++++++ 6 files changed, 263 insertions(+), 223 deletions(-) create mode 100644 config/users/kat/base/vim/init.vim delete mode 100644 config/users/kat/base/vim/vimrc.nix create mode 100644 config/users/kat/dev/vim/coc.vim create mode 100644 config/users/kat/dev/vim/default.nix diff --git a/config/users/kat/base/vim/default.nix b/config/users/kat/base/vim/default.nix index 06424a06..a1231340 100644 --- a/config/users/kat/base/vim/default.nix +++ b/config/users/kat/base/vim/default.nix @@ -1,28 +1,37 @@ { config, lib, pkgs, ... }: -{ +let initvim = pkgs.callPackage ({ stdenv, elinks, nodejs }: stdenv.mkDerivation { + name = "init.vim"; + src = ./init.vim; + inherit nodejs elinks; + buildInputs = [ + elinks + nodejs + ]; + phases = [ "buildPhase" ]; + buildPhase = '' + substituteAll $src $out + ''; +}) {}; +in { home.sessionVariables.EDITOR = "nvim"; programs.neovim = { enable = true; - extraConfig = import ./vimrc.nix { inherit pkgs config; }; + extraConfig = '' + source ${initvim} + ''; vimAlias = true; viAlias = true; plugins = with pkgs.vimPlugins; [ vim-nix + vim-cool + vim-lastplace + vim-hexokinase + vim-easymotion notmuch-vim rust-vim - coc-nvim - coc-rust-analyzer - coc-yank - coc-python - coc-json - coc-fzf fzf-vim - coc-yaml - coc-git - coc-css - coc-html vim-fugitive vim-startify vim-airline @@ -30,23 +39,5 @@ vim-lastplace base16-vim ]; - coc = { - enable = true; - settings = { - "rust.rustfmt_path" = "${pkgs.rustfmt}/bin/rustfmt"; - "rust-analyzer.serverPath" = "rust-analyzer"; - "rust-analyzer.updates.prompt" = false; - "rust-analyzer.notifications.cargoTomlNotFound" = false; - "rust-analyzer.notifications.workspaceLoaded" = false; - "rust-analyzer.procMacro.enable" = true; - "rust-analyzer.cargo.loadOutDirsFromCheck" = true; - "rust-analyzer.cargo-watch.enable" = true; - "rust-analyzer.completion.addCallParenthesis" = false; # consider using this? - "rust-analyzer.hoverActions.linksInHover" = true; - "rust-analyzer.diagnostics.disabled" = [ - "inactive-code" # it has strange cfg support..? - ]; - }; - }; }; } diff --git a/config/users/kat/base/vim/init.vim b/config/users/kat/base/vim/init.vim new file mode 100644 index 00000000..7fc9eb5b --- /dev/null +++ b/config/users/kat/base/vim/init.vim @@ -0,0 +1,55 @@ +set encoding=utf-8 +scriptencoding utf-8 +set list listchars=tab:»\ ,extends:›,precedes:‹,nbsp:·,trail:✖ +" Enable mouse +set mouse=a + +set viminfo='100000,<100000,s1000,h,n$XDG_DATA_HOME/vim/viminfo' + +" colors +let base16colorspace=256 +colorscheme base16-default-dark +autocmd vimenter * highlight Normal guibg=NONE ctermbg=NONE +autocmd SourcePost * highlight Normal ctermbg=NONE guibg=NONE + \ | highlight LineNr ctermbg=NONE guibg=NONE + \ | highlight SignColumn ctermbg=NONE guibg=NONE + +" tabline +let g:airline#extensions#tabline#enabled = 1 + +" hexokinaise +let g:Hexokinase_highlighters = ['virtual'] +let g:Hexokinase_optInPatterns = 'full_hex,rgb,rgba,hsl,hsla,colour_names' + +" notmuch! +let g:notmuch_config_file=$XDG_CONFIG_HOME . '/notmuch/notmuchrc' +let g:notmuch_folders_count_threads=0 +let g:notmuch_date_format='%y-%m-%d %H:%M' +let g:notmuch_datetime_format='%y-%m-%d %H:%M' +let g:notmuch_show_date_format='%Y/%m/%d %H:%M' +let g:notmuch_search_date_format='%Y/%m/%d %H:%M' +let g:notmuch_html_converter='@elinks@/bin/elinks --dump' + +" lastplace +let g:lastplace_ignore = "gitcommit,gitrebase,svn,hgcommit" + +set undodir=$XDG_DATA_HOME/vim/undo +set directory=$XDG_DATA_HOME/vim/swap// +set backupdir=$XDG_DATA_HOME/vim/backup + +set ttimeoutlen=100 +set number +set hidden +set nobackup +set nowritebackup +set cmdheight=1 +set updatetime=300 +set cursorline +set colorcolumn=100 +set linebreak showbreak=↪ " ↳ +set hlsearch +set relativenumber +set completeopt=longest,menuone + +command Spaces set expandtab +command Tabs set noexpandtab diff --git a/config/users/kat/base/vim/vimrc.nix b/config/users/kat/base/vim/vimrc.nix deleted file mode 100644 index 7e8ceb65..00000000 --- a/config/users/kat/base/vim/vimrc.nix +++ /dev/null @@ -1,193 +0,0 @@ -{ config, pkgs }: - -'' - source ${pkgs.writeText "vimrc" '' - set encoding=utf-8 - scriptencoding utf-8 - set list listchars=tab:»\ ,extends:›,precedes:‹,nbsp:·,trail:✖ - ''}"; - " Enable mouse - set mouse=a - - set viminfo='100000,<100000,s1000,h,n$XDG_DATA_HOME/vim/viminfo' - - " colors - let base16colorspace=256 - colorscheme base16-default-dark - autocmd vimenter * highlight Normal guibg=NONE ctermbg=NONE - autocmd SourcePost * highlight Normal ctermbg=NONE guibg=NONE - \ | highlight LineNr ctermbg=NONE guibg=NONE - \ | highlight SignColumn ctermbg=NONE guibg=NONE - - " tabline - let g:airline#extensions#tabline#enabled = 1 - - " notmuch! - let g:notmuch_config_file='${config.xdg.configHome}/notmuch/notmuchrc' - let g:notmuch_folders_count_threads=0 - let g:notmuch_date_format='%y-%m-%d %H:%M' - let g:notmuch_datetime_format='%y-%m-%d %H:%M' - let g:notmuch_show_date_format='%Y/%m/%d %H:%M' - let g:notmuch_search_date_format='%Y/%m/%d %H:%M' - let g:notmuch_html_converter='${pkgs.elinks}/bin/elinks --dump' - - " lastplace - let g:lastplace_ignore = "gitcommit,gitrebase,svn,hgcommit" - - let g:coc_node_path='${pkgs.nodejs}/bin/node' - let g:coc_config_home=$XDG_CONFIG_HOME . '/vim/coc' - - set undodir=$XDG_DATA_HOME/vim/undo - set directory=$XDG_DATA_HOME/vim/swap// - set backupdir=$XDG_DATA_HOME/vim/backup - - set ttimeoutlen=100 - set number - set hidden - set nobackup - set nowritebackup - set cmdheight=1 - set updatetime=300 - set cursorline - set colorcolumn=100 - set linebreak showbreak=↪ " ↳ - set hlsearch - set relativenumber - set completeopt=longest,menuone - - command Spaces set expandtab - command Tabs set noexpandtab - - inoremap - \ pumvisible() ? "\" : - \ check_back_space() ? "\" : - \ coc#refresh() - inoremap pumvisible() ? "\" : "\" - - function! s:check_back_space() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' - endfunction - - " Use to trigger completion. - if has('nvim') - inoremap coc#refresh() - else - inoremap coc#refresh() - endif - - " Make auto-select the first completion item and notify coc.nvim to - " format on enter, could be remapped by other vim plugin - noremap pumvisible() ? coc#_select_confirm() - \: "\u\\=coc#on_enter()\" - - " Use `[g` and `]g` to navigate diagnostics - " Use `:CocDiagnostics` to get all diagnostics of current buffer in location list. - nmap [g (coc-diagnostic-prev) - nmap ]g (coc-diagnostic-next) - - " GoTo code navigation. - nmap gd (coc-definition) - nmap gy (coc-type-definition) - nmap gi (coc-implementation) - nmap gr (coc-references) - - " Use K to show documentation in preview window. - nnoremap K :call show_documentation() - - function! s:show_documentation() - if (index(['vim','help'], &filetype) >= 0) - execute 'h '.expand('') - elseif (coc#rpc#ready()) - call CocActionAsync('doHover') - else - execute '!' . &keywordprg . " " . expand('') - endif - endfunction - - " Highlight the symbol and its references when holding the cursor. - autocmd CursorHold * silent call CocActionAsync('highlight') - - " Symbol renaming. - nmap rn (coc-rename) - - " Formatting selected code. - xmap f (coc-format-selected) - nmap f (coc-format-selected) - - augroup mygroup - autocmd! - " Setup formatexpr specified filetype(s). - autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') - " Update signature help on jump placeholder. - autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') - augroup end - - " Applying codeAction to the selected region. - " Example: `aap` for current paragraph - xmap a (coc-codeaction-selected) - nmap a (coc-codeaction-selected) - - " Remap keys for applying codeAction to the current buffer. - nmap ac (coc-codeaction) - " Apply AutoFix to problem on the current line. - nmap qf (coc-fix-current) - - " Map function and class text objects - " NOTE: Requires 'textDocument.documentSymbol' support from the language server. - xmap if (coc-funcobj-i) - omap if (coc-funcobj-i) - xmap af (coc-funcobj-a) - omap af (coc-funcobj-a) - xmap ic (coc-classobj-i) - omap ic (coc-classobj-i) - xmap ac (coc-classobj-a) - omap ac (coc-classobj-a) - - " Remap and for scroll float windows/popups. - if has('nvim-0.4.0') || has('patch-8.2.0750') - nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" - nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" - inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" - inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" - vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" - vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" - endif - - " Use CTRL-S for selections ranges. - " Requires 'textDocument/selectionRange' support of language server. - nmap (coc-range-select) - xmap (coc-range-select) - - " Add `:Format` command to format current buffer. - command! -nargs=0 Format :call CocAction('format') - - " Add `:Fold` command to fold current buffer. - command! -nargs=? Fold :call CocAction('fold', ) - - " Add `:OR` command for organize imports of the current buffer. - command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') - - " Add (Neo)Vim's native statusline support. - " NOTE: Please see `:h coc-status` for integrations with external plugins that - " provide custom statusline: lightline.vim, vim-airline. - set statusline^=%{coc#status()}%{get(b:,'coc_current_function',''')} - - " Mappings for CoCList - " Show all diagnostics. - nnoremap a :CocList diagnostics - " Manage extensions. - nnoremap e :CocList extensions - " Show commands. - nnoremap c :CocList commands - " Find symbol of current document. - nnoremap o :CocList outline - " Search workspace symbols. - nnoremap s :CocList -I symbols - " Do default action for next item. - nnoremap j :CocNext - " Do default action for previous item. - nnoremap k :CocPrev - " Resume latest coc list. - nnoremap p :CocListResume -'' diff --git a/config/users/kat/dev/default.nix b/config/users/kat/dev/default.nix index 20904c01..ff8c3d5e 100644 --- a/config/users/kat/dev/default.nix +++ b/config/users/kat/dev/default.nix @@ -2,6 +2,7 @@ { imports = [ + ./vim ./rustfmt.nix ./packages.nix ./cookiecutter.nix diff --git a/config/users/kat/dev/vim/coc.vim b/config/users/kat/dev/vim/coc.vim new file mode 100644 index 00000000..c5591a42 --- /dev/null +++ b/config/users/kat/dev/vim/coc.vim @@ -0,0 +1,135 @@ +let g:coc_node_path='@nodejs@/bin/node' +let g:coc_config_home=$XDG_CONFIG_HOME . '/vim/coc' + +inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() +inoremap pumvisible() ? "\" : "\" + +function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' +endfunction + +" Use to trigger completion. +if has('nvim') + inoremap coc#refresh() +else + inoremap coc#refresh() +endif + +" Make auto-select the first completion item and notify coc.nvim to +" format on enter, could be remapped by other vim plugin +noremap pumvisible() ? coc#_select_confirm() + \: "\u\\=coc#on_enter()\" + +" Use `[g` and `]g` to navigate diagnostics +" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list. +nmap [g (coc-diagnostic-prev) +nmap ]g (coc-diagnostic-next) + +" GoTo code navigation. +nmap gd (coc-definition) +nmap gy (coc-type-definition) +nmap gi (coc-implementation) +nmap gr (coc-references) + +" Use K to show documentation in preview window. +nnoremap K :call show_documentation() + +function! s:show_documentation() + if (index(['vim','help'], &filetype) >= 0) + execute 'h '.expand('') + elseif (coc#rpc#ready()) + call CocActionAsync('doHover') + else + execute '!' . &keywordprg . " " . expand('') + endif +endfunction + +" Highlight the symbol and its references when holding the cursor. +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Symbol renaming. +nmap rn (coc-rename) + +" Formatting selected code. +xmap f (coc-format-selected) +nmap f (coc-format-selected) + +augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s). + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder. + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Applying codeAction to the selected region. +" Example: `aap` for current paragraph +xmap a (coc-codeaction-selected) +nmap a (coc-codeaction-selected) + +" Remap keys for applying codeAction to the current buffer. +nmap ac (coc-codeaction) +" Apply AutoFix to problem on the current line. +nmap qf (coc-fix-current) + +" Map function and class text objects +" NOTE: Requires 'textDocument.documentSymbol' support from the language server. +xmap if (coc-funcobj-i) +omap if (coc-funcobj-i) +xmap af (coc-funcobj-a) +omap af (coc-funcobj-a) +xmap ic (coc-classobj-i) +omap ic (coc-classobj-i) +xmap ac (coc-classobj-a) +omap ac (coc-classobj-a) + +" Remap and for scroll float windows/popups. +if has('nvim-0.4.0') || has('patch-8.2.0750') + nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" +endif + +" Use CTRL-S for selections ranges. +" Requires 'textDocument/selectionRange' support of language server. +nmap (coc-range-select) +xmap (coc-range-select) + +" Add `:Format` command to format current buffer. +command! -nargs=0 Format :call CocAction('format') + +" Add `:Fold` command to fold current buffer. +command! -nargs=? Fold :call CocAction('fold', ) + +" Add `:OR` command for organize imports of the current buffer. +command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') + +" Add (Neo)Vim's native statusline support. +" NOTE: Please see `:h coc-status` for integrations with external plugins that +" provide custom statusline: lightline.vim, vim-airline. +set statusline^=%{coc#status()}%{get(b:,'coc_current_function',''')} + +" Mappings for CoCList +" Show all diagnostics. +nnoremap a :CocList diagnostics +" Manage extensions. +nnoremap e :CocList extensions +" Show commands. +nnoremap c :CocList commands +" Find symbol of current document. +nnoremap o :CocList outline +" Search workspace symbols. +nnoremap s :CocList -I symbols +" Do default action for next item. +nnoremap j :CocNext +" Do default action for previous item. +nnoremap k :CocPrev +" Resume latest coc list. +nnoremap p :CocListResume diff --git a/config/users/kat/dev/vim/default.nix b/config/users/kat/dev/vim/default.nix new file mode 100644 index 00000000..6af05732 --- /dev/null +++ b/config/users/kat/dev/vim/default.nix @@ -0,0 +1,51 @@ +{ config, pkgs, ... }: + +let cocvim = pkgs.callPackage ({ stdenv, elinks, nodejs }: stdenv.mkDerivation { + name = "coc.vim"; + src = ./coc.vim; + inherit nodejs; + buildInputs = [ + nodejs + ]; + phases = [ "buildPhase" ]; + buildPhase = '' + substituteAll $src $out + ''; +}) {}; +in { + programs.neovim = { + extraConfig = '' + source ${cocvim} + ''; + plugins = with pkgs.vimPlugins; [ + coc-yaml + coc-git + coc-css + coc-html + coc-nvim + coc-rust-analyzer + coc-yank + coc-python + coc-json + coc-fzf + ]; + coc = { + enable = true; + settings = { + "rust.rustfmt_path" = "${pkgs.rustfmt}/bin/rustfmt"; + "rust-analyzer.serverPath" = "rust-analyzer"; + "rust-analyzer.updates.prompt" = false; + "rust-analyzer.notifications.cargoTomlNotFound" = false; + "rust-analyzer.notifications.workspaceLoaded" = false; + "rust-analyzer.procMacro.enable" = true; + "rust-analyzer.cargo.loadOutDirsFromCheck" = true; + "rust-analyzer.cargo-watch.enable" = true; + "rust-analyzer.completion.addCallParenthesis" = false; # consider using this? + "rust-analyzer.hoverActions.linksInHover" = true; + "rust-analyzer.diagnostics.disabled" = [ + "inactive-code" # it has strange cfg support..? + ]; + }; + }; + }; +}