vimscript 语法不是模式

vimscript syntax not pattern

我有这个 vimscript:

syn region      fdocCommand     start="^@" end="$" contained 
syn region      fdocComment     start="^@" end="^@tangle " contains=fdocCommand keepend
" syn region      fdocComment     start="^@" end="^@felix" contains=fdocCommand keepend

但我需要的是以下定义的区域:start="^@" 后跟除 "tangle""felix" 以外的任何内容,并以 "@tangle""@felix" 结束.一个较弱的形式实际上可以做到,要么是上面的 @tangle 行,要么是注释掉的 @felix 行。

实际使用的是@commands@h1标题,@title等文字编程工具,代码由@felix或[=16=引入] 并以下一个 @command 结束。碰巧我的网络服务器可以通过语法突出显示和超链接显示它,真正的代码命令集包括 @python@ocaml@c++ 等。对于 Felix,@..@felix sequence实际上被编译器识别为注释,所以识字代码可以直接编译。

要仅使用 @commands 而不是 @tangle 的区域开始,您需要通过 \@! negative lookahead^@\%(tangle\)\@!。要确保它真的只是 tangle,而不是 tangle 开头的东西,您需要一个额外的 $ 断言;并且不匹配 felix,另一个分支:^@\%(\%(tangle\|felix\)$\)\@!

所以,应该这样做:

syn region      fdocComment     start="^@\%(\%(tangle\|felix\)$\)\@!" end="^@\%(tangle\|felix\)$" contains=fdocCommand keepend