모드 맵을 삽입하는 이유 ""예기치 않게 자동으로 삽입되거나 예상되는 키 입력을 수행합니까?

모드 맵을 삽입하는 이유 ""예기치 않게 자동으로 삽입되거나 예상되는 키 입력을 수행합니까?

Vim 7.3.1-762, mintty 1.1.2(xterm), cygwin, Windows XP에서 삽입 모드 매핑은 <F4>예상되는 키 입력을 한 번 수행하지만 다른 시간에 자신을 삽입합니다. 이 불확실한 동작은 특히 키를 누르고 있을 때 발생합니다 <F4>.

여러 Vim, 터미널 및 OS 버전에서 동작을 예측 가능하게 만드는 방법은 무엇입니까?

~/.vimrc이것은 나와 관련이 있는 것으로 보이는 파일에 정의한 코드입니다 .

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

예 를 <F4>들어 위의 기능 키에 매핑을 할당하면 위에서 언급한 동작이 발생하지 않습니다. 또한 해당 옵션을 비활성화하면 문제가 해결되는 것 같습니다.<F5><S-F7>timeoutset notimeout

답변1

<F4>다음과 같은 표현식 그래프를 사용하여 map <expr>모든 모드에서 키를 유효하게 만들었습니다 .

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

imap그러나 내 대답은 여전히 ​​삽입 모드 매핑의 예측할 수 없는 동작을 설명하지 않습니다 .

답변2

그 댓글

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

이 문제는 키 반복(키를 누르고 있을 때 반복 속도 증가)으로 인해 이스케이프 문자가 aa 기능 키 또는 vi 특수 문자의 시작인지 확인하는 데 사용되는 시간 초과로 인해 발생하는 것으로 제안됩니다 escape. vi(또는 vim)가 너무 많은 문자를 너무 빨리 가져오면 기능 키의 시작 부분을 이스케이프 문자로 처리하고 (예를 들어) 현재 삽입을 중단합니다.

F1일부 프로그램(예: xterm)은 를 통해 vt100 스타일 PF1- PF4를 보냅니다 F4. 결과 escapeOS는 삽입 모드로 전환하는 vi 명령으로, 읽은 부분 이스케이프 시퀀스를 삽입할 수 있습니다.

추가 자료:

관련 정보