
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制御シーケンス)