Заменить совпадающие круглые скобки охватывающим содержимым

вкратце: это возможно, но сложно, как привязки .inputrc .

long: Как предложено в комментарии, вы можете сделать что-то подобное в командной строке bash и в привязках строки чтения.

Сохранение / восстановление курсора будет неэффективным, поскольку единственная точка, в которой вы сможете надежно очистить остальную часть экрана, будет нажатием Enter для завершения выбора.

После передачи управления accept-line уже слишком поздно очищать оставшуюся часть экрана. Возможно (но сложно) определить серию реальных и специальных «привязок клавиш», чтобы заставить readline выполнять более одной операции. См., Например,

Но этот подход ограничивает вас отправкой символов в bash и выдачей команд в readline. Ни одна из команд readline не очищает

printf '\033[J'

остаток экрана. Ближайшим из них будет встроенный в readline clear-screen (, а не , что вы хотите). Ваша привязка должна сделать что-то вроде

  • начало строки
  • вставить « printf '\ 033 [J'; »
  • конец строки
  • accept-line

конец строки работал бы вокруг причуды readline. Это позволяет вам нажать Enter в любом месте на линии. Если бы ваш курсор был в середине строки, у вас был бы только фрагмент вашего ввода, оставшегося видимым (хотя bash получил бы всю строку).

3
16.02.2017, 12:37
1 ответ

Даже в самом простом вопросе, с которого вы начинаете, скрывается некоторая сложность. Я бы начал с

sed -E 's/\(([^()]*)\)/\1/'

, повторенного до тех пор, пока не осталось скобок пар . Это заменяет самый внутренний текст:

$ echo "((body))" | sed -E 's/\(([^()]*)\)/\1/'
(body)

Однако, как предлагает Кусалананда , для удаления команд TeX вы должны проверить Detex , который доступен в TeX Live (и в большинстве дистрибутивов). Такая обработка требует большего, чем совпадение скобок или фигурных скобок: вам нужно немного знать о поведении различных команд. Даже в вашем примере \ color необходимо обработать одним способом, \ textbf другим ...

0
27.01.2020, 21:46

Теги

Похожие вопросы