dotfiles/.vim/vimrc
2025-01-01 10:48:50 +01:00

359 lines
12 KiB
VimL
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

" 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
nmap Q :qall!<cr>
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+=%m%r%h%w%q
set statusline+=\ bufNo:%n
set statusline+=\ %F:%l:%c
set statusline+=%=
set statusline+=\ (%{&fileformat}/%{&fileencoding?&fileencoding:&encoding})
set statusline+=\ 0x%B
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=233
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=52
highlight DiffChange ctermfg=255 ctermbg=234
highlight DiffText ctermfg=166 ctermbg=234
" PLUGIN: 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
" NEXT WINDOW
" clashes a bit in real life with shift+tag (toggle paste mode)
nnoremap <Tab> :wincmd w<cr>
" USE ARROW / VIM KEYS INSIDE OMNIBOX
" FIXME: it has been a while that I've use the 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
" because nerdtree is unnecessary
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
" findtags dir searches for the root of CVS or GIT repositories
" and returns the path for the tag file, and $PWD if neigher
" GIT nor CVS is detected. Tags will go in:
" - gitroot/.git/tags
" - cvsroot/.tags/tags
" - $PWD/.tags/tags
" The same location will be used by cscope.
let tagsdir = trim(system("$HOME/.vim/bin/findtagsdir"))
execute "set tags=".tagsdir."/tags"
"set tags=.git/tags;.tags/tags; " Search tagfile backward recursive
nnoremap gt <c-]> " Jump to tag (go tag)
nnoremap gb <c-o> " Jump to last position (go back)
nnoremap bg :ls<cr>:b " Jump to buffer number (buffer go)
nnoremap bb :ls<cr>:b#<cr><cr> " Jump to last open buffer (buffer back)
nnoremap  :Lex<cr> " open file browser
" PLUGIN: CSCOPE
" I can never remember these keys.., or what they do
if has("cscope")
set csprg=cscope
set cst
set cspc=3
if empty($CSCOPEDB)
let $CSCOPEDB=tagsdir.."/cscope.out"
endif
if filereadable($CSCOPEDB)
cs add $CSCOPEDB
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>
endif
" CUSTOM: Good idea, but when have I used this last time?
" nmap  :cnext<CR>
" nmap  :cprevious<CR>
nmap  :execute "grep " . expand("<cword>")<CR><CR>
" CUSTOM: Make shortcuts
" this is awful cr cr cr cr cr
" FIXME find a more universal solution to trigger builds
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>
" CUSTOM: Toggle Paste Mode
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 <S-tab> :call TogglePasteMode()<CR>
" FIXME: not really used...?
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: AUTO BRACKET
inoremap {<cr> {<cr> <cr>}<up><end><c-h>
" CUSTOM: 'h' => highlight word, 'n' => search for it
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"
"""
""" AUTOCOMMANDS
"""
augroup CisNotCPP
au!
au BufRead,BufNewFile *.h,*.c set filetype=c.doxygen
augroup END
augroup AutoReloadVimrc
au!
au BufWritePost vimrc so $MYVIMRC
augroup END
augroup AutoOpenCloseQFixWindow
au!
au QuickFixCmdPost [^l]* cwindow
au QuickFixCmdPost l* lwindow
augroup END
augroup LoadCursorPosition
au!
au BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
augroup END
augroup ResplitOnResize
au!
au VimResized * wincmd =
augroup END
augroup AutoTabSpace
au!
au BufRead,BufNewFile Makefile,/usr/src/*.c,/usr/src/*.h,*.gmk setl sw=8 ts=8 noet
augroup end