Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
1440 lines (1232 sloc) 48.8 KB
" Windows Registry Editor Version 5.00
" [HKEY_CLASSES_ROOT\*\shell\Edit with Vim]
" [HKEY_CLASSES_ROOT\*\shell\Edit with Vim\command]
" @="nvim-qt.exe \"%L\""
let g:loaded_rrhelper = 1
let g:did_install_default_menus = 1 " avoid stupid menu.vim (saves ~100ms)
let s:plugins = filereadable(expand("~/.config/nvim/autoload/plug.vim", 1))
let s:plugins_extra = s:plugins
if !s:plugins "{{{
fun! InstallPlug() "bootstrap plug.vim on new systems
silent call mkdir(expand("~/.config/nvim/autoload", 1), 'p')
exe '!curl -fLo '.expand("~/.config/nvim/autoload/plug.vim", 1)
\ .''
call plug#begin('~/.local/share/nvim/bundle')
if v:false " Bring the circus to town!
" Plug 'terryma/vim-multiple-cursors'
Plug 'vim-airline/vim-airline'
" Plug 'lfv89/vim-interestingwords'
Plug 'majutsushi/tagbar'
Plug 'justinmk/molokai'
Plug 'mptre/vim-printf'
" git clone
" dasht-docsets-install python
Plug 'sunaku/vim-dasht'
nnoremap <silent> gK :call Dasht([expand('<cword>'), expand('<cWORD>')])<CR>
Plug 'sbdchd/neoformat'
if has('nvim')
Plug 'justinmk/vim-highlightedyank'
if v:version > 703 && !has('win32') && !has('win32unix')
Plug 'ludovicchabant/vim-gutentags'
let g:gutentags_ctags_exclude = [
Plug 'tommcdo/vim-exchange'
Plug ''
Plug ''
Plug ''
" Disable netrw, but autoload it for `gx`.
let g:loaded_netrwPlugin = 0
nmap gx <Plug>NetrwBrowseX
nnoremap <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(expand((exists("g:netrw_gx")? g:netrw_gx : '<cfile>')),netrw#CheckIfRemote())<CR>
Plug ''
let g:sneak#label = 1
let g:sneak#use_ic_scs = 1
let g:sneak#absolute_dir = 1
map f <Plug>Sneak_f
map F <Plug>Sneak_F
map t <Plug>Sneak_t
map T <Plug>Sneak_T
map <M-;> <Plug>Sneak_,
if executable("tmux")
Plug 'wellle/tmux-complete.vim'
Plug 'tpope/vim-characterize'
" Plug 'tpope/vim-sleuth'
Plug 'tpope/vim-scriptease'
Plug 'tpope/vim-apathy'
Plug 'zhaocai/DirDiff.vim', { 'on': ['DirDiff'] }
Plug 'tpope/vim-fugitive'
Plug 'junegunn/gv.vim'
Plug 'tpope/vim-rhubarb'
Plug 'tpope/vim-surround'
let g:surround_indent = 0
let g:surround_no_insert_mappings = 1
Plug 'tpope/vim-dispatch'
nnoremap mT mT:FocusDispatch NVIM_LISTEN_ADDRESS= VIMRUNTIME= TEST_FILE=<c-r>% TEST_FILTER= TEST_TAG= make functionaltest<S-Left><S-Left><Left>
" nnoremap <silent> yr :<c-u>set opfunc=<sid>tmux_run_operator<cr>g@
" xnoremap <silent> R :<c-u>call <sid>tmux_run_operator(visualmode(), 1)<CR>
Plug 'tpope/vim-repeat'
Plug 'tpope/vim-eunuch'
Plug 'tpope/vim-rsi'
Plug 'tpope/vim-unimpaired'
nmap co yo
Plug 'tpope/vim-endwise'
inoremap (<CR> (<CR>)<Esc>O
inoremap {<CR> {<CR>}<Esc>O
inoremap {; {<CR>};<Esc>O
inoremap {, {<CR>},<Esc>O
inoremap [<CR> [<CR>]<Esc>O
inoremap ([[ ([[<CR>]])<Esc>O
inoremap ([=[ ([=[<CR>]=])<Esc>O
inoremap [; [<CR>];<Esc>O
inoremap [, [<CR>],<Esc>O
Plug 'tpope/vim-obsession'
let g:obsession_no_bufenter = 1 "
let g:markdown_syntax_conceal = 0
Plug 'AndrewRadev/linediff.vim'
let g:linediff_buffer_type = 'scratch'
Plug 'mbbill/undotree', { 'on': ['UndotreeToggle'] }
Plug 'tpope/vim-commentary'
if s:plugins_extra
Plug 'guns/vim-sexp'
Plug 'guns/vim-clojure-highlight'
let g:clojure_fold = 1
let g:sexp_filetypes = ''
Plug 'tpope/vim-salve'
let g:salve_auto_start_repl = 1
Plug 'tpope/vim-fireplace'
Plug 'justinmk/nvim-repl'
nmap yx <Plug>(ReplSend)
nmap yxx <Plug>(ReplSendLine)
xmap <Enter> <Plug>(ReplSend)
nnoremap <c-q> :Repl<CR>
Plug 'PProvost/vim-ps1'
Plug 'chrisbra/Colorizer', { 'on': ['ColorHighlight'] }
Plug 'tommcdo/vim-lion'
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes n \| ./install' }
Plug 'junegunn/fzf.vim'
let g:fzf_command_prefix = 'Fz'
Plug 'tpope/vim-dadbod'
Plug 'tpope/vim-projectionist'
" look at derekwyatt/vim-fswitch for more C combos.
if has("nvim") && exists('*luaeval')
lua << EOF
vim.api.nvim_set_var('projectionist_heuristics', {
['*.sln'] = {
['*.cs'] = {['alternate'] = {'{}.designer.cs'}},
['*.designer.cs'] = {['alternate'] = {'{}.cs'}},
['/*.c|src/*.c'] = {
['*.c'] = {['alternate'] = {'../include/{}.h', '{}.h'}},
['*.h'] = {['alternate'] = '{}.c'},
['Makefile'] = {
['*Makefile'] = {['alternate'] = '{dirname}CMakeLists.txt'},
['*CMakeLists.txt'] = {['alternate'] = '{dirname}Makefile'},
" Plug 'Valloric/MatchTagAlways', { 'for': 'xml' }
call plug#end()
" Eager-load these plugins so we can override their settings. {{{
runtime! plugin/rsi.vim
runtime! plugin/commentary.vim
" }}}
endif "}}}
" Searches process tree for a process name. Limited breadth/depth.
fun! s:find_proc_in_tree(rootpid, name, accum) abort
if a:accum > 9 || !exists('*nvim_get_proc')
return v:false
let p = nvim_get_proc(a:rootpid)
if !empty(p) && ==# a:name
return v:true
for c in nvim_get_proc_children(a:rootpid)[:9]
if s:find_proc_in_tree(c, a:name, 1 + a:accum)
return v:true
return v:false
if has("nvim")
set inccommand=split
"tnoremap <expr> <C-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'
tnoremap <silent><expr> <esc> <SID>find_proc_in_tree(b:terminal_job_pid, 'nvim', 0) ? '<esc>' : '<c-\><c-n>'
augroup vimrc_nvim
" autocmd CursorHold,FocusGained,FocusLost * silent! rshada|silent! wshada
" :checktime is SLOW
" autocmd CursorHold,FocusGained * silent! checktime
autocmd FocusGained * call <SID>halo()
augroup END
" Experimental
set fillchars+=msgsep:─
hi MsgSeparator ctermbg=black ctermfg=white
" Use <C-L> to:
" - redraw
" - clear 'hlsearch'
" - update the current diff (if any)
" Use {count}<C-L> to:
" - reload (:edit) the current buffer
nnoremap <silent><expr> <C-L> (v:count ? ':<C-U>:call <SID>save_change_marks()\|edit\|call <SID>restore_change_marks()<CR>' : '')
\ . ':nohlsearch'.(has('diff')?'\|diffupdate':'')
\ . '<CR><C-L>'
inoremap <C-U> <C-G>u<C-U>
function! s:ctrl_u() abort "{{{ rsi ctrl-u, ctrl-w
if getcmdpos() > 1
let @- = getcmdline()[:getcmdpos()-2]
return "\<C-U>"
function! s:ctrl_w_before() abort
let s:cmdline = getcmdpos() > 1 ? getcmdline() : ""
return "\<C-W>"
function! s:ctrl_w_after() abort
if strlen(s:cmdline) > 0
let @- = s:cmdline[(getcmdpos()-1) : (getcmdpos()-2)+(strlen(s:cmdline)-strlen(getcmdline()))]
return ""
cnoremap <expr> <C-U> <SID>ctrl_u()
cnoremap <expr> <SID>(ctrl_w_before) <SID>ctrl_w_before()
cnoremap <expr> <SID>(ctrl_w_after) <SID>ctrl_w_after()
cmap <script> <C-W> <SID>(ctrl_w_before)<SID>(ctrl_w_after)
cnoremap <C-Y> <C-R>-
command! Session if filereadable(expand("~/.vim/session.vim", 1)) | source ~/.vim/session.vim
\ | else | Obsession ~/.vim/session.vim | endif
set sessionoptions-=blank
" general settings / options
if has('nvim-0.2')
set cpoptions-=_
set guicursor+=n:blinkon175
" Don't mess with 'tabstop', with 'expandtab' it isn't used.
" Instead set softtabstop=-1, then 'shiftwidth' is used.
set expandtab shiftwidth=2 softtabstop=-1
" vim-vertical-move replacement
" credit: cherryberryterry:
function! s:vjump(dir) abort
let c = '%'.virtcol('.').'v'
let flags = a:dir ? 'bnW' : 'nW'
let bot = search('\v'.c.'.*\n^(.*'.c.'.)@!.*$', flags)
let top = search('\v^(.*'.c.'.)@!.*$\n.*\zs'.c, flags)
" norm! m`
return a:dir ? (line('.') - (bot > top ? bot : top)).'k'
\ : ((bot < top ? bot : top) - line('.')).'j'
nnoremap <expr> <C-j> <SID>vjump(0)
nnoremap <expr> <C-k> <SID>vjump(1)
xnoremap <expr> <C-j> <SID>vjump(0)
xnoremap <expr> <C-k> <SID>vjump(1)
onoremap <expr> <C-j> <SID>vjump(0)
onoremap <expr> <C-k> <SID>vjump(1)
let g:mapleader = "z,"
set undofile
set list
set fileformats=unix,dos
" [i, [d
set path+=/usr/lib/gcc/**/include
" neovim
set path+=build/src/nvim/auto/**,.deps/build/src/**/,src,src/nvim
" DWIM 'includeexpr': make gf work on filenames like "a/…" (in diffs, etc.).
set includeexpr=substitute(v:fname,'^[^\/]*/','','')
let g:sh_noisk = 1
set hidden " Allow buffer switching even if unsaved
set lazyredraw " no redraws in macros
set cmdheight=2
set ignorecase " case-insensitive searching
set smartcase " but become case-sensitive if you type uppercase characters
set foldopen-=search
set timeoutlen=3000
set noshowmode " Hide the mode text (e.g. -- INSERT --)
set foldlevelstart=99 "open all folds by default
set splitright
if has('patch-7.4.314') | set shortmess+=c | endif
nnoremap <silent> coz :<c-u>if &foldenable\|set nofoldenable\|
\ else\|setl foldmethod=indent foldnestmax=2 foldlevel=0 foldenable\|set foldmethod=manual\|endif<cr>
nnoremap cot :setlocal textwidth<C-R>=(&textwidth == 80) ? '<' : '=80'<CR><CR>
set nojoinspaces
set nostartofline
set cursorline
"colorscheme {{{
" Clear `Normal` cterm values, so terminal emulators won't treat negative
" space as extra whitespace (makes mouse-copy nicer).
hi Normal cterm=NONE ctermfg=NONE ctermbg=NONE guifg=white guibg=black
set background=dark
hi Cursor gui=NONE cterm=NONE guibg=#F92672 guifg=white ctermbg=197 ctermfg=white
hi SpecialKey ctermfg=241
hi! link NonText Comment
hi Whitespace ctermfg=darkgrey
hi Comment guifg=#7E8E91 ctermfg=244
hi! link Title Comment
hi! link Constant Normal
hi QuickFixLine guifg=black guibg=cyan ctermfg=black ctermbg=cyan
" Special should be (at least) slightly distinct from SpecialKey.
hi Special ctermfg=lightgrey guifg=lightgrey
" hi Special guifg=#F92672 gui=bold ctermfg=197 cterm=NONE
" cyan
hi Identifier ctermfg=cyan guifg=cyan
hi! link Statement Identifier
hi! link Exception Identifier
" affects:
" - NONE string in 'hi Normal ctermfg=NONE …'
" - helpHeader
hi! link PreProc Identifier
" hi Type ctermfg=NONE
hi! link Type Identifier
" hi String guifg=#FFE792 guibg=NONE gui=NONE ctermfg=222 ctermbg=NONE cterm=NONE
hi MoreMsg guifg=LightGreen guibg=NONE gui=NONE ctermfg=LightGreen ctermbg=NONE cterm=NONE
hi! link String MoreMsg
hi! link Question MoreMsg
hi Todo guifg=black guibg=lightgreen ctermfg=black ctermbg=lightgreen
" hi! link WildMenu Todo
hi WildMenu ctermbg=cyan ctermfg=black
" completion/popup menu
hi Pmenu guifg=#FFFFFF guibg=#585858 gui=NONE ctermfg=255 ctermbg=240 cterm=NONE
hi! link PmenuSel Todo
hi PmenuSbar guibg=darkgray ctermbg=darkgray
hi PmenuThumb ctermbg=lightgreen ctermfg=lightgreen
" tabline
" hi default link TabLineFill TabLine
hi! link TabLineFill TabLine
" diff (unified)
hi diffAdded guifg=#00ff5f gui=NONE ctermfg=47 cterm=NONE
hi diffRemoved guifg=#ff5f5f gui=NONE ctermfg=203 cterm=NONE
hi link diffSubname Normal
" diff (side-by-side)
hi DiffAdd guifg=#000000 guibg=#00ff5f ctermfg=0 ctermbg=47 gui=NONE cterm=NONE
hi DiffChange guifg=#FFFFFF guibg=#4C4745 ctermfg=255 ctermbg=239 gui=NONE cterm=NONE
hi DiffDelete guifg=#ff5f5f guibg=NONE ctermfg=203 ctermbg=NONE gui=NONE cterm=NONE
hi DiffText guifg=black guibg=cyan ctermfg=16 ctermbg=cyan gui=NONE cterm=NONE
"If 242 is too dark, keep incrementing...
hi FoldColumn guifg=#465457 guibg=#000000 ctermfg=242 ctermbg=16
hi Folded guifg=#465457 guibg=NONE ctermfg=242 ctermbg=NONE
hi Error guifg=#FFFFFF guibg=Red ctermfg=15 ctermbg=9
hi ErrorMsg ctermfg=203 ctermbg=NONE guifg=#ff5f5f guibg=#161821
hi Search guifg=#000000 guibg=#FFE792 ctermfg=0 ctermbg=222 cterm=NONE
hi! link IncSearch Todo
hi! link Substitute Visual
hi Visual gui=NONE cterm=NONE guifg=black guibg=white ctermfg=black ctermbg=white
hi StatusLine cterm=bold,reverse gui=bold,reverse
hi StatusLineNC guifg=bg guibg=darkgrey ctermfg=NONE ctermbg=NONE cterm=underline gui=NONE
hi VertSplit guifg=#808080 guibg=#080808 gui=bold ctermfg=244 ctermbg=232 cterm=bold
hi! link Directory Identifier
hi CursorLine guibg=#303030 ctermbg=236 cterm=NONE
hi! link LineNr CursorLine
hi! link SignColumn StatusLineNC
hi! link CursorLineNr Normal
hi SpellBad ctermbg=red ctermfg=255 cterm=undercurl gui=undercurl guisp=Red
hi SpellCap ctermbg=lightgrey ctermfg=red cterm=undercurl gui=undercurl guisp=Blue
hi! link SpellRare SpellCap
hi Underlined ctermfg=NONE cterm=underline gui=underline guifg=NONE
" other
hi helpHyperTextJump cterm=underline ctermfg=cyan
hi MatchParen ctermfg=black ctermbg=white guifg=black guibg=white
" text, tab and indent
set formatoptions+=rno1l
" don't syntax-highlight long lines
set synmaxcol=200
set linebreak
set nowrap
" =============================================================================
" normal mode
nnoremap & n:&&<CR>
xnoremap & n:&&<CR>
" Make Y consistent with C and D.
nnoremap Y y$
" copy selection to gui-clipboard
xnoremap Y "+y
" copy entire file contents (to gui-clipboard if available)
nnoremap yY :let b:winview=winsaveview()<bar>exe 'keepjumps keepmarks norm ggVG'.(has('clipboard')?'"+y':'y')<bar>call winrestview(b:winview)<cr>
inoremap <insert> <C-r>+
" delete the 'head' of a path on the command line
cnoremap <silent> <c-x> <C-\>e<sid>delete_until()<cr>
func! s:delete_until() abort
let c = nr2char(getchar())
return substitute(getcmdline(), '\(.*['.escape(c, '\').']\).*', '\1', '')
" key mappings/bindings =================================================== {{{
nnoremap z= :setlocal spell<CR>z=
nnoremap ' `
inoremap <C-space> <C-x><C-o>
" niceblock
xnoremap <expr> I (mode()=~#'[vV]'?'<C-v>^o^I':'I')
xnoremap <expr> A (mode()=~#'[vV]'?'<C-v>0o$A':'A')
nnoremap g> :set nomore<bar>40messages<bar>set more<CR>
xnoremap g/ <Esc>/\%V
" inverse-search: line NOT containing pattern
nnoremap g? /\v^(()@!.)*$<Left><Left><Left><Left><Left><Left><Left>
" word-wise i_CTRL-Y
inoremap <expr> <c-y> pumvisible() ? "\<c-y>" : matchstr(getline(line('.')-1), '\%' . virtcol('.') . 'v\%(\k\+\\|.\)')
" current-file directory
noremap! <silent> <c-r><c-\> <c-r>=expand('%:p:h', 1)<cr>
noremap! <c-r>? <c-r>=substitute(getreg('/'), '[<>\\]', '', 'g')<cr>
" mark position before search
nnoremap / ms/
func! s:maybe_zz(cmd,halo) abort
let topline = line('w0')
exe a:cmd
catch /E486:/
echohl ErrorMsg | echom matchstr(v:exception, 'E486:.*') | echohl None
if topline != line('w0')
normal! zz
if a:halo
call s:halo()
nnoremap <silent> n :<C-U>call <SID>maybe_zz('norm! '.v:count1.'Nn'[v:searchforward],1)<CR>
nnoremap <silent> N :<C-U>call <SID>maybe_zz('norm! '.v:count1.'nN'[v:searchforward],1)<CR>
" manage windows
" [count]<c-w>s and [count]<c-w>v create a [count]-sized split
" [count]<c-w>| and [count]<c-w>_ resize the current window
" user recommendation:
" <c-w>eip
" available:
" <c-w><space>{motion}
nnoremap <silent><M-h> <C-\><C-N><C-w><C-h>
nnoremap <silent><M-j> <C-\><C-N><C-w><C-j>
nnoremap <silent><M-k> <C-\><C-N><C-w><C-k>
nnoremap <silent><M-l> <C-\><C-N><C-w><C-l>
inoremap <silent><M-h> <C-\><C-N><C-w><C-h>
inoremap <silent><M-j> <C-\><C-N><C-w><C-j>
inoremap <silent><M-k> <C-\><C-N><C-w><C-k>
inoremap <silent><M-l> <C-\><C-N><C-w><C-l>
tnoremap <silent><M-h> <C-\><C-N><C-w><C-h>
tnoremap <silent><M-j> <C-\><C-N><C-w><C-j>
tnoremap <silent><M-k> <C-\><C-N><C-w><C-k>
tnoremap <silent><M-l> <C-\><C-N><C-w><C-l>
nnoremap Zh :leftabove vsplit<CR>
nnoremap Zj :belowright split<CR>
nnoremap Zk :aboveleft split<CR>
nnoremap Zl :rightbelow vsplit<CR>
nmap ZH Zh
nmap ZJ Zj
nmap ZK Zk
nmap ZL Zl
nnoremap <M-n> :call <SID>buf_new()<CR>
nnoremap <silent><expr> <tab> (v:count > 0 ? '<C-w>w' : ':call <SID>switch_to_alt_win()<CR>')
nnoremap <silent> <s-tab> <C-^>
nnoremap <m-i> <c-i>
" inoremap <c-r><c-w> <esc>:call <sid>switch_to_alt_win()<bar>let g:prev_win_buf=@%<cr><c-w><c-p>gi<c-r>=g:prev_win_buf<cr>
" nnoremap y@% :<c-u>let @"=@%<cr>
func! s:win_motion_resize(type) abort
let sel_save = &selection
let &selection = "inclusive"
if a:type ==# 'line' || line("']") > line("'[")
exe (line("']") - line("'[") + 1) 'wincmd _'
norm! `[zt
if a:type !=# 'line'
"TODO: this assumes sign column is visible.
exe ( col("']") - col("'[") + 3) 'wincmd |'
let &selection = sel_save
" fit the current window height to the selected text
xnoremap <silent> <c-w><c-w> :<C-u>set winfixwidth winfixheight opfunc=<sid>win_motion_resize<CR>gvg@
" go to the previous window (or any other window if there is no 'previous' window).
func! s:switch_to_alt_win() abort
let currwin = winnr()
wincmd p
if winnr() == currwin "window didn't change; no previous window.
wincmd w
func! s:get_alt_winnr() abort
call s:switch_to_alt_win()
let n = winnr()
call s:switch_to_alt_win()
return n
" manage tabs
nnoremap <silent> <M-t> :tab split<cr>
nnoremap <silent> ZT :tabclose<cr>
" move tab to Nth position
nnoremap <expr> <M-L> ':<C-u>tabmove '.(v:count ? (v:count - 1) : '+1').'<CR>'
nnoremap <expr> <M-H> ':<C-u>tabmove '.(v:count ? (v:count - 1) : '-1').'<CR>'
" manage buffers
nnoremap <expr><silent> ZB ':<c-u>call <SID>buf_kill('. !v:count .')<cr>'
" quickfix window (in quickfix: toggles between qf & loc list)
nnoremap <silent><expr> <M-q> '@_:'.(&bt!=#'quickfix'<bar><bar>!empty(getloclist(0))?'lclose<bar>botright copen':'cclose<bar>botright lopen').'<CR>'
nnoremap <expr> zt (v:count > 0 ? '@_zt'.v:count.'<c-y>' : 'zt')
nnoremap <expr> zb (v:count > 0 ? '@_zb'.v:count.'<c-e>' : 'zb')
" set working directory to the current buffer's directory
nnoremap cd :lcd %:p:h<bar>pwd<cr>
nnoremap cu :lcd ..<bar>pwd<cr>
if findfile('plugin/fugitive.vim', &rtp) !=# ''
func! s:ctrl_g(cnt) abort
redir => msg | silent exe "norm! 1\<c-g>" | redir END
" Show git branch.
echo fugitive#head(7) msg[2:] (a:cnt?strftime('%Y-%m-%d %H:%M',getftime(expand('%:p'))):'')
" Show current directory.
echo 'dir:' fnamemodify(getcwd(), ':~')
" Show current session.
echo 'ses:' (strlen(v:this_session) ? fnamemodify(v:this_session, ':~') : '<none>')
" Show current context.
echohl ModeMsg
echo getline(search('\v^[[:alpha:]$_]', 'bn', 1, 100))
echohl None
nnoremap <C-g> :<c-u>call <sid>ctrl_g(v:count)<cr>
nnoremap <silent> <C-n> :<C-U>call <SID>maybe_zz(&diff ? 'norm ]c]n' : 'norm ]n',1)<CR>
nnoremap <silent> <C-p> :<C-U>call <SID>maybe_zz(&diff ? 'norm [c[n' : 'norm [n',1)<CR>
" version control
xnoremap <expr> D (mode() ==# "V" ? ':Linediff<cr>' : 'D')
nnoremap <silent> Ub :Gblame<cr>
nnoremap <silent> Ud :<C-U>if &diff<bar>diffupdate<bar>elseif !v:count && empty(<SID>git_do('diff -- '.shellescape(fugitive#buffer().path())))<bar>echo 'no changes'<bar>else<bar>exe 'Gvdiff'.(v:count ? ' HEAD'.repeat('^', v:count) : '')<bar>call feedkeys('<c-v><c-l>')<bar>endif<cr>
"\:call feedkeys("\<lt>C-w>\<lt>C-w>gg]c")<CR>
nnoremap <silent> Ue :exe 'Gedit\|'.line('.')<cr>zz
nnoremap Uf :Gcommit --fixup=
nnoremap <silent> Ug :Gedit <C-R><C-W><cr>
nnoremap <silent> Ul :GV!<cr>
nnoremap Um :GV -L :<C-r><C-w>:<C-r>%
nmap <silent> Up :<c-u>call <sid>git_blame_line('<C-R><C-G>', line('.'))<CR>
" ^ Get repo-relative path via fugitive
nnoremap <silent> Ur :Gread<cr>
nnoremap <silent> Us :Gstatus<cr>
nnoremap <silent> Uw :if !exists(":Gwrite")<bar>call fugitive#detect(expand('%:p'))<bar>endif<bar>Gwrite<cr>
nmap UB Ub
nmap UD Ud
nmap UE Ue
nmap UF Uf
nmap UG Ug
nmap UL Ul
nmap UM Um
nmap UP Up
nmap UR Ur
nmap US Us
nmap UW Uw
"linewise partial staging in visual-mode.
xnoremap <c-p> :diffput<cr>
xnoremap <c-o> :diffget<cr>
nnoremap <expr> dp &diff ? 'dp' : ':Printf<cr>'
" Executes git cmd in the context of b:git_dir.
function! s:git_do(cmd) abort
" git 1.8.5: -C is a (more reliable) alternative to --git-dir/--work-tree.
return systemlist('git -C '.shellescape(fnamemodify(b:git_dir, ':p:h:h'))
\ . ' ' . a:cmd)
" Gets the git commit hash associated with the given file line.
function! s:git_sha(filepath, line) abort
if '' ==# s:trimws_ml(a:filepath)
throw 'invalid (empty) filepath'
elseif !exists("b:git_dir")
throw 'Missing b:git_dir'
elseif a:line <= 0
throw 'Invalid a:line: '.a:line
let cmd_out = join(s:git_do('blame --root -l -L'.a:line.','.a:line.' -- '.a:filepath))
if cmd_out =~# '\v^0{40,}'
return ''
return matchstr(cmd_out, '\w\+\ze\W\?', 0, 1)
function! s:git_blame_line(filepath, line) abort
if '' ==# s:trimws_ml(a:filepath)
echo 'cannot blame'
if 'blob' ==# get(b:,'fugitive_type','')
" Use fugitive blame in fugitive buffers, instead of git directly.
let commit_id = substitute(execute('.Gblame'), '\v\_s*(\S+)\s+.*', '\1', '')
" Use git directly.
let commit_id = s:git_sha(a:filepath, a:line)
if commit_id ==# ''
echo 'not committed'
elseif commit_id ==# 'fatal'
echo 'cannot blame'
" Find commit(s) with 0 parents.
" Note: `git blame` prepends a caret ^ to root commits unless --root is
" passed. But it doesn't always mark the 'root' commits we are
" interested in, so collect them explicitly with `git rev-list`.
let b:git_root_commits = get(b:, 'git_root_commits', s:git_do('rev-list --max-parents=0 HEAD'))
if -1 != index(b:git_root_commits, commit_id)
echo 'root commit'
exe 'Gpedit '.commit_id
" :help :DiffOrig
command! DiffOrig leftabove vnew | set bt=nofile | r ++edit # | 0d_ | diffthis | wincmd p | diffthis
nnoremap co<space> :set <C-R>=(&diffopt =~# 'iwhite') ? 'diffopt-=iwhite' : 'diffopt+=iwhite'<CR><CR>
" filter
nnoremap gqax :%!tidy -q -i -xml -utf8<cr>
nnoremap gqah :%!tidy -q -i -ashtml -utf8<cr>
nnoremap gqaj :%!python -m json.tool<cr>
" available mappings:
" visual: c-\ <space> m R c-r c-n c-g c-a c-x c-h,<bs><tab>
" insert: c-\ c-g
" normal: gy c-f c-t c-b c-j c-k + _ c-\ g= zu z/ m<enter> zy zi zp m<tab> q<special> y<special> q<special>
" c<space>
" !@ --> async run
func! s:compare_numbers(n1, n2) abort
return a:n1 == a:n2 ? 0 : a:n1 > a:n2 ? 1 : -1
func! s:compare_bufs(b1, b2) abort
let b1_visible = index(tabpagebuflist(), a:b1) >= 0
let b2_visible = index(tabpagebuflist(), a:b2) >= 0
" - sort by buffer number (descending)
" - prefer loaded, NON-visible buffers
if bufloaded(a:b1)
if bufloaded(a:b2)
if b1_visible == b2_visible
return s:compare_numbers(a:b1, a:b2)
return s:compare_numbers(b2_visible, b1_visible)
return 1
return !bufloaded(a:b2) ? s:compare_numbers(a:b1, a:b2) : 1
func! s:buf_find_displayed_bufs() abort " find all buffers displayed in any window, any tab.
let bufs = []
for i in range(1, tabpagenr('$'))
call extend(bufs, tabpagebuflist(i))
return bufs
func! s:buf_is_valid(bnr) abort
" Exclude:
" - current
" - unlisted
" - buffers marked as 'readonly' AND 'modified' (netrw brain-damage)
" Include: normal buffers; 'help' buffers
return buflisted(a:bnr)
\ && ("" ==# getbufvar(a:bnr, "&buftype") || "help" ==# getbufvar(a:bnr, "&buftype"))
\ && a:bnr != bufnr("%")
\ && -1 == index(tabpagebuflist(), a:bnr)
\ && !(getbufvar(a:bnr, "&modified") && getbufvar(a:bnr, "&readonly"))
" Gets the first empty, unchanged buffer not in the current tabpage.
func! s:buf_find_unused() abort
for i in range(1, bufnr('$'))
if bufexists(i)
\&& -1 == index(tabpagebuflist(), i)
\&& nvim_buf_get_changedtick(i) <= 2
\&& buflisted(i)
\&& bufname(i) ==# ''
\&& getbufvar(i, '&buftype') ==# ''
return i
return 0
" Switches to a new (empty, unchanged) buffer or creates a new one.
func! s:buf_new() abort
let newbuf = s:buf_find_unused()
if newbuf == 0
exe 'buffer' newbuf
func! s:buf_find_valid_next_bufs() abort
let validbufs = filter(range(1, bufnr('$')), '<SID>buf_is_valid(v:val)')
call sort(validbufs, '<SID>compare_bufs')
return validbufs
func! s:buf_switch_to_altbuff() abort
" change to alternate buffer if it is not the current buffer (yes, that can happen)
if -1 != bufnr("#") && bufnr("#") != bufnr("%")
buffer #
return 1
" change to newest valid buffer
let lastbnr = bufnr('$')
if s:buf_is_valid(lastbnr)
exe 'buffer '.lastbnr
return 1
" change to any valid buffer
let validbufs = s:buf_find_valid_next_bufs()
if len(validbufs) > 0
exe 'buffer '.validbufs[0]
return 1
return 0
" close the current buffer with a vengeance
" BDSN: Buffer DiScipliNe
func! s:buf_kill(mercy) abort
let origbuf = bufnr("%")
let origbufname = bufname(origbuf)
if a:mercy && &modified
echom 'buffer has unsaved changes (use "[count]ZB" to discard changes)'
if !s:buf_switch_to_altbuff()
"No alternate buffer found; create a new, blank buffer.
"Note: :bd will still close any window displaying the buffer. To prevent
" that the windows would each need to be switched to another buffer.
" remove the buffer filename (if any) from the args list, else it might come back in the next session.
if !empty(origbufname)
silent! exe 'argdelete '.origbufname
" obliterate the buffer and all of its related state (marks, local options, ...),
if bufexists(origbuf) "some other mechanism may have deleted the buffer already.
exe 'bwipeout! '.origbuf
nnoremap <m-cr> -
xnoremap <m-cr> -
onoremap <m-cr> -
" un-join (split) the current line at the cursor position
nnoremap gj i<c-j><esc>k$
" vaporize delete without overwriting the default register
nnoremap vd "_d
xnoremap x "_d
nnoremap vD "_D
xnoremap P "0p
nnoremap vK <C-\><C-N>:help <C-R><C-W><CR>
func! s:trimws_ml(s) abort "trim whitespace across multiple lines
return substitute(a:s, '^\_s*\(.\{-}\)\_s*$', '\1', '')
" - repeatable
" - faster/more convenient than visual-replace
" - does not modify ' mark
" - DWIM behavior for linewise => characterwise
let s:rr_reg = '"'
func! s:set_reg(reg_name) abort
let s:rr_reg = a:reg_name
func! s:replace_without_yank(type) abort
let rr_orig = getreg(s:rr_reg, 1) "save registers and types to restore later.
let rr_type = getregtype(s:rr_reg)
let ur_orig = getreg('"', 1)
let ur_type = getregtype('"')
let sel_save = &selection
let &selection = "inclusive"
let replace_curlin = (1==col("'[") && (col('$')==1 || col('$')==(col("']")+1)) && line("'[")==line("']"))
if a:type ==? 'line' || replace_curlin
exe "keepjumps normal! '[V']\"".s:rr_reg."p"
elseif a:type ==? 'block'
exe "keepjumps normal! `[\<C-V>`]\"".s:rr_reg."p"
"DWIM: if pasting linewise contents in a _characterwise_ motion, trim
" surrounding whitespace from the content to be pasted.
if rr_type ==# "V"
call setreg(s:rr_reg, s:trimws_ml(rr_orig), "v")
exe "keepjumps normal! `[v`]\"".s:rr_reg."p"
let &selection = sel_save
call setreg('"', ur_orig, ur_type)
call setreg(s:rr_reg, rr_orig, rr_type)
nnoremap <silent> dr :<C-u>call <sid>set_reg(v:register)<bar>set opfunc=<sid>replace_without_yank<CR>g@
nnoremap <silent> drr :<C-u>call <sid>set_reg(v:register)<cr>0:<C-u>set opfunc=<sid>replace_without_yank<CR>g@$
" text-object: entire buffer
" Elegant text-object pattern hacked out of jdaddy.vim.
function! s:line_outer_movement(count) abort
if empty(getline(1)) && 1 == line('$')
return "\<Esc>"
let [lopen, copen, lclose, cclose] = [1, 1, line('$'), 1]
call setpos("'[", [0, lopen, copen, 0])
call setpos("']", [0, lclose, cclose, 0])
return "'[o']"
xnoremap <expr> al <SID>line_outer_movement(v:count1)
onoremap <silent> al :normal Val<CR>
" text-object: line
" Elegant text-object pattern hacked out of jdaddy.vim.
function! s:line_inner_movement(count) abort
"TODO: handle count
if empty(getline('.'))
return "\<Esc>"
let [lopen, copen, lclose, cclose] = [line('.'), 1, line('.'), col('$')-1]
call setpos("'[", [0, lopen, copen, 0])
call setpos("']", [0, lclose, cclose, 0])
return "`[o`]"
xnoremap <expr> il <SID>line_inner_movement(v:count1)
onoremap <silent> il :normal vil<CR>
" from tpope vimrc
inoremap <M-o> <C-O>o
inoremap <M-O> <C-O>O
inoremap <silent> <C-G><C-T> <C-R>=repeat(complete(col('.'),map(["%Y-%m-%d %H:%M:%S","%a, %d %b %Y %H:%M:%S %z","%Y %b %d","%d-%b-%y","%a %b %d %T %Z %Y"],'strftime(v:val)')+[localtime()]),0)<CR>
"do not clobber '[ '] on :write
function! s:save_change_marks() abort
let s:change_marks = [getpos("'["), getpos("']")]
function! s:restore_change_marks() abort
call setpos("'[", s:change_marks[0])
call setpos("']", s:change_marks[1])
nnoremap z. :call <SID>save_change_marks()<Bar>w<Bar>call <SID>restore_change_marks()<cr>
" select last inserted text
nnoremap gV `[v`]
" repeat last command for each line of a visual selection
xnoremap . :normal .<CR>
" XXX: fix this
" repeat the last edit on the next [count] matches.
nnoremap <silent> gn :normal n.<CR>:<C-U>call repeat#set("n.")<CR>
nnoremap <C-v>q q
" Replay @q or set it from v:register.
nnoremap <expr> <Space> (v:register==#'"')?'@q':(":let @q = '<C-R><C-R>".v:register."'<C-F>010l")
" Replay @q for each line of the visual selection.
xnoremap <Space> @q
nnoremap <expr> <c-w><c-q> (v:count ? ':<c-u>confirm qa<cr>' : '<c-w><c-q>')
nnoremap <expr> <c-w>q (v:count ? ':<c-u>confirm qa<cr>' : '<c-w><c-q>')
nnoremap <expr> ZZ (v:count ? ':<c-u>xa!<cr>' : '@_ZZ')
nnoremap <expr> ZQ (v:count ? ':<c-u>qa!<cr>' : '@_ZQ')
nnoremap <expr> <c-w>= (v:count ? ':<c-u>windo setlocal nowinfixheight nowinfixwidth<cr><c-w>=' : '@_<c-w>=')
func! s:zoom_toggle() abort
if 1 == winnr('$')
let restore_cmd = winrestcmd()
wincmd |
wincmd _
if exists('t:zoom_restore')
exe t:zoom_restore
unlet t:zoom_restore
let t:zoom_restore = restore_cmd
return '<Nop>'
func! s:zoom_or_goto_column(cnt) abort
if a:cnt
exe 'norm! '.v:count.'|'
call s:zoom_toggle()
nnoremap + :<C-U>call <SID>zoom_or_goto_column(v:count)<CR>
nnoremap <Bar> :<C-U>call <SID>zoom_or_goto_column(v:count)<CR>
func! ReadExCommandOutput(newbuf, cmd) abort
redir => l:message
silent! execute a:cmd
redir END
if a:newbuf | wincmd n | endif
silent put=l:message
command! -nargs=+ -bang -complete=command R call ReadExCommandOutput(<bang>0, <q-args>)
inoremap <c-r>R <c-o>:<up><home>R! <cr>
func! s:get_visual_selection_list() abort
let [lnum1, col1] = getpos("'<")[1:2]
let [lnum2, col2] = getpos("'>")[1:2]
let lines = getline(lnum1, lnum2)
let lines[-1] = lines[-1][: col2 - (&selection ==? 'inclusive' ? 1 : 2)]
let lines[0] = lines[0][col1 - 1:]
return lines
func! s:get_visual_selection_searchpattern() abort
let lines = s:get_visual_selection_list()
let lines = map(lines, 'escape(v:val, ''/\'')')
" Join with a _literal_ \n to make a valid search pattern.
return join(lines, '\n')
"read last visual-selection into command line
cnoremap <c-r><c-v> <c-r>=join(<sid>get_visual_selection_list(), " ")<cr>
inoremap <c-r><c-v> <c-r>=join(<sid>get_visual_selection_list(), " ")<cr>
xnoremap * <esc>ms/\V<c-r>=<sid>get_visual_selection_searchpattern()<cr><cr>
nnoremap <silent> * ms:<c-u>let @/='\V\<'.escape(expand('<cword>'), '/\').'\>'<bar>set hlsearch<cr>
nnoremap <silent> g* ms:<c-u>let @/='\V' . escape(expand('<cword>'), '/\') <bar>set hlsearch<cr>
hi MarkLine guibg=darkred guifg=gray ctermbg=9 ctermfg=15
func! s:markline() abort
let b:vimrc_markedlines = get(b:, "vimrc_markedlines", {})
"TODO: This will get stale if the line moves.
" :sign is a solution, but need to create a way to get un-used sign {id}s.
let b:vimrc_markedlines[line('.')] = matchaddpos("MarkLine", [line('.')])
nnoremap <silent> m. :call <sid>markline()<cr>
nnoremap <silent> m<bs> :call matchdelete(b:vimrc_markedlines[line('.')])<cr>
" }}} mappings
highlight Halo guifg=black guibg=white ctermfg=black ctermbg=white
highlight Halo2 guifg=white guibg=#F92672 ctermfg=white ctermbg=197
let g:halo = {}
function! s:halo_clear(id) abort
silent! call matchdelete(g:halo['hl_id'])
function! s:halo() abort
call s:halo_show('Halo', -1)
call timer_start(200, function('s:halo_show', ['Halo2']))
call timer_start(500, function('s:halo_clear'))
function! s:halo_show(hl, id) abort
call s:halo_clear(-1)
let lcol = col('.') > 10 ? col('.') - 10 : 1
let g:halo['hl_id'] = matchaddpos(a:hl,
\[[line('.'), lcol, 20],
\ [line('.')-1, lcol, 20],
\ [line('.')-2, lcol, 20],
\ [line('.')+1, lcol, 20],
\ [line('.')+2, lcol, 20]]
augroup halo_plugin
autocmd WinLeave * call <SID>halo_clear(-1)
augroup END
" A massively simplified take on
func! s:matchparen_cursorcolumn_setup() abort
augroup matchparen_cursorcolumn
autocmd CursorMoved * if get(w:, "paren_hl_on", 0) | set cursorcolumn | else | set nocursorcolumn | endif
autocmd InsertEnter * set nocursorcolumn
augroup END
if 0 && !&cursorcolumn
augroup matchparen_cursorcolumn_setup
" - Add the event _only_ if matchparen is enabled.
" - Event must be added _after_ matchparen loaded (so we can react to w:paren_hl_on).
autocmd CursorMoved * if exists("#matchparen#CursorMoved") | call <sid>matchparen_cursorcolumn_setup() | endif
\ | autocmd! matchparen_cursorcolumn_setup
augroup END
augroup vimrc_savecommitmsg
" Remember last git commit message
func! s:store_commit_msg()
" save
let [w,r]=[winsaveview(),getreg('"', 1)]
let [_reg_c,_cmark1,_cmark2] = [@c,getpos("'["),getpos("']")]
let @c=''
silent! keepmarks keepjumps keeppatterns 1;/^#/g/\v(^$)|^([^#].*$)/y C
keepmarks keepjumps let g:removed_whitespace =
\ substitute(@c, '\_[[:space:]]*', '', 'g')
let @c = len(g:removed_whitespace) < 10
\ ? _reg_c : @c[1:] " remove first (empty) line
" restore
call winrestview(w)
call setreg('"', r)
call setpos("'[", _cmark1)
call setpos("']", _cmark2)
autocmd BufEnter COMMIT_EDITMSG
\ autocmd! vimrc_savecommitmsg TextChanged,TextChangedI <buffer> silent call <SID>store_commit_msg()
autocmd BufWritePost COMMIT_EDITMSG let g:LAST_COMMIT_MSG = @c
augroup END
augroup vimrc_autocmd
autocmd TabLeave * let g:lasttab=tabpagenr()
nnoremap <silent><expr> <c-tab> g:lasttab.'gt'
autocmd FileType text setlocal textwidth=80
autocmd BufReadPost *.i setlocal filetype=c
" Closes the current quickfix list and returns to the alternate window.
func! s:close_qflist()
let altwin = s:get_alt_winnr()
wincmd c
exe altwin.'wincmd w'
" let [win_cnt, last_win] = [winnr('$'), winnr() == winnr('$')]
" if last_win "If quickfix window is open, it is _always_ the last window.
" cclose
" if win_cnt == winnr('$')
" lclose " :cclose didn't change win count; that means we were in loclist.
" end
" else
" lclose
" endif
autocmd FileType qf nnoremap <buffer> <c-p> <up>
\|nnoremap <buffer> <c-n> <down>
\|nnoremap <silent><buffer> q :call <sid>close_qflist()<cr>
autocmd CmdwinEnter * nnoremap <silent><buffer> q <C-W>c
" Jump to the last position when reopening a file (except Git commit)
autocmd BufReadPost * if @% !~# '\.git[\/\\]COMMIT_EDITMSG$' && line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
autocmd BufNewFile,BufRead *.txt,README,INSTALL,NEWS,TODO setf text
autocmd BufNewFile,BufRead *.proj set ft=xml "force filetype for msbuild
autocmd FileType gitconfig setlocal commentstring=#\ %s
function! s:setup_gitstatus() abort
nmap <buffer> <M-n> <c-n>dvgg:call feedkeys('<c-v><c-w>h<c-v><c-n><c-v><c-w>P<c-v><c-l>')<cr>
nmap <buffer> <M-p> <c-p>dvgg:call feedkeys('<c-v><c-w>h<c-v><c-n><c-v><c-w>P<c-v><c-l>')<cr>
nmap <buffer><nowait> <M-u> U<Esc>
autocmd FileType gitcommit call <SID>setup_gitstatus()
autocmd BufWinEnter * if exists("*fugitive#detect") && empty(expand('<afile>'))|call fugitive#detect(getcwd())|endif
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
au BufWritePre,FileWritePre * call mkdir(expand('<afile>:p:h'), 'p')
"when Vim starts in diff-mode (vim -d, git mergetool):
" - do/dp should not auto-fold
autocmd VimEnter * if &diff | exe 'windo set foldmethod=manual' | endif
" autocmd VimEnter * if !empty($NVIM_LISTEN_ADDRESS) && $NVIM_LISTEN_ADDRESS !=# v:servername
" \ |let g:r=jobstart(['nc', '-U', $NVIM_LISTEN_ADDRESS],{'rpc':v:true})
" \ |let g:f=fnameescape(expand('%:p'))
" \ |noau bwipe
" \ |call rpcrequest(g:r, "nvim_command", "tabedit ".g:f)|qa|endif
autocmd BufRead,BufNewFile *.{ascx,aspx} setlocal shiftwidth=2 copyindent
if exists('##TextYankPost')
autocmd TextYankPost * let g:yankring=get(g:,'yankring',[])
\|call add(g:yankring, join(v:event.regcontents[:999], "\n"))|if len(g:yankring)>10|call remove(g:yankring, 0, 1)|endif
augroup END
" :shell
" Creates a global default :shell with maximum 'scrollback'.
func! s:ctrl_s(cnt, new, enter) abort
let init = { 'termbuf': -1, 'prevwid': win_getid() }
let g:term_shell = a:new ? init : get(g:, 'term_shell', init)
let d = g:term_shell
let b = d.termbuf
" Return to previous window.
if bufnr('%') == b
let term_prevwid = win_getid()
if !win_gotoid(d.prevwid)
wincmd p
if bufnr('%') == b
" Edge-case: :shell buffer showing in multiple windows in curtab.
" Find a non-:shell window in curtab.
let bufs = filter(tabpagebuflist(), 'v:val != '.b)
if len(bufs) > 0
exe bufwinnr(bufs[0]).'wincmd w'
" Last resort: WTF, just go to previous tab.
let d.prevwid = term_prevwid
" Go to existing :shell or create new.
let curwinid = win_getid()
if a:cnt == 0 && bufexists(b) && winbufnr(d.prevwid) == b
call win_gotoid(d.prevwid)
elseif bufexists(b)
let w = bufwinid(b)
if a:cnt == 0 && w > 0 " buffer exists in current tabpage
call win_gotoid(w)
else " not in current tabpage; go to first found
let ws = win_findbuf(b)
if a:cnt == 0 && !empty(ws)
call win_gotoid(ws[0])
exe ((a:cnt == 0) ? 'tab split' : a:cnt.'split')
exe 'buffer' b
" augroup nvim_shell
" autocmd!
" autocmd TabLeave <buffer> if winnr('$') == 1 && bufnr('%') == g:term_shell.termbuf | tabclose | endif
" augroup END
let origbuf = bufnr('%')
exe ((a:cnt == 0) ? 'tab split' : a:cnt.'split')
" augroup nvim_shell
" autocmd!
" autocmd TabLeave <buffer> if winnr('$') == 1 && bufnr('%') == g:term_shell.termbuf | tabclose | endif
" augroup END
exe 'file :shell '.jobpid(&channel)
" XXX: original term:// buffer hangs around after :file ...
bwipeout! #
" Set alternate buffer to something intuitive.
let @# = origbuf
tnoremap <buffer> <C-s> <C-\><C-n>:call <SID>ctrl_s(0, v:false, v:true)<CR>
let d.termbuf = bufnr('%')
if a:enter
startinsert " enter terminal-mode
let d.prevwid = curwinid
nnoremap <C-s> :<C-u>call <SID>ctrl_s(v:count, v:false, v:false)<CR>
nnoremap g<C-s> :<C-u>call <SID>ctrl_s(v:count, v:false, v:true)<CR>
set wildcharm=<C-Z>
nnoremap <C-b> :set nomore<bar>ls<bar>set more<cr>:buffer<space>
" _opt-in_ to sloppy-search
nnoremap <C-f> :edit **/
nnoremap >t :tag<space>
" See `man fnmatch`.
nnoremap >g mS:Ggrep! -E <C-R>=shellescape(fnameescape(expand('<cword>')))<CR> -- ':/' ':/\!*.md' ':/\!*.mpack' ':/\!*.pbf' ':/\!*.pdf' ':/\!*.po' ':(top,exclude,icase)notebooks/' ':/\!data/' ':/\!work/' ':/\!qgis/' ':/\!graphhopper_data/'
nnoremap >v mS:<c-u>noau vimgrep /\C/j **<left><left><left><left><left>
" search all file buffers (clear qf first).
nnoremap >b mS:<c-u>cexpr []<bar>exe 'bufdo silent! noau vimgrepadd/\C/j %'<bar>botright copen<s-left><s-left><left><left><left>
" search current buffer and open results in loclist
nnoremap >. ms:<c-u>lvimgrep // % <bar>lw<s-left><left><left><left><left>
" search-replace
nnoremap gsal mr:%s/
xnoremap gs mr:s/\%V
" =============================================================================
" autocomplete / omnicomplete / tags
" =============================================================================
set completeopt-=preview
set complete+=kspell
set wildignore+=tags,*/gwt-unitCache/*
" Files with these suffixes get a lower priority when matching a wildcard
set suffixes+=.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc
" Better `gf`
function! s:fzf_open_file_at_line(e) abort
"Get the <path>:<line> tuple; fetch.vim plugin will handle the rest.
execute 'edit' fnameescape(matchstr(a:e, '\v([^:]{-}:\d+)'))
function! s:fzf_insert_at_point(s) abort
execute "put ='".a:s."'"
function! s:fzf_search_fulltext() abort
call fzf#run({'source':'git grep --line-number --color=never -v "^[[:space:]]*$"',
\ 'sink':function('<sid>fzf_open_file_at_line')})
" Search current-working-directory _or_ current-file-directory
nnoremap <silent><expr> <M-/> v:count ? ':<C-U>call <SID>fzf_search_fulltext()<CR>' : ':<C-U>FzFiles<CR>'
" Search MRU files
nnoremap <silent> <M-\> :FzHistory<cr>
nnoremap <silent><expr> <C-\> v:count ? 'mS:<C-U>FzLines<CR>' : ':<C-U>FzBuffers<CR>'
nmap g/ <M-/>
if !empty(findfile('plugin/tmuxcomplete.vim', &rtp))
inoremap <expr> <C-l> fzf#complete(tmuxcomplete#list('lines', 0))
inoremap <expr> <M-w> fzf#complete(tmuxcomplete#list('words', 0))
nnoremap <silent> <M-w> :call fzf#run({'source':tmuxcomplete#list('words', 0),
\ 'sink':function('<SID>fzf_insert_at_point')})<CR>
nnoremap <silent> gO :call fzf#vim#buffer_tags('')<cr>
nnoremap <silent> z/ :call fzf#vim#tags('')<cr>
" Slides plugin {{{
func! s:slides_hl() abort
if hlID('SlidesHide') == 0
" use folds instead of highlight
exe 'match SlidesHide /\%>'.(line('w0')-1).'l\n=\{20}=*\n\_.\{-}\zs\n.*\n=\{20}=\_.*/'
func! Slides() abort
set cmdheight=1
set nowrapscan
set nohlsearch
hi SlidesHide ctermbg=bg ctermfg=bg guibg=bg guifg=bg
catch /E420/
hi markdownError ctermbg=NONE ctermfg=NONE guifg=NONE guibg=NONE
nnoremap <silent> <Down> :keeppatterns /^======<CR>zt<C-Y>:call <SID>slides_hl()<CR>
nnoremap <silent> <Up> :keeppatterns ?^======<CR>zt<C-Y>:call <SID>slides_hl()<CR>
setlocal colorcolumn=54,67 textwidth=53
hi ColorColumn guibg=#555555 guifg=#ffffff
" hi SlidesSign guibg=white guifg=black ctermbg=black ctermfg=white gui=NONE cterm=NONE
" sign define limit text== texthl=SlidesSign
" sign unplace
func! SlidesEnd() abort
call clearmatches()
" }}}
set title
set titlestring=%{getpid().':'.getcwd()}
set titleold=?
" special-purpose mappings/commands ===========================================
nnoremap <leader>vft :e ~/.config/nvim/ftplugin<cr>
nnoremap <leader>vv :exe 'e' fnameescape(resolve($MYVIMRC))<cr>
nnoremap <silent> <leader>vs :Scriptnames<cr>
inoremap <silent> <leader>log ELOG("");<Left><Left><Left>
xnoremap <leader>{ <esc>'<A {`>o}==`<
command! InsertDate norm! i<c-r>=strftime('%Y/%m/%d %H:%M:%S')<cr>
command! InsertDateYYYYMMdd norm! i<c-r>=strftime('%Y%m%d')<cr>
command! InsertCBreak norm! i#include <signal.h>raise(SIGINT);
command! CdNotes exe 'e '.finddir("notes", expand('~').'/Desktop/github,'.expand('~').'/dev')<bar>lcd %
command! CdLibUV exe 'e '.finddir(".deps/build/src/libuv", expand("~")."/neovim/**,".expand("~")."/dev/neovim/**")<bar>lcd %
command! CdNvimDeps exe 'e '.finddir(".deps", expand("~")."/neovim/**,".expand("~")."/dev/neovim/**")<bar>lcd %
command! CdNvimLuaClient exe 'e '.finddir("nvim", expand("~")."/neovim/.deps/usr/share/lua/**,".expand("~")."/neovim/.deps/usr/share/lua/**")<bar>lcd %
command! CdVim exe 'e '.finddir(".vim-src", expand("~")."/neovim/**,".expand("~")."/dev/neovim/**")<bar>lcd %
command! ProfileVim exe 'Start '.v:progpath.' --startuptime "'.expand("~/vimprofile.txt").'" -c "e ~/vimprofile.txt"'
command! NvimTestScreenshot put =\"local Screen = require('test.functional.ui.screen')\nlocal screen =\nscreen:attach()\nscreen:snapshot_util({},true)\"
command! ConvertBlockComment keeppatterns .,/\*\//s/\v^((\s*\/\*)|(\s*\*\/)|(\s*\*))(.*)/\/\/\/\5/
command! Vimsrc tabedit ~/neovim/.vim-src/|exe 'lcd %:h'|edit src/eval.c
command! -nargs=1 Vimref tabedit ~/neovim/.vim-src/|exe 'lcd %:h'|Gedit <args>
command! -nargs=1 Vimtag exe 'noswapfile edit '.finddir(".vim-src", expand("~")."/neovim/**,".expand("~")."/dev/neovim/**").'/src/version.c'
\.'|tag <args>'
command! -nargs=1 Ghpr GV refs/pull/upstream/<args>
function! Cxn_py() abort
call chansend(&channel, "python3\nimport neovim\n")
call chansend(&channel, "n = neovim.attach('socket', path='".g:cxn."')\n")
function! Cxn(addr) abort
silent! unlet g:cxn
if !empty(a:addr) " Only start the client.
let g:cxn = a:addr
call Cxn_py()
let nvim_path = executable('build/bin/nvim') ? 'build/bin/nvim' : 'nvim'
call chansend(&channel, "NVIM_LISTEN_ADDRESS= ".nvim_path." -u NORC\n")
call chansend(&channel, ":let j=jobstart('nc -U ".v:servername."',{'rpc':v:true})\n")
call chansend(&channel, ":call rpcrequest(j, 'nvim_set_var', 'cxn', v:servername)\n")
call chansend(&channel, ":call rpcrequest(j, 'nvim_command', 'call Cxn_py()')\n")
command! -nargs=* NvimCxn call Cxn(<q-args>)
function! s:init_lynx() abort
nnoremap <nowait><buffer> <C-F> i<PageDown><C-\><C-N>
tnoremap <nowait><buffer> <C-F> <PageDown>
nnoremap <nowait><buffer> <C-B> i<PageUp><C-\><C-N>
tnoremap <nowait><buffer> <C-B> <PageUp>
nnoremap <nowait><buffer> <C-D> i:DOWN_HALF<CR><C-\><C-N>
tnoremap <nowait><buffer> <C-D> :DOWN_HALF<CR>
nnoremap <nowait><buffer> <C-U> i:UP_HALF<CR><C-\><C-N>
tnoremap <nowait><buffer> <C-U> :UP_HALF<CR>
nnoremap <nowait><buffer> <C-N> i<Delete><C-\><C-N>
tnoremap <nowait><buffer> <C-N> <Delete>
nnoremap <nowait><buffer> <C-P> i<Insert><C-\><C-N>
tnoremap <nowait><buffer> <C-P> <Insert>
nnoremap <nowait><buffer> u i<Left><C-\><C-N>
nnoremap <nowait><buffer> <C-R> i<C-U><C-\><C-N>
nnoremap <nowait><buffer> <CR> i<CR><C-\><C-N>
nnoremap <nowait><buffer> gg i:HOME<CR><C-\><C-N>
nnoremap <nowait><buffer> G i:END<CR><C-\><C-N>
nnoremap <nowait><buffer> zl i:SHIFT_LEFT<CR><C-\><C-N>
nnoremap <nowait><buffer> zL i:SHIFT_LEFT<CR><C-\><C-N>
nnoremap <nowait><buffer> zr i:SHIFT_RIGHT<CR><C-\><C-N>
nnoremap <nowait><buffer> zR i:SHIFT_RIGHT<CR><C-\><C-N>
nnoremap <nowait><buffer> gh i:HELP<CR><C-\><C-N>
nnoremap <nowait><buffer> cow i:LINEWRAP_TOGGLE<CR><C-\><C-N>
tnoremap <buffer> <C-C> <C-G><C-\><C-N>
nnoremap <buffer> <C-C> i<C-G><C-\><C-N>
command! -nargs=1 Web vnew|call termopen('lynx -use_mouse '.shellescape(<q-args>))|call <SID>init_lynx()
command! -nargs=1 Websearch vnew|call termopen('lynx -use_mouse'.shellescape(substitute(<q-args>,'#','%23','g')))|call <SID>init_lynx()
nnoremap gow :Start "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --no-proxy-server "%:p"<cr>
silent! source ~/.vimrc.local