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

91

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

SiegeX
источник

Ответы:

165

Вы можете определить последовательность символов, выдаваемую клавишей, нажав 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"

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

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

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

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

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

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

Приостановлено до дальнейшего уведомления.
источник
2
Что, если я хочу добавить привязку к «ctrl + q»?
kubudi
5
@kubudi: bind '"\C-q": menu-complete'например (или в вашем ~/.inputrc: "\C-q": menu-complete). Вам также может понадобиться stty -ixonв вашем ~/.bashrcотключить контроль потока и сделать ^ S и ^ Q доступны.
Приостановлено до дальнейшего уведомления.
Вы говорите, что это ^[представляет, escа затем, кажется, заменяете это \eв своем примере. Не могли бы вы объяснить почему?
Remover
1
@Remover: ^[это выходное представление. Это \eодин способ войти (для ^[этого не работает).
Приостановлено до дальнейшего уведомления.
Как привязать "\ Cz"? Я бы хотел получить что-то вроде того, что описано для zsh на sheerun.net/2014/03/21/how-to-boost-your-vim-productivity
pkoch
19

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

<символ ключа или имя ключа>: макрос

например:

Control-o: "> output"

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

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

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

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

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

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

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

Бартон Читтенден
источник
4
вы можете использовать "\ n" в макросе, чтобы добавить символ новой строки:
Бартон Читтенден,
Для меня это работает лучше, поскольку он определяет отображение клавиш при открытии терминала.
Heldraug
Для Altиспользования \e, например "\eo": "> output".
Янис Элмерис
Более подробное руководство по использованию .inputrcсм. На hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
Джош Хабдас
1
@ArthurHenriqueDellaFraga Я отредактировал ответ; он будет в вашем домашнем каталоге. Если его не существует, вы можете его создать.
Бартон Читтенден
7

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

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

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

Уэсли Райс
источник
Имейте в виду, что это не то же самое, что оболочка, выполняющая команду. Если вы действительно хотите запустить команду, вам придется нажать ввод (или отправленная строка сделает это за вас). Наверное, тоже захочется перестраховаться и сначала очистить линию.
Cascabel
2
Это было бы здорово, но в Fedora 20 это все равно не работает. Я даже попытался использовать xev, чтобы сначала найти правильный код клавиши для F12 (в моем случае 96) и использовать его вместо 88. Ни один из них не работает.
BobDoolittle,
2

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

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

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

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

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

Петер Перхач
источник