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