diff options
author | Kevin Le <solnovus@gmail.com> | 2011-01-18 21:52:24 -0800 |
---|---|---|
committer | Kevin Le <solnovus@gmail.com> | 2011-01-18 21:52:24 -0800 |
commit | 97c3920b1c16fbdd55584e848d690b92c096c176 (patch) | |
tree | 60154558c9328bfca3dc90db02f6fd22c1053145 | |
parent | 0fa98e59725836cb79d60150e3b7a989a907a661 (diff) |
removed vimball, added vim files
-rw-r--r-- | autoload/camelcasemotion.vim | 173 | ||||
-rw-r--r-- | camelcasemotion.vba | 569 | ||||
-rw-r--r-- | doc/camelcasemotion.txt | 183 | ||||
-rw-r--r-- | plugin/camelcasemotion.vim | 204 |
4 files changed, 560 insertions, 569 deletions
diff --git a/autoload/camelcasemotion.vim b/autoload/camelcasemotion.vim new file mode 100644 index 0000000..41e26c9 --- /dev/null +++ b/autoload/camelcasemotion.vim @@ -0,0 +1,173 @@ +" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. +" +" DEPENDENCIES: +" - Requires Vim 7.0 or higher. +" +" Copyright: (C) 2007-2009 by Ingo Karkat +" The VIM LICENSE applies to this script; see ':help copyright'. +" +" Maintainer: Ingo Karkat <ingo@karkat.de> +" REVISION DATE REMARKS +" 1.50.001 05-May-2009 Do not create mappings for select mode; +" according to|Select-mode|, printable character +" commands should delete the selection and insert +" the typed characters. +" Moved functions from plugin to separate autoload +" script. +" file creation + +"- functions ------------------------------------------------------------------" +function! s:Move( direction, count, mode ) + " Note: There is no inversion of the regular expression character class + " 'keyword character' (\k). We need an inversion "non-keyword" defined as + " "any non-whitespace character that is not a keyword character" (e.g. + " [!@#$%^&*()]). This can be specified via a non-whitespace character in + " whose place no keyword character matches (\k\@!\S). + + "echo "count is " . a:count + let l:i = 0 + while l:i < a:count + if a:direction == 'e' + " "Forward to end" motion. + "call search( '\>\|\(\a\|\d\)\+\ze_', 'We' ) + " end of ... + " number | ACRONYM followed by CamelCase or number | CamelCase | underscore_notation | non-keyword | word + call search( '\d\+\|\u\+\ze\%(\u\l\|\d\)\|\u\l\+\|\%(\a\|\d\)\+\ze_\|\%(\k\@!\S\)\+\|\%(_\@!\k\)\+\>', 'We' ) + " Note: word must be defined as '\k\>'; '\>' on its own somehow + " dominates over the previous branch. Plus, \k must exclude the + " underscore, or a trailing one will be incorrectly moved over: + " '\%(_\@!\k\)'. + if a:mode == 'o' + " Note: Special additional treatment for operator-pending mode + " "forward to end" motion. + " The difference between normal mode, operator-pending and visual + " mode is that in the latter two, the motion must go _past_ the + " final "word" character, so that all characters of the "word" are + " selected. This is done by appending a 'l' motion after the + " search for the next "word". + " + " In operator-pending mode, the 'l' motion only works properly + " at the end of the line (i.e. when the moved-over "word" is at + " the end of the line) when the 'l' motion is allowed to move + " over to the next line. Thus, the 'l' motion is added + " temporarily to the global 'whichwrap' setting. + " Without this, the motion would leave out the last character in + " the line. I've also experimented with temporarily setting + " "set virtualedit=onemore" , but that didn't work. + let l:save_ww = &whichwrap + set whichwrap+=l + normal! l + let &whichwrap = l:save_ww + endif + else + " Forward (a:direction == '') and backward (a:direction == 'b') + " motion. + + let l:direction = (a:direction == 'w' ? '' : a:direction) + + " CamelCase: Jump to beginning of either (start of word, Word, WORD, + " 123). + " Underscore_notation: Jump to the beginning of an underscore-separated + " word or number. + "call search( '\<\|\u', 'W' . l:direction ) + "call search( '\<\|\u\(\l\+\|\u\+\ze\u\)\|\d\+', 'W' . l:direction ) + "call search( '\<\|\u\(\l\+\|\u\+\ze\u\)\|\d\+\|_\zs\(\a\|\d\)\+', 'W' . l:direction ) + " beginning of ... + " word | empty line | non-keyword after whitespaces | non-whitespace after word | number | ACRONYM followed by CamelCase or number | CamelCase | underscore followed by ACRONYM, Camel, lowercase or number + call search( '\<\D\|^$\|\%(^\|\s\)\+\zs\k\@!\S\|\>\S\|\d\+\|\u\+\ze\%(\u\l\|\d\)\|\u\l\+\|_\zs\%(\u\+\|\u\l\+\|\l\+\|\d\+\)', 'W' . l:direction ) + " Note: word must be defined as '\<\D' to avoid that a word like + " 1234Test is moved over as [1][2]34[T]est instead of [1]234[T]est + " because \< matches with zero width, and \d\+ will then start + " matching '234'. To fix that, we make \d\+ be solely responsible + " for numbers by taken this away from \< via \<\D. (An alternative + " would be to replace \d\+ with \D\%#\zs\d\+, but that one is more + " complex.) All other branches are not affected, because they match + " multiple characters and not the same character multiple times. + endif + let l:i = l:i + 1 + endwhile +endfunction + +function! camelcasemotion#Motion( direction, count, mode ) +"******************************************************************************* +"* PURPOSE: +" Perform the motion over CamelCaseWords or underscore_notation. +"* ASSUMPTIONS / PRECONDITIONS: +" none +"* EFFECTS / POSTCONDITIONS: +" Move cursor / change selection. +"* INPUTS: +" a:direction one of 'w', 'b', 'e' +" a:count number of "words" to move over +" a:mode one of 'n', 'o', 'v', 'iv' (latter one is a special visual mode +" when inside the inner "word" text objects. +"* RETURN VALUES: +" none +"******************************************************************************* + " Visual mode needs special preparations and postprocessing; + " normal and operator-pending mode breeze through to s:Move(). + + if a:mode == 'v' + " Visual mode was left when calling this function. Reselecting the current + " selection returns to visual mode and allows to call search() and issue + " normal mode motions while staying in visual mode. + normal! gv + endif + if a:mode == 'v' || a:mode == 'iv' + + " Note_1a: + if &selection != 'exclusive' && a:direction == 'w' + normal! l + endif + endif + + call s:Move( a:direction, a:count, a:mode ) + + if a:mode == 'v' || a:mode == 'iv' + " Note: 'selection' setting. + if &selection == 'exclusive' && a:direction == 'e' + " When set to 'exclusive', the "forward to end" motion (',e') does not + " include the last character of the moved-over "word". To include that, an + " additional 'l' motion is appended to the motion; similar to the + " special treatment in operator-pending mode. + normal! l + elseif &selection != 'exclusive' && a:direction != 'e' + " Note_1b: + " The forward and backward motions move to the beginning of the next "word". + " When 'selection' is set to 'inclusive' or 'old', this is one character too far. + " The appended 'h' motion undoes this. Because of this backward step, + " though, the forward motion finds the current "word" again, and would + " be stuck on the current "word". An 'l' motion before the CamelCase + " motion (see Note_1a) fixes that. + normal! h + endif + endif +endfunction + +function! camelcasemotion#InnerMotion( direction, count ) + " If the cursor is positioned on the first character of a CamelWord, the + " backward motion would move to the previous word, which would result in a + " wrong selection. To fix this, first move the cursor to the right, so that + " the backward motion definitely will cover the current "word" under the + " cursor. + normal! l + + " Move "word" backwards, enter visual mode, then move "word" forward. This + " selects the inner "word" in visual mode; the operator-pending mode takes + " this selection as the area covered by the motion. + if a:direction == 'b' + " Do not do the selection backwards, because the backwards "word" motion + " in visual mode + selection=inclusive has an off-by-one error. + call camelcasemotion#Motion( 'b', a:count, 'n' ) + normal! v + " We decree that 'b' is the opposite of 'e', not 'w'. This makes more + " sense at the end of a line and for underscore_notation. + call camelcasemotion#Motion( 'e', a:count, 'iv' ) + else + call camelcasemotion#Motion( 'b', 1, 'n' ) + normal! v + call camelcasemotion#Motion( a:direction, a:count, 'iv' ) + endif +endfunction + +" vim: set sts=4 sw=4 noexpandtab ff=unix fdm=syntax : diff --git a/camelcasemotion.vba b/camelcasemotion.vba deleted file mode 100644 index 748166a..0000000 --- a/camelcasemotion.vba +++ /dev/null @@ -1,569 +0,0 @@ -" Vimball Archiver by Charles E. Campbell, Jr., Ph.D. -UseVimball -finish -autoload/camelcasemotion.vim [[[1 -173 -" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. -" -" DEPENDENCIES: -" - Requires Vim 7.0 or higher. -" -" Copyright: (C) 2007-2009 by Ingo Karkat -" The VIM LICENSE applies to this script; see ':help copyright'. -" -" Maintainer: Ingo Karkat <ingo@karkat.de> -" REVISION DATE REMARKS -" 1.50.001 05-May-2009 Do not create mappings for select mode; -" according to|Select-mode|, printable character -" commands should delete the selection and insert -" the typed characters. -" Moved functions from plugin to separate autoload -" script. -" file creation - -"- functions ------------------------------------------------------------------" -function! s:Move( direction, count, mode ) - " Note: There is no inversion of the regular expression character class - " 'keyword character' (\k). We need an inversion "non-keyword" defined as - " "any non-whitespace character that is not a keyword character" (e.g. - " [!@#$%^&*()]). This can be specified via a non-whitespace character in - " whose place no keyword character matches (\k\@!\S). - - "echo "count is " . a:count - let l:i = 0 - while l:i < a:count - if a:direction == 'e' - " "Forward to end" motion. - "call search( '\>\|\(\a\|\d\)\+\ze_', 'We' ) - " end of ... - " number | ACRONYM followed by CamelCase or number | CamelCase | underscore_notation | non-keyword | word - call search( '\d\+\|\u\+\ze\%(\u\l\|\d\)\|\u\l\+\|\%(\a\|\d\)\+\ze_\|\%(\k\@!\S\)\+\|\%(_\@!\k\)\+\>', 'We' ) - " Note: word must be defined as '\k\>'; '\>' on its own somehow - " dominates over the previous branch. Plus, \k must exclude the - " underscore, or a trailing one will be incorrectly moved over: - " '\%(_\@!\k\)'. - if a:mode == 'o' - " Note: Special additional treatment for operator-pending mode - " "forward to end" motion. - " The difference between normal mode, operator-pending and visual - " mode is that in the latter two, the motion must go _past_ the - " final "word" character, so that all characters of the "word" are - " selected. This is done by appending a 'l' motion after the - " search for the next "word". - " - " In operator-pending mode, the 'l' motion only works properly - " at the end of the line (i.e. when the moved-over "word" is at - " the end of the line) when the 'l' motion is allowed to move - " over to the next line. Thus, the 'l' motion is added - " temporarily to the global 'whichwrap' setting. - " Without this, the motion would leave out the last character in - " the line. I've also experimented with temporarily setting - " "set virtualedit=onemore" , but that didn't work. - let l:save_ww = &whichwrap - set whichwrap+=l - normal! l - let &whichwrap = l:save_ww - endif - else - " Forward (a:direction == '') and backward (a:direction == 'b') - " motion. - - let l:direction = (a:direction == 'w' ? '' : a:direction) - - " CamelCase: Jump to beginning of either (start of word, Word, WORD, - " 123). - " Underscore_notation: Jump to the beginning of an underscore-separated - " word or number. - "call search( '\<\|\u', 'W' . l:direction ) - "call search( '\<\|\u\(\l\+\|\u\+\ze\u\)\|\d\+', 'W' . l:direction ) - "call search( '\<\|\u\(\l\+\|\u\+\ze\u\)\|\d\+\|_\zs\(\a\|\d\)\+', 'W' . l:direction ) - " beginning of ... - " word | empty line | non-keyword after whitespaces | non-whitespace after word | number | ACRONYM followed by CamelCase or number | CamelCase | underscore followed by ACRONYM, Camel, lowercase or number - call search( '\<\D\|^$\|\%(^\|\s\)\+\zs\k\@!\S\|\>\S\|\d\+\|\u\+\ze\%(\u\l\|\d\)\|\u\l\+\|_\zs\%(\u\+\|\u\l\+\|\l\+\|\d\+\)', 'W' . l:direction ) - " Note: word must be defined as '\<\D' to avoid that a word like - " 1234Test is moved over as [1][2]34[T]est instead of [1]234[T]est - " because \< matches with zero width, and \d\+ will then start - " matching '234'. To fix that, we make \d\+ be solely responsible - " for numbers by taken this away from \< via \<\D. (An alternative - " would be to replace \d\+ with \D\%#\zs\d\+, but that one is more - " complex.) All other branches are not affected, because they match - " multiple characters and not the same character multiple times. - endif - let l:i = l:i + 1 - endwhile -endfunction - -function! camelcasemotion#Motion( direction, count, mode ) -"******************************************************************************* -"* PURPOSE: -" Perform the motion over CamelCaseWords or underscore_notation. -"* ASSUMPTIONS / PRECONDITIONS: -" none -"* EFFECTS / POSTCONDITIONS: -" Move cursor / change selection. -"* INPUTS: -" a:direction one of 'w', 'b', 'e' -" a:count number of "words" to move over -" a:mode one of 'n', 'o', 'v', 'iv' (latter one is a special visual mode -" when inside the inner "word" text objects. -"* RETURN VALUES: -" none -"******************************************************************************* - " Visual mode needs special preparations and postprocessing; - " normal and operator-pending mode breeze through to s:Move(). - - if a:mode == 'v' - " Visual mode was left when calling this function. Reselecting the current - " selection returns to visual mode and allows to call search() and issue - " normal mode motions while staying in visual mode. - normal! gv - endif - if a:mode == 'v' || a:mode == 'iv' - - " Note_1a: - if &selection != 'exclusive' && a:direction == 'w' - normal! l - endif - endif - - call s:Move( a:direction, a:count, a:mode ) - - if a:mode == 'v' || a:mode == 'iv' - " Note: 'selection' setting. - if &selection == 'exclusive' && a:direction == 'e' - " When set to 'exclusive', the "forward to end" motion (',e') does not - " include the last character of the moved-over "word". To include that, an - " additional 'l' motion is appended to the motion; similar to the - " special treatment in operator-pending mode. - normal! l - elseif &selection != 'exclusive' && a:direction != 'e' - " Note_1b: - " The forward and backward motions move to the beginning of the next "word". - " When 'selection' is set to 'inclusive' or 'old', this is one character too far. - " The appended 'h' motion undoes this. Because of this backward step, - " though, the forward motion finds the current "word" again, and would - " be stuck on the current "word". An 'l' motion before the CamelCase - " motion (see Note_1a) fixes that. - normal! h - endif - endif -endfunction - -function! camelcasemotion#InnerMotion( direction, count ) - " If the cursor is positioned on the first character of a CamelWord, the - " backward motion would move to the previous word, which would result in a - " wrong selection. To fix this, first move the cursor to the right, so that - " the backward motion definitely will cover the current "word" under the - " cursor. - normal! l - - " Move "word" backwards, enter visual mode, then move "word" forward. This - " selects the inner "word" in visual mode; the operator-pending mode takes - " this selection as the area covered by the motion. - if a:direction == 'b' - " Do not do the selection backwards, because the backwards "word" motion - " in visual mode + selection=inclusive has an off-by-one error. - call camelcasemotion#Motion( 'b', a:count, 'n' ) - normal! v - " We decree that 'b' is the opposite of 'e', not 'w'. This makes more - " sense at the end of a line and for underscore_notation. - call camelcasemotion#Motion( 'e', a:count, 'iv' ) - else - call camelcasemotion#Motion( 'b', 1, 'n' ) - normal! v - call camelcasemotion#Motion( a:direction, a:count, 'iv' ) - endif -endfunction - -" vim: set sts=4 sw=4 noexpandtab ff=unix fdm=syntax : -plugin/camelcasemotion.vim [[[1 -204 -" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. -" -" DEPENDENCIES: -" - Requires Vim 7.0 or higher. -" -" Copyright: (C) 2007-2009 by Ingo Karkat -" The VIM LICENSE applies to this script; see ':help copyright'. -" -" Source: Based on vimtip #1016 by Anthony Van Ham. -" Maintainer: Ingo Karkat <ingo@karkat.de> -" REVISION DATE REMARKS -" 1.50.019 05-May-2009 Do not create mappings for select mode; -" according to|Select-mode|, printable character -" commands should delete the selection and insert -" the typed characters. -" Moved functions from plugin to separate autoload -" script. -" Split off documentation into separate help file. -" Now cleaning up Create...Mappings functions. -" 1.40.018 30-Jun-2008 Minor: Removed unnecessary <script> from -" mappings. -" 1.40.017 19-May-2008 BF: Now using :normal! to be independent from -" any user mappings. Thanks to Neil Walker for the -" patch. -" 1.40.016 28-Apr-2008 BF: Wrong forward motion stop at the second -" digit if a word starts with multiple numbers -" (e.g. 1234.56789). Thanks to Wasim Ahmed for -" reporting this. -" 1.40.015 24-Apr-2008 ENH: Added inner "word" text objects 'i,w' etc. -" that work analogous to the built-in 'iw' text -" object. Thanks to David Kotchan for this -" suggestion. -" 1.30.014 20-Apr-2008 The motions now also stop at non-keyword -" boundaries, just like the regular motions. This -" has no effect inside a CamelCaseWord or inside -" underscore_notation, but it makes the motions -" behave like the regular motions (which is -" important if you replace the default motions). -" Thanks to Mun Johl for reporting this. -" Now using non-capturing parentheses \%() in the -" patterns. -" 1.30.013 09-Apr-2008 Refactored away s:VisualCamelCaseMotion(). -" Allowing users to use mappings different than -" ,w ,b ,e by defining <Plug>CamelCaseMotion_? -" target mappings. This can even be used to -" replace the default 'w', 'b' and 'e' mappings, -" as suggested by Mun Johl. -" Mappings are now created in a generic function. -" Now requires Vim 7.0 or higher. -" 1.20.012 02-Jun-2007 BF: Corrected motions through mixed -" CamelCase_and_UnderScore words by re-ordering -" and narrowing the search patterns. -" 1.20.011 02-Jun-2007 Thanks again to Joseph Barker for discussing the -" complicated visual mode mapping on the vim-dev -" mailing list and coming up with a great -" simplification: -" Removed s:CheckForChangesToTheSelectionSetting(). -" Introduced s:VisualCamelCaseMotion(), which -" handles the differences depending on the -" 'selection' setting. -" Visual mode mappings now directly map to the -" s:VisualCamelCaseMotion() function; no mark is -" clobbered, the complex mapping with the inline -" expression has been retired. -" 1.20.010 29-May-2007 BF: The operator-pending and visual mode ,e -" mapping doesn't work properly when it reaches -" the end of line; the final character of the -" moved-over "word" remains. Fixed this problem -" unless the "word" is at the very end of the -" buffer. -" ENH: The visual mode motions now also (mostly) -" work with the (default) setting -" 'set selection=inclusive', instead of selecting -" one character too much. -" ENH: All mappings will check for changes to the -" 'selection' setting and remap the visual mode -" mappings via function -" s:SetupVisualModeMappings(). We cannot rely on -" the setting while sourcing camelcasemotion.vim -" because the mswin.vim script may be sourced -" afterwards, and its 'behave mswin' changes -" 'selection'. -" Refactored the arguments of function -" s:CamelCaseMotion(...). -" 1.10.009 28-May-2007 BF: Degenerate CamelCaseWords that consist of -" only a single uppercase letter (e.g. "P" in -" "MapPRoblem") are skipped by all motions. Thanks -" to Joseph Barker for reporting this. -" BF: In CamelCaseWords that consist of uppercase -" letters followed by decimals (e.g. -" "MyUPPER123Problem", the uppercase "word" is -" skipped by all motions. -" 1.10.008 28-May-2007 Incorporated major improvements and -" simplifications done by Joseph Barker: -" Operator-pending and visual mode motions now -" accept [count] of more than 9. -" Visual selections can now be extended from -" either end. -" Instead of misusing the :[range], the special -" variable v:count1 is used. Custom commands are -" not needed anymore. -" Operator-pending and visual mode mappings are -" now generic: There's only a single mapping for -" ,w that can be repeated, rather than having a -" separate mapping for 1,w 2,w 3,w ... -" 1.00.007 22-May-2007 Added documentation for publication. -" 006 20-May-2007 BF: visual mode [1,2,3],e on pure CamelCase -" mistakenly marks [2,4,6] words. If the cursor is -" on a uppercase letter, the search pattern -" '\u\l\+' doesn't match at the cursor position, -" so another match won. Changed search pattern -" from '\l\+', -" 005 16-May-2007 Added support for underscore notation. -" Added support for "forward to end of word" -" (',e') motion. -" 004 16-May-2007 Improved search pattern so that -" UppercaseWORDSInBetween and digits are handled, -" too. -" 003 15-May-2007 Changed mappings from <Leader>w to ,w; -" other \w mappings interfere here, because it's -" irritating when the cursor jump doesn't happen -" immediately, because Vim waits whether the -" mapping is complete. ,w is faster to type that -" \w (and, because of the left-right touch, -" preferred over gw). -" Added visual mode mappings. -" 0.02 15-Feb-2006 BF: missing <SID> for omaps. -" 0.01 11-Oct-2005 file creation - -" Avoid installing twice or when in compatible mode -if exists('g:loaded_camelcasemotion') || (v:version < 700) - finish -endif -let g:loaded_camelcasemotion = 1 - -"- mappings ------------------------------------------------------------------- -" The count is passed into the function through the special variable 'v:count1', -" which is easier than misusing the :[range] that :call supports. -" <C-U> is used to delete the unused range. -" Another option would be to use a custom 'command! -count=1', but that doesn't -" work with the normal mode mapping: When a count is typed before the mapping, -" the ':' will convert a count of 3 into ':.,+2MyCommand', but ':3MyCommand' -" would be required to use -count and <count>. -" -" We do not provide the fourth "backward to end" motion (,E), because it is -" seldomly used. - -function! s:CreateMotionMappings() - " Create mappings according to this template: - " (* stands for the mode [nov], ? for the underlying motion [wbe].) - " - " *noremap <Plug>CamelCaseMotion_? :<C-U>call camelcasemotion#Motion('?',v:count1,'*')<CR> - " if ! hasmapto('<Plug>CamelCaseMotion_?', '*') - " *map <silent> ,? <Plug>CamelCaseMotion_? - " endif - - for l:mode in ['n', 'o', 'v'] - for l:motion in ['w', 'b', 'e'] - let l:targetMapping = '<Plug>CamelCaseMotion_' . l:motion - execute l:mode . 'noremap ' . l:targetMapping . ' :<C-U>call camelcasemotion#Motion(''' . l:motion . ''',v:count1,''' . l:mode . ''')<CR>' - if ! hasmapto(l:targetMapping, l:mode) - execute (l:mode ==# 'v' ? 'x' : l:mode) . 'map <silent> ,' . l:motion . ' ' . l:targetMapping - endif - endfor - endfor -endfunction - -" To create a text motion, a mapping for operator-pending mode needs to be -" defined. This mapping should move the cursor according to the implemented -" motion, or mark the covered text via a visual selection. As inner text motions -" need to mark both to the left and right of the cursor position, the visual -" selection needs to be used. -" -" Vim's built-in inner text objects also work in visual mode; they have -" different behavior depending on whether visual mode has just been entered or -" whether text has already been selected. -" We deviate from that and always override the existing selection. -function! s:CreateInnerMotionMappings() - " Create mappings according to this template: - " (* stands for the mode [ov], ? for the underlying motion [wbe].) - " - " *noremap <Plug>CamelCaseMotion_i? :<C-U>call camelcasemotion#InnerMotion('?',v:count1)<CR> - " if ! hasmapto('<Plug>CamelCaseInnerMotion_i?', '*') - " *map <silent> i,? <Plug>CamelCaseInnerMotion_i? - " endif - - for l:mode in ['o', 'v'] - for l:motion in ['w', 'b', 'e'] - let l:targetMapping = '<Plug>CamelCaseMotion_i' . l:motion - execute l:mode . 'noremap ' . l:targetMapping . ' :<C-U>call camelcasemotion#InnerMotion(''' . l:motion . ''',v:count1)<CR>' - if ! hasmapto(l:targetMapping, l:mode) - execute (l:mode ==# 'v' ? 'x' : l:mode) . 'map <silent> i,' . l:motion . ' ' . l:targetMapping - endif - endfor - endfor -endfunction - -call s:CreateMotionMappings() -call s:CreateInnerMotionMappings() - -delfunction s:CreateMotionMappings -delfunction s:CreateInnerMotionMappings - -" vim: set sts=4 sw=4 noexpandtab ff=unix fdm=syntax : -doc/camelcasemotion.txt [[[1 -183 -*camelcasemotion.txt* Motion through CamelCaseWords and underscore_notation. - - CAMEL CASE MOTION by Ingo Karkat - *camelcasemotion.vim* -description |camelcasemotion-description| -usage |camelcasemotion-usage| -installation |camelcasemotion-installation| -configuration |camelcasemotion-configuration| -known problems |camelcasemotion-known-problems| -todo |camelcasemotion-todo| -history |camelcasemotion-history| - -============================================================================== -DESCRIPTION *camelcasemotion-description* - -Vim provides many built-in motions, e.g. to move to the next word, or end of -the current word. Most programming languages use either CamelCase -("anIdentifier") or underscore_notation ("an_identifier") naming conventions -for identifiers. The best way to navigate inside those identifiers using Vim -built-in motions is the [count]f{char} motion, i.e. f{uppercase-char} or f_, -respectively. But we can make this easier: - -This script defines motions|,w|,|,b| and|,e|(similar to |w|,|b|,|e|), which do -not move word-wise (forward/backward), but Camel-wise; i.e. to word boundaries -and uppercase letters. The motions also work on underscore notation, where -words are delimited by underscore ('_') characters. From here on, both -CamelCase and underscore_notation entities are referred to as "words" (in -double quotes). Just like with the regular motions, a [count] can be prepended -to move over multiple "words" at once. Outside of "words" (e.g. in non-keyword -characters like // or ;), the new motions move just like the regular motions. - -Vim provides a built-in|iw|text object called 'inner word', which works in -operator-pending and visual mode. Analog to that, this script defines inner -"word" motions |i,w|,|i,b| and|i,e|, which select the "word" (or multiple -"words" if a [count] is given) where the cursor is located. - -============================================================================== -USAGE *camelcasemotion-usage* - *,w* *,b* *,e* -Use the new motions|,w|,|,b| and|,e| in normal mode, operator-pending mode -(cp.|operator|), and visual mode. For example, type 'bc,w' to change 'Camel' -in 'CamelCase' to something else. - - -EXAMPLE: motions -Given the following CamelCase identifiers in a source code fragment: - set Script31337PathAndNameWithoutExtension11=%~dpn0 ~ - set Script31337PathANDNameWITHOUTExtension11=%~dpn0 ~ -and the corresponding identifiers in underscore_notation: - set script_31337_path_and_name_without_extension_11=%~dpn0 ~ - set SCRIPT_31337_PATH_AND_NAME_WITHOUT_EXTENSION_11=%~dpn0 ~ - -,w moves to ([x] is cursor position): [s]et, [s]cript, [3]1337, [p]ath, - [a]nd, [n]ame, [w]ithout, [e]xtension, [1]1, [d]pn0, dpn[0], [s]et -,b moves to: [d]pn0, [1]1, [e]xtension, [w]ithout, ... -,e moves to: se[t], scrip[t], 3133[7], pat[h], an[d], nam[e], withou[t], - extensio[n], 1[1], dpn[0] - - -EXAMPLE: inner motions -Given the following identifier, with the cursor positioned at [x]: - script_31337_path_and_na[m]e_without_extension_11 ~ - -v3i,w selects script_31337_path_and_[name_without_extension_]11 -v3i,b selects script_31337_[path_and_name]_without_extension_11 -v3i,e selects script_31337_path_and_[name_without_extension]_11 -Instead of visual mode, you can also use c3i,w to change, d3i,w to delete, -gU3i,w to upper-case, and so on. - -============================================================================== -INSTALLATION *camelcasemotion-installation* - -This script is packaged as a|vimball|. If you have the "gunzip" decompressor -in your PATH, simply edit the *.vba.gz package in Vim; otherwise, decompress -the archive first, e.g. using WinZip. Inside Vim, install by sourcing the -vimball or via the|:UseVimball|command. > - vim camelcasemotion.vba.gz - :so % -To uninstall, use the|:RmVimball|command. - -DEPENDENCIES *camelcasemotion-dependencies* - -- Requires Vim 7.0 or higher. - -============================================================================== -CONFIGURATION *camelcasemotion-configuration* - -If you want to use different mappings, map your keys to the -<Plug>CamelCaseMotion_? mapping targets _before_ sourcing this script (e.g. in -your|vimrc|). - -EXAMPLE: Replace the default|w|,|b| and|e| mappings instead of defining -additional mappings|,w|,|,b| and|,e|: > - map <silent> w <Plug>CamelCaseMotion_w - map <silent> b <Plug>CamelCaseMotion_b - map <silent> e <Plug>CamelCaseMotion_e - sunmap w - sunmap b - sunmap e - -EXAMPLE: Replace default|iw|text-object and define|ib|and |ie|motions: > - omap <silent> iw <Plug>CamelCaseMotion_iw - xmap <silent> iw <Plug>CamelCaseMotion_iw - omap <silent> ib <Plug>CamelCaseMotion_ib - xmap <silent> ib <Plug>CamelCaseMotion_ib - omap <silent> ie <Plug>CamelCaseMotion_ie - xmap <silent> ie <Plug>CamelCaseMotion_ie - -============================================================================== -KNOWN PROBLEMS *camelcasemotion-known-problems* - -- A degenerate CamelCaseWord containing '\U\u\d' (e.g. "MaP1Roblem") confuses - the operator-pending and visual mode ,e mapping if 'selection' is not set to - "exclusive". It'll skip "P" and select "P1" in one step. As a workaround, - use ',w' instead of ',e'; those two mappings have the same effect inside - CamelCaseWords, anyway. -- The operator-pending and visual mode ,e mapping doesn't work properly when - it reaches the end of the buffer; the final character of the moved-over - "word" remains. As a workaround, use the default 'e' motion instead of ',e'. -- When the Vim setting 'selection' is not set to "exclusive", a - forward-backward combination in visual mode (e.g. 'v,w,b') selects one - additional character to the left, instead of only the character where the - motion started. Likewise, extension of the visual selection from the front - end is off by one additional character. - -============================================================================== -TODO *camelcasemotion-todo* - -============================================================================== -HISTORY *camelcasemotion-history* - -1.50 05-May-2009 -- Do not create mappings for select mode; according to|Select-mode|, printable - character commands should delete the selection and insert the typed - characters. Now using :xmap to only target visual mode. -- Moved functions from plugin to separate autoload script. -- Split off documentation into separate help file. - -1.40 30-Jun-2008 -BF: Now using :normal! to be independent from any user mappings. Thanks to -Neil Walker for the patch. - -1.40 19-May-2008 -BF: Wrong forward motion stop at the second digit if a word starts with -multiple numbers (e.g. 1234.56789). Thanks to Wasim Ahmed for reporting this. - -1.40 24-Apr-2008 -ENH: Added inner "word" text objects 'i,w' etc. that work analoguous to the -built-in |iw| text object. Thanks to David Kotchan for this suggestion. - -1.30 20-Apr-2008 -The motions now also stop at non-keyword boundaries, just like the regular -motions. This has no effect inside a CamelCaseWord or inside -underscore_notation, but it makes the motions behave like the regular motions -(which is important if you replace the default motions). Thanks to Mun Johl -for reporting this. - -1.30 09-Apr-2008 -- Allowing users to use mappings different than ,w ,b ,e by defining - <Plug>CamelCaseMotion_? target mappings. This can even be used to replace - the default 'w', 'b' and 'e' mappings, as suggested by Mun Johl. -- Now requires VIM 7.0 or higher. - -1.20 29-May-2007 -ENH: The visual mode motions now also (mostly) work with the (default) setting -'set selection=inclusive', instead of selecting one character too much. - -1.10 28-May-2007 -Incorporated major improvements and simplifications done by Joseph Barker. - -1.00 22-May-2007 -First published version. - -0.01 11-Oct-2005 -Started development based on vimtip #1016 by Anthony Van Ham. - -============================================================================== -Copyright: (C) 2007-2009 by Ingo Karkat -The VIM LICENSE applies to this script; see|copyright|. - -Maintainer: Ingo Karkat <ingo@karkat.de> -============================================================================== - vim:tw=78:ts=8:ft=help:norl: diff --git a/doc/camelcasemotion.txt b/doc/camelcasemotion.txt new file mode 100644 index 0000000..4fdf612 --- /dev/null +++ b/doc/camelcasemotion.txt @@ -0,0 +1,183 @@ +*camelcasemotion.txt* Motion through CamelCaseWords and underscore_notation. + + CAMEL CASE MOTION by Ingo Karkat + *camelcasemotion.vim* +description |camelcasemotion-description| +usage |camelcasemotion-usage| +installation |camelcasemotion-installation| +configuration |camelcasemotion-configuration| +known problems |camelcasemotion-known-problems| +todo |camelcasemotion-todo| +history |camelcasemotion-history| + +============================================================================== +DESCRIPTION *camelcasemotion-description* + +Vim provides many built-in motions, e.g. to move to the next word, or end of +the current word. Most programming languages use either CamelCase +("anIdentifier") or underscore_notation ("an_identifier") naming conventions +for identifiers. The best way to navigate inside those identifiers using Vim +built-in motions is the [count]f{char} motion, i.e. f{uppercase-char} or f_, +respectively. But we can make this easier: + +This script defines motions|,w|,|,b| and|,e|(similar to |w|,|b|,|e|), which do +not move word-wise (forward/backward), but Camel-wise; i.e. to word boundaries +and uppercase letters. The motions also work on underscore notation, where +words are delimited by underscore ('_') characters. From here on, both +CamelCase and underscore_notation entities are referred to as "words" (in +double quotes). Just like with the regular motions, a [count] can be prepended +to move over multiple "words" at once. Outside of "words" (e.g. in non-keyword +characters like // or ;), the new motions move just like the regular motions. + +Vim provides a built-in|iw|text object called 'inner word', which works in +operator-pending and visual mode. Analog to that, this script defines inner +"word" motions |i,w|,|i,b| and|i,e|, which select the "word" (or multiple +"words" if a [count] is given) where the cursor is located. + +============================================================================== +USAGE *camelcasemotion-usage* + *,w* *,b* *,e* +Use the new motions|,w|,|,b| and|,e| in normal mode, operator-pending mode +(cp.|operator|), and visual mode. For example, type 'bc,w' to change 'Camel' +in 'CamelCase' to something else. + + +EXAMPLE: motions +Given the following CamelCase identifiers in a source code fragment: + set Script31337PathAndNameWithoutExtension11=%~dpn0 ~ + set Script31337PathANDNameWITHOUTExtension11=%~dpn0 ~ +and the corresponding identifiers in underscore_notation: + set script_31337_path_and_name_without_extension_11=%~dpn0 ~ + set SCRIPT_31337_PATH_AND_NAME_WITHOUT_EXTENSION_11=%~dpn0 ~ + +,w moves to ([x] is cursor position): [s]et, [s]cript, [3]1337, [p]ath, + [a]nd, [n]ame, [w]ithout, [e]xtension, [1]1, [d]pn0, dpn[0], [s]et +,b moves to: [d]pn0, [1]1, [e]xtension, [w]ithout, ... +,e moves to: se[t], scrip[t], 3133[7], pat[h], an[d], nam[e], withou[t], + extensio[n], 1[1], dpn[0] + + +EXAMPLE: inner motions +Given the following identifier, with the cursor positioned at [x]: + script_31337_path_and_na[m]e_without_extension_11 ~ + +v3i,w selects script_31337_path_and_[name_without_extension_]11 +v3i,b selects script_31337_[path_and_name]_without_extension_11 +v3i,e selects script_31337_path_and_[name_without_extension]_11 +Instead of visual mode, you can also use c3i,w to change, d3i,w to delete, +gU3i,w to upper-case, and so on. + +============================================================================== +INSTALLATION *camelcasemotion-installation* + +This script is packaged as a|vimball|. If you have the "gunzip" decompressor +in your PATH, simply edit the *.vba.gz package in Vim; otherwise, decompress +the archive first, e.g. using WinZip. Inside Vim, install by sourcing the +vimball or via the|:UseVimball|command. > + vim camelcasemotion.vba.gz + :so % +To uninstall, use the|:RmVimball|command. + +DEPENDENCIES *camelcasemotion-dependencies* + +- Requires Vim 7.0 or higher. + +============================================================================== +CONFIGURATION *camelcasemotion-configuration* + +If you want to use different mappings, map your keys to the +<Plug>CamelCaseMotion_? mapping targets _before_ sourcing this script (e.g. in +your|vimrc|). + +EXAMPLE: Replace the default|w|,|b| and|e| mappings instead of defining +additional mappings|,w|,|,b| and|,e|: > + map <silent> w <Plug>CamelCaseMotion_w + map <silent> b <Plug>CamelCaseMotion_b + map <silent> e <Plug>CamelCaseMotion_e + sunmap w + sunmap b + sunmap e + +EXAMPLE: Replace default|iw|text-object and define|ib|and |ie|motions: > + omap <silent> iw <Plug>CamelCaseMotion_iw + xmap <silent> iw <Plug>CamelCaseMotion_iw + omap <silent> ib <Plug>CamelCaseMotion_ib + xmap <silent> ib <Plug>CamelCaseMotion_ib + omap <silent> ie <Plug>CamelCaseMotion_ie + xmap <silent> ie <Plug>CamelCaseMotion_ie + +============================================================================== +KNOWN PROBLEMS *camelcasemotion-known-problems* + +- A degenerate CamelCaseWord containing '\U\u\d' (e.g. "MaP1Roblem") confuses + the operator-pending and visual mode ,e mapping if 'selection' is not set to + "exclusive". It'll skip "P" and select "P1" in one step. As a workaround, + use ',w' instead of ',e'; those two mappings have the same effect inside + CamelCaseWords, anyway. +- The operator-pending and visual mode ,e mapping doesn't work properly when + it reaches the end of the buffer; the final character of the moved-over + "word" remains. As a workaround, use the default 'e' motion instead of ',e'. +- When the Vim setting 'selection' is not set to "exclusive", a + forward-backward combination in visual mode (e.g. 'v,w,b') selects one + additional character to the left, instead of only the character where the + motion started. Likewise, extension of the visual selection from the front + end is off by one additional character. + +============================================================================== +TODO *camelcasemotion-todo* + +============================================================================== +HISTORY *camelcasemotion-history* + +1.50 05-May-2009 +- Do not create mappings for select mode; according to|Select-mode|, printable + character commands should delete the selection and insert the typed + characters. Now using :xmap to only target visual mode. +- Moved functions from plugin to separate autoload script. +- Split off documentation into separate help file. + +1.40 30-Jun-2008 +BF: Now using :normal! to be independent from any user mappings. Thanks to +Neil Walker for the patch. + +1.40 19-May-2008 +BF: Wrong forward motion stop at the second digit if a word starts with +multiple numbers (e.g. 1234.56789). Thanks to Wasim Ahmed for reporting this. + +1.40 24-Apr-2008 +ENH: Added inner "word" text objects 'i,w' etc. that work analoguous to the +built-in |iw| text object. Thanks to David Kotchan for this suggestion. + +1.30 20-Apr-2008 +The motions now also stop at non-keyword boundaries, just like the regular +motions. This has no effect inside a CamelCaseWord or inside +underscore_notation, but it makes the motions behave like the regular motions +(which is important if you replace the default motions). Thanks to Mun Johl +for reporting this. + +1.30 09-Apr-2008 +- Allowing users to use mappings different than ,w ,b ,e by defining + <Plug>CamelCaseMotion_? target mappings. This can even be used to replace + the default 'w', 'b' and 'e' mappings, as suggested by Mun Johl. +- Now requires VIM 7.0 or higher. + +1.20 29-May-2007 +ENH: The visual mode motions now also (mostly) work with the (default) setting +'set selection=inclusive', instead of selecting one character too much. + +1.10 28-May-2007 +Incorporated major improvements and simplifications done by Joseph Barker. + +1.00 22-May-2007 +First published version. + +0.01 11-Oct-2005 +Started development based on vimtip #1016 by Anthony Van Ham. + +============================================================================== +Copyright: (C) 2007-2009 by Ingo Karkat +The VIM LICENSE applies to this script; see|copyright|. + +Maintainer: Ingo Karkat <ingo@karkat.de> +============================================================================== + vim:tw=78:ts=8:ft=help:norl: diff --git a/plugin/camelcasemotion.vim b/plugin/camelcasemotion.vim new file mode 100644 index 0000000..b996af2 --- /dev/null +++ b/plugin/camelcasemotion.vim @@ -0,0 +1,204 @@ +" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. +" +" DEPENDENCIES: +" - Requires Vim 7.0 or higher. +" +" Copyright: (C) 2007-2009 by Ingo Karkat +" The VIM LICENSE applies to this script; see ':help copyright'. +" +" Source: Based on vimtip #1016 by Anthony Van Ham. +" Maintainer: Ingo Karkat <ingo@karkat.de> +" REVISION DATE REMARKS +" 1.50.019 05-May-2009 Do not create mappings for select mode; +" according to|Select-mode|, printable character +" commands should delete the selection and insert +" the typed characters. +" Moved functions from plugin to separate autoload +" script. +" Split off documentation into separate help file. +" Now cleaning up Create...Mappings functions. +" 1.40.018 30-Jun-2008 Minor: Removed unnecessary <script> from +" mappings. +" 1.40.017 19-May-2008 BF: Now using :normal! to be independent from +" any user mappings. Thanks to Neil Walker for the +" patch. +" 1.40.016 28-Apr-2008 BF: Wrong forward motion stop at the second +" digit if a word starts with multiple numbers +" (e.g. 1234.56789). Thanks to Wasim Ahmed for +" reporting this. +" 1.40.015 24-Apr-2008 ENH: Added inner "word" text objects 'i,w' etc. +" that work analogous to the built-in 'iw' text +" object. Thanks to David Kotchan for this +" suggestion. +" 1.30.014 20-Apr-2008 The motions now also stop at non-keyword +" boundaries, just like the regular motions. This +" has no effect inside a CamelCaseWord or inside +" underscore_notation, but it makes the motions +" behave like the regular motions (which is +" important if you replace the default motions). +" Thanks to Mun Johl for reporting this. +" Now using non-capturing parentheses \%() in the +" patterns. +" 1.30.013 09-Apr-2008 Refactored away s:VisualCamelCaseMotion(). +" Allowing users to use mappings different than +" ,w ,b ,e by defining <Plug>CamelCaseMotion_? +" target mappings. This can even be used to +" replace the default 'w', 'b' and 'e' mappings, +" as suggested by Mun Johl. +" Mappings are now created in a generic function. +" Now requires Vim 7.0 or higher. +" 1.20.012 02-Jun-2007 BF: Corrected motions through mixed +" CamelCase_and_UnderScore words by re-ordering +" and narrowing the search patterns. +" 1.20.011 02-Jun-2007 Thanks again to Joseph Barker for discussing the +" complicated visual mode mapping on the vim-dev +" mailing list and coming up with a great +" simplification: +" Removed s:CheckForChangesToTheSelectionSetting(). +" Introduced s:VisualCamelCaseMotion(), which +" handles the differences depending on the +" 'selection' setting. +" Visual mode mappings now directly map to the +" s:VisualCamelCaseMotion() function; no mark is +" clobbered, the complex mapping with the inline +" expression has been retired. +" 1.20.010 29-May-2007 BF: The operator-pending and visual mode ,e +" mapping doesn't work properly when it reaches +" the end of line; the final character of the +" moved-over "word" remains. Fixed this problem +" unless the "word" is at the very end of the +" buffer. +" ENH: The visual mode motions now also (mostly) +" work with the (default) setting +" 'set selection=inclusive', instead of selecting +" one character too much. +" ENH: All mappings will check for changes to the +" 'selection' setting and remap the visual mode +" mappings via function +" s:SetupVisualModeMappings(). We cannot rely on +" the setting while sourcing camelcasemotion.vim +" because the mswin.vim script may be sourced +" afterwards, and its 'behave mswin' changes +" 'selection'. +" Refactored the arguments of function +" s:CamelCaseMotion(...). +" 1.10.009 28-May-2007 BF: Degenerate CamelCaseWords that consist of +" only a single uppercase letter (e.g. "P" in +" "MapPRoblem") are skipped by all motions. Thanks +" to Joseph Barker for reporting this. +" BF: In CamelCaseWords that consist of uppercase +" letters followed by decimals (e.g. +" "MyUPPER123Problem", the uppercase "word" is +" skipped by all motions. +" 1.10.008 28-May-2007 Incorporated major improvements and +" simplifications done by Joseph Barker: +" Operator-pending and visual mode motions now +" accept [count] of more than 9. +" Visual selections can now be extended from +" either end. +" Instead of misusing the :[range], the special +" variable v:count1 is used. Custom commands are +" not needed anymore. +" Operator-pending and visual mode mappings are +" now generic: There's only a single mapping for +" ,w that can be repeated, rather than having a +" separate mapping for 1,w 2,w 3,w ... +" 1.00.007 22-May-2007 Added documentation for publication. +" 006 20-May-2007 BF: visual mode [1,2,3],e on pure CamelCase +" mistakenly marks [2,4,6] words. If the cursor is +" on a uppercase letter, the search pattern +" '\u\l\+' doesn't match at the cursor position, +" so another match won. Changed search pattern +" from '\l\+', +" 005 16-May-2007 Added support for underscore notation. +" Added support for "forward to end of word" +" (',e') motion. +" 004 16-May-2007 Improved search pattern so that +" UppercaseWORDSInBetween and digits are handled, +" too. +" 003 15-May-2007 Changed mappings from <Leader>w to ,w; +" other \w mappings interfere here, because it's +" irritating when the cursor jump doesn't happen +" immediately, because Vim waits whether the +" mapping is complete. ,w is faster to type that +" \w (and, because of the left-right touch, +" preferred over gw). +" Added visual mode mappings. +" 0.02 15-Feb-2006 BF: missing <SID> for omaps. +" 0.01 11-Oct-2005 file creation + +" Avoid installing twice or when in compatible mode +if exists('g:loaded_camelcasemotion') || (v:version < 700) + finish +endif +let g:loaded_camelcasemotion = 1 + +"- mappings ------------------------------------------------------------------- +" The count is passed into the function through the special variable 'v:count1', +" which is easier than misusing the :[range] that :call supports. +" <C-U> is used to delete the unused range. +" Another option would be to use a custom 'command! -count=1', but that doesn't +" work with the normal mode mapping: When a count is typed before the mapping, +" the ':' will convert a count of 3 into ':.,+2MyCommand', but ':3MyCommand' +" would be required to use -count and <count>. +" +" We do not provide the fourth "backward to end" motion (,E), because it is +" seldomly used. + +function! s:CreateMotionMappings() + " Create mappings according to this template: + " (* stands for the mode [nov], ? for the underlying motion [wbe].) + " + " *noremap <Plug>CamelCaseMotion_? :<C-U>call camelcasemotion#Motion('?',v:count1,'*')<CR> + " if ! hasmapto('<Plug>CamelCaseMotion_?', '*') + " *map <silent> ,? <Plug>CamelCaseMotion_? + " endif + + for l:mode in ['n', 'o', 'v'] + for l:motion in ['w', 'b', 'e'] + let l:targetMapping = '<Plug>CamelCaseMotion_' . l:motion + execute l:mode . 'noremap ' . l:targetMapping . ' :<C-U>call camelcasemotion#Motion(''' . l:motion . ''',v:count1,''' . l:mode . ''')<CR>' + if ! hasmapto(l:targetMapping, l:mode) + execute (l:mode ==# 'v' ? 'x' : l:mode) . 'map <silent> ,' . l:motion . ' ' . l:targetMapping + endif + endfor + endfor +endfunction + +" To create a text motion, a mapping for operator-pending mode needs to be +" defined. This mapping should move the cursor according to the implemented +" motion, or mark the covered text via a visual selection. As inner text motions +" need to mark both to the left and right of the cursor position, the visual +" selection needs to be used. +" +" Vim's built-in inner text objects also work in visual mode; they have +" different behavior depending on whether visual mode has just been entered or +" whether text has already been selected. +" We deviate from that and always override the existing selection. +function! s:CreateInnerMotionMappings() + " Create mappings according to this template: + " (* stands for the mode [ov], ? for the underlying motion [wbe].) + " + " *noremap <Plug>CamelCaseMotion_i? :<C-U>call camelcasemotion#InnerMotion('?',v:count1)<CR> + " if ! hasmapto('<Plug>CamelCaseInnerMotion_i?', '*') + " *map <silent> i,? <Plug>CamelCaseInnerMotion_i? + " endif + + for l:mode in ['o', 'v'] + for l:motion in ['w', 'b', 'e'] + let l:targetMapping = '<Plug>CamelCaseMotion_i' . l:motion + execute l:mode . 'noremap ' . l:targetMapping . ' :<C-U>call camelcasemotion#InnerMotion(''' . l:motion . ''',v:count1)<CR>' + if ! hasmapto(l:targetMapping, l:mode) + execute (l:mode ==# 'v' ? 'x' : l:mode) . 'map <silent> i,' . l:motion . ' ' . l:targetMapping + endif + endfor + endfor +endfunction + +call s:CreateMotionMappings() +call s:CreateInnerMotionMappings() + +delfunction s:CreateMotionMappings +delfunction s:CreateInnerMotionMappings + +" vim: set sts=4 sw=4 noexpandtab ff=unix fdm=syntax : |