{pkgs, ...}: { programs.vim = { enable = true; defaultEditor = true; plugins = with pkgs.vimPlugins; [ # ale asyncomplete-vim asyncomplete-lsp-vim base16-vim copilot-vim lightline-vim # lightline-ale lightline-lsp fugitive fzf-vim vim-commentary vim-dadbod vim-dispatch vim-dotenv vim-eunuch vim-lsp # vim-lsp-ale vim-lsp-settings vim-mustache-handlebars vim-rails vim-signify vim-wayland-clipboard vim-vsnip vim-vsnip-integ zig-vim ]; settings = { hidden = true; ignorecase = true; # mouse = "a"; number = true; relativenumber = true; smartcase = true; }; extraConfig = '' set nocompatible set encoding=utf-8 set wildmenu set showcmd set hlsearch " Use visual bell instead of beeping when doing something wrong set visualbell " And reset the terminal code for the visual bell. If visualbell is set, and " this line is also included, vim will neither flash nor beep. If visualbell " is unset, this does nothing. set t_vb= set backspace=indent,eol,start set autoindent set nostartofline set ruler set confirm " Quickly time out on keycodes, but never time out on mappings set notimeout ttimeout ttimeoutlen=200 set pastetoggle= " automatically leave paste mode so I don't forget autocmd InsertLeave * set nopaste " Indentation settings for using 4 spaces instead of tabs. " Do not change 'tabstop' from its default value of 8 with this setup. set shiftwidth=4 set softtabstop=4 set expandtab " Don't update the screen when executing macros set lazyredraw " Easier to reach than \ let mapleader=" " " fzf nmap p :Files nmap bb :Buffers " dadbod autocmd FileType sql let b:dispatch = 'pgcli %' vnoremap d :DB nmap d :DB set formatoptions=ctqrn1 " Show matching brackets. set showmatch " Bracket blinking. set matchtime=5 " start scrolling when we're 8 lines away from margins set scrolloff=8 set sidescrolloff=15 set sidescroll=1 set noswapfile set nobackup set nowb " Automatically insert the current comment leader after hitting 'o' or 'O' in Normal mode. "set fo+=o " Do not automatically insert a comment leader after an enter "set fo-=r " Do no auto-wrap text using textwidth (does not apply to comments) "set fo-=t set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*/vendor/*,*/bin/*,*/node_modules/* " quicker async update time set updatetime=100 " taller vertical bar for vsplits set fillchars+=vert:│ set ttymouse = "sgr"; " Enable 24-bit colors set termguicolors let &t_8f = "\[38:2::%lu:%lu:%lum" let &t_8b = "\[48:2::%lu:%lu:%lum" " Workaround bug in vim, where it incorrectly thinks modifyOtherKeys level 2 is " enabled, even when it's not. The snippets below ensure modifyOtherKeys=2 is " enabled. https://github.com/vim/vim/issues/9014 let &t_TI = "\[>4;2m" let &t_TE = "\[>4;m" set undodir=~/.vim/backups set undofile " When opening a file, always jump to the last cursor position autocmd BufReadPost * \ if line("'\"") > 0 && line ("'\"") <= line("$") | \ exe "normal g'\"" | \ endif " remove annoying help window inoremap nnoremap vnoremap " better window navigation nnoremap j nnoremap k nnoremap h nnoremap l " quickfix nnoremap :cnext nnoremap :cprevious " command line autocomplete set wildchar= wildmenu wildmode=full " scroll through buffers noremap :bp noremap :bn " show menu to switch buffers set wildcharm= nnoremap :b " unhighlight search results noremap / :nohls " reselect visual block after indent/outdent vnoremap < >gv " force saving files that require root permission cmap w!! %!sudo tee > /dev/null % " Close the current buffer and move to the previous one " This replicates the idea of closing a tab nmap bq :bp bd # colorscheme base16-default-dark let g:termdebug_popup = 0 let g:termdebug_wide = 163 " vim-lsp function! s:on_lsp_buffer_enabled() abort setlocal omnifunc=lsp#complete setlocal signcolumn=yes if exists('+tagfunc') | setlocal tagfunc=lsp#tagfunc | endif nmap gd (lsp-definition) nmap gs (lsp-document-symbol-search) nmap gS (lsp-workspace-symbol-search) nmap gr (lsp-references) nmap gi (lsp-implementation) nmap gt (lsp-type-definition) nmap rn (lsp-rename) nmap [g (lsp-previous-diagnostic) nmap ]g (lsp-next-diagnostic) nmap K (lsp-hover) " nnoremap lsp#scroll(+4) " nnoremap lsp#scroll(-4) let g:lsp_format_sync_timeout = 1000 autocmd! BufWritePre *.rs,*.go call execute('LspDocumentFormatSync') " refer to doc to add more commands endfunction augroup lsp_install au! " call s:on_lsp_buffer_enabled only for languages that has the server registered. autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled() augroup END "if executable('solargraph') " " gem install solargraph " au User lsp_setup call lsp#register_server({ " \ 'name': 'solargraph', " \ 'cmd': {server_info->[&shell, &shellcmdflag, 'solargraph stdio']}, " \ 'initialization_options': {"diagnostics": "true"}, " \ 'whitelist': ['ruby'], " \ }) "endif " asyncomplete inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? asyncomplete#close_popup() : "\" imap (asyncomplete_force_refresh) " vim-vsnip " Expand imap vsnip#expandable() ? '(vsnip-expand)' : '' smap vsnip#expandable() ? '(vsnip-expand)' : '' " Expand or jump imap vsnip#available(1) ? '(vsnip-expand-or-jump)' : '' smap vsnip#available(1) ? '(vsnip-expand-or-jump)' : '' " Copilot ugh " let g:copilot_node_command = "/usr/bin/env node" ''; }; }