Vim:动态语法高亮

时间:2013-04-17 06:35:20

标签: vim syntax-highlighting vim-syntax-highlighting

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

我考虑的文件类型可能包含(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时,我希望将xy打印为关键字(而例如z则不是,尽管没有争论)。

1 个答案:

答案 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.vimvars.vim放在里面。然后在我的~/.vimrc我添加了

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

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