.vimrc

Sat, 21 Jan 2023 22:43:08 -0500

author
Meredith Howard <mhoward@roomag.org>
date
Sat, 21 Jan 2023 22:43:08 -0500
changeset 1010
d28fdf462fe0
parent 1004
30b285e424e7
child 1012
e0cd428ffa90
permissions
-rw-r--r--

shrink pager_index_lines

" vim: et sts=2 sw=2
" vim: fdm=marker

set encoding=utf-8
scriptencoding utf-8

unlet! skip_defaults_vim
source $VIMRUNTIME/defaults.vim

" on windows and not cygwin
let g:on_windows = (has('win32') || has('win64'))
let g:myvim      = $HOME . (g:on_windows ? '/vimfiles' : '/.vim')
let g:vimcache   = $HOME . '/.cache/vim'
let s:filename   = expand('<sfile>')

" Set up plug and plugins  {{{
  call plug#begin(g:myvim . '/bundle')

  Plug 'vim-airline/vim-airline'
  Plug 'vim-airline/vim-airline-themes'
  Plug 'lfv89/vim-interestingwords'
  Plug 'nathanaelkane/vim-indent-guides'

  Plug 'ciaranm/securemodelines'
  Plug 'editorconfig/editorconfig-vim'

  Plug 'wsdjeg/vim-fetch'
  Plug 'tpope/vim-vinegar'
  Plug 'mbbill/undotree', {'on': 'UndotreeToggle'}
  Plug 'majutsushi/tagbar', {'on': 'TagbarToggle'}

  Plug 'godlygeek/tabular'
  Plug 'tomtom/tcomment_vim'
  Plug 'tpope/vim-unimpaired'
  Plug 'kshenoy/vim-signature'
  Plug 'lifepillar/vim-mucomplete'
  Plug 'tpope/vim-endwise'
  Plug 'kana/vim-textobj-user'
  Plug 'glts/vim-textobj-comment'

  Plug 'prabirshrestha/vim-lsp'
  Plug 'mattn/vim-lsp-settings'

  Plug 'vimwiki/vimwiki'

  Plug 'Shougo/vinarise.vim'
  Plug 'asciidoc/vim-asciidoc'
  Plug 'vim-perl/vim-perl', {'branch': 'dev'}
  Plug 'sheerun/vim-polyglot'
  Plug 'yko/mojo.vim'

  Plug 'powerman/vim-plugin-viewdoc'

  let g:no_viewdoc_abbrev = 1
  let g:polyglot_disabled = ['autoindent', 'sensible', 'vifm', 'perl', 'go']

  try
    execute 'source ' . s:filename . '.local-pre'
  catch
  endtry

  call plug#end()
" }}}

" Key maps {{{
nnoremap <silent> <F2>   :20Lexplore<CR>
nnoremap <silent> <F3>   n
nnoremap <silent> <S-F3> N
noremap  <silent> <F4>   :let v:hlsearch = !v:hlsearch<CR>
nnoremap <silent> <F5>   :UndotreeToggle<CR>
nnoremap <silent> <F8>   :TagbarToggle<CR>

" let F4, :noh work as-is in insert mode
imap <F4> <C-O><F4>

cmap <F3> <CR>

" chdir to the directory of the open buffer
noremap <leader>cd :cd %:p:h<cr>:pwd<cr>

noremap <leader>pp :setlocal paste!<cr>

noremap <leader>cc :MUcompleteAutoToggle<cr>

" faster window nav
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
nnoremap <C-\> <C-w>p

" navigate by on-screen lines
nnoremap <expr> j v:count ? 'j' : 'gj'
nnoremap <expr> k v:count ? 'k' : 'gk'

" alt buffer
nnoremap gb <C-^>
nnoremap gB :ls<CR>:b<Space>

" Select last paste, in the same mode it was pasted in
nnoremap <expr> gV '`[' . strpart(getregtype(), 0, 1) . '`]'

" Use ltag over tselect
nnoremap g<C-]> :call vimrc#Ltag(expand('<cword>'))<CR>

" clear all interestingwords with \\k since \K is ri.vim
nnoremap <silent> <leader><leader>k :call UncolorAllWords()<CR>

" mark line
nmap <leader>l V<leader>k

" use Grep for a recursive *
nnoremap g* :Grep<CR>

" K: doc, gKK: doc current filename
nnoremap gKK :call ViewDoc('doc', expand('%:p'))<CR>

