blob: 75fc7ea2503929b20f3209a242a44db1a3e92e09 [file] [log] [blame]
Christian Brabandtf79695c2025-07-06 18:26:49 +02001*usr_27.txt* For Vim version 9.1. Last change: 2025 Jul 06
Bram Moolenaar071d4272004-06-13 20:20:40 +00002
3 VIM USER MANUAL - by Bram Moolenaar
4
5 Search commands and patterns
6
7
8In chapter 3 a few simple search patterns were mentioned |03.9|. Vim can do
9much more complex searches. This chapter explains the most often used ones.
Christian Brabandtf79695c2025-07-06 18:26:49 +020010A detailed specification can be found here: |pattern|
11Options affecting how search is done can be found here: |search-options|
Bram Moolenaar071d4272004-06-13 20:20:40 +000012
13|27.1| Ignoring case
14|27.2| Wrapping around the file end
15|27.3| Offsets
16|27.4| Matching multiple times
17|27.5| Alternatives
18|27.6| Character ranges
19|27.7| Character classes
20|27.8| Matching a line break
21|27.9| Examples
22
23 Next chapter: |usr_28.txt| Folding
24 Previous chapter: |usr_26.txt| Repeating
25Table of contents: |usr_toc.txt|
26
27==============================================================================
28*27.1* Ignoring case
29
30By default, Vim's searches are case sensitive. Therefore, "include",
31"INCLUDE", and "Include" are three different words and a search will match
32only one of them.
33 Now switch on the 'ignorecase' option: >
34
35 :set ignorecase
36
37Search for "include" again, and now it will match "Include", "INCLUDE" and
38"InClUDe". (Set the 'hlsearch' option to quickly see where a pattern
39matches.)
40 You can switch this off again with: >
41
42 :set noignorecase
43
Bram Moolenaar00a927d2010-05-14 23:24:24 +020044But let's keep it set, and search for "INCLUDE". It will match exactly the
Bram Moolenaar071d4272004-06-13 20:20:40 +000045same text as "include" did. Now set the 'smartcase' option: >
46
47 :set ignorecase smartcase
48
49If you have a pattern with at least one uppercase character, the search
50becomes case sensitive. The idea is that you didn't have to type that
51uppercase character, so you must have done it because you wanted case to
52match. That's smart!
53 With these two options set you find the following matches:
54
55 pattern matches ~
56 word word, Word, WORD, WoRd, etc.
57 Word Word
58 WORD WORD
59 WoRd WoRd
60
61
62CASE IN ONE PATTERN
63
64If you want to ignore case for one specific pattern, you can do this by
65prepending the "\c" string. Using "\C" will make the pattern to match case.
66This overrules the 'ignorecase' and 'smartcase' options, when "\c" or "\C" is
67used their value doesn't matter.
68
69 pattern matches ~
70 \Cword word
71 \CWord Word
72 \cword word, Word, WORD, WoRd, etc.
73 \cWord word, Word, WORD, WoRd, etc.
74
75A big advantage of using "\c" and "\C" is that it sticks with the pattern.
76Thus if you repeat a pattern from the search history, the same will happen, no
77matter if 'ignorecase' or 'smartcase' was changed.
78
79 Note:
80 The use of "\" items in search patterns depends on the 'magic' option.
Bram Moolenaar06b5d512010-05-22 15:37:44 +020081 In this chapter we will assume 'magic' is on, because that is the
Bram Moolenaar071d4272004-06-13 20:20:40 +000082 standard and recommended setting. If you would change 'magic', many
83 search patterns would suddenly become invalid.
84
85 Note:
86 If your search takes much longer than you expected, you can interrupt
Bram Moolenaar5666fcd2019-12-26 14:35:26 +010087 it with CTRL-C on Unix and CTRL-Break on MS-Windows.
Bram Moolenaar071d4272004-06-13 20:20:40 +000088
89==============================================================================
90*27.2* Wrapping around the file end
91
92By default, a forward search starts searching for the given string at the
93current cursor location. It then proceeds to the end of the file. If it has
94not found the string by that time, it starts from the beginning and searches
95from the start of the file to the cursor location.
96 Keep in mind that when repeating the "n" command to search for the next
97match, you eventually get back to the first match. If you don't notice this
98you keep searching forever! To give you a hint, Vim displays this message:
99
100 search hit BOTTOM, continuing at TOP ~
101
102If you use the "?" command, to search in the other direction, you get this
103message:
104
105 search hit TOP, continuing at BOTTOM ~
106
107Still, you don't know when you are back at the first match. One way to see
108this is by switching on the 'ruler' option: >
109
110 :set ruler
111
112Vim will display the cursor position in the lower righthand corner of the
113window (in the status line if there is one). It looks like this:
114
115 101,29 84% ~
116
117The first number is the line number of the cursor. Remember the line number
118where you started, so that you can check if you passed this position again.
119
120
121NOT WRAPPING
122
123To turn off search wrapping, use the following command: >
124
125 :set nowrapscan
126
127Now when the search hits the end of the file, an error message displays:
128
129 E385: search hit BOTTOM without match for: forever ~
130
131Thus you can find all matches by going to the start of the file with "gg" and
132keep searching until you see this message.
133 If you search in the other direction, using "?", you get:
134
135 E384: search hit TOP without match for: forever ~
136
137==============================================================================
138*27.3* Offsets
139
140By default, the search command leaves the cursor positioned on the beginning
141of the pattern. You can tell Vim to leave it some other place by specifying
142an offset. For the forward search command "/", the offset is specified by
143appending a slash (/) and the offset: >
144
145 /default/2
146
147This command searches for the pattern "default" and then moves to the
148beginning of the second line past the pattern. Using this command on the
149paragraph above, Vim finds the word "default" in the first line. Then the
150cursor is moved two lines down and lands on "an offset".
151
152If the offset is a simple number, the cursor will be placed at the beginning
153of the line that many lines from the match. The offset number can be positive
154or negative. If it is positive, the cursor moves down that many lines; if
155negative, it moves up.
156
157
158CHARACTER OFFSETS
159
160The "e" offset indicates an offset from the end of the match. It moves the
161cursor onto the last character of the match. The command: >
162
163 /const/e
164
165puts the cursor on the "t" of "const".
166 From that position, adding a number moves forward that many characters.
167This command moves to the character just after the match: >
168
169 /const/e+1
170
171A positive number moves the cursor to the right, a negative number moves it to
172the left. For example: >
173
174 /const/e-1
175
176moves the cursor to the "s" of "const".
177
178If the offset begins with "b", the cursor moves to the beginning of the
179pattern. That's not very useful, since leaving out the "b" does the same
180thing. It does get useful when a number is added or subtracted. The cursor
181then goes forward or backward that many characters. For example: >
182
183 /const/b+2
184
185Moves the cursor to the beginning of the match and then two characters to the
186right. Thus it lands on the "n".
187
188
189REPEATING
190
191To repeat searching for the previously used search pattern, but with a
192different offset, leave out the pattern: >
193
194 /that
195 //e
196
197Is equal to: >
198
199 /that/e
200
201To repeat with the same offset: >
202
203 /
204
205"n" does the same thing. To repeat while removing a previously used offset: >
206
207 //
208
209
210SEARCHING BACKWARDS
211
212The "?" command uses offsets in the same way, but you must use "?" to separate
213the offset from the pattern, instead of "/": >
214
215 ?const?e-2
216
217The "b" and "e" keep their meaning, they don't change direction with the use
218of "?".
219
220
221START POSITION
222
223When starting a search, it normally starts at the cursor position. When you
224specify a line offset, this can cause trouble. For example: >
225
226 /const/-2
227
228This finds the next word "const" and then moves two lines up. If you
Bram Moolenaar40962ec2018-01-28 22:47:25 +0100229use "n" to search again, Vim could start at the current position and find the
230same "const" match. Then using the offset again, you would be back where you
231started. You would be stuck!
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232 It could be worse: Suppose there is another match with "const" in the next
233line. Then repeating the forward search would find this match and move two
234lines up. Thus you would actually move the cursor back!
235
236When you specify a character offset, Vim will compensate for this. Thus the
237search starts a few characters forward or backward, so that the same match
238isn't found again.
239
240==============================================================================
241*27.4* Matching multiple times
242
243The "*" item specifies that the item before it can match any number of times.
244Thus: >
245
246 /a*
247
248matches "a", "aa", "aaa", etc. But also "" (the empty string), because zero
249times is included.
250 The "*" only applies to the item directly before it. Thus "ab*" matches
251"a", "ab", "abb", "abbb", etc. To match a whole string multiple times, it
252must be grouped into one item. This is done by putting "\(" before it and
253"\)" after it. Thus this command: >
254
255 /\(ab\)*
256
257Matches: "ab", "abab", "ababab", etc. And also "".
258
259To avoid matching the empty string, use "\+". This makes the previous item
260match one or more times. >
261
262 /ab\+
263
264Matches "ab", "abb", "abbb", etc. It does not match "a" when no "b" follows.
265
266To match an optional item, use "\=". Example: >
267
268 /folders\=
269
270Matches "folder" and "folders".
271
272
273SPECIFIC COUNTS
274
275To match a specific number of items use the form "\{n,m}". "n" and "m" are
276numbers. The item before it will be matched "n" to "m" times |inclusive|.
277Example: >
278
279 /ab\{3,5}
280
281matches "abbb", "abbbb" and "abbbbb".
282 When "n" is omitted, it defaults to zero. When "m" is omitted it defaults
283to infinity. When ",m" is omitted, it matches exactly "n" times.
284Examples:
285
286 pattern match count ~
287 \{,4} 0, 1, 2, 3 or 4
288 \{3,} 3, 4, 5, etc.
289 \{0,1} 0 or 1, same as \=
290 \{0,} 0 or more, same as *
291 \{1,} 1 or more, same as \+
292 \{3} 3
293
294
295MATCHING AS LITTLE AS POSSIBLE
296
297The items so far match as many characters as they can find. To match as few
298as possible, use "\{-n,m}". It works the same as "\{n,m}", except that the
299minimal amount possible is used.
300 For example, use: >
301
302 /ab\{-1,3}
303
304Will match "ab" in "abbb". Actually, it will never match more than one b,
305because there is no reason to match more. It requires something else to force
306it to match more than the lower limit.
307 The same rules apply to removing "n" and "m". It's even possible to remove
Bram Moolenaar4399ef42005-02-12 14:29:27 +0000308both of the numbers, resulting in "\{-}". This matches the item before it
309zero or more times, as few as possible. The item by itself always matches
310zero times. It is useful when combined with something else. Example: >
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311
312 /a.\{-}b
313
314This matches "axb" in "axbxb". If this pattern would be used: >
315
316 /a.*b
317
318It would try to match as many characters as possible with ".*", thus it
319matches "axbxb" as a whole.
320
321==============================================================================
322*27.5* Alternatives
323
324The "or" operator in a pattern is "\|". Example: >
325
326 /foo\|bar
327
328This matches "foo" or "bar". More alternatives can be concatenated: >
329
330 /one\|two\|three
331
332Matches "one", "two" and "three".
333 To match multiple times, the whole thing must be placed in "\(" and "\)": >
334
335 /\(foo\|bar\)\+
336
337This matches "foo", "foobar", "foofoo", "barfoobar", etc.
338 Another example: >
339
340 /end\(if\|while\|for\)
341
342This matches "endif", "endwhile" and "endfor".
343
344A related item is "\&". This requires that both alternatives match in the
345same place. The resulting match uses the last alternative. Example: >
346
347 /forever\&...
348
349This matches "for" in "forever". It will not match "fortuin", for example.
350
351==============================================================================
352*27.6* Character ranges
353
354To match "a", "b" or "c" you could use "/a\|b\|c". When you want to match all
355letters from "a" to "z" this gets very long. There is a shorter method: >
356
357 /[a-z]
358
359The [] construct matches a single character. Inside you specify which
360characters to match. You can include a list of characters, like this: >
361
362 /[0123456789abcdef]
363
364This will match any of the characters included. For consecutive characters
365you can specify the range. "0-3" stands for "0123". "w-z" stands for "wxyz".
366Thus the same command as above can be shortened to: >
367
368 /[0-9a-f]
369
370To match the "-" character itself make it the first or last one in the range.
371These special characters are accepted to make it easier to use them inside a
372[] range (they can actually be used anywhere in the search pattern):
373
374 \e <Esc>
375 \t <Tab>
376 \r <CR>
377 \b <BS>
378
379There are a few more special cases for [] ranges, see |/[]| for the whole
380story.
381
382
383COMPLEMENTED RANGE
384
385To avoid matching a specific character, use "^" at the start of the range.
386The [] item then matches everything but the characters included. Example: >
387
388 /"[^"]*"
389<
390 " a double quote
391 [^"] any character that is not a double quote
392 * as many as possible
393 " a double quote again
394
395This matches "foo" and "3!x", including the double quotes.
396
397
398PREDEFINED RANGES
399
400A number of ranges are used very often. Vim provides a shortcut for these.
401For example: >
402
403 /\a
404
405Finds alphabetic characters. This is equal to using "/[a-zA-Z]". Here are a
406few more of these:
407
408 item matches equivalent ~
409 \d digit [0-9]
410 \D non-digit [^0-9]
411 \x hex digit [0-9a-fA-F]
412 \X non-hex digit [^0-9a-fA-F]
413 \s white space [ ] (<Tab> and <Space>)
414 \S non-white characters [^ ] (not <Tab> and <Space>)
415 \l lowercase alpha [a-z]
416 \L non-lowercase alpha [^a-z]
417 \u uppercase alpha [A-Z]
418 \U non-uppercase alpha [^A-Z]
419
420 Note:
421 Using these predefined ranges works a lot faster than the character
422 range it stands for.
423 These items can not be used inside []. Thus "[\d\l]" does NOT work to
424 match a digit or lowercase alpha. Use "\(\d\|\l\)" instead.
425
426See |/\s| for the whole list of these ranges.
427
428==============================================================================
429*27.7* Character classes
430
431The character range matches a fixed set of characters. A character class is
432similar, but with an essential difference: The set of characters can be
433redefined without changing the search pattern.
434 For example, search for this pattern: >
435
436 /\f\+
437
Bram Moolenaar2547aa92020-07-26 17:00:44 +0200438The "\f" item stands for file name characters. Thus this matches a sequence
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439of characters that can be a file name.
440 Which characters can be part of a file name depends on the system you are
441using. On MS-Windows, the backslash is included, on Unix it is not. This is
442specified with the 'isfname' option. The default value for Unix is: >
443
444 :set isfname
445 isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
446
447For other systems the default value is different. Thus you can make a search
448pattern with "\f" to match a file name, and it will automatically adjust to
449the system you are using it on.
450
451 Note:
452 Actually, Unix allows using just about any character in a file name,
453 including white space. Including these characters in 'isfname' would
454 be theoretically correct. But it would make it impossible to find the
455 end of a file name in text. Thus the default value of 'isfname' is a
456 compromise.
457
458The character classes are:
459
460 item matches option ~
461 \i identifier characters 'isident'
462 \I like \i, excluding digits
463 \k keyword characters 'iskeyword'
464 \K like \k, excluding digits
465 \p printable characters 'isprint'
466 \P like \p, excluding digits
467 \f file name characters 'isfname'
468 \F like \f, excluding digits
469
470==============================================================================
471*27.8* Matching a line break
472
473Vim can find a pattern that includes a line break. You need to specify where
474the line break happens, because all items mentioned so far don't match a line
475break.
476 To check for a line break in a specific place, use the "\n" item: >
477
Bram Moolenaar85850f32019-07-19 22:05:51 +0200478 /one\ntwo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000479
Bram Moolenaar85850f32019-07-19 22:05:51 +0200480This will match at a line that ends in "one" and the next line starts with
481"two". To match "one two" as well, you need to match a space or a line
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482break. The item to use for it is "\_s": >
483
Bram Moolenaar85850f32019-07-19 22:05:51 +0200484 /one\_stwo
Bram Moolenaar071d4272004-06-13 20:20:40 +0000485
486To allow any amount of white space: >
487
Bram Moolenaar85850f32019-07-19 22:05:51 +0200488 /one\_s\+two
Bram Moolenaar071d4272004-06-13 20:20:40 +0000489
Bram Moolenaar85850f32019-07-19 22:05:51 +0200490This also matches when "one " is at the end of a line and " two" at the
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491start of the next one.
492
493"\s" matches white space, "\_s" matches white space or a line break.
494Similarly, "\a" matches an alphabetic character, and "\_a" matches an
495alphabetic character or a line break. The other character classes and ranges
496can be modified in the same way by inserting a "_".
497
498Many other items can be made to match a line break by prepending "\_". For
499example: "\_." matches any character or a line break.
500
501 Note:
502 "\_.*" matches everything until the end of the file. Be careful with
503 this, it can make a search command very slow.
504
505Another example is "\_[]", a character range that includes a line break: >
506
507 /"\_[^"]*"
508
509This finds a text in double quotes that may be split up in several lines.
510
511==============================================================================
512*27.9* Examples
513
514Here are a few search patterns you might find useful. This shows how the
515items mentioned above can be combined.
516
517
518FINDING A CALIFORNIA LICENSE PLATE
519
Bram Moolenaarc1a11ed2008-06-24 22:09:24 +0000520A sample license plate number is "1MGU103". It has one digit, three uppercase
Bram Moolenaar071d4272004-06-13 20:20:40 +0000521letters and three digits. Directly putting this into a search pattern: >
522
523 /\d\u\u\u\d\d\d
524
525Another way is to specify that there are three digits and letters with a
526count: >
527
528 /\d\u\{3}\d\{3}
529
530Using [] ranges instead: >
531
532 /[0-9][A-Z]\{3}[0-9]\{3}
533
534Which one of these you should use? Whichever one you can remember. The
535simple way you can remember is much faster than the fancy way that you can't.
536If you can remember them all, then avoid the last one, because it's both more
537typing and slower to execute.
538
539
540FINDING AN IDENTIFIER
541
542In C programs (and many other computer languages) an identifier starts with a
543letter and further consists of letters and digits. Underscores can be used
544too. This can be found with: >
545
546 /\<\h\w*\>
547
548"\<" and "\>" are used to find only whole words. "\h" stands for "[A-Za-z_]"
549and "\w" for "[0-9A-Za-z_]".
550
551 Note:
552 "\<" and "\>" depend on the 'iskeyword' option. If it includes "-",
553 for example, then "ident-" is not matched. In this situation use: >
554
555 /\w\@<!\h\w*\w\@!
556<
557 This checks if "\w" does not match before or after the identifier.
558 See |/\@<!| and |/\@!|.
559
560==============================================================================
561
562Next chapter: |usr_28.txt| Folding
563
Bram Moolenaard473c8c2018-08-11 18:00:22 +0200564Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl: