Mercurial > vim
annotate runtime/doc/tips.txt @ 16323:b8fcb5017058
Added tag v8.1.1166 for changeset eb2fd769175f9681790192ceea2d4a35efc43948
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 13 Apr 2019 20:45:05 +0200 |
parents | 2f7e67dd088c |
children | af69c9335223 |
rev | line source |
---|---|
13963 | 1 *tips.txt* For Vim version 8.1. Last change: 2009 Nov 07 |
7 | 2 |
3 | |
4 VIM REFERENCE MANUAL by Bram Moolenaar | |
5 | |
6 | |
7 Tips and ideas for using Vim *tips* | |
8 | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
9 These are just a few that we thought would be helpful for many users. |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
10 You can find many more tips on the wiki. The URL can be found on |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
11 http://www.vim.org |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
12 |
7 | 13 Don't forget to browse the user manual, it also contains lots of useful tips |
14 |usr_toc.txt|. | |
15 | |
16 Editing C programs |C-editing| | |
17 Finding where identifiers are used |ident-search| | |
18 Switching screens in an xterm |xterm-screens| | |
19 Scrolling in Insert mode |scroll-insert| | |
20 Smooth scrolling |scroll-smooth| | |
21 Correcting common typing mistakes |type-mistakes| | |
22 Counting words, lines, etc. |count-items| | |
23 Restoring the cursor position |restore-position| | |
24 Renaming files |rename-files| | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
25 Change a name in multiple files |change-name| |
7 | 26 Speeding up external commands |speed-up| |
27 Useful mappings |useful-mappings| | |
28 Compressing the help files |gzip-helpfile| | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
29 Executing shell commands in a window |shell-window| |
7 | 30 Hex editing |hex-editing| |
31 Using <> notation in autocommands |autocmd-<>| | |
667 | 32 Highlighting matching parens |match-parens| |
7 | 33 |
34 ============================================================================== | |
35 Editing C programs *C-editing* | |
36 | |
37 There are quite a few features in Vim to help you edit C program files. Here | |
38 is an overview with tags to jump to: | |
39 | |
40 |usr_29.txt| Moving through programs chapter in the user manual. | |
41 |usr_30.txt| Editing programs chapter in the user manual. | |
42 |C-indenting| Automatically set the indent of a line while typing | |
43 text. | |
44 |=| Re-indent a few lines. | |
45 |format-comments| Format comments. | |
46 | |
47 |:checkpath| Show all recursively included files. | |
48 |[i| Search for identifier under cursor in current and | |
49 included files. | |
50 |[_CTRL-I| Jump to match for "[i" | |
51 |[I| List all lines in current and included files where | |
52 identifier under the cursor matches. | |
53 |[d| Search for define under cursor in current and included | |
54 files. | |
55 | |
56 |CTRL-]| Jump to tag under cursor (e.g., definition of a | |
57 function). | |
58 |CTRL-T| Jump back to before a CTRL-] command. | |
59 |:tselect| Select one tag out of a list of matching tags. | |
60 | |
61 |gd| Go to Declaration of local variable under cursor. | |
62 |gD| Go to Declaration of global variable under cursor. | |
63 | |
64 |gf| Go to file name under the cursor. | |
65 | |
66 |%| Go to matching (), {}, [], /* */, #if, #else, #endif. | |
67 |[/| Go to previous start of comment. | |
68 |]/| Go to next end of comment. | |
69 |[#| Go back to unclosed #if, #ifdef, or #else. | |
70 |]#| Go forward to unclosed #else or #endif. | |
71 |[(| Go back to unclosed '(' | |
72 |])| Go forward to unclosed ')' | |
73 |[{| Go back to unclosed '{' | |
74 |]}| Go forward to unclosed '}' | |
75 | |
76 |v_ab| Select "a block" from "[(" to "])", including braces | |
77 |v_ib| Select "inner block" from "[(" to "])" | |
78 |v_aB| Select "a block" from "[{" to "]}", including brackets | |
79 |v_iB| Select "inner block" from "[{" to "]}" | |
80 | |
81 ============================================================================== | |
82 Finding where identifiers are used *ident-search* | |
83 | |
84 You probably already know that |tags| can be used to jump to the place where a | |
85 function or variable is defined. But sometimes you wish you could jump to all | |
86 the places where a function or variable is being used. This is possible in | |
87 two ways: | |
88 1. Using the |:grep| command. This should work on most Unix systems, | |
89 but can be slow (it reads all files) and only searches in one directory. | |
90 2. Using ID utils. This is fast and works in multiple directories. It uses a | |
91 database to store locations. You will need some additional programs for | |
92 this to work. And you need to keep the database up to date. | |
93 | |
94 Using the GNU id-tools: | |
95 | |
96 What you need: | |
97 - The GNU id-tools installed (mkid is needed to create ID and lid is needed to | |
98 use the macros). | |
99 - An identifier database file called "ID" in the current directory. You can | |
100 create it with the shell command "mkid file1 file2 ..". | |
101 | |
102 Put this in your .vimrc: > | |
103 map _u :call ID_search()<Bar>execute "/\\<" . g:word . "\\>"<CR> | |
104 map _n :n<Bar>execute "/\\<" . g:word . "\\>"<CR> | |
105 | |
106 function! ID_search() | |
107 let g:word = expand("<cword>") | |
108 let x = system("lid --key=none ". g:word) | |
109 let x = substitute(x, "\n", " ", "g") | |
110 execute "next " . x | |
111 endfun | |
112 | |
113 To use it, place the cursor on a word, type "_u" and vim will load the file | |
114 that contains the word. Search for the next occurrence of the word in the | |
115 same file with "n". Go to the next file with "_n". | |
116 | |
117 This has been tested with id-utils-3.2 (which is the name of the id-tools | |
118 archive file on your closest gnu-ftp-mirror). | |
119 | |
120 [the idea for this comes from Andreas Kutschera] | |
121 | |
122 ============================================================================== | |
123 Switching screens in an xterm *xterm-screens* *xterm-save-screen* | |
124 | |
125 (From comp.editors, by Juergen Weigert, in reply to a question) | |
126 | |
127 :> Another question is that after exiting vim, the screen is left as it | |
128 :> was, i.e. the contents of the file I was viewing (editing) was left on | |
129 :> the screen. The output from my previous like "ls" were lost, | |
130 :> ie. no longer in the scrolling buffer. I know that there is a way to | |
131 :> restore the screen after exiting vim or other vi like editors, | |
132 :> I just don't know how. Helps are appreciated. Thanks. | |
133 : | |
134 :I imagine someone else can answer this. I assume though that vim and vi do | |
135 :the same thing as each other for a given xterm setup. | |
136 | |
137 They not necessarily do the same thing, as this may be a termcap vs. | |
236 | 138 terminfo problem. You should be aware that there are two databases for |
7 | 139 describing attributes of a particular type of terminal: termcap and |
236 | 140 terminfo. This can cause differences when the entries differ AND when of |
7 | 141 the programs in question one uses terminfo and the other uses termcap |
142 (also see |+terminfo|). | |
143 | |
144 In your particular problem, you are looking for the control sequences | |
236 | 145 ^[[?47h and ^[[?47l. These switch between xterms alternate and main screen |
146 buffer. As a quick workaround a command sequence like > | |
7 | 147 echo -n "^[[?47h"; vim ... ; echo -n "^[[?47l" |
236 | 148 may do what you want. (My notation ^[ means the ESC character, further down |
7 | 149 you'll see that the databases use \E instead). |
150 | |
151 On startup, vim echoes the value of the termcap variable ti (terminfo: | |
236 | 152 smcup) to the terminal. When exiting, it echoes te (terminfo: rmcup). Thus |
7 | 153 these two variables are the correct place where the above mentioned control |
154 sequences should go. | |
155 | |
156 Compare your xterm termcap entry (found in /etc/termcap) with your xterm | |
1121 | 157 terminfo entry (retrieved with "infocmp -C xterm"). Both should contain |
158 entries similar to: > | |
7 | 159 :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h: |
160 | |
161 PS: If you find any difference, someone (your sysadmin?) should better check | |
162 the complete termcap and terminfo database for consistency. | |
163 | |
164 NOTE 1: If you recompile Vim with FEAT_XTERM_SAVE defined in feature.h, the | |
165 builtin xterm will include the mentioned "te" and "ti" entries. | |
166 | |
167 NOTE 2: If you want to disable the screen switching, and you don't want to | |
168 change your termcap, you can add these lines to your .vimrc: > | |
169 :set t_ti= t_te= | |
170 | |
171 ============================================================================== | |
172 Scrolling in Insert mode *scroll-insert* | |
173 | |
174 If you are in insert mode and you want to see something that is just off the | |
175 screen, you can use CTRL-X CTRL-E and CTRL-X CTRL-Y to scroll the screen. | |
176 |i_CTRL-X_CTRL-E| | |
177 | |
178 To make this easier, you could use these mappings: > | |
179 :inoremap <C-E> <C-X><C-E> | |
180 :inoremap <C-Y> <C-X><C-Y> | |
181 (Type this literally, make sure the '<' flag is not in 'cpoptions'). | |
182 You then lose the ability to copy text from the line above/below the cursor | |
183 |i_CTRL-E|. | |
184 | |
185 Also consider setting 'scrolloff' to a larger value, so that you can always see | |
186 some context around the cursor. If 'scrolloff' is bigger than half the window | |
187 height, the cursor will always be in the middle and the text is scrolled when | |
188 the cursor is moved up/down. | |
189 | |
190 ============================================================================== | |
191 Smooth scrolling *scroll-smooth* | |
192 | |
193 If you like the scrolling to go a bit smoother, you can use these mappings: > | |
194 :map <C-U> <C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y><C-Y> | |
195 :map <C-D> <C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E><C-E> | |
196 | |
197 (Type this literally, make sure the '<' flag is not in 'cpoptions'). | |
198 | |
199 ============================================================================== | |
200 Correcting common typing mistakes *type-mistakes* | |
201 | |
202 When there are a few words that you keep on typing in the wrong way, make | |
203 abbreviations that correct them. For example: > | |
204 :ab teh the | |
205 :ab fro for | |
206 | |
207 ============================================================================== | |
208 Counting words, lines, etc. *count-items* | |
209 | |
170 | 210 To count how often any pattern occurs in the current buffer use the substitute |
211 command and add the 'n' flag to avoid the substitution. The reported number | |
212 of substitutions is the number of items. Examples: > | |
7 | 213 |
170 | 214 :%s/./&/gn characters |
215 :%s/\i\+/&/gn words | |
216 :%s/^//n lines | |
217 :%s/the/&/gn "the" anywhere | |
218 :%s/\<the\>/&/gn "the" as a word | |
7 | 219 |
220 You might want to reset 'hlsearch' or do ":nohlsearch". | |
170 | 221 Add the 'e' flag if you don't want an error when there are no matches. |
7 | 222 |
170 | 223 An alternative is using |v_g_CTRL-G| in Visual mode. |
224 | |
225 If you want to find matches in multiple files use |:vimgrep|. | |
7 | 226 |
227 *count-bytes* | |
228 If you want to count bytes, you can use this: | |
229 | |
230 Visually select the characters (block is also possible) | |
231 Use "y" to yank the characters | |
232 Use the strlen() function: > | |
233 :echo strlen(@") | |
234 A line break is counted for one byte. | |
235 | |
236 ============================================================================== | |
237 Restoring the cursor position *restore-position* | |
238 | |
239 Sometimes you want to write a mapping that makes a change somewhere in the | |
240 file and restores the cursor position, without scrolling the text. For | |
241 example, to change the date mark in a file: > | |
242 :map <F2> msHmtgg/Last [cC]hange:\s*/e+1<CR>"_D"=strftime("%Y %b %d")<CR>p'tzt`s | |
243 | |
244 Breaking up saving the position: | |
245 ms store cursor position in the 's' mark | |
246 H go to the first line in the window | |
247 mt store this position in the 't' mark | |
248 | |
249 Breaking up restoring the position: | |
250 't go to the line previously at the top of the window | |
251 zt scroll to move this line to the top of the window | |
252 `s jump to the original position of the cursor | |
253 | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
254 For something more advanced see |winsaveview()| and |winrestview()|. |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
255 |
7 | 256 ============================================================================== |
257 Renaming files *rename-files* | |
258 | |
259 Say I have a directory with the following files in them (directory picked at | |
260 random :-): | |
261 | |
262 buffer.c | |
263 charset.c | |
264 digraph.c | |
265 ... | |
266 | |
267 and I want to rename *.c *.bla. I'd do it like this: > | |
268 | |
269 $ vim | |
246 | 270 :r !ls *.c |
7 | 271 :%s/\(.*\).c/mv & \1.bla |
272 :w !sh | |
273 :q! | |
274 | |
275 ============================================================================== | |
2033
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
276 Change a name in multiple files *change-name* |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
277 |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
278 Example for using a script file to change a name in several files: |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
279 |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
280 Create a file "subs.vim" containing substitute commands and a :update |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
281 command: > |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
282 :%s/Jones/Smith/g |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
283 :%s/Allen/Peter/g |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
284 :update |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
285 < |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
286 Execute Vim on all files you want to change, and source the script for |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
287 each argument: > |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
288 |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
289 vim *.let |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
290 argdo source subs.vim |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
291 |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
292 See |:argdo|. |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
293 |
de5a43c5eedc
Update documentation files.
Bram Moolenaar <bram@zimbu.org>
parents:
1702
diff
changeset
|
294 ============================================================================== |
7 | 295 Speeding up external commands *speed-up* |
296 | |
297 In some situations, execution of an external command can be very slow. This | |
298 can also slow down wildcard expansion on Unix. Here are a few suggestions to | |
299 increase the speed. | |
300 | |
301 If your .cshrc (or other file, depending on the shell used) is very long, you | |
302 should separate it into a section for interactive use and a section for | |
303 non-interactive use (often called secondary shells). When you execute a | |
304 command from Vim like ":!ls", you do not need the interactive things (for | |
305 example, setting the prompt). Put the stuff that is not needed after these | |
306 lines: > | |
307 | |
308 if ($?prompt == 0) then | |
309 exit 0 | |
310 endif | |
311 | |
312 Another way is to include the "-f" flag in the 'shell' option, e.g.: > | |
313 | |
314 :set shell=csh\ -f | |
315 | |
316 (the backslash is needed to include the space in the option). | |
317 This will make csh completely skip the use of the .cshrc file. This may cause | |
318 some things to stop working though. | |
319 | |
320 ============================================================================== | |
321 Useful mappings *useful-mappings* | |
322 | |
323 Here are a few mappings that some people like to use. | |
324 | |
325 *map-backtick* > | |
326 :map ' ` | |
327 Make the single quote work like a backtick. Puts the cursor on the column of | |
328 a mark, instead of going to the first non-blank character in the line. | |
329 | |
330 *emacs-keys* | |
331 For Emacs-style editing on the command-line: > | |
332 " start of line | |
333 :cnoremap <C-A> <Home> | |
334 " back one character | |
335 :cnoremap <C-B> <Left> | |
336 " delete character under cursor | |
337 :cnoremap <C-D> <Del> | |
338 " end of line | |
339 :cnoremap <C-E> <End> | |
340 " forward one character | |
341 :cnoremap <C-F> <Right> | |
342 " recall newer command-line | |
343 :cnoremap <C-N> <Down> | |
344 " recall previous (older) command-line | |
345 :cnoremap <C-P> <Up> | |
346 " back one word | |
347 :cnoremap <Esc><C-B> <S-Left> | |
348 " forward one word | |
349 :cnoremap <Esc><C-F> <S-Right> | |
350 | |
351 NOTE: This requires that the '<' flag is excluded from 'cpoptions'. |<>| | |
352 | |
353 *format-bullet-list* | |
354 This mapping will format any bullet list. It requires that there is an empty | |
355 line above and below each list entry. The expression commands are used to | |
356 be able to give comments to the parts of the mapping. > | |
357 | |
358 :let m = ":map _f :set ai<CR>" " need 'autoindent' set | |
359 :let m = m . "{O<Esc>" " add empty line above item | |
360 :let m = m . "}{)^W" " move to text after bullet | |
361 :let m = m . "i <CR> <Esc>" " add space for indent | |
362 :let m = m . "gq}" " format text after the bullet | |
363 :let m = m . "{dd" " remove the empty line | |
364 :let m = m . "5lDJ" " put text after bullet | |
365 :execute m |" define the mapping | |
366 | |
367 (<> notation |<>|. Note that this is all typed literally. ^W is "^" "W", not | |
368 CTRL-W. You can copy/paste this into Vim if '<' is not included in | |
236 | 369 'cpoptions'.) |
7 | 370 |
371 Note that the last comment starts with |", because the ":execute" command | |
372 doesn't accept a comment directly. | |
373 | |
374 You also need to set 'textwidth' to a non-zero value, e.g., > | |
375 :set tw=70 | |
376 | |
377 A mapping that does about the same, but takes the indent for the list from the | |
378 first line (Note: this mapping is a single long line with a lot of spaces): > | |
379 :map _f :set ai<CR>}{a <Esc>WWmmkD`mi<CR><Esc>kkddpJgq}'mJO<Esc>j | |
380 < | |
381 *collapse* | |
382 These two mappings reduce a sequence of empty (;b) or blank (;n) lines into a | |
383 single line > | |
384 :map ;b GoZ<Esc>:g/^$/.,/./-j<CR>Gdd | |
385 :map ;n GoZ<Esc>:g/^[ <Tab>]*$/.,/[^ <Tab>]/-j<CR>Gdd | |
386 | |
387 ============================================================================== | |
388 Compressing the help files *gzip-helpfile* | |
389 | |
390 For those of you who are really short on disk space, you can compress the help | |
391 files and still be able to view them with Vim. This makes accessing the help | |
392 files a bit slower and requires the "gzip" program. | |
393 | |
394 (1) Compress all the help files: "gzip doc/*.txt". | |
395 | |
396 (2) Edit "doc/tags" and change the ".txt" to ".txt.gz": > | |
397 :%s=\(\t.*\.txt\)\t=\1.gz\t= | |
398 | |
399 (3) Add this line to your vimrc: > | |
400 set helpfile={dirname}/help.txt.gz | |
401 | |
402 Where {dirname} is the directory where the help files are. The |gzip| plugin | |
403 will take care of decompressing the files. | |
404 You must make sure that $VIMRUNTIME is set to where the other Vim files are, | |
405 when they are not in the same location as the compressed "doc" directory. See | |
406 |$VIMRUNTIME|. | |
407 | |
408 ============================================================================== | |
409 Executing shell commands in a window *shell-window* | |
410 | |
14249
4543777545a3
Updated runtime and language files.
Christian Brabandt <cb@256bit.org>
parents:
13963
diff
changeset
|
411 See |terminal|. |
4543777545a3
Updated runtime and language files.
Christian Brabandt <cb@256bit.org>
parents:
13963
diff
changeset
|
412 |
4543777545a3
Updated runtime and language files.
Christian Brabandt <cb@256bit.org>
parents:
13963
diff
changeset
|
413 Another solution is splitting your terminal screen or display window with the |
7 | 414 "splitvt" program. You can probably find it on some ftp server. The person |
415 that knows more about this is Sam Lantinga <slouken@cs.ucdavis.edu>. | |
14249
4543777545a3
Updated runtime and language files.
Christian Brabandt <cb@256bit.org>
parents:
13963
diff
changeset
|
416 |
4543777545a3
Updated runtime and language files.
Christian Brabandt <cb@256bit.org>
parents:
13963
diff
changeset
|
417 Another alternative is the "window" command, found on BSD Unix systems, which |
7 | 418 supports multiple overlapped windows. Or the "screen" program, found at |
419 www.uni-erlangen.de, which supports a stack of windows. | |
420 | |
421 ============================================================================== | |
422 Hex editing *hex-editing* *using-xxd* | |
423 | |
424 See section |23.4| of the user manual. | |
425 | |
426 If one has a particular extension that one uses for binary files (such as exe, | |
427 bin, etc), you may find it helpful to automate the process with the following | |
428 bit of autocmds for your <.vimrc>. Change that "*.bin" to whatever | |
429 comma-separated list of extension(s) you find yourself wanting to edit: > | |
430 | |
431 " vim -b : edit binary using xxd-format! | |
432 augroup Binary | |
433 au! | |
434 au BufReadPre *.bin let &bin=1 | |
435 au BufReadPost *.bin if &bin | %!xxd | |
436 au BufReadPost *.bin set ft=xxd | endif | |
437 au BufWritePre *.bin if &bin | %!xxd -r | |
438 au BufWritePre *.bin endif | |
439 au BufWritePost *.bin if &bin | %!xxd | |
440 au BufWritePost *.bin set nomod | endif | |
441 augroup END | |
442 | |
443 ============================================================================== | |
444 Using <> notation in autocommands *autocmd-<>* | |
445 | |
446 The <> notation is not recognized in the argument of an :autocmd. To avoid | |
447 having to use special characters, you could use a self-destroying mapping to | |
448 get the <> notation and then call the mapping from the autocmd. Example: | |
449 | |
450 *map-self-destroy* > | |
451 " This is for automatically adding the name of the file to the menu list. | |
452 " It uses a self-destroying mapping! | |
453 " 1. use a line in the buffer to convert the 'dots' in the file name to \. | |
454 " 2. store that in register '"' | |
455 " 3. add that name to the Buffers menu list | |
456 " WARNING: this does have some side effects, like overwriting the | |
457 " current register contents and removing any mapping for the "i" command. | |
458 " | |
459 autocmd BufNewFile,BufReadPre * nmap i :nunmap i<CR>O<C-R>%<Esc>:.g/\./s/\./\\./g<CR>0"9y$u:menu Buffers.<C-R>9 :buffer <C-R>%<C-V><CR><CR> | |
460 autocmd BufNewFile,BufReadPre * normal i | |
461 | |
462 Another method, perhaps better, is to use the ":execute" command. In the | |
463 string you can use the <> notation by preceding it with a backslash. Don't | |
464 forget to double the number of existing backslashes and put a backslash before | |
465 '"'. | |
466 > | |
467 autocmd BufNewFile,BufReadPre * exe "normal O\<C-R>%\<Esc>:.g/\\./s/\\./\\\\./g\<CR>0\"9y$u:menu Buffers.\<C-R>9 :buffer \<C-R>%\<C-V>\<CR>\<CR>" | |
468 | |
469 For a real buffer menu, user functions should be used (see |:function|), but | |
470 then the <> notation isn't used, which defeats using it as an example here. | |
471 | |
667 | 472 ============================================================================== |
473 Highlighting matching parens *match-parens* | |
474 | |
475 This example shows the use of a few advanced tricks: | |
476 - using the |CursorMoved| autocommand event | |
477 - using |searchpairpos()| to find a matching paren | |
674 | 478 - using |synID()| to detect whether the cursor is in a string or comment |
667 | 479 - using |:match| to highlight something |
480 - using a |pattern| to match a specific position in the file. | |
481 | |
482 This should be put in a Vim script file, since it uses script-local variables. | |
674 | 483 It skips matches in strings or comments, unless the cursor started in string |
484 or comment. This requires syntax highlighting. | |
699 | 485 |
486 A slightly more advanced version is used in the |matchparen| plugin. | |
667 | 487 > |
488 let s:paren_hl_on = 0 | |
489 function s:Highlight_Matching_Paren() | |
490 if s:paren_hl_on | |
491 match none | |
492 let s:paren_hl_on = 0 | |
493 endif | |
494 | |
495 let c_lnum = line('.') | |
496 let c_col = col('.') | |
497 | |
498 let c = getline(c_lnum)[c_col - 1] | |
499 let plist = split(&matchpairs, ':\|,') | |
500 let i = index(plist, c) | |
501 if i < 0 | |
502 return | |
503 endif | |
504 if i % 2 == 0 | |
505 let s_flags = 'nW' | |
506 let c2 = plist[i + 1] | |
507 else | |
508 let s_flags = 'nbW' | |
509 let c2 = c | |
510 let c = plist[i - 1] | |
511 endif | |
512 if c == '[' | |
513 let c = '\[' | |
514 let c2 = '\]' | |
515 endif | |
674 | 516 let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' . |
856 | 517 \ '=~? "string\\|comment"' |
518 execute 'if' s_skip '| let s_skip = 0 | endif' | |
667 | 519 |
674 | 520 let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip) |
667 | 521 |
522 if m_lnum > 0 && m_lnum >= line('w0') && m_lnum <= line('w$') | |
523 exe 'match Search /\(\%' . c_lnum . 'l\%' . c_col . | |
524 \ 'c\)\|\(\%' . m_lnum . 'l\%' . m_col . 'c\)/' | |
525 let s:paren_hl_on = 1 | |
526 endif | |
527 endfunction | |
528 | |
671 | 529 autocmd CursorMoved,CursorMovedI * call s:Highlight_Matching_Paren() |
667 | 530 autocmd InsertEnter * match none |
531 < | |
532 | |
14421 | 533 vim:tw=78:ts=8:noet:ft=help:norl: |