web-dev-qa-db-ja.com

viで2つの異なるアクションをCtrl-Shift-KeyとCtrl-Keyにバインドするにはどうすればよいですか?

私は2つの異なるアクションを例えばにマッピングしようとしています。 CtrlShifta そして Ctrla

map <C-S-a>    :echo "ctrl-shift-a received"<CR>
map <C-a>      :echo "ctrl-a received"<CR>

しかし、2つのうちのいずれかを押したときに得られるのは、ステータス行の「ctrl-areceived」という出力だけです。どうやら、viは大文字の制御文字と小文字の制御文字の違いを見ていません。

これを変更する方法はありますか?

Xterm(X.Org 6.8.99)でvi(v7.4)を実行しています。

5
cfi

Viはキーコードを同じものと見なすため、これは端末の制限です。挿入モードに入ると、これを確認できます i、次に打つ Ctrlv viをモードにして、特殊文字のリテラル入力を期待し、次にヒットします。 CtrlShifta^A出力が表示されます。今シーケンスを行います Ctrlv、 Ctrla、そして再び^Aが表示されます。両方の入力シーケンスにより、viで同じキーコードが表示されます。

xtermなどの端末の場合は、これを変更できます。 gnome-terminalXリソース設定を無視します 次の方法がわかりません。

この SO質問 は同じトピックをカバーし、 この例 はこれが.Xresourcesファイル内の複数のキーのマッピングに使用されていることを示しています。例えば。:

XTerm*vt100.translations: #override \
  Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n\
  Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n\ 
  Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")  

これで、さまざまなキーシーケンスがviに登場します。 Ctrla 対。 CtrlShifta、 Ctrlb 対。 CtrlShiftb、 Ctrlf 対。 CtrlShiftf

~/.vimrcでそれらを異なる方法でマッピングできるようになりました。

map <ESC>[65;5u   :echo "ctrl-shift-a received"<CR>
map <C-a>         :echo "ctrl-a received"<CR>
5
cfi