" Tabular shortcuts
noremap <leader>ta :Tabularize first_arrow<CR>
noremap <leader>te :Tabularize first_eq<CR>
noremap <leader>tc :Tabularize first_colon<CR>
noremap <leader>tm :Tabularize methods<CR>

noremap <silent> <leader>a :call vimrc#AutoFmtToggle()<CR>

" Maps that only apply when an LSP is available
func! s:on_lsp_buffer_enabled() abort
  setl omnifunc=lsp#complete
  if exists('+tagfunc')
    setl tagfunc=lsp#tagfunc
  endif
  nmap <buffer> K          <plug>(lsp-hover)
  nmap <buffer> gd         <plug>(lsp-definition)
  nmap <buffer> gr         <plug>(lsp-references)
  nmap <buffer> gt         <plug>(lsp-peek-type-definition)
  nmap <buffer> ]d         <plug>(lsp-next-diagnostic)
  nmap <buffer> [d         <plug>(lsp-previous-diagnostic)
  nmap <buffer> ]r         <plug>(lsp-next-reference)
  nmap <buffer> [r         <plug>(lsp-previous-reference)
  nmap <buffer> <leader>rn <plug>(lsp-rename)
  nmap <buffer> <leader>gt <plug>(lsp-type-definition)
  let &signcolumn = (has('gui_running') ? 'number' : 'yes')
  hi lspReference ctermfg=217 guifg=#f0a0c0
endfunc

" Commands & Aliases  {{{
command! -nargs=+ CAlias call vimrc#CommandAlias(<f-args>)

command! Gcd call vimrc#Gcd()
command! Hgcd call vimrc#Hgcd()

command! SyntaxCompleteOn setl omnifunc=syntaxcomplete#Complete

command! Mksession execute "mksession! " . v:this_session
command! PruneSession call vimrc#PruneSession()

command! -nargs=* -complete=file Tig      call tig#Tig(<f-args>)
command!                         TigBlame call tig#TigBlame()
command!                         TigLog   call tig#Tig('log', '-p', '--', expand('%'))

command! -nargs=* -complete=file Grep call vimrc#Grep(<f-args>)
CAlias Ag Grep
CAlias grep Grep

CAlias Q q
CAlias Qa qa
CAlias W w

CAlias gcd Gcd
CAlias hgcd Hgcd

" make these default to one window/buffer too
CAlias  doc      ViewDoc!
CAlias  help     ViewDocHelp!
CAlias  man      ViewDocMan!
CAlias  perldoc  ViewDocPerl!
"}}}

"}}}

" General settings  {{{
set background=dark

set hlsearch
set ignorecase
set smartcase

if has('gui_running') || $LANG =~# 'UTF-8'
  let &listchars = "tab:⇥·,trail:◼,nbsp:◻,extends:»,precedes:«"
  let &fillchars = "fold: ,vert:│"
else
  let &listchars = "tab:>-,trail:-,nbsp:%,extends:»,precedes:«"
  let &fillchars = "fold: "
endif

set linebreak
let &showbreak = "» "
set breakindent
set breakindentopt=min:66,shift:2

set virtualedit=block

set autoindent
set smarttab
set expandtab
set shiftwidth=2
set shiftround

set formatoptions=cqln1j
if has("patch-8.1.0360")
  set diffopt+=algorithm:patience
endif

set splitright splitbelow
set scrolloff=15
set sidescrolloff=10
set laststatus=2
set noshowmode
set wildignorecase
set shortmess+=c

set noerrorbells
set belloff=all

set autowriteall
set autoread

set ttimeoutlen=25

set synmaxcol=350

set tags+=.tags,./.tags;

" Ignore compiled files and repositories
set wildignore=*.o,*~,*.pyc
if g:on_windows
    set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store
else
    set wildignore+=.git\*,.hg\*,.svn\*
endif

" Don't assume to scan includes when autocompleting
set complete-=i complete-=t

set completeopt+=menuone,noselect

" Never open with folds collapsed
set nofoldenable

" keep the junk out (imo)
set sessionoptions=buffers,curdir,localoptions

" Enable enhanced % matching in ruby
runtime macros/matchit.vim

for subdir in ['backup', 'tmp', 'undo']
  call vimrc#PrepDir(g:vimcache . '/' . subdir)
  " call vimrc#PruneFiles(g:vimcache . '/' . subdir, 60)
endfor
call vimrc#PrepDir(g:vimcache . '/session')

set backup
let &backupdir = g:vimcache . '/backup//,.'
let &directory = g:vimcache . '/tmp//,.'

if has('persistent_undo')
  set undofile
  let &undodir = g:vimcache . '/undo//,.'
endif

if executable('ag')
  let &grepprg = "ag --vimgrep"
  set grepformat^=%f:%l:%c:%m,%f
  set errorformat+=%f
endif

let g:jellybeans_overrides = {
    \ 'SignColumn': {'ctermbg': 235, 'guibg':'222222'},
  \ }

colorscheme jellybeans
" }}}

" Autocmds  {{{
augroup vimrc
  autocmd!

  autocmd WinLeave * if !pumvisible() | stopinsert | endif

  " complement to autowriteall
  autocmd FocusLost * silent! wa

  " Make paths when writing, as necessary
  autocmd BufWritePre * :call vimrc#MkNonExDir(expand('<afile>'), +expand('<abuf>'))

  if ! &diff
    " set and load a session based on servername
    autocmd VimEnter * nested call vimrc#AutoSessionCheck()

    " Jump to last known pos
    autocmd BufReadPost *
      \ if &filetype !~# 'mail\|^git\|^hg' && line("'\"") >= 1 && line("'\"") <= line("$") |
      \   exe "normal! g`\"" |
      \ endif

    " Simple highlight conflict markers
    autocmd BufReadPost *
      \ match Error "^\([<>|]\)\{7} \@=\|^=\{7}$"
  endif

  " Simplify noisy ltag output
  autocmd BufReadPost quickfix
    \ if w:quickfix_title =~# '^:ltag' |
      \ setl modifiable |
      \ silent exe ':%s/\^\\V\s*\|\\\$|.*//g' |
      \ setl nomodifiable |
    \ endif

  autocmd BufReadPost quickfix nmap <buffer> q <C-w>c

  " Neomutt changed their tmpfile pattern, ugh
  autocmd BufNewFile,BufRead neomutt-*-\w\+ setf mail
augroup END

" clear defaults.vim 'jump to last known pos'
augroup vimStartup | au! | augroup END

" https://mjj.io/2015/01/27/encrypting-files-with-gpg-and-vim/
" hacked to work with vimwiki
augroup encrypted
  autocmd!
  autocmd BufReadPre,FileReadPre *.gpg,*.gpg.* setl noswapfile noundofile nobackup viminfo=
  autocmd BufReadPost *.gpg,*.gpg.* call vimrc#SafeFilterFile('gpg2 -d')
  autocmd BufWritePre *.gpg,*.gpg.* call vimrc#SafeFilterFile('gpg2 -se -a --default-recipient-self')
  autocmd BufWritePost *.gpg,*.gpg.* :sil undo
augroup END
"}}}

" Perl type-specific settings  {{{
let perl_include_pod     = 1
let perl_sub_signatures  = 1
let perl_sync_dist       = 200

let g:perl_compiler_force_warnings = 0
" }}}

" Plugin settings  {{{
let g:plug_threads = 3

let g:netrw_altfile = 1
let g:netrw_use_errorwindow = 0

">> mucomplete
" enable and prefer local buffer before tags
let g:mucomplete#enable_auto_at_startup = 1
let g:mucomplete#completion_delay = 300
let g:mucomplete#chains = {
  \ 'default': ['path', 'c-n', 'omni', 'tags', 'dict', 'uspl'],
  \}

