Autoclose GNU Readline

Работа над различными интерфейсами командной строки на основе GNU Readline, и это значительно ускорило бы меня, если бы был способ автоматически закрывать скобки и кавычки при вводе текста.

Таким образом, набрав ' или же ( на Bash (или других CLI) фактически добавит закрывающую кавычку или скобку '' или же () и поместите курсор между ними для записи.

Я довольно долго осматривался, пытаясь выяснить что-нибудь связанное (например, ~/.inputrc настройки), но ничего не нашел, и мне интересно, если это вообще достижимо. Любые замечания будут оценены.

2 ответа

Решение

Это немного сложно, но выполнимо. Как bash команда:

bind '"(" "\C-v()\e[D"'
bind '"\"" "\C-v\"\C-v\"\e[D"'

Как настройка в .inputrc (так что любая программа, использующая readline получает поведение):

"(": "\C-v()\e[D"
"\"": "\C-v\"\C-v\"\e[D"

Вы можете поставить перед каждым ключом клавишу Control-v, чтобы вводить "простые" кавычки и левые скобки, не вызывая поведение автоматического закрытия.

Вышеприведенное предполагает использование комбинаций клавиш Emacs. Для привязок vi используйте

bind '"(": "\C-v()\ei"'
bind '"\"" "\C-v\"\C-v\"\ei"'

или же

"(": "\C-v()\ei"
 "\"": "\C-v\"\C-v\"\ei"

По сути, просто замените [D с i; вместо отправки escape-последовательности для перемещения курсора влево, просто отправьте \e вернуться в командный режим после вставки скобок / кавычек, а затем снова войти в режим вставки, при котором курсор должен находиться внутри только что введенных символов.

Делать именно то, что вы хотите, невозможно, но есть обходной путь. Поместите это в inputrc:

"\C-x\"": "\"\"C-b"

Бежать:

info readline "comm" "readline init" "sample"

для всего образца.

Другие вопросы по тегам