2

我有很多以我定义的一些标签开头的文件。

例子:

=Title
@context
!todo
#topic
#subject
#etc

And some text (notice the blank line just before this text).

Foo
Bar

我想编写一个 Vim 搜索命令(使用 vimgrep)来匹配空行之前的内容。

如何仅在第一个空白行之前的行中 grep?它会更快地执行 grep 操作吗?请,无需提及:grep和二进制之类的Ag - silver search.

我知道\_.*要匹配包括 EOL 在内的所有内容。我知道否定[^foo]。我成功地将除空行之外的所有内容与/[^^$]. 但我没有设法编写我的 :vimgrep 命令。感谢您的帮助!

4

3 回答 3

0

如果您想要一个适用于任何文件内容的通用解决方案,让我告诉您 AFAK,您不能使用这种形式的文本。你可能会问为什么?


  • 解释:


vimgrep需要一个模式参数来逐行进行:global搜索,其行为与cmd完全相同。

对于您的情况,我们需要在第一个空行之前获取第一部分。(可以扩展为:获取第一个非空白文本

让我们调用:

  • A :每个文本块里面不包含任何一个空行

  • x :空行

使用这5种形式的内容文件,您可以获得第一个 A 块vimgrep(情况 2、4、5 很明显):

1 | 2| 3 | 4| 5


x | x| 一个| x| 一种

一个| A| x | A | X

x | x | 一种

一个|

查看您的文件,它具有以下形式:

一种

X

一种

X

一种

中间块会导致一个问题,这就是为什么你不能分割第一个,除非你用一些已知的 UNIQUE text 来分隔它A


因此,对于仅有的5 种情况,我能提出的唯一解决方案是:

:vimgrep /\_.\{-}\(\(\n\s*\n\)\+\)\@=/ %
于 2017-01-12T01:49:04.767 回答
0

AFAIK 你能做的最多的:vimgrep是使用\%<XXl原子在特定行号下方搜索:

:vim /\%<20lfunction/ *.vim

function该命令将在给定文件中找到上述第 20 行的所有实例。

:help \%l

于 2017-01-12T09:59:16.620 回答
-1

[...]总是匹配单个字符。[^^$]匹配不是^或的字符$。这不是你想要的。


您可以做的其中一件事是:

/\%^\%(.\+\n\)\{-}.\{-}\zsfoo/

这匹配

  • \%^- 文件的开头
  • \%( \)- 非捕获组
  • \{-}- ...重复0次或多次(尽可能少)
  • .\+- 1 个或多个非换行符
  • \n- 换行符
  • .\{-}- 0 个或更多非换行符(尽可能少)
  • \zs- 比赛正式开始

这将找到第一次出现的foo,从文件的开头开始,仅搜索非空行。但这就是它所做的一切:您不能使用它来查找多个匹配项。


或者:

/\%(^\n\_.*\)\@<!foo/
  • \%( \)- 非捕获组
  • \@<!- 前面没有修饰符
  • ^- 行首
  • \n- 新队
  • \_.*- 0 个或多个任意字符

这匹配每一次出现的foo任何地方都没有空行(即行首/换行组合)。

于 2017-01-12T01:39:36.647 回答