Paul Stemmet
f84cf7e4b3
coc.nvim introduced a metric ton of backwards incompatible changes to various APIs they expose in Vim. This commit updates the bits we use to use the new way of doing things. It also adds a :Format command that can be used to format the current buffer. You'll need to do a :PlugUpdate if your psoxizsh has an old coc locally, you can check your version with :CocInfo, if the `version` is <= v0.0.79
460 lines
14 KiB
VimL
460 lines
14 KiB
VimL
|
|
" Function to source only if file exists {
|
|
function! SourceIfExists(file)
|
|
if filereadable(expand(a:file))
|
|
exe 'source' a:file
|
|
endif
|
|
endfunction
|
|
" }
|
|
|
|
let g:rc_files = {
|
|
\ 'early': '~/.config/vim/early.vimrc',
|
|
\ 'pre': '~/.config/vim/pre-plug.vimrc',
|
|
\ 'plug': '~/.config/vim/plug.vimrc',
|
|
\ 'post': '~/.config/vim/post-plug.vimrc',
|
|
\ 'late': '~/.config/vim/late.vimrc',
|
|
\ 'my': $MYVIMRC
|
|
\ }
|
|
|
|
" Edit source files
|
|
function! EditVimRcFiles()
|
|
for l:rc_key in keys(g:rc_files)
|
|
let l:ex_file = expand(g:rc_files[l:rc_key])
|
|
if filereadable(l:ex_file)
|
|
exe 'edit' l:ex_file
|
|
endif
|
|
endfor
|
|
endfunction
|
|
|
|
call SourceIfExists(g:rc_files['early'])
|
|
|
|
" set preferred color scheme if not set
|
|
if !exists("g:my_color_scheme")
|
|
let g:my_color_scheme='one'
|
|
endif
|
|
|
|
" Hide buffers don't close them
|
|
set hidden
|
|
|
|
" Sane pane opening
|
|
set splitbelow
|
|
set splitright
|
|
|
|
" File indent opts
|
|
set shiftwidth=2
|
|
set tabstop=8
|
|
set softtabstop=2
|
|
set expandtab
|
|
set encoding=utf-8
|
|
try
|
|
" Vim 8.2 only
|
|
exec "set listchars=trail:\u02FD,extends:\u22B3,precedes:\u22B2,nbsp:\u02EC,conceal:\u2219,tab:\u2559\u254C\u2556"
|
|
catch
|
|
exec "set listchars=trail:\u02FD,extends:\u22B3,precedes:\u22B2,nbsp:\u02EC,conceal:\u2219,tab:\u2559\u254C"
|
|
endtry
|
|
set list
|
|
set ignorecase
|
|
set infercase
|
|
filetype plugin indent on
|
|
|
|
" Set completion messages off
|
|
set shortmess+=c
|
|
|
|
" Preview window + menu for autocompletions
|
|
set completeopt+=preview
|
|
set completeopt+=menuone
|
|
set completeopt+=longest
|
|
|
|
" Lower update time (Default 4000)
|
|
set updatetime=300
|
|
|
|
set number
|
|
set relativenumber
|
|
try
|
|
set signcolumn=auto
|
|
catch
|
|
set signcolumn=yes:1
|
|
endtry
|
|
|
|
" Use existing buffers
|
|
set switchbuf="useopen,usetab"
|
|
|
|
if exists('+termguicolors')
|
|
set termguicolors
|
|
endif
|
|
|
|
exec "set rtp=$VIMHOME," . &rtp
|
|
|
|
" Better if check for loading plugins
|
|
" This one won't cause vim-plug to autodelete 'unloaded' plugins
|
|
function! LoadIf(check, ...)
|
|
let opts = get(a:000, 0, {})
|
|
" Use opts, or default to not loading plugin
|
|
return a:check ? opts : extend(opts, { 'on': [], 'for': [] })
|
|
endfunction
|
|
|
|
" Check if we can use async Syntastic
|
|
let useNeomake = has('nvim') || v:version > 800
|
|
|
|
call SourceIfExists(g:rc_files['pre'])
|
|
call plug#begin("$VIMHOME/plugged")
|
|
Plug 'junegunn/vim-easy-align'
|
|
Plug 'tmsvg/pear-tree'
|
|
Plug 'tpope/vim-sensible'
|
|
Plug 'tpope/vim-fugitive'
|
|
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
|
|
Plug 'Xuyuanp/nerdtree-git-plugin', { 'on': 'NERDTreeToggle' }
|
|
Plug 'scrooloose/nerdcommenter'
|
|
Plug 'scrooloose/vim-statline'
|
|
Plug 'qpkorr/vim-bufkill'
|
|
Plug 'vim-perl/vim-perl', { 'for': 'perl', 'do': 'make clean carp dancer highlight-all-pragmas moose test-more try-tiny' }
|
|
Plug 'rust-lang/rust.vim', { 'for': 'rust' }
|
|
Plug 'pearofducks/ansible-vim', { 'for': ['yaml', 'yml'] }
|
|
Plug 'luochen1990/rainbow'
|
|
Plug 'kevinoid/vim-jsonc'
|
|
Plug 'junegunn/fzf', { 'on': ['FZF', '<Plug>fzf#run', '<Plug>fzf#wrap'] }
|
|
Plug 'junegunn/fzf.vim'
|
|
Plug 'sheerun/vim-polyglot'
|
|
Plug 'adelarsq/vim-matchit'
|
|
Plug 'vim-airline/vim-airline'
|
|
Plug 'vim-airline/vim-airline-themes'
|
|
Plug 'airblade/vim-gitgutter'
|
|
Plug 'rakr/vim-one'
|
|
Plug 'mox-mox/vim-localsearch'
|
|
Plug 'romainl/vim-cool'
|
|
Plug 'christoomey/vim-tmux-navigator', { 'on': ['TmuxNavigateLeft', 'TmuxNavigateDown', 'TmuxNavigateUp', 'TmuxNavigateRight', 'TmuxNavigatePrevious'] }
|
|
|
|
Plug 'neoclide/coc.nvim', { 'branch': 'release' }
|
|
Plug 'scrooloose/syntastic', LoadIf(!useNeomake)
|
|
Plug 'neomake/neomake', LoadIf(useNeomake)
|
|
Plug 'romainl/vim-qf', LoadIf(useNeomake)
|
|
|
|
Plug 'roxma/nvim-yarp', LoadIf(has('nvim'))
|
|
Plug 'roxma/vim-hug-neovim-rpc', LoadIf(has('nvim'))
|
|
call SourceIfExists(g:rc_files['plug'])
|
|
call plug#end()
|
|
call SourceIfExists(g:rc_files['post'])
|
|
|
|
execute ':silent !mkdir -p ~/.vimbackup'
|
|
|
|
set backupdir=~/.vimbackup
|
|
set directory=~/.vimbackup
|
|
set hlsearch
|
|
|
|
" Airline
|
|
" Airline replaces showmode
|
|
set noshowmode
|
|
let g:airline#extensions#branch#format = 2
|
|
let g:airline#extensions#branch#displayed_head_limit = 16
|
|
let g:airline#extensions#tabline#enabled = 1
|
|
let g:airline#extensions#tabline#left_alt_sep = '|'
|
|
let g:airline#extensions#tabline#formatter = 'unique_tail_improved'
|
|
let g:airline_powerline_fonts = 1
|
|
let g:airline_theme='one'
|
|
if !exists('g:airline_symbols')
|
|
let g:airline_symbols = {}
|
|
endif
|
|
|
|
" Commenting
|
|
let g:NERDSpaceDelims = 1
|
|
let g:NERDCompactSexyComs = 1
|
|
let g:NERDDefaultAlign = 'left'
|
|
let g:NERDCommentEmptyLines = 1
|
|
let g:NERDTrimTrailingWhitespace = 1
|
|
|
|
augroup PsoxNERDTree
|
|
autocmd!
|
|
" Autoquit if nerdtree is last open window
|
|
autocmd BufEnter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
|
|
|
|
" Open nerdtree if opening a directory
|
|
autocmd StdinReadPre * let s:std_in=1
|
|
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
|
|
augroup END
|
|
|
|
if useNeomake
|
|
" Don't move cursor into qf/loc on open
|
|
let g:neomake_open_list = 2
|
|
" Allow multiple makers to resolve
|
|
let g:neomake_serialize = 1
|
|
let g:neomake_serialize_abort_on_error = 1
|
|
" Run on write (instant) + read (800ms) buffers
|
|
call neomake#configure#automake('rw', 800)
|
|
|
|
" Disable inherited syntastic if it exists
|
|
if has_key(plugs, 'syntastic')
|
|
let g:syntastic_mode_map = {
|
|
\ "mode": "passive",
|
|
\ "active_filetypes": [],
|
|
\ "passive_filetypes": [] }
|
|
endif
|
|
endif
|
|
|
|
" If we can't use Neomake, fall back to Syntastic
|
|
if !useNeomake
|
|
" Syntastic Settings
|
|
" Note that airline automatically configures these
|
|
let g:syntastic_always_populate_loc_list = 1
|
|
let g:syntastic_enable_signs = 1
|
|
let g:syntastic_auto_loc_list = 1
|
|
let g:syntastic_check_on_open = 1
|
|
let g:syntastic_check_on_wq = 0
|
|
" Syntastic enable specific checkers
|
|
let g:syntastic_enable_zsh_checker = 1
|
|
let g:syntastic_enable_bash_checker = 1
|
|
endif
|
|
|
|
" vim-qf
|
|
if has_key(plugs, 'vim-qf')
|
|
" Don't force qf/loc windows to bottom
|
|
let g:qf_window_bottom = 0
|
|
let g:qf_loclist_window_bottom = 0
|
|
|
|
" Let Neomake control window size
|
|
if useNeomake
|
|
let g:qf_auto_resize = 0
|
|
endif
|
|
endif
|
|
|
|
" ripgrep settings
|
|
let g:rg_highlight = 'true'
|
|
let g:rg_derive_root = 'true'
|
|
|
|
" Balance pairs when on open, close and delete
|
|
let g:pear_tree_smart_openers = 1
|
|
let g:pear_tree_smart_closers = 1
|
|
let g:pear_tree_smart_backspace = 1
|
|
|
|
" Other
|
|
let g:rainbow_active = 1
|
|
augroup PsoxFileAutos
|
|
autocmd!
|
|
autocmd FileType yaml setlocal indentkeys-=<:> ts=8 sts=2 sw=2 expandtab
|
|
autocmd FileType go setlocal ts=8 sts=4 sw=4 noexpandtab
|
|
\| autocmd BufWritePre <buffer> silent :call CocAction('format')
|
|
" Tidy nerdtree windiw
|
|
autocmd FileType nerdtree setlocal nocursorcolumn nonumber norelativenumber signcolumn=no
|
|
" Autoinstall absent plugins
|
|
autocmd VimEnter *
|
|
\ if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
|
|
\| PlugInstall --sync
|
|
\| q
|
|
\| execute "colorscheme " . g:my_color_scheme
|
|
\| endif
|
|
|
|
if has_key(plugs, 'coc.nvim')
|
|
" Highlight the symbol and its references when hovering
|
|
autocmd CursorHold * silent call CocActionAsync('highlight')
|
|
" Update signature help on jump placeholder
|
|
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
|
|
endif
|
|
|
|
" Force non file buffers to not pollute the buffer list
|
|
autocmd FileType quickfix,netrw setlocal nobuflisted
|
|
|
|
" Actually kill netrw when trying to quit it
|
|
autocmd FileType netrw nnoremap <buffer><silent> <Esc> :call <SID>CloseNetrw()<CR>
|
|
augroup END
|
|
|
|
function! s:CloseNetrw() abort
|
|
for bufn in range(1, bufnr('$'))
|
|
if bufexists(bufn) && getbufvar(bufn, '&filetype') ==# 'netrw'
|
|
silent! execute 'bwipeout ' . bufn
|
|
if getline(2) =~# '^" Netrw '
|
|
silent! bwipeout
|
|
endif
|
|
return
|
|
endif
|
|
endfor
|
|
endfunction
|
|
|
|
" Set bindings for coc.nvim
|
|
if has_key(plugs, 'coc.nvim') && executable("node")
|
|
if !exists("g:coc_global_extensions")
|
|
let g:coc_global_extensions=[]
|
|
endif
|
|
let g:coc_global_extensions+=[ 'coc-yank' ]
|
|
let g:coc_global_extensions+=[ 'coc-spell-checker' ]
|
|
let g:coc_global_extensions+=[ 'coc-vimlsp' ]
|
|
let g:coc_global_extensions+=[ 'coc-rust-analyzer' ]
|
|
let g:coc_global_extensions+=[ 'coc-json' ]
|
|
let g:coc_global_extensions+=[ 'coc-markdownlint' ]
|
|
let g:coc_global_extensions+=[ 'coc-yaml' ]
|
|
|
|
" Do action on current word
|
|
nmap <silent> <leader>. <Plug>(coc-codeaction-selected)w
|
|
|
|
" Do action on a selection
|
|
nmap <silent> <leader>/ <Plug>(coc-codeaction-selected)
|
|
xmap <silent> <leader>/ <Plug>(coc-codeaction-selected)
|
|
|
|
" rename symbol
|
|
nmap <silent> <leader>rn <Plug>(coc-rename)
|
|
" goto definition / references
|
|
nmap <silent> <leader>gd <Plug>(coc-definition)
|
|
nmap <silent> <leader>gr <Plug>(coc-references)
|
|
|
|
" Add `:Format` command to format current buffer.
|
|
command! -nargs=0 Format :call CocActionAsync('format')
|
|
|
|
" Use tab for trigger completion with characters ahead and navigate.
|
|
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
|
|
" other plugin before putting this into your config.
|
|
inoremap <silent><expr> <TAB>
|
|
\ coc#pum#visible() ? coc#pum#next(1):
|
|
\ CheckBackspace() ? "\<Tab>" :
|
|
\ coc#refresh()
|
|
inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"
|
|
|
|
" Make <CR> to accept selected completion item or notify coc.nvim to format
|
|
" <C-g>u breaks current undo, please make your own choice.
|
|
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
|
|
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
|
|
|
|
function! CheckBackspace() abort
|
|
let col = col('.') - 1
|
|
return !col || getline('.')[col - 1] =~# '\s'
|
|
endfunction
|
|
|
|
" Use <c-space> to trigger completion.
|
|
if has('nvim')
|
|
inoremap <silent><expr> <c-space> coc#refresh()
|
|
else
|
|
inoremap <silent><expr> <c-@> coc#refresh()
|
|
endif
|
|
|
|
" Use `[g` and `]g` to navigate diagnostics
|
|
nmap <silent> [g <Plug>(coc-diagnostic-prev)
|
|
nmap <silent> ]g <Plug>(coc-diagnostic-next)
|
|
|
|
" Remap PageUp and PageDown for scroll float windows/popups.
|
|
if has('nvim-0.4.0') || has('patch-8.2.0750')
|
|
" Normal
|
|
nnoremap <silent><nowait><expr> <PageDown> coc#float#has_scroll() ? coc#float#scroll(1) : "\<PageDown>"
|
|
nnoremap <silent><nowait><expr> <PageUp> coc#float#has_scroll() ? coc#float#scroll(0) : "\<PageUp>"
|
|
endif
|
|
|
|
" Use K to show documentation in preview window.
|
|
nnoremap <silent> K :call ShowDocumentation()<CR>
|
|
|
|
function! ShowDocumentation()
|
|
if CocAction('hasProvider', 'hover')
|
|
call CocActionAsync('doHover')
|
|
else
|
|
call feedkeys('K', 'in')
|
|
endif
|
|
endfunction
|
|
|
|
" Open yank list
|
|
nnoremap <silent> <C-Y> :<C-u>CocList -A --normal yank<CR>
|
|
endif
|
|
|
|
" FZF overides
|
|
if has_key(plugs, 'fzf.vim')
|
|
if executable('rg')
|
|
" Only search file contents, not file name
|
|
" We can use the stock :Files for that
|
|
command! -bang -nargs=* Rg call
|
|
\ fzf#vim#grep(
|
|
\ "rg --column --line-number --no-heading --color=always --smart-case ".shellescape(<q-args>),
|
|
\ 1,
|
|
\ fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}),
|
|
\ <bang>0
|
|
\ )
|
|
|
|
" Override the default grep implementation in vim
|
|
set grepprg=rg\ --vimgrep\ --smart-case\ --follow
|
|
|
|
" If the user hasn't set a default FZF command, and has ripgrep installed,
|
|
" use it over find, otherwise defer to the user's preferred command
|
|
if empty($FZF_DEFAULT_COMMAND)
|
|
command! -bang -nargs=? -complete=dir Files call
|
|
\ fzf#vim#files(<q-args>, fzf#vim#with_preview({'source': 'rg --files --hidden --glob "!**/.git/**" ' }), <bang>0)
|
|
endif
|
|
|
|
nnoremap <A-g> :Rg
|
|
nnoremap <leader><A-g> :Rg!
|
|
nnoremap <silent> <A-S-g> :Rg<CR>
|
|
nnoremap <silent> <leader><A-S-g> :Rg!<CR>
|
|
endif
|
|
|
|
nnoremap <A-f> :Files
|
|
nnoremap <leader><A-f> :Files!
|
|
nnoremap <silent> <A-S-f> :Files<CR>
|
|
nnoremap <silent> <leader><A-S-f> :Files!<CR>
|
|
|
|
nnoremap <A-b> :Buffers
|
|
nnoremap <leader><A-b> :Buffers!
|
|
nnoremap <silent> <A-S-b> :Buffers<CR>
|
|
nnoremap <silent> <leader><A-S-b> :Buffers!<CR>
|
|
endif
|
|
|
|
" Vim Tmux unified movement
|
|
if has_key(plugs, 'vim-tmux-navigator')
|
|
let g:tmux_navigator_no_mappings = 1
|
|
let g:tmux_navigator_disable_when_zoomed = 1
|
|
|
|
nnoremap <silent> <C-h> :TmuxNavigateLeft<cr>
|
|
nnoremap <silent> <C-j> :TmuxNavigateDown<cr>
|
|
nnoremap <silent> <C-k> :TmuxNavigateUp<cr>
|
|
nnoremap <silent> <C-l> :TmuxNavigateRight<cr>
|
|
endif
|
|
|
|
" NERDTree Toggle
|
|
nnoremap <F2> :NERDTreeToggle<CR>
|
|
|
|
" Workaround for writing readonly files
|
|
cnoremap w!! w !sudo tee % > /dev/null
|
|
|
|
" Vim config(s) editing
|
|
nnoremap <leader>ve :call EditVimRcFiles()<cr>
|
|
nnoremap <leader>vs :source $MYVIMRC<cr>
|
|
nnoremap <leader>vl <Plug>localsearch_toggle
|
|
|
|
" Toggles all gutter items
|
|
nnoremap <silent> <leader>N :call ToggleGutter()<CR>
|
|
|
|
function! ToggleGutter() abort
|
|
if &number
|
|
exec "set nonumber norelativenumber signcolumn=no"
|
|
else
|
|
exec "set number relativenumber"
|
|
try | set signcolumn=auto | catch | set signcolumn=yes:1 | endtry
|
|
endif
|
|
endfunction
|
|
|
|
" Buffer movement
|
|
nnoremap <silent> <TAB> :call BufferJump("bnext")<CR>
|
|
nnoremap <silent> <S-TAB> :call BufferJump("bprevious")<CR>
|
|
nnoremap <silent> <leader><TAB> :call ListBuffers()<CR>
|
|
|
|
function BufferJump(command)
|
|
let start_buffer = bufnr('%')
|
|
execute a:command
|
|
while &buftype ==# 'quickfix' && bufnr('%') != start_buffer
|
|
execute a:command
|
|
endwhile
|
|
endfunction
|
|
|
|
function ListBuffers()
|
|
try
|
|
Buffers
|
|
catch
|
|
buffers<CR>b<space>
|
|
endtry
|
|
endfunction
|
|
|
|
" Default colorscheme
|
|
set background=dark
|
|
let g:one_allow_italics=1
|
|
execute "colorscheme " . g:my_color_scheme
|
|
highlight Comment term=italic cterm=italic gui=italic
|
|
|
|
set exrc
|
|
set secure
|
|
set modeline
|
|
set modelines=7
|
|
|
|
call SourceIfExists(g:rc_files['late'])
|
|
" vim: ts=8 sw=2 si
|