在 Vimscript 中,是否可以访问语法高亮器已知的信息?

In Vimscript, is it possible to access information known by the syntax highlighter?

例如,如果我正在编写一个 Vim 脚本函数来操作 Python 语法,了解一行是常规代码、注释还是包含在三元组中可能会很有用-引号。我假设 syntax highligher 已经弄清楚了这些事情。我可以在自己的 Vim 函数中轻松访问该信息,还是必须推出自己的解析逻辑?

def eight_the_hard_way():
    '''
    Blah blah.
    '''
    # Blort!
    x = 4 + 4
    return x

我已经搜索了相当多的信息,但到目前为止还没有找到直接关于这个主题的任何内容。

是的,使用synID()函数,您可以获得特定光标位置的语法ID。

有两个并发症:

  1. 您通常希望与特定的突出显示组进行比较(例如 Comment
  2. 由于语法嵌套,实际上一个位置可能有一整堆语法。

:help synID() 有额外的提示和指示来解决这些问题。 我的 ingo-library plugin 为此提供了一个方便的 ingo#syntaxitem#IsOnSyntax( pos, syntaxItemPattern ) 函数。

此外,请查看 SyntaxAttr.vim - Show syntax highlighting attributes of character under cursor 插件。是不可或缺的调试助手。