X-Git-Url: https://git.sev.monster/~sev/dotfiles.git/blobdiff_plain/afd175d70294e36f0ff2d80d96bbd434b4a55d91..b8a33b95e488160344109eaf745f82e6efefead1:/etc/vim/.vimrc diff --git a/etc/vim/.vimrc b/etc/vim/.vimrc index 9c1fd4c..04521a6 100644 --- a/etc/vim/.vimrc +++ b/etc/vim/.vimrc @@ -1,64 +1,172 @@ -source $VIMRUNTIME/defaults.vim - +""" paths +"" config dir in xdg config let x = ($XDG_CONFIG_HOME??($HOME.'/.config')).'/vim' execute 'set runtimepath='.x.','.&runtimepath.','.x.'/after' execute 'set packpath='.x.','.&packpath.','.x.'/after' -packadd matchit - +"" state files in xdg state let x = ($XDG_STATE_HOME??($HOME.'/.local/state')).'/vim' if !isdirectory(x) call mkdir(x, 'p', 0700) endif -execute 'set viminfofile='.x.'/.viminfo' - -let y = x.'/swap' -if !isdirectory(y) - call mkdir(y, 'p', 0700) -endif -execute 'set directory='.y.'//' +" backup +" NOTE: keep backup files in vim state dir for both vim and neovim let y = x.'/backup' if !isdirectory(y) call mkdir(y, 'p', 0700) endif -set backup execute 'set backupdir='.y.'//' -set backupcopy=yes +set backup backupcopy=yes -let y = x.'/undo' -if !isdirectory(y) - call mkdir(y, 'p', 0700) +" NOTE: neovim uses ShaDa (SHAred DAta) format for viminfo and swap, and uses a +" different version of undo file, so these types of files when created by +" vim cannot be used with neovim, and the 'viminfofile', 'directory', and +" 'undodir' directories cannot be shared. +" NOTE: neovim has a nice default for these directories and files so +" customizing them is not necessary for it. +if !has('nvim') + " viminfo + " NOTE: 'viminfofile' is a deprecated alias for 'shada' in neovim + execute 'set viminfofile='.x.'/.viminfo' + + " swap + let y = x.'/swap' + if !isdirectory(y) + call mkdir(y, 'p', 0700) + endif + execute 'set directory='.y.'//' + + " undo + let y = x.'/undo' + if !isdirectory(y) + call mkdir(y, 'p', 0700) + endif + execute 'set undodir='.y.'//' endif -set undofile -execute 'set undodir='.y.'//' unlet x unlet y -set autoindent -set colorcolumn=80 -highlight ColorColumn term=NONE ctermbg=0 -autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab -autocmd FileType markdown setlocal tabstop=4 shiftwidth=4 expandtab -autocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab -autocmd FileType json setlocal tabstop=2 shiftwidth=2 expandtab -autocmd FileType html setlocal tabstop=2 shiftwidth=2 expandtab -autocmd FileType todo setlocal colorcolumn=0 - -set cursorline -set hlsearch -set list +""" vim-only defaults +if !has('nvim') + " neovim defaults are already set + source $VIMRUNTIME/defaults.vim + + " disable jumping to last edit, we use vim-lastplace instead + autocmd! vimStartup + + " packages + packadd! matchit + packadd! editorconfig " this is now built to [n]vim in but optional + packadd! vim-commentary " nvim has built in commenting now + + " options + set hlsearch + autocmd BufRead * set autoindent +endif + +""" styling +" nice default theme +colorscheme murphy + +" always use color column with less intrusive colors +autocmd VimEnter,WinNew * set colorcolumn=80 +" always use cursor line for better visibility +autocmd VimEnter,WinNew * set cursorline + +" unique highlighting for leading spaces and in-line spaces +" NOTE: this leaves tabs and other special whitespace untouched intentionally +autocmd VimEnter,ColorScheme * highlight SpaceInner ctermfg=Grey guifg=#686868 +autocmd VimEnter,ColorScheme * highlight link SpaceOuter NonText +autocmd VimEnter,WinNew * match SpaceInner / / +autocmd VimEnter,WinNew * 2match SpaceOuter /\(^ \+\)\|\( \+$\)/ + +" always show statusline +set laststatus=2 + +" truncate > lastline; lastline is nvim default, sensible.vim may also set it +set display=truncate + +" more context while scrolling +set scrolloff=5 +set sidescrolloff=8 + +" show number column on all buffers +autocmd VimEnter,WinNew * set number +" use relative numbers in normal modes when focused, but not if number is off +function! s:SetRelativeNumber(enable) + if !getwinvar(winnr(), '&number') + return + endif + if a:enable + set relativenumber + else + set norelativenumber + endif +endfunction +autocmd InsertEnter,FocusLost,WinLeave * call s:SetRelativeNumber(0) +autocmd VimEnter,WinNew, + \InsertLeave,FocusGained,WinEnter * call s:SetRelativeNumber(1) + +" always show custom listchars +autocmd VimEnter,WinNew * set list set listchars=tab:├─,extends:»,precedes:«,space:·,trail:∙,nbsp:■ -set number -set relativenumber -autocmd InsertEnter * setlocal norelativenumber -autocmd InsertLeave * setlocal relativenumber -autocmd FocusLost * setlocal norelativenumber -autocmd FocusGained * setlocal relativenumber -highlight WhiteSpaceBol ctermfg=DarkBlue -highlight WhiteSpaceMol ctermfg=Black -match WhiteSpaceMol / / -2match WhiteSpaceBol /\(^ \+\)\|\( \+$\)/ +""" editor +" always save undo file for all file buffers +autocmd BufRead * set undofile + +" explicitly use modeline, even on systems where it's disabled by system vimrc +autocmd BufRead set modeline +" should be default disabled but just in case +set nomodelineexpr + +"" indent +" always use shiftwidth instead of tabsize +set smarttab +" filetype preferences +autocmd FileType python set softtabstop=4 shiftwidth=4 expandtab +autocmd FileType markdown set softtabstop=4 shiftwidth=4 expandtab +autocmd FileType javascript set softtabstop=2 shiftwidth=2 expandtab +autocmd FileType json set softtabstop=2 shiftwidth=2 expandtab +autocmd FileType html set softtabstop=2 shiftwidth=2 expandtab let g:EditorConfig_enable_for_new_buf = 1 + +"" syntax +autocmd FileType todo set colorcolumn=0 + +"" mappings +" use more accessible escapes, as C-n and C-o are shadowed by some terminals +if has('nvim') + tnoremap n + tnoremap o +endif + +" move windows any time +if has('nvim') + " terminal + tnoremap h + tnoremap j + tnoremap k + tnoremap l +endif +" insert +inoremap h +inoremap j +inoremap k +inoremap l +" normal +nnoremap h +nnoremap j +nnoremap k +nnoremap l + +"" CTRL-L to clear highlighting and also update diff +" NOTE: sensible.vim and nvim already do this, so copy sensible.vim +" functionality if it hasn't been set or we aren't nvim. taken from +" sensible.vim by Tim Pope, under Vim license; see :help license +" https://github.com/tpope/vim-sensible/blob/0ce2d843d6f588bb0c8c7eec6449171615dc56d9/plugin/sensible.vim#L57 +if !has('nvim') && maparg('', 'n') ==# '' + nnoremap :nohlsearch=has('diff')?'diffupdate':'' +endif