From c27b437ca0f9a270fa6a9aeb6b882e47628c053b Mon Sep 17 00:00:00 2001 From: Kevin Le Date: Mon, 16 Nov 2015 19:00:40 -0800 Subject: support the 'ge' motion fixes #11 --- README.rst | 2 + autoload/camelcasemotion.vim | 296 +++++++++++++++++++-------------------- doc/camelcasemotion.txt | 46 +++--- plugin/camelcasemotion.vim | 326 ++++++++++++++++++++++--------------------- 4 files changed, 337 insertions(+), 333 deletions(-) diff --git a/README.rst b/README.rst index 56c84b9..6b59931 100644 --- a/README.rst +++ b/README.rst @@ -128,9 +128,11 @@ additional mappings 'w', 'b' and 'e':: map w CamelCaseMotion_w map b CamelCaseMotion_b map e CamelCaseMotion_e + map ge CamelCaseMotion_e sunmap w sunmap b sunmap e + sunmap ge **Example**: Replace default 'iw' text-object and define 'ib' and 'ie' motions:: diff --git a/autoload/camelcasemotion.vim b/autoload/camelcasemotion.vim index ef4929c..248ba39 100644 --- a/autoload/camelcasemotion.vim +++ b/autoload/camelcasemotion.vim @@ -1,173 +1,171 @@ -" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. +" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. " " DEPENDENCIES: -" - Requires Vim 7.0 or higher. +" - Requires Vim 7.0 or higher. " " Copyright: (C) 2007-2009 by Ingo Karkat -" The VIM LICENSE applies to this script; see ':help copyright'. +" The VIM LICENSE applies to this script; see ':help copyright'. " -" Maintainer: Ingo Karkat -" 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 +" Maintainer: Ingo Karkat +" 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). + " 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( '\m\d\+\|\u\+\ze\%(\u\l\|\d\)\|\l\+\ze\%(\u\|\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. + "echo "count is " . a:count + let l:i = 0 + while l:i < a:count + if a:direction == 'e' || a:direction == 'ge' + " "Forward to end" motion. + " number | ACRONYM followed by CamelCase or number | CamelCase | underscore_notation | non-keyword | word + let l:direction = (a:direction == 'e' ? a:direction : 'be') + call search('\m\d\+\|\u\+\ze\%(\u\l\|\d\)\|\l\+\ze\%(\u\|\d\)\|\u\l\+\|\%(\a\|\d\)\+\ze[-_]\|\%(\k\@!\S\)\+\|\%([-_]\@!\k\)\+\>', 'W' . l:direction) + " 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) + 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 | lowercase folowed by capital letter or number | ACRONYM followed by CamelCase or number | CamelCase | ACRONYM | underscore followed by ACRONYM, Camel, lowercase or number - call search( '\m\<\D\|^$\|\%(^\|\s\)\+\zs\k\@!\S\|\>\<\|\d\+\|\l\+\zs\%(\u\|\d\)\|\u\+\zs\%(\u\l\|\d\)\|\u\l\+\|\u\@\<\|\d\+\|\l\+\zs\%(\u\|\d\)\|\u\+\zs\%(\u\l\|\d\)\|\u\l\+\|\u\@w|, |b| and |e| (similar to |w|, |b|, |e|), which do not move word-wise (forward/backward), but @@ -28,13 +28,13 @@ 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. +just like the regular motions. Vim provides a built-in |iw| text object called 'inner word', which works in operator-pending and visual mode. Analoguous to that, this script defines inner "word" motions |iw|, |ib| and |ie|, which select the "word" (or multiple "words" if a [count] is given) where the cursor is -located. +located. ============================================================================== USAGE *camelcasemotion-usage* @@ -44,7 +44,7 @@ USAGE *camelcasemotion-usage* Use the new motions |w|, |b| and |e| in normal mode, operator-pending mode (cf. |operator|), and visual mode. For example, if the cursor is on the 'm', type 'bcw' to change 'Camel' in 'CamelCase' to -something else. +something else. EXAMPLE: motions @@ -70,7 +70,7 @@ v3iw selects script_31337_path_and_[name_without_extension_]11 v3ib selects script_31337_[path_and_name]_without_extension_11 v3ie selects script_31337_path_and_[name_without_extension]_11 Instead of visual mode, you can also use c3iw to change, d3iw -to delete, gU3iw to upper-case, and so on. +to delete, gU3iw to upper-case, and so on. ============================================================================== INSTALLATION *camelcasemotion-installation* @@ -81,27 +81,29 @@ 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. +To uninstall, use the |:RmVimball| command. DEPENDENCIES *camelcasemotion-dependencies* -- Requires Vim 7.0 or higher. +- Requires Vim 7.0 or higher. ============================================================================== CONFIGURATION *camelcasemotion-configuration* If you want to use different mappings, map your keys to the CamelCaseMotion_? mapping targets _before_ sourcing this script (e.g. in -your |vimrc|). +your |vimrc|). EXAMPLE: Replace the default |w|, |b| and |e| mappings instead of defining additional mappings |w|, |b| and |e|: > map w CamelCaseMotion_w map b CamelCaseMotion_b map e CamelCaseMotion_e + map ge CamelCaseMotion_ge sunmap w sunmap b sunmap e + sunmap ge EXAMPLE: Replace default |iw| text-object and define |ib| and |ie| motions: > omap iw CamelCaseMotion_iw @@ -118,16 +120,16 @@ KNOWN PROBLEMS *camelcasemotion-known-problems* 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 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'. + instead of 'e'. - When the Vim setting 'selection' is not set to "exclusive", a forward-backward combination in visual mode (e.g. 'vwb') 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. + the front end is off by one additional character. ============================================================================== TODO *camelcasemotion-todo* @@ -138,9 +140,9 @@ 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. + 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 @@ -159,30 +161,30 @@ 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. +for reporting this. 1.30 09-Apr-2008 - Allowing users to use mappings different than ,w ,b ,e by defining 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. +- 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. +'set selection=inclusive', instead of selecting one character too much. 1.10 28-May-2007 -Incorporated major improvements and simplifications done by Joseph Barker. +Incorporated major improvements and simplifications done by Joseph Barker. 1.00 22-May-2007 -First published version. +First published version. 0.01 11-Oct-2005 -Started development based on vimtip #1016 by Anthony Van Ham. +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|. +The VIM LICENSE applies to this script; see|copyright|. Maintainer: Ingo Karkat ============================================================================== diff --git a/plugin/camelcasemotion.vim b/plugin/camelcasemotion.vim index 5a53ad8..9cae4bd 100644 --- a/plugin/camelcasemotion.vim +++ b/plugin/camelcasemotion.vim @@ -1,198 +1,200 @@ -" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. +" camelcasemotion.vim: Motion through CamelCaseWords and underscore_notation. " " DEPENDENCIES: -" - Requires Vim 7.0 or higher. +" - Requires Vim 7.0 or higher. " " Copyright: (C) 2007-2009 by Ingo Karkat -" The VIM LICENSE applies to this script; see ':help copyright'. +" The VIM LICENSE applies to this script; see ':help copyright'. " -" Source: Based on vimtip #1016 by Anthony Van Ham. -" Maintainer: Ingo Karkat -" 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