Christian Brabandt | b4ddc6c | 2024-01-02 16:51:11 +0100 | [diff] [blame] | 1 | *usr_07.txt* For Vim version 9.1. Last change: 2020 Mar 23 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | VIM USER MANUAL - by Bram Moolenaar |
| 4 | |
| 5 | Editing more than one file |
| 6 | |
| 7 | |
| 8 | No matter how many files you have, you can edit them without leaving Vim. |
| 9 | Define a list of files to work on and jump from one to the other. Copy text |
| 10 | from one file and put it in another one. |
| 11 | |
| 12 | |07.1| Edit another file |
| 13 | |07.2| A list of files |
| 14 | |07.3| Jumping from file to file |
| 15 | |07.4| Backup files |
| 16 | |07.5| Copy text between files |
| 17 | |07.6| Viewing a file |
| 18 | |07.7| Changing the file name |
| 19 | |
| 20 | Next chapter: |usr_08.txt| Splitting windows |
| 21 | Previous chapter: |usr_06.txt| Using syntax highlighting |
| 22 | Table of contents: |usr_toc.txt| |
| 23 | |
| 24 | ============================================================================== |
| 25 | *07.1* Edit another file |
| 26 | |
| 27 | So far you had to start Vim for every file you wanted to edit. There is a |
| 28 | simpler way. To start editing another file, use this command: > |
| 29 | |
| 30 | :edit foo.txt |
| 31 | |
| 32 | You can use any file name instead of "foo.txt". Vim will close the current |
| 33 | file and open the new one. If the current file has unsaved changes, however, |
| 34 | Vim displays an error message and does not open the new file: |
| 35 | |
| 36 | E37: No write since last change (use ! to override) ~ |
| 37 | |
| 38 | Note: |
| 39 | Vim puts an error ID at the start of each error message. If you do |
| 40 | not understand the message or what caused it, look in the help system |
| 41 | for this ID. In this case: > |
| 42 | |
| 43 | :help E37 |
| 44 | |
| 45 | At this point, you have a number of alternatives. You can write the file |
| 46 | using this command: > |
| 47 | |
| 48 | :write |
| 49 | |
| 50 | Or you can force Vim to discard your changes and edit the new file, using the |
| 51 | force (!) character: > |
| 52 | |
| 53 | :edit! foo.txt |
| 54 | |
| 55 | If you want to edit another file, but not write the changes in the current |
| 56 | file yet, you can make it hidden: > |
| 57 | |
| 58 | :hide edit foo.txt |
| 59 | |
| 60 | The text with changes is still there, but you can't see it. This is further |
| 61 | explained in section |22.4|: The buffer list. |
| 62 | |
| 63 | ============================================================================== |
| 64 | *07.2* A list of files |
| 65 | |
| 66 | You can start Vim to edit a sequence of files. For example: > |
| 67 | |
| 68 | vim one.c two.c three.c |
| 69 | |
| 70 | This command starts Vim and tells it that you will be editing three files. |
| 71 | Vim displays just the first file. After you have done your thing in this |
| 72 | file, to edit the next file you use this command: > |
| 73 | |
| 74 | :next |
| 75 | |
| 76 | If you have unsaved changes in the current file, you will get an error |
| 77 | message and the ":next" will not work. This is the same problem as with |
| 78 | ":edit" mentioned in the previous section. To abandon the changes: > |
| 79 | |
| 80 | :next! |
| 81 | |
| 82 | But mostly you want to save the changes and move on to the next file. There |
| 83 | is a special command for this: > |
| 84 | |
| 85 | :wnext |
| 86 | |
| 87 | This does the same as using two separate commands: > |
| 88 | |
| 89 | :write |
| 90 | :next |
| 91 | |
| 92 | |
| 93 | WHERE AM I? |
| 94 | |
| 95 | To see which file in the argument list you are editing, look in the window |
| 96 | title. It should show something like "(2 of 3)". This means you are editing |
| 97 | the second file out of three files. |
| 98 | If you want to see the list of files, use this command: > |
| 99 | |
| 100 | :args |
| 101 | |
| 102 | This is short for "arguments". The output might look like this: |
| 103 | |
| 104 | one.c [two.c] three.c ~ |
| 105 | |
| 106 | These are the files you started Vim with. The one you are currently editing, |
| 107 | "two.c", is in square brackets. |
| 108 | |
| 109 | |
| 110 | MOVING TO OTHER ARGUMENTS |
| 111 | |
| 112 | To go back one file: > |
| 113 | |
| 114 | :previous |
| 115 | |
| 116 | This is just like the ":next" command, except that it moves in the other |
| 117 | direction. Again, there is a shortcut command for when you want to write the |
| 118 | file first: > |
| 119 | |
| 120 | :wprevious |
| 121 | |
| 122 | To move to the very last file in the list: > |
| 123 | |
| 124 | :last |
| 125 | |
| 126 | And to move back to the first one again: > |
| 127 | |
| 128 | :first |
| 129 | |
| 130 | There is no ":wlast" or ":wfirst" command though! |
| 131 | |
| 132 | You can use a count for ":next" and ":previous". To skip two files forward: > |
| 133 | |
| 134 | :2next |
| 135 | |
| 136 | |
| 137 | AUTOMATIC WRITING |
| 138 | |
| 139 | When moving around the files and making changes, you have to remember to use |
| 140 | ":write". Otherwise you will get an error message. If you are sure you |
| 141 | always want to write modified files, you can tell Vim to automatically write |
| 142 | them: > |
| 143 | |
| 144 | :set autowrite |
| 145 | |
| 146 | When you are editing a file which you may not want to write, switch it off |
| 147 | again: > |
| 148 | |
| 149 | :set noautowrite |
| 150 | |
| 151 | |
| 152 | EDITING ANOTHER LIST OF FILES |
| 153 | |
| 154 | You can redefine the list of files without the need to exit Vim and start it |
| 155 | again. Use this command to edit three other files: > |
| 156 | |
| 157 | :args five.c six.c seven.h |
| 158 | |
| 159 | Or use a wildcard, like it's used in the shell: > |
| 160 | |
| 161 | :args *.txt |
| 162 | |
| 163 | Vim will take you to the first file in the list. Again, if the current file |
| 164 | has changes, you can either write the file first, or use ":args!" (with ! |
| 165 | added) to abandon the changes. |
| 166 | |
| 167 | |
| 168 | DID YOU EDIT THE LAST FILE? |
| 169 | *arglist-quit* |
| 170 | When you use a list of files, Vim assumes you want to edit them all. To |
| 171 | protect you from exiting too early, you will get this error when you didn't |
| 172 | edit the last file in the list yet: |
| 173 | |
| 174 | E173: 46 more files to edit ~ |
| 175 | |
| 176 | If you really want to exit, just do it again. Then it will work (but not when |
| 177 | you did other commands in between). |
| 178 | |
| 179 | ============================================================================== |
| 180 | *07.3* Jumping from file to file |
| 181 | |
| 182 | To quickly jump between two files, press CTRL-^ (on English-US keyboards the ^ |
| 183 | is above the 6 key). Example: > |
| 184 | |
| 185 | :args one.c two.c three.c |
| 186 | |
| 187 | You are now in one.c. > |
| 188 | |
| 189 | :next |
| 190 | |
| 191 | Now you are in two.c. Now use CTRL-^ to go back to one.c. Another CTRL-^ and |
| 192 | you are back in two.c. Another CTRL-^ and you are in one.c again. If you now |
| 193 | do: > |
| 194 | |
| 195 | :next |
| 196 | |
| 197 | You are in three.c. Notice that the CTRL-^ command does not change the idea |
| 198 | of where you are in the list of files. Only commands like ":next" and |
| 199 | ":previous" do that. |
| 200 | |
| 201 | The file you were previously editing is called the "alternate" file. When you |
| 202 | just started Vim CTRL-^ will not work, since there isn't a previous file. |
| 203 | |
| 204 | |
| 205 | PREDEFINED MARKS |
| 206 | |
| 207 | After jumping to another file, you can use two predefined marks which are very |
| 208 | useful: > |
| 209 | |
| 210 | `" |
| 211 | |
| 212 | This takes you to the position where the cursor was when you left the file. |
| 213 | Another mark that is remembered is the position where you made the last |
| 214 | change: > |
| 215 | |
| 216 | `. |
| 217 | |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 218 | Suppose you are editing the file "one.txt". Somewhere halfway through the |
| 219 | file you use "x" to delete a character. Then you go to the last line with "G" |
| 220 | and write the file with ":w". You edit several other files, and then use |
| 221 | ":edit one.txt" to come back to "one.txt". If you now use `" Vim jumps to the |
| 222 | last line of the file. Using `. takes you to the position where you deleted |
| 223 | the character. Even when you move around in the file `" and `. will take you |
| 224 | to the remembered position. At least until you make another change or leave |
| 225 | the file. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 226 | |
| 227 | |
| 228 | FILE MARKS |
| 229 | |
Bram Moolenaar | 191acfd | 2020-03-27 20:42:43 +0100 | [diff] [blame] | 230 | In section |03.10| was explained how you can place a mark in a file with "mx" |
| 231 | and jump to that position with "`x". That works within one file. If you edit |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 232 | another file and place marks there, these are specific for that file. Thus |
| 233 | each file has its own set of marks, they are local to the file. |
| 234 | So far we were using marks with a lowercase letter. There are also marks |
| 235 | with an uppercase letter. These are global, they can be used from any file. |
Bram Moolenaar | 37c64c7 | 2017-09-19 22:06:03 +0200 | [diff] [blame] | 236 | For example suppose that we are editing the file "foo.txt". Go to halfway |
| 237 | down the file ("50%") and place the F mark there (F for foo): > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 238 | |
| 239 | 50%mF |
| 240 | |
| 241 | Now edit the file "bar.txt" and place the B mark (B for bar) at its last line: |
| 242 | > |
| 243 | GmB |
| 244 | |
| 245 | Now you can use the "'F" command to jump back to halfway foo.txt. Or edit yet |
| 246 | another file, type "'B" and you are at the end of bar.txt again. |
| 247 | |
| 248 | The file marks are remembered until they are placed somewhere else. Thus you |
| 249 | can place the mark, do hours of editing and still be able to jump back to that |
| 250 | mark. |
| 251 | It's often useful to think of a simple connection between the mark letter |
| 252 | and where it is placed. For example, use the H mark in a header file, M in |
| 253 | a Makefile and C in a C code file. |
| 254 | |
| 255 | To see where a specific mark is, give an argument to the ":marks" command: > |
| 256 | |
| 257 | :marks M |
| 258 | |
| 259 | You can also give several arguments: > |
| 260 | |
| 261 | :marks MCP |
| 262 | |
| 263 | Don't forget that you can use CTRL-O and CTRL-I to jump to older and newer |
| 264 | positions without placing marks there. |
| 265 | |
| 266 | ============================================================================== |
| 267 | *07.4* Backup files |
| 268 | |
Bram Moolenaar | 13fcaaf | 2005-04-15 21:13:42 +0000 | [diff] [blame] | 269 | Usually Vim does not produce a backup file. If you want to have one, all you |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 270 | need to do is execute the following command: > |
| 271 | |
| 272 | :set backup |
| 273 | |
| 274 | The name of the backup file is the original file with a ~ added to the end. |
| 275 | If your file is named data.txt, for example, the backup file name is |
| 276 | data.txt~. |
| 277 | If you do not like the fact that the backup files end with ~, you can |
| 278 | change the extension: > |
| 279 | |
| 280 | :set backupext=.bak |
| 281 | |
| 282 | This will use data.txt.bak instead of data.txt~. |
| 283 | Another option that matters here is 'backupdir'. It specifies where the |
| 284 | backup file is written. The default, to write the backup in the same |
| 285 | directory as the original file, will mostly be the right thing. |
| 286 | |
| 287 | Note: |
| 288 | When the 'backup' option isn't set but the 'writebackup' is, Vim will |
| 289 | still create a backup file. However, it is deleted as soon as writing |
| 290 | the file was completed successfully. This functions as a safety |
| 291 | against losing your original file when writing fails in some way (disk |
| 292 | full is the most common cause; being hit by lightning might be |
| 293 | another, although less common). |
| 294 | |
| 295 | |
| 296 | KEEPING THE ORIGINAL FILE |
| 297 | |
| 298 | If you are editing source files, you might want to keep the file before you |
| 299 | make any changes. But the backup file will be overwritten each time you write |
| 300 | the file. Thus it only contains the previous version, not the first one. |
| 301 | To make Vim keep the original file, set the 'patchmode' option. This |
| 302 | specifies the extension used for the first backup of a changed file. Usually |
| 303 | you would do this: > |
| 304 | |
| 305 | :set patchmode=.orig |
| 306 | |
| 307 | When you now edit the file data.txt for the first time, make changes and write |
| 308 | the file, Vim will keep a copy of the unchanged file under the name |
| 309 | "data.txt.orig". |
| 310 | If you make further changes to the file, Vim will notice that |
| 311 | "data.txt.orig" already exists and leave it alone. Further backup files will |
| 312 | then be called "data.txt~" (or whatever you specified with 'backupext'). |
| 313 | If you leave 'patchmode' empty (that is the default), the original file |
| 314 | will not be kept. |
| 315 | |
| 316 | ============================================================================== |
| 317 | *07.5* Copy text between files |
| 318 | |
| 319 | This explains how to copy text from one file to another. Let's start with a |
| 320 | simple example. Edit the file that contains the text you want to copy. Move |
| 321 | the cursor to the start of the text and press "v". This starts Visual mode. |
| 322 | Now move the cursor to the end of the text and press "y". This yanks (copies) |
| 323 | the selected text. |
| 324 | To copy the above paragraph, you would do: > |
| 325 | |
| 326 | :edit thisfile |
| 327 | /This |
| 328 | vjjjj$y |
| 329 | |
| 330 | Now edit the file you want to put the text in. Move the cursor to the |
| 331 | character where you want the text to appear after. Use "p" to put the text |
| 332 | there. > |
| 333 | :edit otherfile |
| 334 | /There |
| 335 | p |
| 336 | |
| 337 | Of course you can use many other commands to yank the text. For example, to |
| 338 | select whole lines start Visual mode with "V". Or use CTRL-V to select a |
| 339 | rectangular block. Or use "Y" to yank a single line, "yaw" to yank-a-word, |
| 340 | etc. |
| 341 | The "p" command puts the text after the cursor. Use "P" to put the text |
| 342 | before the cursor. Notice that Vim remembers if you yanked a whole line or a |
| 343 | block, and puts it back that way. |
| 344 | |
| 345 | |
| 346 | USING REGISTERS |
| 347 | |
| 348 | When you want to copy several pieces of text from one file to another, having |
| 349 | to switch between the files and writing the target file takes a lot of time. |
| 350 | To avoid this, copy each piece of text to its own register. |
| 351 | A register is a place where Vim stores text. Here we will use the |
| 352 | registers named a to z (later you will find out there are others). Let's copy |
| 353 | a sentence to the f register (f for First): > |
| 354 | |
| 355 | "fyas |
| 356 | |
| 357 | The "yas" command yanks a sentence like before. It's the "f that tells Vim |
Bram Moolenaar | 1ccd8ff | 2017-08-11 19:50:37 +0200 | [diff] [blame] | 358 | the text should be placed in the f register. This must come just before the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 359 | yank command. |
| 360 | Now yank three whole lines to the l register (l for line): > |
| 361 | |
| 362 | "l3Y |
| 363 | |
| 364 | The count could be before the "l just as well. To yank a block of text to the |
| 365 | b (for block) register: > |
| 366 | |
| 367 | CTRL-Vjjww"by |
| 368 | |
| 369 | Notice that the register specification "b is just before the "y" command. |
| 370 | This is required. If you would have put it before the "w" command, it would |
| 371 | not have worked. |
| 372 | Now you have three pieces of text in the f, l and b registers. Edit |
| 373 | another file, move around and place the text where you want it: > |
| 374 | |
| 375 | "fp |
| 376 | |
| 377 | Again, the register specification "f comes before the "p" command. |
| 378 | You can put the registers in any order. And the text stays in the register |
| 379 | until you yank something else into it. Thus you can put it as many times as |
| 380 | you like. |
| 381 | |
| 382 | When you delete text, you can also specify a register. Use this to move |
| 383 | several pieces of text around. For example, to delete-a-word and write it in |
| 384 | the w register: > |
| 385 | |
| 386 | "wdaw |
| 387 | |
| 388 | Again, the register specification comes before the delete command "d". |
| 389 | |
| 390 | |
| 391 | APPENDING TO A FILE |
| 392 | |
| 393 | When collecting lines of text into one file, you can use this command: > |
| 394 | |
| 395 | :write >> logfile |
| 396 | |
| 397 | This will write the text of the current file to the end of "logfile". Thus it |
| 398 | is appended. This avoids that you have to copy the lines, edit the log file |
| 399 | and put them there. Thus you save two steps. But you can only append to the |
| 400 | end of a file. |
| 401 | To append only a few lines, select them in Visual mode before typing |
| 402 | ":write". In chapter 10 you will learn other ways to select a range of lines. |
| 403 | |
| 404 | ============================================================================== |
| 405 | *07.6* Viewing a file |
| 406 | |
| 407 | Sometimes you only want to see what a file contains, without the intention to |
| 408 | ever write it back. There is the risk that you type ":w" without thinking and |
| 409 | overwrite the original file anyway. To avoid this, edit the file read-only. |
| 410 | To start Vim in readonly mode, use this command: > |
| 411 | |
| 412 | vim -R file |
| 413 | |
| 414 | On Unix this command should do the same thing: > |
| 415 | |
| 416 | view file |
| 417 | |
| 418 | You are now editing "file" in read-only mode. When you try using ":w" you |
| 419 | will get an error message and the file won't be written. |
| 420 | When you try to make a change to the file Vim will give you a warning: |
| 421 | |
| 422 | W10: Warning: Changing a readonly file ~ |
| 423 | |
| 424 | The change will be done though. This allows for formatting the file, for |
| 425 | example, to be able to read it easily. |
| 426 | If you make changes to a file and forgot that it was read-only, you can |
| 427 | still write it. Add the ! to the write command to force writing. |
| 428 | |
| 429 | If you really want to forbid making changes in a file, do this: > |
| 430 | |
| 431 | vim -M file |
| 432 | |
| 433 | Now every attempt to change the text will fail. The help files are like this, |
| 434 | for example. If you try to make a change you get this error message: |
| 435 | |
| 436 | E21: Cannot make changes, 'modifiable' is off ~ |
| 437 | |
| 438 | You could use the -M argument to setup Vim to work in a viewer mode. This is |
| 439 | only voluntary though, since these commands will remove the protection: > |
| 440 | |
| 441 | :set modifiable |
| 442 | :set write |
| 443 | |
| 444 | ============================================================================== |
| 445 | *07.7* Changing the file name |
| 446 | |
| 447 | A clever way to start editing a new file is by using an existing file that |
| 448 | contains most of what you need. For example, you start writing a new program |
| 449 | to move a file. You know that you already have a program that copies a file, |
| 450 | thus you start with: > |
| 451 | |
| 452 | :edit copy.c |
| 453 | |
| 454 | You can delete the stuff you don't need. Now you need to save the file under |
| 455 | a new name. The ":saveas" command can be used for this: > |
| 456 | |
| 457 | :saveas move.c |
| 458 | |
| 459 | Vim will write the file under the given name, and edit that file. Thus the |
| 460 | next time you do ":write", it will write "move.c". "copy.c" remains |
| 461 | unmodified. |
| 462 | When you want to change the name of the file you are editing, but don't |
| 463 | want to write the file, you can use this command: > |
| 464 | |
| 465 | :file move.c |
| 466 | |
| 467 | Vim will mark the file as "not edited". This means that Vim knows this is not |
| 468 | the file you started editing. When you try to write the file, you might get |
| 469 | this message: |
| 470 | |
| 471 | E13: File exists (use ! to override) ~ |
| 472 | |
| 473 | This protects you from accidentally overwriting another file. |
| 474 | |
| 475 | ============================================================================== |
| 476 | |
| 477 | Next chapter: |usr_08.txt| Splitting windows |
| 478 | |
Bram Moolenaar | d473c8c | 2018-08-11 18:00:22 +0200 | [diff] [blame] | 479 | Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: |