我有很多文件以我定义的某些标签开头。
示例:
=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命令。谢谢你的帮助!
答案 0 :(得分:0)
如果您想要一个一般解决方案,适用于任何文件内容,请告诉您AFAK,您无法用那种形式的文字。你可能会问为什么?
vimgrep
需要一个模式参数来逐行搜索 ,其行为与:global
cmd完全相同。
对于您的情况,我们需要获得第一个空行之前的第一部分。 (它可以扩展为:获取第一个非空白文本)
致电:
A :内部不包含任何空白行的每个文本块
x :空行
使用这些仅 5 形式的内容文件,您可以获得带vimgrep
的第一个A区块(情况2,4,5很明显):
1 |
2
| 3 |4
|的 5x |
x
| A |x
|的 AA |
A
| x |A
| <强> Xx |
x
| AA |
查看您的文件,它有以下形式:
A
X
<强> A
X
A
中间区块会导致一个问题,即您无法拆分第一个 A
,除非您使用某些已知的UNIQUE文本来划分它。< / p>
所以唯一的解决方案我只能 5个案例:
:vimgrep /\_.\{-}\(\(\n\s*\n\)\+\)\@=/ %
答案 1 :(得分:0)
使用:vimgrep
,您可以使用\%<XXl
原子在特定行号下方搜索最多的AFAIK:
:vim /\%<20lfunction/ *.vim
该命令将在给定文件中找到第20行以上function
的所有实例。
请参阅:help \%l
。
答案 2 :(得分:-1)
[...]
始终匹配单个字符。 [^^$]
匹配不是^
或$
的字符。这不是你想要的。
您可以做的一件事是:
/\%^\%(.\+\n\)\{-}.\{-}\zsfoo/
匹配
\%^
- 文件的开头\%(
\)
- 非捕获组\{-}
- 重复0次或更多次(尽可能少).\+
- 一个或多个非换行符\n
- 换行符.\{-}
- 0个或更多非换行符(尽可能少)\zs
- 比赛的正式开始这将首先出现foo
,从文件的开头开始,只搜索非空行。但这就是它的全部内容:您无法使用它来查找多个匹配项。
可替换地:
/\%(^\n\_.*\)\@<!foo/
\%(
\)
- 非捕获组\@<!
- not-preceded-by modifier ^
- 行首\n
- 换行符\_.*
- 0个或更多任何角色这匹配foo
每次出现之前都没有空行(即行尾/换行组合)。