Хитрость заключается в том, чтобы вызывать функции, которые переплетают ваши клавиши. В моем примере я буду использовать 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
, потому что вдруг что-то разрывает цепочку в неправильном месте, и вы застреваете в терминале без способа выполнения команд :)