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>
timeout
set 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 명령으로, 읽은 부분 이스케이프 시퀀스를 삽입할 수 있습니다.
추가 자료:
- VT220 유형 기능 키(XTerm 제어 순서)