let mapleader = "," set nocompatible " be iMproved, required filetype off " required let vundle_dir="~/.vim/bundle/Vundle.vim" if filereadable(expand(vundle_dir) . "/README.md") " set the runtime path to include Vundle and initialize let &rtp .= "," . vundle_dir call vundle#begin() Plugin 'VundleVim/Vundle.vim' " let Vundle manage Vundle, required Plugin 'scrooloose/nerdtree' Plugin 'c.vim' Plugin 'jeetsukumaran/vim-buffergator' Plugin 'ericcurtin/CurtineIncSw.vim' Plugin 'tpope/vim-fugitive' Plugin 'tpope/vim-surround' Plugin 'ctrlpvim/ctrlp.vim' Plugin 'rhysd/vim-clang-format' Plugin 'godlygeek/tabular' Plugin 'airblade/vim-gitgutter' Plugin 'jeetsukumaran/vim-pythonsense' Plugin 'easymotion/vim-easymotion' Plugin 'cpiger/NeoDebug' Plugin 'ivan-krukov/vim-snakemake' Plugin 'nvie/vim-flake8' Plugin 'ludovicchabant/vim-gutentags' Plugin 'junegunn/vim-peekaboo' if empty($VIM_DISABLE_YCM) Plugin 'ycm-core/YouCompleteMe' endif Plugin 'dense-analysis/ale' Plugin 'tpope/vim-unimpaired' Plugin 'JuliaEditorSupport/julia-vim' Plugin 'tell-k/vim-autopep8' call vundle#end() " required else let vundle_repo="https://github.com/VundleVim/Vundle.vim.git" echo "Vundle not installed, type :CloneVundle to clone the vundle repo and install it" command! CloneVundle execute "!git clone " . vundle_repo . " " . vundle_dir | source $MYVIMRC | echo "Cloned Vundle. Do :PluginInstall" endif if !exists("vimrc_autocmds_loaded") let vimrc_autocmds_loaded = 1 " Set the filetype based on the file's extension, but only if " 'filetype' has not already been set au BufRead,BufNewFile .i3initrc setfiletype sh au BufRead,BufNewFile *.config setfiletype conf au BufRead,BufNewFile [Ss]nakefile.* setfiletype snakemake au BufWritePost * if search('\s\+$', 'wn') | call WhitespaceWarn() | endif au BufRead,BufNewFile * setlocal textwidth=0 | setlocal colorcolumn= au BufRead,BufNewFile *.md setlocal textwidth=80 | setlocal colorcolumn=80 au BufRead,BufNewFile *.py setlocal colorcolumn=100 au FileType html setlocal shiftwidth=2 tabstop=2 if exists(":NERDTree") " Open NERDTree if no file specified au StdinReadPre * let s:std_in=1 au VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif endif au BufEnter,FocusGained,InsertLeave * set rnu au BufLeave,FocusLost,InsertEnter * set nornu endif set updatetime=1000 " Default is 4s, but reduce it to make things more real time, like git gutter filetype plugin indent on " required syntax on " These two lines will fully disable any visual or noisy bell " on both windows and linux. >:) set noerrorbells visualbell t_vb= autocmd GUIEnter * set visualbell t_vb= " Make indenting and unindenting in visual mode retain the selection so " you don't have to re-select or type gv every time. vnoremap > >gv vnoremap < <gv set tabstop=4 " show existing tab with 4 spaces width set shiftwidth=4 " when indenting with '>', use 4 spaces width set expandtab " On pressing tab, insert 4 spaces set mouse=a set hlsearch set scrolloff=5 " Don't let cursor be within 5 lines from top or bottom " Warn for trailing whitespace. Search with wrap (w) do not move cursor (n) function! WhitespaceWarn() if &ft =~ 'markdown' return endif echohl WarningMsg echo 'Found whitespace.' echohl None echon ' Type :TrailWhitespace to remove it' endfunction function! StripTrailingWhitespace() " Save cursor position let l:save = winsaveview() " Remove trailing whitespace %s/\s\+$//e " Move cursor to original position call winrestview(l:save) echo "Stripped trailing whitespace" endfunction command! TrailWhitespace call StripTrailingWhitespace() " Hybrid line numbers on active buffer set nu rnu " Do incremental searching when it's possible to timeout. if has('reltime') set incsearch endif " Copy to the end of line noremap Y y$ " define upper case versions of :w and :q command! -bang -range=% -complete=file -nargs=* W ,write command! -bang Q quit " Gutentags configuration if !executable('ctags') let g:gutentags_enabled = 0 else let g:gutentags_add_default_project_roots = 0 let g:gutentags_project_root = ['.git'] let g:gutentags_generate_on_new = 1 let g:gutentags_generate_on_missing = 1 let g:gutentags_generate_on_write = 1 let g:gutentags_generate_on_empty_buffer = 0 " Put all tags in one place let g:gutentags_cache_dir = expand('~/.cache/vim/ctags/') " Extra tag information let g:gutentags_ctags_extra_args = [ \ '--tag-relative=yes', \ '--fields=+ailmnS', \ ] let g:gutentags_ctags_exclude = [ \ '*.git', '*.svg', '*.hg', \ '*/tests/*', \ 'build', \ 'dist', \ '*sites/*/files/*', \ 'bin', \ 'node_modules', \ 'bower_components', \ 'cache', \ 'compiled', \ 'docs', \ 'example', \ 'bundle', \ 'vendor', \ '*.md', \ '*-lock.json', \ '*.lock', \ '*bundle*.js', \ '*build*.js', \ '.*rc*', \ '*.json', \ '*.min.*', \ '*.map', \ '*.bak', \ '*.zip', \ '*.pyc', \ '*.class', \ '*.sln', \ '*.Master', \ '*.csproj', \ '*.tmp', \ '*.csproj.user', \ '*.cache', \ '*.pdb', \ 'tags*', \ 'cscope.*', \ '*.css', \ '*.less', \ '*.scss', \ '*.exe', '*.dll', \ '*.mp3', '*.ogg', '*.flac', \ '*.swp', '*.swo', \ '*.bmp', '*.gif', '*.ico', '*.jpg', '*.png', \ '*.rar', '*.zip', '*.tar', '*.tar.gz', '*.tar.xz', '*.tar.bz2', \ '*.pdf', '*.doc', '*.docx', '*.ppt', '*.pptx', \ ] endif " YouCompleteMe Python interpreter let g:ycm_python_interpreter_path = '~/.python-venv.kuba/bin/python' "let g:ycm_autoclose_preview_window_after_insertion = 1 " Close after leaving insert mode let g:ycm_autoclose_preview_window_after_completion = 1 " Close after accepting completion " ALE let g:ale_linters = { \ 'python': ['flake8'], \ 'c': ['gcc'] \} let g:ale_set_highlights = 1 let g:ale_sign_error = '>>' let g:ale_sign_warning = '--' let g:ale_lint_on_text_changed = 'never' let g:ale_lint_on_enter = 0 let g:ale_c_parse_makefile = 1 let g:ale_lint_on_insert_leave = 1 let g:ale_set_loclist = 1 " fugitive.vim looks for tags in .git " set tags +=~/tags " Recursively move upwards in tree, searching in subfolders for tags file " Status line set laststatus=2 set statusline= set statusline+=%#StatusLineTerm# if exists('g:loaded_fugitive') set statusline+=%{FugitiveStatusline()} endif set statusline+=%#MoreMsg# set statusline+=\ %f set statusline+=%m\ " set statusline+=%= set statusline+=%#WildMenu# set statusline+=%y set statusline+=\ %p%% set statusline+=\ %l:%c" set statusline+=%#MoreMsg# set statusline+=\ " " Colors " Useful for testing: " :runtime syntax/colortest.vim " :runtime syntax/hitest.vim highlight SignColumn ctermbg=NONE highlight GitGutterAdd ctermbg=NONE ctermfg=DarkGreen highlight GitGutterChange ctermbg=NONE ctermfg=Yellow highlight GitGutterDelete ctermbg=NONE ctermfg=DarkRed highlight GitGutterDelete ctermbg=NONE ctermfg=DarkRed highlight Search ctermbg=Brown ctermfg=LightRed highlight ColorColumn ctermbg=DarkBlue highlight Visual ctermbg=LightBlue highlight DiffChange ctermbg=black ctermfg=lightgreen highlight ALEInfo ctermbg=DarkBlue ctermfg=White highlight ALEWarning ctermbg=DarkBlue ctermfg=Black highlight ALEError ctermbg=DarkRed ctermfg=Black highlight SpellCap ctermbg=DarkBlue ctermfg=Black highlight SpellBad ctermbg=DarkRed ctermfg=Black " flake8 let g:flake8_show_in_gutter=1 " CtrlP let g:ctrlp_working_path_mode = 'ra' " Find project root let git_dir_location=finddir('.git', ';') let git_root_location=fnamemodify(git_dir_location, ':h') " Simulate maximize/minimize window nnoremap m :call ToggleMiniMaxiWin() nnoremap wm :call ToggleMiniMaxiWin() function! ToggleMiniMaxiWin() if tabpagewinnr(tabpagenr(), '$') > 1 tab split elseif tabpagenr('$') > 1 if tabpagenr() < tabpagenr('$') tabclose tabprevious else tabclose endif endif endfunction function! ToggleNumbersAndGutter() if !exists('b:numbers_and_gutter_on') || b:numbers_and_gutter_on == 1 set nonumber set norelativenumber GitGutterBufferDisable let b:numbers_and_gutter_on=0 else set number set relativenumber GitGutterBufferEnable let b:numbers_and_gutter_on=1 endif endfunction nnoremap 1 :call ToggleNumbersAndGutter() " Key binds " command! Csc cscope find c " Easymotion leader map (easymotion-prefix) " Forwards and backwards jump and visual select map (easymotion-s) map (easymotion-s) " Forwards and backwards word jump map w (easymotion-bd-w) " Easymotion overwin line nmap l (easymotion-overwin-line) " Easymotion search nmap (easymotion-sn) nmap (easymotion-tn) " Replace the word under cursor nnoremap * :%s/\<\>//g " Replace visual selection vnoremap * y:%sno/"//g nmap :NERDTreeToggle nmap :NERDTreeFind map :call CurtineIncSw() " Julialang let g:latex_to_unicode_auto = 1 noremap LaTeXtoUnicode#Toggle() noremap! LaTeXtoUnicode#Toggle() autocmd FileType python noremap :call Autopep8() nmap cf :cd %:p:h " Change dir to parent of current file nmap cg :cd $git_root_location " Change dir to git root nmap vs :sp $HOME/.vimrc nmap vv :vsp $HOME/.vimrc nmap vt :tabnew $HOME/.vimrc nmap vo :e $HOME/.vimrc nmap v :e $HOME/.vimrc " Match git conflict markers nmap /g /[<=>]\{7,}.*$ " Git-Gutter status, commit, grep, blame nmap gs :Gstatus nmap gS :!git add % nmap gc :Gcommit nmap gg :Ggrep nmap gb :Gblame nmap gu :GitGutterUndoHunk " Fugitive Conflict Resolution nnoremap gd :Gvdiffsplit! nnoremap gdh :diffget //2 nnoremap gdl :diffget //3 " Toggle wrapping of long lines nmap l :set wrap! " Strip trailing whitespace nmap :TrailWhitespace " Scroll window while keeping cursor on same line with shift nmap nmap vmap vmap " Toggle paste mode nmap p :set paste! " Misc. map n :noh vmap T :'<,'> Tabularize / nnoremap c :execute "set colorcolumn=" . (&colorcolumn == "" ? "120" : "")