blob: 1e444672076f0ee349ef9628a87ba4fe80a43408 [file] [log] [blame]
Milly89872f52024-10-05 17:16:18 +02001*usr_29.txt* For Vim version 9.1. Last change: 2024 Oct 05
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3 VIM USER MANUAL - by Bram Moolenaar
4
5 Moving through programs
6
7
8The creator of Vim is a computer programmer. It's no surprise that Vim
9contains many features to aid in writing programs. Jump around to find where
10identifiers are defined and used. Preview declarations in a separate window.
11There is more in the next chapter.
12
13|29.1| Using tags
14|29.2| The preview window
15|29.3| Moving through a program
16|29.4| Finding global identifiers
17|29.5| Finding local identifiers
18
19 Next chapter: |usr_30.txt| Editing programs
20 Previous chapter: |usr_28.txt| Folding
21Table of contents: |usr_toc.txt|
22
23==============================================================================
24*29.1* Using tags
25
26What is a tag? It is a location where an identifier is defined. An example
27is a function definition in a C or C++ program. A list of tags is kept in a
28tags file. This can be used by Vim to directly jump from any place to the
29tag, the place where an identifier is defined.
30 To generate the tags file for all C files in the current directory, use the
31following command: >
32
33 ctags *.c
34
35"ctags" is a separate program. Most Unix systems already have it installed.
Bram Moolenaar47c532e2022-03-19 15:18:53 +000036If you do not have it yet, you can find Universal/Exuberant ctags at:
Milly89872f52024-10-05 17:16:18 +020037 http://ctags.io
38 http://ctags.sf.net
Bram Moolenaar071d4272004-06-13 20:20:40 +000039
Bram Moolenaar47c532e2022-03-19 15:18:53 +000040Universal ctags is preferred, Exuberant ctags is no longer being developed.
41
Bram Moolenaar071d4272004-06-13 20:20:40 +000042Now when you are in Vim and you want to go to a function definition, you can
43jump to it by using the following command: >
44
45 :tag startlist
46
47This command will find the function "startlist" even if it is in another file.
48 The CTRL-] command jumps to the tag of the word that is under the cursor.
49This makes it easy to explore a tangle of C code. Suppose, for example, that
50you are in the function "write_block". You can see that it calls
51"write_line". But what does "write_line" do? By placing the cursor on the
52call to "write_line" and pressing CTRL-], you jump to the definition of this
53function.
54 The "write_line" function calls "write_char". You need to figure out what
55it does. So you position the cursor over the call to "write_char" and press
56CTRL-]. Now you are at the definition of "write_char".
57
58 +-------------------------------------+
59 |void write_block(char **s; int cnt) |
60 |{ |
61 | int i; |
62 | for (i = 0; i < cnt; ++i) |
63 | write_line(s[i]); |
64 |} | |
65 +-----------|-------------------------+
66 |
67 CTRL-] |
68 | +----------------------------+
69 +--> |void write_line(char *s) |
70 |{ |
71 | while (*s != 0) |
72 | write_char(*s++); |
73 |} | |
74 +--------|-------------------+
75 |
76 CTRL-] |
77 | +------------------------------------+
78 +--> |void write_char(char c) |
79 |{ |
80 | putchar((int)(unsigned char)c); |
81 |} |
82 +------------------------------------+
83
84The ":tags" command shows the list of tags that you traversed through:
85
86 :tags
87 # TO tag FROM line in file/text ~
88 1 1 write_line 8 write_block.c ~
89 2 1 write_char 7 write_line.c ~
90 > ~
91>
92Now to go back. The CTRL-T command goes to the preceding tag. In the example
93above you get back to the "write_line" function, in the call to "write_char".
94 This command takes a count argument that indicates how many tags to jump
95back. You have gone forward, and now back. Let's go forward again. The
96following command goes to the tag on top of the list: >
97
98 :tag
99
100You can prefix it with a count and jump forward that many tags. For example:
101":3tag". CTRL-T also can be preceded with a count.
102 These commands thus allow you to go down a call tree with CTRL-] and back
103up again with CTRL-T. Use ":tags" to find out where you are.
104
105
106SPLIT WINDOWS
107
108The ":tag" command replaces the file in the current window with the one
109containing the new function. But suppose you want to see not only the old
110function but also the new one? You can split the window using the ":split"
111command followed by the ":tag" command. Vim has a shorthand command that does
112both: >
113 :stag tagname
114
115To split the current window and jump to the tag under the cursor use this
116command: >
117
118 CTRL-W ]
119
120If a count is specified, the new window will be that many lines high.
121
122
123MORE TAGS FILES
124
125When you have files in many directories, you can create a tags file in each of
126them. Vim will then only be able to jump to tags within that directory.
127 To find more tags files, set the 'tags' option to include all the relevant
128tags files. Example: >
129
130 :set tags=./tags,./../tags,./*/tags
131
132This finds a tags file in the same directory as the current file, one
133directory level higher and in all subdirectories.
134 This is quite a number of tags files, but it may still not be enough. For
135example, when editing a file in "~/proj/src", you will not find the tags file
136"~/proj/sub/tags". For this situation Vim offers to search a whole directory
137tree for tags files. Example: >
138
139 :set tags=~/proj/**/tags
140
141
142ONE TAGS FILE
143
144When Vim has to search many places for tags files, you can hear the disk
145rattling. It may get a bit slow. In that case it's better to spend this
146time while generating one big tags file. You might do this overnight.
Bram Moolenaar47c532e2022-03-19 15:18:53 +0000147 This requires the Universal or Exuberant ctags program, mentioned above.
148It offers an argument to search a whole directory tree: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000149
150 cd ~/proj
151 ctags -R .
152
Bram Moolenaar47c532e2022-03-19 15:18:53 +0000153The nice thing about this is that Universal/Exuberant ctags recognizes various
154file types. Thus this doesn't work just for C and C++ programs, also for
155Eiffel and even Vim scripts. See the ctags documentation to tune this.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000156 Now you only need to tell Vim where your big tags file is: >
157
158 :set tags=~/proj/tags
159
160
161MULTIPLE MATCHES
162
163When a function is defined multiple times (or a method in several classes),
164the ":tag" command will jump to the first one. If there is a match in the
165current file, that one is used first.
166 You can now jump to other matches for the same tag with: >
167
168 :tnext
169
170Repeat this to find further matches. If there are many, you can select which
171one to jump to: >
172
173 :tselect tagname
174
175Vim will present you with a list of choices:
176
177 # pri kind tag file ~
178 1 F f mch_init os_amiga.c ~
179 mch_init() ~
180 2 F f mch_init os_mac.c ~
181 mch_init() ~
182 3 F f mch_init os_msdos.c ~
183 mch_init(void) ~
184 4 F f mch_init os_riscos.c ~
185 mch_init() ~
186 Enter nr of choice (<CR> to abort): ~
187
188You can now enter the number (in the first column) of the match that you would
189like to jump to. The information in the other columns give you a good idea of
190where the match is defined.
191
192To move between the matching tags, these commands can be used:
193
194 :tfirst go to first match
195 :[count]tprevious go to [count] previous match
196 :[count]tnext go to [count] next match
197 :tlast go to last match
198
199If [count] is omitted then one is used.
200
201
202GUESSING TAG NAMES
203
204Command line completion is a good way to avoid typing a long tag name. Just
205type the first bit and press <Tab>: >
206
207 :tag write_<Tab>
208
209You will get the first match. If it's not the one you want, press <Tab> until
210you find the right one.
211 Sometimes you only know part of the name of a function. Or you have many
212tags that start with the same string, but end differently. Then you can tell
213Vim to use a pattern to find the tag.
214 Suppose you want to jump to a tag that contains "block". First type
215this: >
216
217 :tag /block
218
219Now use command line completion: press <Tab>. Vim will find all tags that
220contain "block" and use the first match.
221 The "/" before a tag name tells Vim that what follows is not a literal tag
222name, but a pattern. You can use all the items for search patterns here. For
223example, suppose you want to select a tag that starts with "write_": >
224
225 :tselect /^write_
226
227The "^" specifies that the tag starts with "write_". Otherwise it would also
228be found halfway a tag name. Similarly "$" at the end makes sure the pattern
229matches until the end of a tag.
230
231
232A TAGS BROWSER
233
234Since CTRL-] takes you to the definition of the identifier under the cursor,
235you can use a list of identifier names as a table of contents. Here is an
236example.
Bram Moolenaar47c532e2022-03-19 15:18:53 +0000237 First create a list of identifiers (this requires Universal or Exuberant
238ctags): >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000239
240 ctags --c-types=f -f functions *.c
241
242Now start Vim without a file, and edit this file in Vim, in a vertically split
243window: >
244
245 vim
246 :vsplit functions
247
248The window contains a list of all the functions. There is some more stuff,
249but you can ignore that. Do ":setlocal ts=99" to clean it up a bit.
250 In this window, define a mapping: >
251
252 :nnoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>
253
254Move the cursor to the line that contains the function you want to go to.
255Now press <Enter>. Vim will go to the other window and jump to the selected
256function.
257
258
259RELATED ITEMS
260
Bram Moolenaar0f6562e2015-11-24 18:48:14 +0100261To make case in tag names be ignored, you can set 'ignorecase' while leaving
262'tagcase' as "followic", or set 'tagcase' to "ignore".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000263
264The 'tagbsearch' option tells if the tags file is sorted or not. The default
265is to assume a sorted tags file, which makes a tags search a lot faster, but
266doesn't work if the tags file isn't sorted.
267
268The 'taglength' option can be used to tell Vim the number of significant
269characters in a tag.
270
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271Cscope is a free program. It does not only find places where an identifier is
272declared, but also where it is used. See |cscope|.
273
274==============================================================================
275*29.2* The preview window
276
277When you edit code that contains a function call, you need to use the correct
278arguments. To know what values to pass you can look at how the function is
279defined. The tags mechanism works very well for this. Preferably the
280definition is displayed in another window. For this the preview window can be
281used.
282 To open a preview window to display the function "write_char": >
283
284 :ptag write_char
285
286Vim will open a window, and jumps to the tag "write_char". Then it takes you
287back to the original position. Thus you can continue typing without the need
288to use a CTRL-W command.
289 If the name of a function appears in the text, you can get its definition
290in the preview window with: >
291
292 CTRL-W }
293
294There is a script that automatically displays the text where the word under
295the cursor was defined. See |CursorHold-example|.
296
297To close the preview window use this command: >
298
299 :pclose
300
301To edit a specific file in the preview window, use ":pedit". This can be
302useful to edit a header file, for example: >
303
304 :pedit defs.h
305
306Finally, ":psearch" can be used to find a word in the current file and any
307included files and display the match in the preview window. This is
308especially useful when using library functions, for which you do not have a
309tags file. Example: >
310
311 :psearch popen
312
313This will show the "stdio.h" file in the preview window, with the function
314prototype for popen():
315
316 FILE *popen __P((const char *, const char *)); ~
317
318You can specify the height of the preview window, when it is opened, with the
319'previewheight' option.
320
321==============================================================================
322*29.3* Moving through a program
323
324Since a program is structured, Vim can recognize items in it. Specific
325commands can be used to move around.
326 C programs often contain constructs like this:
327
328 #ifdef USE_POPEN ~
329 fd = popen("ls", "r") ~
330 #else ~
331 fd = fopen("tmp", "w") ~
332 #endif ~
333
334But then much longer, and possibly nested. Position the cursor on the
335"#ifdef" and press %. Vim will jump to the "#else". Pressing % again takes
336you to the "#endif". Another % takes you to the "#ifdef" again.
337 When the construct is nested, Vim will find the matching items. This is a
338good way to check if you didn't forget an "#endif".
339 When you are somewhere inside a "#if" - "#endif", you can jump to the start
340of it with: >
341
342 [#
343
344If you are not after a "#if" or "#ifdef" Vim will beep. To jump forward to
345the next "#else" or "#endif" use: >
346
347 ]#
348
349These two commands skip any "#if" - "#endif" blocks that they encounter.
350Example:
351
352 #if defined(HAS_INC_H) ~
353 a = a + inc(); ~
354 # ifdef USE_THEME ~
355 a += 3; ~
356 # endif ~
357 set_width(a); ~
358
359With the cursor in the last line, "[#" moves to the first line. The "#ifdef"
360- "#endif" block in the middle is skipped.
361
362
363MOVING IN CODE BLOCKS
364
365In C code blocks are enclosed in {}. These can get pretty long. To move to
366the start of the outer block use the "[[" command. Use "][" to find the end.
367This assumes that the "{" and "}" are in the first column.
368 The "[{" command moves to the start of the current block. It skips over
369pairs of {} at the same level. "]}" jumps to the end.
370 An overview:
371
372 function(int a)
373 +-> {
374 | if (a)
375 | +-> {
376 [[ | | for (;;) --+
377 | | +-> { |
378 | [{ | | foo(32); | --+
379 | | [{ | if (bar(a)) --+ | ]} |
380 +-- | +-- break; | ]} | |
381 | } <-+ | | ][
382 +-- foobar(a) | |
383 } <-+ |
384 } <-+
385
386When writing C++ or Java, the outer {} block is for the class. The next level
387of {} is for a method. When somewhere inside a class use "[m" to find the
Bram Moolenaar446cb832008-06-24 21:56:24 +0000388previous start of a method. "]m" finds the next start of a method.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000389
390Additionally, "[]" moves backward to the end of a function and "]]" moves
391forward to the start of the next function. The end of a function is defined
392by a "}" in the first column.
393
394 int func1(void)
395 {
396 return 1;
397 +----------> }
398 |
399 [] | int func2(void)
400 | +-> {
401 | [[ | if (flag)
402 start +-- +-- return flag;
403 | ][ | return 2;
404 | +-> }
405 ]] |
406 | int func3(void)
407 +----------> {
408 return 3;
409 }
410
411Don't forget you can also use "%" to move between matching (), {} and [].
412That also works when they are many lines apart.
413
414
415MOVING IN BRACES
416
417The "[(" and "])" commands work similar to "[{" and "]}", except that they
418work on () pairs instead of {} pairs.
419>
420 [(
421< <--------------------------------
422 <-------
423 if (a == b && (c == d || (e > f)) && x > y) ~
424 -------------->
425 --------------------------------> >
426 ])
427
428MOVING IN COMMENTS
429
430To move back to the start of a comment use "[/". Move forward to the end of a
431comment with "]/". This only works for /* - */ comments.
432
433 +-> +-> /*
434 | [/ | * A comment about --+
435 [/ | +-- * wonderful life. | ]/
436 | */ <-+
437 |
438 +-- foo = bar * 3; --+
439 | ]/
440 /* a short comment */ <-+
441
442==============================================================================
443*29.4* Finding global identifiers
444
445You are editing a C program and wonder if a variable is declared as "int" or
446"unsigned". A quick way to find this is with the "[I" command.
447 Suppose the cursor is on the word "column". Type: >
448
449 [I
450
451Vim will list the matching lines it can find. Not only in the current file,
452but also in all included files (and files included in them, etc.). The result
453looks like this:
454
455 structs.h ~
456 1: 29 unsigned column; /* column number */ ~
457
458The advantage over using tags or the preview window is that included files are
459searched. In most cases this results in the right declaration to be found.
460Also when the tags file is out of date. Also when you don't have tags for the
461included files.
462 However, a few things must be right for "[I" to do its work. First of all,
463the 'include' option must specify how a file is included. The default value
464works for C and C++. For other languages you will have to change it.
465
466
467LOCATING INCLUDED FILES
468
469 Vim will find included files in the places specified with the 'path'
470option. If a directory is missing, some include files will not be found. You
471can discover this with this command: >
472
473 :checkpath
474
475It will list the include files that could not be found. Also files included
476by the files that could be found. An example of the output:
477
478 --- Included files not found in path --- ~
479 <io.h> ~
480 vim.h --> ~
481 <functions.h> ~
482 <clib/exec_protos.h> ~
483
484The "io.h" file is included by the current file and can't be found. "vim.h"
485can be found, thus ":checkpath" goes into this file and checks what it
486includes. The "functions.h" and "clib/exec_protos.h" files, included by
487"vim.h" are not found.
488
489 Note:
490 Vim is not a compiler. It does not recognize "#ifdef" statements.
491 This means every "#include" statement is used, also when it comes
492 after "#if NEVER".
493
494To fix the files that could not be found, add a directory to the 'path'
495option. A good place to find out about this is the Makefile. Look out for
496lines that contain "-I" items, like "-I/usr/local/X11". To add this directory
497use: >
498
499 :set path+=/usr/local/X11
500
Bram Moolenaar446cb832008-06-24 21:56:24 +0000501When there are many subdirectories, you can use the "*" wildcard. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000502
503 :set path+=/usr/*/include
504
505This would find files in "/usr/local/include" as well as "/usr/X11/include".
506
507When working on a project with a whole nested tree of included files, the "**"
508items is useful. This will search down in all subdirectories. Example: >
509
510 :set path+=/projects/invent/**/include
511
512This will find files in the directories:
513
514 /projects/invent/include ~
515 /projects/invent/main/include ~
516 /projects/invent/main/os/include ~
517 etc.
518
519There are even more possibilities. Check out the 'path' option for info.
520 If you want to see which included files are actually found, use this
521command: >
522
523 :checkpath!
524
525You will get a (very long) list of included files, the files they include, and
526so on. To shorten the list a bit, Vim shows "(Already listed)" for files that
527were found before and doesn't list the included files in there again.
528
529
530JUMPING TO A MATCH
531
532"[I" produces a list with only one line of text. When you want to have a
533closer look at the first item, you can jump to that line with the command: >
534
535 [<Tab>
536
537You can also use "[ CTRL-I", since CTRL-I is the same as pressing <Tab>.
538
539The list that "[I" produces has a number at the start of each line. When you
540want to jump to another item than the first one, type the number first: >
541
542 3[<Tab>
543
544Will jump to the third item in the list. Remember that you can use CTRL-O to
545jump back to where you started from.
546
547
548RELATED COMMANDS
549
550 [i only lists the first match
551 ]I only lists items below the cursor
552 ]i only lists the first item below the cursor
553
554
555FINDING DEFINED IDENTIFIERS
556
557The "[I" command finds any identifier. To find only macros, defined with
558"#define" use: >
559
560 [D
561
562Again, this searches in included files. The 'define' option specifies what a
563line looks like that defines the items for "[D". You could change it to make
564it work with other languages than C or C++.
565 The commands related to "[D" are:
566
567 [d only lists the first match
568 ]D only lists items below the cursor
569 ]d only lists the first item below the cursor
570
571==============================================================================
572*29.5* Finding local identifiers
573
574The "[I" command searches included files. To search in the current file only,
575and jump to the first place where the word under the cursor is used: >
576
577 gD
578
579Hint: Goto Definition. This command is very useful to find a variable or
580function that was declared locally ("static", in C terms). Example (cursor on
581"counter"):
582
583 +-> static int counter = 0;
584 |
585 | int get_counter(void)
586 gD | {
587 | ++counter;
588 +-- return counter;
589 }
590
591To restrict the search even further, and look only in the current function,
592use this command: >
593
594 gd
595
596This will go back to the start of the current function and find the first
597occurrence of the word under the cursor. Actually, it searches backwards to
Bram Moolenaarc236c162008-07-13 17:41:49 +0000598an empty line above a "{" in the first column. From there it searches forward
599for the identifier. Example (cursor on "idx"):
Bram Moolenaar071d4272004-06-13 20:20:40 +0000600
601 int find_entry(char *name)
602 {
603 +-> int idx;
604 |
605 gd | for (idx = 0; idx < table_len; ++idx)
606 | if (strcmp(table[idx].name, name) == 0)
607 +-- return idx;
608 }
609
610==============================================================================
611
612Next chapter: |usr_30.txt| Editing programs
613
Bram Moolenaard473c8c2018-08-11 18:00:22 +0200614Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: