Пример: я хочу привязать ключ F12 к команде echo "foobar"
, чтобы каждый раз, когда я нажимал F12, сообщение "foobar" будет напечатано на экране. В идеале это может быть любая произвольная команда оболочки, а не только встроенные. Как это можно сделать?
В bash, как мне привязать функциональный ключ к команде?
Ответ 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"'