У bash, як я можу прив'язати функціональний ключ до команди?


91

Приклад: Я хочу прив'язати F12ключ до команди echo "foobar"таким чином, щоб кожного разу, коли я натискаю F12повідомлення "foobar" буде друкуватися на екрані. В ідеалі це може бути будь-яка довільна команда оболонки, а не тільки вбудовані. Як можна це робити?

Відповіді:


163

Ви можете визначити послідовність символів, що видається клавішею, натиснувши 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). Синтаксис є

<keyym або назва клавіші>: макрос

наприклад:

Control-o: "> output"

створить макрос, який вставить "> вихід" при натисканні ControlO

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

створить макрос, який вставляє "echo foobar" при натисканні F1... я не знаю, що не вдається виконати keyym F11.

Редагувати:

.inputrcрозуміє \nпослідовність входів для подачі лінії , тому ви можете використовувати

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

Що ефективно "натисне клавішу Enter" після видачі команди.


4
Ви можете використовувати "\ n" в макросі, щоб додати символ нового рядка:
Barton Chittenden

Для мене це працює краще, оскільки воно визначає відображення ключів при відкритті терміналу.
Heldraug,

Для Alt, використовуйте \e, напр "\eo": "> output".
Яніс Елмеріс

Для підручника більш поглибленого по використанню .inputrcсм hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
Джош Habdas

1
@ArthurHenriqueDellaFraga Я редагував відповідь; він буде у вашому домашньому каталозі. Якщо він не існує, ви можете створити його.
Barton Chittenden,

7

Це рішення є специфічним для середовищ X11 і не має нічого спільного з bash, але додає наступне до своїх .Xmodmaps

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

надішле рядок "foobar" на термінал після натискання клавіші F12.


Майте на увазі, що це не те саме, що оболонка, що виконує команду. Якщо ви насправді хочете запустити команду, вам доведеться натиснути клавішу Enter (або щоб надісланий рядок зробив це за вас). Можливо, також хочеться бути в безпеці і спочатку очистити лінію.
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"'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.