按列迭代搜索结果

时间:2009-02-13 21:38:28

标签: vim emacs csv flat-file

在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中这样做的方式。)

2 个答案:

答案 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,您应该只搜索第三列....

我确定你可以把它变成一个带有列号的命令,但我现在不在了,抱歉:)