dotfiles/.vim/vimrc

508 lines
19 KiB
VimL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

" try not to put any lines in your vimrc that you don't understand :)
set nocompatible
filetype off "required
" Enable heavy omni completion.
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif
if empty(glob('~/.vim/autoload/plug.vim'))
silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" Run PlugInstall if there are missing plugins
autocmd VimEnter * if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
\| PlugInstall --sync | source $MYVIMRC
\| endif
" both "filetype indent on" and "syntax on" are called by Plug, keeping DRY
call plug#begin()
Plug 'liuchengxu/space-vim-theme'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'ctrlpvim/ctrlp.vim', { 'on': [] }
" 🌷 Distraction-free writing in Vim
Plug 'junegunn/goyo.vim', { 'for': 'markdown' }
Plug 'preservim/nerdcommenter'
Plug 'airblade/vim-gitgutter'
Plug 'tpope/vim-surround'
" fugitive.vim: A Git wrapper so awesome, it should be illegal
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-repeat'
Plug 'tpope/vim-speeddating', { 'on': [] }| " quick date incrementing
" plugin fails to work if it's only loaded on a predefined list of
" formats, commented for now
" Plug 'tpope/vim-afterimage', { 'for': ['xpm', 'png', 'ico', 'gif'] }
Plug 'tpope/vim-jdaddy', { 'for': 'json' }
Plug 'tpope/vim-ragtag', { 'for': ['html', 'xhtml', 'wml', 'xml', 'xslt', 'xsd', 'jsp', 'php', 'aspperl', 'aspvbs', 'cf', 'mason', 'htmldjango', 'eruby'] }
Plug 'gorodinskiy/vim-coloresque'| " coloured background for colour names/codes
Plug 'lpinilla/vim-codepainter'| " text highlighting
Plug 'rhysd/git-messenger.vim'
Plug 'Yggdroot/indentLine'
Plug 'preservim/nerdtree', { 'on': 'NERDTreeToggle' }
Plug 'Xuyuanp/nerdtree-git-plugin', { 'on': 'NERDTreeToggle' }
Plug 'tiagofumo/vim-nerdtree-syntax-highlight', { 'on': 'NERDTreeToggle' }
Plug 'roxma/nvim-yarp'
Plug 'roxma/vim-hug-neovim-rpc'
Plug 'Shougo/deoplete.nvim'
Plug 'vim-syntastic/syntastic', { 'on': [] }
Plug 'dense-analysis/ale'
Plug 'OmniSharp/omnisharp-vim', { 'for': ['cs', 'csh'] }
Plug 'justmao945/vim-clang', { 'on': [] }
Plug 'cdelledonne/vim-cmake'
Plug 'majutsushi/tagbar'
Plug 'lvht/tagbar-markdown', { 'for': 'markdown' }
Plug 'lervag/vimtex', { 'for': 'tex' }
Plug 'xuhdev/vim-latex-live-preview', { 'for': 'tex' }
Plug 'cespare/vim-toml', { 'for': 'toml' }
Plug 'Glench/Vim-Jinja2-Syntax'
Plug 'pearofducks/ansible-vim'
Plug 'hashivim/vim-terraform'
Plug 'aouelete/sway-vim-syntax', { 'for': 'sway' }
Plug 'rust-lang/rust.vim', { 'for': 'rust' }
Plug 'fatih/vim-go', { 'for': 'go', 'do': ':GoInstallBinaries' }
Plug 'chikamichi/mediawiki.vim', { 'for': 'wiki' }
Plug 'mfukar/robotframework-vim', { 'for': 'robotframework' }
call plug#end()
let g:airline_powerline_fonts = 1
let g:airline_highlighting_cache = 1
" violet, wombat, deus
let g:airline_theme = 'violet'
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#formatter = 'unique_tail'
let g:airline_mode_map = {
\ '__' : '-',
\ 'c' : 'C',
\ 'i' : 'I',
\ 'ic' : 'I-C',
\ 'ix' : 'I-X',
\ 'n' : 'N',
\ 'multi' : 'M',
\ 'ni' : 'N',
\ 'no' : 'N',
\ 'R' : 'R',
\ 'Rv' : 'R',
\ 's' : 'S',
\ 'S' : 'S',
\ '' : 'S',
\ 't' : 'T',
\ 'v' : 'V',
\ 'V' : 'V-L',
\ '' : 'V-B',
\ }
" skip displaying fileformat output if the output matches a configured string.
let g:airline#parts#ffenc#skip_expected_string='utf-8[unix]'
let g:airline#extensions#ale#enabled = 1
let g:ale_open_list = 0
let g:ale_keep_list_window_open = 0
let g:ale_list_window_size = 5
let g:ale_lint_on_text_changed = 'normal'
let g:ale_lint_on_insert_leave = 1
let g:ale_lint_delay = 1000| " the default being 200
let g:ale_completion_autoimport = 1
let g:ale_linters = { 'go': ['gopls', 'govet', 'golint'],
\ 'dockerfile': ['hadolint'],
\ 'cs': ['OmniSharp'] }
let g:ale_fixers = { 'c': ['clang-format', 'clangtidy'],
\ 'cpp': ['clang-format', 'clangtidy'],
\ 'go': ['gopls'] }
if has('patch-8.1.1880')
set completeopt=longest,menuone,popuphidden
" Highlight the completion documentation popup background/foreground the same as
" the completion menu itself, for better readability with highlighted
" documentation.
set completepopup=highlight:Pmenu,border:off
else
set completeopt=longest,menuone,preview
" Set desired preview window height for viewing documentation.
set previewheight=5
endif
let g:gitgutter_terminal_reports_focus=0
let g:gitgutter_async = 1
let g:gitgutter_sign_allow_clobber=0
let g:gitgutter_set_sign_backgrounds = 0
let g:gitgutter_preview_win_floating = 0
set foldtext=gitgutter#fold#foldtext()
let g:deoplete#enable_at_startup = 1
let g:deoplete#enable_ignore_case = 1
let g:livepreview_cursorhold_recompile = 0
let g:livepreview_previewer = 'evince'
let g:livepreview_engine = 'pdflatex -shell-escape -interaction=nonstopmode'
let g:vimtex_compiler_progname = 'pdflatex -shell-escape --interaction=nonstopmode'
let g:tex_flavor = 'latex'
" Add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1
" Allow commenting and inverting empty lines (useful when commenting a region)
let g:NERDCommentEmptyLines = 1
" Enable trimming of trailing whitespace when uncommenting
let g:NERDTrimTrailingWhitespace = 1
"""" Enable NERDCommenterToggle to check all selected lines is commented or not
"""let g:NERDToggleCheckAllLines = 1
" Add your own custom formats or override the defaults
let g:NERDCustomDelimiters = { 'vim': { 'left': '"','right': '' }, 'c': { 'left': '/**','right': '*/' }, 'zsh': { 'left': '#','right': ''} }
let g:NERDTreeGitStatusWithFlags = 1
let g:indentLine_setColors = 1
let g:indentLine_char_list = ['|', '¦', '┆', '┊', ':']
let g:indentLine_conceallevel = 0
let g:git_messenger_close_on_cursor_moved = v:false
let g:git_messenger_always_into_popup = v:true
hi gitmessengerHash term=None guifg=#f0eaaa ctermfg=111
" OmniSharp
" IDE0010: Populate switch - display in ALE as `Info`
" IDE0055: Fix formatting - display in ALE as `Warning` style error
" CS8019: Duplicate of IDE0005
let g:OmniSharp_diagnostic_overrides = {
\ 'IDE0010': {'type': 'I'},
\ 'IDE0055': {'type': 'W', 'subtype': 'Style'},
\ 'CS8019': {'type': 'None'},
\}
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 2
let g:syntastic_loc_list_height = 8
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0
let g:syntastic_aggregate_errors = 1
let g:syntastic_id_checkers = 1
let g:syntastic_error_symbol = "✗"
let g:syntastic_warning_symbol = "âš "
set statusline+=%#warningmsg#
set statusline+=%{exists('g:loaded_syntastic_plugin')?SyntasticStatuslineFlag():''}
set statusline+=%*
let g:syntastic_javascript_checkers = ['jsl']
let g:syntastic_python_checkers = ['flake8', 'pylint-3']
let g:syntastic_c_compiler = 'clang'
let g:syntastic_c_check_header = 1
let g:syntastic_c_auto_refresh_includes = 1
let g:syntastic_cpp_check_header = 1
let g:syntastic_cpp_auto_refresh_includes = 1
let g:syntastic_c_cpplint_exec = ['cppcheck', 'clang-check', 'clang-tidy']
let g:syntastic_go_checkers = ['go', 'gopls', 'golint', 'govet']
let g:terraform_align=1
let g:terraform_fold_sections=1
let g:terraform_fmt_on_save=1
" change cursor shape for different editing modes, neovim does this by default
if !has('nvim')
if exists('$TMUX')
let &t_SI = "\<Esc>Ptmux;\<Esc>\e[12 q\<Esc>\\"
let &t_SI = "\<Esc>Ptmux;\<Esc>\e[4 q\<Esc>\\"
let &t_SI = "\<Esc>Ptmux;\<Esc>\e[2 q\<Esc>\\"
else
let &t_SI = "\e[12 q"
let &t_SR = "\e[4 q"
let &t_EI = "\e[2 q"
endif
endif
" reset cursor when vim exits
autocmd VimLeave * silent !echo -ne "\033]112\007"
command! W execute 'silent w !sudo tee % >/dev/null' | edit!
command! -nargs=* Make write | make! <args> | cwindow
" open a terminal in $PWD
nnoremap <silent> <Leader>tt :terminal<CR>
" terminal normal mode
tnoremap <F1> <C-W>N
" toggle showing whitespace
noremap <F5> :set list!<CR>
" make shortcut
nnoremap <F4> :term ++hidden ++open make<cr>
nnoremap <leader><F4> :term ++open make<cr>
nnoremap <F8> :TagbarToggle<CR>
" NERDTree
nmap <Leader>nt :NERDTreeToggle<CR>
vmap gb :<C-U>!git blame % -L<C-R>=line("'<") <CR>,<C-R>=line("'>") <CR><CR>
nnoremap gb :!git blame %<CR>
nnoremap <silent> <Leader>ll :w! !pdflatex -shell-escape -interaction=nonstopmode $PWD/*.tex<CR><CR>
nnoremap <Leader>l :exec &conceallevel ? "set conceallevel=0" : "set conceallevel=1"<CR><CR>
" toggle GitGutterLineHighlights
nnoremap <Leader>d :GitGutterLineHighlightsToggle<cr>
" ALE bindings
nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)
nnoremap <Leader>a :ALEDetail<cr>
" ------ wayland copy
xnoremap <silent>"+y y:call system("wl-copy", @")<cr>
nnoremap <silent>"+p :let @"=substitute(system("wl-paste --no-newline"), '<C-v><C-m>', '', 'g')<cr>p
nnoremap "*p :let @"=substitute(system("wl-paste --no-newline --primary"), '<C-v><C-m>', '', 'g')<cr>p
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<left>"
" ------ autocmd ------
" Enable omni completion.
" autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
" autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
" autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
" autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
" autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags
" automatically open NERDTree if vim is open on it's own (argc() ==0 )
" autocmd StdinReadPre * let s:std_in=1
" autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
" Reload changes if file changed outside of vim requires autoread
augroup load_changed_file
autocmd!
autocmd FocusGained,BufEnter * if mode() !=? 'c' | checktime | endif
autocmd FileChangedShellPost * echo "Changes loaded from source file"
augroup END
" when quitting a file, save the cursor position
augroup save_cursor_position
autocmd!
autocmd BufReadPost * call setpos(".", getpos("'\""))
augroup END
" when not running in a console or a terminal that doesn't support 256 colors
" enable cursorline in the currently active window and disable it in inactive ones
if $DISPLAY !=? '' && &t_Co == 256
augroup cursorline
autocmd!
autocmd VimEnter,WinEnter,BufWinEnter * setlocal cursorline
autocmd WinLeave * setlocal nocursorline
augroup END
endif
" when entering insert mode, relative line
" numbers are turned off, leaving absolute line numbers turned on
augroup numbertoggle
autocmd!
autocmd BufEnter,FocusGained,InsertLeave * set number relativenumber
autocmd BufLeave,FocusLost,InsertEnter * set number norelativenumber
augroup END
hi clear CursorLine
augroup CLClear
autocmd! ColorScheme * hi clear CursorLine
augroup END
hi CursorLineNR cterm=bold
augroup CLNRSet
set cursorline
autocmd! ColorScheme * hi CursorLineNR cterm=bold
augroup END
" define indent-based folding, after loading a file switch to manual folding
augroup vimrc
autocmd!
au BufReadPre * setlocal foldmethod=indent
au BufWinEnter * if &fdm == 'indent' | setlocal foldmethod=manual | endif
augroup END
""" autosave and load views
au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
au FileType xml setlocal shiftwidth=4 tabstop=4
au FileType html setlocal shiftwidth=4 tabstop=4
au BufNewFile,BufRead *.js
\ setlocal shiftwidth=4 tabstop=4 softtabstop=4 expandtab autoindent fileformat=unix
au FileType sway setl textwidth=79
\ tabstop=8 shiftwidth=8 softtabstop=8 noexpandtab autoindent
au BufNewFile,BufRead *.py,*.pyw,*.pyx,?akefil*
\ setlocal tabstop=4 shiftwidth=4 noexpandtab autoindent
\ fileformat=unix
au FileType c setl ofu=ccomplete#CompleteCpp
" Linux kernel style tabs
au BufNewFile,BufRead,BufEnter *.c,*.h,*.cpp
\ setlocal tabstop=8 shiftwidth=8 softtabstop=8 noexpandtab autoindent
\ textwidth=79 fileformat=unix
au BufNewFile,BufRead,BufEnter *.tex
\ setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab autoindent
\ textwidth=79 fileformat=unix conceallevel=0
au BufNewFile,BufRead,BufEnter *.bib
\ setlocal ft=bib tabstop=2 shiftwidth=2 softtabstop=2 noexpandtab autoindent
\ fileformat=unix conceallevel=0
au BufNewFile,BufRead,BufEnter *.cs
\ setlocal ft=cs tabstop=4 shiftwidth=4 softtabstop=4 noexpandtab autoindent
\ textwidth=79 fileformat=unix conceallevel=0
au BufNewFile,BufRead *.cshtml
\ setlocal ft=csh tabstop=4 shiftwidth=4 softtabstop=4 noexpandtab autoindent
\ textwidth=79 fileformat=unix conceallevel=0
augroup async_plug_load
autocmd!
" these plugins take the longest to load, let's do it in a semi-non-blocking
" fashion
autocmd CursorHold,CursorHoldI * call plug#load('syntastic', 'vim-clang', 'vim-speeddating', 'ctrlp.vim')
\| autocmd! async_plug_load
augroup END
augroup omnisharp_commands
autocmd!
" Show type information automatically when the cursor stops moving.
" Note that the type is echoed to the Vim command line, and will overwrite
" any other messages in this space including e.g. ALE linting messages.
autocmd CursorHold *.cs OmniSharpTypeLookup
" The following commands are contextual, based on the cursor position.
autocmd FileType cs nmap <silent> <buffer> gd <Plug>(omnisharp_go_to_definition)
autocmd FileType cs nmap <silent> <buffer> <Leader>osfu <Plug>(omnisharp_find_usages)
autocmd FileType cs nmap <silent> <buffer> <Leader>osfi <Plug>(omnisharp_find_implementations)
autocmd FileType cs nmap <silent> <buffer> <Leader>ospd <Plug>(omnisharp_preview_definition)
autocmd FileType cs nmap <silent> <buffer> <Leader>ospi <Plug>(omnisharp_preview_implementations)
autocmd FileType cs nmap <silent> <buffer> <Leader>ost <Plug>(omnisharp_type_lookup)
autocmd FileType cs nmap <silent> <buffer> <Leader>osd <Plug>(omnisharp_documentation)
autocmd FileType cs nmap <silent> <buffer> <Leader>osfs <Plug>(omnisharp_find_symbol)
autocmd FileType cs nmap <silent> <buffer> <Leader>osfx <Plug>(omnisharp_fix_usings)
autocmd FileType cs nmap <silent> <buffer> <C-\> <Plug>(omnisharp_signature_help)
autocmd FileType cs imap <silent> <buffer> <C-\> <Plug>(omnisharp_signature_help)
" Navigate up and down by method/property/field
autocmd FileType cs nmap <silent> <buffer> [[ <Plug>(omnisharp_navigate_up)
autocmd FileType cs nmap <silent> <buffer> ]] <Plug>(omnisharp_navigate_down)
" Find all code errors/warnings for the current solution and populate the quickfix window
autocmd FileType cs nmap <silent> <buffer> <Leader>osgcc <Plug>(omnisharp_global_code_check)
" Contextual code actions (uses fzf, vim-clap, CtrlP or unite.vim selector when available)
autocmd FileType cs nmap <silent> <buffer> <Leader>osca <Plug>(omnisharp_code_actions)
autocmd FileType cs xmap <silent> <buffer> <Leader>osca <Plug>(omnisharp_code_actions)
" Repeat the last code action performed (does not use a selector)
autocmd FileType cs nmap <silent> <buffer> <Leader>os. <Plug>(omnisharp_code_action_repeat)
autocmd FileType cs xmap <silent> <buffer> <Leader>os. <Plug>(omnisharp_code_action_repeat)
autocmd FileType cs nmap <silent> <buffer> <Leader>os= <Plug>(omnisharp_code_format)
autocmd FileType cs nmap <silent> <buffer> <Leader>osnm <Plug>(omnisharp_rename)
autocmd FileType cs nmap <silent> <buffer> <Leader>osre <Plug>(omnisharp_restart_server)
autocmd FileType cs nmap <silent> <buffer> <Leader>osst <Plug>(omnisharp_start_server)
autocmd FileType cs nmap <silent> <buffer> <Leader>ossp <Plug>(omnisharp_stop_server)
augroup END
" ------ adv maps ------
" strip trailing whitespace, ss (strip space)
nnoremap <silent> <Leader>ss
\ :let b:_p = getpos(".") <Bar>
\ let b:_s = (@/ != '') ? @/ : '' <Bar>
\ %s/\s\+$//e <Bar>
\ let @/ = b:_s <Bar>
\ nohlsearch <Bar>
\ unlet b:_s <Bar>
\ call setpos('.', b:_p) <Bar>
\ unlet b:_p <CR>
match Todo /\s\+$/
set softtabstop=4
set tabstop=4
set shiftwidth=4
set expandtab
set smarttab
set errorformat+=%.%#PHP:\ %m\ \(in\ %f\ on\ line\ %l\)%.%#,
\%E%[0-9]%#.%m:%f?rev=%.%##L%l\ %.%#,%C%.%#
set tags=.tags;
set incsearch " incrimental search
set hlsearch " highlighting when searching
set autoindent
set backspace=2
set splitbelow splitright " splits open at bottom and right
set lazyredraw " don't redraw while executing macros (good performance config)
set listchars=trail:•,tab:>-
set list " show/hide tabs and EOL chars (hidden characters)
set confirm " ask confirmation like save before quit.
set wildmenu " Tab completion menu when using command mode
set wildmode=longest:longest,full
set scrolloff=5 " scroll offset, min lines above/below cursor
"set scrolljump=5 " jump 5 lines when running out of the screen - NO
set sidescroll=10 " minimum columns to scroll horizontally
set showcmd " show command status
set showmatch " flashes matching parenthese when cursor over the other one
set mat=2 " how many tenths of a second to blink when matching brackets
set noshowmode " show editing mode in status (-- INSERT --)
set ruler " show cursor position
set noerrorbells " bells in vim
set undolevels=1000 " number of undos stored
set viminfo='50,"50 " '=marks for x files, "=registers for x files
set nofoldenable
"set foldmethod=indent " indent based folding
set encoding=utf-8 " important for powerline besides others
set ignorecase " searches are case insensitive...
set smartcase " ... unless they contain at least one capital letter
set noscrollbind
set updatetime=1000
" no background from colorscheme as it messes with background transparency in kitty
autocmd ColorScheme * highlight Normal ctermbg=NONE guibg=NONE
set termguicolors
colo space_vim_theme " new fav highlighting
" compensate for lack of theme italics
for s in ["Comment", "Constant", "Include", "Define", "Macro", "Delimiter", "Debug", "Identifier", "Boolean", "markdownItalic"]
execute "hi " s " cterm=italic"
endfor
" vimtex highlight groups
hi! link texMathEnvArgName texEnvArgName
hi! link texMathZone LocalIdent
hi! link texMathZoneEnv texMathZone
hi! link texMathZoneEnvStarred texMathZone
hi! link texMathZoneX texMathZone
hi! link texMathZoneXX texMathZone
hi! link texMathZoneEnsured texMathZone
set conceallevel=0 " for jsons
set ttymouse=sgr " tmux mouse behaviour
set mouse=a " enable mouse in n,v,i,c,h modes
set laststatus=2 " show powerline status bar
set t_Co=256
set gfn=Fira\ Code\ weight=450\ 12
set ballooneval " vim8+ popups
let g:netrw_beval = 1