В bash, как связать функциональную клавишу с командой? - PullRequest
83 голосов
/ 17 ноября 2010

Пример: я хочу связать клавишу F12 с командой echo "foobar", чтобы при каждом нажатии F12 на экран выводилось сообщение «foobar».В идеале это может быть любая произвольная команда оболочки, а не просто встроенная команда.Как можно это сделать?

Ответы [ 4 ]

143 голосов
/ 17 ноября 2010

Вы можете определить последовательность символов, выдаваемую клавишей, нажав Ctrl - v в командной строке, а затем нажав интересующую вас клавишу. В моей системе для F12 , я получаю ^[[24~.^[ представляет Esc .Разные типы терминалов или эмуляторов терминалов могут выдавать разные коды для одного и того же ключа.

В приглашении Bash вы можете ввести такую ​​команду, чтобы включить макрос ключа, чтобы вы могли опробовать его.

bind '"\e[24~":"foobar"'

Теперь, когда вы нажмете F12 , вы получите «foobar» в командной строке, готовый для дальнейшего редактирования.Если вы хотите, чтобы нажатие клавиши сразу же вводило команду, вы можете добавить новую строку:

bind '"\e[24~":"pwd\n"'

Теперь, когда вы нажимаете F12 , вы увидите текущий каталог без необходимости нажимать Введите .Что если вы уже набрали что-то в строке и используете это, которое автоматически выполняется?Это может стать грязным.Однако вы можете очистить строку как часть вашего макроса:

bind '"\e[24~":"\C-k \C-upwd\n"'

Пробел гарантирует, что Ctrl - u есть что удалить, чтобы сохранитьзвонок от звонка.

После того как макрос работает так, как вы хотите, вы можете сделать его постоянным, добавив его в файл ~/.inputrc.Нет необходимости в команде bind или внешнем наборе одинарных кавычек:

"\e[24~":"\C-k \C-upwd\n"

Редактировать:

Вы также можете создать привязку ключа, которая будет выполнятьчто-то, не мешая текущей командной строке.

bind -x '"\eW":"who"'

Затем, когда вы набираете команду, например, для которой требуется имя пользователя, и вам необходимо знать имена пользователей, которые вошли в систему, вы можете нажать Alt - Shift - W и вывод who будут отображены, и приглашение будет повторно выдано с вашей частичной командой без изменений и курсором вта же позиция в строке.

К сожалению, это не работает должным образом для таких клавиш, как F12 , которые выводят более двух символов.В некоторых случаях это можно обойти.

Командой (в данном случае who) может быть любой исполняемый файл - программа, скрипт или функция.

16 голосов
/ 17 ноября 2010

Вы можете определить привязки клавиш bash в .inputrc (файл конфигурации для библиотеки GNU Readline). Синтаксис

: макрос

например:

Control-o: "> output"

создаст макрос, который вставит «> вывод» при нажатии Control O

 "\e[11~": "echo foobar"

создаст макрос, который вставит «echo foobar», когда вы нажимаете F1 ... Я не знаю, какая клавиатура для F11 не в руки.

7 голосов
/ 17 ноября 2010

Это решение относится к средам X11 и не имеет ничего общего с bash, но добавляет следующее в ваши .Xmodmaps

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

отправит строку «foobar» в терминал после нажатия F12.

2 голосов
/ 20 июля 2018

Я хотел связать Ctrl+B с командой.Вдохновленный ответом выше, я попытался использовать bind, но не смог выяснить, какие серии загадочных загогулинов (\e[24~?) Переводят в Ctrl+B.

. На Mac перейдите в НастройкиПриложение терминала, «Профили» -> «Клавиатура» -> +, затем нажмите сочетание клавиш, которое вам нужно, и оно выйдет.Для меня Ctrl+B привело к \002, который я успешно связал с командой

bind '"\002":"echo command"'

Кроме того, если вы хотите, чтобы команда была выполнена сразу (не просто вставлена ​​вподсказка), вы можете добавить Enter в конец вашей команды, например так:

bind '"\002":"echo command\015"'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...