aboutsummaryrefslogtreecommitdiff
path: root/camelcasemotion.vba
blob: 748166a4eb29a8205dc5cd531f7ebe96317ae86e (plain)
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
" Vimball Archiver by Charles E. Campbell, Jr., Ph.D.
UseVimball
finish
autoload/camelcasemotion.vim	[[[1
173
" 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 <ingo@karkat.de>
" 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'
	    " "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( '\d\+\|\u\+\ze\%(\u\l\|\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. 

	    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 | ACRONYM followed by CamelCase or number | CamelCase | underscore followed by ACRONYM, Camel, lowercase or number
	    call search( '\<\D\|^$\|\%(^\|\s\)\+\zs\k\@!\S\|\>\S\|\d\+\|\u\+\ze\%(\u\l\|\d\)\|\u\l\+\|_\zs\%(\u\+\|\u\l\+\|\l\+\|\d\+\)', 'W' . l:direction )
	    " Note: word must be defined as '\<\D' to avoid that a word like
	    " 1234Test is moved over as [1][2]34[T]est instead of [1]234[T]est
	    " because \< matches with zero width, and \d\+ will then start
	    " matching '234'. To fix that, we make \d\+ be solely responsible
	    " for numbers by taken this away from \< via \<\D. (An alternative
	    " would be to replace \d\+ with \D\%#\zs\d\+, but that one is more
	    " complex.) All other branches are not affected, because they match
	    " multiple characters and not the same character multiple times. 
	endif
	let l:i = l:i + 1
    endwhile
endfunction

function! camelcasemotion#Motion( direction, count, mode )
"*******************************************************************************
"* PURPOSE:
"   Perform the motion over CamelCaseWords or underscore_notation. 
"* ASSUMPTIONS / PRECONDITIONS:
"   none
"* EFFECTS / POSTCONDITIONS:
"   Move cursor / change selection. 
"* INPUTS:
"   a:direction	one of 'w', 'b', 'e'
"   a:count	number of "words" to move over
"   a:mode	one of 'n', 'o', 'v', 'iv' (latter one is a special visual mode
"		when inside the inner "word" text objects. 
"* RETURN VALUES: 
"   none
"*******************************************************************************
    " Visual mode needs special preparations and postprocessing; 
    " normal and operator-pending mode breeze through to s:Move(). 

    if a:mode == 'v'
	" Visual mode was left when calling this function. Reselecting the current
	" selection returns to visual mode and allows to call search() and issue
	" normal mode motions while staying in visual mode. 
	normal! gv
    endif
    if a:mode == 'v' || a:mode == 'iv'

	" Note_1a:
	if &selection != 'exclusive' && a:direction == 'w'
	    normal! l
	endif
    endif

    call s:Move( a:direction, a:count, a:mode )

    if a:mode == 'v' || a:mode == 'iv'
	" Note: 'selection' setting. 
	if &selection == 'exclusive' && a:direction == 'e'
	    " When set to 'exclusive', the "forward to end" motion (',e') does not
	    " include the last character of the moved-over "word". To include that, an
	    " additional 'l' motion is appended to the motion; similar to the
	    " special treatment in operator-pending mode. 
	    normal! l
	elseif &selection != 'exclusive' && a:direction != 'e'
	    " Note_1b:
	    " The forward and backward motions move to the beginning of the next "word".
	    " When 'selection' is set to 'inclusive' or 'old', this is one character too far. 
	    " The appended 'h' motion undoes this. Because of this backward step,
	    " though, the forward motion finds the current "word" again, and would
	    " be stuck on the current "word". An 'l' motion before the CamelCase
	    " motion (see Note_1a) fixes that. 
	    normal! h
	endif
    endif
endfunction

function! camelcasemotion#InnerMotion( direction, count )
    " If the cursor is positioned on the first character of a CamelWord, the
    " backward motion would move to the previous word, which would result in a
    " wrong selection. To fix this, first move the cursor to the right, so that
    " the backward motion definitely will cover the current "word" under the
    " cursor. 
    normal! l
    
    " Move "word" backwards, enter visual mode, then move "word" forward. This
    " selects the inner "word" in visual mode; the operator-pending mode takes
    " this selection as the area covered by the motion. 
    if a:direction == 'b'
	" Do not do the selection backwards, because the backwards "word" motion
	" in visual mode + selection=inclusive has an off-by-one error. 
	call camelcasemotion#Motion( 'b', a:count, 'n' )
	normal! v
	" We decree that 'b' is the opposite of 'e', not 'w'. This makes more
	" sense at the end of a line and for underscore_notation. 
	call camelcasemotion#Motion( 'e', a:count, 'iv' )
    else
	call camelcasemotion#Motion( 'b', 1, 'n' )
	normal! v
	call camelcasemotion#Motion( a:direction, a:count, 'iv' )
    endif
endfunction

" vim: set sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
plugin/camelcasemotion.vim	[[[1
204
" 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'. 
"
" Source: Based on vimtip #1016 by Anthony Van Ham. 
" Maintainer:	Ingo Karkat <ingo@karkat.de>
" 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 <script> from
"				mappings. 
"   1.40.017	19-May-2008	BF: Now using :normal! to be independent from
"				any user mappings. Thanks to Neil Walker for the
"				patch. 
"   1.40.016	28-Apr-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.015	24-Apr-2008	ENH: Added inner "word" text objects 'i,w' etc.
"				that work analogous to the built-in 'iw' text
"				object. Thanks to David Kotchan for this
"				suggestion. 
"   1.30.014	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. 
"				Now using non-capturing parentheses \%() in the
"				patterns. 
"   1.30.013	09-Apr-2008	Refactored away s:VisualCamelCaseMotion(). 
"				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. 
"				Mappings are now created in a generic function. 
"				Now requires Vim 7.0 or higher. 
"   1.20.012	02-Jun-2007	BF: Corrected motions through mixed
"				CamelCase_and_UnderScore words by re-ordering
"				and narrowing the search patterns.  
"   1.20.011	02-Jun-2007	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:
"				Removed s:CheckForChangesToTheSelectionSetting().
"				Introduced s:VisualCamelCaseMotion(), which
"				handles the differences depending on the
"				'selection' setting. 
"				Visual mode mappings now directly map to the
"				s:VisualCamelCaseMotion() function; no mark is
"				clobbered, the complex mapping with the inline
"				expression has been retired. 
"   1.20.010	29-May-2007	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. 
"				ENH: The visual mode motions now also (mostly)
"				work with the (default) setting
"				'set selection=inclusive', instead of selecting
"				one character too much. 
"				ENH: All mappings will check for changes to the
"				'selection' setting and remap the visual mode
"				mappings via function
"				s:SetupVisualModeMappings(). We cannot rely on
"				the setting while sourcing camelcasemotion.vim
"				because the mswin.vim script may be sourced
"				afterwards, and its 'behave mswin' changes
"				'selection'. 
"				Refactored the arguments of function 
"				s:CamelCaseMotion(...). 
"   1.10.009	28-May-2007	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. 
"   1.10.008	28-May-2007	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 ...
"   1.00.007	22-May-2007	Added documentation for publication. 
"	006	20-May-2007	BF: visual mode [1,2,3],e on pure CamelCase
"				mistakenly marks [2,4,6] words. If the cursor is
"				on a uppercase letter, the search pattern
"				'\u\l\+' doesn't match at the cursor position,
"				so another match won. Changed search pattern
"				from '\l\+', 
"	005	16-May-2007	Added support for underscore notation. 
"				Added support for "forward to end of word"
"				(',e') motion. 
"	004	16-May-2007	Improved search pattern so that
"				UppercaseWORDSInBetween and digits are handled,
"				too. 
"	003	15-May-2007	Changed mappings from <Leader>w to ,w; 
"				other \w mappings interfere here, because it's
"				irritating when the cursor jump doesn't happen
"				immediately, because Vim waits whether the
"				mapping is complete. ,w is faster to type that
"				\w (and, because of the left-right touch,
"				preferred over gw). 
"				Added visual mode mappings. 
"	0.02	15-Feb-2006	BF: missing <SID> for omaps. 
"	0.01	11-Oct-2005	file creation

" Avoid installing twice or when in compatible mode
if exists('g:loaded_camelcasemotion') || (v:version < 700)
    finish
endif
let g:loaded_camelcasemotion = 1

"- mappings -------------------------------------------------------------------
" The count is passed into the function through the special variable 'v:count1',
" which is easier than misusing the :[range] that :call supports. 
" <C-U> is used to delete the unused range. 
" Another option would be to use a custom 'command! -count=1', but that doesn't
" work with the normal mode mapping: When a count is typed before the mapping,
" the ':' will convert a count of 3 into ':.,+2MyCommand', but ':3MyCommand'
" would be required to use -count and <count>. 
"
" We do not provide the fourth "backward to end" motion (,E), because it is
" seldomly used. 

function! s:CreateMotionMappings()
    " Create mappings according to this template:
    " (* stands for the mode [nov], ? for the underlying motion [wbe].) 
    "
    " *noremap <Plug>CamelCaseMotion_? :<C-U>call camelcasemotion#Motion('?',v:count1,'*')<CR>
    " if ! hasmapto('<Plug>CamelCaseMotion_?', '*')
    "	  *map <silent> ,? <Plug>CamelCaseMotion_?
    " endif

    for l:mode in ['n', 'o', 'v']
	for l:motion in ['w', 'b', 'e']
	    let l:targetMapping = '<Plug>CamelCaseMotion_' . l:motion
	    execute l:mode . 'noremap ' . l:targetMapping . ' :<C-U>call camelcasemotion#Motion(''' . l:motion . ''',v:count1,''' . l:mode . ''')<CR>'
	    if ! hasmapto(l:targetMapping, l:mode)
		execute (l:mode ==# 'v' ? 'x' : l:mode) . 'map <silent> ,' . l:motion . ' ' . l:targetMapping 
	    endif
	endfor
    endfor
endfunction

" To create a text motion, a mapping for operator-pending mode needs to be
" defined. This mapping should move the cursor according to the implemented
" motion, or mark the covered text via a visual selection. As inner text motions
" need to mark both to the left and right of the cursor position, the visual
" selection needs to be used. 
"
" Vim's built-in inner text objects also work in visual mode; they have
" different behavior depending on whether visual mode has just been entered or
" whether text has already been selected. 
" We deviate from that and always override the existing selection. 
function! s:CreateInnerMotionMappings()
    " Create mappings according to this template:
    " (* stands for the mode [ov], ? for the underlying motion [wbe].) 
    "
    " *noremap <Plug>CamelCaseMotion_i? :<C-U>call camelcasemotion#InnerMotion('?',v:count1)<CR>
    " if ! hasmapto('<Plug>CamelCaseInnerMotion_i?', '*')
    "	  *map <silent> i,? <Plug>CamelCaseInnerMotion_i?
    " endif

    for l:mode in ['o', 'v']
	for l:motion in ['w', 'b', 'e']
	    let l:targetMapping = '<Plug>CamelCaseMotion_i' . l:motion
	    execute l:mode . 'noremap ' . l:targetMapping . ' :<C-U>call camelcasemotion#InnerMotion(''' . l:motion . ''',v:count1)<CR>'
	    if ! hasmapto(l:targetMapping, l:mode)
		execute (l:mode ==# 'v' ? 'x' : l:mode) . 'map <silent> i,' . l:motion . ' ' . l:targetMapping 
	    endif
	endfor
    endfor
endfunction

call s:CreateMotionMappings()
call s:CreateInnerMotionMappings()

delfunction s:CreateMotionMappings
delfunction s:CreateInnerMotionMappings

" vim: set sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
doc/camelcasemotion.txt	[[[1
183
*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 script 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 script 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*

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 <silent> w <Plug>CamelCaseMotion_w
    map <silent> b <Plug>CamelCaseMotion_b
    map <silent> e <Plug>CamelCaseMotion_e
    sunmap w
    sunmap b
    sunmap e

EXAMPLE: Replace default|iw|text-object and define|ib|and |ie|motions: >
    omap <silent> iw <Plug>CamelCaseMotion_iw
    xmap <silent> iw <Plug>CamelCaseMotion_iw
    omap <silent> ib <Plug>CamelCaseMotion_ib
    xmap <silent> ib <Plug>CamelCaseMotion_ib
    omap <silent> ie <Plug>CamelCaseMotion_ie
    xmap <silent> 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. 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*

==============================================================================
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. 

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-2009 by 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: