Пример: я хочу привязать 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"'