Vim:动态语法

我想动态地(即,取决于当前文件的内容)适应语法突出显示。 虽然这可能总体上有用,但我的具体设置如下:

我考虑的文件类型可能包含(任意多个)形式的块(VAR ...) ,其中这些“VAR块”包含空格分隔的标识符列表,这些标识符应被视为变量(而标识符不是在VAR块中被认为是固定功能符号或常量)。 此外,已经有一个文件trs.vim负责为这些文件添加语法高亮功能。 在trs.vim中声明了一个语法组trsKeyword 。 现在我的目标是突出显示使用该组的所有变量。

考虑下面的例子(让我们称它为add.trs ):

(VAR x y)(RULES
  add(z, y) -> y  
  add(s(x), y) -> s(add(x, y))
)

当在vim中打开add.trs时,我希望将xy打印为关键字(例如,尽管没有参数,但z不是)。


我已经达到了预期的结果(但想分享它)。 所以在这里(下面的代码片段应该合并到一个文件vars.vim )。

首先我定义一个可识别VAR块的模式:

" pattern that matches VAR-blocks of *.trs files
let varblock = '(VARs*(.*))'

然后我检查当前文件(也许有比使用%更好的方法?)VAR块,并忽略没有找到匹配的情况。

" create list of variables from all VAR-blocks 
try
  silent exe "vimgrep /" . varblock . "/j %"
catch /^Vim%((a+))=:E480/ " no match
  " do nothing
endtry

找到的匹配是通过我复制的getqfilst()获得的。 然后,我将第一个与varblock模式匹配的子组(这将是一个包含以空格分隔的标识符的字符串)替换此列表中的每个元素。 我将所有这样的字符串合并成一个单独的字符串,然后将其拆分为空格以获取标识符列表:

let vars = split(join(map(copy(getqflist()), 'matchlist(v:val.text, varblock)[1]')))

最后,我创建一个匹配这些标识符的模式,并将其注册到trsKeyword组:

" activate syntax highlighting for variables
exe "syn match trsKeyword "<(" . join(vars, '|') . ")>""
" echo "variables: " . join(vars, ", ")

为了使它与trs.vim一起工作,我创建了目录~/.vim/syntax/trs ,并将trs.vimvars.vim放入其中。 然后在我的~/.vimrc添加

" TRS files
au BufNewFile,BufRead,BufWrite *.trs setf trs

它激活以.trs结尾的文件的语法高亮显示(并且每当保存缓冲区时也更新变量列表)。

链接地址: http://www.djcxy.com/p/52359.html

上一篇: Vim: dynamic syntax

下一篇: prefix macro, similar to '?