Files
dotfiles/.vimrc

291 lines
8.1 KiB
VimL
Executable File

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 'shougo/neocomplete'
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'
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
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
highlight Search ctermbg=5
highlight ColorColumn ctermbg=4
filetype plugin indent on " required
syntax on
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 <line1>,<line2>write<bang> <args>
command! -bang Q quit<bang>
" Gutentags configuration
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',
\ ]
" 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+=\ "
" 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 <C-w>m :call ToggleMiniMaxiWin()<CR>
nnoremap <leader>wm :call ToggleMiniMaxiWin()<CR>
function! ToggleMiniMaxiWin()
if tabpagewinnr(tabpagenr(), '$') > 1
tab split
elseif tabpagenr('$') > 1
if tabpagenr() < tabpagenr('$')
tabclose
tabprevious
else
tabclose
endif
endif
endfunction
" Key binds
"
command! Csc cscope find c <cword>
" Easymotion leader
map <Leader><tab> <Plug>(easymotion-prefix)
" Forwards and backwards jump and visual select
map <tab> <Plug>(easymotion-s)
map <space> <C-V><Plug>(easymotion-s)
" Forwards and backwards word jump
map <Leader>w <Plug>(easymotion-bd-w)
" Easymotion overwin line
nmap <Leader><tab>l <Plug>(easymotion-overwin-line)
" Easymotion search
nmap <S-tab> <Plug>(easymotion-sn)
nmap <S-tab> <Plug>(easymotion-tn)
" Replace the word under cursor
nnoremap <leader>* :%s/\<<c-r><c-w>\>//g<left><left>
" Replace visual selection
vnoremap <leader>* y:%sno/<c-r>"//g<left><left>
nmap <F2> :NERDTreeToggle<CR>
nmap <F3> :NERDTreeFind<CR>
map <F5> :call CurtineIncSw()<CR>
nmap <Leader>cf :cd %:p:h <CR> " Change dir to parent of current file
nmap <Leader>cg :cd $git_root_location <CR> " Change dir to git root
nmap <Leader>vs :sp $HOME/.vimrc <CR>
nmap <Leader>vv :vsp $HOME/.vimrc <CR>
nmap <Leader>vt :tabnew $HOME/.vimrc <CR>
nmap <Leader>vo :e $HOME/.vimrc <CR>
nmap <Leader>v :e $HOME/.vimrc <CR>
" Match git conflict markers
nmap <Leader>/g /[<=>]\{7,}.*$<CR>
" Git-Gutter status, commit, grep, blame
nmap <Leader>gs :Gstatus<CR>
nmap <Leader>gS :!git add %<CR>
nmap <Leader>gc :Gcommit<CR>
nmap <Leader>gg :Ggrep<space>
nmap <Leader>gb :Gblame<CR>
nmap <Leader>gu :GitGutterUndoHunk<CR>
" Fugitive Conflict Resolution
nnoremap <leader>gd :Gvdiffsplit!<CR>
nnoremap gdh :diffget //2<CR>
nnoremap gdl :diffget //3<CR>
" Toggle wrapping of long lines
nmap <Leader>l :set wrap!<CR>
" Strip trailing whitespace
nmap <Leader><space> :TrailWhitespace <CR>
" Scroll window while keeping cursor on same line with shift
nmap <S-j> <c-e>
nmap <S-k> <c-y>
vmap <S-j> <c-e>
vmap <S-k> <c-y>
" Misc.
map <Leader>n :noh<CR>
vmap <Leader>T :'<,'> Tabularize /
nnoremap <leader>c :execute "set colorcolumn=" . (&colorcolumn == "" ? "120" : "")<CR>