Завершение кавычек или скобок в bash, без нажатия клавиши TAB

3

Есть ли какой-нибудь способ иметь bash для автозаполнения совпадающих символов, как '"[{(с их правосторонними аналогами? Я хотел бы сделать это без необходимости нажимать вкладку.

Например, ввод строки echo "сразу приведет к этой строке echo "|", где мой курсор (труба) находится между двумя кавычками.

Бонусные баллы, если вы можете найти способ, которым при удалении первой цитаты удаляется и вторая.

Если вы когда-либо использовали какой-либо зрелый текстовый редактор (например, возвышенный текст), вы можете понять, как работает это взаимодействие. Ответы, использующие рыбные раковины, также принимаются.

codysehl
источник

Ответы:

3

Хотя вы не можете привязывать ключи к себе в GNU Readline - что-то вроде "(": "()"дисков с бесконечным циклом - есть способ. Не для readlineвообще, только для bash. Добавьте это к вам .bashrc:

readline-brackets() {
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${1}${READLINE_LINE:$READLINE_POINT}"
    ((READLINE_POINT+=1))
}
bind -m vi-insert -x '"\"" : "readline-brackets \"\""'
bind -m vi-insert -x $'"\047" : "readline-brackets \\\047\\\047"' # SINGLE QUOTE
bind -m vi-insert -x '"<" : "readline-brackets \<\>"'
bind -m vi-insert -x '"(" : "readline-brackets \(\)"'
bind -m vi-insert -x '"[" : "readline-brackets []"'
bind -m vi-insert -x '"{" : "readline-brackets {}"'

Удалить, -m vi-insertесли вы используете emacsрежим, нет vi.

Дмитрий Александров
источник
Это отличный совет! Однако, хотя это нормально работает для обычного случая, я столкнулся с двумя проблемами: * завершение табуляции (т. Е. Допущение $FOOопределено echo ${FO<tab>} results in ${FOO}}) * обработка возврата (то есть: «<backspace>« оставьте нас с »). Любые идеи о том, как справиться с этим?
Lonetwin