Bram Moolenaar | 9805653 | 2019-12-12 14:18:35 +0100 | [diff] [blame] | 1 | *tips.txt* For Vim version 8.2. Last change: 2009 Nov 07 |
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 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 9 | These are just a few that we thought would be helpful for many users. |
| 10 | You can find many more tips on the wiki. The URL can be found on |
| 11 | http://www.vim.org |
| 12 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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| |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 25 | Change a name in multiple files |change-name| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 26 | Speeding up external commands |speed-up| |
| 27 | Useful mappings |useful-mappings| |
| 28 | Compressing the help files |gzip-helpfile| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 29 | Executing shell commands in a window |shell-window| |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 30 | Hex editing |hex-editing| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 31 | Using <> notation in autocommands |autocmd-<>| |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 32 | Highlighting matching parens |match-parens| |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 138 | terminfo problem. You should be aware that there are two databases for |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 139 | describing attributes of a particular type of terminal: termcap and |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 140 | terminfo. This can cause differences when the entries differ AND when of |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 145 | ^[[?47h and ^[[?47l. These switch between xterms alternate and main screen |
| 146 | buffer. As a quick workaround a command sequence like > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 147 | echo -n "^[[?47h"; vim ... ; echo -n "^[[?47l" |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 148 | 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] | 149 | you'll see that the databases use \E instead). |
| 150 | |
| 151 | On startup, vim echoes the value of the termcap variable ti (terminfo: |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 152 | smcup) to the terminal. When exiting, it echoes te (terminfo: rmcup). Thus |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 9964e46 | 2007-05-05 17:54:07 +0000 | [diff] [blame] | 157 | terminfo entry (retrieved with "infocmp -C xterm"). Both should contain |
| 158 | entries similar to: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 05159a0 | 2005-02-26 23:04:13 +0000 | [diff] [blame] | 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: > |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 213 | |
Bram Moolenaar | 05159a0 | 2005-02-26 23:04:13 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 219 | |
| 220 | You might want to reset 'hlsearch' or do ":nohlsearch". |
Bram Moolenaar | 05159a0 | 2005-02-26 23:04:13 +0000 | [diff] [blame] | 221 | 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] | 222 | |
Bram Moolenaar | 05159a0 | 2005-02-26 23:04:13 +0000 | [diff] [blame] | 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|. |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 254 | For something more advanced see |winsaveview()| and |winrestview()|. |
| 255 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | fe5cafe | 2005-04-19 21:37:59 +0000 | [diff] [blame] | 270 | :r !ls *.c |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 271 | :%s/\(.*\).c/mv & \1.bla |
| 272 | :w !sh |
| 273 | :q! |
| 274 | |
| 275 | ============================================================================== |
Bram Moolenaar | 8f3f58f | 2010-01-06 20:52:26 +0100 | [diff] [blame] | 276 | Change a name in multiple files *change-name* |
| 277 | |
| 278 | Example for using a script file to change a name in several files: |
| 279 | |
| 280 | Create a file "subs.vim" containing substitute commands and a :update |
| 281 | command: > |
| 282 | :%s/Jones/Smith/g |
| 283 | :%s/Allen/Peter/g |
| 284 | :update |
| 285 | < |
| 286 | Execute Vim on all files you want to change, and source the script for |
| 287 | each argument: > |
| 288 | |
| 289 | vim *.let |
| 290 | argdo source subs.vim |
| 291 | |
| 292 | See |:argdo|. |
| 293 | |
| 294 | ============================================================================== |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 402d2fe | 2005-04-15 21:00:38 +0000 | [diff] [blame] | 369 | 'cpoptions'.) |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 6dc819b | 2018-07-03 16:42:19 +0200 | [diff] [blame] | 411 | See |terminal|. |
| 412 | |
| 413 | Another solution is splitting your terminal screen or display window with the |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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>. |
Bram Moolenaar | 6dc819b | 2018-07-03 16:42:19 +0200 | [diff] [blame] | 416 | |
| 417 | Another alternative is the "window" command, found on BSD Unix systems, which |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 478 | - using |synID()| to detect whether the cursor is in a string or comment |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 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. |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 483 | It skips matches in strings or comments, unless the cursor started in string |
| 484 | or comment. This requires syntax highlighting. |
Bram Moolenaar | fd2ac76 | 2006-03-01 22:09:21 +0000 | [diff] [blame] | 485 | |
| 486 | A slightly more advanced version is used in the |matchparen| plugin. |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 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 |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 516 | let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' . |
Bram Moolenaar | c9b4b05 | 2006-04-30 18:54:39 +0000 | [diff] [blame] | 517 | \ '=~? "string\\|comment"' |
| 518 | execute 'if' s_skip '| let s_skip = 0 | endif' |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 519 | |
Bram Moolenaar | 7e8fd63 | 2006-02-18 22:14:51 +0000 | [diff] [blame] | 520 | let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip) |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 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 | |
Bram Moolenaar | f740b29 | 2006-02-16 22:11:02 +0000 | [diff] [blame] | 529 | autocmd CursorMoved,CursorMovedI * call s:Highlight_Matching_Paren() |
Bram Moolenaar | 1d2ba7f | 2006-02-14 22:29:30 +0000 | [diff] [blame] | 530 | autocmd InsertEnter * match none |
| 531 | < |
| 532 | |
Bram Moolenaar | 91f84f6 | 2018-07-29 15:07:52 +0200 | [diff] [blame] | 533 | vim:tw=78:ts=8:noet:ft=help:norl: |