gnome-terminalのxtermでvimのモバイルファンクションキーを変更するには?

gnome-terminalのxtermでvimのモバイルファンクションキーを変更するには?

<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インターフェイスを使用してテストできます。

関連情報