Как привязать правую клавишу управления в zsh?

Простой ответ: нет, не должно, и это ненормальное поведение.

Лучше задавать этот вопрос не на Stack Exchange, а на форуме поддержки Chrome OS:https://support.google.com/chrome/community/?hl=en&gpf=%23!forum%2Fchrome

0
14.04.2021, 14:22
1 ответ

Я не думаю, что это можно сделать с любым программным обеспечением/программой , работающими внутри терминала, включая zsh.

По крайней мере, я никогда не видел ни в одном софте, чтобы Правый Ctrl (отдельно)привязывался к чему-то, или описанный в руководстве способ его привязки, или явное различие между Левый Ctrl и Правый Ctrl . Если вы знаете одну программу с этой опцией (, работающую с любым терминалом ), сообщите, пожалуйста.
Программное обеспечение, которое я настроил, включает :vim, zsh, lf, fzf, tmux, htop, less, mostи visidata,
. и никто не говорит о том, что вы хотите. Так что, если какое-то программное обеспечение может сделать это в терминале, это, по крайней мере, крайне редко.
Единственные случаи, когда я видел что-то похожее наC-Left, C-Right(цитату из man tmux), это примерно любой Ctrl нажатый с стрелкой влево или вправо(Это действительно означает Левый или правый Ctrl):есть также C-Up, C-Down, хотя на обычной клавиатуре нет клавиши вверх/вниз Ctrl .


Вы не можете с zsh(, предполагая, что руководство zshверно):
после того, как поискman zshall(man zshне завершен ), я вижу, что есть ярлык Ctrl + v для:

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

Итак, теперь я пробую любой Ctrl + vлевый Ctrl + a или любой Ctrl + vправый Ctrl + a , оба показывают мне ^A, это означает, что оба помещают один и тот же символ (, проверяя это также с помощью vimи нажимая ga , я вижу, что это второй asciiсимвол со значением 0x01). Таким образом, zsh, вероятно, не делает никакого различия между Left Ctrl и Right Ctrl .

Если я нажимаю любой Ctrl + vПравый Ctrl (только ), ничего не происходит.
И vim, и zshговорят мне одно и то же :они не знают, когда клавиша Ctrl нажата без клавиши,
в то время как необычные клавиши, такие как Ctrl + vF1(по крайней мере, необычные в терминале )дают мне что-то:^[OPс zshили <F1>с vim. Значение F1 можно распознать с помощью клемм.


Оболочка, подобная zsh, может работать внутри tmux, а tmuxимеет функцию send-keys, которая не делает различий между Left Ctrl и Right Ctrl . Это означает, что вы не сможете делать то, что хотите в общем случае.

Чтобы быть уверенным, я также искал в tmuxисходном коде (я получил его с помощьюgit clone tmux)и попытался rgrep -i "ctrl\|control" | grep -i "right\|ctrl.\?r\|r.\ctrl"увидеть каждый раз, когда он говорит о правой клавише 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имеет функцию клавишного аккорда . Это не совсем официальные модификаторы(Shift или Control или Alt и т. д. ), но это может заставить обычную клавишу действовать как модификатор при нажатии с некоторым другой ключ с некоторой задержкой. emacsможно запустить из терминала снаружи, а внутри emacsможно запустить оболочку. Так что, может быть, вы можете :
    • переназначить правый Ctrl на что-то (давайте называть егоfoo)везде, используя setxkbmapили xmodmap.
    • внутри emacs, переназначьте fooобратно на right control, используя key-chordдля некоторых частей, но не для того места, где вы запускаете zsh.
    • обратите внимание, что я не проверял это, и, если возможно, это не так простой, но emacs— единственный «эмулятор терминала», который я знаю (на самом деле, он должен быть текстовым редактором, но у него много функций,включая запуск оболочки )с функцией, близкой к «что-то, являющееся одновременно модификатором и обычным ключом».
2
28.04.2021, 22:52

Теги

Похожие вопросы