2

我想动态地(即,取决于当前文件的内容)调整语法高亮。虽然这通常可能有用,但我的具体设置如下:

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

考虑以下示例(让我们称之为add.trs):

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

add.trsvim中打开时,我想要它xy打印为关键字(例如z,不是,尽管没有参数)。

4

1 回答 1

2

我已经达到了预期的结果(但想在 SO 上分享)。所以就在这里(以下片段应该组合在一个文件中vars.vim)。

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

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

然后我检查 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.vim里面vars.vim。然后在我的~/.vimrc我添加

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

它为以结尾的文件激活语法突出显示.trs(并且在保存缓冲区时更新变量列表)。

于 2013-04-17T06:38:22.483 回答