" dotfiles -- vimrc
" author: johannst
set nocompatible
inoremap jj <Esc>
if !exists('&mapleader')
"let mapleader=";"
" map <Space> as leader
let mapleader=" "
endif
nnoremap <leader>ev :edit ~/.vimrc<CR>
nnoremap <leader>sv :source ~/.vimrc<CR>
"{{{ Plugin Management
" to install plugins open vim and run :PluginInstall from within vim OR
" vim +PluginInstall +qall from cmd line
filetype off " necessary for vundle!!!
set runtimepath+=$VIMHOME/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
" editor enhancements
Plugin 'johannst/AsyncCmdProcessor.vim'
Plugin 'maralla/completor.vim'
Plugin 'vim-scripts/YankRing.vim'
Plugin 'machakann/vim-highlightedyank'
Plugin 'terryma/vim-multiple-cursors'
" fuzzy finder
Plugin 'airblade/vim-rooter'
Plugin 'junegunn/fzf.vim'
" coding
Plugin 'majutsushi/tagbar'
Plugin 'w0rp/ale'
Plugin 'johannst/Clever-Tabs'
" sugar
Plugin 'chriskempson/base16-vim'
call vundle#end()
"}}}
"{{{ Plugin Config
let s:gEnabledPlugins = []
function! s:ParseVimrcForEnabledPlugins()
let l:vimrc = readfile($MYVIMRC)
let l:i = 0
while 1
let l:i = match(l:vimrc, '^Plugin', l:i+1)
if l:i == -1
break
endif
call add(s:gEnabledPlugins, split(l:vimrc[l:i], "'")[1])
endwhile
endfunction
function! s:IsPluginEnabled(plugin)
return index(s:gEnabledPlugins, a:plugin)!=-1
endfunction
call s:ParseVimrcForEnabledPlugins()
if s:IsPluginEnabled('majutsushi/tagbar')
let g:tagbar_ctags_bin=$MYCTAGS
if !empty(glob(g:tagbar_ctags_bin))
augroup aug:TagbarKeymaps
autocmd!
autocmd FileType c,cpp nnoremap <buffer> <leader>tb :TagbarToggle<CR>
autocmd FileType tagbar nnoremap <buffer> <leader>tb :TagbarToggle<CR>
autocmd FileType tagbar nnoremap <buffer> <S-Left> <NOP>
autocmd FileType tagbar nnoremap <buffer> <S-Right> <NOP>
autocmd FileType tagbar nnoremap <buffer> <S-h> <NOP>
autocmd FileType tagbar nnoremap <buffer> <S-l> <NOP>
augroup end
else
echom "[vimrc]: ctags not detected, please link to " g:tagbar_ctags_bin
endif
endif
if s:IsPluginEnabled('vim-scripts/YankRing.vim')
let g:yankring_max_history= 15
let g:yankring_persist = 1
let g:yankring_history_dir = $VIMHOME
let g:yankring_history_file = 'yankring'
nnoremap <leader>y :YRShow<CR>
"nnoremap <leader>ys :YRSearch<CR>
endif
if s:IsPluginEnabled('johannst/AsyncCmdProcessor.vim')
execute "nnoremap <leader>fg :Async find . -type f -exec grep -nHI {} +"repeat('<Left>', 6)
execute "vnoremap <leader>fg \"fy:Async find . -type f -exec grep -nHI <C-r>f {} +"repeat('<Left>', 6)
endif
if s:IsPluginEnabled('w0rp/ale')
let g:ale_sign_column_always = 1
let g:ale_sign_error = '>>'
let g:ale_sign_warning = '--'
let g:ale_set_highlights = 1
"let g:ale_open_list = 1
let g:ale_change_sign_column_color = 1
hi link ALESignColumnWithoutErrors LineNr
hi link ALESignColumnWithErrors LineNr
endif
if s:IsPluginEnabled('junegunn/fzf.vim')
nnoremap <leader>ft :BTags<CR>
nnoremap <leader>fc :Tags<CR>
nnoremap <leader>ff :Files<CR>
nnoremap <leader>fp :Files
nnoremap <leader>fl :Lines<CR>
nnoremap <leader>fb :Buffers<CR>
nnoremap <leader>fs :History/<CR>
nnoremap <leader>fh :History:<CR>
let g:fzf_action = { 'ctrl-s': 'split',
\ 'ctrl-v': 'vsplit' }
command! -bang -nargs=* Rg
\ call fzf#vim#grep(
\ 'rg --column --line-number --no-heading --color=always '.shellescape(<q-args>), 1,
\ <bang>0 ? fzf#vim#with_preview('up:60%')
\ : fzf#vim#with_preview('right:50%:hidden', '?'),
\ <bang>0)
nnoremap <leader>rg :Rg
endif
if s:IsPluginEnabled('chriskempson/base16-vim')
let base16colorspace=256
colorscheme base16-spacemacs
set background=dark
syntax on
else
colorscheme johannst
endif
"}}}
"{{{ Vim Basic
filetype plugin indent on " enable loading indent file for filetype
set fileformats=unix,dos,mac " try recognizing dos, unix, and mac line endings.
set encoding=utf-8 " set default encoding to UTF-8.
set confirm " prompt if closing with unsaved changes.
set shortmess=tTa " use abbreviations in messages and truncate too long strings
set showcmd " show command at end of cmd line (like keymaps,..)
set scrolloff=4 " set vertical scroll distance to 3 lines
set nowrap " dont't wrap text
set backspace=indent,eol,start " backspace behav in insert mode
set noautowrite " never write a file unless I request it.
set noautowriteall " NEVER.
set noautoread " don't automatically re-read changed files.
set number " display line numbers
set relativenumber " display relative line numbers
set virtualedit=block
set list " show invisible character
set listchars=tab:>-,trail:-,precedes:<,extends:>
augroup aug:HighlightTrailingWhitespace
autocmd!
"autocmd BufEnter * 2match Error /\m\(\s\+$\|\([^\t]\)\@<=\t\)/
autocmd BufEnter * 2match Error /\m\(\s\+$\)/
autocmd BufLeave * 2match none
augroup end
set clipboard=unnamed " additionally use (") register as clipboard to (+) register
nnoremap <leader><space> <C-^>
nnoremap <leader>w :set wrap!<CR>
nnoremap <leader>dw :windo diffthis<CR>
nnoremap <leader>dn :diffoff!<CR>
"}}}
"{{{ Basic Movement
augroup aug:HelpPageKeyMaps
autocmd!
autocmd FileType help nnoremap <buffer> <CR> g<C-]>
augroup end
" ctrl-ae jump to line start/end
nnoremap <C-a> 0
nnoremap <C-e> $
inoremap <C-a> <C-o>0
inoremap <C-e> <C-o>$
vnoremap <C-a> 0
vnoremap <C-e> $
cnoremap <C-a> <Home>
cnoremap <C-e> <End>
cnoremap <C-h> <Left>
cnoremap <C-j> <Down>
cnoremap <C-k> <Up>
cnoremap <C-l> <Right>
"}}}
"{{{ Folding
set foldlevel=0
set foldcolumn=1
set foldmethod=marker
set foldmarker={{{,}}}
augroup aug:FileTypeCommentString
autocmd!
autocmd FileType vim execute "let b:comment_symbol=\"\\\"\""
autocmd FileType c,cpp execute "let b:comment_symbol=\"//\""
autocmd FileType sh,config,make,python,tcl execute "let b:comment_symbol=\"#\""
autocmd FileType tex,bib execute "let b:comment_symbol=\"%\""
augroup end
augroup aug:FoldMarkerKeymaps
autocmd!
autocmd FileType * if exists('b:comment_symbol') | execute "nnoremap <buffer> <leader>fm o". b:comment_symbol . "{{{ <Esc>o" . b:comment_symbol. "}}}<Esc><Up>A" | endif
"autocmd FileType * if exists('b:comment_symbol') | execute "inoremap <buffer> <leader>fm <Esc>o". b:comment_symbol . "{{{ <Esc>o" . b:comment_symbol. "}}}<Esc><Up>A" | endif
autocmd FileType * if exists('b:comment_symbol') | execute "vnoremap <buffer> <leader>fm VV'<O". b:comment_symbol . "{{{ <Esc>'>o" . b:comment_symbol. "}}}<Esc>'<<Up>A" | endif
augroup end
"}}}
"{{{ Tabwidth
"set expandtab " expand tabs to spaces
set tabstop=4 " number of columns a tab counts
set shiftwidth=4 " number of columns text is indented
set softtabstop=4 " number of columns tab counts in insert mode
set shiftround " rounds indent to a multiple of shiftwidth
"}}}
"{{{ Search & Replace
set ignorecase " case insensitive matching
set incsearch " already start searching while typing pattern
set hlsearch " highlight search results
set smartcase " overwrite ignorecase if pattern contains capital letters
set showmatch " show matching brackets.
set matchtime=5 " how many tenths of a second to blink when matching brackets
set matchpairs+=<:> " show matching <> as well
nnoremap <leader>n :noh<CR>
execute "vnoremap <leader>r \"ry:%s/<C-r>r/<C-r>r/gc" . repeat('<Left>', 3)
execute "vnoremap <leader>rb \"ry:bufdo%s/<C-r>r/<C-r>r/gc" . repeat('<Left>', 3)
"}}}
"{{{ Buffer & Splits
set hidden " do not unload abandoned buffers
noremap <leader>q :bd
" navigate between different buffers
nnoremap <S-Left> :bprevious<CR>
nnoremap <S-Right> :bnext<CR>
nnoremap <S-h> :bprevious<CR>
nnoremap <S-l> :bnext<CR>
nnoremap <leader>v :vsplit<CR>
nnoremap <leader>s :split<CR>
" move between splits
nnoremap <C-Down> <C-w>j
nnoremap <C-Up> <C-w>k
nnoremap <C-Right> <C-w>l
nnoremap <C-Left> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
nnoremap <C-h> <C-w>h
"}}}
"{{{ Statusline
set laststatus=2 " always show status line
let g:ModeMap={
\ 'n' : 'Normal',
\ 'no' : 'N-Operator Pending',
\ 'v' : 'Visual',
\ 'V' : 'V-Line',
\ '' : 'V-Block',
\ 's' : 'Select',
\ 'S' : 'S-Line',
\ '' : 'S-Block',
\ 'i' : 'Insert',
\ 'R' : 'Replace',
\ 'Rv' : 'V-Replace',
\ 'c' : 'Command',
\ 'cv' : 'Vim Ex',
\ 'ce' : 'Ex',
\ 'r' : 'Prompt',
\ 'rm' : 'More',
\ 'r?' : 'Confirm',
\ '!' : 'Shell',
\}
function! DynamicStatuslineHighlighting()
if (mode() ==# 'n' || mode() ==# 'no' || mode() ==# 'c')
execute 'hi! StatusLine ctermfg=NONE ctermbg=5 cterm=NONE'
elseif (mode() ==# 'i')
execute 'hi! StatusLine ctermfg=18 ctermbg=2 cterm=NONE'
elseif (mode() ==# 'v' || mode() ==# 'V' || g:ModeMap[mode()] ==# 'V-Block')
execute 'hi! StatusLine ctermfg=18 ctermbg=4 cterm=NONE'
else
execute 'hi! StatusLine ctermfg=18 ctermbg=16 cterm=NONE'
endif
return ''
endfunction
let &statusline=''
let &statusline.='%{DynamicStatuslineHighlighting()}'
let &statusline.='[%{g:ModeMap[mode()]}]'
let &statusline.=' %t' " file name
let &statusline.=' {%M%R%H}' " modified/read-only/help-page
let &statusline.='%{&diff==1?" [diff]":""}'
let &statusline.=' [%{&ft}]' "filetype
let &statusline.='%=' " seperator between left and right alignment
if v:version >= 800 && s:IsPluginEnabled('johannst/AsyncCmdProcessor.vim')
let &statusline.=' [A:%{GetAsyncJobStatus()}]'
endif
let &statusline.=' [%b:0x%B]' " dec:hex ascii value of char under cursor
let &statusline.=' [%l/%L -- %c]' " current line/num of lines -- current columen
let &statusline.=' (%p%%)' " current line in percent
"}}}
"{{{ Indentation
set autoindent " copy indent from current line when starting a new line
set smartindent " use smart indent if there is no indent file
"}}}
"{{{ Wildmenu
" Vim command completion settings
set wildmenu " turn on the wild menu
set wildmode=list:longest " <Tab> print list of all matches and complete till longest common string
set wildignore+=*.o,*.obj,.git,*.pyc,*~ " Ignore these files when completing
"}}}
"{{{ Filetype specifics
augroup aug:VimLangStyle
autocmd!
autocmd FileType vim setlocal formatoptions-=cro " disable auto-comment
augroup end
augroup aug:CLangStyle
autocmd!
"autocmd FileType c,cpp setlocal cinoptions=:1,=2,g1,h2 " switch-case/class-lable indentation
autocmd FileType c,cpp setlocal formatoptions-=cro " disable auto-comment
augroup end
"}}}
"% vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:et