在Vim(或插件)中是否有办法搜索一个术语并按列(而不是行)遍历搜索结果(按照Vim中的n
)?所以,如果我的文件是这样的:
foo1 bar bar
baz baz foo3
baz baz foo4
foo2 bar bar
如果我搜索foo
,我想按1,2,3,4的顺序迭代结果。通常情况下n
会让我按顺序移动1,3,4,2。
我希望这能够在一个巨大的固定宽度数据文件或CSV文件中浏览搜索结果,其中列代表字段。
(我也会选择在Emacs中这样做的方式。)
答案 0 :(得分:3)
看到这个问题后,我决定尝试编写一个vim插件来处理它。这是我的第一个vim插件,所以它可能非常糟糕。但是,它确实适用于您提供的示例。
您可以从vim.org下载插件:SearchCols.vim
请注意,它还需要来自同一网站的多项插件:multvals.vim
它创建一个命令:SearchCols <string>
,可用于搜索固定宽度列中的<string>
,以便搜索首先查找第一列,然后查看第二列,等等。而不是逐行搜索,这是vim的标准。通过@:
然后@@
重复命令,因为它是冒号命令。
假设:
我能想到的明显改进是使搜索下一个项目比使用@:
和@@
更容易,包括搜索突出显示(代码在那里,但它被注释掉,因为它使用{ {1}}并且您必须使用:match
将其关闭),并消除对multvals.vim的依赖。
答案 1 :(得分:2)
编辑:我刚刚找到了对表here使用vim正则表达式的概述。这比我的业余尝试更清洁(尽管这也有效);):
搜索^foo
将搜索第一列,而搜索.*\ foo
将搜索第二列,.*\ .*\ foo
将搜索第三列。
这当然不完整,因为它匹配从行首开始的整个块,因此它会找到foo3和foo4,但将光标放在位置0。
然而,您可以使用录制功能自动执行此操作。在正常模式下输入以下内容:
qa/.*\ .*\ foo
/foo
q
(我使用新行表示你应该点击返回键)。
这会在寄存器下面进行两次搜索(qa开始在a下记录,qb在b下等)。现在点击@a
,您应该只搜索第三列....
我确定你可以把它变成一个带有列号的命令,但我现在不在了,抱歉:)