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

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

Ответ 1

Вы можете определить последовательность символов, исходящую от клавиши, нажав Ctrl - v в командной строке, а затем нажав интересующую вас кнопку. В моей системе для F12 я получаю ^[[24~, ^[ представляет 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 есть что-то удалить, чтобы звонок не звонил.

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

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

Edit:

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

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

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

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

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

Ответ 2

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

& lt; keysym или имя ключа & gt;: макрос

например:

Control-o: "> output"

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

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

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

Изменить:

.inputrc понимает escape-последовательность \n для перевода строки, поэтому вы можете использовать

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

Который будет эффективно "нажимать ввод" после выполнения команды.

Ответ 3

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

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

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

Ответ 4

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

На Mac перейдите в "Настройки" приложения "Терминал", "Профили" → "Клавиатура" → + затем нажмите нужную комбинацию клавиш, и она выйдет. Для меня Ctrl+B привел к \002 который я успешно связал с командой

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

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

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