通过:g / ^ / norm和:%norm了解行参考差异


8

假设我有以下非常简单的文件

a
b
c
d
e

并且我决定要在每行之后添加空行。我立即想到了几种不同的方法。我们可能会这样做(从而接受失败)。我们可能会录制一个类似的宏,qqo<ESC>jq并重复几次。

在我看来,另外两种方法似乎更明显。

首先,我想我会在每行上发出:norm命令o。所以我跑了:%norm o。但是实际发生的是,我们得到5条空行,然后是上面未分隔的行。我的解释是%norm,vim实际上在这五行文件的前五行中接收了以下普通命令发出的消息。该o命令创建新行,并且vim是“哑”的,因为它是通过行号而不是实际上通过其他标识符来引用的。

好吧,我很尴尬。当然。我尝试了其他一些方法,看看是否可以使上述方法起作用,但是,我不能。出于好奇,我尝试了另一种我最喜欢的大规模应用方法。这导致我尝试:g/^/norm o。令我惊讶的是,这很好!因此,在我看来,这里的vim似乎并不像上面那样“愚蠢”,并且引用行的不仅仅是行号。

到底是怎么回事?


2
附带说明:您也可以像这样::%s/$/\r/或这样::%s/\n/\r\r/。结论是换行符可以与匹配\n,但必须像\r替换值中那样写。
lcd047

Answers:


9

好,%是的简写1,$(从第一行到最后一行的范围)。来自:he :%

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number
        .               the current line                          :.
        $               the last line in the file                 :$
        %               equal to 1,$ (the entire file)            :%

对于:global

The global commands work by first scanning through the [range] lines and
marking each line where a match occurs (for a multi-line pattern, only the
start of the match matters).
In a second scan the [cmd] is executed for each marked line with its line
number prepended.  For ":v" and ":g!" the command is executed for each not
marked line.  If a line is deleted its mark disappears.

因此,第一种情况就像在修改列表时遍历列表,因此列表元素上的计数器变为无效。在第二种情况下,我们会一遍标记要定位的元素,这样即使在第二遍中修改了列表,我们仍然知道我们要处理哪些元素。


嗯,甚至在全局帮助文件中。我真傻 谢谢
davidlowryduda 2015年

男人-这g 是矫crazy 过正,疯狂有用。我要花更多的时间从普通的vi用户转变为高级用户
javadba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.