diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2017-11-07 13:48:45 +1300 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2017-11-07 13:48:45 +1300 |
commit | e10d9dfb621c210d99aff61fd20de5105455b220 (patch) | |
tree | ad1cc192db6e8a8c59392c08148c9129cf172453 /vim/plugin | |
parent | Merge branch 'release/v0.10.0' (diff) | |
parent | Bump version number to v0.11.0 (diff) | |
download | dotfiles-e10d9dfb621c210d99aff61fd20de5105455b220.tar.gz dotfiles-e10d9dfb621c210d99aff61fd20de5105455b220.zip |
Merge branch 'release/v0.11.0'v0.11.0
* release/v0.11.0:
Bump version number to v0.11.0
Add user_ftplugin.vim and user_indent.vim plugins
Bind <Leader>f to show current 'formatoptions'
Add leader bindings for date stamping
Use b:undo variables correctly
Add \p Vim binding to show filetype
Update <Leader>b mapping to use new mapping name
Add commands to copy_linebreak.vim
Give copy_linebreak.vim enable/disable funcs, maps
Add :FixedJoin command
Add :StripTrailingWhitespace command
Add "do", "then" keywords to Bash completion
Break bash/bashrc.d/completion.bash inline lists
Use consistent comment layout for Vim plugins
Simplify 'formatoptions' config
Refactor toggle_option_flag.vim
Diffstat (limited to 'vim/plugin')
-rw-r--r-- | vim/plugin/command_typos.vim | 7 | ||||
-rw-r--r-- | vim/plugin/copy_linebreak.vim | 69 | ||||
-rw-r--r-- | vim/plugin/fixed_join.vim | 11 | ||||
-rw-r--r-- | vim/plugin/strip_trailing_whitespace.vim | 10 | ||||
-rw-r--r-- | vim/plugin/toggle_option_flag.vim | 81 | ||||
-rw-r--r-- | vim/plugin/user_ftplugin.vim | 24 | ||||
-rw-r--r-- | vim/plugin/user_indent.vim | 24 |
7 files changed, 175 insertions, 51 deletions
diff --git a/vim/plugin/command_typos.vim b/vim/plugin/command_typos.vim index adf2d0eb..60245a30 100644 --- a/vim/plugin/command_typos.vim +++ b/vim/plugin/command_typos.vim @@ -1,7 +1,8 @@ " -" Tolerate typos like :Wq, :Q, or :Qa and do what I mean, including any -" arguments or modifiers; I fat-finger these commands a lot because I type -" them so rapidly, and they don't correspond to any other commands I use +" command_typos.vim: Tolerate typos like :Wq, :Q, or :Qa and do what I mean, +" including any arguments or modifiers; I fat-finger these commands a lot +" because I type them so rapidly, and they don't correspond to any other +" commands I use " " Author: Tom Ryder <tom@sanctum.geek.nz> " License: Same as Vim itself diff --git a/vim/plugin/copy_linebreak.vim b/vim/plugin/copy_linebreak.vim index faeb1617..2b5f7243 100644 --- a/vim/plugin/copy_linebreak.vim +++ b/vim/plugin/copy_linebreak.vim @@ -1,7 +1,7 @@ " -" Bind a user-defined key sequence to turn off linebreak and toggle the -" showbreak characters and breakindent mode on and off, for convenience of -" copying multiple lines from terminal emulators. +" copy_linebreak.vim: Bind user-defined key sequences to toggle a group of +" options that make text wrapped with 'wrap' copy-paste friendly. Also creates +" user commands if it can. " " Author: Tom Ryder <tom@sanctum.geek.nz> " License: Same as Vim itself @@ -13,29 +13,54 @@ if exists('g:loaded_copy_linebreak') endif let g:loaded_copy_linebreak = 1 -" Define function -function! s:CopyLinebreak() +" Enable copy-friendly linebreak options +function! s:CopyLinebreakEnable() + setlocal nolinebreak linebreak? + setlocal showbreak= + if exists('&breakindent') + setlocal nobreakindent + endif +endfunction - " If linebreak is on, turn it off - if &l:linebreak - setlocal nolinebreak linebreak? - setlocal showbreak= - if exists('&breakindent') - setlocal nobreakindent - endif +" Disable copy-friendly linebreak options +function! s:CopyLinebreakDisable() + setlocal linebreak linebreak? + setlocal showbreak< + if exists('&breakindent') + setlocal breakindent< + endif +endfunction - " If it's off, turn it on +" Toggle copy-friendly linebreak options, using the current setting for the +" 'linebreak' option as the pivot +function! s:CopyLinebreakToggle() + if &linebreak + call <SID>CopyLinebreakEnable() else - setlocal linebreak linebreak? - setlocal showbreak< - if exists('&breakindent') - setlocal breakindent - endif + call <SID>CopyLinebreakDisable() endif - endfunction -" Provide mapping proxy to the function just defined +" Provide mappings to the function just defined noremap <silent> <unique> - \ <Plug>CopyLinebreak - \ :<C-U>call <SID>CopyLinebreak()<CR> + \ <Plug>CopyLinebreakEnable + \ :<C-U>call <SID>CopyLinebreakEnable()<CR> +noremap <silent> <unique> + \ <Plug>CopyLinebreakDisable + \ :<C-U>call <SID>CopyLinebreakDisable()<CR> +noremap <silent> <unique> + \ <Plug>CopyLinebreakToggle + \ :<C-U>call <SID>CopyLinebreakToggle()<CR> + +" Provide user commands if we can +if has('user_commands') + command -nargs=0 + \ CopyLinebreakEnable + \ call <SID>CopyLinebreakEnable + command -nargs=0 + \ CopyLinebreakDisable + \ call <SID>CopyLinebreakDisable + command -nargs=0 + \ CopyLinebreakToggle + \ call <SID>CopyLinebreakToggle +endif diff --git a/vim/plugin/fixed_join.vim b/vim/plugin/fixed_join.vim index 18f563f3..2c9e1d92 100644 --- a/vim/plugin/fixed_join.vim +++ b/vim/plugin/fixed_join.vim @@ -1,6 +1,6 @@ " -" User-defined key mapping to keep cursor in place when joining lines in -" normal mode +" fixed_join.vim: User-defined key mapping and optional command to keep cursor +" in place when joining lines in normal mode. " " Author: Tom Ryder <tom@sanctum.geek.nz> " License: Same as Vim itself @@ -31,3 +31,10 @@ endfunction noremap <silent> <unique> \ <Plug>FixedJoin \ :<C-U>call <SID>FixedJoin()<CR> + +" Create a command as well in case it's useful +if has('user_commands') + command -nargs=0 + \ FixedJoin + \ call <SID>FixedJoin() +endif diff --git a/vim/plugin/strip_trailing_whitespace.vim b/vim/plugin/strip_trailing_whitespace.vim index d5f5624a..1264a11f 100644 --- a/vim/plugin/strip_trailing_whitespace.vim +++ b/vim/plugin/strip_trailing_whitespace.vim @@ -1,5 +1,6 @@ " -" User-defined key mapping to strip trailing whitespace in the whole document +" strip_trailing_whitespace.vim: User-defined key mapping and optional command +" to strip trailing whitespace in the whole document. " " Author: Tom Ryder <tom@sanctum.geek.nz> " License: Same as Vim itself @@ -66,3 +67,10 @@ endfunction noremap <silent> <unique> \ <Plug>StripTrailingWhitespace \ :<C-U>call <SID>StripTrailingWhitespace()<CR> + +" Define a user command too, if we can +if has('user_commands') + command -nargs=0 + \ StripTrailingWhiteSpace + \ call <SID>StripTrailingWhitespace() +endif diff --git a/vim/plugin/toggle_option_flag.vim b/vim/plugin/toggle_option_flag.vim index 1d4b11ce..dcc26cce 100644 --- a/vim/plugin/toggle_option_flag.vim +++ b/vim/plugin/toggle_option_flag.vim @@ -12,19 +12,16 @@ if exists('g:loaded_toggle_option_flag') endif let g:loaded_toggle_option_flag = 1 -" Internal function to do the toggling -function! s:Toggle(option, flag, local) - - " Check for weird options, we don't want to :execute anything funny - if a:option =~# '\m\L' - echoerr 'Illegal option name' - return - endif +" Show an error-highlighted message and beep, but without a real :echoerr +function! s:Error(message) + execute 'normal! \<Esc>' + echohl ErrorMsg + echomsg a:message + echohl None +endfunction - " Choose which set command to use - let l:set = a:local - \ ? 'setlocal' - \ : 'set' +" Test whether an option currently has a flag as part of its value +function! s:Has(option, flag) " Horrible :execute to get the option's current setting into a variable " (I couldn't get {curly braces} indirection to work) @@ -33,29 +30,67 @@ function! s:Toggle(option, flag, local) " If the flag we're toggling is longer than one character, this must by " necessity be a delimited option. I think all of those in VimL are - " comma-separated. Extend the flag and current setting so that they'll still - " match at the start and end. Otherwise, use them as-is. + " comma-separated. Extend the flag and value so that they'll still match at + " the start and end. Otherwise, use them as-is. if strlen(a:flag) > 1 let l:search_flag = ',' . a:flag . ',' - let l:search_current = ',' . l:current . ',' + let l:search_value = ',' . l:current . ',' else let l:search_flag = a:flag - let l:search_current = l:current + let l:search_value = l:current endif + " Return whether + return stridx(l:search_value, l:search_flag) > -1 + +endfunction + +" Internal function to do the toggling +function! s:Toggle(option, flag, local) + + " Check for spurious option strings, we don't want to :execute anything funny + if a:option =~# '\m\L' + call s:Error('Illegal option name') + return 0 + endif + + " Check the option actually exists + if !exists('&' . a:option) + call s:Error('No such option: ' . a:option) + return 0 + endif + + " Choose which set command to use + let l:set = a:local + \ ? 'setlocal' + \ : 'set' + + " Find whether the flag is set before the change + let l:before = s:Has(a:option, a:flag) + " Assign -= or += as the operation to run based on whether the flag already " appears in the option value or not - let l:operation = stridx(l:search_current, l:search_flag) > -1 + let l:operation = l:before \ ? '-=' \ : '+=' - " Build the command strings to set and then show the value - let l:cmd_set = l:set . ' ' . a:option . l:operation . escape(a:flag, '\ ') - let l:cmd_show = l:set . ' ' . a:option . '?' + " Try to set the option; suppress errors, we'll check our work + silent! execute l:set + \ . ' ' + \ . a:option . l:operation . escape(a:flag, '\ ') + + " Find whether the flag is set after the change + let l:after = s:Has(a:option, a:flag) + + " If we made a difference, report the new value; if we didn't, admit it + if l:before != l:after + execute l:set . ' ' . a:option . '?' + else + call s:Error('Unable to toggle '.a:option.' flag '.a:flag) + endif - " Run the set and show command strings - execute l:cmd_set - execute l:cmd_show + " Return value is whether we made a change + return l:before != l:after endfunction diff --git a/vim/plugin/user_ftplugin.vim b/vim/plugin/user_ftplugin.vim new file mode 100644 index 00000000..d9739bda --- /dev/null +++ b/vim/plugin/user_ftplugin.vim @@ -0,0 +1,24 @@ +" +" user_ftplugin.vim: When switching filetypes, look for a b:undo_user_ftplugin +" variable and use it in much the same way the core's ftplugin.vim does +" b:undo_ftplugin in Vim >= 7.0. This allows you to undo your own ftplugin +" files the same way you can the core ones. +" +if exists('g:loaded_user_ftplugin') + \ || !has('autocmd') + \ || &compatible + finish +endif +let g:loaded_user_ftplugin = 1 + +function! s:LoadUserFtplugin() + if exists('b:undo_user_ftplugin') + execute b:undo_user_ftplugin + unlet b:undo_user_ftplugin + endif +endfunction + +augroup user_ftplugin + autocmd! + autocmd FileType * call s:LoadUserFtplugin() +augroup END diff --git a/vim/plugin/user_indent.vim b/vim/plugin/user_indent.vim new file mode 100644 index 00000000..01596bdb --- /dev/null +++ b/vim/plugin/user_indent.vim @@ -0,0 +1,24 @@ +" +" user_indent.vim: When switching filetypes, look for a b:undo_user_indent +" variable and use it in much the same way the core's indent.vim does +" b:undo_indent in Vim >= 7.0. This allows you to undo your own indent files +" the same way you can the core ones. +" +if exists('g:loaded_user_indent') + \ || !has('autocmd') + \ || &compatible + finish +endif +let g:loaded_user_indent = 1 + +function! s:LoadUserIndent() + if exists('b:undo_user_indent') + execute b:undo_user_indent + unlet b:undo_user_indent + endif +endfunction + +augroup user_indent + autocmd! + autocmd FileType * call s:LoadUserIndent() +augroup END |