vim - 在 Vim 中用新行替换空格
问题描述
我正在尝试用大括号内的新行替换所有空格。这就是我所做的:
- 选择里面的内容(
vi{
) - 运行替代命令:
s/\%V /\r/g
但 Vim 只替换第一次出现的空格。我不确定我在这里错过了什么。这是我正在执行此操作的行:
import { setNotificationContent, toggleContext, resetContext } from '../../redux/modules/wrapper/wrapper'
解决方案
这是正在发生的事情。您首先使用 选择可视区域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 行,这就是为什么我的结果如此金属。现在,u
ndo 并运行以下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
)。
推荐阅读
- python - 比较时间和价值
- scala - 有没有办法获取早期管道 Scala 进程 (#|) 的退出代码?
- jquery - 如何单击锚链接打开子菜单?
- css - 为什么 CSS 'padding' 在我的元素中创建边距?
- javascript - javascript对象格式化程序的递归实现以错误的顺序返回数据
- php - 如何foreach另一个表中不存在的数据CodeIgniter
- javascript - AngularJS / Promises / DataTables - 表中没有数据
- python - pyspark:根据其他记录获取列
- c++ - C ++:引用二维数组?为什么这个功能有效
- php - php中两次微秒之间的差异