blob: 9e536d541b8652abf8d3c63c457a09bb87efd885 [file] [log] [blame]
Bram Moolenaare2cc9702005-03-15 22:43:58 +00001*usr_10.txt* For Vim version 7.0aa. Last change: 2005 Mar 15
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3 VIM USER MANUAL - by Bram Moolenaar
4
5 Making big changes
6
7
8In chapter 4 several ways to make small changes were explained. This chapter
9goes into making changes that are repeated or can affect a large amount of
10text. The Visual mode allows doing various things with blocks of text. Use
11an external program to do really complicated things.
12
13|10.1| Record and playback commands
14|10.2| Substitution
15|10.3| Command ranges
16|10.4| The global command
17|10.5| Visual block mode
18|10.6| Reading and writing part of a file
19|10.7| Formatting text
20|10.8| Changing case
21|10.9| Using an external program
22
23 Next chapter: |usr_11.txt| Recovering from a crash
24 Previous chapter: |usr_09.txt| Using the GUI
25Table of contents: |usr_toc.txt|
26
27==============================================================================
28*10.1* Record and playback commands
29
30The "." command repeats the preceding change. But what if you want to do
31something more complex than a single change? That's where command recording
32comes in. There are three steps:
33
341. The "q{register}" command starts recording keystrokes into the register
35 named {register}. The register name must be between a and z.
362. Type your commands.
373. To finish recording, press q (without any extra character).
38
39You can now execute the macro by typing the command "@{register}".
40
41Take a look at how to use these commands in practice. You have a list of
42filenames that look like this:
43
44 stdio.h ~
45 fcntl.h ~
46 unistd.h ~
47 stdlib.h ~
48
49And what you want is the following:
50
51 #include "stdio.h" ~
52 #include "fcntl.h" ~
53 #include "unistd.h" ~
54 #include "stdlib.h" ~
55
56You start by moving to the first character of the first line. Next you
57execute the following commands:
58
59 qa Start recording a macro in register a.
60 ^ Move to the beginning of the line.
61 i#include "<Esc> Insert the string #include " at the beginning
62 of the line.
63 $ Move to the end of the line.
64 a"<Esc> Append the character double quotation mark (")
65 to the end of the line.
66 j Go to the next line.
67 q Stop recording the macro.
68
69Now that you have done the work once, you can repeat the change by typing the
70command "@a" three times.
71 The "@a" command can be preceded by a count, which will cause the macro to
72be executed that number of times. In this case you would type: >
73
74 3@a
75
76
77MOVE AND EXECUTE
78
79You might have the lines you want to change in various places. Just move the
80cursor to each location and use the "@a" command. If you have done that once,
81you can do it again with "@@". That's a bit easier to type. If you now
82execute register b with "@b", the next "@@" will use register b.
83 If you compare the playback method with using ".", there are several
84differences. First of all, "." can only repeat one change. As seen in the
85example above, "@a" can do several changes, and move around as well.
86Secondly, "." can only remember the last change. Executing a register allows
87you to make any changes and then still use "@a" to replay the recorded
88commands. Finally, you can use 26 different registers. Thus you can remember
8926 different command sequences to execute.
90
91
92USING REGISTERS
93
94The registers used for recording are the same ones you used for yank and
95delete commands. This allows you to mix recording with other commands to
96manipulate the registers.
97 Suppose you have recorded a few commands in register n. When you execute
98this with "@n" you notice you did something wrong. You could try recording
99again, but perhaps you will make another mistake. Instead, use this trick:
100
101 G Go to the end of the file.
102 o<Esc> Create an empty line.
103 "np Put the text from the n register. You now see
104 the commands you typed as text in the file.
105 {edits} Change the commands that were wrong. This is
106 just like editing text.
107 0 Go to the start of the line.
108 "ny$ Yank the corrected commands into the n
109 register.
110 dd Delete the scratch line.
111
112Now you can execute the corrected commands with "@n". (If your recorded
113commands include line breaks, adjust the last two items in the example to
114include all the lines.)
115
116
117APPENDING TO A REGISTER
118
119So far we have used a lowercase letter for the register name. To append to a
120register, use an uppercase letter.
121 Suppose you have recorded a command to change a word to register c. It
122works properly, but you would like to add a search for the next word to
123change. This can be done with: >
124
125 qC/word<Enter>q
126
127You start with "qC", which records to the c register and appends. Thus
128writing to an uppercase register name means to append to the register with
129the same letter, but lowercase.
130
131This works both with recording and with yank and delete commands. For
132example, you want to collect a sequence of lines into the a register. Yank
133the first line with: >
134
135 "aY
136
137Now move to the second line, and type: >
138
139 "AY
140
141Repeat this command for all lines. The a register now contains all those
142lines, in the order you yanked them.
143
144==============================================================================
145*10.2* Substitution *find-replace*
146
147The ":substitute" command enables you to perform string replacements on a
148whole range of lines. The general form of this command is as follows: >
149
150 :[range]substitute/from/to/[flags]
151
152This command changes the "from" string to the "to" string in the lines
153specified with [range]. For example, you can change "Professor" to "Teacher"
154in all lines with the following command: >
155
156 :%substitute/Professor/Teacher/
157<
158 Note:
159 The ":substitute" command is almost never spelled out completely.
160 Most of the time, people use the abbreviated version ":s". From here
161 on the abbreviation will be used.
162
163The "%" before the command specifies the command works on all lines. Without
164a range, ":s" only works on the current line. More about ranges in the next
165section |10.3|.
166
167By default, the ":substitute" command changes only the first occurrence on
168each line. For example, the preceding command changes the line:
169
170 Professor Smith criticized Professor Johnson today. ~
171
172to:
173
174 Teacher Smith criticized Professor Johnson today. ~
175
176To change every occurrence on the line, you need to add the g (global) flag.
177The command: >
178
179 :%s/Professor/Teacher/g
180
181results in (starting with the original line):
182
183 Teacher Smith criticized Teacher Johnson today. ~
184
185Other flags include p (print), which causes the ":substitute" command to print
186out each line it changes. The c (confirm) flag tells ":substitute" to ask you
187for confirmation before it performs each substitution. Enter the following: >
188
189 :%s/Professor/Teacher/c
190
191Vim finds the first occurrence of "Professor" and displays the text it is
192about to change. You get the following prompt: >
193
194 replace with Teacher (y/n/a/q/l/^E/^Y)?
195
196At this point, you must enter one of the following answers:
197
198 y Yes; make this change.
199 n No; skip this match.
200 a All; make this change and all remaining ones without
201 further confirmation.
202 q Quit; don't make any more changes.
203 l Last; make this change and then quit.
204 CTRL-E Scroll the text one line up.
205 CTRL-Y Scroll the text one line down.
206
207
208The "from" part of the substitute command is actually a pattern. The same
209kind as used for the search command. For example, this command only
210substitutes "the" when it appears at the start of a line: >
211
212 :s/^the/these/
213
214If you are substituting with a "from" or "to" part that includes a slash, you
215need to put a backslash before it. A simpler way is to use another character
216instead of the slash. A plus, for example: >
217
218 :s+one/two+one or two+
219
220==============================================================================
221*10.3* Command ranges
222
223The ":substitute" command, and many other : commands, can be applied to a
224selection of lines. This is called a range.
225 The simple form of a range is {number},{number}. For example: >
226
227 :1,5s/this/that/g
228
229Executes the substitute command on the lines 1 to 5. Line 5 is included.
230The range is always placed before the command.
231
232A single number can be used to address one specific line: >
233
234 :54s/President/Fool/
235
236Some commands work on the whole file when you do not specify a range. To make
237them work on the current line the "." address is used. The ":write" command
238works like that. Without a range, it writes the whole file. To make it write
239only the current line into a file: >
240
241 :.write otherfile
242
243The first line always has number one. How about the last line? The "$"
244character is used for this. For example, to substitute in the lines from the
245cursor to the end: >
246
247 :.,$s/yes/no/
248
249The "%" range that we used before, is actually a short way to say "1,$", from
250the first to the last line.
251
252
253USING A PATTERN IN A RANGE
254
255Suppose you are editing a chapter in a book, and want to replace all
256occurrences of "grey" with "gray". But only in this chapter, not in the next
257one. You know that only chapter boundaries have the word "Chapter" in the
258first column. This command will work then: >
259
260 :?^Chapter?,/^Chapter/s=grey=gray=g
261
262You can see a search pattern is used twice. The first "?^Chapter?" finds the
263line above the current position that matches this pattern. Thus the ?pattern?
264range is used to search backwards. Similarly, "/^Chapter/" is used to search
265forward for the start of the next chapter.
266 To avoid confusion with the slashes, the "=" character was used in the
267substitute command here. A slash or another character would have worked as
268well.
269
270
271ADD AND SUBTRACT
272
273There is a slight error in the above command: If the title of the next chapter
274had included "grey" it would be replaced as well. Maybe that's what you
275wanted, but what if you didn't? Then you can specify an offset.
276 To search for a pattern and then use the line above it: >
277
278 /Chapter/-1
279
280You can use any number instead of the 1. To address the second line below the
281match: >
282
283 /Chapter/+2
284
285The offsets can also be used with the other items in a range. Look at this
286one: >
287
288 :.+3,$-5
289
290This specifies the range that starts three lines below the cursor and ends
291five lines before the last line in the file.
292
293
294USING MARKS
295
296Instead of figuring out the line numbers of certain positions, remembering them
297and typing them in a range, you can use marks.
298 Place the marks as mentioned in chapter 3. For example, use "mt" to mark
299the top of an area and "mb" to mark the bottom. Then you can use this range
300to specify the lines between the marks (including the lines with the marks): >
301
302 :'t,'b
303
304
305VISUAL MODE AND RANGES
306
307You can select text with Visual mode. If you then press ":" to start a colon
308command, you will see this: >
309
310 :'<,'>
311
312Now you can type the command and it will be applied to the range of lines that
313was visually selected.
314
315 Note:
316 When using Visual mode to select part of a line, or using CTRL-V to
317 select a block of text, the colon commands will still apply to whole
318 lines. This might change in a future version of Vim.
319
320The '< and '> are actually marks, placed at the start and end of the Visual
321selection. The marks remain at their position until another Visual selection
322is made. Thus you can use the "'<" command to jump to position where the
323Visual area started. And you can mix the marks with other items: >
324
325 :'>,$
326
327This addresses the lines from the end of the Visual area to the end of the
328file.
329
330
331A NUMBER OF LINES
332
333When you know how many lines you want to change, you can type the number and
334then ":". For example, when you type "5:", you will get: >
335
336 :.,.+4
337
338Now you can type the command you want to use. It will use the range "."
339(current line) until ".+4" (four lines down). Thus it spans five lines.
340
341==============================================================================
342*10.4* The global command
343
344The ":global" command is one of the more powerful features of Vim. It allows
345you to find a match for a pattern and execute a command there. The general
346form is: >
347
348 :[range]global/{pattern}/{command}
349
350This is similar to the ":substitute" command. But, instead of replacing the
351matched text with other text, the command {command} is executed.
352
353 Note:
354 The command executed for ":global" must be one that starts with a
355 colon. Normal mode commands can not be used directly. The |:normal|
356 command can do this for you.
357
358Suppose you want to change "foobar" to "barfoo", but only in C++ style
359comments. These comments start with "//". Use this command: >
360
361 :g+//+s/foobar/barfoo/g
362
363This starts with ":g". That is short for ":global", just like ":s" is short
364for ":substitute". Then the pattern, enclosed in plus characters. Since the
365pattern we are looking for contains a slash, this uses the plus character to
366separate the pattern. Next comes the substitute command that changes "foobar"
367into "barfoo".
368 The default range for the global command is the whole file. Thus no range
369was specified in this example. This is different from ":substitute", which
370works on one line without a range.
371 The command isn't perfect, since it also matches lines where "//" appears
372halfway a line, and the substitution will also take place before the "//".
373
374Just like with ":substitute", any pattern can be used. When you learn more
375complicated patterns later, you can use them here.
376
377==============================================================================
378*10.5* Visual block mode
379
380With CTRL-V you can start selection of a rectangular area of text. There are
381a few commands that do something special with the text block.
382
383There is something special about using the "$" command in Visual block mode.
384When the last motion command used was "$", all lines in the Visual selection
385will extend until the end of the line, also when the line with the cursor is
386shorter. This remains effective until you use a motion command that moves the
387cursor horizontally. Thus using "j" keeps it, "h" stops it.
388
389
390INSERTING TEXT
391
392The command "I{string}<Esc>" inserts the text {string} in each line, just
393left of the visual block. You start by pressing CTRL-V to enter visual block
394mode. Now you move the cursor to define your block. Next you type I to enter
395Insert mode, followed by the text to insert. As you type, the text appears on
396the first line only.
397 After you press <Esc> to end the insert, the text will magically be
398inserted in the rest of the lines contained in the visual selection. Example:
399
400 include one ~
401 include two ~
402 include three ~
403 include four ~
404
405Move the cursor to the "o" of "one" and press CTRL-V. Move it down with "3j"
406to "four". You now have a block selection that spans four lines. Now type: >
407
408 Imain.<Esc>
409
410The result:
411
412 include main.one ~
413 include main.two ~
414 include main.three ~
415 include main.four ~
416
417If the block spans short lines that do not extend into the block, the text is
418not inserted in that line. For example, make a Visual block selection that
419includes the word "long" in the first and last line of this text, and thus has
420no text selected in the second line:
421
422 This is a long line ~
423 short ~
424 Any other long line ~
425
426 ^^^^ selected block
427
428Now use the command "Ivery <Esc>". The result is:
429
430 This is a very long line ~
431 short ~
432 Any other very long line ~
433
434In the short line no text was inserted.
435
436If the string you insert contains a newline, the "I" acts just like a Normal
437insert command and affects only the first line of the block.
438
439The "A" command works the same way, except that it appends after the right
Bram Moolenaare2cc9702005-03-15 22:43:58 +0000440side of the block. And it does insert text in a short line. Thus you can
441make a choice whether you do or don't want to append text to a short line.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442 There is one special case for "A": Select a Visual block and then use "$"
443to make the block extend to the end of each line. Using "A" now will append
444the text to the end of each line.
445 Using the same example from above, and then typing "$A XXX<Esc>, you get
446this result:
447
448 This is a long line XXX ~
449 short XXX ~
450 Any other long line XXX ~
451
452This really requires using the "$" command. Vim remembers that it was used.
453Making the same selection by moving the cursor to the end of the longest line
454with other movement commands will not have the same result.
455
456
457CHANGING TEXT
458
459The Visual block "c" command deletes the block and then throws you into Insert
460mode to enable you to type in a string. The string will be inserted in each
461line in the block.
462 Starting with the same selection of the "long" words as above, then typing
463"c_LONG_<Esc>", you get this:
464
465 This is a _LONG_ line ~
466 short ~
467 Any other _LONG_ line ~
468
469Just like with "I" the short line is not changed. Also, you can't enter a
470newline in the new text.
471
472The "C" command deletes text from the left edge of the block to the end of
473line. It then puts you in Insert mode so that you can type in a string,
474which is added to the end of each line.
475 Starting with the same text again, and typing "Cnew text<Esc>" you get:
476
477 This is a new text ~
478 short ~
479 Any other new text ~
480
481Notice that, even though only the "long" word was selected, the text after it
482is deleted as well. Thus only the location of the left edge of the visual
483block really matters.
484 Again, short lines that do not reach into the block are excluded.
485
486Other commands that change the characters in the block:
487
488 ~ swap case (a -> A and A -> a)
489 U make uppercase (a -> A and A -> A)
490 u make lowercase (a -> a and A -> a)
491
492
493FILLING WITH A CHARACTER
494
495To fill the whole block with one character, use the "r" command. Again,
496starting with the same example text from above, and then typing "rx":
497
498 This is a xxxx line ~
499 short ~
500 Any other xxxx line ~
501
502
503 Note:
504 If you want to include characters beyond the end of the line in the
505 block, check out the 'virtualedit' feature in chapter 25.
506
507
508SHIFTING
509
510The command ">" shifts the selected text to the right one shift amount,
511inserting whitespace. The starting point for this shift is the left edge of
512the visual block.
513 With the same example again, ">" gives this result:
514
515 This is a long line ~
516 short ~
517 Any other long line ~
518
519The shift amount is specified with the 'shiftwidth' option. To change it to
520use 4 spaces: >
521
522 :set shiftwidth=4
523
524The "<" command removes one shift amount of whitespace at the left
525edge of the block. This command is limited by the amount of text that is
526there; so if there is less than a shift amount of whitespace available, it
527removes what it can.
528
529
530JOINING LINES
531
532The "J" command joins all selected lines together into one line. Thus it
533removes the line breaks. Actually, the line break, leading white space and
534trailing white space is replaced by one space. Two spaces are used after a
535line ending (that can be changed with the 'joinspaces' option).
536 Let's use the example that we got so familiar with now. The result of
537using the "J" command:
538
539 This is a long line short Any other long line ~
540
541The "J" command doesn't require a blockwise selection. It works with "v" and
542"V" selection in exactly the same way.
543
544If you don't want the white space to be changed, use the "gJ" command.
545
546==============================================================================
547*10.6* Reading and writing part of a file
548
549When you are writing an e-mail message, you may want to include another file.
550This can be done with the ":read {filename}" command. The text of the file is
551put below the cursor line.
552 Starting with this text:
553
554 Hi John, ~
555 Here is the diff that fixes the bug: ~
556 Bye, Pierre. ~
557
558Move the cursor to the second line and type: >
559
560 :read patch
561
562The file named "patch" will be inserted, with this result:
563
564 Hi John, ~
565 Here is the diff that fixes the bug: ~
566 2c2 ~
567 < for (i = 0; i <= length; ++i) ~
568 --- ~
569 > for (i = 0; i < length; ++i) ~
570 Bye, Pierre. ~
571
572The ":read" command accepts a range. The file will be put below the last line
573number of this range. Thus ":$r patch" appends the file "patch" at the end of
574the file.
575 What if you want to read the file above the first line? This can be done
576with the line number zero. This line doesn't really exist, you will get an
577error message when using it with most commands. But this command is allowed:
578>
579 :0read patch
580
581The file "patch" will be put above the first line of the file.
582
583
584WRITING A RANGE OF LINES
585
586To write a range of lines to a file, the ":write" command can be used.
587Without a range it writes the whole file. With a range only the specified
588lines are written: >
589
590 :.,$write tempo
591
592This writes the lines from the cursor until the end of the file into the file
593"tempo". If this file already exists you will get an error message. Vim
594protects you from accidentally overwriting an existing file. If you know what
595you are doing and want to overwrite the file, append !: >
596
597 :.,$write! tempo
598
599CAREFUL: The ! must follow the ":write" command immediately, without white
600space. Otherwise it becomes a filter command, which is explained later in
601this chapter.
602
603
604APPENDING TO A FILE
605
606In the first section of this chapter was explained how to collect a number of
607lines into a register. The same can be done to collect lines in a file.
608Write the first line with this command: >
609
610 :.write collection
611
612Now move the cursor to the second line you want to collect, and type this: >
613
614 :.write >>collection
615
616The ">>" tells Vim the "collection" file is not to be written as a new file,
617but the line must be appended at the end. You can repeat this as many times
618as you like.
619
620==============================================================================
621*10.7* Formatting text
622
623When you are typing plain text, it's nice if the length of each line is
624automatically trimmed to fit in the window. To make this happen while
625inserting text, set the 'textwidth' option: >
626
627 :set textwidth=72
628
629You might remember that in the example vimrc file this command was used for
630every text file. Thus if you are using that vimrc file, you were already
631using it. To check the current value of 'textwidth': >
632
633 :set textwidth
634
635Now lines will be broken to take only up to 72 characters. But when you
636insert text halfway a line, or when you delete a few words, the lines will get
637too long or too short. Vim doesn't automatically reformat the text.
638 To tell Vim to format the current paragraph: >
639
640 gqap
641
642This starts with the "gq" command, which is an operator. Following is "ap",
643the text object that stands for "a paragraph". A paragraph is separated from
644the next paragraph by an empty line.
645
646 Note:
647 A blank line, which contains white space, does NOT separate
648 paragraphs. This is hard to notice!
649
650Instead of "ap" you could use any motion or text object. If your paragraphs
651are properly separated, you can use this command to format the whole file: >
652
653 gggqG
654
655"gg" takes you to the first line, "gq" is the format operator and "G" the
656motion that jumps to the last line.
657
658In case your paragraphs aren't clearly defined, you can format just the lines
659you manually select. Move the cursor to the first line you want to format.
660Start with the command "gqj". This formats the current line and the one below
661it. If the first line was short, words from the next line will be appended.
662If it was too long, words will be moved to the next line. The cursor moves to
663the second line. Now you can use "." to repeat the command. Keep doing this
664until you are at the end of the text you want to format.
665
666==============================================================================
667*10.8* Changing case
668
669You have text with section headers in lowercase. You want to make the word
670"section" all uppercase. Do this with the "gU" operator. Start with the
671cursor in the first column: >
672
673 gUw
674< section header ----> SECTION header
675
676The "gu" operator does exactly the opposite: >
677
678 guw
679< SECTION header ----> section header
680
681You can also use "g~" to swap case. All these are operators, thus they work
682with any motion command, with text objects and in Visual mode.
683 To make an operator work on lines you double it. The delete operator is
684"d", thus to delete a line you use "dd". Similarly, "gugu" makes a whole line
685lowercase. This can be shortened to "guu". "gUgU" is shortened to "gUU" and
686"g~g~" to "g~~". Example: >
687
688 g~~
689< Some GIRLS have Fun ----> sOME girls HAVE fUN ~
690
691==============================================================================
692*10.9* Using an external program
693
694Vim has a very powerful set of commands, it can do anything. But there may
695still be something that an external command can do better or faster.
696 The command "!{motion}{program}" takes a block of text and filters it
697through an external program. In other words, it runs the system command
698represented by {program}, giving it the block of text represented by {motion}
699as input. The output of this command then replaces the selected block.
700 Because this summarizes badly if you are unfamiliar with UNIX filters, take
701a look at an example. The sort command sorts a file. If you execute the
702following command, the unsorted file input.txt will be sorted and written to
703output.txt. (This works on both UNIX and Microsoft Windows.) >
704
705 sort <input.txt >output.txt
706
707Now do the same thing in Vim. You want to sort lines 1 through 5 of a file.
708You start by putting the cursor on line 1. Next you execute the following
709command: >
710
711 !5G
712
713The "!" tells Vim that you are performing a filter operation. The Vim editor
714expects a motion command to follow, indicating which part of the file to
715filter. The "5G" command tells Vim to go to line 5, so it now knows that it
716is to filter lines 1 (the current line) through 5.
717 In anticipation of the filtering, the cursor drops to the bottom of the
718screen and a ! prompt displays. You can now type in the name of the filter
719program, in this case "sort". Therefore, your full command is as follows: >
720
721 !5Gsort<Enter>
722
723The result is that the sort program is run on the first 5 lines. The output
724of the program replaces these lines.
725
726 line 55 line 11
727 line 33 line 22
728 line 11 --> line 33
729 line 22 line 44
730 line 44 line 55
731 last line last line
732
733The "!!" command filters the current line through a filter. In Unix the "date"
734command prints the current time and date. "!!date<Enter>" replaces the current
735line with the output of "date". This is useful to add a timestamp to a file.
736
737
738WHEN IT DOESN'T WORK
739
740Starting a shell, sending it text and capturing the output requires that Vim
741knows how the shell works exactly. When you have problems with filtering,
742check the values of these options:
743
744 'shell' specifies the program that Vim uses to execute
745 external programs.
746 'shellcmdflag' argument to pass a command to the shell
747 'shellquote' quote to be used around the command
748 'shellxquote' quote to be used around the command and redirection
749 'shelltype' kind of shell (only for the Amiga)
750 'shellslash' use forward slashes in the command (only for
751 MS-Windows and alikes)
752 'shellredir' string used to write the command output into a file
753
754On Unix this is hardly ever a problem, because there are two kinds of shells:
755"sh" like and "csh" like. Vim checks the 'shell' option and sets related
756options automatically, depending on whether it sees "csh" somewhere in
757'shell'.
758 On MS-Windows, however, there are many different shells and you might have
759to tune the options to make filtering work. Check the help for the options
760for more information.
761
762
763READING COMMAND OUTPUT
764
765To read the contents of the current directory into the file, use this:
766
767on Unix: >
768 :read !ls
769on MS-Windows: >
770 :read !dir
771
772The output of the "ls" or "dir" command is captured and inserted in the text,
773below the cursor. This is similar to reading a file, except that the "!" is
774used to tell Vim that a command follows.
775 The command may have arguments. And a range can be used to tell where Vim
776should put the lines: >
777
778 :0read !date -u
779
780This inserts the current time and date in UTC format at the top of the file.
781(Well, if you have a date command that accepts the "-u" argument.) Note the
782difference with using "!!date": that replaced a line, while ":read !date" will
783insert a line.
784
785
786WRITING TEXT TO A COMMAND
787
788The Unix command "wc" counts words. To count the words in the current file: >
789
790 :write !wc
791
792This is the same write command as before, but instead of a file name the "!"
793character is used and the name of an external command. The written text will
794be passed to the specified command as its standard input. The output could
795look like this:
796
797 4 47 249 ~
798
799The "wc" command isn't verbose. This means you have 4 lines, 47 words and 249
800characters.
801
802Watch out for this mistake: >
803
804 :write! wc
805
806This will write the file "wc" in the current directory, with force. White
807space is important here!
808
809
810REDRAWING THE SCREEN
811
812If the external command produced an error message, the display may have been
813messed up. Vim is very efficient and only redraws those parts of the screen
814that it knows need redrawing. But it can't know about what another program
815has written. To tell Vim to redraw the screen: >
816
817 CTRL-L
818
819==============================================================================
820
821Next chapter: |usr_11.txt| Recovering from a crash
822
823Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl: