Vim是否有办法定义正则表达式定义的关键字?

whhtz7ly  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(111)

我希望将Vim视为符合以下条件关键字字符串:

( "(" <scope> ")" [:_/] ){0,1} <name>

其中:

<scope> = [@+-.] ( ":" <name> )*
<name>  = [a-zA-Z][a-zA-Z0-9_]*

描述关键字定义的正则表达式可能如下所示:

\(([@_-.]\(:[a-zA-Z][a-zA-Z0-9_]*\)*)\){0,1}[a-zA-Z][a-zA-Z0-9_]*

一些具体的例子:

(@:a):f
(+:b:c)_v
(-)/p
n

使用Vim的setiskeyword似乎不能处理正则表达式。
我曾考虑过以下表达式:

let @/ =~ '\<'.expand('<cword>').'\>

但似乎也不能胜任这项任务。
这种方法的用例是键入 * 来搜索与光标下的正则表达式匹配的单词。
我还考虑了**%#是否可能是解决方案的一部分;然而,这似乎需要将正则表达式拆分为前置部分和后置部分。
Vim有没有办法用正则表达式定义关键字,用于在光标下启动搜索,然后使用
np来查找下一个和上一个匹配项?解决方案不一定需要涉及iskeyword**。我怀疑使用**@/**是解决方案的一部分。你的想法是什么?

mhd8tkvw

mhd8tkvw1#

正如您所注意到的,不能用正则表达式模式定义“keyword”,而且,Vim没有<cpattern>来重用光标下的“pattern”,甚至没有[:pattern:]字符类来匹配“patterns”。
换句话说,你可以完美地做到:

:let @/ = '<arbitrary regex pattern>'

但你不能这样做:

:let @/ = buildpatternfromstring()

这意味着你面前有两个难题:
1.抓取光标下的 pattern(什么构成了模式?模式从哪里开始?模式从哪里结束?)。
1.将其 * 手动 * 转换为适当的Vim模式。
而且没有内置的低级助手供您使用。

相关问题