Por que o mapa do modo de inserção “F4” se insere imprevisivelmente ou executa os pressionamentos de teclas pretendidos?

4

No Vim 7.3.1-762, Mintty 1.1.2 (xterm), cygwin, Windows XP, o mapa do modo de inserção <F4> executa os toques de tecla pretendidos de uma só vez, mas se insere em outro momento. Esse comportamento indeterminado ocorre especialmente se eu mantiver pressionada a tecla <F4> .

Como posso tornar o comportamento previsível em várias versões de Vim, terminais e sistemas operacionais?

Este é o código que eu defini no meu arquivo ~/.vimrc , que parece relevante para mim:

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

Se eu atribuir o mapeamento a uma chave de função acima de <F4> , por exemplo <F5> , <S-F7> etc. Eu não experimento o comportamento mencionado acima. Além disso, se eu desabilitar a opção timeout com set notimeout , isso parece funcionar.

    
por Tim Friske 21.01.2013 / 12:12

2 respostas

1

Eu fiz a chave <F4> aparentemente funcionar em todos os modos usando map <expr> expression maps da seguinte forma:

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

Mas ainda assim minha resposta não explica o comportamento imprevisível do mapa do modo de inserção imap .

    
por 21.01.2013 / 14:58
1

Esse comentário

especially occurs if I hold the <F4> key depressed.

sugere que o problema é devido à repetição de teclas (aumentando a velocidade de repetição quando você pressiona a tecla) interferindo no tempo limite usado para determinar se um caractere de escape é o início de uma tecla de função ou o caractere especial vi escape . Quando o vi (ou vim) obtém muitos caracteres muito rápido, ele vê o início de uma tecla de função como um escape e (por exemplo) anula a inserção atual.

Alguns programas (como o xterm) enviarão o PF1-PF4 no estilo vt100 para F1 até F4 . O escape O resultante S é um comando vi que coloca você no modo de inserção, permitindo inserir partes das seqüências de escape que ele lê .

Leitura adicional:

por 30.03.2016 / 03:45