Great.

Yeah it always bothered me that there's no way to monitor every keypress
unless you map every key, which is quite ugly.

--Matt

On Thu, Oct 19, 2006 at 11:26:53PM -0700, Hari Krishna Dara wrote:
> 
> I remember someone posting 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 Vim7.0 with no patches.
> 
> Often there are questions on this list on how to capture every key press
> from a user, and the answer is that it 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 get 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 eanything that you can do normally in an insert mode,
> press <BS>, <C-U> etc. Hope someone finds this useful.
> 
> I will also post this as a tip.
> 
> -- 
> Hari
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com 

Reply via email to