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