<s-f2>
マッピングを実行するためにキーを押すと、nnoremap <s-f2> :set number!
Vimは上記の「挿入」モード()を開き、文字列をO
入力します。1;2Q
完全なターミナルキーコードを表示するには(「通常」モードで途中で食べないで)、<c-v><s-f2>
「挿入」モードを押してからインポートします^[O1;2Q
。文字^[
はどこにありますか<esc>
?
読んだ後でも「ターミナルVimからのショートカットキーコードマッピング」^[O1;2Q
ターミナルキーコードが<s-f1>
Vimコードにマッピングされていない理由はわかりません。だから私のファイル~/.vimrc
に次の関数を定義しました。
function! s:Mod_fix_shift_fkey()
let a=0
let b='PQRS'
while a < 4
exec 'set <s-f' . (a + 1) . ">=\eO1;2" . b[a]
let a+=1
endwhile
endfunction
<s-f1>
これを呼び出してからへの移動機能キーを変更し、バインドされた<s-f4>
マッピングが<s-f2>
突然機能しました。
誰かがこれを説明できますか?
<s-f5>
また、次から移動したファンクションキーを変更する必要がありました<s-f12>
。
"...
let a=5
let b='1517181920212324'
let c=0
while a < 16
exec 'set <s-f' . a . ">=\e[" . b[c : c + 1] . ';2~'
let a+=1
let c+=2
endwhile
"...
そして、From <c-s-f1>
to<c-s-f4>
と<c-s-f5>
To<c-s-f12>
制御転送機能キーです。たとえば、次のようになります。
" ...
exec 'map <esc>O1;6' . b[a] ' <c-s-f' . (a + 1) . '>'
" ...
exec 'map <esc>[' . b[c : c + 1] . ';6~ <c-s-f' . a . '>'
" ...
答え1
:set <Key>
特別なワイルドカード構文を使用して、Vimに自動的に認識させることができます。xterm-スタイル修飾キー:
if &term =~ '^gnome'
execute "set <xUp>=\e[1;*A"
execute "set <xDown>=\e[1;*B"
execute "set <xRight>=\e[1;*C"
execute "set <xLeft>=\e[1;*D"
execute "set <xHome>=\e[1;*H"
execute "set <xEnd>=\e[1;*F"
execute "set <PageUp>=\e[5;*~"
execute "set <PageDown>=\e[6;*~"
execute "set <F1>=\eOP"
execute "set <F2>=\eOQ"
execute "set <F3>=\eOR"
execute "set <F4>=\eOS"
execute "set <xF1>=\eO1;*P"
execute "set <xF2>=\eO1;*Q"
execute "set <xF3>=\eO1;*R"
execute "set <xF4>=\eO1;*S"
execute "set <F5>=\e[15;*~"
execute "set <F6>=\e[17;*~"
execute "set <F7>=\e[18;*~"
execute "set <F8>=\e[19;*~"
execute "set <F9>=\e[20;*~"
execute "set <F10>=\e[21;*~"
execute "set <F11>=\e[23;*~"
execute "set <F12>=\e[24;*~"
endif
:help xterm-function-keys
とを参照してください:help xterm-modifier-keys
。
答え2
@chris-johnsenのスクリプトはうまくいくようですが、解釈にはいくつかの問題があります。
- まず、vimは用語キャップアプリケーション。 ncurses インターフェイスなどの termcap インターフェイスを使用します。
- ncursesはファンクションキーの名前を提供しますが、termcapアプリケーションは完全修飾名のみを表示できます。
- ほとんどのShiftファンクションキーは次のとおりです。拡張機能、端末データベースで説明されているように。
- 興味のあるコンテンツはxterm部分注釈付き
#ほとんどのxterm拡張はファンクションキー用です。パッチ#94以降( #1999)、xtermはShift / Control / Alt /メタ修飾子をサポートしています。 #アドオンキー文字列。他の開発者がこの機能をコピーしましたが、 #パッチ#167(2002)ではxtermに従わなかったが、 #これらのコア定義はあまり明確ではありません。
- 言及された変更パッチ #167交換パラメータは次のとおりです。修飾子そしてキーコード修飾子がカーソルキーの重複数で誤解される可能性がある問題を回避するために(
emacs
他のtermcapアプリケーションで) - xtermを変更しても、vimは "tcap-query"で導入された他の拡張機能を使用するため、あまり影響を受けませんでした。パッチ #148xterm。
- gnome-terminalまたはkonsoleでvimを使用すると、「tcap-query」機能が不足し、ファンクションキーの送信内容を知る方法はありません(ユーザーがキーバインディング情報を入力する以外)。
- gnome-terminalとkonsole(よく文書化されていないのでどちらが「最初」であるかわからない)はxtermの初期動作をコピーしたため、これは少なくとも10年間バグレポート(例:この質問)を生成しました。ところで、ncursesはこれらの端末の正しい端末記述を提供しますが、これらの端末はほとんど使用されません。標準化が多すぎます。
標準化の一環として:
- ファンクションキーが送信される「標準」はありません。
- xtermは(とにかく1990年代初頭から)vt220キーボード用の拡張から始まりました。 vt220はF6-F20を定義します。 F1-F5は「ローカル」です。外で起こったことは後で起こりました。
- 拡張の動機は、もともと20個に均等に分けられないPCキーボード(12個のファンクションキーがある)から出てきました。したがって、xtermには24個のキーがあり、Shift(元)を使用します。
- F1-F4は、xtermのvt100エミュレーションにPF1-PF4を提供するためにも使用されるため、特別です。ではなく、P、Q、R、Sで終わります
"~"
。変換を考慮すると、これは質問に記載されている欠点の1つを追加します。 - Control-、Meta-は後で表示されます。パッチ #94。 12個の実際のキーが24個のように見えるのではなく、いくつか残り(terminfo / termcap 60ファンクションキーの制限に対応するため)、48個(controlキーとShiftキー)が得られます。
- 最初は追加キーの名前を作成する理由はありませんでしたが、後で別の特殊キー(カーソルと編集キーボード)に修飾子が追加されました。
- (ほぼ同じ時期に)そんなことがありました。ncurses 拡張拡張子を指定してください。
AX
一部の拡張は、termcapでテストを実行できるように設計されています(例:)まったく特殊キー数の拡張は、termcapインターフェイスを使用してテストできます。