Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

In Vim 7.3.1-762, mintty 1.1.2 (xterm), cygwin, Windows XP, the insert-mode map <F4> executes the intended key strokes at one time but inserts itself at another time. This undeterministic behavior especially occurs if I hold the <F4> key depressed.

How do I make the behavior predictable accross multiple Vim-, terminal- and operating system versions?

This is the code I defined in my ~/.vimrc file, that seems relevant to me:

set compatible
set timeout
set ttimeout
set timeoutlen=1000
set ttimeoutlen=100
imap <F4> <C-\><C-O>:set relativenumber! relativenumber?<CR>

If I assign the mapping to a function key above <F4>, e.g. <F5>, <S-F7> etc. I don't experience the behavior mentioned above. Also if I disable the timeout option with set notimeout it does seem to do the trick.

share|improve this question

1 Answer 1

I made the <F4> key apparently work in all modes by using map <expr> expression maps as follows:

MapOptToggle <F4> relativenumber
MapOptToggle! <S-F4> number

command! -bang -nargs=+ MapOptToggle call <SID>MapOptToggle(<bang>0, <f-args>)
function! s:MapOptToggle(bang, key, opt)
  function! s:ToggleOpt(opt)
    if mode() =~# '\vno?' || !&showmode
      exec 'set ' . a:opt . '! ' . a:opt . '?'
    else
      exec 'set ' . a:opt . '!'
    endif
    redraw
    return ''
  endfunction
  let a='noremap'
  let b='<unique> <silent> <expr> ' . a:key . ' <SID>ToggleOpt(' . string(a:opt) . ')'
  exec a . ' ' . b
  exec a . '! ' .  b
  exec 'set ' . (a:bang ? 'no' : '') . a:opt
endfunction

But still my answer doesn't explain the unpredictable behavior of the imap insert-mode map.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.