Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Vim的选择中用新行替换空格_Vim - Fatal编程技术网

在Vim的选择中用新行替换空格

在Vim的选择中用新行替换空格,vim,Vim,我试图用花括号内的新行替换所有空格。这就是我所做的: 选择了里面的内容(vi{) 运行替换命令:s/\%V/\r/g 但是Vim只替换了第一次出现的空格。我不确定我在这里遗漏了什么。下面是我执行此操作的行: 从“../../redux/modules/wrapper/wrapper”导入{setNotificationContent,toggleContext,resetContext} 下面是发生的情况。首先使用vi选择可视区域{。这将设置两个标记的位置。s命令仅在这些标记内匹配,因为\%

我试图用花括号内的新行替换所有空格。这就是我所做的:

  • 选择了里面的内容(
    vi{
  • 运行替换命令:
    s/\%V/\r/g
但是Vim只替换了第一次出现的空格。我不确定我在这里遗漏了什么。下面是我执行此操作的行:

从“../../redux/modules/wrapper/wrapper”导入{setNotificationContent,toggleContext,resetContext}

下面是发生的情况。首先使用
vi选择可视区域{
。这将设置两个标记的位置
s
命令仅在这些标记内匹配,因为
\%V
。但是在第一个
被换行后,这些标记意味着什么?旧的“可视区域”概念当然已经不存在了,但问题是替换命令是否能够跟上被替换文本的新概念。我猜vim大致上是“进行替换并将当前行号增加插入的新行数。”通常情况下,这很好,但您的匹配中有
\%V
运算符,因此在当前行号增加后,将不会匹配任何内容。(有关更多详细信息,请参阅,点击
ctrl-f多行
查找相关部分)

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

s/\({\|,\) \| }\@=/\1\r/g
要了解视觉选择实际上是如何设置这些标记的,请选择一些视觉区域,然后按
gv
。它将重新选择该视觉区域。点击
:marks
查看
的位置。现在编辑您以前选择的区域,并检查标记的位置是否更改注意,vim有点聪明,当上面插入或删除一些行时,它会跟踪正确的行号,但不会更新列号

要查看当前行在多次替换时的增量,请尝试此操作。假设我们有一行:

aaa
现在,我们运行
s
命令:

:s/a/\= line('.') . '_'/g
:s/a/\= line('.') . "\n"/g
\=
将字符串替换为表达式的结果,请参见
:help sub replace
。结果应类似于

6_6_6_
我在第6行,这就是我的结果如此金属化的原因。现在,
u
ndo,运行这个
s
命令:

:s/a/\= line('.') . '_'/g
:s/a/\= line('.') . "\n"/g
现在,我们将在行号后添加一个换行符,而不是

6
7
8
因此,
line('.')
函数每次都在不同的当前行上被调用。Tada

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

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

s/\%V /r/g
你大致得到了你想要的行为(取决于你是否删除了尾随空格)。证明作为练习留下,并研究你为什么需要
ga{
而不是
gi{
(提示:签出
:help{
:help exclusive