Пример: я хочу привязать F12ключ к команде echo "foobar"
, чтобы каждый раз, когда я нажимаю, F12на экран выводилось сообщение «foobar». В идеале это может быть любая произвольная команда оболочки, а не только встроенные команды. Как это сделать?
Вы можете определить последовательность символов, выдаваемую клавишей, нажав 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
в данном случае) может быть любым исполняемым файлом - программой, скриптом или функцией.
bind '"\C-q": menu-complete'
например (или в вашем~/.inputrc
:"\C-q": menu-complete
). Вам также может понадобитьсяstty -ixon
в вашем~/.bashrc
отключить контроль потока и сделать ^ S и ^ Q доступны.^[
представляет,esc
а затем, кажется, заменяете это\e
в своем примере. Не могли бы вы объяснить почему?^[
это выходное представление. Это\e
один способ войти (для^[
этого не работает).Вы можете определить привязки клавиш bash в
~/.inputrc
(файл конфигурации для библиотеки GNU Readline). Синтаксис:<символ ключа или имя ключа>: макрос
например:
Control-o: "> output"
создаст макрос, который вставляет "> вывод" при нажатии ControlO
"\e[11~": "echo foobar"
создаст макрос, который вставляет "echo foobar", когда вы нажимаете F1... Я не знаю, для чего нужен keyym F11.
Редактировать:
.inputrc
понимает\n
escape-последовательность для перевода строки, поэтому вы можете использовать"\e[11~": "echo foobar\n"
Который будет эффективно «нажимать ввод» после того, как команда будет введена.
источник
Alt
использования\e
, например"\eo": "> output"
..inputrc
см. На hackaday.com/2018/01/19/linux-fu-custom-bash-command-completionЭто решение специфично для сред X11 и не имеет ничего общего с bash, но добавляет следующее в ваши .Xmodmaps
% loadkeys keycode 88 = F12 string F12 = "foobar" %
отправит на терминал строку "foobar" после нажатия F12.
источник
Я хотел привязать
Ctrl+B
к команде. Вдохновленный приведенным выше ответом, я попытался использовать,bind
но не смог понять, в какую серию загадочных закорючек (\e[24~
?) ПеревестиCtrl+B
.На Mac перейдите в «Настройки» приложения «Терминал», «Профили» -> «Клавиатура» ->,
+
затем нажмите нужное сочетание клавиш, и оно появится. Для меня этоCtrl+B
привело к тому,\002
что я успешно привязался к командеbind '"\002":"echo command"'
Кроме того, если вы хотите, чтобы команда выполнялась сразу (а не просто вставлялась в подсказку), вы можете добавить Enter в конец своей команды, например:
bind '"\002":"echo command\015"'
источник