Dotfiles, utilities, and other apparatus.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

327 lines
9.7 KiB

" minimal version of vimrc from https://code.p1k3.com/gitea/brennen/bpb-kit
" initial setup {{{
set nocompatible
" Temporarily disable modelines (like the one at the top of this file), per:
" https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md
" TODO: Patch and/or look at securemodelines plugin
set nomodeline
" use comma for the leader key - this is used as a prefix for
" a bunch of bindings, mostly in the keybindings section. it's up
" here for things that might require it before plugins are invoked,
" such as vimwiki mappings.
let mapleader = ","
filetype plugin on
filetype indent on
" }}}
" misc UI {{{
" set the window title (usually to filename plus some metadata)
set title
" pretty colors
set t_Co=256
syntax on
" pretty characters
set encoding=utf-8
" do not beep or flash at me
" vb is needed to stop beep
" t_vb sets visual bell action, we're nulling it out here
" note also that this may need to be repeated in .gvimrc
set visualbell
set t_vb=
" enable mouse for (a)ll, (n)ormal, (v)isual, (i)nsert, or (c)ommand line
" mode - seems to work in most terminals
set mouse=a
" render a useful popup menu for right-click instead of extending
" selection (good for spellchecking, etc.):
set mousemodel=popup_setpos
" let me delete stuff like crazy in insert mode
set backspace=indent,eol,start
" see :help virtualedit - you probably don't want this
" set virtualedit=onemore
" display commands as-typed + current position in file
set showcmd
set ruler
" height of command line area - having it greater than one avoids
" some hit-enter prompts
set cmdheight=2
" display a visual menu for tab-completion of files
set wildmenu
" keep lots of command-line history - 10000 is currently the max value:
set history=10000
" search:
set incsearch
set ignorecase
set smartcase
set wrapscan
" for gvim. no toolbar, otherwise these are the defaults
" set guioptions=aegimrLt
" include '-' in words. counts for both movement commands and autocomplete.
" to test, try moving across and autocompleting for some-words-bunched-up
" this is an experiment - mainly i want to use inline dashes in identifiers
" in markdown documents, and so forth
set iskeyword+=-
" }}}
" file saving/loading/swap/backups {{{
" read (unchanged) buffers when they're modified on filesystem.
" this saves me a lot of time and agony because i switch git branches
" constantly, but it might not be what you want.
set autoread
" disable swapfiles (you may not want this (but you probably do)):
set noswapfile
" }}}
" whitespace {{{
" display tabs and trailing spaces:
set listchars=tab:⇾\ ,trail:·
set list
" display tab characters as 8 spaces, indent 2 spaces,
" always use spaces instead of tabs:
set tabstop=8
set shiftwidth=2
set softtabstop=2
set expandtab
set autoindent
" for c code, no tab expansion, turn off softtabstop
au FileType c setlocal noexpandtab
au FileType c setlocal shiftwidth=8
au FileType c setlocal softtabstop=0
" turn off tab expansion for Makefiles and calendar files:
au FileType make setlocal noexpandtab
au FileType calendar setlocal noexpandtab
" wrap entire words in markdown files
" http://stackoverflow.com/questions/19624105/how-can-i-make-vim-break-lines-only-on-whitespace
au FileType markdown setlocal wrap linebreak breakat&vim
" }}}
" keybindings {{{
" wait longer than the default (1000ms) for keycodes and mapped keys:
set timeoutlen=3000
" F8 inserts an ISO-8601 datestamp (mnemonic: eight rhymes with date)
" (used to open the options window; use :options for that)
map <F8> :r !date -I<CR>kJ
" ,F8 inserts a date with seconds precision
map <Leader><F8> :r !date -Is<CR>kJ
" ,td / ,tD do the same (mnemonic: toDay)
map <Leader>td :r !date -I<CR>kJ
map <Leader>tD :r !date -Is<CR>kJ
imap <F8> <Esc><F8>
" F9 toggles search highlighting and some other noise
map <F9> :call <SID>Crosshairs()<CR>
imap <F9> <Esc><F9>
" F11 i'm leaving unbound because of fullscreen shortcuts in various
" terminals and window managers
" in normal or insert mode, <F12> copies all in buffer
" in visual/select modes, it just yanks the selected bit
nmap <F12> :%y+<CR>
imap <F12> <Esc><F12>
vmap <F12> y+
" split lines under the cursor (modeled on, maybe, emacs?)
map K i<CR><Esc>g;
" visual select inner word
nmap <Leader>v viW
" jump to next, previous errors
nmap <Leader>n :cnext<CR>
nmap <Leader>p :cprev<CR>
" reformat a paragraph
nmap <Leader>q gqip
map Q gq
" tab navigation somewhat like firefox
" http://vim.wikia.com/wiki/Alternative_tab_navigation
nmap <C-S-Tab> :tabprevious<CR>
nmap <C-Tab> :tabnext<CR>
map <C-S-Tab> :tabprevious<CR>
map <C-Tab> :tabnext<CR>
imap <C-S-Tab> <Esc>:tabprevious<CR>i
imap <C-Tab> <Esc>:tabnext<CR>i
" new tab:
nmap <Leader>tn :tabnew<CR>
" run timeslice script for current file:
nmap <Leader>ts :call TimesliceForFile()<CR>
" split window navigation (ctrl-j/k, alt-arrows)
map <C-J> <C-W>j<C-W>_
map <M-Down> <C-W>j
map <C-K> <C-W>k<C-W>_
map <M-Up> <C-W>k
map <M-Right> <C-W>l
map <M-Left> <C-W>h
" }}}
" functions {{{
" run the file through a custom filter, leaving the cursor at its original
" location in the file (or close) - there might be a better way to do this,
" but i don't know what it is
function! s:RunFilter(filter)
let l:currentline = line('.')
execute ":%!" . a:filter
execute ":" . l:currentline
endfunction
" do some normal-mode commands and return the cursor to its previous location
function! s:ExecNormalAndReturnCursor(commands)
let l:currentline = line('.')
" see http://learnvimscriptthehardway.stevelosh.com/chapters/30.html
execute "normal! " . a:commands
execute ":" . l:currentline
endfunction
" add some display sugar that helps highlight cursor, searches, and
" textwidth. good for fiddling with alignment, reflowing text, etc.
function! s:Crosshairs()
set invhlsearch
set invcursorcolumn
set invcursorline
" toggle a colorcolumn - will get weird if it's set outside this function
if &colorcolumn == "+1"
set colorcolumn=0
else
" i think this is relative to textwidth
set colorcolumn=+1
endif
endfunction
" cycle between no, absolute, and relative line numbers
function! s:CycleLineNumbers()
if (&number)
set nonumber
return
endif
if (&relativenumber)
set number norelativenumber
else
set number relativenumber
endif
endfunction
" this is pretty much horked from:
" http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window
function! s:CommandOutputInNewWindow(cmdline)
echo a:cmdline
let expanded_cmdline = a:cmdline
for part in split(a:cmdline, ' ')
if part[0] =~ '\v[%#<]'
let expanded_part = fnameescape(expand(part))
let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '')
endif
endfor
botright new
setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
" uncomment calls here for debug info:
" call setline(1, 'Command: ' . a:cmdline)
" call setline(2, 'Expanded: ' . expanded_cmdline)
" display underline with = to length of previous line (pretty clever):
" call setline(3, substitute(getline(2), '.', '=', 'g'))
execute '$read !' . expanded_cmdline
0delete " delete blank first line - get rid of this if you need debug msgs
setlocal nomodifiable
" enable folding with a column:
setlocal foldenable
setlocal foldcolumn=3
1
endfunction
" tab drop (edit in existing or new tab) a file's real path, in case it is a
" symlink - useful for, frex, symlinked .vimrc. does wildcard expansion on
" the path. as usual, there are probably better ways to do all of this.
function! s:TabDrop(path)
let realpath = system('readlink -fn ' . shellescape(expand(a:path)))
echom realpath
execute 'tab drop ' . realpath
endfunction
" this is ridiculous
" https://vi.stackexchange.com/questions/21825/how-to-insert-text-from-a-variable-at-current-cursor-position
function! s:AppendAtCursor(string)
execute "normal! a\<C-r>\<C-r>=a:string\<CR>\<Space>\<Esc>"
endfunc
function! s:AppendAtCursorAsVimwikiLink(string)
let bracketed = '[[/' . a:string . ']]'
call <SID>AppendAtCursor(bracketed)
endfunc
" }}}
" folding {{{
" turn off folding by default - i constantly open some file and have to
" expand folds to see what's going on; this is easy to get back with zi
set nofoldenable
" use {{{ and }}} to denote a folded section (these can be adjusted by
" setting foldmarker, but i'm sticking with the vim defaults):
set foldmethod=marker
" for custom foldline colors:
" highlight Folded guibg=grey guifg=blue
highlight FoldColumn ctermbg=darkgrey ctermfg=white guibg=darkgrey guifg=white
" forked from: http://dhruvasagar.com/2013/03/28/vim-better-foldtext
function! BPB_NeatFoldText()
let line = ' ' . substitute(getline(v:foldstart), '^\s*"\?\s*\|\s*"\?\s*{{' . '{\d*\s*', '', 'g') . ' '
let lines_count = v:foldend - v:foldstart + 1
let lines_count_text = '| ' . printf("%10s", lines_count . ' lines') . ' |'
let foldchar = matchstr(&fillchars, 'fold:\zs.')
let foldtextstart = strpart('+' . repeat(foldchar, v:foldlevel*2) . line, 0, (winwidth(0)*2)/3)
let foldtextend = lines_count_text . repeat(foldchar, 8)
let foldtextlength = strlen(substitute(foldtextstart . foldtextend, '.', 'x', 'g')) + &foldcolumn
return foldtextstart . repeat(foldchar, winwidth(0)-foldtextlength) . foldtextend
endfunction
set foldtext=BPB_NeatFoldText()
" }}}