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