В bash, как привязать функциональную клавишу к команде?

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

4 ответов


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

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

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

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

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

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

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

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

как только вы получили макрос, работающий так, как вы хотите, вы можете сделать его постоянным, добавив его в свой . Нет необходимости в bind команда или внешний набор одиночных цитаты:

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

Edit:

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

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

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

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

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


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

: макрос

например:

Control-o: "> output"

создаст макрос, который вставляет "> вывод " при нажатии

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

создаст макрос, который вставляет "echo foobar" при нажатии клавиши F1... Я не знаю, что такое keysym для F11.


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

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

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


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

на Mac, перейдите в Настройки Приложения терминала, профили -> клавиатура -> + затем нажмите комбинацию клавиш, которую вы ищете, и она выйдет. Для меня Ctrl+B в результате 2 который я успешно связал с командой

bind '"2":"echo command"'

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

bind '"2":"echo command5"'