如何在 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 或任何其他 shell,您需要单独运行的东西。您可以使用xmodmap或修补xkb,通过发明某种方法使该键发送一个或多个字符,但如果没有这种方法,shell 将看不到任何内容。

答案2

我不认为这是可以做到的任何软件/程序在终端内运行,包括zsh.

或者至少,我从未在任何软件中看到过,要么Right Ctrl (alone)绑定到某个东西,要么在手册中解释了绑定它的方式,或者Left Ctrl和之间的明确区别Right Ctrl。如果您知道一款具有此选项的软件(适用于任何终端),请告诉我。我配置的
软件包括:vim、、、、、、、、和,没有zsh一个谈到 你想要什么。因此,如果某些软件可以在终端中执行此操作,那么至少是极其罕见的。 我唯一看到类似(引用自)的内容是关于按下(它确实意味着):也有在普通键盘上没有向上/向下键的情况。lffzftmuxhtoplessmostvisidata

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


你不能zsh(假设zsh手册是正确的):
搜索后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 + a, 或any Ctrl + vRight Ctrl + a,都显示给我^A,这意味着两者都放置相同的字符(通过检查它vim,然后按ga,我看到它是第二个ascii字符,值为0x01)。所以和zsh之间可能没有任何区别。Left CtrlRight Ctrl

如果我按any Ctrl + vRight Ctrl (alone),它什么也不做。
两者都vim告诉zsh我同样的事情:他们不知道何时Ctrl按下没有键的键,
而不寻常的键Ctrl + vF1(至少在终端中不常见)给了我一些东西: ^[OPwithzsh<F1>with vimF1可以用终端来识别含义。


像这样的 shellzsh可以在 内部运行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 setxkbmap和。man xkeyboard-config

通常,Ctrl键是修饰符。这意味着只有当您用另一个键按下它们时,它们才应该执行某些操作。

笔记 :在极少数情况下,键可以充当修饰符或键,例如:

  • 在某些软件(包括libreoffice)中,当您按 时,您会看到一些带有下划线的字母Alt
  • xev是一个用于测试事件的工具,因此,它可以识别一切,包括按任意键。
  • 双功能键来自QMK允许某些键在快速键入时表现得像“常规键”,而在按下另一个键时表现得像修饰键。
  • emacs有一个调和弦特征。这并不完全是关于官方修饰符(ShiftControlAlt等),但如果在一定延迟内与其他键一起按下,它可以使常规键充当修饰符。emacs可以从终端外部运行,并且可以在内部运行 shell emacs。所以,也许你可以:
    • 使用或将密钥重新映射Right Ctrl到任何地方的某个东西(我们称之为foo)。setxkbmapxmodmap
    • 在里面emacs,重新映射fooright control用于key-chord某些部分,但不用于您运行的位置zsh
    • 请注意,我还没有测试过这个,如果可能的话,它可能并不简单,但它emacs是我所知道的唯一“终端模拟器”(实际上,它应该是一个文本编辑器,但它有很多功能,包括运行外壳)具有接近“既是修饰键又是常规键的东西”的功能。

相关内容