" 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', { 'on': [] } 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_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 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 = "\Ptmux;\\e[12 q\\\" let &t_SI = "\Ptmux;\\e[4 q\\\" let &t_SI = "\Ptmux;\\e[2 q\\\" 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! | cwindow " open a terminal in $PWD nnoremap tt :terminal " toggle showing whitespace noremap :set list! " make shortcut nnoremap :make! nnoremap :TagbarToggle " NERDTree nmap nt :NERDTreeToggle vmap gb :!git blame % -L=line("'<") ,=line("'>") nnoremap gb :!git blame % nnoremap ll :w! !pdflatex -shell-escape -interaction=nonstopmode $PWD/*.tex nnoremap l :exec &conceallevel ? "set conceallevel=0" : "set conceallevel=1" " toggle GitGutterLineHighlights nnoremap d :GitGutterLineHighlightsToggle " ALE bindings nmap (ale_previous_wrap) nmap (ale_next_wrap) nnoremap a :ALEDetail " ------ wayland copy xnoremap "+y y:call system("wl-copy", @") nnoremap "+p :let @"=substitute(system("wl-paste --no-newline"), '', '', 'g')p nnoremap "*p :let @"=substitute(system("wl-paste --no-newline --primary"), '', '', 'g')p inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" " ------ 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 *.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 two take the longest to load, let's do it in a semi-non-blocking " fashion autocmd CursorHold,CursorHoldI * call plug#load('syntastic', 'nerdcommenter', '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 gd (omnisharp_go_to_definition) autocmd FileType cs nmap osfu (omnisharp_find_usages) autocmd FileType cs nmap osfi (omnisharp_find_implementations) autocmd FileType cs nmap ospd (omnisharp_preview_definition) autocmd FileType cs nmap ospi (omnisharp_preview_implementations) autocmd FileType cs nmap ost (omnisharp_type_lookup) autocmd FileType cs nmap osd (omnisharp_documentation) autocmd FileType cs nmap osfs (omnisharp_find_symbol) autocmd FileType cs nmap osfx (omnisharp_fix_usings) autocmd FileType cs nmap (omnisharp_signature_help) autocmd FileType cs imap (omnisharp_signature_help) " Navigate up and down by method/property/field autocmd FileType cs nmap [[ (omnisharp_navigate_up) autocmd FileType cs nmap ]] (omnisharp_navigate_down) " Find all code errors/warnings for the current solution and populate the quickfix window autocmd FileType cs nmap osgcc (omnisharp_global_code_check) " Contextual code actions (uses fzf, vim-clap, CtrlP or unite.vim selector when available) autocmd FileType cs nmap osca (omnisharp_code_actions) autocmd FileType cs xmap osca (omnisharp_code_actions) " Repeat the last code action performed (does not use a selector) autocmd FileType cs nmap os. (omnisharp_code_action_repeat) autocmd FileType cs xmap os. (omnisharp_code_action_repeat) autocmd FileType cs nmap os= (omnisharp_code_format) autocmd FileType cs nmap osnm (omnisharp_rename) autocmd FileType cs nmap osre (omnisharp_restart_server) autocmd FileType cs nmap osst (omnisharp_start_server) autocmd FileType cs nmap ossp (omnisharp_stop_server) augroup END " ------ adv maps ------ " strip trailing whitespace, ss (strip space) nnoremap ss \ :let b:_p = getpos(".") \ let b:_s = (@/ != '') ? @/ : '' \ %s/\s\+$//e \ let @/ = b:_s \ nohlsearch \ unlet b:_s \ call setpos('.', b:_p) \ unlet b:_p 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 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 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 notermguicolors set gfn=Fira\ Code\ weight=450\ 12 set ballooneval " vim8+ popups let g:netrw_beval = 1