Сложное связывание клавиш в bash - PullRequest
10 голосов
/ 03 декабря 2011

Есть ли способ объединить две операции в одну комбинацию клавиш (не думаю, что будет работать с функцией).

Вот что я хотел бы сделать:

Я бы хотел, чтобы привязка клавиш (скажем, Ctrl-X) к -

  1. вставить текст, затем
  2. вызвать полный или полный меню, используя вставленный текст в качестве основы для завершения

Я знаю, что могу (в ~/.inputrc) указать

  • Вставка текста с (C-X: "ls")
  • Выполнять команды readline (C-SPACE: menu-complete)

Но я не уверен, как собрать их вместе

Ответы [ 2 ]

15 голосов
/ 20 декабря 2012

Хитрость заключается в том, чтобы вызывать функции, которые переплетают ваши клавиши. В моем примере я буду использовать C-b для вставки текста и вызова полного меню вместо C-x . Вам придется пожертвовать ключом, в моем примере C-t

В .bashrc или bash-файле для получения

set_Cb_to_insert_text() {
  bind '"\C-m": accept-line'
  bind '"\C-b":"ls \C-t1"'
  bind -x '"\C-t1":set_Cb_to_complete'
}
set_Cb_to_complete() {
  bind '"\C-m":"\C-t2\C-t3"'
  bind '"\C-b": menu-complete'
  bind '"\C-t2": accept-line'
  bind -x '"\C-t3":set_Cb_to_insert_text'
}
set_Cb_to_insert_text

Как это работает:

С помощью bind вы можете связать ключи для выполнения одной из трех задач, но без их комбинации:

  • Выполнить команду readline: bind '"key": command'
  • Выполнить серию нажатий клавиш: bind '"key":"keystrokes"'
  • Выполнить команду оболочки: bind -x '"key": shell-command'

Итак, если вы хотите объединить эти три вещи, вам нужно связать их каждое с отдельной комбинацией нажатий клавиш (в моем примере Ct { 1 , 2 , 3 }) и связать ключ для выполнения всех этих нажатий клавиш.

В примере:

Cb сначала вставляет ls и 'нажимает' Ct 1 , который выполняет set_Cb_to_complete, что, в свою очередь, связывает Cb до menu-complete. Также выполняется повторная привязка Cm , возврат каретки или Введите , поскольку теперь необходимо выполнить две вещи: принять строку и сбросить Cb для вставки ls , вызывая функцию set_Cb_to_insert_text, которая также сбрасывает Введите для обычного использования.

Причина, по которой я сказал, что Ct должна быть "принесена в жертву", заключается в том, что если вы нажмете Ct , readline будет ждать, чтобы увидеть, нажмете ли вы 1 или 2 или любой из связанных последовательностей клавиш, прежде чем он предпримет какое-либо действие. Но когда вы впервые применили C-t для этого использования, вы можете использовать его в качестве начального ключа для огромного количества нажатий клавиш, чтобы покрыть все ваши хитрости readline.

Совет: пока вы пишете и тестируете их, свяжите альтернативный ключ с accept-line, потому что вдруг что-то разрывает цепочку в неправильном месте, и вы застреваете в терминале без способа выполнения команд :)

4 голосов
/ 03 декабря 2011

Это может работать для вас:

"\ex": menu-complete
"\ez": "ls \ex"

Включить эти строки в файл ~/.inputrc.

Эти строки устанавливают Alt-x на menu-complete и Alt-z на ls space menu-complete. Это даст вам первый файл в каталоге и с помощью Alt-x будет циклически перебирать оставшиеся по одному за раз.

См. здесь для большего количества примеров макросов.

Извлекайте команды readline, вызывая bind -p или bind -P, и bind -s покажет макросы, которые у вас уже есть. См. здесь для команды bind, также вы можете сделать один из макросов, см. здесь . Наконец, проверьте, что файл .inputrc читается, у меня возникли проблемы, поскольку переменная окружения была установлена ​​на /etc/Inputrc и моя личная версия никогда не вызывалась.

Кстати, держитесь подальше от Control-x, поскольку он уже используется для многих команд readline.

...