Как заменить соответствующие разделители в vi? - PullRequest
2 голосов
/ 16 сентября 2011

У меня есть некоторый текст, который соответствует разделителям (в данном случае, фигурные скобки, и текст оказывается LaTeX, который является только случайным):

\nb{\vec{n},\vec{y}} \in \vec{z}

Что я хотел бы сделать, этоглобально замените \nb{...} на (...), соблюдая при этом вложенность разделителей.То есть, результат должен быть

(\vec{n},\vec{y}) \in \vec{z}

, а не

(\vec{n},\vec{y}} \in \vec{z)

, что будет производиться :%s/\\nb{\(.*\)}/(\1)/g.Стандартные регулярные выражения не могут обрабатывать совпадающие разделители, поэтому я не ожидал, что этот способ сработает.Есть ли какой-нибудь специфичный для vi прием, который я могу использовать для этого?

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Если у вас установлен round.vim , то вам нужно сделать следующее

:set nowrapscan
:let @q="/\\m\\\\nb{/e+1\<cr>cs{)dF\\@q"
gg@q

Если вы этого не сделаете:

:set nowrapscan
let @q="/\\m\\\\nb{<cr>dt{yi{\"_ca{()\<esc>\"0P@q"
gg@q

Обзор

Создание рекурсивного макроса, который ищет \nb{, позиционирует курсор прямо внутри {, заменяет }{ на ().

Glory of Details

  • :set nowrapscan это предотвращает зацикливание поиска вокруг файла.
  • :let @q="..." сохраняет наш макрос в регистре q
  • /\m\nb{/e+1 для поиска \nb{ и устанавливает курсор после {
  • cs{) версия объемного звучания просто изменит окружающее { с помощью )
  • @q, запустите макрос снова
  • Используется ", поэтому необходимо избегать нескольких вещей, чтобы они работали правильно.
  • gg@q перейти в начало файла и выполнить макрос в регистре q

Версия без объемного звучания здесь немного различается

  • yi{ скопируйте текст внутри { '
  • "_ca{()<esc> измените текствнутри и в том числе { и заменить на ()
  • "0P вставить то, что мы только что скопировали внутри ()
2 голосов
/ 16 сентября 2011

Я бы использовал следующую команду :global.

:g/\\nb{/norm!/^M%r)[{r(dF\\

Введите ^M как Ctrl + V , Введите .

...