Автозакрытие GNU Readline

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

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

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


person nikola    schedule 14.07.2012    source источник


Ответы (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"'

or

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

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

person chepner    schedule 26.07.2012
comment
Все это хорошо, но если у меня есть set editing-mode vi, это выводит меня из режима вставки после автодополнения, что довольно раздражает. Можно ли это исправить? - person qed; 06.03.2014

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

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

Бегать:

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

для всей выборки.

person xojoc    schedule 25.07.2012
comment
Не невозможно, просто запутанно. - person chepner; 26.07.2012