zshで正しい制御キーをバインドする方法は?

zshで正しい制御キーをバインドする方法は?

インターネットで検索してみるとこんな質問をする方がいませんでした。右に移動してオートコンプリートがautosuggest-accept同じキーバインディングであることは面倒です。私の最終的な推測は

bindkey -v '<C-Right>' autosuggest-accept

そして

bindkey '\xffe4' autosuggest-accept  

しかし、彼らは仕事を持っていません。これを行う方法を確認するにはどうすればよいですか?

答え1

簡単に言えば:あなたはおそらくできないでしょう

もっと長い:あなたが言うことは0xffe4次のとおりです<X11/keysymdef.h>

/* Modifiers */

#define XK_Shift_L                       0xffe1  /* Left shift */
#define XK_Shift_R                       0xffe2  /* Right shift */
#define XK_Control_L                     0xffe3  /* Left control */
#define XK_Control_R                     0xffe4  /* Right control */
#define XK_Caps_Lock                     0xffe5  /* Caps lock */
#define XK_Shift_Lock                    0xffe6  /* Shift lock */

しかしこれだけは注意してください修飾子。通常、このキーのみ調整Xの他のキーバインディングは単独では機能しません。 zsh、bash、または他のシェルの場合は、別々に実行するものが必要です。使用またはxmodmapパッチを適用できます。xkb、キーに1つ以上の文字を送信させる方法を発明しましたが、これがなければシェルは何も見えません。

答え2

私の考えではこれはできないと思います。すべてのソフトウェア/プログラムを含む端末内で実行しますzsh

または、少なくともどのソフトウェアでも何かにRight Ctrl (alone)バインドまたはバインドする方法がマニュアルに記載されているLeft CtrlRight Ctrl。このオプションがある(すべての端末で動作する)ソフトウェアを知っている場合は、お知らせください。私が構成したソフトウェアには、、、、、、、、、、およびが
含まれており、そのどれも望むことを言わない。したがって、一部のソフトウェアが端末でこれを行うことができる場合、これは少なくとも非常にまれです。私が見たものと似ているのは、押すことです。つまり、通常のキーボードに上/下のキーがない場合もあります。vimzshlffzftmuxhtoplessmostvisidata

C-Left, C-Rightman tmuxany Ctrlleft or right arrowLeft or Right CtrlC-Up, C-DownCtrl


できませんzshzshマニュアルが正しいと仮定)。
検索後man zshallman zsh不完全)ショートカットがあることを確認しましたCtrl + v

quoted-insert (^V) (unbound) (unbound)
Insert the next character typed into the buffer literally.  An interrupt character will not be inserted.

今、またはany Ctrl + vLeft Ctrl + aany Ctrl + vRight Ctrl + a両方を表示します^A。これはどちらも同じ文字を入力することを意味しvimますga。したがって、との間に違いはないかもしれません。ascii0x01zshLeft CtrlRight Ctrl

を押すとany Ctrl + vRight Ctrl (alone)何も起こりません。
どちらも私に同じことを言いますvimzsh端末を使用して意味を識別できます。Ctrl
Ctrl + vF1^[OPzsh<F1>vimF1


このようなシェルはzsh内部的に実行することtmuxができ、tmux関数とsend-keys。これは通常、望むことができないことを意味します。Left CtrlRight Ctrl

確かに、私はまたtmuxソースコード(私が使用したgit clone tmuxもの)を検索し、キーrgrep -i "ctrl\|control" | grep -i "right\|ctrl.\?r\|r.\ctrl"について話すたびに何が起こるのかを確認しようとしましたが、私が見つけたRight Ctrlものは次のとおりです。

tty-keys.c:134: { "\033Oc", KEYC_RIGHT|KEYC_CTRL },
tty-keys.c:405: { TTYC_KRIT5, KEYC_RIGHT|KEYC_CTRL },
tty-keys.c:406: { TTYC_KRIT6, KEYC_RIGHT|KEYC_SHIFT|KEYC_CTRL },
tty-keys.c:407: { TTYC_KRIT7, KEYC_RIGHT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL },
CHANGES:2395:  control the maximum length of left and right components of the 
status bar.
CHANGES:2550:  C- for ctrl keys (^ is still accepted as an alternative).
status.c:1168:  case KEYC_RIGHT|KEYC_CTRL:

したがって、ほとんどの内容が議論され、残りCtrl + Rightは関係ありません。


一部の端末では、次のようになります。インシ(すべてのキーを設定できます)上に次config.hのコードが表示されます。

{ XK_KP_End,        ControlMask,    "\033[1;5F",    +1,    0},
{ XK_KP_End,        ShiftMask,      "\033[K",       -1,    0},

Ctrl + Endを押すか、何かが完了すると、Shift + End左右の間に違いはありませんCtrl。ただ一つControlMask、ただ一つしかありませんShiftMask(したがってキーに関するものであれば、私の答えは同じでしょうShift)。

また、ソースコードrgrepに対してコマンドを試しましたが、st再びCtrl + Right


他の端末エミュレータでもこれを行うことができます。一般的なケースではできないことを考えれば十分だと思います。実際にこの動作を達成してオンにする方法がありますが、zsh非常に難しいです。エディタのソースコードzsh、端末エミュレータのソースコード、およびxorg


Right Ctrl動作を変更するには、Right Ctrl各ソフトウェアのバインディングが必要です。キーボード構成の詳細については、およびを
参照してくださいman xmodmapman setxkbmapman xkeyboard-config

通常、Ctrlキーは修飾子です。これは、他のキーを押したときにのみ特定の操作を実行する必要があることを意味します。

メモ:まれに、キーは修飾子またはキーとして機能します。たとえば、次のようになります。

  • 一部のソフトウェア(付属libreoffice)では、キーを押すと下線付きの文字が表示されますAlt
  • xevはイベントテスト用のツールなので、任意のキーを押すことを含むすべてを認識します。
  • デュアルファンクションキーは次のとおりです。QMK特定のキーをすばやく入力すると、「通常キー」のように機能し、別のキーを押すと修飾キーのように機能します。
  • emacs一つあるチューニングコード特徴。これは正式な修飾子(ShiftまたはControlなど)に関するものではありませんがAlt、他のキーと一緒に特定の遅延時間内に押すと、通常のキーが修飾子として機能する可能性があります。emacs端末の外部で実行できますemacs。したがって、次のことができます。
    • どこでもキーをRight Ctrl何か(私たちが呼ぶfoo)に使用するか、再マップします。setxkbmapxmodmap
    • 内部では、一部の部品で使用するために再emacsマップしますが、実行中の場所には使用できません。fooright controlkey-chordzsh
    • 私はこれをテストしておらず、可能であれば簡単ではないかもしれませんが、私がemacs知っている唯一の「ターミナルエミュレータ」です(実際にはテキストエディタと呼ばれていますが、多くの機能があります)、シェル実行を含む)は「修飾子キーであり一般キーである」近い機能を持っています。

関連情報