blob: 59ef37a9952c6c4f08d429a2de07eca44c847d66 [file] [log] [blame]
Damien Lejaybfa16362025-06-10 21:12:31 +02001*usr_30.txt* For Vim version 9.1. Last change: 2025 Jun 10
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3 VIM USER MANUAL - by Bram Moolenaar
4
5 Editing programs
6
7
8Vim has various commands that aid in writing computer programs. Compile a
9program and directly jump to reported errors. Automatically set the indent
10for many languages and format comments.
11
12|30.1| Compiling
13|30.2| Indenting C files
14|30.3| Automatic indenting
15|30.4| Other indenting
16|30.5| Tabs and spaces
17|30.6| Formatting comments
18
19 Next chapter: |usr_31.txt| Exploiting the GUI
20 Previous chapter: |usr_29.txt| Moving through programs
21Table of contents: |usr_toc.txt|
22
23==============================================================================
24*30.1* Compiling
25
26Vim has a set of so called "quickfix" commands. They enable you to compile a
27program from within Vim and then go through the errors generated and fix them
28(hopefully). You can then recompile and fix any new errors that are found
29until finally your program compiles without any error.
30
31The following command runs the program "make" (supplying it with any argument
32you give) and captures the results: >
33
34 :make {arguments}
35
36If errors were generated, they are captured and the editor positions you where
37the first error occurred.
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +000038 Take a look at an example ":make" session. (Typical :make sessions generate
Bram Moolenaar071d4272004-06-13 20:20:40 +000039far more errors and fewer stupid ones.) After typing ":make" the screen looks
40like this:
41
42 :!make | &tee /tmp/vim215953.err ~
43 gcc -g -Wall -o prog main.c sub.c ~
44 main.c: In function 'main': ~
45 main.c:6: too many arguments to function 'do_sub' ~
46 main.c: At top level: ~
47 main.c:10: parse error before '}' ~
48 make: *** [prog] Error 1 ~
49
50 2 returned ~
51 "main.c" 11L, 111C ~
52 (3 of 6): too many arguments to function 'do_sub' ~
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000053 Press ENTER or type command to continue ~
Bram Moolenaar071d4272004-06-13 20:20:40 +000054
55From this you can see that you have errors in the file "main.c". When you
56press <Enter>, Vim displays the file "main.c", with the cursor positioned on
57line 6, the first line with an error. You did not need to specify the file or
58the line number, Vim knew where to go by looking in the error messages.
59
60 +---------------------------------------------------+
61 |int main() |
62 |{ |
63 | int i=3; |
64 cursor -> | do_sub("foo"); |
65 | ++i; |
66 | return (0); |
67 |} |
68 |} |
69 | ~ |
70 |(3 of 12): too many arguments to function 'do_sub' |
71 +---------------------------------------------------+
72
73The following command goes to where the next error occurs: >
74
75 :cnext
76
77Vim jumps to line 10, the last line in the file, where there is an extra '}'.
78 When there is not enough room, Vim will shorten the error message. To see
79the whole message use: >
80
81 :cc
82
83You can get an overview of all the error messages with the ":clist" command.
84The output looks like this: >
85
86 :clist
87< 3 main.c: 6:too many arguments to function 'do_sub' ~
88 5 main.c: 10:parse error before '}' ~
89
90Only the lines where Vim recognized a file name and line number are listed
91here. It assumes those are the interesting lines and the rest is just boring
92messages. However, sometimes unrecognized lines do contain something you want
93to see. Output from the linker, for example, about an undefined function.
94To see all the messages add a "!" to the command: >
95
96 :clist!
97< 1 gcc -g -Wall -o prog main.c sub.c ~
98 2 main.c: In function 'main': ~
99 3 main.c:6: too many arguments to function 'do_sub' ~
100 4 main.c: At top level: ~
101 5 main.c:10: parse error before '}' ~
102 6 make: *** [prog] Error 1 ~
103
104Vim will highlight the current error. To go back to the previous error, use:
105>
106 :cprevious
107
108Other commands to move around in the error list:
109
110 :cfirst to first error
111 :clast to last error
112 :cc 3 to error nr 3
113
114
115USING ANOTHER COMPILER
116
117The name of the program to run when the ":make" command is executed is defined
118by the 'makeprg' option. Usually this is set to "make", but Visual C++ users
119should set this to "nmake" by executing the following command: >
120
121 :set makeprg=nmake
122
123You can also include arguments in this option. Special characters need to
124be escaped with a backslash. Example: >
125
126 :set makeprg=nmake\ -f\ project.mak
127
128You can include special Vim keywords in the command specification. The %
129character expands to the name of the current file. So if you execute the
130command: >
Bram Moolenaar26df0922014-02-23 23:39:13 +0100131 :set makeprg=make\ %:S
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132
133When you are editing main.c, then ":make" executes the following command: >
134
135 make main.c
136
137This is not too useful, so you will refine the command a little and use the :r
138(root) modifier: >
139
Bram Moolenaar26df0922014-02-23 23:39:13 +0100140 :set makeprg=make\ %:r:S.o
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141
142Now the command executed is as follows: >
143
144 make main.o
145
146More about these modifiers here: |filename-modifiers|.
147
148
149OLD ERROR LISTS
150
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000151Suppose you ":make" a program. There is a warning message in one file and an
Bram Moolenaar071d4272004-06-13 20:20:40 +0000152error message in another. You fix the error and use ":make" again to check if
153it was really fixed. Now you want to look at the warning message. It doesn't
154show up in the last error list, since the file with the warning wasn't
155compiled again. You can go back to the previous error list with: >
156
157 :colder
158
159Then use ":clist" and ":cc {nr}" to jump to the place with the warning.
160 To go forward to the next error list: >
161
162 :cnewer
163
164Vim remembers ten error lists.
165
166
167SWITCHING COMPILERS
168
169You have to tell Vim what format the error messages are that your compiler
170produces. This is done with the 'errorformat' option. The syntax of this
171option is quite complicated and it can be made to fit almost any compiler.
172You can find the explanation here: |errorformat|.
173
174You might be using various different compilers. Setting the 'makeprg' option,
175and especially the 'errorformat' each time is not easy. Vim offers a simple
176method for this. For example, to switch to using the Microsoft Visual C++
177compiler: >
178
179 :compiler msvc
180
181This will find the Vim script for the "msvc" compiler and set the appropriate
182options.
183 You can write your own compiler files. See |write-compiler-plugin|.
184
185
186OUTPUT REDIRECTION
187
188The ":make" command redirects the output of the executed program to an error
189file. How this works depends on various things, such as the 'shell'. If your
190":make" command doesn't capture the output, check the 'makeef' and
191'shellpipe' options. The 'shellquote' and 'shellxquote' options might also
192matter.
193
194In case you can't get ":make" to redirect the file for you, an alternative is
195to compile the program in another window and redirect the output into a file.
196Then have Vim read this file with: >
197
198 :cfile {filename}
199
200Jumping to errors will work like with the ":make" command.
201
202==============================================================================
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000203*30.2* Indenting C style text
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204
205A program is much easier to understand when the lines have been properly
Bram Moolenaar8c8de832008-06-24 22:58:06 +0000206indented. Vim offers various ways to make this less work. For C or C style
207programs like Java or C++, set the 'cindent' option. Vim knows a lot about C
208programs and will try very hard to automatically set the indent for you. Set
209the 'shiftwidth' option to the amount of spaces you want for a deeper level.
210Four spaces will work fine. One ":set" command will do it: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211
212 :set cindent shiftwidth=4
213
214With this option enabled, when you type something such as "if (x)", the next
215line will automatically be indented an additional level.
216
217 if (flag)
218 Automatic indent ---> do_the_work();
219 Automatic unindent <-- if (other_flag) {
220 Automatic indent ---> do_file();
221 keep indent do_some_more();
222 Automatic unindent <-- }
223
224When you type something in curly braces ({}), the text will be indented at the
225start and unindented at the end. The unindenting will happen after typing the
226'}', since Vim can't guess what you are going to type.
227
228One side effect of automatic indentation is that it helps you catch errors in
229your code early. When you type a } to finish a function, only to find that
230the automatic indentation gives it more indent than what you expected, there
231is probably a } missing. Use the "%" command to find out which { matches the
232} you typed.
233 A missing ) and ; also cause extra indent. Thus if you get more white
234space than you would expect, check the preceding lines.
235
236When you have code that is badly formatted, or you inserted and deleted lines,
237you need to re-indent the lines. The "=" operator does this. The simplest
238form is: >
239
240 ==
241
242This indents the current line. Like with all operators, there are three ways
243to use it. In Visual mode "=" indents the selected lines. A useful text
244object is "a{". This selects the current {} block. Thus, to re-indent the
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000245code block the cursor is in: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246
247 =a{
248
UM-Li04e1aaa2024-04-29 20:22:10 +0200249If you have really badly indented code, you can re-indent the whole file with:
Bram Moolenaar071d4272004-06-13 20:20:40 +0000250>
251 gg=G
252
253However, don't do this in files that have been carefully indented manually.
254The automatic indenting does a good job, but in some situations you might want
255to overrule it.
256
257
258SETTING INDENT STYLE
259
260Different people have different styles of indentation. By default Vim does a
261pretty good job of indenting in a way that 90% of programmers do. There are
262different styles, however; so if you want to, you can customize the
263indentation style with the 'cinoptions' option.
264 By default 'cinoptions' is empty and Vim uses the default style. You can
265add various items where you want something different. For example, to make
266curly braces be placed like this:
267
268 if (flag) ~
269 { ~
270 i = 8; ~
271 j = 0; ~
272 } ~
273
274Use this command: >
275
276 :set cinoptions+={2
277
278There are many of these items. See |cinoptions-values|.
279
280==============================================================================
281*30.3* Automatic indenting
282
283You don't want to switch on the 'cindent' option manually every time you edit
284a C file. This is how you make it work automatically: >
285
286 :filetype indent on
287
288Actually, this does a lot more than switching on 'cindent' for C files. First
289of all, it enables detecting the type of a file. That's the same as what is
290used for syntax highlighting.
291 When the filetype is known, Vim will search for an indent file for this
292type of file. The Vim distribution includes a number of these for various
293programming languages. This indent file will then prepare for automatic
294indenting specifically for this file.
295
296If you don't like the automatic indenting, you can switch it off again: >
297
298 :filetype indent off
299
300If you don't like the indenting for one specific type of file, this is how you
301avoid it. Create a file with just this one line: >
302
303 :let b:did_indent = 1
304
305Now you need to write this in a file with a specific name:
306
307 {directory}/indent/{filetype}.vim
308
309The {filetype} is the name of the file type, such as "cpp" or "java". You can
310see the exact name that Vim detected with this command: >
311
312 :set filetype
313
314In this file the output is:
315
316 filetype=help ~
317
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000318Thus you would use "help" for {filetype}.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000319 For the {directory} part you need to use your runtime directory. Look at
320the output of this command: >
321
322 set runtimepath
323
324Now use the first item, the name before the first comma. Thus if the output
325looks like this:
326
327 runtimepath=~/.vim,/usr/local/share/vim/vim60/runtime,~/.vim/after ~
328
329You use "~/.vim" for {directory}. Then the resulting file name is:
330
331 ~/.vim/indent/help.vim ~
332
333Instead of switching the indenting off, you could write your own indent file.
334How to do that is explained here: |indent-expression|.
335
336==============================================================================
337*30.4* Other indenting
338
Bram Moolenaare7b1ea02020-08-07 19:54:59 +0200339The simplest form of automatic indenting is with the 'autoindent' option.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000340It uses the indent from the previous line. A bit smarter is the 'smartindent'
341option. This is useful for languages where no indent file is available.
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000342'smartindent' is not as smart as 'cindent', but smarter than 'autoindent'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343 With 'smartindent' set, an extra level of indentation is added for each {
344and removed for each }. An extra level of indentation will also be added for
345any of the words in the 'cinwords' option. Lines that begin with # are
346treated specially: all indentation is removed. This is done so that
347preprocessor directives will all start in column 1. The indentation is
348restored for the next line.
349
350
351CORRECTING INDENTS
352
353When you are using 'autoindent' or 'smartindent' to get the indent of the
354previous line, there will be many times when you need to add or remove one
355'shiftwidth' worth of indent. A quick way to do this is using the CTRL-D and
356CTRL-T commands in Insert mode.
357 For example, you are typing a shell script that is supposed to look like
358this:
359
360 if test -n a; then ~
361 echo a ~
362 echo "-------" ~
363 fi ~
364
Bram Moolenaar06b5d512010-05-22 15:37:44 +0200365Start off by setting these options: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366
367 :set autoindent shiftwidth=3
368
369You start by typing the first line, <Enter> and the start of the second line:
370
371 if test -n a; then ~
372 echo ~
373
374Now you see that you need an extra indent. Type CTRL-T. The result:
375
376 if test -n a; then ~
377 echo ~
378
379The CTRL-T command, in Insert mode, adds one 'shiftwidth' to the indent, no
380matter where in the line you are.
381 You continue typing the second line, <Enter> and the third line. This time
382the indent is OK. Then <Enter> and the last line. Now you have this:
383
384 if test -n a; then ~
385 echo a ~
386 echo "-------" ~
387 fi ~
388
389To remove the superfluous indent in the last line press CTRL-D. This deletes
390one 'shiftwidth' worth of indent, no matter where you are in the line.
391 When you are in Normal mode, you can use the ">>" and "<<" commands to
392shift lines. ">" and "<" are operators, thus you have the usual three ways to
393specify the lines you want to indent. A useful combination is: >
394
395 >i{
396
397This adds one indent to the current block of lines, inside {}. The { and }
398lines themselves are left unmodified. ">a{" includes them. In this example
399the cursor is on "printf":
400
401 original text after ">i{" after ">a{"
402
403 if (flag) if (flag) if (flag) ~
404 { { { ~
405 printf("yes"); printf("yes"); printf("yes"); ~
406 flag = 0; flag = 0; flag = 0; ~
407 } } } ~
408
409==============================================================================
410*30.5* Tabs and spaces
411
Damien Lejaya4a3f712025-05-30 17:36:37 +0200412A QUICK HISTORY OF THE RATIONALE BEHIND TABS
413
414`vi` (the ancestor of Vim) was created by Bill Joy. At the time, he was using
415a PDP-11 with limited memory and I/O operation capabilities. Back then, it
416was common to optimize the size of source code with the following trick.
417 The ASCII table was first designed to remotely control teleprinters. When
418control character 9 (the Horizontal Tab, caret notation: ^I) was sent to a
419teleprinter, it would move the carriage to the next tab stop. Assuming tab
420stops were separated by 8 columns (a typical standard), this means that a
421single control character could produce the same visual effect as up to 8 space
422characters. For example, the following two lines will display identically >
423
424 1234^I9
425 1234 9
426
427Using the <Tab> key was also faster than typing <Space> several times; the
428same was true for <BS>.
429
430
431THE ISSUE WITH TABS AND INDENTATION
432
433In Vim, the number of columns between two (virtual) horizontal tab stops
434is controlled by 'tabstop' and is set to eight by default. Although you can
435change it, you quickly run into trouble later. Other programs won't know what
436tabstop value you used. They probably use the default value of eight, and
437your text suddenly looks very different. Also, most printers use a fixed
438tabstop value of eight. Thus it's best to keep 'tabstop' alone; if you edit a
439file which was written with a different tabstop setting, see |25.3| for how
440to fix that.
441 For indenting lines in a program, using a multiple of eight columns makes
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442you quickly run into the right border of the window. Using a single space
443doesn't provide enough visual difference. Many people prefer to use four
444spaces, a good compromise.
Damien Lejaya4a3f712025-05-30 17:36:37 +0200445 Since a tab character at the beginning of a line is visually represented
446as eight spaces and you want to use an indent of four spaces, you can't use a
447tab character to make your indent.
448 To remedy this, `vi` had the 'shiftwidth' option. When set to 4, on a new
449line, pressing <C-t> in Insert mode would indent the line by 4 spaces,
450a result impossible to get with the <Tab> key and 'tabstop' set to 8.
451 To optimize space, `vi` would also silently remove packs of spaces and replace
452them with tab characters. The following shows what happens pressing <C-t>
Christian Brabandt77959dc2025-05-30 20:14:16 +0200453a few times.
Damien Lejaya4a3f712025-05-30 17:36:37 +0200454 A "." stands for a space character and "------->" for a tab character.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000455
Damien Lejaya4a3f712025-05-30 17:36:37 +0200456 type result ~
457 <C-t> ....
458 <C-t><C-t> ------->
459 <C-t><C-t><C-t> ------->....
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460
Damien Lejaya4a3f712025-05-30 17:36:37 +0200461 Similarly pressing <C-d> in Insert mode would decrease the indent. Hence
462with `set tabstop=8 shiftwidth=2` one has
Bram Moolenaar071d4272004-06-13 20:20:40 +0000463
Damien Lejaya4a3f712025-05-30 17:36:37 +0200464 type result ~
465 <C-t><Tab><C-t> ..----->..
466 <C-t><Tab><C-t><C-d> ------->
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467
Damien Lejaya4a3f712025-05-30 17:36:37 +0200468 A third option that one could set in `vi` was 'autoindent'. It copies the
Christian Brabandt77959dc2025-05-30 20:14:16 +0200469indent level of the previous lines,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470
Damien Lejaya4a3f712025-05-30 17:36:37 +0200471 type result ~
472 <Space><Tab>hello .------>hello
473 <Space><Tab>hello<Enter> .------>hello
474 ------->
Bram Moolenaar071d4272004-06-13 20:20:40 +0000475
Damien Lejaya4a3f712025-05-30 17:36:37 +0200476but the new line is produced by optimizing the number of characters used.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000477
478
479JUST SPACES
480
Damien Lejaya4a3f712025-05-30 17:36:37 +0200481But separating tab stops with 8 columns was not universal: IBM had a standard
482at 10 columns, and today some Go developers write code with `tabstop=4`. Every
483time text is displayed with a different 'tabstop' value, it risks misaligning
484the text, especially once the file is shared and opened on another machine.
485 In the meantime, computers got much better and the few octets saved by using
486tabs were no longer making any real difference. It became possible to use
487only spaces and thus guarantee the same resulting text everywhere. But using
488only spaces was impossible in `vi` without sacrificing features. Remember that
489'autoindent' would systematically try to input a tab character when it could.
490 Vim 4.0 made working with only spaces as convenient as working only with
491tabs (or a mix of tabs and spaces), by introducing the 'expandtab' option.
492When set, Vim will replace any horizontal tab character it would normally
493insert with an equivalent number of spaces, to end up with the same visual
494effect. <BS> would continue to remove only one character at a time.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000495
Damien Lejaya4a3f712025-05-30 17:36:37 +0200496 type result ~
497 <Tab> ........
498 <Tab><BS> .......
Bram Moolenaar071d4272004-06-13 20:20:40 +0000499
500
501CHANGING TABS IN SPACES (AND BACK)
502
Damien Lejaya4a3f712025-05-30 17:36:37 +0200503Setting 'expandtab' does not immediately affect existing tab characters. In
504order to purge a file from all its horizontal tab characters, Vim 5.3
505introduced the |:retab| command. Use these commands: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000506
507 :set expandtab
Damien Lejaya4a3f712025-05-30 17:36:37 +0200508 :retab
Bram Moolenaar071d4272004-06-13 20:20:40 +0000509
510This is a little bit dangerous, because it can also change tabs inside a
511string. To check if these exist, you could use this: >
512
513 /"[^"\t]*\t[^"]*"
514
Damien Lejaya4a3f712025-05-30 17:36:37 +0200515It's recommended not to use actual tab characters inside a string. Replace
516them with "\t" to avoid trouble.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000517
Damien Lejaya4a3f712025-05-30 17:36:37 +0200518 The other way around works just as well: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000519
520 :set noexpandtab
Damien Lejaya4a3f712025-05-30 17:36:37 +0200521 :retab!
522
523
524SOFT TAB STOPS
525
526When using only spaces, or a mix of spaces and horizontal tabs, one gets the
527unpleasant feeling that the two keys <Tab> and <BS> do not act in mirror, as
528they do when using only tab characters.
529 Vim 5.4 introduced the 'softtabstop' option. On top of the (hard) tab stops
530used to display the horizontal tab characters in the text, Vim adds extra
531soft tab stops dedicated only to the cursor. When 'softtabstop' is set to a
532positive value, and the <Tab> key will push the cursor to the next soft tab
533stop. Vim will insert the correct combination of tab characters and spaces to
534make the effect visually. Likewise pressing <BS> will have the cursor try to
535reach the nearest soft tab stop. The following example uses
536`:set softtabstop=4`
537
538 type result ~
539 <Tab> ....
540 <Tab><Tab>a ------->a
541 <Tab><Tab>a<Tab> ------->a...
542 <Tab><Tab>a<Tab><BS> ------->a
543
544 To maintain global coherence, one can `:set softtabstop=-1` so that
545the value of 'shiftwidth' is use for the number of columns between two soft
546tab stops.
547
548 If you prefer to have different values for 'shiftwidth' and 'softtabstop',
549you can still do so and use <C-t> to indent with 'shiftwidth'. Or you can
Damien Lejaybfa16362025-06-10 21:12:31 +0200550use the 'smarttab' option, allowing for a unified <Tab> key that knows what to
551do in the different situations.
Damien Lejaya4a3f712025-05-30 17:36:37 +0200552
553
554VARIABLE TAB STOPS
555
556As we said before, the ASCII table was designed to remotely control
557teleprinters. A given teleprinter could be configured to have their physical
558tab stops have variable spacing. After all, the ^I control character was
559only stipulating: go to the next tab stop wherever it is.
560 Vim 7.3 introduced 'vartabstop' to emulate the same functionality. For
561example if Vim was compiled with `+vartabs` and `:set vartabstop=2,4` one gets
562
563 actual character result ~
564 ^I ->
565 ^I^I ->--->
566 ^I^I^I ->--->--->
567
568 Similarly, 'varsofttabstop' was also introduced, to have variably spaced
569soft tab stops. With `:set varsofttabstop=2,4` one gets
570
571 type result ~
572 <Tab> ..
573 <Tab><Tab> ......
574 <Tab><Tab><Tab> ------->....
575
576
577EXAMPLES OF CONFIGURATION
578
579By default, Vim is configured to use only tabs: >
580
581 :set tabstop=8
582 :set shiftwidth=8
583 :set noexpandtab
584 :set softtabstop=0
585 :set nosmarttab
586<
587 If you want to write C code as if it were Python (only spaces, with indents
588of 4 spaces), here is what you can use: >
589
590 :set shiftwidth=4
591 :set softtabstop=-1
592 :set expandtab
593<
594 If you want the same behavior but with better control over alignment
595(e.g. lining up parameters or comments in multiples of 2 spaces), use: >
596
597 :set shiftwidth=4
598 :set softtabstop=2
599 :set expandtab
600 :set smarttab
601<
602 If instead, you would like to write C code like Bram Moolenaar would have
603(using a mix of tabs and spaces), you can use >
604
605 :set shiftwidth=4
606 :set softtabstop=-1
607<
Bram Moolenaar071d4272004-06-13 20:20:40 +0000608
609==============================================================================
610*30.6* Formatting comments
611
612One of the great things about Vim is that it understands comments. You can
613ask Vim to format a comment and it will do the right thing.
614 Suppose, for example, that you have the following comment:
615
616 /* ~
617 * This is a test ~
618 * of the text formatting. ~
619 */ ~
620
621You then ask Vim to format it by positioning the cursor at the start of the
622comment and type: >
623
624 gq]/
625
626"gq" is the operator to format text. "]/" is the motion that takes you to the
627end of a comment. The result is:
628
629 /* ~
630 * This is a test of the text formatting. ~
631 */ ~
632
633Notice that Vim properly handled the beginning of each line.
634 An alternative is to select the text that is to be formatted in Visual mode
635and type "gq".
636
637To add a new line to the comment, position the cursor on the middle line and
638press "o". The result looks like this:
639
640 /* ~
641 * This is a test of the text formatting. ~
642 * ~
643 */ ~
644
645Vim has automatically inserted a star and a space for you. Now you can type
646the comment text. When it gets longer than 'textwidth', Vim will break the
647line. Again, the star is inserted automatically:
648
649 /* ~
650 * This is a test of the text formatting. ~
651 * Typing a lot of text here will make Vim ~
652 * break ~
653 */ ~
654
655For this to work some flags must be present in 'formatoptions':
656
657 r insert the star when typing <Enter> in Insert mode
658 o insert the star when using "o" or "O" in Normal mode
659 c break comment text according to 'textwidth'
660
661See |fo-table| for more flags.
662
663
664DEFINING A COMMENT
665
666The 'comments' option defines what a comment looks like. Vim distinguishes
667between a single-line comment and a comment that has a different start, end
668and middle part.
669 Many single-line comments start with a specific character. In C++ // is
670used, in Makefiles #, in Vim scripts ". For example, to make Vim understand
671C++ comments: >
672
673 :set comments=://
674
675The colon separates the flags of an item from the text by which the comment is
676recognized. The general form of an item in 'comments' is:
677
678 {flags}:{text}
679
680The {flags} part can be empty, as in this case.
681 Several of these items can be concatenated, separated by commas. This
682allows recognizing different types of comments at the same time. For example,
683let's edit an e-mail message. When replying, the text that others wrote is
684preceded with ">" and "!" characters. This command would work: >
685
686 :set comments=n:>,n:!
687
688There are two items, one for comments starting with ">" and one for comments
689that start with "!". Both use the flag "n". This means that these comments
690nest. Thus a line starting with ">" may have another comment after the ">".
691This allows formatting a message like this:
692
693 > ! Did you see that site? ~
694 > ! It looks really great. ~
695 > I don't like it. The ~
696 > colors are terrible. ~
697 What is the URL of that ~
698 site? ~
699
700Try setting 'textwidth' to a different value, e.g., 80, and format the text by
701Visually selecting it and typing "gq". The result is:
702
Bram Moolenaar13fcaaf2005-04-15 21:13:42 +0000703 > ! Did you see that site? It looks really great. ~
Bram Moolenaar071d4272004-06-13 20:20:40 +0000704 > I don't like it. The colors are terrible. ~
705 What is the URL of that site? ~
706
707You will notice that Vim did not move text from one type of comment to
708another. The "I" in the second line would have fit at the end of the first
709line, but since that line starts with "> !" and the second line with ">", Vim
710knows that this is a different kind of comment.
711
712
713A THREE PART COMMENT
714
715A C comment starts with "/*", has "*" in the middle and "*/" at the end. The
716entry in 'comments' for this looks like this: >
717
718 :set comments=s1:/*,mb:*,ex:*/
719
720The start is defined with "s1:/*". The "s" indicates the start of a
721three-piece comment. The colon separates the flags from the text by which the
722comment is recognized: "/*". There is one flag: "1". This tells Vim that the
723middle part has an offset of one space.
724 The middle part "mb:*" starts with "m", which indicates it is a middle
725part. The "b" flag means that a blank must follow the text. Otherwise Vim
726would consider text like "*pointer" also to be the middle of a comment.
727 The end part "ex:*/" has the "e" for identification. The "x" flag has a
728special meaning. It means that after Vim automatically inserted a star,
729typing / will remove the extra space.
730
731For more details see |format-comments|.
732
733==============================================================================
734
735Next chapter: |usr_31.txt| Exploiting the GUI
736
Bram Moolenaard473c8c2018-08-11 18:00:22 +0200737Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: