]> git.sev.monster Git - dotfiles.git/blobdiff - etc/vim/.vimrc
zlogout: clean up logic, dont act without data
[dotfiles.git] / etc / vim / .vimrc
index f79a80bd7dcbc307dda94d92d0f4df94873c443f..04521a64e5abf84f4aacdf9fa0667a52644c256b 100644 (file)
-source $VIMRUNTIME/defaults.vim
-
-let x = ($XDG_CONFIG_HOME??($HOME."/.config"))."/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'
-unlet x
 
-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
+
+" 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
+execute 'set backupdir='.y.'//'
+set backup backupcopy=yes
+
+" 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'
 
-if !isdirectory($HOME . "/.local/share/vim")
-    call mkdir($HOME . "/.local/share/vim", "p", 0700)
+    " 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 backup
-set backupdir=$HOME/.local/share/vim//
-set backupcopy=yes
-if !isdirectory($HOME . "/.local/state/vim")
-    call mkdir($HOME . "/.local/state/vim", "p", 0700)
+
+unlet x
+unlet y
+
+""" 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
-set undofile
-set undodir=$HOME/.local/state/vim//
-
-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
+
+""" 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 /\(^ \+\)\|\( \+$\)/
-
-" vim: set et fenc=utf-8 ft=vim sts=4 sw=4 ts=8 tw=79 :
+
+""" 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 <C-\>n <C-\><C-N>
+    tnoremap <C-\>o <C-\><C-O>
+endif
+
+" move windows any time
+if has('nvim')
+    " terminal
+    tnoremap <A-h> <C-\><C-N><C-w>h
+    tnoremap <A-j> <C-\><C-N><C-w>j
+    tnoremap <A-k> <C-\><C-N><C-w>k
+    tnoremap <A-l> <C-\><C-N><C-w>l
+endif
+" insert
+inoremap <A-h> <C-\><C-N><C-w>h
+inoremap <A-j> <C-\><C-N><C-w>j
+inoremap <A-k> <C-\><C-N><C-w>k
+inoremap <A-l> <C-\><C-N><C-w>l
+" normal
+nnoremap <A-h> <C-w>h
+nnoremap <A-j> <C-w>j
+nnoremap <A-k> <C-w>k
+nnoremap <A-l> <C-w>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('<C-L>', 'n') ==# ''
+  nnoremap <silent> <C-L> :nohlsearch<C-R>=has('diff')?'<Bar>diffupdate':''<CR><CR><C-L>
+endif
This page took 0.048913 seconds and 4 git commands to generate.