" 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 " 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' || 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) " 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\@CamelCaseMotion_' . l:motion execute (l:mode ==# 'v' ? 'x' : l:mode) . \ 'map ' . a:leader . l:motion . ' ' . l:targetMapping endfor endfor " Create mappings according to this template: " (* stands for the mode [ov], ? for the underlying motion [wbe].) for l:mode in ['o', 'v'] for l:motion in ['w', 'b', 'e', 'ge'] let l:targetMapping = 'CamelCaseMotion_i' . l:motion execute (l:mode ==# 'v' ? 'x' : l:mode) . \ 'map i' . a:leader . l:motion . ' ' . l:targetMapping endfor endfor endfunction " vim: set sts=2 sw=2 expandtab ff=unix fdm=syntax :