我想将变量连接成正则表达式模式。例如,考虑这种模式的语法匹配从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.*/"
答案 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
是多余的,可以省略,因为它总是匹配:没有负线。