blob: b81fccc51dc0288da0eb21e8f5692a4202b915da [file] [log] [blame]
Christian Brabandtb4ddc6c2024-01-02 16:51:11 +01001*usr_04.txt* For Vim version 9.1. Last change: 2021 Feb 22
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3 VIM USER MANUAL - by Bram Moolenaar
4
5 Making small changes
6
7
8This chapter shows you several ways of making corrections and moving text
9around. It teaches you the three basic ways to change text: operator-motion,
10Visual mode and text objects.
11
12|04.1| Operators and motions
13|04.2| Changing text
14|04.3| Repeating a change
15|04.4| Visual mode
16|04.5| Moving text
17|04.6| Copying text
18|04.7| Using the clipboard
19|04.8| Text objects
20|04.9| Replace mode
21|04.10| Conclusion
22
23 Next chapter: |usr_05.txt| Set your settings
24 Previous chapter: |usr_03.txt| Moving around
25Table of contents: |usr_toc.txt|
26
27==============================================================================
28*04.1* Operators and motions
29
30In chapter 2 you learned the "x" command to delete a single character. And
31using a count: "4x" deletes four characters.
32 The "dw" command deletes a word. You may recognize the "w" command as the
33move word command. In fact, the "d" command may be followed by any motion
34command, and it deletes from the current location to the place where the
35cursor winds up.
Bram Moolenaar0c0734d2019-11-26 21:44:46 +010036 The "4w" command, for example, moves the cursor over four words. The "d4w"
Bram Moolenaar071d4272004-06-13 20:20:40 +000037command deletes four words.
38
39 To err is human. To really foul up you need a computer. ~
40 ------------------>
41 d4w
42
43 To err is human. you need a computer. ~
44
45Vim only deletes up to the position where the motion takes the cursor. That's
46because Vim knows that you probably don't want to delete the first character
47of a word. If you use the "e" command to move to the end of a word, Vim
48guesses that you do want to include that last character:
49
50 To err is human. you need a computer. ~
51 -------->
52 d2e
53
54 To err is human. a computer. ~
55
56Whether the character under the cursor is included depends on the command you
57used to move to that character. The reference manual calls this "exclusive"
58when the character isn't included and "inclusive" when it is.
59
60The "$" command moves to the end of a line. The "d$" command deletes from the
61cursor to the end of the line. This is an inclusive motion, thus the last
62character of the line is included in the delete operation:
63
64 To err is human. a computer. ~
65 ------------>
66 d$
67
68 To err is human ~
69
70There is a pattern here: operator-motion. You first type an operator command.
71For example, "d" is the delete operator. Then you type a motion command like
72"4l" or "w". This way you can operate on any text you can move over.
73
74==============================================================================
75*04.2* Changing text
76
77Another operator is "c", change. It acts just like the "d" operator, except
78it leaves you in Insert mode. For example, "cw" changes a word. Or more
79specifically, it deletes a word and then puts you in Insert mode.
80
81 To err is human ~
82 ------->
83 c2wbe<Esc>
84
85 To be human ~
86
87This "c2wbe<Esc>" contains these bits:
88
89 c the change operator
90 2w move two words (they are deleted and Insert mode started)
91 be insert this text
92 <Esc> back to Normal mode
93
Bram Moolenaar0c0734d2019-11-26 21:44:46 +010094You will have noticed something strange: The space before "human" isn't
95deleted. There is a saying that for every problem there is an answer that is
96simple, clear, and wrong. That is the case with the example used here for the
97"cw" command. The c operator works just like the d operator, with one
98exception: "cw". It actually works like "ce", change to end of word. Thus
99the space after the word isn't included. This is an exception that dates back
100to the old Vi. Since many people are used to it now, the inconsistency has
101remained in Vim.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102
103
104MORE CHANGES
105
106Like "dd" deletes a whole line, "cc" changes a whole line. It keeps the
107existing indent (leading white space) though.
108
109Just like "d$" deletes until the end of the line, "c$" changes until the end
110of the line. It's like doing "d$" to delete the text and then "a" to start
111Insert mode and append new text.
112
113
114SHORTCUTS
115
116Some operator-motion commands are used so often that they have been given a
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100117single-letter command:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000118
119 x stands for dl (delete character under the cursor)
120 X stands for dh (delete character left of the cursor)
121 D stands for d$ (delete to end of the line)
122 C stands for c$ (change to end of the line)
123 s stands for cl (change one character)
124 S stands for cc (change a whole line)
125
126
127WHERE TO PUT THE COUNT
128
129The commands "3dw" and "d3w" delete three words. If you want to get really
130picky about things, the first command, "3dw", deletes one word three times;
131the command "d3w" deletes three words once. This is a difference without a
132distinction. You can actually put in two counts, however. For example,
133"3d2w" deletes two words, repeated three times, for a total of six words.
134
135
136REPLACING WITH ONE CHARACTER
137
138The "r" command is not an operator. It waits for you to type a character, and
139will replace the character under the cursor with it. You could do the same
140with "cl" or with the "s" command, but with "r" you don't have to press <Esc>
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100141to get back out of insert mode.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142
143 there is somerhing grong here ~
144 rT rt rw
145
146 There is something wrong here ~
147
148Using a count with "r" causes that many characters to be replaced with the
149same character. Example:
150
151 There is something wrong here ~
152 5rx
153
154 There is something xxxxx here ~
155
156To replace a character with a line break use "r<Enter>". This deletes one
157character and inserts a line break. Using a count here only applies to the
158number of characters deleted: "4r<Enter>" replaces four characters with one
159line break.
160
161==============================================================================
162*04.3* Repeating a change
163
Bram Moolenaare7b1ea02020-08-07 19:54:59 +0200164The "." command is one of the simplest yet powerful commands in Vim. It
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165repeats the last change. For instance, suppose you are editing an HTML file
166and want to delete all the <B> tags. You position the cursor on the first <
167and delete the <B> with the command "df>". You then go to the < of the next
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100168</B> and delete it using the "." command. The "." command executes the last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169change command (in this case, "df>"). To delete another tag, position the
170cursor on the < and use the "." command.
171
172 To <B>generate</B> a table of <B>contents ~
173 f< find first < --->
174 df> delete to > -->
175 f< find next < --------->
176 . repeat df> --->
177 f< find next < ------------->
178 . repeat df> -->
179
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100180The "." command works for all changes you make, except for "u" (undo), CTRL-R
181(redo) and commands that start with a colon (:).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000182
183Another example: You want to change the word "four" to "five". It appears
184several times in your text. You can do this quickly with this sequence of
185commands:
186
187 /four<Enter> find the first string "four"
188 cwfive<Esc> change the word to "five"
189 n find the next "four"
Bram Moolenaar34401cc2014-08-29 15:12:19 +0200190 . repeat the change to "five"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000191 n find the next "four"
192 . repeat the change
193 etc.
194
195==============================================================================
196*04.4* Visual mode
197
198To delete simple items the operator-motion changes work quite well. But often
199it's not so easy to decide which command will move over the text you want to
200change. Then you can use Visual mode.
201
202You start Visual mode by pressing "v". You move the cursor over the text you
203want to work on. While you do this, the text is highlighted. Finally type
204the operator command.
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100205 For example, to delete from the middle of one word to the middle of another
206word:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207
208 This is an examination sample of visual mode ~
209 ---------->
210 velllld
211
212 This is an example of visual mode ~
213
214When doing this you don't really have to count how many times you have to
215press "l" to end up in the right position. You can immediately see what text
216will be deleted when you press "d".
217
218If at any time you decide you don't want to do anything with the highlighted
219text, just press <Esc> and Visual mode will stop without doing anything.
220
221
222SELECTING LINES
223
224If you want to work on whole lines, use "V" to start Visual mode. You will
225see right away that the whole line is highlighted, without moving around.
226When you move left or right nothing changes. When you move up or down the
227selection is extended whole lines at a time.
228 For example, select three lines with "Vjj":
229
230 +------------------------+
231 | text more text |
232 >> | more text more text | |
233 selected lines >> | text text text | | Vjj
234 >> | text more | V
235 | more text more |
236 +------------------------+
237
238
239SELECTING BLOCKS
240
241If you want to work on a rectangular block of characters, use CTRL-V to start
242Visual mode. This is very useful when working on tables.
243
244 name Q1 Q2 Q3
245 pierre 123 455 234
246 john 0 90 39
247 steve 392 63 334
248
249To delete the middle "Q2" column, move the cursor to the "Q" of "Q2". Press
250CTRL-V to start blockwise Visual mode. Now move the cursor three lines down
251with "3j" and to the next word with "w". You can see the first character of
252the last column is included. To exclude it, use "h". Now press "d" and the
253middle column is gone.
254
255
256GOING TO THE OTHER SIDE
257
258If you have selected some text in Visual mode, and discover that you need to
259change the other end of the selection, use the "o" command (Hint: o for other
260end). The cursor will go to the other end, and you can move the cursor to
261change where the selection starts. Pressing "o" again brings you back to the
262other end.
263
264When using blockwise selection, you have four corners. "o" only takes you to
265one of the other corners, diagonally. Use "O" to move to the other corner in
266the same line.
267
Bram Moolenaar8f3f58f2010-01-06 20:52:26 +0100268Note that "o" and "O" in Visual mode work very differently from Normal mode,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269where they open a new line below or above the cursor.
270
271==============================================================================
272*04.5* Moving text
273
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100274When you delete something with "d", "x", or another command, the text is
275saved. You can paste it back by using the "p" command. (The Vim name for
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276this is put).
277 Take a look at how this works. First you will delete an entire line, by
278putting the cursor on the line you want to delete and typing "dd". Now you
279move the cursor to where you want to put the line and use the "p" (put)
280command. The line is inserted on the line below the cursor.
281
282 a line a line a line
283 line 2 dd line 3 p line 3
284 line 3 line 2
285
286Because you deleted an entire line, the "p" command placed the text line below
287the cursor. If you delete part of a line (a word, for instance), the "p"
288command puts it just after the cursor.
289
290 Some more boring try text to out commands. ~
291 ---->
292 dw
293
294 Some more boring text to out commands. ~
295 ------->
296 welp
297
298 Some more boring text to try out commands. ~
299
300
301MORE ON PUTTING
302
303The "P" command puts text like "p", but before the cursor. When you deleted a
304whole line with "dd", "P" will put it back above the cursor. When you deleted
305a word with "dw", "P" will put it back just before the cursor.
306
307You can repeat putting as many times as you like. The same text will be used.
308
309You can use a count with "p" and "P". The text will be repeated as many times
310as specified with the count. Thus "dd" and then "3p" puts three copies of the
311same deleted line.
312
313
314SWAPPING TWO CHARACTERS
315
316Frequently when you are typing, your fingers get ahead of your brain (or the
317other way around?). The result is a typo such as "teh" for "the". Vim
318makes it easy to correct such problems. Just put the cursor on the e of "teh"
319and execute the command "xp". This works as follows: "x" deletes the
320character e and places it in a register. "p" puts the text after the cursor,
321which is after the h.
322
323 teh th the ~
324 x p
325
326==============================================================================
327*04.6* Copying text
328
329To copy text from one place to another, you could delete it, use "u" to undo
330the deletion and then "p" to put it somewhere else. There is an easier way:
331yanking. The "y" operator copies text into a register. Then a "p" command
332can be used to put it.
333 Yanking is just a Vim name for copying. The "c" letter was already used
334for the change operator, and "y" was still available. Calling this
335operator "yank" made it easier to remember to use the "y" key.
336
337Since "y" is an operator, you use "yw" to yank a word. A count is possible as
338usual. To yank two words use "y2w". Example:
339
340 let sqr = LongVariable * ~
341 -------------->
342 y2w
343
344 let sqr = LongVariable * ~
345 p
346
347 let sqr = LongVariable * LongVariable ~
348
349Notice that "yw" includes the white space after a word. If you don't want
350this, use "ye".
351
352The "yy" command yanks a whole line, just like "dd" deletes a whole line.
353Unexpectedly, while "D" deletes from the cursor to the end of the line, "Y"
354works like "yy", it yanks the whole line. Watch out for this inconsistency!
355Use "y$" to yank to the end of the line.
356
357 a text line yy a text line a text line
358 line 2 line 2 p line 2
359 last line last line a text line
360 last line
361
362==============================================================================
363*04.7* Using the clipboard
364
365If you are using the GUI version of Vim (gvim), you can find the "Copy" item
366in the "Edit" menu. First select some text with Visual mode, then use the
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100367Edit/Copy menu item. The selected text is now copied to the clipboard. You
368can paste the text in other programs. In Vim itself too.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000369
370If you have copied text to the clipboard in another application, you can paste
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100371it in Vim with the Edit/Paste menu item. This works in Normal mode and Insert
Bram Moolenaar071d4272004-06-13 20:20:40 +0000372mode. In Visual mode the selected text is replaced with the pasted text.
373
374The "Cut" menu item deletes the text before it's put on the clipboard. The
375"Copy", "Cut" and "Paste" items are also available in the popup menu (only
376when there is a popup menu, of course). If your Vim has a toolbar, you can
377also find these items there.
378
379If you are not using the GUI, or if you don't like using a menu, you have to
380use another way. You use the normal "y" (yank) and "p" (put) commands, but
381prepend "* (double-quote star) before it. To copy a line to the clipboard: >
382
383 "*yy
384
385To put text from the clipboard back into the text: >
386
387 "*p
388
389This only works on versions of Vim that include clipboard support. More about
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100390the clipboard can be found in section |09.3| and here: |clipboard|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391
392==============================================================================
393*04.8* Text objects
394
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000395If the cursor is in the middle of a word and you want to delete that word, you
Bram Moolenaar071d4272004-06-13 20:20:40 +0000396need to move back to its start before you can do "dw". There is a simpler way
397to do this: "daw".
398
399 this is some example text. ~
400 daw
401
402 this is some text. ~
403
404The "d" of "daw" is the delete operator. "aw" is a text object. Hint: "aw"
405stands for "A Word". Thus "daw" is "Delete A Word". To be precise, the white
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100406space after the word is also deleted (or the white space before the word if at
407the end of the line).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000408
409Using text objects is the third way to make changes in Vim. We already had
410operator-motion and Visual mode. Now we add operator-text object.
411 It is very similar to operator-motion, but instead of operating on the text
412between the cursor position before and after a movement command, the text
413object is used as a whole. It doesn't matter where in the object the cursor
414was.
415
416To change a whole sentence use "cis". Take this text:
417
418 Hello there. This ~
419 is an example. Just ~
420 some text. ~
421
422Move to the start of the second line, on "is an". Now use "cis":
423
424 Hello there. Just ~
425 some text. ~
426
427The cursor is in between the blanks in the first line. Now you type the new
428sentence "Another line.":
429
430 Hello there. Another line. Just ~
431 some text. ~
432
433"cis" consists of the "c" (change) operator and the "is" text object. This
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100434stands for "Inner Sentence". There is also the "as" ("A Sentence") object.
435The difference is that "as" includes the white space after the sentence and
436"is" doesn't. If you would delete a sentence, you want to delete the white
437space at the same time, thus use "das". If you want to type new text the
438white space can remain, thus you use "cis".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439
440You can also use text objects in Visual mode. It will include the text object
441in the Visual selection. Visual mode continues, thus you can do this several
442times. For example, start Visual mode with "v" and select a sentence with
443"as". Now you can repeat "as" to include more sentences. Finally you use an
444operator to do something with the selected sentences.
445
446You can find a long list of text objects here: |text-objects|.
447
448==============================================================================
449*04.9* Replace mode
450
451The "R" command causes Vim to enter replace mode. In this mode, each
452character you type replaces the one under the cursor. This continues until
453you type <Esc>.
454 In this example you start Replace mode on the first "t" of "text":
455
456 This is text. ~
457 Rinteresting.<Esc>
458
459 This is interesting. ~
460
461You may have noticed that this command replaced 5 characters in the line with
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +0000462twelve others. The "R" command automatically extends the line if it runs out
Bram Moolenaar071d4272004-06-13 20:20:40 +0000463of characters to replace. It will not continue on the next line.
464
465You can switch between Insert mode and Replace mode with the <Insert> key.
466
Bram Moolenaar9faec4e2021-02-27 16:38:07 +0100467When you use <BS> (backspace) to make a correction, you will notice that the
468old text is put back. Thus it works like an undo command for the previously
469typed character.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470
471==============================================================================
472*04.10* Conclusion
473
474The operators, movement commands and text objects give you the possibility to
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100475make lots of combinations. Now that you know how they work, you can use N
Bram Moolenaar071d4272004-06-13 20:20:40 +0000476operators with M movement commands to make N * M commands!
477
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100478You can find a list of operators here: |operator|.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000479
480For example, there are many other ways to delete pieces of text. Here are a
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100481few common ones:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482
483x delete character under the cursor (short for "dl")
484X delete character before the cursor (short for "dh")
485D delete from cursor to end of line (short for "d$")
486dw delete from cursor to next start of word
487db delete from cursor to previous start of word
488diw delete word under the cursor (excluding white space)
489daw delete word under the cursor (including white space)
490dG delete until the end of the file
491dgg delete until the start of the file
492
493If you use "c" instead of "d" they become change commands. And with "y" you
494yank the text. And so forth.
495
496
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100497There are a few common commands to make changes that didn't fit somewhere
Bram Moolenaar071d4272004-06-13 20:20:40 +0000498else:
499
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100500 ~ Change case of the character under the cursor, and move the
Bram Moolenaar071d4272004-06-13 20:20:40 +0000501 cursor to the next character. This is not an operator (unless
502 'tildeop' is set), thus you can't use it with a motion
Bram Moolenaar0c0734d2019-11-26 21:44:46 +0100503 command. It does work in Visual mode, where it changes case
504 for all the selected text.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000505
506 I Start Insert mode after moving the cursor to the first
507 non-blank in the line.
508
509 A Start Insert mode after moving the cursor to the end of the
510 line.
511
512==============================================================================
513
514Next chapter: |usr_05.txt| Set your settings
515
Bram Moolenaard473c8c2018-08-11 18:00:22 +0200516Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: