{ pkgs, ... }: let config = { plugins = with pkgs.vimPlugins; [ vim-colors-solarized coc-nvim coc-rust-analyzer coc-pyright coc-go ctrlp-vim editorconfig-vim vim-gist goyo-vim # gopls neomake rust-vim solarized vim-commentary vim-dispatch vim-fugitive vim-gitgutter vim-lastplace vim-nix vim-polyglot vim-repeat # vim-scala vim-sleuth vim-surround vim-trailing-whitespace # vimtex vimux vimwiki ]; enable = true; extraConfig = '' set background=dark " allow switching away from unsaved buffers set hidden set history=1000 set updatetime=300 set expandtab set shiftwidth=2 set tabstop=2 set ignorecase set smartcase set number set relativenumber set backupdir=$HOME/.vim/backupfiles// set directory=$HOME/.vim/swapfiles// set undodir=$HOME/.vim/undofiles// set undofile set nocompatible filetype plugin indent on " always set autoindenting on set autoindent " smart indent; stop indent when closing brackets etc set smartindent " two spaces after .?! when joining lines set joinspaces " highlight search result set hlsearch " incremental search set incsearch set nolazyredraw " delete whitespace, line break and char using set backspace=indent,eol,start " always show curser position set ruler " yank into system clipboard set clipboard=unnamedplus colorscheme solarized " true color set termguicolors " make true colors work in tmux let &t_8f = "\[38;2;%lu;%lu;%lum" let &t_8b = "\[48;2;%lu;%lu;%lum" " set textwidth=80 set colorcolumn=+1 set signcolumn=yes " highlight current line set cursorline " encoding set fileencoding=utf-8 " break at last word instead of last char set linebreak " autoload file changes set autoread set smarttab set softtabstop=2 set shiftround " invisible characters set list " set listchars=tab:â\ ,eol:¬,trail:â,extends:â¯,precedes:â® " set showbreak=⪠" code folding settings " fold based on syntax set foldmethod=indent " don't fold by default set nofoldenable set foldlevel=1 " smoother redrawing set ttyfast " diff with vertical split set diffopt+=vertical " show the status line all the time set laststatus=2 " keep 5 lines on the screen when scrolling set scrolloff=5 " enhanced command line completion set wildmenu " Search down into subfolders " Provides tab-completion for all file-related tasks set path+=** " show incomplete commands set showcmd " complete files like a shell set wildmode=list:longest " command bar height set cmdheight=1 " set terminal title set title " set shortmess+=TOFwatc set shortmess+=c " show matching braces set showmatch " how many tenths of a second to blink set mat=2 " set spell langs set spelllang=de,en syntax enable " let g:polyglot_disabled=['latex'] " highlight clear SpellBad " highlight SpellBad cterm=undercurl " " Only do this part when compiled with support for autocommands. " if has("autocmd") " " Put these in an autocmd group, so that we can delete them easily. " augroup vimrcEx " au! " autocmd FileType text setlocal foldtext< " augroup END " endif " has("autocmd") " error bells set errorbells set visualbell set timeoutlen=500 " turn on manpages (:Man) runtime ftplugin/man.vim " set a map leader for more key combos let mapleader=',' " clear highlighted search noremap :nohlsearch " enable . command in visual mode vnoremap . :normal . " make the highlighting of tabs and other non-text less annoying highlight SpecialKey ctermbg=none ctermfg=8 highlight NonText ctermbg=none ctermfg=8 " other color for popup highlight Pmenu ctermbg=gray guibg=gray " ctrlp " order top to bottom let g:ctrlp_match_window='bottom,order::ttb' " open files in new buffer let g:ctrlp_switch_buffer=0 " use ripgrep if available if executable('rg') set grepprg=rg\ --color=never let g:ctrlp_user_command='rg %s --files -i --color=never --glob ""' let g:ctrlp_use_caching=0 endif " set textwidth for mails autocmd FileType mail setlocal textwidth=72 " count wraped lines as one line when doing relative jumps noremap j (v:count == 0 ? 'gj' : 'j') noremap k (v:count == 0 ? 'gk' : 'k') " scroll the viewport faster nnoremap 3 nnoremap 3 "" Section AutoGroups {{{ "" file type specific settings augroup configgroup autocmd! " automatically resize panes on resize autocmd VimResized * exe 'normal! \=' autocmd BufWritePost .vimrc,.vimrc.local,init.vim source % " save all files on focus lost, ignoring warnings about untitled buffers autocmd FocusLost * silent! wa " make quickfix windows take all the lower section of the screen " when there are multiple windows open autocmd FileType qf wincmd J autocmd! BufWritePost * Neomake augroup END " }}} " Append modeline after last line in buffer. " Use substitute() instead of printf() to handle '%%s' modeline in LaTeX files. function! AppendModeline() let l:modeline = printf(" vim: set filetype=%s ts=%d sw=%d tw=%d %s :", \ &filetype, &tabstop, &shiftwidth, &textwidth, &expandtab ? 'et' : 'noet') let l:modeline = substitute(&commentstring, "%s", l:modeline, "") call append(line("$"), l:modeline) endfunction nnoremap ml :call AppendModeline() " netrw settings " disable banner let g:netrw_banner=0 " open in prior window let g:netrw_browse_split=4 " open splits to the right let g:netrw_altv=1 " treeview let g:netrw_liststyle=3 let g:netrw_list_hide=netrw_gitignore#Hide() let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+' " vimux mappings " Prompt for a command map vp :VimuxPromptCommand " Prompt for a make command map vm :VimuxPromptCommand("make ") " Inspect runner pane map vi :VimuxInspectRunner " Close runner map vq :VimuxCloseRunner " Rerun last command map vv :VimuxRunLastCommand " Stop running command map vs :VimuxInterruptRunner " close Goyo *and* vim with :q function! s:goyo_enter() let b:quitting=0 let b:quitting_bang=0 autocmd QuitPre let b:quitting=1 cabbrev q! let b:quitting_bang=1 q! endfunction function! s:goyo_leave() " Quit Vim if this is the only remaining buffer if b:quitting && len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) == 1 if b:quitting_bang qa! else qa endif endif endfunction autocmd! User GoyoEnter call goyo_enter() autocmd! User GoyoLeave call goyo_leave() " run rustfmt when saving a file let g:rustfmt_autosave=1 au BufRead,BufNewFile *.sbt set filetype=scala " textwidth for emails au BufRead /tmp/*mutt-* set tw=72 augroup filetypedetect " Mail autocmd BufRead,BufNewFile *mutt-* setfiletype mail augroup END let g:coc_global_extensions = [ \ 'coc-explorer', \ 'coc-snippets', \ 'coc-pairs' \ ] nmap ge :CocCommand explorer " Use tab for trigger completion with characters ahead and navigate. " Use command ':verbose imap ' to make sure tab is not mapped by other plugin. 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. inoremap coc#refresh() " Use to confirm completion, `u` means break undo chain at current position. " Coc only does snippet and additional edit on confirm. inoremap pumvisible() ? "\" : "\u\" " Or use `complete_info` if your vim support it, like: " inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" " Use `[g` and `]g` to navigate diagnostics nmap [g (coc-diagnostic-prev) nmap ]g (coc-diagnostic-next) " Remap keys for gotos 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('') else call CocAction('doHover') endif endfunction " Highlight symbol under cursor on CursorHold autocmd CursorHold * silent call CocActionAsync('highlight') " Remap for rename current word nmap rn (coc-rename) " Remap for format selected region 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 " Remap for do codeAction of selected region, ex: `aap` for current paragraph xmap a (coc-codeaction-selected) nmap a (coc-codeaction-selected) " Remap for do codeAction of current line nmap ac (coc-codeaction) " Fix autofix problem of current line nmap qf (coc-fix-current) " Create mappings for function text object, requires document symbols feature of languageserver. xmap if (coc-funcobj-i) xmap af (coc-funcobj-a) omap if (coc-funcobj-i) omap af (coc-funcobj-a) " Use for select selections ranges, needs server support, like: coc-tsserver, coc-python nmap (coc-range-select) xmap (coc-range-select) " Use `:Format` to format current buffer command! -nargs=0 Format :call CocAction('format') " Use `:Fold` to fold current buffer command! -nargs=? Fold :call CocAction('fold', ) " use `:OR` for organize import of current buffer command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') " Add status line support, for integration with other plugin, checkout `:h coc-status` " set statusline^=%{coc#status()}%{get(b:,'coc_current_function',''')} " Using 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 " properly find root for py projects in workspace autocmd FileType python let b:coc_root_patterns = ['.git', '.env', 'venv', '.venv', 'setup.cfg', 'setup.py', 'pyproject.toml', 'pyrightconfig.json'] " let g:tex_flavor = 'latex' ''; }; in { # Note that this doesn’t merge deeply, so you couldn’t add to plugins. For that # you can use the nixos module system’s mkMerge with # programs.neovim = lib.mkMerge [ config { vimAlias = true; } ] programs.neovim = { vimAlias = true; viAlias = true; coc = { enable = true; settings = { "rust-analyzer.serverPath" = "${pkgs.rust-analyzer}/bin/rust-analyzer"; "gopls.experimentalWorkspaceModule" = true; }; }; } // config; programs.vim = config; # xdg.configFile."nvim/coc-settings.json".text = builtins.toJSON { # # "go.goplsPath" = "${gopls}/bin/gopls"; # }; }