3

nVim(或插件)中有没有一种方法可以按列而不是按行搜索一个术语并遍历搜索结果(根据Vim)?所以如果我的文件是这样的:

foo1  bar   bar
baz   baz   foo3
baz   baz   foo4
foo2  bar   bar

如果我搜索,foo我想按 1、2、3、4 的顺序遍历结果。通常n会让我按 1、3、4、2 的顺序穿过它们。

例如,我希望它浏览一个巨大的固定宽度数据文件或 CSV 文件中的搜索结果,其中列代表字段。

(我也会在 Emacs 中找到一种方法来代替。:)

4

2 回答 2

3

看到这个问题后,我决定尝试编写一个 vim 插件来处理它。这是我的第一个 vim 插件,所以它可能非常糟糕。但是,它确实适用于您给出的示例。

你可以从 vim.org 下载插件: SearchCols.vim

请注意,它还需要来自同一站点的 multvals 插件: multvals.vim

它创建一个 command :SearchCols <string>,可用于搜索<string>固定宽度的列,以便搜索首先在第一列中查找,然后在第二列中查找,等等,而不是 vim 标准的逐行搜索. @:通过然后重复该命令,@@因为它是一个冒号命令。

假设:

  • 假设您的文件是用空格分隔的固定宽度列格式化的,即数据项内没有空格,只有在它们之间。
  • 假设文件的第一行已格式化,以便可以从中推断出列宽。

我能想到的明显改进是使搜索下一个项目比使用@:和更容易@@,包括搜索突出显示(代码在那里但它被注释掉,因为它使用:match并且你必须使用:match none它来关闭它),并消除对 multvals.vim 的依赖。

于 2009-02-16T13:50:06.507 回答
2

编辑:我刚刚在这里找到了对表使用 vim 正则表达式的概述。这比我的业余尝试要干净得多(尽管这也有效;)):

搜索^foo将搜索第一列,而搜索.*\ foo将搜索第二列,.*\ .*\ foo并将搜索第三列。

这当然是不完整的,因为它匹配从行首开始的整个块,所以它会找到 foo3 和 foo4 但将光标放在位置 0。

但是,您可以使用录制功能自动执行此操作。在正常模式下准确键入以下内容:

qa/.*\ .*\ foo
/foo
q

(我用新行表示你应该按回车键)。

这会在 a 寄存器下进行两次搜索(qa 在 a 下开始记录,qb 在 b 下开始记录,等等)。现在点击@a,你应该只搜索第三列......

我敢肯定你可以把它变成一个带有列号的命令,但我现在走了,对不起:)

于 2009-02-14T00:06:52.753 回答