From d9fd53a62b8fe7698400610d81456e5e3d9461ef Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 29 Oct 2017 16:01:43 -0400 Subject: pull a bunch of self-contained things out of my vimrc --- vimrc | 335 +----------------------------------------------------------------- 1 file changed, 2 insertions(+), 333 deletions(-) (limited to 'vimrc') diff --git a/vimrc b/vimrc index f0603cd..7f1ed9d 100644 --- a/vimrc +++ b/vimrc @@ -66,14 +66,6 @@ set t_Co=256 highlight Folded ctermfg=darkgreen ctermbg=black guifg=green guibg=black highlight Search NONE ctermfg=red guifg=red " }}} -" highlight end of line whitespace {{{ -augroup eolws - autocmd! - autocmd InsertEnter * syn clear EOLWS | syn match EOLWS excludenl /\s\+\%#\@!$/ - autocmd InsertLeave * syn clear EOLWS | syn match EOLWS excludenl /\s\+$/ -augroup END -highlight EOLWS ctermbg=red guibg=red -" }}} " highlight diff conflict markers {{{ match ErrorMsg '^\(<\||\|=\|>\)\{7\}\([^=].\+\)\?$' " }}} @@ -121,7 +113,7 @@ inoremap " easier tag traversal {{{ nnoremap nnoremap -autocmd CmdWinEnter * nnoremap +autocmd vimrc CmdWinEnter * nnoremap " }}} " buffer switching {{{ nnoremap H :bp @@ -259,330 +251,7 @@ runtime macros/matchit.vim " syntax files override the highlighting " using BufWinEnter because that is run after modelines are run (so it catches " modelines which update highlighting) -autocmd BufWinEnter,FileType * runtime plugin/rainbow_paren.vim -" }}} -" }}} -" things that should be plugins {{{ -" update zsh history when editing a new file - see 'vim' wrapper in .zshrc {{{ -if $SHELL =~# 'zsh' && exists('g:_zsh_hist_fname') - let s:initial_files = {} - - augroup zshhistory - autocmd! - autocmd VimEnter * call init_zsh_hist() - autocmd BufNewFile,BufRead * call zsh_hist_append() - autocmd BufDelete * call remove_initial_file(expand("")) - autocmd VimLeave * call reorder_zsh_hist() - augroup END - - function! s:remove_initial_file (file) - if has_key(s:initial_files, a:file) - unlet s:initial_files[a:file] - endif - endfunction - function! s:get_buffer_list_text () - redir => l:output - ls! - redir END - return l:output - endfunction - function! s:get_buffer_list () - silent let l:output = get_buffer_list_text() - let l:buffer_list = [] - for l:buffer_desc in split(l:output, "\n") - let l:name = bufname(str2nr(l:buffer_desc)) - if l:name != "" - call add(l:buffer_list, l:name) - endif - endfor - return l:buffer_list - endfunction - function! s:init_zsh_hist () - for l:fname in get_buffer_list() - let s:initial_files[l:fname] = 1 - call histadd(":", "e " . l:fname) - endfor - call delete(g:_zsh_hist_fname) - endfunction - function! s:zsh_hist_append () - let l:to_append = expand("%:~:.") - " XXX these set buftype too late to be caught by this... - " this is broken, but not sure what a better fix is - if &buftype == '' && l:to_append !~# '^\(__Gundo\|Startify\|\[denite\]\)' - if !has_key(s:initial_files, l:to_append) - if filereadable(g:_zsh_hist_fname) - let l:hist = readfile(g:_zsh_hist_fname) - else - let l:hist = [] - endif - call add(l:hist, l:to_append) - call writefile(l:hist, g:_zsh_hist_fname) - endif - endif - endfunction - function! s:reorder_zsh_hist () - let l:current_file = expand("%:~:.") - if filereadable(g:_zsh_hist_fname) - let l:hist = readfile(g:_zsh_hist_fname) - if !has_key(s:initial_files, l:current_file) - call filter(l:hist, 'v:val != l:current_file') - endif - call add(l:hist, l:current_file) - call writefile(l:hist, g:_zsh_hist_fname) - endif - endfunction -endif -" }}} -" diff between current file and its original state {{{ -let s:foldmethod = &foldmethod -let s:foldenable = &foldenable -let s:diffwindow = 0 -function! s:diffstart(read_cmd) - if s:diffwindow != 0 - return - endif - let s:foldmethod = &foldmethod - let s:foldenable = &foldenable - let l:filetype = &filetype - vert new - let s:diffwindow = winnr() - set buftype=nofile - try - exe a:read_cmd - catch /.*/ - echohl ErrorMsg - echo v:exception - echohl NONE - call s:diffstop() - return - endtry - let &filetype = l:filetype - diffthis - wincmd p - diffthis - " why does this not happen automatically? - normal! zM -endfunction -function! s:diffstop() - if s:diffwindow == 0 - return - endif - diffoff! - exe s:diffwindow . 'wincmd w' - bdelete - let &foldmethod = s:foldmethod - let &foldenable = s:foldenable - if &foldenable - normal! zv - endif - let s:diffwindow = 0 -endfunction -function! s:vcs_orig(file) - " XXX: would be nice to use a:file rather than # here... - let l:dir = expand('#:p:h') - if filewritable(l:dir . '/.svn') == 2 - return system('svn cat ' . a:file) - elseif filewritable(l:dir . '/CVS') == 2 - return system("AFILE=" . a:file . "; MODFILE=`tempfile`; DIFF=`tempfile`; cp $AFILE $MODFILE && cvs diff -u $AFILE > $DIFF; patch -R $MODFILE $DIFF 2>&1 > /dev/null && cat $MODFILE; rm $MODFILE $DIFF") - elseif finddir('_darcs', l:dir . ';') =~# '_darcs' - return system('darcs show contents ' . a:file) - elseif finddir('.git', l:dir . ';') =~# '.git' - let l:prefix = system('git rev-parse --show-prefix') - let l:prefix = substitute(l:prefix, '\n', '', 'g') - let l:cmd = 'git show HEAD:'.l:prefix.a:file - return system(l:cmd) - else - throw 'No VCS directory found' - endif -endfunction -nnoremap ds :call diffstart('read # normal! ggdd') -nnoremap dc :call diffstart('call append(0, split(s:vcs_orig(expand("#:.")), "\n", 1)) normal! Gdddd') -nnoremap de :call diffstop() -" }}} -" nopaste {{{ -function! s:nopaste(visual) - if a:visual - silent normal! gv:!nopaste - else - let l:pos = getpos('.') - silent normal! :%!nopaste - endif - silent normal! "+yy - let @* = @+ - silent undo - " can't restore visual selection because that will overwrite "* - if !a:visual - call setpos('.', l:pos) - endif - echo @+ -endfunction -nnoremap p :call nopaste(0) -xnoremap p :call nopaste(1) -" }}} -" better version of keywordprg {{{ -function! Help(visual, iskeyword, command) - let l:iskeyword = &iskeyword - for l:kw in a:iskeyword - exe 'set iskeyword+=' . l:kw - endfor - if a:visual - let l:oldreg = @a - normal! gv"aygv - let l:word = @a - let @a = l:oldreg - else - let l:word = expand('') - endif - let &iskeyword = l:iskeyword - - exe 'noswapfile ' . &helpheight . 'new ' . l:word - setlocal buftype=nofile - setlocal bufhidden=wipe - setlocal nobuflisted - - setlocal modifiable - exe 'call ' . a:command . '("' . l:word . '")' - normal! ggdd - setlocal nomodifiable -endfunction -function! s:man(word) - exe 'silent read! man -Pcat ' . a:word - setlocal filetype=man -endfunction -nnoremap K :call Help(0, [], 'man') -xnoremap K :call Help(1, [], 'man') -" }}} -" auto-append closing characters {{{ -function s:move_cursor_left() - return "\i" -endfunction -function s:prevchar() - return getline('.')[col('.') - 2] -endfunction -function s:nextchar() - return getline('.')[col('.') - 1] -endfunction -let g:pair_cr_maps = { -\ '(': "go_up()", -\ '[': "go_up()", -\ '{': "go_up()", -\} -function s:maybe_reposition_cursor() - return eval(g:pair_cr_maps[s:prevchar()]) -endfunction -function s:go_up() - return "\\O" -endfunction -let g:pair_bs_maps = { -\ '"': "maybe_remove_adjacent_char('\"')", -\ "'": "maybe_remove_adjacent_char(\"'\")", -\ '(': "maybe_remove_empty_pair(')')", -\ '[': "maybe_remove_empty_pair(']')", -\ '{': "maybe_remove_empty_pair('}')", -\ '': "maybe_collapse_pair()", -\} -function s:maybe_remove_matching_pair() - return eval(g:pair_bs_maps[s:prevchar()]) -endfunction -function s:maybe_remove_adjacent_char(char) - if s:nextchar() == a:char - return "\\" - else - return "\" - endif -endfunction -function s:maybe_remove_empty_pair(char) - let l:start = [line('.'), col('.')] - let l:end = searchpos('[^ \t]', 'cnWz') - if l:end == [0, 0] - return "\" - endif - - let l:next_nonblank = getline(l:end[0])[l:end[1] - 1] - if l:next_nonblank != a:char - return "\" - endif - - let l:diff = [l:end[0] - l:start[0], l:end[1] - l:start[1]] - if l:diff[0] == 0 - return "\" . repeat("\", l:diff[1] + 1) - elseif l:diff[0] == 1 - return "\" . (l:diff[0] + 1) . "Ji" . "\\\" - else - return "\" . (l:diff[0] + 1) . "Ji" . "\\\" - endif -endfunction -let g:pair_chars = { -\ '(': ')', -\ '[': ']', -\ '{': '}', -\} -function s:maybe_collapse_pair() - let l:prev_line_idx = line('.') - 1 - if l:prev_line_idx < 1 - return "\" - endif - - let l:prev_line_char = getline(l:prev_line_idx)[col([l:prev_line_idx, '$'])-2] - if l:prev_line_char !~ '[([{]' - return "\" - endif - - let l:end = searchpos('[^ \t]', 'cnWz') - if l:end == [0, 0] - return "\" - endif - - let l:next_nonblank = getline(l:end[0])[l:end[1] - 1] - if l:next_nonblank != g:pair_chars[l:prev_line_char] - return "\" - endif - - return "\\JJi\" -endfunction -function s:skip_closing_char(char) - if s:nextchar() == a:char - return "\la" - else - return a:char - endif -endfunction -for [s:start, s:end] in [['(', ')'], ['{', '}'], ['[', ']']] - exe "inoremap ".s:start." ".s:start.s:end."=move_cursor_left()" - exe "inoremap ".s:end." =skip_closing_char('".s:end."')" -endfor -inoremap ' nextchar() == "'" ? "\=\skip_closing_char(\"'\")\" : col('.') == 1 \|\| match(prevchar(), '\W') != -1 ? "''\=\move_cursor_left()\" : "'" -inoremap " nextchar() == '"' ? "\=\skip_closing_char('\"')\" : "\"\"\=\move_cursor_left()\" -inoremap has_key(g:pair_bs_maps, prevchar()) ? "\=\maybe_remove_matching_pair()\" : "\" -inoremap has_key(g:pair_cr_maps, prevchar()) ? "\=\maybe_reposition_cursor()\" : "\" -" }}} -" Prompt to create directories if they don't exist {{{ -autocmd vimrc BufNewFile * :call ensure_dir_exists() -function! s:ensure_dir_exists () - let l:required_dir = expand("%:h") - if !isdirectory(l:required_dir) - if ask_quit("Directory '" . l:required_dir . "' doesn't exist.", "&Create it?") - return - endif - - try - call mkdir( l:required_dir, 'p' ) - catch - call ask_quit("Can't create '" . l:required_dir . "'", "&Continue anyway?") - endtry - endif -endfunction -function! s:ask_quit (msg, proposed_action) - if confirm(a:msg, "&Quit?\n" . a:proposed_action) == 1 - if len(getbufinfo()) > 1 - silent bd - return 1 - else - exit - end - endif - return 0 -endfunction +autocmd vimrc BufWinEnter,FileType * runtime plugin/rainbow_paren.vim " }}} " }}} " vim: fdm=marker -- cgit v1.2.3-54-g00ecf