Vim:搜索并替换出现在两个其他指定单词之间的每个单词

问题描述 投票:0回答:1

我目前正在使用 Vim 用 LaTeX 编写数学文本,这涉及到很多矩阵。我的问题的关键在于,命令

\dots
应该在数学环境中随处使用,用于打印 3 个连续点 (
),并自动处理对齐,但无论何时它看起来都不太好(我认为)用于类似矩阵的环境中。

因此,我想将所有类似矩阵环境中发生的

\dots
的所有实例更改为
\cdots

我使用的所有类似矩阵的环境都以单词

matrix
结尾,所以我尝试了以下操作:

:s%/\(\\begin{.*matrix}.*\)\\dots\(.*\\end{.*matrix}\)/\1\\cdots\2/g

但是,它并没有像我希望的那样工作,因为它一次只更改一个实例(在每个矩阵环境中),并且似乎模式匹配只发生在一行上,从而阻止了所有实例的写法

\begin{pmatrix}
  1 & 2 & 3 & \dots & n   \\
  2 & 1 & 2 & \dots & n-1 \\
  3 & 2 & 1 & \dots & n-2 \\
  \vdots & \vdots & \vdots & \ddots &\vdots \\
  n & n-1 & n-2 & \dots & 1
\end{pmatrix}

待更正...

我对 Vim 的经验不是很丰富,但我怀疑我提到的第二个问题应该是相当标准的解决方案,并且第一个问题可能可以使用一些解决方法来解决?

只解决第二个问题是可以接受的,因为我想我不会编写超过 10 行的矩阵,所以我可以简单地运行命令 10 次来处理第一个问题。但是,我非常感谢有一种方法可以解决这两个问题(在有限数量的步骤中,不依赖于我们搜索的单词出现的次数),因为这对于其他情况会很有趣(例如替换所有出现的单词)括号中是另一个词)。

replace vim
1个回答
0
投票

:s%/…
是拼写错误还是您实际输入的内容?我希望是
:%s/…

另外,(固定?)命令:

:%s/\(\\begin{.*matrix}.*\)\\dots\(.*\\end{.*matrix}\)/\1\\cdots\2/g

抛出:

E486: Pattern not found: \(\\begin{.*matrix}.*\)\\dots\(.*\\end{.*matrix}\)

这里。

无论如何,在这种情况下,单一替换对我来说似乎并不合适,因为您的要求有点难以表达为单一模式。相反,我会用

:help :global
来完成,这有助于我将问题分解为可管理的块:

:g/\\begin{.*matrix/.,/\\end{.*matrix/s/\\dots/\\cdots/g

地点:

  • :g/<pattern>/<command>
    <command>
    匹配的每一行执行
    <pattern>
  • \\begin{.*matrix
    是与每个矩阵开头匹配的
    <pattern>
  • .,/\\end{.*matrix/s/\\dots/\\cdots/g
    是在每条匹配行上执行的
    <command>
  • .,/\\end{.*matrix/
    是赋予
    :help :range
    :help :s
    ,覆盖从匹配行(
    .
    )到矩阵末尾(
    /\\end{.*matrix/
    )的每一行,
  • 其余部分是非常简单的替换。
© www.soinside.com 2019 - 2024. All rights reserved.