我正在学习Vim模式,并且对列位置匹配定义感到困惑。下面我做非常简单的测试。
只需在第一行第一列类型中创建一个文件:123456789
。
只需让我轻松跟踪每个数字所在的列号。
然后我搜索/.\%>3c.*\%<8c
,它匹配3456
并且看似合理,因为文档说明\%<8c
将匹配第7列并且它是零宽度匹配,因此它最多只匹配6。
但是我搜索/\%>3c.*\%<8c
,这次Vim匹配4567
。那么为什么这次它匹配7 ???这似乎不合理。
我的Vim版本是最新版本:7.4包含的补丁:1-884。
答案 0 :(得分:1)
如果您的目标是搜索大于3且小于8的列位置,则不需要点或星号,这就足够了:
/\%>3\%<8
如果您对在搜索中添加点和/或星星的不直观行为有疑问,那么是的,这是令人困惑的。我相信在这种情况下,明星是多余的。只需搜索:
,您就可以获得与之相同的行为(数字4-6找到)/ \%GT; 3 \%LT; 8
我认为点被认为是搜索的限制性标准。换句话说,列位置必须有一个字符。所以搜索例程运行如下:是否有一个列位置4,其中一个字符位于第五位?是的,将其添加到结果中;列位置6是否在第7位有一个字符?是的,加上它;是否有一个列位置7,第8个位置有一个字符?否 - 因为零宽度标准不包括第8个位置或更高位置(\%&lt; 8)。要将字符包含在八个位置,可以在8c之后添加另一个点,然后找到4-7,例如:
/\%3c.\%<8c.
但请注意,这只是让我们回到第一个例子:
/\%>3\%<8 <=> /\%3c.\%<8c.
答案 1 :(得分:0)
我想我可能得到了答案。 实际上有两个匹配,第一个匹配是456,第二个匹配是第7列的空字符串。当设置hlsearch时,它将突出显示4567,因为第二个匹配是第7列的空字符串匹配,以使匹配明显,vim还会突出显示该列的字符。这就是我想的,如果我错了,请纠正我。