{ pkgs, ... }: let config = { plugins = with pkgs.vimPlugins; [ packer-nvim # vim-colors-solarized # coc-nvim # coc-rust-analyzer # coc-pyright # coc-go # # orgmode-nvim # # nvim-treesitter # 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' # ''; # lua << EOF # ${builtins.readFile ./init.lua} # EOF # generatedConfigs = { # lua = builtins.readFile ./plugins.lua; # }; extraConfig = '' ${builtins.readFile ./init.vim} lua << EOF ${builtins.readFile ./init.lua} EOF ''; }; 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"; # }; }