繁体   English   中英

Vim:动态语法突出显示

[英]Vim: dynamic 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没有,尽管没有参数)。

我已经达到了预期的结果(但想在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结尾的文件的语法高亮显示(并在保存缓冲区时更新变量列表)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM