m (Reverted edits by Emprego.curitiba (talk | block) to last version by JohnBot) |
(Change <tt> to <code>, perhaps also minor tweak.) |
||
Line 4: | Line 4: | ||
|previous=1361 |
|previous=1361 |
||
|next=1366 |
|next=1366 |
||
− | |created= |
+ | |created=2006 |
|complexity=advanced |
|complexity=advanced |
||
|author=hari_vim |
|author=hari_vim |
||
Line 14: | Line 14: | ||
Someone once posted a patch to add a new event called GetChar to receive an event for every keypress. This trick is not as powerful and flexible as that, but it can be very useful for a plugin, and is supported in Vim 7.0 with no patches. |
Someone once posted a patch to add a new event called GetChar to receive an event for every keypress. This trick is not as powerful and flexible as that, but it can be very useful for a plugin, and is supported in Vim 7.0 with no patches. |
||
− | Often there are questions on how to capture every key press from a user. The answer is that you can't, unless you map all keys. But even if you map all keys, it is not flexible enough. Here is a trick with recursive <expr> maps and < |
+ | Often there are questions on how to capture every key press from a user. The answer is that you can't, unless you map all keys. But even if you map all keys, it is not flexible enough. Here is a trick with recursive <expr> maps and <code>getchar()</code> to have all keys pass through your function. You can do whatever you want with the keys, swallow them or pass them to Vim. |
Here is a demo that shows how to use it in insert mode. What the function does is to double every key you press, except <Esc> and <C-C>, when it breaks the loop. |
Here is a demo that shows how to use it in insert mode. What the function does is to double every key you press, except <Esc> and <C-C>, when it breaks the loop. |
Latest revision as of 06:22, 13 July 2012
created 2006 · complexity advanced · author hari_vim · version
Someone once posted a patch to add a new event called GetChar to receive an event for every keypress. This trick is not as powerful and flexible as that, but it can be very useful for a plugin, and is supported in Vim 7.0 with no patches.
Often there are questions on how to capture every key press from a user. The answer is that you can't, unless you map all keys. But even if you map all keys, it is not flexible enough. Here is a trick with recursive <expr> maps and getchar()
to have all keys pass through your function. You can do whatever you want with the keys, swallow them or pass them to Vim.
Here is a demo that shows how to use it in insert mode. What the function does is to double every key you press, except <Esc> and <C-C>, when it breaks the loop.
imap <buffer> <silent> <expr> <F12> Double("\<F12>") function! Double(mymap) try let char = getchar() catch /^Vim:Interrupt$/ let char = "\<Esc>" endtry "exec BPBreakIf(char == 32, 1) if char == '^\d\+$' || type(char) == 0 let char = nr2char(char) endif " It is the ascii code. if char == "\<Esc>" return '' endif redraw return char.char."\<C-R>=Redraw()\<CR>".a:mymap endfunction function! Redraw() redraw return '' endfunction
You can do almost anything that you can do normally in an insert mode, press <BS>, <C-U> etc.