首页 > 解决方案 > 在 Vim 中用新行替换空格

问题描述

我正在尝试用大括号内的新行替换所有空格。这就是我所做的:

但 Vim 只替换第一次出现的空格。我不确定我在这里错过了什么。这是我正在执行此操作的行:

import { setNotificationContent, toggleContext, resetContext } from '../../redux/modules/wrapper/wrapper'

标签: vim

解决方案


这是正在发生的事情。您首先使用 选择可视区域vi{。这将设置两个标记<和的位置>。由于 .该s命令仅在这些标记内匹配\%V 但是在第一个被换行符替换后,这些标记是什么意思?“视觉区域”的旧概念当然已经不复存在,但问题是替代命令是否能够跟上被替换文本的新概念。我猜 vim 大致“进行替换并将当前行号增加插入的换行符的数量。” 通常这工作得很好,但是你\%V的匹配中有运算符,所以在当前行号增加后没有任何匹配。(查看源代码了解更多详情,点击ctrl-f multi-line找到相关部分)。

要在这种情况下获得您可能想要的替换,您可以使用:

s/\({\|,\) \| }\@=/\1\r/g

要了解视觉选择是如何真正设置这些标记的,请选择一些视觉区域,然后按gv。它将重新选择该可视区域。点击:marks查看 和 的<位置>。现在编辑您之前选择的区域,并检查标记的位置是否发生了变化(其他标记也是如此)。请注意,vim 有点聪明,并且会在上面插入或删除某些行时跟踪正确的行号,但它不会更新列号。

要查看当前行在多次替换时如何递增,请尝试一下。假设我们有这条线:

aaa

现在,我们运行s命令:

:s/a/\= line('.') . '_'/g

\=用表达式的结果替换字符串,请参阅:help sub-replace. 结果应该类似于

6_6_6_

我在第 6 行,这就是为什么我的结果如此金属。现在,undo 并运行以下s命令:

:s/a/\= line('.') . "\n"/g

现在,_我们在行号之后添加一个换行符,而不是一个。我得到结果:

6
7
8

因此,line('.')每次都在不同的当前行上调用该函数。多田!

哦,是的,vim 跟踪标记的方式的一个有趣的原因是,如果你有以下几行:

import { something, something, something
}

然后执行ga{(!not giv),运行s命令

s/\%V /r/g

您大致获得了您想要的行为(取决于您是否删除了尾随空格)。证明留作练习和研究任务,说明您为什么需要ga{和不需要gi{(提示:查看:help {:help exclusive)。


推荐阅读