我想动态地(即,取决于当前文件的内容)调整语法突出显示。虽然这可能有用,但我的具体设置如下:
我考虑的文件类型可能包含(VAR ...)
形式的(任意多个)块,其中这样的“VAR-blocks”包含一个空格分隔的标识符列表,应该被视为变量(而标识符是不在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
时,我希望将x
和y
打印为关键字(而例如z
则不是,尽管没有争论)。
答案 0 :(得分: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
结尾的文件的语法高亮(并且每当保存缓冲区时也会更新变量列表)。