Vim:动态语法高亮

标签 vim syntax-highlighting vim-syntax-highlighting

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

我认为的文件类型可能包含(任意多个)(VAR ...) 形式的 block ,其中此类“VAR block ”包含一个以空格分隔的标识符列表,这些标识符应该被视为变量(而不在 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))
)

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

最佳答案

我已经达到了预期的结果(但想在 SO 上分享它)。就是这样(以下代码片段应合并在一个文件 vars.vim 中)。

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

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

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

" 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 结尾的文件的语法突出显示(并且还会在保存缓冲区时更新变量列表)。

关于Vim:动态语法高亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16053144/

相关文章:

matlab - Vim:每次在同一个外部程序中运行代码

vim - 使用 <tab> 显示可用的 VIM 命令

javascript - 使用 ACE 语法高亮显示 Flask-Admin 字段覆盖

c# - 关闭 Visual Studio 2013 预处理器灰显 C#?

linux - vi 语法高亮

Groovy 中的 Vim 语法高亮错误

VIM:不要在HTML链接中下划线领先的空格

vim - 如何在 Vim 命令行中移动?

ios - Xcode 8 语法突出显示不起作用

vim - vim 中当前缓冲区的自定义语法高亮显示