追加読書

追加読書

Ctrl + LeftArrowをターミナルの前の単語(XWindowSystemなし)にバインドしてみました。

しかし、Ctrl + LeftArrowとLeftArrowが端末で同じエスケープシーケンスを生成することを観察しました。

  1. 私はCtrl + Vを押します
  2. 左矢印を押す
  3. 私は受け取った^[[D
  4. 私はCtrl + Vを押します
  5. Ctrl+左矢印を押します
  6. 私は受け取った^[[D

Ctrl+右矢印にも同じ問題があります。どうすれば解決できますか?

(Debian: Linux v4.19.0-8-amd64)

答え1

^[[D左矢印で得た。

Ctrl - 左側はLinux VCとxtermに^[[151あります。^[[1;5D


man keymaps持っている:

 Which  of  the actions bound to a given key is taken when it is pressed depends on what
   modifiers are in effect at that moment.  The  keyboard  driver  supports  9  modifiers.
   These  modifiers  are  labeled  (completely  arbitrarily)  Shift,  AltGr, Control, Alt,
   ShiftL, ShiftR, CtrlL, CtrlR and CapsShift.  Each of these modifiers has an  associated
   weight of power of two according to the following table:

          modifier            weight

          Shift                  1
          AltGr                  2
          Control                4
          Alt                    8
          ShiftL                16
          ShiftR                32
          CtrlL                 64
          CtrlR                128
          CapsShift            256

ShiftとControlと同様に、2つの「Alt」キーが同じ操作を実行するように変更しました。

例:キーマップファイルloadkeys

# three modifiers -> 8 cols. (AltGr missing):
#
keymaps 0-1,4-5,8-9,12-13

それから:

# left modifiers
keycode  42 = Shift
keycode  29 = Control
keycode  56 = Alt
keycode  58 = Caps_Lock
# right side...just Alt
keycode  54 = Shift
keycode  97 = Control
keycode 100 = Alt

通常、100 = AltGrです。

その後、デフォルトの「左」の後に2つの追加タスクを追加しました。

keycode 105 = Left F150 F151
  string F150 = "\033[150"
  string F151 = "\033[151"

これは2段階のプロセスでなければなりません。 「F150」は、変更されたキーを文字列に関連付けるために使用されるラベルです。

矢印キー(105)は以前のように「左」を生成しますが、ShiftとControlは選択されたエスケープシーケンスを生成します。

それから~/.inputrc

# Moving - modif. L+R Arrows in linux VC
# ascii codes in X / evdev / xterm
#
"\e[150":  backward-word
"\e[1;2D": backward-word
"\e[154":   forward-word
"\e[1;2C":  forward-word

"\e[151":  shell-backward-word
"\e[1;5D": shell-backward-word
"\e[155":   shell-forward-word
"\e[1;5C":  shell-forward-word

1;2D振り返ってみると、Xが作ったものを選んだはずだった。これはいくつかの inputrc 行を保存します。しかし、これらのエスケープシーケンスは私にとってやや不透明に見えたので、独自のエスケープシーケンスを定義しました。


修飾子マッピングを記述するには、次のようにします。

# "Print Screen Sys Rq" is Nr 99
#
keycode 99 =  F91 F92 F93 nul F95 F96
 string F91 = " --help\n"
 string F92 = " |less"
 string F93 = " |grep "
 string F95 = "()\033[D"
 string F96 = "echo \'\033[4~\'"

--helpこれで、以前使用していなかった「印刷」キーを押してプラスを書き込むことができますEnter。 Xは「印刷」キーも無視するため、これはLinux VCでのみ機能し、XKBではこれを有効にする方法が見つかりませんでした。

「nul」エントリは「Shift + Control」の位置であり、渡されます。重量「Alt」の前に表示されます。

keymaps 0-1,4-5,8-9,12-13:数値「0,1,4,5,8」は、「F95」のある 5 番目の位置に重み「8」を入れます。 「8」は「Alt」と定義されます。値2のAltGr重みをスキップしたいので、2,3,6,7がありません。


10個のFキーとShift、Control、Alt(左または右なし)の8つの組み合わせを組み合わせると、必要に応じて80のさまざまなキー機能が得られます。しかし、Shift + Control-F6を使って1つのことを行い、Control + Alt-F9を使って別のことをしたい人は誰ですか?

答え2

この機能を追加するために、Linuxに組み込まれた端末エミュレータプログラムを書き直しました。

内蔵端末エミュレータ制御シーケンスに修飾子情報はまったく含まれません。。特に、一部のGUI端末エミュレータのように、カーソルキーボードの制御順序に修飾子情報は含まれません。

GUIターミナルエミュレータや実​​際のターミナルと比較すると、オペレーティングシステムカーネル(LinuxやBSDカーネルなど)に組み込まれているターミナルエミュレータプログラムには完了できない機能がたくさんあることがわかります。 (NetBSD および OpenBSD ユーザーズマニュアルでは、wscons実際の DEC VT が行うことと何もしないことについて詳しく説明しています。Linux doco はあまり役に立ちません。)

キーマップを使用して、カーソルキーを(高い番号の)プログラム可能なファンクションキーとして定義し、可能な各修飾子の組み合わせに対して異なるファンクションキーを使用し、すべてのファンクションキー文字列を適切な制御順序で手動でコーディングします。これは退屈でとんでもないことで、DECCKMの起動が中断されます(Linux組み込み端末エミュレータは実際にはカーソルキーボードキーで指定されたキーマップのキーにのみDECCKMを適用するためです)。

いくつかあります。ユーザースペースX用のターミナルエミュレータは必要ありません。他人を確認していないので言うことはできませんが、コントロールの順序で修飾子情報を提供します。言及したコードは次のとおりです。

%猫-V
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]]]
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]]]
%コンソールデコードecma48--入力
^[[D^[[C^[[A^[[B^[[1;5D^[[1;5C^[[1;5A^[[1;5B]]]
見習い
CUF
CUU
CUD
コントロール+カップ1
コントロール+CUF 1
コントロール+CUU 1
コントロール+CUD 1
もし
%setterm --appcursorkeys on;コンソールデコード ecma48--input
^[OD^[OC^[OA^[OB^[[1;5D^[[1;5C^[[1;5A^[[1;5B]]
SS3 'D'
SS3「ㄷ」
SS3「A」
SS3「雨」
コントロール+カップ1
コントロール+CUF 1
コントロール+CUU 1
コントロール+CUD 1
もし
%

追加読書

関連情報