Vim变量语法高亮

11

我想修改我的vim配置文件,使其只突出显示我声明的变量,而不是关键字。这篇文章展示并解释了我的意思:备选语法高亮

我是vim的新手(从未更改默认的配置文件)。能否有人指点我正确的方向?


请查看此维基 - FlyingFoX
可能不是:https://groups.google.com/forum/#!topic/vim_dev/vULHSjFRmyc - mMontu
这种类型的突出显示在Vim中不可用...但可能是插件的好主意。不过实现起来不会很容易。 - mihai
你可以使用例如Mark-Karkat插件或类似的工具来临时着色,这将被保存在视图中(可以设置为自动)。缺点是您必须至少为每个变量执行一次此操作,但另一方面,也许它也可以自动化。好处是您可以快速打开/关闭此功能。 - majkinetor
4个回答

5
作为概念验证,我尝试了。
let vars = ['init', 'editable', 'init_ui']
let colors = ['ff0000', '00ff00', '0000ff']
for var in vars
  execute 'syn keyword var_' . var var
  execute 'hi default var_' . var 'guifg=#' . remove(colors, 0)
endfor

并且它按预期工作。这为列表中的每个变量创建了语法项:var_initvar_editablevar_init_ui。然后,它为每个语法项分配了一个高亮颜色。

为了超越概念证明,您必须获得变量名称列表。您可以通过解析标签文件(例如由ctags生成)或在vim中编写解析器(这将非常便携)来实现此目的。您可以对列表进行排序并删除重复项,但是我认为如果您跳过此步骤,使用:hi default将为您节省时间。想出比我的示例更好的生成颜色的方法。

您可以在输入缓冲区时使用autocommand完成所有这些操作,或者当用户显式调用函数时完成。然后,您可以开始考虑自动更新新定义的变量。


3
Benjifisher的回答概述了如何实现这样的功能,但对于初学者来说仍然是一项重大的工作,可能难以实现。但是,正如majkinetor在评论中推荐的那样,我的Mark插件可以让您通过手动(取消)标记“有趣”的变量名,快速设置不同的颜色(默认映射为<Leader>m,通常转换为\后跟M)。我自己使用它来理解代码的复杂部分或在疑难解析日志文件时使用。
通过以下命令在您的~/.vimrc中,您可以拥有多达77种不同的颜色可用:
let g:mwDefaultHighlightingPalette = 'maximum'

1

它可以突出显示关键字,但如果您加载了其他语法高亮的vimscript,则不会突出显示变量。在ES6 JavaScript中进行了测试。 - Pencilcheck

0

我不喜欢在使用脚本语言时将文本字符串转换为命令的想法,因为这种语言理论上应该能够保留某些语义和结构来描述不同的构造。因此,我实现了一种可以使用变量的高亮处理过程,如下所示:

function s:hl(group, attrs)
    let l:command = "highlight" . " " . a:group
    for name in keys(a:attrs)
        let l:command .= " " . name . "=" . a:attrs[name]
    endfor
    execute l:command
endfunction

有了上述内容,我可以传递一个高亮属性字典给一个组进行设置,字典的值显然可以是变量引用。

然后,我们可以通过调用上述函数来实现Vim有效地运行相同的highlight <group> <name>=<value> ...命令,例如:

call s:hl("Keyword", { "guifg": "yellow" })

由于该函数接受一个字典作为其第二个参数,因此可以添加其他键值对,例如:call s:hl("Normal", { "guifg": "white", "guibg": "black" })
如果定义了变量,则可能更像:
let s:chefchaouen_blue = "#468fea"

call s:hl("Comment", { "guifg": s:chefchaouen_blue })

无论如何,这种方法可能看起来更冗长 - 而且最终仍会变成一个命令字符串,用于与execute命令一起使用 - 但我发现Vim能够突出显示其自己脚本文本的元素 - 例如在颜色方案文件中上面的call s:hl(...)语句 - 是值得的。此外,更多的内容可以更早地检查语法错误(而不是连接到一个字符串中),尽管对大多数人来说区别可能微不足道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接