Найти и изменить некоторые кодировки LaTeX в vim, используя регулярные выражения?

Как изменить следующую кодировку LaTeX:

\cite{1,3-7,9} 

в

 \cite{1,3,4,5,6,7,9} 

в vim? Я бы предпочел использовать регулярные выражения.

Вы можете использовать команду substitute vim для выполнения этого:

 :%s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/g 

Это заменит все вхождения \cite{1,3-7,9} \cite{1,3,4,5,6,7,9} .

Чтобы заменить только те вхождения, которые существуют в текущей строке, вы можете использовать:

 :s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/g 

Добавьте c если вы хотите, чтобы vim попросил подтверждения, прежде чем менять какие-либо строки. Например:

 :%s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/gc 

Чтобы расширить любой отдельный экземпляр диапазона формы mn в выражении \cite{...} , вы можете сделать что-то вроде

  perl -pe 's/\\cite{(?:\d+,)*\K(\d+)-(\d+)(?=(?:,\d+)*})/sprintf "%s", join(",", ($1..$2))/e' file.tex 

С моим плагином PatternsOnText вы можете ограничить :substitute команды на соответствие шаблонам ( \cite{...} в вашем случае):

 :%SubstituteInSearch/\\cite{[^}]\+}/\(\d\+\)-\(\d\+\)/\=join(range(submatch(1),submatch(2)), ',')/g 

Регулярное выражение анализирует начальные и конечные числа и преобразует их в диапазон чисел через join() и range() , используя :help sub-replace-expr .

Часто vim поставляется вместе с Perl.

Возможность использования perl (или аналогичного) в Vim может быть применима.

Когда у вас есть +perl , вы можете использовать :perldo + @steeldriver (фактически небольшое изменение):

 :perldo s/\\cite{(?:\d+,)*\K(\d+)-(\d+)(?=(,.*?)?})/sprintf "%s",join(",", $1..$2)/e