" ========================================================== " Vim configuration - Sysdev Portable " Optimized for Linux kernel development " ========================================================== set nocompatible set encoding=utf-8 scriptencoding utf-8 " --- leader MUST be set before any mapping let mapleader=" " let maplocalleader="\\" " ---------------------------------------------------------- " UI " ---------------------------------------------------------- set number set relativenumber set ruler set showcmd set nowrap set splitbelow set splitright set signcolumn=yes set laststatus=2 set scrolloff=4 set sidescrolloff=8 set wildmenu set wildmode=longest:full,full set mouse= set ttyfast set lazyredraw " ---------------------------------------------------------- " Editing " ---------------------------------------------------------- set hidden set backspace=indent,eol,start set tabstop=8 set shiftwidth=8 set softtabstop=8 set noexpandtab set autoindent " NOTE: cindent supersedes smartindent — smartindent removed (obsolete + redundant) set cindent set cinoptions=:0,l1,g0,t0,(0,Ws,m1 set textwidth=80 set colorcolumn=81 " j: remove comment leader when joining lines (Vim >= 7.4) set formatoptions+=croqnj set formatoptions-=t " C syntax tweaks (kernel-friendly) let c_comment_strings=1 let c_no_curly_error=1 " ---------------------------------------------------------- " Whitespace (OFF by default, toggle with l) " ---------------------------------------------------------- set nolist set listchars=tab:>-,trail:·,extends:»,precedes:«,nbsp:␣ nnoremap l :set list! " ---------------------------------------------------------- " Search " ---------------------------------------------------------- set incsearch set hlsearch set ignorecase set smartcase " NOTE: gdefault removed — it breaks muscle memory and is " confusing when reading others' vimrc. Use /g explicitly. nnoremap h :set hlsearch! " ---------------------------------------------------------- " Performance " ---------------------------------------------------------- set updatetime=250 set timeoutlen=400 set ttimeoutlen=10 set shortmess+=c " ---------------------------------------------------------- " Undo (XDG-aware, robust) " ---------------------------------------------------------- set undofile set undolevels=1000 if has("unix") if exists("$XDG_CACHE_HOME") && !empty($XDG_CACHE_HOME) let s:cache=$XDG_CACHE_HOME else let s:cache=expand("~/.cache") endif let s:undodir=s:cache . "/vim/undo//" if !isdirectory(s:undodir) silent! call mkdir(s:undodir, "p") endif execute "set undodir=" . fnameescape(s:undodir) endif " ---------------------------------------------------------- " Swap files (centralized — no .swp in source trees) " ---------------------------------------------------------- if has("unix") if exists("$XDG_CACHE_HOME") && !empty($XDG_CACHE_HOME) let s:cache2=$XDG_CACHE_HOME else let s:cache2=expand("~/.cache") endif let s:swpdir=s:cache2 . "/vim/swap//" if !isdirectory(s:swpdir) silent! call mkdir(s:swpdir, "p") endif execute "set directory=" . fnameescape(s:swpdir) set nobackup set nowritebackup endif " ---------------------------------------------------------- " Grep integration " ---------------------------------------------------------- if executable("rg") set grepprg=rg\ --vimgrep\ --no-heading\ --smart-case set grepformat=%f:%l:%c:%m elseif executable("grep") set grepprg=grep\ -nH\ $* set grepformat=%f:%l:%m endif nnoremap g :silent grep! .:copen nnoremap / :silent grep! " ---------------------------------------------------------- " Quickfix / location list " ---------------------------------------------------------- nnoremap ]q :cnext nnoremap [q :cprev nnoremap qo :copen nnoremap qc :cclose nnoremap ]l :lnext nnoremap [l :lprev nnoremap lo :lopen nnoremap lc :lclose " ---------------------------------------------------------- " Window navigation " ---------------------------------------------------------- nnoremap h nnoremap j nnoremap k nnoremap l " ---------------------------------------------------------- " Basic shortcuts " ---------------------------------------------------------- nnoremap w :w nnoremap q :q nnoremap x :x " Fold toggle nnoremap z za " Diff helpers set diffopt=filler,internal,algorithm:histogram,indent-heuristic nnoremap df :windo diffthis nnoremap do :windo diffoff " ---------------------------------------------------------- " Folding " ---------------------------------------------------------- set foldmethod=syntax set foldlevelstart=99 " start with all folds open set foldnestmax=3 " ---------------------------------------------------------- " Tags (ctags) " ---------------------------------------------------------- set tags=./tags;,tags; if filereadable(expand('~/.tags')) set tags+=~/.tags endif nnoremap t :tag nnoremap pt :ptag nnoremap po :popen nnoremap pc :pclose " ---------------------------------------------------------- " cscope (essential for kernel navigation) " ---------------------------------------------------------- if has("cscope") set cscopetag " use cscope for :tag and set cscoperelative " use cscope.out location as prefix set cscopeverbose " Auto-load cscope.out walking up the directory tree function! s:LoadCscope() abort let l:db=findfile("cscope.out", ".;") if !empty(l:db) let l:path=strpart(l:db, 0, match(l:db, "/cscope.out$")) if empty(l:path) | let l:path="." | endif silent! execute "cs add " . l:db . " " . l:path endif endfunction autocmd BufEnter /* call s:LoadCscope() " cscope query mappings " s: symbol g: definition d: called-by c: callers " t: text e: egrep f: file i: #includes nnoremap cs :cs find s =expand("") nnoremap cg :cs find g =expand("") nnoremap cd :cs find d =expand("") nnoremap cc :cs find c =expand("") nnoremap ct :cs find t =expand("") nnoremap ce :cs find e =expand("") nnoremap cf :cs find f =expand("") nnoremap ci :cs find i =expand("") endif " ---------------------------------------------------------- " Man page (K over word) " ---------------------------------------------------------- function! s:Man() abort let l:word=expand("") if exists(":Man") execute "Man " . l:word else execute "!man " . l:word endif endfunction nnoremap K :call Man() " ---------------------------------------------------------- " ClangFormat " ---------------------------------------------------------- function! s:ClangFormatRange(line1, line2) abort if !executable("clang-format") echohl WarningMsg | echo "clang-format not found in PATH" | echohl None return endif let l:view=winsaveview() silent execute a:line1 . "," . a:line2 . "!clang-format" call winrestview(l:view) endfunction command! -range=% ClangFormat call ClangFormatRange(, ) nnoremap cf :ClangFormat xnoremap cf :ClangFormat " ---------------------------------------------------------- " Project root detection " ---------------------------------------------------------- function! s:GitRoot() abort if executable("git") let l:r=systemlist("git rev-parse --show-toplevel 2>/dev/null") if v:shell_error==0 && len(l:r)>0 return l:r[0] endif endif return "" endfunction function! s:FindProjectRoot() abort let l:root=s:GitRoot() return !empty(l:root) ? l:root : getcwd() endfunction " ---------------------------------------------------------- " Smart build (ninja > cmake > make) " ---------------------------------------------------------- function! s:SmartMake() abort let l:root=s:FindProjectRoot() if filereadable(l:root . "/build.ninja") let &makeprg="ninja -C " . fnameescape(l:root) elseif filereadable(l:root . "/CMakeLists.txt") let &makeprg="cmake --build build" elseif filereadable(l:root . "/Makefile") let &makeprg="make -C " . fnameescape(l:root) else let &makeprg="make" endif silent make! copen endfunction command! Make call SmartMake() nnoremap m :Make " ---------------------------------------------------------- " Run single file (errors in quickfix, output in terminal) " ---------------------------------------------------------- function! s:Run() abort write if &filetype=="c" let l:src=expand("%") let l:exe=expand("%:r") let l:saved=&makeprg execute "set makeprg=cc\\ -std=c11\\ -Wall\\ -Wextra\\ -g\\ " \ . fnameescape(l:src) . "\\ -o\\ " . fnameescape(l:exe) silent make! let &makeprg=l:saved " Run only if no errors if empty(filter(getqflist(), 'v:val.valid')) execute "!" . fnameescape(l:exe) else copen endif elseif &filetype=="python" execute "!python3 " . fnameescape(expand("%")) elseif &filetype=="sh" execute "!sh " . fnameescape(expand("%")) else echohl WarningMsg | echo "Run not supported for filetype: " . &filetype | echohl None endif endfunction command! Run call Run() nnoremap r :Run " ---------------------------------------------------------- " Filetypes + syntax " ---------------------------------------------------------- filetype plugin indent on syntax on " ---------------------------------------------------------- " Autocommands " ---------------------------------------------------------- augroup sysdev_ft autocmd! " Trim trailing whitespace on save autocmd BufWritePre * silent! %s/\s\+$//e " Restore last cursor position autocmd BufReadPost * \ if line("'\"")>0 && line("'\"")<=line("$") | \ execute "normal! g`\"" | \ endif " C/C++: kernel style, no list (tabs are intentional) autocmd FileType c,cpp \ setlocal tabstop=8 shiftwidth=8 softtabstop=8 noexpandtab \ textwidth=80 colorcolumn=81 cindent \ cinoptions=:0,l1,g0,t0,(0,Ws,m1 nolist " Makefiles: tabs are mandatory autocmd FileType make setlocal noexpandtab tabstop=8 shiftwidth=8 " Assembly: kernel asm style autocmd FileType asm,s \ setlocal tabstop=8 shiftwidth=8 noexpandtab nolist " Kconfig / Kbuild autocmd BufRead,BufNewFile Kconfig*,Kbuild* \ setlocal filetype=kconfig noexpandtab tabstop=8 " Patch/diff: never touch whitespace autocmd FileType diff,patch setlocal nolist " Python: PEP8 (scripts/tooling) autocmd FileType python \ setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab textwidth=79 " Highlight TODO/FIXME/HACK/BUG/XXX/NOTE in all files autocmd Syntax * \ call matchadd('Todo', '\v\c<(TODO|FIXME|HACK|BUG|XXX|NOTE|WARN|WARNING)>') augroup END " ---------------------------------------------------------- " Statusline (no plugins) " ---------------------------------------------------------- set statusline= set statusline+=%#PmenuSel# set statusline+=\ %f\ set statusline+=%#LineNr# set statusline+=\ %m%r%h%w\ set statusline+=%= set statusline+=\ %{&filetype}\ set statusline+=\ %{&fileencoding?&fileencoding:&encoding}\ set statusline+=\ %{&fileformat}\ set statusline+=\ %l:%c\ set statusline+=\ %p%%\ " ========================================================== " Embedded colorscheme: sysdev_black " Self-contained — no external files needed " ========================================================== if &t_Co>=256 highlight clear if exists("syntax_on") syntax reset endif let g:colors_name="sysdev_black" set background=dark " Base hi Normal ctermfg=252 ctermbg=NONE hi Comment ctermfg=244 hi Constant ctermfg=173 hi String ctermfg=150 hi Identifier ctermfg=81 hi Function ctermfg=110 hi Statement ctermfg=161 hi Type ctermfg=149 hi PreProc ctermfg=179 hi Special ctermfg=215 hi Operator ctermfg=252 " Selection / search hi Visual ctermbg=238 hi Search ctermfg=16 ctermbg=220 hi IncSearch ctermfg=16 ctermbg=214 " Diff hi DiffAdd ctermfg=150 ctermbg=22 hi DiffDelete ctermfg=203 ctermbg=52 hi DiffChange ctermfg=110 ctermbg=17 hi DiffText ctermfg=255 ctermbg=24 cterm=bold " UI chrome hi LineNr ctermfg=240 hi CursorLineNr ctermfg=220 hi CursorLine ctermbg=236 cterm=NONE hi ColorColumn ctermbg=235 hi SignColumn ctermfg=240 ctermbg=NONE hi VertSplit ctermfg=238 ctermbg=NONE hi StatusLine ctermfg=252 ctermbg=238 cterm=NONE hi StatusLineNC ctermfg=240 ctermbg=234 cterm=NONE hi Folded ctermfg=244 ctermbg=234 hi MatchParen ctermfg=220 ctermbg=NONE cterm=bold,underline " Completion menu hi Pmenu ctermfg=252 ctermbg=236 hi PmenuSel ctermfg=16 ctermbg=220 hi PmenuSbar ctermbg=238 hi PmenuThumb ctermbg=244 " Errors / warnings / todos hi Error ctermfg=255 ctermbg=160 cterm=bold hi ErrorMsg ctermfg=255 ctermbg=160 hi WarningMsg ctermfg=214 hi Todo ctermfg=16 ctermbg=220 cterm=bold endif