-
Notifications
You must be signed in to change notification settings - Fork 13
/
camelcasemotion.txt
220 lines (178 loc) · 9.75 KB
/
camelcasemotion.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
*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 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" 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*
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 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 w <Plug>CamelCaseMotion_w
map b <Plug>CamelCaseMotion_b
map e <Plug>CamelCaseMotion_e
sunmap w
sunmap b
sunmap e
EXAMPLE: Replace default |iw| text-object and define |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
==============================================================================
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, and a beep is issued. 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*
IDEAS *camelcasemotion-ideas*
- Use search('\%#.\%$', 'cnW') to detect the operator-pending motion to the
end of the buffer and temporarily append a new line / space character to
work around the end-of-buffer problem. Unfortunately, the addition cannot be
undone as part of the motion (won't work then), so we'd have to use an
autocmd to remove it later.
- Make separator character (currently underscore) configurable so that dashes,
asterisks, etc. can be added as well. Idea is to replace the single /_/ with
a collection /[-_*]/ built from g:CamelCaseMotion_SeparatorCharacters. Check
out interference with containment in 'iskeyword' and think through need to
buffer-local setting. (Submitted anonymously 13-Nov-2010 on Vim Tips Wiki.)
==============================================================================
HISTORY *camelcasemotion-history*
1.52 12-Nov-2011
- 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.
1.51 30-Sep-2011
Use <silent> for <Plug> mapping instead of default mapping.
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. Now packaging as VimBall.
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-2011 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: