dotfiles/.vim/vimrc

353 lines
12 KiB
VimL
Raw Normal View History

" VIM CORE
set encoding=utf-8
let &titleold="term"
set nocompatible " enable advanced features
set autochdir " current dir is vim workdir
set title " set xterm title
set path+=.,** " expand to dirs under workdir
set mouse=v " don't interract with the mouse
set laststatus=2 " always show the status line
set keywordprg=":help" " show vim help when hitting "K"
set backspace=indent,eol,start " bkspc behave like expected
set ttimeout " activate timeout for key combos
set ttimeoutlen=50 " set timeout for key combinations
set ttyfast
set number " enable line numbers
set numberwidth=6 " space for more numbers
set cursorline " highlight line number+cursor line
if has("bsd")
set cursorlineopt=number
endif
"set cursorcolumn " highlight current cursor column
execute "set colorcolumn=" . join(range(73,80), ',')
set modeline " read vim mode line in files
set modelines=5 " top/bottom line no. to search
set lazyredraw " no scr. update during macros
set spelllang=de,en " spell check languages
syntax enable " enable syntax plugin (builtin)
if &diff
syntax off
set colorcolumn=
endif
set diffopt=internal
set diffopt+=filler,context:20
set diffopt+=iwhite,iblank
set diffopt+=algorithm:histogram
set diffopt+=vertical
set diffexpr=
filetype plugin indent on " load plugins based on filetype
set re=1 " use old regexp engine (faster)
let mapleader = ","
" INDENTATION
set autoindent " indent new lines on same level
set smartindent " smart indent for programming
set cindent " smart indent for C programming
"set formatprg=fmt\ -mnst\ 4\ -w\ 72 " gq wrap rule
set formatprg=par\ -w72qie " gq wrap rule
" SEARCH
"set incsearch " search while typing
set hlsearch " highlight all search matches
"set wrapscan " search continues on top
set ignorecase " search case insensitive
set smartcase " capital letter => case sensitive
" SPACES (TABS)
set tabstop=8 " tabs are displayed as X spaces
set shiftwidth=4 " number of spaces used to indent
let &softtabstop=&shiftwidth " tab key enters X spaces
set expandtab " use spaces when hitting tab
set smarttab " backspace will delete shiftwidth
set textwidth=0 " automatically break lines here
set list " display control characers
set listchars=tab:>- " which characters to display
set fillchars=vert:\│
set fillchars+=foldsep:\│,fold:\—
set fillchars+=foldclose:\🗁
set fillchars+=foldopen:\🗁
set wildmode=full
""map :q map <leader>q :bp<bar>sp<bar>bn<bar>bd<CR>
nmap Q :qall!
nmap k :HugoHelperLink
let g:currentmode={
\ 'n' : 'NORMAL',
\ 'v' : 'VISUAL',
\ 's' : 'SELECT',
\ 'V' : 'V·Line',
\ '' : 'V·Block',
\ 'i' : 'INSERT',
\ 'R' : 'R',
\ 'Rv' : 'V·Replace',
\ 'c' : 'Command',
\}
" STATUSLINE, AIRLINE/POWERLINE IS FOR NOOBS
set statusline=\ %{toupper(g:currentmode[mode()])}
set statusline+=\ %f
set statusline+=%m%r%h%w%q
set statusline+=%=
set statusline+=\ BUF:%n
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\ %{&fileformat}
set statusline+=\ HEX:%B\ INT:%b
set statusline+=\ ROW:%l\ COL:%c
set statusline+=\ %p%%
set statusline+=\
" C specific highlighting
let c_space_errors=1 " trailing space and before tab
let c_gnu=1 " GNU gcc specific items
let c_comment_strings=1 " strings and numbers in comment
let c_curly_error=1 " highlight missing } (may be slow)
" TEMPORARY FILES
set undofile " save undo history to disk
set undodir=~/.vim/undo// " save undo history here
set backup " create backups
set backupcopy=yes " copy file and edit original
set backupdir=~/.vim/backup// " save backup files here
set backupskip=mutt-* " do not create backups of emails
set nowritebackup " no extra backup before writing
set writeany " write to any file (:w!)
set directory=~/.vim/swapfiles// " move swapfiles out of the way
set runtimepath^=/home/sdk/.vim/pack/plugins/start/vim-clap
let g:clap_plugin_experimental = v:true
" CREATE DIRECTORIES
silent execute '!mkdir -p ~/.vim/undo ~/.vim/backup ~/.vim/swapfiles'
" LOOK N FEEL
set t_Co=256 " for terminal with 256 colors
set background=dark " I prefer dark backgrounds
colorscheme wombat256 " :colorscheme <tab> for more
let g:is_posix = 1 " $( ) is fine
" THEME TWEAKS
highlight CursorLine ctermbg=238
highlight ColorColumn ctermbg=none ctermfg=9
highlight CursorLineNr ctermbg=none ctermfg=208 cterm=none
highlight LineNr ctermbg=0
highlight SpecialKey ctermbg=232 ctermfg=245
highlight Normal ctermbg=232
highlight NonText ctermbg=232 ctermfg=234
highlight ErrorMsg ctermbg=0 ctermfg=160 cterm=none
highlight Visual ctermbg=232 ctermfg=208
highlight Search ctermbg=220 ctermfg=0
highlight VertSplit ctermfg=208 ctermbg=0
highlight Folded ctermfg=45 ctermbg=0
highlight FoldColumn ctermfg=45 ctermbg=0
highlight StatusLine ctermbg=234 ctermfg=245
highlight StatusLineNC ctermbg=0 ctermfg=245
" HIGHLIGHT SPECIAL WORDS
match ErrorMsg '\(TODO:\|FIXME\|XXX\|workaround\|WTF\|\s\+$\| \+\ze\t\)'
" SPELLING FIX (for cursorline)
highlight SpellBad cterm=NONE ctermfg=darkred ctermbg=NONE
" VIMDIFF COLOR FIX
highlight DiffAdd ctermfg=76 ctermbg=234
highlight DiffDelete ctermfg=234 ctermbg=0
highlight DiffChange ctermfg=255 ctermbg=234
highlight DiffText ctermfg=166 ctermbg=234
" GITGUTTER
set signcolumn=number
highlight GitGutterAddLine ctermfg=1 ctermbg=0
highlight GitGutterChangeLine ctermfg=3 ctermbg=0
highlight GitGutterDeleteLine ctermfg=2 ctermbg=0
highlight GitGutterChangeDeleteLine ctermfg=2 ctermbg=0
highlight SignColumn ctermbg=0
nnoremap od :GitGutterDiffOrig<CR>
" CURSOR SHAPE
let &t_SI = "\e[6 q" " insert mode: ibeam cursor
let &t_EI = "\e[2 q" " normal mode: block cursor
" Buffer NAVIGATION
map  :bnext<CR>
nmap  :bnext<CR>
map  :bprevious<CR>
nmap  :bprevious<CR>
" TMUX FIXES
map  <PageDown>
imap  <PageDown>
nmap  <PageDown>
map  <PageUp>
imap  <PageUp>
nmap  <PageUp>
map  <PageDown>
imap  <PageDown>
nmap  <PageDown>
map  <PageUp>
imap  <PageUp>
nmap  <PageUp>
" NAVIGATE ON VISUAL LINES (SOFT WRAP)
imap <silent> <Down> <C-o> gj
imap <silent> <Up> <C-o> gk
nmap <silent> <Down> gj
nmap <silent> <Up> gk
" USE ARROW / VIM KEYS INSIDE OMNIBOX
inoremap <expr> j pumvisible() ? '<C-n>' : 'j'
inoremap <expr> k pumvisible() ? '<C-p>' : 'k'
inoremap <expr> <Down> pumvisible() ? '<C-n>' : '<Down>'
inoremap <expr> <Up> pumvisible() ? '<C-p>' : '<Up>'
" NETRW
let g:netrw_banner = 0 " disable annoying banner
let g:netrw_browse_split = 4 " open in prior window
let g:netrw_altv = 1 " open splits to the right
let g:netrw_liststyle = 0 " tree view
let g:netrw_ctags = "ectags" " ctags executable to use
let g:netrw_keepdir = 0
let g:netrw_winsize = 25
hi! link netrwMarkFile Search
" TAGS FILE
set tags=.git/tags; " Search tagfile backward recursive
nnoremap gt <c-]> " Jump to tag (go tag)
nnoremap gb <c-o> " Jump to last position (go back)
nnoremap gh :FSHere<CR> " Jump to header file (go header)
nnoremap bb :ls<cr>:b
nnoremap  :Lex<cr>
" CSCOPE
if has("cscope")
set csprg=cscope
set cst
set cspc=3
if filereadable("cscope.out")
cs add cscope.out
elseif filereadable(".git/cscope.out")
cs add .git/cscope.out
elseif filereadable($CSCOPEDB)
cs add $CSCOPEDB
elseif filereadable("../.git/cscope.out")
cs add ../.git/cscope.out
elseif filereadable("../../.git/cscope.out")
cs add ../../.git/cscope.out
elseif filereadable("../../../.git/cscope.out")
cs add ../../../.git/cscope.out
elseif filereadable("../../../../.git/cscope.out")
cs add ../../../../.git/cscope.out
endif
" 'ts' symbol: find all references to the token under cursor
" 'tg' global: find global definition(s) of the token under cursor
" 'tc' calls: find all calls to the function name under cursor
" 'tt' text: find all instances of the text under cursor
" 'te' egrep: egrep search for the word under cursor
" 'tf' file: open the filename under cursor
" 'ti' includes: find files that include the filename under cursor
" 'td' called: find functions that function under cursor calls
nmap ts :scs find s <C-R>=expand("<cword>")<CR><CR>
nmap tg :scs find g <C-R>=expand("<cword>")<CR><CR>
nmap tc :scs find c <C-R>=expand("<cword>")<CR><CR>
nmap tt :scs find t <C-R>=expand("<cword>")<CR><CR>
nmap te :scs find e <C-R>=expand("<cword>")<CR><CR>
nmap tf :scs find f <C-R>=expand("<cfile>")<CR><CR>
nmap ti :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap td :scs find d <C-R>=expand("<cword>")<CR><CR>
function! UpdateCSCOPE()
:! cscope -RL -f .git/cscope.out
:! ectags -Rf .git/tags
endfunction
endif
" nmap  :cnext<CR>
" nmap  :cprevious<CR>
nmap  :execute "grep " . expand("<cword>")<CR><CR>
nmap mm :make<CR><CR><CR>
nmap mt :make test<CR><CR><CR>
nmap md :make debug<CR><CR><CR>
nmap em :!vim Makefile<CR><CR>
nmap st :!smake . test<CR>
nmap sm :!smake . <CR>
let s:enablepaste = 0
function! TogglePasteMode()
if s:enablepaste
set nopaste list number
else
set paste nolist nonumber
endif
let s:enablepaste = s:enablepaste ? 0 : 1
endfunction
nmap <tab> :call TogglePasteMode()<CR>
if executable('ugrep')
set grepprg=ugrep\ -RInk\ -j\ -u\ --tabs=1\ --ignore-files
set grepformat=%f:%l:%c:%m,%f+%l+%c+%m,%-G%f\\\|%l\\\|%c\\\|%m
endif
" CUSTOM: # highlights, n searches.
nmap # :let @/ = expand('<cword>')\|set hlsearch<C-M>
" CUSTOM: root save
function RootSave()
:exec 'w !doas dd of=' . shellescape(expand('%'))
:set nomodified
endfunction
" PLUGIN: TAGBAR
nmap <F12> :TagbarToggle<CR>
let g:tagbar_ctags_bin = "ectags"
" PLUGIN: TERMDEBUGGER
let g:termdebugger = "egdb"
" PLUGIN: EASY ALIGN
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)
" CUSTOM: AUTO BRACKET
inoremap {<CR> {<CR> <CR>}<up><right>
" CUSTOM: TREAT C FILES AS C, NOT C++
augroup project
autocmd!
autocmd BufRead,BufNewFile *.h,*.c set filetype=c.doxygen
augroup END
" CUSTOM: AUTORELOAD ON VIMRC CHANGE
augroup myvimrc
au!
au BufWritePost vimrc so $MYVIMRC
augroup END
augroup myquickfix
autocmd!
autocmd QuickFixCmdPost [^l]* cwindow
autocmd QuickFixCmdPost l* lwindow
augroup END
augroup cursorpos
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
augroup END
augroup diffsyntax
autocmd! OptionSet diff syntax off
augroup END
autocmd FocusLost <buffer> silent write