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