Vim端末で競合またはマッピングできない他のキーマッピング

Vim端末で競合またはマッピングできない他のキーマッピング

インターネットリソース(12サム)は、端末が変更されていないキーの 組み合わせと区別できないためCtrl-Shift-letter、、、/ 、/ 、 /がVimで安定してマッピングできない特定のキーの組み合わせを主張します(詳細な背景情報は参照)。Ctrl-numberCtrl-iTabCtrl-mEnterEscCtrl-[これはGilesの答えです。そしてこのASCIIテーブル記事)。具体的な例として地図を見ると

nnoremap <Tab>   :!echo A<CR>
noremap  <C-S-X> :!echo B<CR>
noremap  <C-1>   :!echo C<CR>
noremap  <C-F1>  :!echo D<CR>

A(Gvimでも)を生成し、Tab印刷し、Bを印刷してマッピングすることはできず、電子はGvimでもマッピングできません。Ctrl-iCtrl-xCtrl-Shift-xCtrl-{1,2,...}Ctrl-{F1,F2,...}

この回答「Ctrl-aとCtrl-Shift-aをどのように別の方法でマッピングするのですか?」にXtermのソリューションを簡単に説明していますが、一部の人が見逃す可能性のあるトリッキーな詳細がありません。これはより完全な答えを提供する試みです。

これはVim中心の質問ですが、カスタマイズ可能なマッピングを持つ他のターミナルアプリケーションはこれから恩恵を受けることができます。 Vifmは確かな例です。

ベストアンサー1

から始めますXterm最も複雑なものだからだ。そしてUrkesftついに解決しました。

XResources

これ~/.XresourcesファイルはXterm(およびその他のXlibアプリケーション)を構成します。編集が終わるたびに xrdb ~/.Xresources新しいXtermを発行し、開いて変更をテストします。から始まる

XTerm*metaSendsEscape: true
XTerm*eightBitInput:   false

を参照してman xtermください。Xtermの設定色やフォントなどの追加オプションの場合、デフォルト設定は本当に面倒です。

キーコードを送信

私たちは従うレナードの記事提案をして端末からそれを送信するようにします CSI codepoint;modifier u。ここで

  • CSIEsc文字の後に続くことを示します[

  • コードポイントマッピングする文字の10進Unicode値。 ASCII文字は、Unicodeでも同じ10進数表現を持ちます。

  • 修飾子下の表から選択してください:

    まったく 移動する デリゲート Alt+Shift 制御キー Ctrl+Shift Ctrl+Alt Ctrl+Alt+Shift
    1 2 サム 4 5 6 7 8

Ctrl-Shift-x

X検索ASCIIテーブル10進値は88であることがわかりました。したがって、CSI 88;5 uVimに送信する必要があります。これは次のとおりです.Xresources

XTerm*Translations: #override\
    Ctrl ~Meta  Shift <Key>x   :string("\033[88;5u")

Ctrl-Shift-x次に、引用符で囲まれたシーケンスを作成します。チルダは修飾子を無効にします。これは~Meta、Altを押さなかったことを意味します(メタはAltを意味します)。0338進数Escです。

バックスラッシュの後にはスペースを含めないでください(Xrdbはこのエラーについて警告します)、前述のように複数のバインディングを互いに分離する必要があります\n\

タブとCtrl-i

iは10進数105とTab10進数9ですが、どちらも9をCtrl-i 送信します。TabASCIIテーブル記事説明する。したがって、 Ctrl-iこれを明確にするために異なるシーケンスを送信する必要があり、以前と同じ推論を通して次の結論を下しますCSI 105;5 u

XTerm*Translations: #override\
    Ctrl ~Meta ~Shift <Key>i   :string("\033[105;5u")

追加することもできますが、10進数9(8進数11)がすでに送信されているため、~Ctrl ~Meta ~Shift <Key>Tab :string("\011")重複しています。Tab

変更は、Tab変更されたC0コントロールの下にリストされているように特別です。

XTerm*Translations: #override\
   ~Ctrl ~Meta  Shift <Key>Tab :string("\033[Z")    \n\
    Ctrl ~Meta ~Shift <Key>Tab :string("\033[9;5u") \n\
    Ctrl ~Meta  Shift <Key>Tab :string("\033[1;5Z")

より特殊なキー

ここに属しますF1-F12そしてHome他にもあります。 Xtermにはすでに明示的なコードがあるので、Ctrl-vKeyVimの挿入モードを押すことで直接確認できます。たとえば、Ctrl-vCtrl-F1作成します<ESC>[1;5P

ウィムメルケ

ここでバインディングを次に追加するだけです.vimrc

" Disambiguate Tab and Ctrl-i
nnoremap <ESC>[105;5u <C-I>

nnoremap <Tab>        :!echo A<CR>
noremap  <ESC>[88;5u  :!echo B<CR>
noremap  <ESC>[49;5u  :!echo C<CR>
noremap  <ESC>[1;5P   :!echo D<CR>

ライン5は非常に重要です。Ctrl-iジャンプリストから戻るために使用され、もはやTabXtermには存在せず、代わりに別のシーケンスをVimに送信します。その順序Vimの下のコンテンツにマッピングする必要がありますCtrl-i

追加のガイドライン

  • 挿入モードでキーを押したときに遅延がある場合は、EscVimのタイムアウト設定を調整してくださいset timeoutlen=1000 ttimeoutlen=20timeoutlenとttimeoutlen)。

  • どのキー記号を入力するのかわからない場合は、を使用して検索し.Xresourcesxevください。たとえば、左側のWindows / Superキーを押して出力しますSuper_L

  • エクスタムではCtrl-QそしてCtrl-Sレガシー機能であるフロー制御用に予約されています。マッピングするには、まず以下を追加してフロー制御を無効にします。

    " Disable XOFF/XON
    silent !stty -ixon
    " Redraw screen
    silent !resize>/dev/null
    

    到着する.vimrc

  • 他のTUIプログラムで地図を表示したくない場合は、Vimを別のXtermクラス名にしてください。例えば

    xterm -name vimterm -e vim file
    

    代わりにファイルで使用してくださいvimtermXTerm.Xresources同じ Vim インスタンスで新しいファイルを開く方法役に立つかもしれません。

その他の端末エミュレータ:UrxvtとKitty

Urkesftで別の構文を使用してください.Xresources。 ISO 14755による干渉バインディングも無効にする必要があります。

URxvt*iso14755:    false
URxvt*keysym.C-i:  \033[105;5u
URxvt*keysym.C-X:  \033[88;5u
URxvt*keysym.C-1:  \033[49;5u
URxvt*keysym.C-F1: \033[1;5P

使用しない場合は、バインドして次のように入力し.Xresourcesます ~/.config/kitty/kitty.conf

map ctrl+shift+x send_text application \033[88;5u
map ctrl+i       send_text application \033[105;5u
map ctrl+1       send_text application \033[49;5u
map ctrl+F1      send_text application \033[1;5P

おすすめ記事