blob: 1737812232058bba6b8f76025d50a4e787a0d069 [file] [log] [blame]
Christian Brabandta9b95c32025-06-22 20:32:15 +02001*usr_24.txt* For Vim version 9.1. Last change: 2025 Jun 22
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3 VIM USER MANUAL - by Bram Moolenaar
4
5 Inserting quickly
6
7
8When entering text, Vim offers various ways to reduce the number of keystrokes
9and avoid typing mistakes. Use Insert mode completion to repeat previously
10typed words. Abbreviate long words to short ones. Type characters that
11aren't on your keyboard.
12
13|24.1| Making corrections
14|24.2| Showing matches
15|24.3| Completion
16|24.4| Repeating an insert
17|24.5| Copying from another line
18|24.6| Inserting a register
19|24.7| Abbreviations
20|24.8| Entering special characters
21|24.9| Digraphs
22|24.10| Normal mode commands
23
24 Next chapter: |usr_25.txt| Editing formatted text
25 Previous chapter: |usr_23.txt| Editing other files
26Table of contents: |usr_toc.txt|
27
28==============================================================================
29*24.1* Making corrections
30
31The <BS> key was already mentioned. It deletes the character just before the
32cursor. The <Del> key does the same for the character under (after) the
33cursor.
34 When you typed a whole word wrong, use CTRL-W:
35
36 The horse had fallen to the sky ~
37 CTRL-W
38 The horse had fallen to the ~
39
40If you really messed up a line and want to start over, use CTRL-U to delete
41it. This keeps the text after the cursor and the indent. Only the text from
42the first non-blank to the cursor is deleted. With the cursor on the "f" of
43"fallen" in the next line pressing CTRL-U does this:
44
45 The horse had fallen to the ~
46 CTRL-U
47 fallen to the ~
48
49When you spot a mistake a few words back, you need to move the cursor there to
50correct it. For example, you typed this:
51
52 The horse had follen to the ground ~
53
54You need to change "follen" to "fallen". With the cursor at the end, you
55would type this to correct it: >
56
57 <Esc>4blraA
58
59< get out of Insert mode <Esc>
60 four words back 4b
61 move on top of the "o" l
62 replace with "a" ra
63 restart Insert mode A
64
65Another way to do this: >
66
67 <C-Left><C-Left><C-Left><C-Left><Right><Del>a<End>
68
69< four words back <C-Left><C-Left><C-Left><C-Left>
70 move on top of the "o" <Right>
71 delete the "o" <Del>
72 insert an "a" a
73 go to end of the line <End>
74
75This uses special keys to move around, while remaining in Insert mode. This
76resembles what you would do in a modeless editor. It's easier to remember,
77but takes more time (you have to move your hand from the letters to the cursor
78keys, and the <End> key is hard to press without looking at the keyboard).
79 These special keys are most useful when writing a mapping that doesn't
80leave Insert mode. The extra typing doesn't matter then.
81 An overview of the keys you can use in Insert mode:
82
83 <C-Home> to start of the file
84 <PageUp> a whole screenful up
85 <Home> to start of line
86 <S-Left> one word left
87 <C-Left> one word left
88 <S-Right> one word right
89 <C-Right> one word right
90 <End> to end of the line
91 <PageDown> a whole screenful down
92 <C-End> to end of the file
93
94There are a few more, see |ins-special-special|.
95
96==============================================================================
97*24.2* Showing matches
98
99When you type a ) it would be nice to see with which ( it matches. To make
100Vim do that use this command: >
101
102 :set showmatch
103
104When you now type a text like "(example)", as soon as you type the ) Vim will
105briefly move the cursor to the matching (, keep it there for half a second,
106and move back to where you were typing.
Bram Moolenaar402d2fe2005-04-15 21:00:38 +0000107 In case there is no matching (, Vim will beep. Then you know that you
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108might have forgotten the ( somewhere, or typed a ) too many.
109 The match will also be shown for [] and {} pairs. You don't have to wait
110with typing the next character, as soon as Vim sees it the cursor will move
111back and inserting continues as before.
112 You can change the time Vim waits with the 'matchtime' option. For
113example, to make Vim wait one and a half second: >
114
115 :set matchtime=15
116
117The time is specified in tenths of a second.
118
119==============================================================================
120*24.3* Completion
121
122Vim can automatically complete words on insertion. You type the first part of
123a word, press CTRL-P, and Vim guesses the rest.
124 Suppose, for example, that you are creating a C program and want to type in
125the following:
126
127 total = ch_array[0] + ch_array[1] + ch_array[2]; ~
128
129You start by entering the following:
130
131 total = ch_array[0] + ch_ ~
132
133At this point, you tell Vim to complete the word using the command CTRL-P.
134Vim searches for a word that starts with what's in front of the cursor. In
135this case, it is "ch_", which matches with the word ch_array. So typing
136CTRL-P gives you the following:
137
138 total = ch_array[0] + ch_array ~
139
140After a little more typing, you get this (ending in a space):
141
142 total = ch_array[0] + ch_array[1] + ~
143
144If you now type CTRL-P Vim will search again for a word that completes the
145word before the cursor. Since there is nothing in front of the cursor, it
146finds the first word backwards, which is "ch_array". Typing CTRL-P again
147gives you the next word that matches, in this case "total". A third CTRL-P
148searches further back. If there is nothing else, it causes the editor to run
149out of words, so it returns to the original text, which is nothing. A fourth
150CTRL-P causes the editor to start over again with "ch_array".
151
152To search forward, use CTRL-N. Since the search wraps around the end of the
153file, CTRL-N and CTRL-P will find the same matches, but in a different
154sequence. Hint: CTRL-N is Next-match and CTRL-P is Previous-match.
155
156The Vim editor goes through a lot of effort to find words to complete. By
157default, it searches the following places:
158
159 1. Current file
160 2. Files in other windows
161 3. Other loaded files (hidden buffers)
162 4. Files which are not loaded (inactive buffers)
163 5. Tag files
164 6. All files #included by the current file
165
166
167OPTIONS
168
169You can customize the search order with the 'complete' option.
170
171The 'ignorecase' option is used. When it is set, case differences are ignored
172when searching for matches.
173
174A special option for completion is 'infercase'. This is useful to find
175matches while ignoring case ('ignorecase' must be set) but still using the
176case of the word typed so far. Thus if you type "For" and Vim finds a match
177"fortunately", it will result in "Fortunately".
178
179
180COMPLETING SPECIFIC ITEMS
181
182If you know what you are looking for, you can use these commands to complete
183with a certain type of item:
184
185 CTRL-X CTRL-F file names
186 CTRL-X CTRL-L whole lines
187 CTRL-X CTRL-D macro definitions (also in included files)
188 CTRL-X CTRL-I current and included files
189 CTRL-X CTRL-K words from a dictionary
glepnird5fdfa52025-06-02 19:45:41 +0200190 CTRL-X CTRL-R contents from registers
Bram Moolenaar071d4272004-06-13 20:20:40 +0000191 CTRL-X CTRL-T words from a thesaurus
192 CTRL-X CTRL-] tags
193 CTRL-X CTRL-V Vim command line
194
195After each of them CTRL-N can be used to find the next match, CTRL-P to find
196the previous match.
197 More information for each of these commands here: |ins-completion|.
198
199
200COMPLETING FILE NAMES
201
202Let's take CTRL-X CTRL-F as an example. This will find file names. It scans
203the current directory for files and displays each one that matches the word in
204front of the cursor.
205 Suppose, for example, that you have the following files in the current
206directory:
207
208 main.c sub_count.c sub_done.c sub_exit.c
209
210Now enter Insert mode and start typing:
211
212 The exit code is in the file sub ~
213
214At this point, you enter the command CTRL-X CTRL-F. Vim now completes the
215current word "sub" by looking at the files in the current directory. The
216first match is sub_count.c. This is not the one you want, so you match the
217next file by typing CTRL-N. This match is sub_done.c. Typing CTRL-N again
218takes you to sub_exit.c. The results:
219
220 The exit code is in the file sub_exit.c ~
221
222If the file name starts with / (Unix) or C:\ (MS-Windows) you can find all
223files in the file system. For example, type "/u" and CTRL-X CTRL-F. This
224will match "/usr" (this is on Unix):
225
226 the file is found in /usr/ ~
227
228If you now press CTRL-N you go back to "/u". Instead, to accept the "/usr/"
229and go one directory level deeper, use CTRL-X CTRL-F again:
230
231 the file is found in /usr/X11R6/ ~
232
233The results depend on what is found in your file system, of course. The
234matches are sorted alphabetically.
235
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000236
237COMPLETING IN SOURCE CODE
238
239Source code files are well structured. That makes it possible to do
240completion in an intelligent way. In Vim this is called Omni completion. In
241some other editors it's called intellisense, but that is a trademark.
242
243The key to Omni completion is CTRL-X CTRL-O. Obviously the O stands for Omni
244here, so that you can remember it easier. Let's use an example for editing C
245source:
246
247 { ~
248 struct foo *p; ~
249 p-> ~
250
251The cursor is after "p->". Now type CTRL-X CTRL-O. Vim will offer you a list
252of alternatives, which are the items that "struct foo" contains. That is
253quite different from using CTRL-P, which would complete any word, while only
254members of "struct foo" are valid here.
255
Bram Moolenaar313b7232007-05-05 17:56:55 +0000256For Omni completion to work you may need to do some setup. At least make sure
257filetype plugins are enabled. Your vimrc file should contain a line like
258this: >
259 filetype plugin on
260Or: >
261 filetype plugin indent on
262
263For C code you need to create a tags file and set the 'tags' option. That is
264explained |ft-c-omni|. For other filetypes you may need to do something
265similar, look below |compl-omni-filetypes|. It only works for specific
266filetypes. Check the value of the 'omnifunc' option to find out if it would
267work.
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000268
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269==============================================================================
270*24.4* Repeating an insert
271
272If you press CTRL-A, the editor inserts the text you typed the last time you
273were in Insert mode.
274 Assume, for example, that you have a file that begins with the following:
275
276 "file.h" ~
277 /* Main program begins */ ~
278
279You edit this file by inserting "#include " at the beginning of the first
280line:
281
282 #include "file.h" ~
283 /* Main program begins */ ~
284
285You go down to the beginning of the next line using the commands "j^". You
286now start to insert a new "#include" line. So you type: >
287
288 i CTRL-A
289
290The result is as follows:
291
292 #include "file.h" ~
293 #include /* Main program begins */ ~
294
295The "#include " was inserted because CTRL-A inserts the text of the previous
296insert. Now you type "main.h"<Enter> to finish the line:
297
298
299 #include "file.h" ~
300 #include "main.h" ~
301 /* Main program begins */ ~
302
303The CTRL-@ command does a CTRL-A and then exits Insert mode. That's a quick
304way of doing exactly the same insertion again.
305
306==============================================================================
307*24.5* Copying from another line
308
309The CTRL-Y command inserts the character above the cursor. This is useful
310when you are duplicating a previous line. For example, you have this line of
311C code:
312
313 b_array[i]->s_next = a_array[i]->s_next; ~
314
315Now you need to type the same line, but with "s_prev" instead of "s_next".
316Start the new line, and press CTRL-Y 14 times, until you are at the "n" of
317"next":
318
319 b_array[i]->s_next = a_array[i]->s_next; ~
320 b_array[i]->s_ ~
321
322Now you type "prev":
323
324 b_array[i]->s_next = a_array[i]->s_next; ~
325 b_array[i]->s_prev ~
326
327Continue pressing CTRL-Y until the following "next":
328
329 b_array[i]->s_next = a_array[i]->s_next; ~
330 b_array[i]->s_prev = a_array[i]->s_ ~
331
332Now type "prev;" to finish it off.
333
334The CTRL-E command acts like CTRL-Y except it inserts the character below the
335cursor.
336
337==============================================================================
338*24.6* Inserting a register
339
340The command CTRL-R {register} inserts the contents of the register. This is
341useful to avoid having to type a long word. For example, you need to type
342this:
343
344 r = VeryLongFunction(a) + VeryLongFunction(b) + VeryLongFunction(c) ~
345
346The function name is defined in a different file. Edit that file and move the
347cursor on top of the function name there, and yank it into register v: >
348
349 "vyiw
350
351"v is the register specification, "yiw" is yank-inner-word. Now edit the file
352where the new line is to be inserted, and type the first letters:
353
354 r = ~
355
356Now use CTRL-R v to insert the function name:
357
358 r = VeryLongFunction ~
359
360You continue to type the characters in between the function name, and use
361CTRL-R v two times more.
362 You could have done the same with completion. Using a register is useful
363when there are many words that start with the same characters.
364
365If the register contains characters such as <BS> or other special characters,
366they are interpreted as if they had been typed from the keyboard. If you do
367not want this to happen (you really want the <BS> to be inserted in the text),
368use the command CTRL-R CTRL-R {register}.
369
370==============================================================================
371*24.7* Abbreviations
372
373An abbreviation is a short word that takes the place of a long one. For
374example, "ad" stands for "advertisement". Vim enables you to type an
375abbreviation and then will automatically expand it for you.
376 To tell Vim to expand "ad" into "advertisement" every time you insert it,
377use the following command: >
378
379 :iabbrev ad advertisement
380
381Now, when you type "ad", the whole word "advertisement" will be inserted into
382the text. This is triggered by typing a character that can't be part of a
383word, for example a space:
384
385 What Is Entered What You See
386 I saw the a I saw the a ~
387 I saw the ad I saw the ad ~
388 I saw the ad<Space> I saw the advertisement<Space> ~
389
390The expansion doesn't happen when typing just "ad". That allows you to type a
391word like "add", which will not get expanded. Only whole words are checked
392for abbreviations.
393
394
395ABBREVIATING SEVERAL WORDS
396
397It is possible to define an abbreviation that results in multiple words. For
398example, to define "JB" as "Jack Benny", use the following command: >
399
400 :iabbrev JB Jack Benny
401
402As a programmer, I use two rather unusual abbreviations: >
403
404 :iabbrev #b /****************************************
405 :iabbrev #e <Space>****************************************/
406
407These are used for creating boxed comments. The comment starts with #b, which
408draws the top line. I then type the comment text and use #e to draw the
409bottom line.
410 Notice that the #e abbreviation begins with a space. In other words, the
411first two characters are space-star. Usually Vim ignores spaces between the
412abbreviation and the expansion. To avoid that problem, I spell space as seven
413characters: <, S, p, a, c, e, >.
414
415 Note:
416 ":iabbrev" is a long word to type. ":iab" works just as well.
417 That's abbreviating the abbreviate command!
418
419
420FIXING TYPING MISTAKES
421
422It's very common to make the same typing mistake every time. For example,
423typing "teh" instead of "the". You can fix this with an abbreviation: >
424
425 :abbreviate teh the
426
427You can add a whole list of these. Add one each time you discover a common
428mistake.
429
430
431LISTING ABBREVIATIONS
432
433The ":abbreviate" command lists the abbreviations:
434
435 :abbreviate
436 i #e ****************************************/
437 i #b /****************************************
438 i JB Jack Benny
439 i ad advertisement
440 ! teh the
441
442The "i" in the first column indicates Insert mode. These abbreviations are
443only active in Insert mode. Other possible characters are:
444
445 c Command-line mode :cabbrev
446 ! both Insert and Command-line mode :abbreviate
447
448Since abbreviations are not often useful in Command-line mode, you will mostly
449use the ":iabbrev" command. That avoids, for example, that "ad" gets expanded
450when typing a command like: >
451
452 :edit ad
453
454
455DELETING ABBREVIATIONS
456
457To get rid of an abbreviation, use the ":unabbreviate" command. Suppose you
458have the following abbreviation: >
459
460 :abbreviate @f fresh
461
462You can remove it with this command: >
463
464 :unabbreviate @f
465
466While you type this, you will notice that @f is expanded to "fresh". Don't
467worry about this, Vim understands it anyway (except when you have an
468abbreviation for "fresh", but that's very unlikely).
469 To remove all the abbreviations: >
470
471 :abclear
472
473":unabbreviate" and ":abclear" also come in the variants for Insert mode
474(":iunabbreviate and ":iabclear") and Command-line mode (":cunabbreviate" and
475":cabclear").
476
477
478REMAPPING ABBREVIATIONS
479
480There is one thing to watch out for when defining an abbreviation: The
481resulting string should not be mapped. For example: >
482
483 :abbreviate @a adder
484 :imap dd disk-door
485
486When you now type @a, you will get "adisk-doorer". That's not what you want.
487To avoid this, use the ":noreabbrev" command. It does the same as
488":abbreviate", but avoids that the resulting string is used for mappings: >
489
490 :noreabbrev @a adder
491
492Fortunately, it's unlikely that the result of an abbreviation is mapped.
493
494==============================================================================
495*24.8* Entering special characters
496
497The CTRL-V command is used to insert the next character literally. In other
498words, any special meaning the character has, it will be ignored. For
499example: >
500
501 CTRL-V <Esc>
502
503Inserts an escape character. Thus you don't leave Insert mode. (Don't type
504the space after CTRL-V, it's only to make this easier to read).
505
506 Note:
507 On MS-Windows CTRL-V is used to paste text. Use CTRL-Q instead of
508 CTRL-V. On Unix, on the other hand, CTRL-Q does not work on some
509 terminals, because it has a special meaning.
510
511You can also use the command CTRL-V {digits} to insert a character with the
512decimal number {digits}. For example, the character number 127 is the <Del>
513character (but not necessarily the <Del> key!). To insert <Del> type: >
514
515 CTRL-V 127
516
517You can enter characters up to 255 this way. When you type fewer than two
518digits, a non-digit will terminate the command. To avoid the need of typing a
519non-digit, prepend one or two zeros to make three digits.
520 All the next commands insert a <Tab> and then a dot:
521
522 CTRL-V 9.
523 CTRL-V 09.
524 CTRL-V 009.
525
526To enter a character in hexadecimal, use an "x" after the CTRL-V: >
527
528 CTRL-V x7f
529
530This also goes up to character 255 (CTRL-V xff). You can use "o" to type a
531character as an octal number and two more methods allow you to type up to
532a 16 bit and a 32 bit number (e.g., for a Unicode character): >
533
534 CTRL-V o123
535 CTRL-V u1234
536 CTRL-V U12345678
537
538==============================================================================
539*24.9* Digraphs
540
541Some characters are not on the keyboard. For example, the copyright character
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100542(©). To type these characters in Vim, you use digraphs, where two characters
543represent one. To enter a ©, for example, you press three keys: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000544
545 CTRL-K Co
546
547To find out what digraphs are available, use the following command: >
548
549 :digraphs
550
551Vim will display the digraph table. Here are three lines of it:
552
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100553 AC ~_ 159 NS | 160 !I ¡ 161 Ct ¢ 162 Pd £ 163 Cu ¤ 164 Ye ¥ 165 ~
554 BB ¦ 166 SE § 167 ': ¨ 168 Co © 169 -a ª 170 << « 171 NO ¬ 172 ~
555 -- ­ 173 Rg ® 174 'm ¯ 175 DG ° 176 +- ± 177 2S ² 178 3S ³ 179 ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000556
557This shows, for example, that the digraph you get by typing CTRL-K Pd is the
Bram Moolenaar98ef2332018-03-18 14:44:37 +0100558character (£). This is character number 163 (decimal).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000559 Pd is short for Pound. Most digraphs are selected to give you a hint about
560the character they will produce. If you look through the list you will
561understand the logic.
562 You can exchange the first and second character, if there is no digraph for
563that combination. Thus CTRL-K dP also works. Since there is no digraph for
564"dP" Vim will also search for a "Pd" digraph.
565
566 Note:
567 The digraphs depend on the character set that Vim assumes you are
Bram Moolenaar5666fcd2019-12-26 14:35:26 +0100568 using. Always use ":digraphs" to find out which digraphs are currently
569 available.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000570
Christian Brabandta9b95c32025-06-22 20:32:15 +0200571You can define your own digraphs by specifying the target character with a
572decimal number. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000573
Christian Brabandta9b95c32025-06-22 20:32:15 +0200574 :digraph a\" 228
Bram Moolenaar071d4272004-06-13 20:20:40 +0000575
Christian Brabandta9b95c32025-06-22 20:32:15 +0200576This defines that CTRL-K a" inserts an ä character. Note: we had to escape
577the " character since otherwise it would act as a comment character.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000578
579More information about digraphs here: |digraphs|
580 Another way to insert special characters is with a keymap. More about that
581here: |45.5|
582
583==============================================================================
584*24.10* Normal mode commands
585
586Insert mode offers a limited number of commands. In Normal mode you have many
587more. When you want to use one, you usually leave Insert mode with <Esc>,
588execute the Normal mode command, and re-enter Insert mode with "i" or "a".
589 There is a quicker way. With CTRL-O {command} you can execute any Normal
590mode command from Insert mode. For example, to delete from the cursor to the
591end of the line: >
592
593 CTRL-O D
594
595You can execute only one Normal mode command this way. But you can specify a
596register or a count. A more complicated example: >
597
598 CTRL-O "g3dw
599
600This deletes up to the third word into register g.
601
602==============================================================================
603
604Next chapter: |usr_25.txt| Editing formatted text
605
Bram Moolenaard473c8c2018-08-11 18:00:22 +0200606Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: