sponsor Vim development Vim logo Vim Book Ad

camelcasemotion : Motion through CamelCaseWords and underscore_notation.

 script karma  Rating 269/92, Downloaded by 9096  Comments, bugs, improvements  Vim wiki

created by
Ingo Karkat
script type
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 plugin 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 plugin defines inner
"word" text objects i,w i,b and i,e, which select the "word" (or
multiple "words" if a [count] is given) where the cursor is located.

Based on vimtip #1016 by Anthony Van Ham

- CamelCaseComplete (vimscript #3915) provides insert mode completion that
  expands CamelCaseWords and underscore_words based on anchor characters for
  each word fragment.

- mlessnau_case (vimscript #4641) provides sort-of text objects vic, dic, cic,
  but it seems to use a simplistic regexp for selection.
- txtobj-underscore (https://github.com/lucapette/vim-textobj-underscore) uses
  vim-textobj-user to define a_ and i_ text objects.

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.

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

,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]

i,w                 "inner "word" forward", select [count] "words", including
                    the _ separator in underscore_notation
i,b                 "inner "word" backward", select [count] "words" from the
                    cursor position to the left, excluding the _ separator in
i,e                 "inner to the end of "word"", select [count] "words",
                    excluding the _ separator in underscore_notation

                    Inside CamelWords, there is no difference between i,w
                    and i,e. Unless [count] is larger than 1, i,b and
                    i,e are identical.
Given the following identifier, with the cursor positioned at [x]:

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.

All the normal word boundaries of the w, b, and e motions apply here as
well: whitespace, sequences of keyword characters and non-keyword-characters.
Boundaries between underscore_notation are defined by the "_" character.
A new CamelWord starts with an uppercase letter ("Camel", "ACRONYM", "C####")
or a number ("123", "42foo#bar").
install details
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.

- Requires Vim 7.0 or higher.

For a permanent configuration, put the following commands into your vimrc:

There's a special case dating back to vi that cw does not include the
whitespace after a word; it works like ce. If you want the same special case
for the c,w motion and ciw text object, define the following additional
    nmap c,w c,e
Likewise, the iw text object does not include trailing whitespace. If you
want the camelcasemotion text objects behave the same way, add:
    " Must define the default mappings first in order to change them.
    runtime plugin/camelcasemotion.vim
    omap i,w i,e
    xmap i,w i,e
If you're using different mappings (see below), you need to adapt the
arguments, naturally.

By default, all mappings start with , (comma) as the map leader instead of
using <Leader>. I personally find the default <Leader> key too far off the
keyboard to be useful for custom motions (which also cannot be repeated via
the . (dot) command, so they should be very fast to type repeatedly), but
quite suitable for general, less frequently used custom mappings.
To avoid losing the (rarely used) , mapping (which repeats latest f, t, F or
T in opposite direction), you can remap it to ,,:
    nnoremap ,, ,
    xnoremap ,, ,
    onoremap ,, ,

If you want to use different mappings, map your keys to the
<Plug>CamelCaseMotion_? mapping targets _before_ sourcing the 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 w <Plug>CamelCaseMotion_w
    map b <Plug>CamelCaseMotion_b
    map e <Plug>CamelCaseMotion_e
    sunmap w
    sunmap b
    sunmap e
In this case, you probably want to restore the special camelcasemotion-c,w
behavior, too:
    nmap cw ce
For consistency, the i_CTRL-W command probably should observe the word
fragments, too. This is a simplistic attempt:
    imap <C-w> <C-o>d<Plug>CamelCaseMotion_ie
But it fails when inside a word or with trailing whitespace.

EXAMPLE: Replace default iw text-object and define analog ib and  ie
    omap iw <Plug>CamelCaseMotion_iw
    xmap iw <Plug>CamelCaseMotion_iw
    omap ib <Plug>CamelCaseMotion_ib
    xmap ib <Plug>CamelCaseMotion_ib
    omap ie <Plug>CamelCaseMotion_ie
    xmap ie <Plug>CamelCaseMotion_ie
In this case, you probably want to restore the special camelcasemotion-c,w
behavior, too:
    " Must define the default mappings first in order to change them.
    runtime plugin/camelcasemotion.vim
    omap iw ie
    xmap iw ie

rate this script Life Changing Helpful Unfulfilling 
script versions (upload new version)

Click on the package to download.

package script version date Vim version user release notes
camelcasemotion.vba.gz 1.52 2011-11-12 7.0 Ingo Karkat - FIX: Correct forward-to-end motion over lowercase part in "lowerCamel". Found this by chance in GitHub fork by Kevin Lee (bkad).
- BUG: Correct wrong stop on second letter of ACRONYM at the beginning of a word "AXBCText".
- The motion functionality is automatically tested via a runVimTests (vimscript #2565) test suite.
camelcasemotion.vba.gz 1.50 2009-05-05 7.0 Ingo Karkat - 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. Now packaging as VimBall.
camelcasemotion.vim 1.40.017 2008-05-19 7.0 Ingo Karkat BF: Now using :normal! to be independent from any user mappings. Thanks to Neil Walker for the patch.
camelcasemotion.vim 1.40.016 2008-04-28 7.0 Ingo Karkat 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.
camelcasemotion.vim 1.40.015 2008-04-24 7.0 Ingo Karkat 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.
camelcasemotion.vim 1.30.014 2008-04-20 7.0 Ingo Karkat 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.
camelcasemotion.vim 1.30.013 2008-04-09 7.0 Ingo Karkat 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.
camelcasemotion.vim 1.20.012 2007-06-06 6.0 Ingo Karkat BF: Corrected motions through mixed CamelCase_and_UnderScore words by re-ordering and narrowing the search patterns.  
camelcasemotion.vim 1.20.011 2007-06-02 6.0 Ingo Karkat 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.
camelcasemotion.vim 1.20.010 2007-05-30 6.0 Ingo Karkat ENH: The visual mode motions now also (mostly) work with the (default) setting 'set selection=inclusive' / 'behave xterm', instead of selecting one character too much. So far, you had to 'set selection=exclusive' / 'behave mswin'.
camelcasemotion.vim 1.10.009 2007-05-30 6.0 Ingo Karkat 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 ...
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.
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.
camelcasemotion.vim 1.00.007 2007-05-22 6.0 Ingo Karkat Initial upload
ip used for rating:

If you have questions or remarks about this site, visit the vimonline development pages. Please use this site responsibly.
Questions about Vim should go to the maillist. Help Bram help Uganda.
Vim at Github