我正在处理LaTeX文档。我需要重新格式化我在vim中所有打开缓冲区中的子节标题。
通常,当我需要修改所有缓冲区时,我会在vim内部执行bufdo %s/pattern/replacement/g | update
之类的命令。这就是我打算再做的事情。我需要帮助的是模式和替换字符串。
我需要匹配的字符串具有以下格式:
\subsection{word}
\subsection{some words}
\subsection{some Words CAPitalized weirdlY}
\subsection{and some with $\control$ sequences in them}
结果搜索和替换应该影响字符串如下所示:
\subsection{Word}
\subsection{Some Words}
\subsection{Some Words Capitalized Weirdly}
\subsection{And Some With $\control$ Sequences In Them}
到目前为止,我尝试过的搜索字符串是:
%s/\\subsection{\(.\)\(\w*\)}/\\subsection{\u\1\L\2}/gc
。 %s/\\subsection{\v<\(.\)\(\w*\)}/\\subsection{\u\1\L\2}/gc
数字1仅匹配单个单词并将其转换为正确的格式。
2号不起作用。我的目标是将以下链接中的SO答案中引用的序列与我的需求结合起来,但我想我没有正确使用它。
我试图用来解决这个问题的资源:
注意:如果我必须返回并重新输入$\control
个字符,如果替换也将它们大写,我会对此感到满意。
答案 0 :(得分:2)
bufdo %s/\%(\\subsection{.*\)\@<=\%(.*}\)\@=\<\(\w\)\(\w*\)\>/\u\1\L\2/gc
这应该将\subsection{....}
块内的所有内容都大写,不幸的是包括内部数学序列,但每次都会要求您进行确认。搜索比链接的“上一个问题”更复杂:
\%( non-capturing group
\\...{ literal `\subsection{`
.* any number of characters
\) end of group
\@<= zero-width lookbehind
\%( non-capturing group
.* any number of characters
\) end of group
\@= zero-width lookahead
\< zero-width start of word
\( start of 1st group
\w word letter
\) end of group
\( start of 2nd group
\w* any number of letters
\) end of group
\> zero-width end of word