Christian Brabandt | 0ae9e19 | 2025-07-06 10:24:41 +0200 | [diff] [blame] | 1 | *pattern.txt* For Vim version 9.1. Last change: 2025 Jul 06 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 2 | |
| 3 | |
| 4 | VIM REFERENCE MANUAL by Bram Moolenaar |
| 5 | |
| 6 | |
| 7 | Patterns and search commands *pattern-searches* |
| 8 | |
| 9 | The very basics can be found in section |03.9| of the user manual. A few more |
| 10 | explanations are in chapter 27 |usr_27.txt|. |
| 11 | |
| 12 | 1. Search commands |search-commands| |
| 13 | 2. The definition of a pattern |search-pattern| |
| 14 | 3. Magic |/magic| |
| 15 | 4. Overview of pattern items |pattern-overview| |
| 16 | 5. Multi items |pattern-multi-items| |
| 17 | 6. Ordinary atoms |pattern-atoms| |
| 18 | 7. Ignoring case in a pattern |/ignorecase| |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 19 | 8. Composing characters |patterns-composing| |
| 20 | 9. Compare with Perl patterns |perl-patterns| |
| 21 | 10. Highlighting matches |match-highlight| |
Bram Moolenaar | 1588bc8 | 2022-03-08 21:35:07 +0000 | [diff] [blame] | 22 | 11. Fuzzy matching |fuzzy-matching| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 23 | |
| 24 | ============================================================================== |
Bram Moolenaar | 1514667 | 2011-10-20 22:22:38 +0200 | [diff] [blame] | 25 | 1. Search commands *search-commands* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 26 | |
| 27 | */* |
| 28 | /{pattern}[/]<CR> Search forward for the [count]'th occurrence of |
| 29 | {pattern} |exclusive|. |
| 30 | |
| 31 | /{pattern}/{offset}<CR> Search forward for the [count]'th occurrence of |
| 32 | {pattern} and go |{offset}| lines up or down. |
| 33 | |linewise|. |
| 34 | |
| 35 | */<CR>* |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 36 | /<CR> Search forward for the [count]'th occurrence of the |
| 37 | latest used pattern |last-pattern| with latest used |
| 38 | |{offset}|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 39 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 40 | //{offset}<CR> Search forward for the [count]'th occurrence of the |
| 41 | latest used pattern |last-pattern| with new |
| 42 | |{offset}|. If {offset} is empty no offset is used. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 43 | |
| 44 | *?* |
| 45 | ?{pattern}[?]<CR> Search backward for the [count]'th previous |
| 46 | occurrence of {pattern} |exclusive|. |
| 47 | |
| 48 | ?{pattern}?{offset}<CR> Search backward for the [count]'th previous |
| 49 | occurrence of {pattern} and go |{offset}| lines up or |
| 50 | down |linewise|. |
| 51 | |
| 52 | *?<CR>* |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 53 | ?<CR> Search backward for the [count]'th occurrence of the |
| 54 | latest used pattern |last-pattern| with latest used |
| 55 | |{offset}|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 56 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 57 | ??{offset}<CR> Search backward for the [count]'th occurrence of the |
| 58 | latest used pattern |last-pattern| with new |
| 59 | |{offset}|. If {offset} is empty no offset is used. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 60 | |
| 61 | *n* |
| 62 | n Repeat the latest "/" or "?" [count] times. |
Bram Moolenaar | 2b8388b | 2015-02-28 13:11:45 +0100 | [diff] [blame] | 63 | If the cursor doesn't move the search is repeated with |
| 64 | count + 1. |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 65 | |last-pattern| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 66 | |
| 67 | *N* |
| 68 | N Repeat the latest "/" or "?" [count] times in |
Bram Moolenaar | 68e6560 | 2019-05-26 21:33:31 +0200 | [diff] [blame] | 69 | opposite direction. |last-pattern| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 70 | |
| 71 | *star* *E348* *E349* |
| 72 | * Search forward for the [count]'th occurrence of the |
| 73 | word nearest to the cursor. The word used for the |
| 74 | search is the first of: |
| 75 | 1. the keyword under the cursor |'iskeyword'| |
| 76 | 2. the first keyword after the cursor, in the |
| 77 | current line |
| 78 | 3. the non-blank word under the cursor |
| 79 | 4. the first non-blank word after the cursor, |
| 80 | in the current line |
| 81 | Only whole keywords are searched for, like with the |
Bram Moolenaar | 664f3cf | 2019-12-07 16:03:51 +0100 | [diff] [blame] | 82 | command "/\<keyword\>". |exclusive| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 83 | 'ignorecase' is used, 'smartcase' is not. |
| 84 | |
| 85 | *#* |
| 86 | # Same as "*", but search backward. The pound sign |
| 87 | (character 163) also works. If the "#" key works as |
| 88 | backspace, try using "stty erase <BS>" before starting |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 89 | Vim (<BS> is CTRL-H or a real backspace). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 90 | |
| 91 | *gstar* |
| 92 | g* Like "*", but don't put "\<" and "\>" around the word. |
| 93 | This makes the search also find matches that are not a |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 94 | whole word. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 95 | |
| 96 | *g#* |
| 97 | g# Like "#", but don't put "\<" and "\>" around the word. |
| 98 | This makes the search also find matches that are not a |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 99 | whole word. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 100 | |
| 101 | *gd* |
| 102 | gd Goto local Declaration. When the cursor is on a local |
| 103 | variable, this command will jump to its declaration. |
Bram Moolenaar | 938ae28 | 2023-02-20 20:44:55 +0000 | [diff] [blame] | 104 | This was made to work for C code, in other languages |
| 105 | it may not work well. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 106 | First Vim searches for the start of the current |
| 107 | function, just like "[[". If it is not found the |
| 108 | search stops in line 1. If it is found, Vim goes back |
| 109 | until a blank line is found. From this position Vim |
| 110 | searches for the keyword under the cursor, like with |
| 111 | "*", but lines that look like a comment are ignored |
| 112 | (see 'comments' option). |
| 113 | Note that this is not guaranteed to work, Vim does not |
| 114 | really check the syntax, it only searches for a match |
| 115 | with the keyword. If included files also need to be |
| 116 | searched use the commands listed in |include-search|. |
| 117 | After this command |n| searches forward for the next |
| 118 | match (not backward). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 119 | |
| 120 | *gD* |
| 121 | gD Goto global Declaration. When the cursor is on a |
| 122 | global variable that is defined in the file, this |
| 123 | command will jump to its declaration. This works just |
| 124 | like "gd", except that the search for the keyword |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 125 | always starts in line 1. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 126 | |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 127 | *1gd* |
| 128 | 1gd Like "gd", but ignore matches inside a {} block that |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 129 | ends before the cursor position. |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 130 | |
| 131 | *1gD* |
| 132 | 1gD Like "gD", but ignore matches inside a {} block that |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 133 | ends before the cursor position. |
Bram Moolenaar | f75a963 | 2005-09-13 21:20:47 +0000 | [diff] [blame] | 134 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 135 | *CTRL-C* |
| 136 | CTRL-C Interrupt current (search) command. Use CTRL-Break on |
Bram Moolenaar | 5666fcd | 2019-12-26 14:35:26 +0100 | [diff] [blame] | 137 | MS-Windows |dos-CTRL-Break|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 138 | In Normal mode, any pending command is aborted. |
Bram Moolenaar | 9fbdbb8 | 2022-09-27 17:30:34 +0100 | [diff] [blame] | 139 | When Vim was started with output redirected and there |
| 140 | are no changed buffers CTRL-C exits Vim. That is to |
| 141 | help users who use "vim file | grep word" and don't |
| 142 | know how to get out (blindly typing :qa<CR> would |
| 143 | work). |
glepnir | 8a63529 | 2025-03-21 18:12:32 +0100 | [diff] [blame] | 144 | If a popup is open, the active popup will be closed. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 145 | |
| 146 | *:noh* *:nohlsearch* |
| 147 | :noh[lsearch] Stop the highlighting for the 'hlsearch' option. It |
| 148 | is automatically turned back on when using a search |
| 149 | command, or setting the 'hlsearch' option. |
| 150 | This command doesn't work in an autocommand, because |
| 151 | the highlighting state is saved and restored when |
| 152 | executing autocommands |autocmd-searchpat|. |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 153 | Same thing for when invoking a user function. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 154 | |
Maxim Kim | 26de90c | 2024-06-18 19:32:39 +0200 | [diff] [blame] | 155 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 156 | While typing the search pattern the current match will be shown if the |
| 157 | 'incsearch' option is on. Remember that you still have to finish the search |
| 158 | command with <CR> to actually position the cursor at the displayed match. Or |
| 159 | use <Esc> to abandon the search. |
| 160 | |
Maxim Kim | 26de90c | 2024-06-18 19:32:39 +0200 | [diff] [blame] | 161 | *nohlsearch-auto* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 162 | All matches for the last used search pattern will be highlighted if you set |
Maxim Kim | 26de90c | 2024-06-18 19:32:39 +0200 | [diff] [blame] | 163 | the 'hlsearch' option. This can be suspended with the |:nohlsearch| command |
| 164 | or auto suspended with nohlsearch plugin. See |nohlsearch-install|. |
| 165 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 166 | |
Bram Moolenaar | 9dfa313 | 2019-05-04 21:08:40 +0200 | [diff] [blame] | 167 | When 'shortmess' does not include the "S" flag, Vim will automatically show an |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 168 | index, on which the cursor is. This can look like this: > |
Bram Moolenaar | 9dfa313 | 2019-05-04 21:08:40 +0200 | [diff] [blame] | 169 | |
| 170 | [1/5] Cursor is on first of 5 matches. |
| 171 | [1/>99] Cursor is on first of more than 99 matches. |
| 172 | [>99/>99] Cursor is after 99 match of more than 99 matches. |
| 173 | [?/??] Unknown how many matches exists, generating the |
| 174 | statistics was aborted because of search timeout. |
| 175 | |
| 176 | Note: the count does not take offset into account. |
| 177 | |
Bram Moolenaar | 1514667 | 2011-10-20 22:22:38 +0200 | [diff] [blame] | 178 | When no match is found you get the error: *E486* Pattern not found |
Bram Moolenaar | 1588bc8 | 2022-03-08 21:35:07 +0000 | [diff] [blame] | 179 | Note that for the `:global` command, when used in legacy script, you get a |
| 180 | normal message "Pattern not found", for Vi compatibility. |
| 181 | In |Vim9| script you get E486 for "pattern not found" or *E538* when the pattern |
| 182 | matches in every line with `:vglobal`. |
| 183 | For the |:s| command the "e" flag can be used to avoid the error message |
| 184 | |:s_flags|. |
Bram Moolenaar | 1514667 | 2011-10-20 22:22:38 +0200 | [diff] [blame] | 185 | |
Christian Brabandt | 0ae9e19 | 2025-07-06 10:24:41 +0200 | [diff] [blame] | 186 | *search-options* |
| 187 | The following options affect how a search is performed in Vim: |
| 188 | 'hlsearch' highlight matches |
| 189 | 'ignorecase' ignore case when searching |
| 190 | 'imsearch' use |IME| when entering the search pattern |
| 191 | 'incsearch' show matches incrementally as the pattern is typed |
| 192 | 'shortmess' suppress messages |shm-s|; show search count |shm-S| |
| 193 | 'smartcase' override 'ignorecase' if pattern contains uppercase |
| 194 | 'wrapscan' continue searching from the start of the file |
| 195 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 196 | *search-offset* *{offset}* |
| 197 | These commands search for the specified pattern. With "/" and "?" an |
| 198 | additional offset may be given. There are two types of offsets: line offsets |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 199 | and character offsets. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 200 | |
| 201 | The offset gives the cursor position relative to the found match: |
| 202 | [num] [num] lines downwards, in column 1 |
| 203 | +[num] [num] lines downwards, in column 1 |
| 204 | -[num] [num] lines upwards, in column 1 |
| 205 | e[+num] [num] characters to the right of the end of the match |
| 206 | e[-num] [num] characters to the left of the end of the match |
| 207 | s[+num] [num] characters to the right of the start of the match |
| 208 | s[-num] [num] characters to the left of the start of the match |
| 209 | b[+num] [num] identical to s[+num] above (mnemonic: begin) |
| 210 | b[-num] [num] identical to s[-num] above (mnemonic: begin) |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 211 | ;{pattern} perform another search, see |//;| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 212 | |
| 213 | If a '-' or '+' is given but [num] is omitted, a count of one will be used. |
| 214 | When including an offset with 'e', the search becomes inclusive (the |
| 215 | character the cursor lands on is included in operations). |
| 216 | |
| 217 | Examples: |
| 218 | |
| 219 | pattern cursor position ~ |
| 220 | /test/+1 one line below "test", in column 1 |
| 221 | /test/e on the last t of "test" |
| 222 | /test/s+2 on the 's' of "test" |
| 223 | /test/b-3 three characters before "test" |
| 224 | |
| 225 | If one of these commands is used after an operator, the characters between |
| 226 | the cursor position before and after the search is affected. However, if a |
| 227 | line offset is given, the whole lines between the two cursor positions are |
| 228 | affected. |
| 229 | |
| 230 | An example of how to search for matches with a pattern and change the match |
| 231 | with another word: > |
| 232 | /foo<CR> find "foo" |
Bram Moolenaar | 92dff18 | 2014-02-11 19:15:50 +0100 | [diff] [blame] | 233 | c//e<CR> change until end of match |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 234 | bar<Esc> type replacement |
| 235 | //<CR> go to start of next match |
Bram Moolenaar | 92dff18 | 2014-02-11 19:15:50 +0100 | [diff] [blame] | 236 | c//e<CR> change until end of match |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 237 | beep<Esc> type another replacement |
| 238 | etc. |
| 239 | < |
| 240 | *//;* *E386* |
| 241 | A very special offset is ';' followed by another search command. For example: > |
| 242 | |
| 243 | /test 1/;/test |
| 244 | /test.*/+1;?ing? |
| 245 | |
| 246 | The first one first finds the next occurrence of "test 1", and then the first |
| 247 | occurrence of "test" after that. |
| 248 | |
| 249 | This is like executing two search commands after each other, except that: |
| 250 | - It can be used as a single motion command after an operator. |
| 251 | - The direction for a following "n" or "N" command comes from the first |
| 252 | search command. |
| 253 | - When an error occurs the cursor is not moved at all. |
| 254 | |
| 255 | *last-pattern* |
| 256 | The last used pattern and offset are remembered. They can be used to repeat |
| 257 | the search, possibly in another direction or with another count. Note that |
Bram Moolenaar | 9faec4e | 2021-02-27 16:38:07 +0100 | [diff] [blame] | 258 | two patterns are remembered: One for "normal" search commands and one for the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 259 | substitute command ":s". Each time an empty pattern is given, the previously |
Bram Moolenaar | 662db67 | 2011-03-22 14:05:35 +0100 | [diff] [blame] | 260 | used pattern is used. However, if there is no previous search command, a |
| 261 | previous substitute pattern is used, if possible. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 262 | |
| 263 | The 'magic' option sticks with the last used pattern. If you change 'magic', |
| 264 | this will not change how the last used pattern will be interpreted. |
| 265 | The 'ignorecase' option does not do this. When 'ignorecase' is changed, it |
| 266 | will result in the pattern to match other text. |
| 267 | |
| 268 | All matches for the last used search pattern will be highlighted if you set |
| 269 | the 'hlsearch' option. |
| 270 | |
| 271 | To clear the last used search pattern: > |
| 272 | :let @/ = "" |
| 273 | This will not set the pattern to an empty string, because that would match |
| 274 | everywhere. The pattern is really cleared, like when starting Vim. |
| 275 | |
Bram Moolenaar | 8f999f1 | 2005-01-25 22:12:55 +0000 | [diff] [blame] | 276 | The search usually skips matches that don't move the cursor. Whether the next |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 277 | match is found at the next character or after the skipped match depends on the |
| 278 | 'c' flag in 'cpoptions'. See |cpo-c|. |
| 279 | with 'c' flag: "/..." advances 1 to 3 characters |
| 280 | without 'c' flag: "/..." advances 1 character |
| 281 | The unpredictability with the 'c' flag is caused by starting the search in the |
| 282 | first column, skipping matches until one is found past the cursor position. |
| 283 | |
Bram Moolenaar | 8f999f1 | 2005-01-25 22:12:55 +0000 | [diff] [blame] | 284 | When searching backwards, searching starts at the start of the line, using the |
| 285 | 'c' flag in 'cpoptions' as described above. Then the last match before the |
| 286 | cursor position is used. |
| 287 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 288 | In Vi the ":tag" command sets the last search pattern when the tag is searched |
| 289 | for. In Vim this is not done, the previous search pattern is still remembered, |
| 290 | unless the 't' flag is present in 'cpoptions'. The search pattern is always |
| 291 | put in the search history. |
| 292 | |
| 293 | If the 'wrapscan' option is on (which is the default), searches wrap around |
| 294 | the end of the buffer. If 'wrapscan' is not set, the backward search stops |
| 295 | at the beginning and the forward search stops at the end of the buffer. If |
| 296 | 'wrapscan' is set and the pattern was not found the error message "pattern |
| 297 | not found" is given, and the cursor will not be moved. If 'wrapscan' is not |
| 298 | set the message becomes "search hit BOTTOM without match" when searching |
| 299 | forward, or "search hit TOP without match" when searching backward. If |
| 300 | wrapscan is set and the search wraps around the end of the file the message |
| 301 | "search hit TOP, continuing at BOTTOM" or "search hit BOTTOM, continuing at |
| 302 | TOP" is given when searching backwards or forwards respectively. This can be |
| 303 | switched off by setting the 's' flag in the 'shortmess' option. The highlight |
| 304 | method 'w' is used for this message (default: standout). |
| 305 | |
| 306 | *search-range* |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 307 | You can limit the search command "/" to a certain range of lines by including |
| 308 | \%>l items. For example, to match the word "limit" below line 199 and above |
| 309 | line 300: > |
| 310 | /\%>199l\%<300llimit |
| 311 | Also see |/\%>l|. |
| 312 | |
| 313 | Another way is to use the ":substitute" command with the 'c' flag. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 314 | :.,300s/Pattern//gc |
| 315 | This command will search from the cursor position until line 300 for |
| 316 | "Pattern". At the match, you will be asked to type a character. Type 'q' to |
| 317 | stop at this match, type 'n' to find the next match. |
| 318 | |
| 319 | The "*", "#", "g*" and "g#" commands look for a word near the cursor in this |
| 320 | order, the first one that is found is used: |
| 321 | - The keyword currently under the cursor. |
| 322 | - The first keyword to the right of the cursor, in the same line. |
| 323 | - The WORD currently under the cursor. |
| 324 | - The first WORD to the right of the cursor, in the same line. |
| 325 | The keyword may only contain letters and characters in 'iskeyword'. |
| 326 | The WORD may contain any non-blanks (<Tab>s and/or <Space>s). |
| 327 | Note that if you type with ten fingers, the characters are easy to remember: |
| 328 | the "#" is under your left hand middle finger (search to the left and up) and |
| 329 | the "*" is under your right hand middle finger (search to the right and down). |
| 330 | (this depends on your keyboard layout though). |
| 331 | |
Bram Moolenaar | a9604e6 | 2018-07-21 05:56:22 +0200 | [diff] [blame] | 332 | *E956* |
| 333 | In very rare cases a regular expression is used recursively. This can happen |
Bram Moolenaar | f0d58ef | 2018-11-16 16:13:44 +0100 | [diff] [blame] | 334 | when executing a pattern takes a long time and when checking for messages on |
Bram Moolenaar | a9604e6 | 2018-07-21 05:56:22 +0200 | [diff] [blame] | 335 | channels a callback is invoked that also uses a pattern or an autocommand is |
| 336 | triggered. In most cases this should be fine, but if a pattern is in use when |
| 337 | it's used again it fails. Usually this means there is something wrong with |
| 338 | the pattern. |
| 339 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 340 | ============================================================================== |
| 341 | 2. The definition of a pattern *search-pattern* *pattern* *[pattern]* |
| 342 | *regular-expression* *regexp* *Pattern* |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 343 | *E383* *E476* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 344 | |
| 345 | For starters, read chapter 27 of the user manual |usr_27.txt|. |
| 346 | |
| 347 | */bar* */\bar* */pattern* |
| 348 | 1. A pattern is one or more branches, separated by "\|". It matches anything |
| 349 | that matches one of the branches. Example: "foo\|beep" matches "foo" and |
| 350 | matches "beep". If more than one branch matches, the first one is used. |
| 351 | |
| 352 | pattern ::= branch |
| 353 | or branch \| branch |
| 354 | or branch \| branch \| branch |
| 355 | etc. |
| 356 | |
| 357 | */branch* */\&* |
| 358 | 2. A branch is one or more concats, separated by "\&". It matches the last |
| 359 | concat, but only if all the preceding concats also match at the same |
| 360 | position. Examples: |
| 361 | "foobeep\&..." matches "foo" in "foobeep". |
| 362 | ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob" |
| 363 | |
| 364 | branch ::= concat |
| 365 | or concat \& concat |
| 366 | or concat \& concat \& concat |
| 367 | etc. |
| 368 | |
| 369 | */concat* |
| 370 | 3. A concat is one or more pieces, concatenated. It matches a match for the |
| 371 | first piece, followed by a match for the second piece, etc. Example: |
| 372 | "f[0-9]b", first matches "f", then a digit and then "b". |
| 373 | |
| 374 | concat ::= piece |
| 375 | or piece piece |
| 376 | or piece piece piece |
| 377 | etc. |
| 378 | |
| 379 | */piece* |
| 380 | 4. A piece is an atom, possibly followed by a multi, an indication of how many |
| 381 | times the atom can be matched. Example: "a*" matches any sequence of "a" |
| 382 | characters: "", "a", "aa", etc. See |/multi|. |
| 383 | |
| 384 | piece ::= atom |
| 385 | or atom multi |
| 386 | |
| 387 | */atom* |
| 388 | 5. An atom can be one of a long list of items. Many atoms match one character |
| 389 | in the text. It is often an ordinary character or a character class. |
Bram Moolenaar | 1b884a0 | 2020-12-10 21:11:27 +0100 | [diff] [blame] | 390 | Parentheses can be used to make a pattern into an atom. The "\z(\)" |
| 391 | construct is only for syntax highlighting. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 392 | |
| 393 | atom ::= ordinary-atom |/ordinary-atom| |
| 394 | or \( pattern \) |/\(| |
| 395 | or \%( pattern \) |/\%(| |
| 396 | or \z( pattern \) |/\z(| |
| 397 | |
| 398 | |
Bram Moolenaar | 913df81 | 2013-07-06 15:44:11 +0200 | [diff] [blame] | 399 | */\%#=* *two-engines* *NFA* |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 400 | Vim includes two regexp engines: |
| 401 | 1. An old, backtracking engine that supports everything. |
Bram Moolenaar | 220adb1 | 2016-09-12 12:17:26 +0200 | [diff] [blame] | 402 | 2. A new, NFA engine that works much faster on some patterns, possibly slower |
| 403 | on some patterns. |
Christian Brabandt | 360da40 | 2022-05-18 15:04:02 +0100 | [diff] [blame] | 404 | *E1281* |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 405 | Vim will automatically select the right engine for you. However, if you run |
| 406 | into a problem or want to specifically select one engine or the other, you can |
| 407 | prepend one of the following to the pattern: |
| 408 | |
| 409 | \%#=0 Force automatic selection. Only has an effect when |
| 410 | 'regexpengine' has been set to a non-zero value. |
| 411 | \%#=1 Force using the old engine. |
| 412 | \%#=2 Force using the NFA engine. |
| 413 | |
| 414 | You can also use the 'regexpengine' option to change the default. |
| 415 | |
| 416 | *E864* *E868* *E874* *E875* *E876* *E877* *E878* |
| 417 | If selecting the NFA engine and it runs into something that is not implemented |
| 418 | the pattern will not match. This is only useful when debugging Vim. |
| 419 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 420 | ============================================================================== |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 421 | 3. Magic */magic* |
| 422 | |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 423 | Some characters in the pattern, such as letters, are taken literally. They |
| 424 | match exactly the same character in the text. When preceded with a backslash |
| 425 | however, these characters may get a special meaning. For example, "a" matches |
| 426 | the letter "a", while "\a" matches any alphabetic character. |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 427 | |
| 428 | Other characters have a special meaning without a backslash. They need to be |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 429 | preceded with a backslash to match literally. For example "." matches any |
| 430 | character while "\." matches a dot. |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 431 | |
| 432 | If a character is taken literally or not depends on the 'magic' option and the |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 433 | items in the pattern mentioned next. The 'magic' option should always be set, |
| 434 | but it can be switched off for Vi compatibility. We mention the effect of |
| 435 | 'nomagic' here for completeness, but we recommend against using that. |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 436 | */\m* */\M* |
| 437 | Use of "\m" makes the pattern after it be interpreted as if 'magic' is set, |
| 438 | ignoring the actual value of the 'magic' option. |
| 439 | Use of "\M" makes the pattern after it be interpreted as if 'nomagic' is used. |
| 440 | */\v* */\V* |
Bram Moolenaar | c8c8849 | 2018-12-27 23:59:26 +0100 | [diff] [blame] | 441 | Use of "\v" means that after it, all ASCII characters except '0'-'9', 'a'-'z', |
| 442 | 'A'-'Z' and '_' have special meaning: "very magic" |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 443 | |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 444 | Use of "\V" means that after it, only a backslash and the terminating |
| 445 | character (usually / or ?) have special meaning: "very nomagic" |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 446 | |
| 447 | Examples: |
| 448 | after: \v \m \M \V matches ~ |
| 449 | 'magic' 'nomagic' |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 450 | a a a a literal 'a' |
| 451 | \a \a \a \a any alphabetic character |
| 452 | . . \. \. any character |
| 453 | \. \. . . literal dot |
| 454 | $ $ $ \$ end-of-line |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 455 | * * \* \* any number of the previous atom |
Bram Moolenaar | 256972a | 2015-12-29 19:10:25 +0100 | [diff] [blame] | 456 | ~ ~ \~ \~ latest substitute string |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 457 | () \(\) \(\) \(\) group as an atom |
| 458 | | \| \| \| nothing: separates alternatives |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 459 | \\ \\ \\ \\ literal backslash |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 460 | \{ { { { literal curly brace |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 461 | |
| 462 | {only Vim supports \m, \M, \v and \V} |
| 463 | |
Bram Moolenaar | 7e6a515 | 2021-01-02 16:39:53 +0100 | [diff] [blame] | 464 | If you want to you can make a pattern immune to the 'magic' option being set |
| 465 | or not by putting "\m" or "\M" at the start of the pattern. |
Bram Moolenaar | eb3593b | 2006-04-22 22:33:57 +0000 | [diff] [blame] | 466 | |
| 467 | ============================================================================== |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 468 | 4. Overview of pattern items *pattern-overview* |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 469 | *E865* *E866* *E867* *E869* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 470 | |
| 471 | Overview of multi items. */multi* *E61* *E62* |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 472 | More explanation and examples below, follow the links. *E64* *E871* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 473 | |
| 474 | multi ~ |
| 475 | 'magic' 'nomagic' matches of the preceding atom ~ |
| 476 | |/star| * \* 0 or more as many as possible |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 477 | |/\+| \+ \+ 1 or more as many as possible |
| 478 | |/\=| \= \= 0 or 1 as many as possible |
| 479 | |/\?| \? \? 0 or 1 as many as possible |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 480 | |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 481 | |/\{| \{n,m} \{n,m} n to m as many as possible |
| 482 | \{n} \{n} n exactly |
| 483 | \{n,} \{n,} at least n as many as possible |
| 484 | \{,m} \{,m} 0 to m as many as possible |
| 485 | \{} \{} 0 or more as many as possible (same as *) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 486 | |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 487 | |/\{-| \{-n,m} \{-n,m} n to m as few as possible |
| 488 | \{-n} \{-n} n exactly |
| 489 | \{-n,} \{-n,} at least n as few as possible |
| 490 | \{-,m} \{-,m} 0 to m as few as possible |
| 491 | \{-} \{-} 0 or more as few as possible |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 492 | |
| 493 | *E59* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 494 | |/\@>| \@> \@> 1, like matching a whole pattern |
| 495 | |/\@=| \@= \@= nothing, requires a match |/zero-width| |
| 496 | |/\@!| \@! \@! nothing, requires NO match |/zero-width| |
| 497 | |/\@<=| \@<= \@<= nothing, requires a match behind |/zero-width| |
| 498 | |/\@<!| \@<! \@<! nothing, requires NO match behind |/zero-width| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 499 | |
| 500 | |
| 501 | Overview of ordinary atoms. */ordinary-atom* |
| 502 | More explanation and examples below, follow the links. |
| 503 | |
| 504 | ordinary atom ~ |
| 505 | magic nomagic matches ~ |
| 506 | |/^| ^ ^ start-of-line (at start of pattern) |/zero-width| |
| 507 | |/\^| \^ \^ literal '^' |
| 508 | |/\_^| \_^ \_^ start-of-line (used anywhere) |/zero-width| |
| 509 | |/$| $ $ end-of-line (at end of pattern) |/zero-width| |
| 510 | |/\$| \$ \$ literal '$' |
| 511 | |/\_$| \_$ \_$ end-of-line (used anywhere) |/zero-width| |
| 512 | |/.| . \. any single character (not an end-of-line) |
| 513 | |/\_.| \_. \_. any single character or end-of-line |
| 514 | |/\<| \< \< beginning of a word |/zero-width| |
| 515 | |/\>| \> \> end of a word |/zero-width| |
| 516 | |/\zs| \zs \zs anything, sets start of match |
| 517 | |/\ze| \ze \ze anything, sets end of match |
| 518 | |/\%^| \%^ \%^ beginning of file |/zero-width| *E71* |
| 519 | |/\%$| \%$ \%$ end of file |/zero-width| |
Bram Moolenaar | 33aec76 | 2006-01-22 23:30:12 +0000 | [diff] [blame] | 520 | |/\%V| \%V \%V inside Visual area |/zero-width| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 521 | |/\%#| \%# \%# cursor position |/zero-width| |
Bram Moolenaar | 33aec76 | 2006-01-22 23:30:12 +0000 | [diff] [blame] | 522 | |/\%'m| \%'m \%'m mark m position |/zero-width| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 523 | |/\%l| \%23l \%23l in line 23 |/zero-width| |
| 524 | |/\%c| \%23c \%23c in column 23 |/zero-width| |
| 525 | |/\%v| \%23v \%23v in virtual column 23 |/zero-width| |
| 526 | |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 527 | Character classes: */character-classes* |
Bram Moolenaar | 256972a | 2015-12-29 19:10:25 +0100 | [diff] [blame] | 528 | magic nomagic matches ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 529 | |/\i| \i \i identifier character (see 'isident' option) |
| 530 | |/\I| \I \I like "\i", but excluding digits |
| 531 | |/\k| \k \k keyword character (see 'iskeyword' option) |
| 532 | |/\K| \K \K like "\k", but excluding digits |
| 533 | |/\f| \f \f file name character (see 'isfname' option) |
| 534 | |/\F| \F \F like "\f", but excluding digits |
| 535 | |/\p| \p \p printable character (see 'isprint' option) |
| 536 | |/\P| \P \P like "\p", but excluding digits |
| 537 | |/\s| \s \s whitespace character: <Space> and <Tab> |
| 538 | |/\S| \S \S non-whitespace character; opposite of \s |
| 539 | |/\d| \d \d digit: [0-9] |
| 540 | |/\D| \D \D non-digit: [^0-9] |
| 541 | |/\x| \x \x hex digit: [0-9A-Fa-f] |
| 542 | |/\X| \X \X non-hex digit: [^0-9A-Fa-f] |
| 543 | |/\o| \o \o octal digit: [0-7] |
| 544 | |/\O| \O \O non-octal digit: [^0-7] |
| 545 | |/\w| \w \w word character: [0-9A-Za-z_] |
| 546 | |/\W| \W \W non-word character: [^0-9A-Za-z_] |
| 547 | |/\h| \h \h head of word character: [A-Za-z_] |
| 548 | |/\H| \H \H non-head of word character: [^A-Za-z_] |
| 549 | |/\a| \a \a alphabetic character: [A-Za-z] |
| 550 | |/\A| \A \A non-alphabetic character: [^A-Za-z] |
| 551 | |/\l| \l \l lowercase character: [a-z] |
| 552 | |/\L| \L \L non-lowercase character: [^a-z] |
| 553 | |/\u| \u \u uppercase character: [A-Z] |
| 554 | |/\U| \U \U non-uppercase character [^A-Z] |
| 555 | |/\_| \_x \_x where x is any of the characters above: character |
| 556 | class with end-of-line included |
| 557 | (end of character classes) |
| 558 | |
Bram Moolenaar | 256972a | 2015-12-29 19:10:25 +0100 | [diff] [blame] | 559 | magic nomagic matches ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 560 | |/\e| \e \e <Esc> |
| 561 | |/\t| \t \t <Tab> |
| 562 | |/\r| \r \r <CR> |
| 563 | |/\b| \b \b <BS> |
| 564 | |/\n| \n \n end-of-line |
| 565 | |/~| ~ \~ last given substitute string |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 566 | |/\1| \1 \1 same string as matched by first \(\) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 567 | |/\2| \2 \2 Like "\1", but uses second \(\) |
| 568 | ... |
| 569 | |/\9| \9 \9 Like "\1", but uses ninth \(\) |
| 570 | *E68* |
| 571 | |/\z1| \z1 \z1 only for syntax highlighting, see |:syn-ext-match| |
| 572 | ... |
| 573 | |/\z1| \z9 \z9 only for syntax highlighting, see |:syn-ext-match| |
| 574 | |
| 575 | x x a character with no special meaning matches itself |
| 576 | |
| 577 | |/[]| [] \[] any character specified inside the [] |
Bram Moolenaar | 0015450 | 2013-02-13 16:15:55 +0100 | [diff] [blame] | 578 | |/\%[]| \%[] \%[] a sequence of optionally matched atoms |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 579 | |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 580 | |/\c| \c \c ignore case, do not use the 'ignorecase' option |
| 581 | |/\C| \C \C match case, do not use the 'ignorecase' option |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 582 | |/\Z| \Z \Z ignore differences in Unicode "combining characters". |
| 583 | Useful when searching voweled Hebrew or Arabic text. |
| 584 | |
Bram Moolenaar | 256972a | 2015-12-29 19:10:25 +0100 | [diff] [blame] | 585 | magic nomagic matches ~ |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 586 | |/\m| \m \m 'magic' on for the following chars in the pattern |
| 587 | |/\M| \M \M 'magic' off for the following chars in the pattern |
| 588 | |/\v| \v \v the following chars in the pattern are "very magic" |
| 589 | |/\V| \V \V the following chars in the pattern are "very nomagic" |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 590 | |/\%#=| \%#=1 \%#=1 select regexp engine |/zero-width| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 591 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 592 | |/\%d| \%d \%d match specified decimal character (eg \%d123) |
Bram Moolenaar | c0197e2 | 2004-09-13 20:26:32 +0000 | [diff] [blame] | 593 | |/\%x| \%x \%x match specified hex character (eg \%x2a) |
| 594 | |/\%o| \%o \%o match specified octal character (eg \%o040) |
| 595 | |/\%u| \%u \%u match specified multibyte character (eg \%u20ac) |
| 596 | |/\%U| \%U \%U match specified large multibyte character (eg |
| 597 | \%U12345678) |
Bram Moolenaar | 8df5acf | 2014-05-13 19:37:29 +0200 | [diff] [blame] | 598 | |/\%C| \%C \%C match any composing characters |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 599 | |
| 600 | Example matches ~ |
| 601 | \<\I\i* or |
| 602 | \<\h\w* |
| 603 | \<[a-zA-Z_][a-zA-Z0-9_]* |
| 604 | An identifier (e.g., in a C program). |
| 605 | |
| 606 | \(\.$\|\. \) A period followed by <EOL> or a space. |
| 607 | |
| 608 | [.!?][])"']*\($\|[ ]\) A search pattern that finds the end of a sentence, |
| 609 | with almost the same definition as the ")" command. |
| 610 | |
| 611 | cat\Z Both "cat" and "càt" ("a" followed by 0x0300) |
| 612 | Does not match "càt" (character 0x00e0), even |
| 613 | though it may look the same. |
| 614 | |
| 615 | |
| 616 | ============================================================================== |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 617 | 5. Multi items *pattern-multi-items* |
| 618 | |
| 619 | An atom can be followed by an indication of how many times the atom can be |
| 620 | matched and in what way. This is called a multi. See |/multi| for an |
| 621 | overview. |
| 622 | |
Bram Moolenaar | aa3b15d | 2016-04-21 08:53:19 +0200 | [diff] [blame] | 623 | */star* */\star* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 624 | * (use \* when 'magic' is not set) |
| 625 | Matches 0 or more of the preceding atom, as many as possible. |
| 626 | Example 'nomagic' matches ~ |
| 627 | a* a\* "", "a", "aa", "aaa", etc. |
| 628 | .* \.\* anything, also an empty string, no end-of-line |
| 629 | \_.* \_.\* everything up to the end of the buffer |
| 630 | \_.*END \_.\*END everything up to and including the last "END" |
| 631 | in the buffer |
| 632 | |
| 633 | Exception: When "*" is used at the start of the pattern or just after |
| 634 | "^" it matches the star character. |
| 635 | |
| 636 | Be aware that repeating "\_." can match a lot of text and take a long |
| 637 | time. For example, "\_.*END" matches all text from the current |
| 638 | position to the last occurrence of "END" in the file. Since the "*" |
| 639 | will match as many as possible, this first skips over all lines until |
| 640 | the end of the file and then tries matching "END", backing up one |
| 641 | character at a time. |
| 642 | |
Bram Moolenaar | aa3b15d | 2016-04-21 08:53:19 +0200 | [diff] [blame] | 643 | */\+* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 644 | \+ Matches 1 or more of the preceding atom, as many as possible. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 645 | Example matches ~ |
| 646 | ^.\+$ any non-empty line |
| 647 | \s\+ white space of at least one character |
| 648 | |
| 649 | */\=* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 650 | \= Matches 0 or 1 of the preceding atom, as many as possible. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 651 | Example matches ~ |
| 652 | foo\= "fo" and "foo" |
| 653 | |
| 654 | */\?* |
| 655 | \? Just like \=. Cannot be used when searching backwards with the "?" |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 656 | command. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 657 | |
Bram Moolenaar | aa3b15d | 2016-04-21 08:53:19 +0200 | [diff] [blame] | 658 | */\{* *E60* *E554* *E870* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 659 | \{n,m} Matches n to m of the preceding atom, as many as possible |
| 660 | \{n} Matches n of the preceding atom |
| 661 | \{n,} Matches at least n of the preceding atom, as many as possible |
| 662 | \{,m} Matches 0 to m of the preceding atom, as many as possible |
| 663 | \{} Matches 0 or more of the preceding atom, as many as possible (like *) |
| 664 | */\{-* |
| 665 | \{-n,m} matches n to m of the preceding atom, as few as possible |
| 666 | \{-n} matches n of the preceding atom |
| 667 | \{-n,} matches at least n of the preceding atom, as few as possible |
| 668 | \{-,m} matches 0 to m of the preceding atom, as few as possible |
| 669 | \{-} matches 0 or more of the preceding atom, as few as possible |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 670 | |
Bram Moolenaar | 26a60b4 | 2005-02-22 08:49:11 +0000 | [diff] [blame] | 671 | n and m are positive decimal numbers or zero |
Bram Moolenaar | c81e5e7 | 2007-05-05 18:24:42 +0000 | [diff] [blame] | 672 | *non-greedy* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 673 | If a "-" appears immediately after the "{", then a shortest match |
| 674 | first algorithm is used (see example below). In particular, "\{-}" is |
| 675 | the same as "*" but uses the shortest match first algorithm. BUT: A |
| 676 | match that starts earlier is preferred over a shorter match: "a\{-}b" |
| 677 | matches "aaab" in "xaaab". |
| 678 | |
| 679 | Example matches ~ |
| 680 | ab\{2,3}c "abbc" or "abbbc" |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 681 | a\{5} "aaaaa" |
| 682 | ab\{2,}c "abbc", "abbbc", "abbbbc", etc. |
| 683 | ab\{,3}c "ac", "abc", "abbc" or "abbbc" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 684 | a[bc]\{3}d "abbbd", "abbcd", "acbcd", "acccd", etc. |
| 685 | a\(bc\)\{1,2}d "abcd" or "abcbcd" |
| 686 | a[bc]\{-}[cd] "abc" in "abcd" |
| 687 | a[bc]*[cd] "abcd" in "abcd" |
| 688 | |
| 689 | The } may optionally be preceded with a backslash: \{n,m\}. |
| 690 | |
| 691 | */\@=* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 692 | \@= Matches the preceding atom with zero width. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 693 | Like "(?=pattern)" in Perl. |
| 694 | Example matches ~ |
| 695 | foo\(bar\)\@= "foo" in "foobar" |
| 696 | foo\(bar\)\@=foo nothing |
| 697 | */zero-width* |
| 698 | When using "\@=" (or "^", "$", "\<", "\>") no characters are included |
| 699 | in the match. These items are only used to check if a match can be |
| 700 | made. This can be tricky, because a match with following items will |
| 701 | be done in the same position. The last example above will not match |
| 702 | "foobarfoo", because it tries match "foo" in the same position where |
| 703 | "bar" matched. |
| 704 | |
| 705 | Note that using "\&" works the same as using "\@=": "foo\&.." is the |
| 706 | same as "\(foo\)\@=..". But using "\&" is easier, you don't need the |
Bram Moolenaar | 1b884a0 | 2020-12-10 21:11:27 +0100 | [diff] [blame] | 707 | parentheses. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 708 | |
| 709 | |
| 710 | */\@!* |
| 711 | \@! Matches with zero width if the preceding atom does NOT match at the |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 712 | current position. |/zero-width| |
Bram Moolenaar | 1aeaf8c | 2012-05-18 13:46:39 +0200 | [diff] [blame] | 713 | Like "(?!pattern)" in Perl. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 714 | Example matches ~ |
| 715 | foo\(bar\)\@! any "foo" not followed by "bar" |
Bram Moolenaar | 1aeaf8c | 2012-05-18 13:46:39 +0200 | [diff] [blame] | 716 | a.\{-}p\@! "a", "ap", "app", "appp", etc. not immediately |
Bram Moolenaar | 251e191 | 2011-06-19 05:09:16 +0200 | [diff] [blame] | 717 | followed by a "p" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 718 | if \(\(then\)\@!.\)*$ "if " not followed by "then" |
| 719 | |
| 720 | Using "\@!" is tricky, because there are many places where a pattern |
| 721 | does not match. "a.*p\@!" will match from an "a" to the end of the |
| 722 | line, because ".*" can match all characters in the line and the "p" |
| 723 | doesn't match at the end of the line. "a.\{-}p\@!" will match any |
Bram Moolenaar | 1aeaf8c | 2012-05-18 13:46:39 +0200 | [diff] [blame] | 724 | "a", "ap", "app", etc. that isn't followed by a "p", because the "." |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 725 | can match a "p" and "p\@!" doesn't match after that. |
| 726 | |
| 727 | You can't use "\@!" to look for a non-match before the matching |
| 728 | position: "\(foo\)\@!bar" will match "bar" in "foobar", because at the |
| 729 | position where "bar" matches, "foo" does not match. To avoid matching |
| 730 | "foobar" you could use "\(foo\)\@!...bar", but that doesn't match a |
Bram Moolenaar | 13fcaaf | 2005-04-15 21:13:42 +0000 | [diff] [blame] | 731 | bar at the start of a line. Use "\(foo\)\@<!bar". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 732 | |
Bram Moolenaar | 8e5af3e | 2011-04-28 19:02:44 +0200 | [diff] [blame] | 733 | Useful example: to find "foo" in a line that does not contain "bar": > |
| 734 | /^\%(.*bar\)\@!.*\zsfoo |
| 735 | < This pattern first checks that there is not a single position in the |
| 736 | line where "bar" matches. If ".*bar" matches somewhere the \@! will |
| 737 | reject the pattern. When there is no match any "foo" will be found. |
| 738 | The "\zs" is to have the match start just before "foo". |
| 739 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 740 | */\@<=* |
| 741 | \@<= Matches with zero width if the preceding atom matches just before what |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 742 | follows. |/zero-width| |
Bram Moolenaar | 1aeaf8c | 2012-05-18 13:46:39 +0200 | [diff] [blame] | 743 | Like "(?<=pattern)" in Perl, but Vim allows non-fixed-width patterns. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 744 | Example matches ~ |
| 745 | \(an\_s\+\)\@<=file "file" after "an" and white space or an |
| 746 | end-of-line |
| 747 | For speed it's often much better to avoid this multi. Try using "\zs" |
| 748 | instead |/\zs|. To match the same as the above example: |
| 749 | an\_s\+\zsfile |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 750 | At least set a limit for the look-behind, see below. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 751 | |
| 752 | "\@<=" and "\@<!" check for matches just before what follows. |
| 753 | Theoretically these matches could start anywhere before this position. |
| 754 | But to limit the time needed, only the line where what follows matches |
| 755 | is searched, and one line before that (if there is one). This should |
| 756 | be sufficient to match most things and not be too slow. |
Bram Moolenaar | fb53927 | 2014-08-22 19:21:47 +0200 | [diff] [blame] | 757 | |
| 758 | In the old regexp engine the part of the pattern after "\@<=" and |
| 759 | "\@<!" are checked for a match first, thus things like "\1" don't work |
| 760 | to reference \(\) inside the preceding atom. It does work the other |
| 761 | way around: |
| 762 | Bad example matches ~ |
| 763 | \%#=1\1\@<=,\([a-z]\+\) ",abc" in "abc,abc" |
| 764 | |
| 765 | However, the new regexp engine works differently, it is better to not |
| 766 | rely on this behavior, do not use \@<= if it can be avoided: |
| 767 | Example matches ~ |
| 768 | \([a-z]\+\)\zs,\1 ",abc" in "abc,abc" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 769 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 770 | \@123<= |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 771 | Like "\@<=" but only look back 123 bytes. This avoids trying lots |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 772 | of matches that are known to fail and make executing the pattern very |
| 773 | slow. Example, check if there is a "<" just before "span": |
| 774 | /<\@1<=span |
| 775 | This will try matching "<" only one byte before "span", which is the |
| 776 | only place that works anyway. |
| 777 | After crossing a line boundary, the limit is relative to the end of |
| 778 | the line. Thus the characters at the start of the line with the match |
| 779 | are not counted (this is just to keep it simple). |
| 780 | The number zero is the same as no limit. |
| 781 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 782 | */\@<!* |
| 783 | \@<! Matches with zero width if the preceding atom does NOT match just |
| 784 | before what follows. Thus this matches if there is no position in the |
| 785 | current or previous line where the atom matches such that it ends just |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 786 | before what follows. |/zero-width| |
Bram Moolenaar | 1aeaf8c | 2012-05-18 13:46:39 +0200 | [diff] [blame] | 787 | Like "(?<!pattern)" in Perl, but Vim allows non-fixed-width patterns. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 788 | The match with the preceding atom is made to end just before the match |
| 789 | with what follows, thus an atom that ends in ".*" will work. |
| 790 | Warning: This can be slow (because many positions need to be checked |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 791 | for a match). Use a limit if you can, see below. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 792 | Example matches ~ |
| 793 | \(foo\)\@<!bar any "bar" that's not in "foobar" |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 794 | \(\/\/.*\)\@<!in "in" which is not after "//" |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 795 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 796 | \@123<! |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 797 | Like "\@<!" but only look back 123 bytes. This avoids trying lots of |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 798 | matches that are known to fail and make executing the pattern very |
| 799 | slow. |
| 800 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 801 | */\@>* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 802 | \@> Matches the preceding atom like matching a whole pattern. |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 803 | Like "(?>pattern)" in Perl. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 804 | Example matches ~ |
| 805 | \(a*\)\@>a nothing (the "a*" takes all the "a"'s, there can't be |
| 806 | another one following) |
| 807 | |
| 808 | This matches the preceding atom as if it was a pattern by itself. If |
| 809 | it doesn't match, there is no retry with shorter sub-matches or |
| 810 | anything. Observe this difference: "a*b" and "a*ab" both match |
| 811 | "aaab", but in the second case the "a*" matches only the first two |
| 812 | "a"s. "\(a*\)\@>ab" will not match "aaab", because the "a*" matches |
| 813 | the "aaa" (as many "a"s as possible), thus the "ab" can't match. |
| 814 | |
| 815 | |
| 816 | ============================================================================== |
| 817 | 6. Ordinary atoms *pattern-atoms* |
| 818 | |
| 819 | An ordinary atom can be: |
| 820 | |
| 821 | */^* |
| 822 | ^ At beginning of pattern or after "\|", "\(", "\%(" or "\n": matches |
| 823 | start-of-line; at other positions, matches literal '^'. |/zero-width| |
| 824 | Example matches ~ |
| 825 | ^beep( the start of the C function "beep" (probably). |
| 826 | |
| 827 | */\^* |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 828 | \^ Matches literal '^'. Can be used at any position in the pattern, but |
| 829 | not inside []. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 830 | |
| 831 | */\_^* |
| 832 | \_^ Matches start-of-line. |/zero-width| Can be used at any position in |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 833 | the pattern, but not inside []. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 834 | Example matches ~ |
| 835 | \_s*\_^foo white space and blank lines and then "foo" at |
| 836 | start-of-line |
| 837 | |
| 838 | */$* |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 839 | $ At end of pattern or in front of "\|", "\)" or "\n" ('magic' on): |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 840 | matches end-of-line <EOL>; at other positions, matches literal '$'. |
| 841 | |/zero-width| |
| 842 | |
| 843 | */\$* |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 844 | \$ Matches literal '$'. Can be used at any position in the pattern, but |
| 845 | not inside []. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 846 | |
| 847 | */\_$* |
| 848 | \_$ Matches end-of-line. |/zero-width| Can be used at any position in the |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 849 | pattern, but not inside []. Note that "a\_$b" never matches, since |
| 850 | "b" cannot match an end-of-line. Use "a\nb" instead |/\n|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 851 | Example matches ~ |
| 852 | foo\_$\_s* "foo" at end-of-line and following white space and |
| 853 | blank lines |
| 854 | |
| 855 | . (with 'nomagic': \.) */.* */\.* |
| 856 | Matches any single character, but not an end-of-line. |
| 857 | |
| 858 | */\_.* |
| 859 | \_. Matches any single character or end-of-line. |
| 860 | Careful: "\_.*" matches all text to the end of the buffer! |
| 861 | |
| 862 | */\<* |
| 863 | \< Matches the beginning of a word: The next char is the first char of a |
| 864 | word. The 'iskeyword' option specifies what is a word character. |
| 865 | |/zero-width| |
| 866 | |
| 867 | */\>* |
| 868 | \> Matches the end of a word: The previous char is the last char of a |
Bram Moolenaar | 13fcaaf | 2005-04-15 21:13:42 +0000 | [diff] [blame] | 869 | word. The 'iskeyword' option specifies what is a word character. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 870 | |/zero-width| |
| 871 | |
| 872 | */\zs* |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 873 | \zs Matches at any position, but not inside [], and sets the start of the |
| 874 | match there: The next char is the first char of the whole match. |
| 875 | |/zero-width| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 876 | Example: > |
| 877 | /^\s*\zsif |
| 878 | < matches an "if" at the start of a line, ignoring white space. |
| 879 | Can be used multiple times, the last one encountered in a matching |
Bram Moolenaar | 13fcaaf | 2005-04-15 21:13:42 +0000 | [diff] [blame] | 880 | branch is used. Example: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 881 | /\(.\{-}\zsFab\)\{3} |
| 882 | < Finds the third occurrence of "Fab". |
Bram Moolenaar | 34401cc | 2014-08-29 15:12:19 +0200 | [diff] [blame] | 883 | This cannot be followed by a multi. *E888* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 884 | {not available when compiled without the |+syntax| feature} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 885 | */\ze* |
Bram Moolenaar | 1c6737b | 2020-09-07 22:18:52 +0200 | [diff] [blame] | 886 | \ze Matches at any position, but not inside [], and sets the end of the |
| 887 | match there: The previous char is the last char of the whole match. |
| 888 | |/zero-width| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 889 | Can be used multiple times, the last one encountered in a matching |
| 890 | branch is used. |
| 891 | Example: "end\ze\(if\|for\)" matches the "end" in "endif" and |
| 892 | "endfor". |
Bram Moolenaar | 6e93246 | 2014-09-09 18:48:09 +0200 | [diff] [blame] | 893 | This cannot be followed by a multi. |E888| |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 894 | {not available when compiled without the |+syntax| feature} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 895 | |
| 896 | */\%^* *start-of-file* |
| 897 | \%^ Matches start of the file. When matching with a string, matches the |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 898 | start of the string. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 899 | For example, to find the first "VIM" in a file: > |
| 900 | /\%^\_.\{-}\zsVIM |
| 901 | < |
| 902 | */\%$* *end-of-file* |
| 903 | \%$ Matches end of the file. When matching with a string, matches the |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 904 | end of the string. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 905 | Note that this does NOT find the last "VIM" in a file: > |
| 906 | /VIM\_.\{-}\%$ |
| 907 | < It will find the next VIM, because the part after it will always |
| 908 | match. This one will find the last "VIM" in the file: > |
| 909 | /VIM\ze\(\(VIM\)\@!\_.\)*\%$ |
| 910 | < This uses |/\@!| to ascertain that "VIM" does NOT match in any |
| 911 | position after the first "VIM". |
| 912 | Searching from the end of the file backwards is easier! |
| 913 | |
Bram Moolenaar | 33aec76 | 2006-01-22 23:30:12 +0000 | [diff] [blame] | 914 | */\%V* |
| 915 | \%V Match inside the Visual area. When Visual mode has already been |
| 916 | stopped match in the area that |gv| would reselect. |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 917 | This is a |/zero-width| match. To make sure the whole pattern is |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 918 | inside the Visual area put it at the start and just before the end of |
| 919 | the pattern, e.g.: > |
| 920 | /\%Vfoo.*ba\%Vr |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 921 | < This also works if only "foo bar" was Visually selected. This: > |
Bram Moolenaar | 036986f | 2017-03-16 17:41:02 +0100 | [diff] [blame] | 922 | /\%Vfoo.*bar\%V |
Bram Moolenaar | 214641f | 2017-03-05 17:04:09 +0100 | [diff] [blame] | 923 | < would match "foo bar" if the Visual selection continues after the "r". |
| 924 | Only works for the current buffer. |
Bram Moolenaar | 33aec76 | 2006-01-22 23:30:12 +0000 | [diff] [blame] | 925 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 926 | */\%#* *cursor-position* |
| 927 | \%# Matches with the cursor position. Only works when matching in a |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 928 | buffer displayed in a window. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 929 | WARNING: When the cursor is moved after the pattern was used, the |
| 930 | result becomes invalid. Vim doesn't automatically update the matches. |
| 931 | This is especially relevant for syntax highlighting and 'hlsearch'. |
| 932 | In other words: When the cursor moves the display isn't updated for |
| 933 | this change. An update is done for lines which are changed (the whole |
| 934 | line is updated) or when using the |CTRL-L| command (the whole screen |
| 935 | is updated). Example, to highlight the word under the cursor: > |
| 936 | /\k*\%#\k* |
| 937 | < When 'hlsearch' is set and you move the cursor around and make changes |
| 938 | this will clearly show when the match is updated or not. |
| 939 | |
Bram Moolenaar | 33aec76 | 2006-01-22 23:30:12 +0000 | [diff] [blame] | 940 | */\%'m* */\%<'m* */\%>'m* |
| 941 | \%'m Matches with the position of mark m. |
| 942 | \%<'m Matches before the position of mark m. |
| 943 | \%>'m Matches after the position of mark m. |
| 944 | Example, to highlight the text from mark 's to 'e: > |
| 945 | /.\%>'s.*\%<'e.. |
| 946 | < Note that two dots are required to include mark 'e in the match. That |
| 947 | is because "\%<'e" matches at the character before the 'e mark, and |
| 948 | since it's a |/zero-width| match it doesn't include that character. |
Bram Moolenaar | 33aec76 | 2006-01-22 23:30:12 +0000 | [diff] [blame] | 949 | WARNING: When the mark is moved after the pattern was used, the result |
| 950 | becomes invalid. Vim doesn't automatically update the matches. |
Bram Moolenaar | 1ef15e3 | 2006-02-01 21:56:25 +0000 | [diff] [blame] | 951 | Similar to moving the cursor for "\%#" |/\%#|. |
Bram Moolenaar | 33aec76 | 2006-01-22 23:30:12 +0000 | [diff] [blame] | 952 | |
Bram Moolenaar | 2ecbe53 | 2022-07-29 21:36:21 +0100 | [diff] [blame] | 953 | */\%l* */\%>l* */\%<l* *E951* *E1204* *E1273* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 954 | \%23l Matches in a specific line. |
Bram Moolenaar | 4770d09 | 2006-01-12 23:22:24 +0000 | [diff] [blame] | 955 | \%<23l Matches above a specific line (lower line number). |
| 956 | \%>23l Matches below a specific line (higher line number). |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 957 | \%.l Matches at the cursor line. |
| 958 | \%<.l Matches above the cursor line. |
| 959 | \%>.l Matches below the cursor line. |
Bram Moolenaar | 2286304 | 2021-10-16 15:23:36 +0100 | [diff] [blame] | 960 | These six can be used to match specific lines in a buffer. The "23" |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 961 | can be any line number. The first line is 1. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 962 | WARNING: When inserting or deleting lines Vim does not automatically |
| 963 | update the matches. This means Syntax highlighting quickly becomes |
Bram Moolenaar | 53f7fcc | 2021-07-28 20:10:16 +0200 | [diff] [blame] | 964 | wrong. Also when referring to the cursor position (".") and |
Bram Moolenaar | 04db26b | 2021-07-05 20:15:23 +0200 | [diff] [blame] | 965 | the cursor moves the display isn't updated for this change. An update |
| 966 | is done when using the |CTRL-L| command (the whole screen is updated). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 967 | Example, to highlight the line where the cursor currently is: > |
Bram Moolenaar | 04db26b | 2021-07-05 20:15:23 +0200 | [diff] [blame] | 968 | :exe '/\%' . line(".") . 'l' |
| 969 | < Alternatively use: > |
| 970 | /\%.l |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 971 | < When 'hlsearch' is set and you move the cursor around and make changes |
| 972 | this will clearly show when the match is updated or not. |
| 973 | |
| 974 | */\%c* */\%>c* */\%<c* |
| 975 | \%23c Matches in a specific column. |
| 976 | \%<23c Matches before a specific column. |
| 977 | \%>23c Matches after a specific column. |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 978 | \%.c Matches at the cursor column. |
| 979 | \%<.c Matches before the cursor column. |
| 980 | \%>.c Matches after the cursor column. |
Bram Moolenaar | 2286304 | 2021-10-16 15:23:36 +0100 | [diff] [blame] | 981 | These six can be used to match specific columns in a buffer or string. |
| 982 | The "23" can be any column number. The first column is 1. Actually, |
| 983 | the column is the byte number (thus it's not exactly right for |
| 984 | multibyte characters). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 985 | WARNING: When inserting or deleting text Vim does not automatically |
| 986 | update the matches. This means Syntax highlighting quickly becomes |
Bram Moolenaar | 53f7fcc | 2021-07-28 20:10:16 +0200 | [diff] [blame] | 987 | wrong. Also when referring to the cursor position (".") and |
Bram Moolenaar | 04db26b | 2021-07-05 20:15:23 +0200 | [diff] [blame] | 988 | the cursor moves the display isn't updated for this change. An update |
| 989 | is done when using the |CTRL-L| command (the whole screen is updated). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 990 | Example, to highlight the column where the cursor currently is: > |
Bram Moolenaar | c51cf03 | 2022-02-26 12:25:45 +0000 | [diff] [blame] | 991 | :exe '/\%' .. col(".") .. 'c' |
Bram Moolenaar | 04db26b | 2021-07-05 20:15:23 +0200 | [diff] [blame] | 992 | < Alternatively use: > |
| 993 | /\%.c |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 994 | < When 'hlsearch' is set and you move the cursor around and make changes |
| 995 | this will clearly show when the match is updated or not. |
| 996 | Example for matching a single byte in column 44: > |
| 997 | /\%>43c.\%<46c |
| 998 | < Note that "\%<46c" matches in column 45 when the "." matches a byte in |
| 999 | column 44. |
| 1000 | */\%v* */\%>v* */\%<v* |
| 1001 | \%23v Matches in a specific virtual column. |
| 1002 | \%<23v Matches before a specific virtual column. |
| 1003 | \%>23v Matches after a specific virtual column. |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 1004 | \%.v Matches at the current virtual column. |
| 1005 | \%<.v Matches before the current virtual column. |
| 1006 | \%>.v Matches after the current virtual column. |
Bram Moolenaar | 2286304 | 2021-10-16 15:23:36 +0100 | [diff] [blame] | 1007 | These six can be used to match specific virtual columns in a buffer or |
| 1008 | string. When not matching with a buffer in a window, the option |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1009 | values of the current window are used (e.g., 'tabstop'). |
| 1010 | The "23" can be any column number. The first column is 1. |
| 1011 | Note that some virtual column positions will never match, because they |
Bram Moolenaar | 69c2f17 | 2007-05-12 14:57:31 +0000 | [diff] [blame] | 1012 | are halfway through a tab or other character that occupies more than |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 1013 | one screen character. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1014 | WARNING: When inserting or deleting text Vim does not automatically |
Bram Moolenaar | de934d7 | 2005-05-22 22:09:40 +0000 | [diff] [blame] | 1015 | update highlighted matches. This means Syntax highlighting quickly |
Bram Moolenaar | 53f7fcc | 2021-07-28 20:10:16 +0200 | [diff] [blame] | 1016 | becomes wrong. Also when referring to the cursor position (".") and |
Bram Moolenaar | 04db26b | 2021-07-05 20:15:23 +0200 | [diff] [blame] | 1017 | the cursor moves the display isn't updated for this change. An update |
| 1018 | is done when using the |CTRL-L| command (the whole screen is updated). |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 1019 | Example, to highlight all the characters after virtual column 72: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1020 | /\%>72v.* |
| 1021 | < When 'hlsearch' is set and you move the cursor around and make changes |
| 1022 | this will clearly show when the match is updated or not. |
| 1023 | To match the text up to column 17: > |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1024 | /^.*\%17v |
Bram Moolenaar | 04db26b | 2021-07-05 20:15:23 +0200 | [diff] [blame] | 1025 | < To match all characters after the current virtual column (where the |
| 1026 | cursor is): > |
| 1027 | /\%>.v.* |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1028 | < Column 17 is not included, because this is a |/zero-width| match. To |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1029 | include the column use: > |
| 1030 | /^.*\%17v. |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 1031 | < This command does the same thing, but also matches when there is no |
| 1032 | character in column 17: > |
Bram Moolenaar | c95a302 | 2016-06-12 23:01:46 +0200 | [diff] [blame] | 1033 | /^.*\%<18v. |
| 1034 | < Note that without the "^" to anchor the match in the first column, |
| 1035 | this will also highlight column 17: > |
| 1036 | /.*\%17v |
| 1037 | < Column 17 is highlighted by 'hlsearch' because there is another match |
| 1038 | where ".*" matches zero characters. |
Bram Moolenaar | 2286304 | 2021-10-16 15:23:36 +0100 | [diff] [blame] | 1039 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1040 | |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 1041 | Character classes: |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1042 | \i identifier character (see 'isident' option) */\i* |
| 1043 | \I like "\i", but excluding digits */\I* |
| 1044 | \k keyword character (see 'iskeyword' option) */\k* |
| 1045 | \K like "\k", but excluding digits */\K* |
| 1046 | \f file name character (see 'isfname' option) */\f* |
| 1047 | \F like "\f", but excluding digits */\F* |
| 1048 | \p printable character (see 'isprint' option) */\p* |
| 1049 | \P like "\p", but excluding digits */\P* |
| 1050 | |
Bram Moolenaar | 207f009 | 2020-08-30 17:20:20 +0200 | [diff] [blame] | 1051 | NOTE: the above also work for multibyte characters. The ones below only |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1052 | match ASCII characters, as indicated by the range. |
| 1053 | |
| 1054 | *whitespace* *white-space* |
| 1055 | \s whitespace character: <Space> and <Tab> */\s* |
| 1056 | \S non-whitespace character; opposite of \s */\S* |
| 1057 | \d digit: [0-9] */\d* |
| 1058 | \D non-digit: [^0-9] */\D* |
| 1059 | \x hex digit: [0-9A-Fa-f] */\x* |
| 1060 | \X non-hex digit: [^0-9A-Fa-f] */\X* |
| 1061 | \o octal digit: [0-7] */\o* |
| 1062 | \O non-octal digit: [^0-7] */\O* |
| 1063 | \w word character: [0-9A-Za-z_] */\w* |
| 1064 | \W non-word character: [^0-9A-Za-z_] */\W* |
| 1065 | \h head of word character: [A-Za-z_] */\h* |
| 1066 | \H non-head of word character: [^A-Za-z_] */\H* |
| 1067 | \a alphabetic character: [A-Za-z] */\a* |
| 1068 | \A non-alphabetic character: [^A-Za-z] */\A* |
| 1069 | \l lowercase character: [a-z] */\l* |
| 1070 | \L non-lowercase character: [^a-z] */\L* |
| 1071 | \u uppercase character: [A-Z] */\u* |
Bram Moolenaar | f1568ec | 2011-12-14 21:17:39 +0100 | [diff] [blame] | 1072 | \U non-uppercase character: [^A-Z] */\U* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1073 | |
| 1074 | NOTE: Using the atom is faster than the [] form. |
| 1075 | |
| 1076 | NOTE: 'ignorecase', "\c" and "\C" are not used by character classes. |
| 1077 | |
| 1078 | */\_* *E63* */\_i* */\_I* */\_k* */\_K* */\_f* */\_F* |
| 1079 | */\_p* */\_P* */\_s* */\_S* */\_d* */\_D* */\_x* */\_X* |
| 1080 | */\_o* */\_O* */\_w* */\_W* */\_h* */\_H* */\_a* */\_A* |
| 1081 | */\_l* */\_L* */\_u* */\_U* |
| 1082 | \_x Where "x" is any of the characters above: The character class with |
| 1083 | end-of-line added |
| 1084 | (end of character classes) |
| 1085 | |
| 1086 | \e matches <Esc> */\e* |
| 1087 | \t matches <Tab> */\t* |
| 1088 | \r matches <CR> */\r* |
| 1089 | \b matches <BS> */\b* |
| 1090 | \n matches an end-of-line */\n* |
| 1091 | When matching in a string instead of buffer text a literal newline |
| 1092 | character is matched. |
| 1093 | |
| 1094 | ~ matches the last given substitute string */~* */\~* |
| 1095 | |
| 1096 | \(\) A pattern enclosed by escaped parentheses. */\(* */\(\)* */\)* |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 1097 | E.g., "\(^a\)" matches 'a' at the start of a line. |
h_east | ba77bbb | 2023-10-03 04:47:13 +0900 | [diff] [blame] | 1098 | There can only be nine of these. You can use "\%(" to add more, but |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 1099 | not counting it as a sub-expression. |
Bram Moolenaar | fbc0d2e | 2013-05-19 19:40:29 +0200 | [diff] [blame] | 1100 | *E51* *E54* *E55* *E872* *E873* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1101 | |
| 1102 | \1 Matches the same string that was matched by */\1* *E65* |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 1103 | the first sub-expression in \( and \). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1104 | Example: "\([a-z]\).\1" matches "ata", "ehe", "tot", etc. |
| 1105 | \2 Like "\1", but uses second sub-expression, */\2* |
| 1106 | ... */\3* |
| 1107 | \9 Like "\1", but uses ninth sub-expression. */\9* |
| 1108 | Note: The numbering of groups is done based on which "\(" comes first |
| 1109 | in the pattern (going left to right), NOT based on what is matched |
| 1110 | first. |
| 1111 | |
| 1112 | \%(\) A pattern enclosed by escaped parentheses. */\%(\)* */\%(* *E53* |
| 1113 | Just like \(\), but without counting it as a sub-expression. This |
| 1114 | allows using more groups and it's a little bit faster. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1115 | |
| 1116 | x A single character, with no special meaning, matches itself |
| 1117 | |
| 1118 | */\* */\\* |
| 1119 | \x A backslash followed by a single character, with no special meaning, |
| 1120 | is reserved for future expansions |
| 1121 | |
Bram Moolenaar | 2f0936c | 2022-01-08 21:51:59 +0000 | [diff] [blame] | 1122 | [] (with 'nomagic': \[]) */[]* */\[]* */\_[]* */collection* *E76* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1123 | \_[] |
Bram Moolenaar | 1b884a0 | 2020-12-10 21:11:27 +0100 | [diff] [blame] | 1124 | A collection. This is a sequence of characters enclosed in square |
| 1125 | brackets. It matches any single character in the collection. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1126 | Example matches ~ |
| 1127 | [xyz] any 'x', 'y' or 'z' |
| 1128 | [a-zA-Z]$ any alphabetic character at the end of a line |
| 1129 | \c[a-z]$ same |
Bram Moolenaar | a3e6bc9 | 2013-01-30 14:18:00 +0100 | [diff] [blame] | 1130 | [А-яЁё] Russian alphabet (with utf-8 and cp1251) |
| 1131 | |
Bram Moolenaar | c81e5e7 | 2007-05-05 18:24:42 +0000 | [diff] [blame] | 1132 | */[\n]* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1133 | With "\_" prepended the collection also includes the end-of-line. |
| 1134 | The same can be done by including "\n" in the collection. The |
| 1135 | end-of-line is also matched when the collection starts with "^"! Thus |
| 1136 | "\_[^ab]" matches the end-of-line and any character but "a" and "b". |
| 1137 | This makes it Vi compatible: Without the "\_" or "\n" the collection |
| 1138 | does not match an end-of-line. |
Bram Moolenaar | 8aff23a | 2005-08-19 20:40:30 +0000 | [diff] [blame] | 1139 | *E769* |
Bram Moolenaar | ae5bce1 | 2005-08-15 21:41:48 +0000 | [diff] [blame] | 1140 | When the ']' is not there Vim will not give an error message but |
Bram Moolenaar | 8aff23a | 2005-08-19 20:40:30 +0000 | [diff] [blame] | 1141 | assume no collection is used. Useful to search for '['. However, you |
Bram Moolenaar | 5837f1f | 2015-03-21 18:06:14 +0100 | [diff] [blame] | 1142 | do get E769 for internal searching. And be aware that in a |
| 1143 | `:substitute` command the whole command becomes the pattern. E.g. |
| 1144 | ":s/[/x/" searches for "[/x" and replaces it with nothing. It does |
| 1145 | not search for "[" and replaces it with "x"! |
Bram Moolenaar | ae5bce1 | 2005-08-15 21:41:48 +0000 | [diff] [blame] | 1146 | |
Bram Moolenaar | 3ec574f | 2017-06-13 18:12:01 +0200 | [diff] [blame] | 1147 | *E944* *E945* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1148 | If the sequence begins with "^", it matches any single character NOT |
| 1149 | in the collection: "[^xyz]" matches anything but 'x', 'y' and 'z'. |
| 1150 | - If two characters in the sequence are separated by '-', this is |
| 1151 | shorthand for the full list of ASCII characters between them. E.g., |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1152 | "[0-9]" matches any decimal digit. If the starting character exceeds |
| 1153 | the ending character, e.g. [c-a], E944 occurs. Non-ASCII characters |
Bram Moolenaar | 3ec574f | 2017-06-13 18:12:01 +0200 | [diff] [blame] | 1154 | can be used, but the character values must not be more than 256 apart |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1155 | in the old regexp engine. For example, searching by [\u3000-\u4000] |
| 1156 | after setting re=1 emits a E945 error. Prepending \%#=2 will fix it. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1157 | - A character class expression is evaluated to the set of characters |
| 1158 | belonging to that character class. The following character classes |
| 1159 | are supported: |
Bram Moolenaar | 0c078fc | 2017-03-29 15:31:20 +0200 | [diff] [blame] | 1160 | Name Func Contents ~ |
| 1161 | *[:alnum:]* [:alnum:] isalnum ASCII letters and digits |
Bram Moolenaar | 938ae28 | 2023-02-20 20:44:55 +0000 | [diff] [blame] | 1162 | *[:alpha:]* [:alpha:] isalpha ASCII letters |
| 1163 | *[:blank:]* [:blank:] space and tab |
| 1164 | *[:cntrl:]* [:cntrl:] iscntrl ASCII control characters |
| 1165 | *[:digit:]* [:digit:] decimal digits '0' to '9' |
Bram Moolenaar | 0c078fc | 2017-03-29 15:31:20 +0200 | [diff] [blame] | 1166 | *[:graph:]* [:graph:] isgraph ASCII printable characters excluding |
| 1167 | space |
| 1168 | *[:lower:]* [:lower:] (1) lowercase letters (all letters when |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1169 | 'ignorecase' is used) |
Bram Moolenaar | 938ae28 | 2023-02-20 20:44:55 +0000 | [diff] [blame] | 1170 | *[:print:]* [:print:] (2) printable characters including space |
Bram Moolenaar | 0c078fc | 2017-03-29 15:31:20 +0200 | [diff] [blame] | 1171 | *[:punct:]* [:punct:] ispunct ASCII punctuation characters |
Bram Moolenaar | 938ae28 | 2023-02-20 20:44:55 +0000 | [diff] [blame] | 1172 | *[:space:]* [:space:] whitespace characters: space, tab, CR, |
Bram Moolenaar | 0c078fc | 2017-03-29 15:31:20 +0200 | [diff] [blame] | 1173 | NL, vertical tab, form feed |
| 1174 | *[:upper:]* [:upper:] (3) uppercase letters (all letters when |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1175 | 'ignorecase' is used) |
Bram Moolenaar | 938ae28 | 2023-02-20 20:44:55 +0000 | [diff] [blame] | 1176 | *[:xdigit:]* [:xdigit:] hexadecimal digits: 0-9, a-f, A-F |
Bram Moolenaar | 0c078fc | 2017-03-29 15:31:20 +0200 | [diff] [blame] | 1177 | *[:return:]* [:return:] the <CR> character |
| 1178 | *[:tab:]* [:tab:] the <Tab> character |
| 1179 | *[:escape:]* [:escape:] the <Esc> character |
| 1180 | *[:backspace:]* [:backspace:] the <BS> character |
Bram Moolenaar | 221cd9f | 2019-01-31 15:34:40 +0100 | [diff] [blame] | 1181 | *[:ident:]* [:ident:] identifier character (same as "\i") |
| 1182 | *[:keyword:]* [:keyword:] keyword character (same as "\k") |
| 1183 | *[:fname:]* [:fname:] file name character (same as "\f") |
Bram Moolenaar | 1b884a0 | 2020-12-10 21:11:27 +0100 | [diff] [blame] | 1184 | The square brackets in character class expressions are additional to |
| 1185 | the square brackets delimiting a collection. For example, the |
| 1186 | following is a plausible pattern for a UNIX filename: |
| 1187 | "[-./[:alnum:]_~]\+". That is, a list of at least one character, |
| 1188 | each of which is either '-', '.', '/', alphabetic, numeric, '_' or |
| 1189 | '~'. |
Bram Moolenaar | fa73534 | 2016-01-03 22:14:44 +0100 | [diff] [blame] | 1190 | These items only work for 8-bit characters, except [:lower:] and |
Bram Moolenaar | 207f009 | 2020-08-30 17:20:20 +0200 | [diff] [blame] | 1191 | [:upper:] also work for multibyte characters when using the new |
Bram Moolenaar | 03413f4 | 2016-04-12 21:07:15 +0200 | [diff] [blame] | 1192 | regexp engine. See |two-engines|. In the future these items may |
Bram Moolenaar | 207f009 | 2020-08-30 17:20:20 +0200 | [diff] [blame] | 1193 | work for multibyte characters. For now, to get all "alpha" |
Bram Moolenaar | 0648142 | 2016-04-30 15:13:38 +0200 | [diff] [blame] | 1194 | characters you can use: [[:lower:][:upper:]]. |
Bram Moolenaar | 0c078fc | 2017-03-29 15:31:20 +0200 | [diff] [blame] | 1195 | |
| 1196 | The "Func" column shows what library function is used. The |
| 1197 | implementation depends on the system. Otherwise: |
| 1198 | (1) Uses islower() for ASCII and Vim builtin rules for other |
Bram Moolenaar | 4c92e75 | 2019-02-17 21:18:32 +0100 | [diff] [blame] | 1199 | characters. |
Bram Moolenaar | 0c078fc | 2017-03-29 15:31:20 +0200 | [diff] [blame] | 1200 | (2) Uses Vim builtin rules |
| 1201 | (3) As with (1) but using isupper() |
Bram Moolenaar | 26a60b4 | 2005-02-22 08:49:11 +0000 | [diff] [blame] | 1202 | */[[=* *[==]* |
| 1203 | - An equivalence class. This means that characters are matched that |
Bram Moolenaar | 522f9ae | 2011-07-20 17:58:20 +0200 | [diff] [blame] | 1204 | have almost the same meaning, e.g., when ignoring accents. This |
| 1205 | only works for Unicode, latin1 and latin9. The form is: |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1206 | [=a=] |
Bram Moolenaar | 26a60b4 | 2005-02-22 08:49:11 +0000 | [diff] [blame] | 1207 | */[[.* *[..]* |
| 1208 | - A collation element. This currently simply accepts a single |
| 1209 | character in the form: |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 1210 | [.a.] |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1211 | */\]* |
| 1212 | - To include a literal ']', '^', '-' or '\' in the collection, put a |
| 1213 | backslash before it: "[xyz\]]", "[\^xyz]", "[xy\-z]" and "[xyz\\]". |
| 1214 | (Note: POSIX does not support the use of a backslash this way). For |
| 1215 | ']' you can also make it the first character (following a possible |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 1216 | "^"): "[]xyz]" or "[^]xyz]". |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1217 | For '-' you can also make it the first or last character: "[-xyz]", |
| 1218 | "[^-xyz]" or "[xyz-]". For '\' you can also let it be followed by |
Bram Moolenaar | 0bc380a | 2010-07-10 13:52:13 +0200 | [diff] [blame] | 1219 | any character that's not in "^]-\bdertnoUux". "[\xyz]" matches '\', |
| 1220 | 'x', 'y' and 'z'. It's better to use "\\" though, future expansions |
| 1221 | may use other characters after '\'. |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1222 | - Omitting the trailing ] is not considered an error. "[]" works like |
Bram Moolenaar | ff03419 | 2013-04-24 18:51:19 +0200 | [diff] [blame] | 1223 | "[]]", it matches the ']' character. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1224 | - The following translations are accepted when the 'l' flag is not |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 1225 | included in 'cpoptions': |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1226 | \e <Esc> |
| 1227 | \t <Tab> |
| 1228 | \r <CR> (NOT end-of-line!) |
| 1229 | \b <BS> |
Bram Moolenaar | c81e5e7 | 2007-05-05 18:24:42 +0000 | [diff] [blame] | 1230 | \n line break, see above |/[\n]| |
Bram Moolenaar | c0197e2 | 2004-09-13 20:26:32 +0000 | [diff] [blame] | 1231 | \d123 decimal number of character |
Bram Moolenaar | 82be484 | 2021-01-11 19:40:15 +0100 | [diff] [blame] | 1232 | \o40 octal number of character up to 0o377 |
Bram Moolenaar | c0197e2 | 2004-09-13 20:26:32 +0000 | [diff] [blame] | 1233 | \x20 hexadecimal number of character up to 0xff |
| 1234 | \u20AC hex. number of multibyte character up to 0xffff |
Christian Brabandt | f2b1698 | 2025-03-29 09:08:58 +0100 | [diff] [blame] | 1235 | \U1234 hex. number of multibyte character up to 8 characters |
| 1236 | 0xffffffff |E1541| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1237 | NOTE: The other backslash codes mentioned above do not work inside |
| 1238 | []! |
| 1239 | - Matching with a collection can be slow, because each character in |
| 1240 | the text has to be compared with each character in the collection. |
| 1241 | Use one of the other atoms above when possible. Example: "\d" is |
Bram Moolenaar | 98ef233 | 2018-03-18 14:44:37 +0100 | [diff] [blame] | 1242 | much faster than "[0-9]" and matches the same characters. However, |
| 1243 | the new |NFA| regexp engine deals with this better than the old one. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1244 | |
| 1245 | */\%[]* *E69* *E70* *E369* |
Bram Moolenaar | c0197e2 | 2004-09-13 20:26:32 +0000 | [diff] [blame] | 1246 | \%[] A sequence of optionally matched atoms. This always matches. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1247 | It matches as much of the list of atoms it contains as possible. Thus |
| 1248 | it stops at the first atom that doesn't match. For example: > |
| 1249 | /r\%[ead] |
| 1250 | < matches "r", "re", "rea" or "read". The longest that matches is used. |
| 1251 | To match the Ex command "function", where "fu" is required and |
| 1252 | "nction" is optional, this would work: > |
| 1253 | /\<fu\%[nction]\> |
| 1254 | < The end-of-word atom "\>" is used to avoid matching "fu" in "full". |
| 1255 | It gets more complicated when the atoms are not ordinary characters. |
| 1256 | You don't often have to use it, but it is possible. Example: > |
| 1257 | /\<r\%[[eo]ad]\> |
| 1258 | < Matches the words "r", "re", "ro", "rea", "roa", "read" and "road". |
Bram Moolenaar | c81e5e7 | 2007-05-05 18:24:42 +0000 | [diff] [blame] | 1259 | There can be no \(\), \%(\) or \z(\) items inside the [] and \%[] does |
| 1260 | not nest. |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 1261 | To include a "[" use "[[]" and for "]" use []]", e.g.,: > |
| 1262 | /index\%[[[]0[]]] |
| 1263 | < matches "index" "index[", "index[0" and "index[0]". |
Bram Moolenaar | db84e45 | 2010-08-15 13:50:43 +0200 | [diff] [blame] | 1264 | {not available when compiled without the |+syntax| feature} |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1265 | |
Bram Moolenaar | 677ee68 | 2005-01-27 14:41:15 +0000 | [diff] [blame] | 1266 | */\%d* */\%x* */\%o* */\%u* */\%U* *E678* |
Bram Moolenaar | c0197e2 | 2004-09-13 20:26:32 +0000 | [diff] [blame] | 1267 | |
| 1268 | \%d123 Matches the character specified with a decimal number. Must be |
| 1269 | followed by a non-digit. |
Bram Moolenaar | 2346a63 | 2021-06-13 19:02:49 +0200 | [diff] [blame] | 1270 | \%o40 Matches the character specified with an octal number up to 0o377. |
Bram Moolenaar | 82be484 | 2021-01-11 19:40:15 +0100 | [diff] [blame] | 1271 | Numbers below 0o40 must be followed by a non-octal digit or a |
| 1272 | non-digit. |
Bram Moolenaar | c0197e2 | 2004-09-13 20:26:32 +0000 | [diff] [blame] | 1273 | \%x2a Matches the character specified with up to two hexadecimal characters. |
| 1274 | \%u20AC Matches the character specified with up to four hexadecimal |
| 1275 | characters. |
| 1276 | \%U1234abcd Matches the character specified with up to eight hexadecimal |
Christian Brabandt | f2b1698 | 2025-03-29 09:08:58 +0100 | [diff] [blame] | 1277 | characters, up to 0x7fffffff (the maximum allowed value is INT_MAX |
| 1278 | |E1541|, but the maximum valid Unicode codepoint is U+10FFFF). |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1279 | |
| 1280 | ============================================================================== |
| 1281 | 7. Ignoring case in a pattern */ignorecase* |
| 1282 | |
| 1283 | If the 'ignorecase' option is on, the case of normal letters is ignored. |
| 1284 | 'smartcase' can be set to ignore case when the pattern contains lowercase |
| 1285 | letters only. |
| 1286 | */\c* */\C* |
| 1287 | When "\c" appears anywhere in the pattern, the whole pattern is handled like |
| 1288 | 'ignorecase' is on. The actual value of 'ignorecase' and 'smartcase' is |
| 1289 | ignored. "\C" does the opposite: Force matching case for the whole pattern. |
| 1290 | {only Vim supports \c and \C} |
| 1291 | Note that 'ignorecase', "\c" and "\C" are not used for the character classes. |
| 1292 | |
| 1293 | Examples: |
| 1294 | pattern 'ignorecase' 'smartcase' matches ~ |
| 1295 | foo off - foo |
| 1296 | foo on - foo Foo FOO |
| 1297 | Foo on off foo Foo FOO |
| 1298 | Foo on on Foo |
| 1299 | \cfoo - - foo Foo FOO |
| 1300 | foo\C - - foo |
| 1301 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1302 | Technical detail: *NL-used-for-Nul* |
| 1303 | <Nul> characters in the file are stored as <NL> in memory. In the display |
| 1304 | they are shown as "^@". The translation is done when reading and writing |
| 1305 | files. To match a <Nul> with a search pattern you can just enter CTRL-@ or |
| 1306 | "CTRL-V 000". This is probably just what you expect. Internally the |
| 1307 | character is replaced with a <NL> in the search pattern. What is unusual is |
| 1308 | that typing CTRL-V CTRL-J also inserts a <NL>, thus also searches for a <Nul> |
Bram Moolenaar | 25c9c68 | 2019-05-05 18:13:34 +0200 | [diff] [blame] | 1309 | in the file. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1310 | |
| 1311 | *CR-used-for-NL* |
| 1312 | When 'fileformat' is "mac", <NL> characters in the file are stored as <CR> |
Bram Moolenaar | e37d50a | 2008-08-06 17:06:04 +0000 | [diff] [blame] | 1313 | characters internally. In the text they are shown as "^J". Otherwise this |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1314 | works similar to the usage of <NL> for a <Nul>. |
| 1315 | |
| 1316 | When working with expression evaluation, a <NL> character in the pattern |
| 1317 | matches a <NL> in the string. The use of "\n" (backslash n) to match a <NL> |
| 1318 | doesn't work there, it only works to match text in the buffer. |
| 1319 | |
Bram Moolenaar | 207f009 | 2020-08-30 17:20:20 +0200 | [diff] [blame] | 1320 | *pattern-multi-byte* *pattern-multibyte* |
| 1321 | Patterns will also work with multibyte characters, mostly as you would |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1322 | expect. But invalid bytes may cause trouble, a pattern with an invalid byte |
| 1323 | will probably never match. |
| 1324 | |
| 1325 | ============================================================================== |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1326 | 8. Composing characters *patterns-composing* |
| 1327 | |
| 1328 | */\Z* |
Bram Moolenaar | 8df5acf | 2014-05-13 19:37:29 +0200 | [diff] [blame] | 1329 | When "\Z" appears anywhere in the pattern, all composing characters are |
| 1330 | ignored. Thus only the base characters need to match, the composing |
| 1331 | characters may be different and the number of composing characters may differ. |
| 1332 | Only relevant when 'encoding' is "utf-8". |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 1333 | Exception: If the pattern starts with one or more composing characters, these |
| 1334 | must match. |
Bram Moolenaar | 8df5acf | 2014-05-13 19:37:29 +0200 | [diff] [blame] | 1335 | */\%C* |
| 1336 | Use "\%C" to skip any composing characters. For example, the pattern "a" does |
| 1337 | not match in "càt" (where the a has the composing character 0x0300), but |
| 1338 | "a\%C" does. Note that this does not match "cát" (where the á is character |
| 1339 | 0xe1, it does not have a compositing character). It does match "cat" (where |
| 1340 | the a is just an a). |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1341 | |
Bram Moolenaar | 7ff7846 | 2020-07-10 22:00:53 +0200 | [diff] [blame] | 1342 | When a composing character appears at the start of the pattern or after an |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1343 | item that doesn't include the composing character, a match is found at any |
| 1344 | character that includes this composing character. |
| 1345 | |
| 1346 | When using a dot and a composing character, this works the same as the |
| 1347 | composing character by itself, except that it doesn't matter what comes before |
| 1348 | this. |
| 1349 | |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 1350 | The order of composing characters does not matter. Also, the text may have |
| 1351 | more composing characters than the pattern, it still matches. But all |
| 1352 | composing characters in the pattern must be found in the text. |
| 1353 | |
| 1354 | Suppose B is a base character and x and y are composing characters: |
| 1355 | pattern text match ~ |
| 1356 | Bxy Bxy yes (perfect match) |
| 1357 | Bxy Byx yes (order ignored) |
| 1358 | Bxy By no (x missing) |
| 1359 | Bxy Bx no (y missing) |
Bram Moolenaar | 203d04d | 2013-06-06 21:36:40 +0200 | [diff] [blame] | 1360 | Bx Bx yes (perfect match) |
Bram Moolenaar | 543b7ef | 2013-06-01 14:50:56 +0200 | [diff] [blame] | 1361 | Bx By no (x missing) |
| 1362 | Bx Bxy yes (extra y ignored) |
| 1363 | Bx Byx yes (extra y ignored) |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1364 | |
| 1365 | ============================================================================== |
| 1366 | 9. Compare with Perl patterns *perl-patterns* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1367 | |
| 1368 | Vim's regexes are most similar to Perl's, in terms of what you can do. The |
| 1369 | difference between them is mostly just notation; here's a summary of where |
| 1370 | they differ: |
| 1371 | |
| 1372 | Capability in Vimspeak in Perlspeak ~ |
| 1373 | ---------------------------------------------------------------- |
| 1374 | force case insensitivity \c (?i) |
| 1375 | force case sensitivity \C (?-i) |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1376 | backref-less grouping \%(atom\) (?:atom) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1377 | conservative quantifiers \{-n,m} *?, +?, ??, {}? |
| 1378 | 0-width match atom\@= (?=atom) |
| 1379 | 0-width non-match atom\@! (?!atom) |
| 1380 | 0-width preceding match atom\@<= (?<=atom) |
| 1381 | 0-width preceding non-match atom\@<! (?<!atom) |
| 1382 | match without retry atom\@> (?>atom) |
| 1383 | |
| 1384 | Vim and Perl handle newline characters inside a string a bit differently: |
| 1385 | |
| 1386 | In Perl, ^ and $ only match at the very beginning and end of the text, |
| 1387 | by default, but you can set the 'm' flag, which lets them match at |
| 1388 | embedded newlines as well. You can also set the 's' flag, which causes |
| 1389 | a . to match newlines as well. (Both these flags can be changed inside |
| 1390 | a pattern using the same syntax used for the i flag above, BTW.) |
| 1391 | |
| 1392 | On the other hand, Vim's ^ and $ always match at embedded newlines, and |
| 1393 | you get two separate atoms, \%^ and \%$, which only match at the very |
| 1394 | start and end of the text, respectively. Vim solves the second problem |
| 1395 | by giving you the \_ "modifier": put it in front of a . or a character |
| 1396 | class, and they will match newlines as well. |
| 1397 | |
| 1398 | Finally, these constructs are unique to Perl: |
| 1399 | - execution of arbitrary code in the regex: (?{perl code}) |
| 1400 | - conditional expressions: (?(condition)true-expr|false-expr) |
| 1401 | |
| 1402 | ...and these are unique to Vim: |
| 1403 | - changing the magic-ness of a pattern: \v \V \m \M |
| 1404 | (very useful for avoiding backslashitis) |
| 1405 | - sequence of optionally matching atoms: \%[atoms] |
| 1406 | - \& (which is to \| what "and" is to "or"; it forces several branches |
| 1407 | to match at one spot) |
| 1408 | - matching lines/columns by number: \%5l \%5c \%5v |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1409 | - setting the start and end of the match: \zs \ze |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1410 | |
| 1411 | ============================================================================== |
Bram Moolenaar | 362e1a3 | 2006-03-06 23:29:24 +0000 | [diff] [blame] | 1412 | 10. Highlighting matches *match-highlight* |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1413 | |
Christian Brabandt | fe1e2b5 | 2024-04-26 18:42:59 +0200 | [diff] [blame] | 1414 | *syntax-vs-match* |
| 1415 | Note that the match highlight mechanism is independent |
| 1416 | of |syntax-highlighting|, which is (usually) a buffer-local |
| 1417 | highlighting, while matching is window-local, both methods |
| 1418 | can be freely mixed. Match highlighting functions give you |
| 1419 | a bit more flexibility in when and how to apply, but are |
| 1420 | typically only used for temporary highlighting, without strict |
| 1421 | rules. Both methods can be used to conceal text. |
| 1422 | |
| 1423 | Thus the matching functions like |matchadd()| won't consider |
Philip H | 9525f62 | 2024-04-26 19:57:20 +0200 | [diff] [blame] | 1424 | syntax rules and functions like |synconcealed()| and the |
Christian Brabandt | fe1e2b5 | 2024-04-26 18:42:59 +0200 | [diff] [blame] | 1425 | other way around. |
| 1426 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1427 | *:mat* *:match* |
| 1428 | :mat[ch] {group} /{pattern}/ |
| 1429 | Define a pattern to highlight in the current window. It will |
| 1430 | be highlighted with {group}. Example: > |
| 1431 | :highlight MyGroup ctermbg=green guibg=green |
| 1432 | :match MyGroup /TODO/ |
| 1433 | < Instead of // any character can be used to mark the start and |
| 1434 | end of the {pattern}. Watch out for using special characters, |
| 1435 | such as '"' and '|'. |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1436 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1437 | {group} must exist at the moment this command is executed. |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1438 | |
| 1439 | The {group} highlighting still applies when a character is |
Bram Moolenaar | 6ee1016 | 2007-07-26 20:58:42 +0000 | [diff] [blame] | 1440 | to be highlighted for 'hlsearch', as the highlighting for |
| 1441 | matches is given higher priority than that of 'hlsearch'. |
| 1442 | Syntax highlighting (see 'syntax') is also overruled by |
| 1443 | matches. |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1444 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1445 | Note that highlighting the last used search pattern with |
| 1446 | 'hlsearch' is used in all windows, while the pattern defined |
| 1447 | with ":match" only exists in the current window. It is kept |
| 1448 | when switching to another buffer. |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1449 | |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1450 | 'ignorecase' does not apply, use |/\c| in the pattern to |
| 1451 | ignore case. Otherwise case is not ignored. |
| 1452 | |
Bram Moolenaar | 3577c6f | 2008-06-24 21:16:56 +0000 | [diff] [blame] | 1453 | 'redrawtime' defines the maximum time searched for pattern |
| 1454 | matches. |
| 1455 | |
Bram Moolenaar | c81e5e7 | 2007-05-05 18:24:42 +0000 | [diff] [blame] | 1456 | When matching end-of-line and Vim redraws only part of the |
| 1457 | display you may get unexpected results. That is because Vim |
| 1458 | looks for a match in the line where redrawing starts. |
| 1459 | |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1460 | Also see |matcharg()| and |getmatches()|. The former returns |
Bram Moolenaar | 6ee1016 | 2007-07-26 20:58:42 +0000 | [diff] [blame] | 1461 | the highlight group and pattern of a previous |:match| |
| 1462 | command. The latter returns a list with highlight groups and |
| 1463 | patterns defined by both |matchadd()| and |:match|. |
| 1464 | |
| 1465 | Highlighting matches using |:match| are limited to three |
Bram Moolenaar | 822ff86 | 2014-06-12 21:46:14 +0200 | [diff] [blame] | 1466 | matches (aside from |:match|, |:2match| and |:3match| are |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1467 | available). |matchadd()| does not have this limitation and in |
Bram Moolenaar | 6ee1016 | 2007-07-26 20:58:42 +0000 | [diff] [blame] | 1468 | addition makes it possible to prioritize matches. |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1469 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1470 | Another example, which highlights all characters in virtual |
| 1471 | column 72 and more: > |
| 1472 | :highlight rightMargin term=bold ctermfg=blue guifg=blue |
| 1473 | :match rightMargin /.\%>72v/ |
| 1474 | < To highlight all character that are in virtual column 7: > |
| 1475 | :highlight col8 ctermbg=grey guibg=grey |
| 1476 | :match col8 /\%<8v.\%>7v/ |
| 1477 | < Note the use of two items to also match a character that |
| 1478 | occupies more than one virtual column, such as a TAB. |
| 1479 | |
| 1480 | :mat[ch] |
| 1481 | :mat[ch] none |
| 1482 | Clear a previously defined match pattern. |
| 1483 | |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1484 | |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1485 | :2mat[ch] {group} /{pattern}/ *:2match* |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1486 | :2mat[ch] |
| 1487 | :2mat[ch] none |
Bram Moolenaar | 910f66f | 2006-04-05 20:41:53 +0000 | [diff] [blame] | 1488 | :3mat[ch] {group} /{pattern}/ *:3match* |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1489 | :3mat[ch] |
| 1490 | :3mat[ch] none |
| 1491 | Just like |:match| above, but set a separate match. Thus |
| 1492 | there can be three matches active at the same time. The match |
| 1493 | with the lowest number has priority if several match at the |
Christian Brabandt | d3e277f | 2023-10-21 11:06:50 +0200 | [diff] [blame] | 1494 | same position. It uses the match id 3. |
Ernie Rael | a5a1534 | 2023-10-23 19:08:38 +0200 | [diff] [blame] | 1495 | The ":3match" command is used by (Vim < 9.0.2054) |matchparen| |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1496 | plugin. You are suggested to use ":match" for manual matching |
Christian Brabandt | d3e277f | 2023-10-21 11:06:50 +0200 | [diff] [blame] | 1497 | and ":2match" for another plugin or even better make use of |
| 1498 | the more flexible |matchadd()| (and similar) functions instead. |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 1499 | |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1500 | ============================================================================== |
Bram Moolenaar | 1588bc8 | 2022-03-08 21:35:07 +0000 | [diff] [blame] | 1501 | 11. Fuzzy matching *fuzzy-matching* |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1502 | |
| 1503 | Fuzzy matching refers to matching strings using a non-exact search string. |
| 1504 | Fuzzy matching will match a string, if all the characters in the search string |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1505 | are present anywhere in the string in the same order. Case is ignored. In a |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1506 | matched string, other characters can be present between two consecutive |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1507 | characters in the search string. If the search string has multiple words, then |
| 1508 | each word is matched separately. So the words in the search string can be |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1509 | present in any order in a string. |
| 1510 | |
| 1511 | Fuzzy matching assigns a score for each matched string based on the following |
| 1512 | criteria: |
| 1513 | - The number of sequentially matching characters. |
| 1514 | - The number of characters (distance) between two consecutive matching |
| 1515 | characters. |
| 1516 | - Matches at the beginning of a word |
Bram Moolenaar | 53f7fcc | 2021-07-28 20:10:16 +0200 | [diff] [blame] | 1517 | - Matches at a camel case character (e.g. Case in CamelCase) |
| 1518 | - Matches after a path separator or a hyphen. |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1519 | - The number of unmatched characters in a string. |
glepnir | 5a04999 | 2024-12-26 15:38:39 +0100 | [diff] [blame] | 1520 | - A full/exact match is preferred. |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1521 | The matching string with the highest score is returned first. |
| 1522 | |
| 1523 | For example, when you search for the "get pat" string using fuzzy matching, it |
| 1524 | will match the strings "GetPattern", "PatternGet", "getPattern", "patGetter", |
| 1525 | "getSomePattern", "MatchpatternGet" etc. |
| 1526 | |
| 1527 | The functions |matchfuzzy()| and |matchfuzzypos()| can be used to fuzzy search |
h-east | 624bb83 | 2024-11-09 18:37:32 +0100 | [diff] [blame] | 1528 | a string in a List of strings. The matchfuzzy() function returns a List of |
| 1529 | matching strings. The matchfuzzypos() functions returns the List of matches, |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1530 | the matching positions and the fuzzy match scores. |
| 1531 | |
| 1532 | The "f" flag of `:vimgrep` enables fuzzy matching. |
| 1533 | |
glepnir | a218cc6 | 2024-06-03 19:32:39 +0200 | [diff] [blame] | 1534 | To enable fuzzy matching for |ins-completion|, add the "fuzzy" value to the |
| 1535 | 'completeopt' option. |
Bram Moolenaar | 3ec3217 | 2021-05-16 12:39:47 +0200 | [diff] [blame] | 1536 | |
Bram Moolenaar | 91f84f6 | 2018-07-29 15:07:52 +0200 | [diff] [blame] | 1537 | vim:tw=78:ts=8:noet:ft=help:norl: |