Terminal

我如何在zsh中綁定右控制鍵?

  • April 14, 2021

我搜尋了網際網路,找不到任何人問這個問題。我對向右移動和自動完成autosuggest-accept是相同的鍵綁定感到惱火。我的猜測是

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

bindkey '\xffe4' autosuggest-accept  

但他們沒有工作。我應該如何去尋找如何做到這一點?

我不認為它可以通過在終端內執行的任何軟體/程序zsh來完成,包括.

或者至少,我從未在任何軟體中看到,無論是Right Ctrl (alone)綁定到某個東西,還是手冊中解釋的綁定它的方式,或者Left CtrlRight Ctrl. 如果您知道具有此選項的軟體(與任何終端一起使用),請告訴我。

我配置的軟體包括 : vim, zsh, lf, fzf, tmux, htop, less,mostvisidata,

沒有人說你想要什麼。因此,如果某些軟體可以在終端中做到這一點,那至少是極其罕見的。

我看到類似於C-Left, C-Right(quote from man tmux)的唯一時間是用(It does mean )any Ctrl壓制:還有left or right arrow``Left or Right Ctrl``C-Up, C-Down``Ctrl而普通鍵盤上沒有向上/向下鍵。


你不能用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 + v``Left Ctrl + a,或者any Ctrl + v``Right Ctrl + a,都給我看^A,這意味著都放了相同的字元(通過檢查這個vim,然後按g``a,我看到它是第二個ascii字元,帶有 value 0x01)。所以可能在andzsh之間沒有任何區別。Left Ctrl``Right Ctrl

如果我按any Ctrl + v``Right Ctrl (alone),它什麼也不做。

兩者都vim告訴zsh我同樣的事情:他們不知道什麼時候沒有Ctrl按鍵按下按鍵,

而不尋常的按鍵Ctrl + v``F1(至少在終端中不尋常)給了我一些東西: ^[OPwithzsh<F1>with vimF1可以通過終端辨識含義。


一個 shell likezsh可以在裡面執行tmux,並且tmux有一個特性,它在andsend-keys之間沒有任何區別。這意味著您將無法在一般情況下做您想做的事情。Left Ctrl``Right 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,而其他的則無關緊要。


在某些終端上,例如st(我可以配置任何鍵),在 上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 xmodmap``man setxkbmap``man xkeyboard-config

通常,Ctrl鍵是修飾符。這意味著只有當你用另一個鍵按下它時,它們才應該做某事。

**注意:**在極少數情況下,鍵可以充當修飾符或鍵,例如:

  • 一些軟體(包括libreoffice),當您按下Alt.

  • xev是用於測試事件的工具,因此,它可以辨識所有內容,包括按下任意鍵。

  • QMK的雙功能鍵允許某些鍵在您快速鍵入它們時表現得像“正常鍵”,並且在您按下另一個鍵時像修飾符一樣。

  • emacs具有鍵和弦功能。這不完全是關於官方修飾符(ShiftControlAlt等),但它可以使正常鍵在某些延遲時與其他鍵按下時起到修飾符的作用。emacs可以在終端外部執行,也可以在內部執行 shell emacs。所以,也許你可以:

    • 使用or將鍵重新映射到任何地方Right Ctrl(我們稱之為) 。foo``setxkbmap``xmodmap
    • 在內部emacs,重新映射fooright control用於key-chord某些部分,但不適用於您執行的位置zsh
    • 請注意,我沒有對此進行測試,如果可能的話,它可能並不簡單,但emacs它是我所知道的唯一“終端模擬器”(實際上,它應該是一個文本編輯器,但它有很多功能,包括執行 shell)具有接近“既是修飾符又是正常鍵”的功能。

簡而言之:您可能無法做到這一點

更長:您提到的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 */

但請注意Modifiers。通常這些鍵只修改X 中的其他鍵綁定,而不是單獨作用。對於 zsh、bash 或任何其他 shell,您需要單獨執行的東西。您可以使用xmodmap或修改xkb,通過發明某種方法使該密鑰發送一個或多個字元,但沒有它,shell 將看不到任何東西。

引用自:https://unix.stackexchange.com/questions/644976