Vim:如何动态创建正则表达式模式

时间:2017-12-06 13:09:19

标签: vim vi

我想将变量连接成正则表达式模式。例如,考虑这种模式的语法匹配从1到3的行。

syn match Title /\%>0l\%<4l.*/

我希望能够动态设置模式中的第二个整数(上例中的&#39; 4&#39;无论b:title_until的值是多少)。我已尝试使用字符串连接但它不起作用。意图应该在下面的例子中清楚:

let b:title_until = 10

if exists("b:title_until")
  syn match Title "/\%>0l\%<" + b:title_until + "l.*/"
end
----------------------------------------------------------------------
> (NFA) Unknown operator '\%
> Invalid character after \%
> Invalid argument: Title "/\%>0l\%<" + b:title_until + "l.*/"

1 个答案:

答案 0 :(得分:4)

一般理论

Vimscript的评估方式与:命令行中输入的Ex命令完全相同。 ex中没有变量,因此无法指定它们。以交互方式键入命令时,您可能使用<C-R>=来插入变量内容:

:sleep <C-R>=timetowait<CR>m<CR>

...但在脚本中,必须使用:execute。必须引用Ex命令的所有文字部分(单引号或双引号),然后与变量连接:

execute 'sleep' timetowait . 'm'

您的问题

对于语法脚本,您使用execute。另请注意,Vim中的字符串连接是使用.完成的,而不是+ 。 (另请注意,我使用单引号来避免反斜杠的转义。)

execute 'syn match Title /\%>0l\%<' . b:title_until . 'l.*/'

或者,您可以使用printf();当存在多个变量时,这就不那么混乱了。但是,在这里您需要考虑%必须加倍:

execute printf('syn match Title /\%%>0l\%%<%sl.*/', b:title_until)

最后的提示

\%>0l是多余的,可以省略,因为它总是匹配:没有负线。