">> vim-lsp
let g:lsp_diagnostics_echo_cursor = 1
let g:lsp_diagnostics_echo_delay = 200
let g:lsp_diagnostics_highlight_enabled = 0
let g:lsp_diagnostics_signs_insert_mode_enabled = 0
let g:lsp_document_code_action_signs_enabled = 0
let g:lsp_preview_doubletap = [function('lsp#ui#vim#output#closepreview')]

let g:lsp_settings_enable_suggestions = 0
let g:lsp_settings_deny_local_keys    = ['cmd', 'config', 'disabled', 'workspace_config']
let g:lsp_settings_filetype_perl      = v:false
let g:lsp_settings_filetype_ruby      = ['solargraph']

if !has('patch-8.1.1517') && !has('neovim')
  let g:lsp_signature_help_enabled = 0
endif

augroup vim-lsp
  autocmd!
  autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
  autocmd User lsp_float_opened call s:on_lsp_float_opened()
  autocmd FileType markdown.lsp-hover nmap <silent><buffer>q :pclose<CR>
  autocmd FileType markdown.lsp-hover exe "%s/](/]\r(/g"
augroup END

func! s:on_lsp_float_opened() abort
  call win_execute(popup_list()[0], 'setl sbr=NONE nobri linebreak')
endfunc

