diff options
-rw-r--r-- | functions.vim | 270 | ||||
-rw-r--r-- | vimrc | 202 |
2 files changed, 278 insertions, 194 deletions
diff --git a/functions.vim b/functions.vim new file mode 100644 index 0000000..5264701 --- /dev/null +++ b/functions.vim @@ -0,0 +1,270 @@ +" StripTrailingWhitespaces, by Drew Neil of vimcasts.org {{{1 +function! <SID>StripTrailingWhitespaces() + " Save last search and cursor position + let _s=@/ + let l = line(".") + let c = col(".") + " Do the business: + %s/\s\+$//e + " Restore previous search history and cursor position + let @/=_s + call cursor(l, c) +endfunction + +" SynStack, by Drew Neil of vimcasts.org {{{1 +function! <SID>SynStack() + if !exists("*synstack") + return + endif + echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') +endfunction + +" CountCodeLines, by zlg {{{1 +function! <SID>CountCodeLines() + let code_count = 0 + for line in getbufline("%", 1, "$") + if (len(line) > 0 && match(line, '\S\+') > -1) + if (s:IsCommentLine(line) == 1) + continue + endif + let code_count += 1 + endif + endfor + echo code_count . ' lines of code.' +endfunction + +" IsCommentLine, by zlg {{{1 +" Meant to be used with CountCodeLines() +function! s:IsCommentLine(line) + let l:comtypes = [] + let l:comlist = split(&comments, ',') + for i in comlist + let l:type = split(i, ':') + if len(type) > 1 + let l:opt = type[1] + else + let l:opt = type[0] + endif + call add(comtypes, opt) + endfor + let i = 0 + while i < len(comtypes) + if match(a:line, '^\s*' . escape(comtypes[i], '/*')) > -1 + return 1 + endif + let i += 1 + endwhile + return 0 +endfunction + +" InsertDOW, by zlg {{{1 +function! <SID>InsertDOW() + " Let's backup a random register + let tmpx = @x + let @x = system("date +\"%a \" -d" . strftime("%Y") . "-" . substitute(expand("<cWORD>"), ":", "", "")) + normal "xP + " Join, since it apparently is on a line instead of just a string + j 1 + " Return the value in the x register + let @x = tmpx +endfunction + +" BufDiff, by zlg {{{1 +" Function: BufDiff +" Author: zlg <zlg+viml@zlg.space> +" Date: 2018-10-12 +" License: GNU GPL, version 3 <https://gnu.org/licenses/gpl-3.0.html> +" Description: Open a new tab page with two or three buffers and enter diff mode. +" Long Description: +" BufDiff accepts two or three buffer arguments and opens a new tab page to +" work with them in diff mode. This ensures that your existing window and +" buffer layout is preserved while providing an easy way to enter a diff +" session. The arguments can be any argument that can also be passed to +" the ":buffer" Ex-command, including partial filenames (if quoted). +function! BufDiff(buf1, buf2, ...) + let fname = substitute(expand("<sfile>"), "^function ", "", "") + if a:0 > 1 + echohl ErrorMsg + echomsg l:fname . ": This function accepts a maximum of three arguments." + echohl None + return + endif + + " Check for a third buffer, which will default to zero if not present + let a:buf3 = get(a:, 1, 0) + + if !bufexists(a:buf1) || !bufexists(a:buf2) || (a:0 == 1 && !bufexists(a:buf3)) + echohl ErrorMsg + echomsg l:fname . ": One or more buffer number(s) not found!" + echohl None + return + else + tabnew + exe ":buffer " . a:buf1 + diffthis + vsplit + exe ":buffer " . a:buf2 + diffthis + if a:buf3 + vsplit + exe ":buffer " . a:buf3 + diffthis + endif + return + endif +endfunction + +" SwapKeys, by zlg {{{1 +" This function isn't that fancy; it just flips a variable and calls the +" mapping function. +function! SwapKeys() + if (exists("g:use_dvorak") && (g:use_dvorak == 1 || g:use_dvorak == 0)) + let g:use_dvorak = (!g:use_dvorak) + call SetKeyMap() + else + echohl ErrorMsg + echomsg "g:use_dvorak is either unset, or an invalid value. Set to 0 or 1. + echohl None + return + endif +endfunction + +" SetKeyMap, by zlg {{{1 +" Function: SetKeyMap +" Author: zlg <zlg+vim@zlg.space> +" Date: 2018-11-15 +" License: GNU GPL, version 3 <https://gnu.org/licenses/gpl-3.0.html> +" Long Description: +" SetKeyMap allows the user to set their keybindings according to the value of +" a global variable. In this case, it's g:use_dvorak, to swap between Dvorak +" and QWERTY layouts. It can be extended to use any number of key mappings +" that you need. +function! SetKeyMap() + if g:use_dvorak == 1 + " I use a Dvorak keyboard, so standard vim movement keys are a hassle. + " Since mnemonics are helpful all around, I need a mapping that gives me + " pain-free file navigation without screwing up mnemonics (too much). + " + " Thus: + " (D)elete is now (K)ill: d2w == k2w "kill 2 words" + " Un(T)il is now (J)ump-To: dt( == kj( "kill, jump-to paren" + " (N)ext is now (L)eap: cn == cl "change up to leap point" + + " Standard movement, which is the true focus of this hack. + " Mnemonics are awesome, so let's preserve as much as possible. + noremap d h + noremap h j + noremap t k + noremap n l + noremap D H + noremap H J + noremap T K + noremap N L + + noremap gh gj + noremap gt gk + + " I work with tabs every now and then. No, I don't have a mnemonic. + noremap gj gt + noremap gJ gT + + " Window movement, equally important + noremap <C-w>d <C-w>h + noremap <C-w>h <C-w>j + noremap <C-w>t <C-w>k + noremap <C-w>n <C-w>l + + nnoremap <C-w><C-d> <C-w><C-h> + nnoremap <C-w><C-h> <C-w><C-j> + nnoremap <C-w><C-t> <C-w><C-k> + nnoremap <C-w><C-n> <C-w><C-l> + + nnoremap <C-d> <C-w>h + nnoremap <C-h> <C-w>j + nnoremap <C-t> <C-w>k + nnoremap <C-n> <C-w>l + + " Account for tag jumping + nnoremap <C-j> <C-t> + + " Remappings for the D key + noremap k d + noremap K D + + " Remappings for the T key + noremap j t + noremap J T + + " Remapping for the L key + noremap l n + noremap L N + + " General purpose help; the originals remain for convenience + noremap - 0 + noremap _ $ + + " Fold-related keybindings + noremap zh zj + noremap zt zk + echomsg "Bindings set to Dvorak" + else + " set qwerty keys; basically just resetting things + noremap h h + noremap j j + noremap k k + noremap l l + noremap H H + noremap J J + noremap K K + noremap L L + + noremap gj gj + noremap gh gh + + noremap gt gt + noremap gT gT + + noremap <C-w>h <C-w>h + noremap <C-w>j <C-w>j + noremap <C-w>h <C-w>k + noremap <C-w>l <C-w>l + + nnoremap <C-w><C-h> <C-w><C-h> + nnoremap <C-w><C-j> <C-w><C-j> + nnoremap <C-w><C-k> <C-w><C-k> + nnoremap <C-w><C-l> <C-w><C-l> + + nnoremap <C-h> <C-w>h + nnoremap <C-j> <C-w>j + nnoremap <C-k> <C-w>k + nnoremap <C-l> <C-w>l + + nnoremap <C-t> <C-t> + + noremap d d + noremap D D + + noremap t t + noremap T T + + noremap n n + noremap N N + + noremap - 0 + noremap _ $ + + noremap zj zj + noremap zk zk + echomsg "Bindings set to QWERTY" + endif +endfunction + +" Custom folding display function +function! MyFoldText() + let indent = repeat(' ', indent(v:foldstart)) + let line = substitute(getline(v:foldstart), '\v^\s+', '', '') + let folded_lines = v:foldend - v:foldstart + return indent . line . ' (' . folded_lines . 'L)' +endfunction + +" vim: foldmethod=marker @@ -8,6 +8,9 @@ set fileformats=unix,dos,mac set spelllang=en_us set switchbuf=useopen +" Outsourced functions file +runtime functions.vim + " Colors and Syntax {{{1 set t_Co=16 set background=dark @@ -82,14 +85,6 @@ set noautoindent set foldmethod=expr set foldtext=MyFoldText() -function! MyFoldText() - let indent = repeat(' ', indent(v:foldstart)) - let line = substitute(getline(v:foldstart), '\v^\s+', '', '') - let folded_lines = v:foldend - v:foldstart - return indent . line . ' (' . folded_lines . 'L)' -endfunction - - " Autocommands {{{1 if has("autocmd") filetype plugin indent on @@ -144,194 +139,13 @@ noremap <Leader>w{ <ESC>`>a}<ESC>`<i{<ESC> noremap <Leader>w< <ESC>`>a><ESC>`<i<<ESC> noremap <Leader>w` <ESC>`>a`<ESC>`<i`<ESC> +" super handy over SSH +noremap <Leader>q :call SwapKeys()<CR> -" Dvorak Hackery {{{1 -if (exists("g:use_dvorak") && g:use_dvorak == 1) - " I use a Dvorak keyboard, so standard vim movement keys are a hassle. - " Since mnemonics are helpful all around, I need a mapping that gives me - " pain-free file navigation without screwing up mnemonics (too much). - " - " Thus: - " (D)elete is now (K)ill: d2w == k2w "kill 2 words" - " Un(T)il is now (J)ump-To: dt( == kj( "kill, jump-to paren" - " (N)ext is now (L)eap: cn == cl "change up to leap point" - - " Standard movement, which is the true focus of this hack. - " Mnemonics are awesome, so let's preserve as much as possible. - noremap d h - noremap h j - noremap t k - noremap n l - noremap D H - noremap H J - noremap T K - noremap N L - - noremap gh gj - noremap gt gk - - " I work with tabs every now and then. No, I don't have a mnemonic, so - " stfu. - noremap gj gt - noremap gJ gT - - " Window movement, equally important - noremap <C-w>d <C-w>h - noremap <C-w>h <C-w>j - noremap <C-w>t <C-w>k - noremap <C-w>n <C-w>l - - nnoremap <C-w><C-d> <C-w><C-h> - nnoremap <C-w><C-h> <C-w><C-j> - nnoremap <C-w><C-t> <C-w><C-k> - nnoremap <C-w><C-n> <C-w><C-l> - - nnoremap <C-d> <C-w>h - nnoremap <C-h> <C-w>j - nnoremap <C-t> <C-w>k - nnoremap <C-n> <C-w>l - - " Account for tag jumping - nnoremap <C-j> <C-t> - - " Remappings for the D key - noremap k d - noremap K D - - " Remappings for the T key - noremap j t - noremap J T - - " Remapping for the L key - noremap l n - noremap L N - - " General purpose help; the originals remain for convenience - noremap - 0 - noremap _ $ - - " Fold-related keybindings - noremap zh zj - noremap zt zk +" Dvorak Hackery {{{1 +if exists("g:use_dvorak") && g:use_dvorak == 1 + silent call SetKeyMap() endif -" Functions {{{1 -" StripTrailingWhitespaces, by Drew Neil of vimcasts.org {{{2 -function! <SID>StripTrailingWhitespaces() - " Save last search and cursor position - let _s=@/ - let l = line(".") - let c = col(".") - " Do the business: - %s/\s\+$//e - " Restore previous search history and cursor position - let @/=_s - call cursor(l, c) -endfunction - -" SynStack, by Drew Neil of vimcasts.org {{{2 -function! <SID>SynStack() - if !exists("*synstack") - return - endif - echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")') -endfunction - -" CountCodeLines, by zlg {{{2 -function! <SID>CountCodeLines() - let code_count = 0 - for line in getbufline("%", 1, "$") - if (len(line) > 0 && match(line, '\S\+') > -1) - if (s:IsCommentLine(line) == 1) - continue - endif - let code_count += 1 - endif - endfor - echo code_count . ' lines of code.' -endfunction - -" IsCommentLine, by zlg {{{2 -" Meant to be used with CountCodeLines() -function! s:IsCommentLine(line) - let l:comtypes = [] - let l:comlist = split(&comments, ',') - for i in comlist - let l:type = split(i, ':') - if len(type) > 1 - let l:opt = type[1] - else - let l:opt = type[0] - endif - call add(comtypes, opt) - endfor - let i = 0 - while i < len(comtypes) - if match(a:line, '^\s*' . escape(comtypes[i], '/*')) > -1 - return 1 - endif - let i += 1 - endwhile - return 0 -endfunction - -" InsertDOW, by zlg {{{2 -function! <SID>InsertDOW() - " Let's backup a random register - let tmpx = @x - let @x = system("date +\"%a \" -d" . strftime("%Y") . "-" . substitute(expand("<cWORD>"), ":", "", "")) - normal "xP - " Join, since it apparently is on a line instead of just a string - j 1 - " Return the value in the x register - let @x = tmpx -endfunction -" }}} -" BufDiff, by zlg {{{2 -" Function: BufDiff -" Author: zlg <zlg+viml@zlg.space> -" Date: 2018-10-12 -" License: GNU GPL, version 3 <https://gnu.org/licenses/gpl-3.0.html> -" Description: Open a new tab page with two or three buffers and enter diff mode. -" Long Description: -" BufDiff accepts two or three buffer arguments and opens a new tab page to -" work with them in diff mode. This ensures that your existing window and -" buffer layout is preserved while providing an easy way to enter a diff -" session. The arguments can be any argument that can also be passed to -" the ":buffer" Ex-command, including partial filenames (if quoted). -function! BufDiff(buf1, buf2, ...) - let fname = substitute(expand("<sfile>"), "^function ", "", "") - if a:0 > 1 - echohl ErrorMsg - echomsg l:fname . ": This function accepts a maximum of three arguments." - echohl None - return - endif - - " Check for a third buffer, which will default to zero if not present - let a:buf3 = get(a:, 1, 0) - - if !bufexists(a:buf1) || !bufexists(a:buf2) || (a:0 == 1 && !bufexists(a:buf3)) - echohl ErrorMsg - echomsg l:fname . ": One or more buffer number(s) not found!" - echohl None - return - else - tabnew - exe ":buffer " . a:buf1 - diffthis - vsplit - exe ":buffer " . a:buf2 - diffthis - if a:buf3 - vsplit - exe ":buffer " . a:buf3 - diffthis - endif - return - endif -endfunction -" }}} - " vim: foldmethod=marker |