camelcasemotion : Motion through CamelCaseWords and underscore_notation.
script karma |
Rating 273/93,
Downloaded by 9558 |
Comments, bugs, improvements
|
Vim wiki
|
created by |
Ingo Karkat |
|
script type |
utility |
|
description |
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 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.
SOURCE
Based on vimtip #1016 by Anthony Van Ham
http://vim.wikia.com/wiki/Moving_through_camel_case_words
SEE ALSO
- CamelCaseComplete (vimscript #3915) provides insert mode completion that
expands CamelCaseWords and underscore_words based on anchor characters for
each word fragment.
RELATED WORKS
- 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.
USAGE
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
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]
TEXT OBJECTS
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
underscore_notation
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.
EXAMPLE
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.
BOUNDARIES
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 |
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
- Requires Vim 7.0 or higher.
CONFIGURATION
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
mapping:
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
motions:
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 |
|
script versions (upload new version)
Click on the package to download.
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: 142.132.191.50
|