let g:lsp_settings = {
  \ 'gopls': {
    \ 'workspace_config': { 'gopls': { 'gofumpt': v:true } },
  \ },
\ }

">> Vimwiki
let g:vimwiki_auto_chdir  = 1
let g:vimwiki_auto_header = 1
let g:vimwiki_ext2syntax = {}

let g:vimwiki_list = [
  \ {
    \ 'path': '~/vimwiki/',
    \ 'auto_tags': 1, 'auto_toc': 1, 'automatic_nested_syntaxes': 1
  \ },
  \ {
    \ 'path': '~/Documents/SpiderOak Hive/vimwiki',
    \ 'auto_tags': 1, 'auto_toc': 1, 'automatic_nested_syntaxes': 1
  \ }
\ ]

">> Viewdoc
let g:viewdoc_open = 'topleft new'
let g:viewdoc_winwidth_max = 100

">> Undotree
let g:undotree_SplitWidth = 45
let g:undotree_SetFocusWhenToggle = 1
let g:undotree_ShortIndicators = 1
let g:undotree_DiffCommand = "diff -dp -U 1"

">> Tagbar
let g:tagbar_autoclose = 1
let g:tagbar_autofocus = 1
let g:tagbar_compact = 1
let g:tagbar_width = 30

" tagbar languages in plugin/tagbar-types.vim

">> Airline
let g:airline#extensions#whitespace#enabled = 0
let g:airline_powerline_fonts = 0

let g:airline#extensions#tabline#enabled          = 1
let g:airline#extensions#tabline#buffer_min_count = 2
let g:airline#extensions#tabline#tab_nr_type      = 1
let g:airline#extensions#tabline#buffer_nr_show   = 1
let g:airline#extensions#tabline#formatter        = 'unique_tail_improved'
let g:airline#extensions#tabline#buffer_nr_format = '%s:'
let g:airline#extensions#tabline#buffers_label    = 'BUF'
let g:airline#extensions#tabline#tabs_label       = 'TAB'
let g:airline#extensions#tabline#left_sep         = ' '
let g:airline#extensions#tabline#left_alt_sep     = ' '
let g:airline#extensions#tabline#right_sep        = ' '
let g:airline#extensions#tabline#right_alt_sep    = ' '

let g:airline#extensions#tabline#ignore_bufadd_pat =
  \ '\c\v^__tagbar|^[doc\d*\]$|^diffpanel'

let g:airline#extensions#branch#format = 2

">> interestingwords
" These are jellybeans colors and some complements
let g:interestingWordsGUIColors = ['#C4A258','#6AADA0', '#71B9F8', '#A037B0', '#CF6A4C', '#D8AD4C']
let g:interestingWordsTermColors = ['179', '73', '75', '133', '167', '136']
" }}}

" {{{ Commands
" Preview markdown mail -- I edit with headers so I box them in a code block.
command! MailPreview     enew | set bt=nofile | 0r # | exe 'norm! 0O```<Esc>}O```' | silent exe '%!mutt-md2html | mutt-html2txt' | 0
command! MailPreviewHTML enew | set bt=nofile | setf html | 0r # | exe 'norm! 0O```<Esc>}O```' | silent exe '%!mutt-md2html' | 0
" }}}

" Local stuff, finish up
try
  execute 'source ' . s:filename . '.local'
catch
endtry

" {{{ Terminal tweaks
" vertical bar in insert mode.
if &term =~# '^\(xterm\|screen\|rxvt\)'
  let &t_SI = "\e[5 q"
  let &t_EI = "\e[0 q"
  if exists("$TMUX")
    let &t_SI = "\ePtmux;" . substitute(&t_SI, "\e", "\e\e", 'g') . "\e\\"
    let &t_EI = "\ePtmux;" . substitute(&t_EI, "\e", "\e\e", 'g') . "\e\\"
  endif
endif

if $TERM =~# 'rxvt-unicode'
  set ttymouse=urxvt
  set mouse=a
  map <Esc>[7~ <Home>
  map <Esc>[8~ <End>
endif
" }}}

mercurial