在 vim 的 Python 评论块中匹配太长的行

Match too long lines inside Python comment block in vim

我需要突出显示太长的额外字符 Python 文档字符串行

正在尝试使用此代码:

syn region PythonDocString  start=+^\s*[uU]\?[rR]\?"""+ end=+"""+ keepend excludenl
syn match TooLongDocString /\%80v.*/ containedin=PythonDocString
hi TooLongDocString guifg=Red

但它也匹配文档字符串之外的行并关闭默认的 Python 注释突出显示。如何让它发挥作用?

更新

之前

更新 2

突然,对于一个没有任何 """ 形式注释的文件,我得到:

行:

        sha = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=cwd).decode('ascii').strip()

当前代码:

au BufNewFile,BufRead *.py syn region pythonDocString  start=+^\s*[uU]\?[rR]\?"""+ end=+"""+ keepend excludenl contains=pythonEscape,@Spell,pythonDoctest,pythonDocTest2,pythonSpaceError,pythonDocstringTooLong
au BufNewFile,BufRead *.py syn match pythonDocStringTooLong /\%81v.*/ contained
au BufNewFile,BufRead *.py hi def link pythonDocString pythonString
au BufNewFile,BufRead *.py hi def link pythonDocStringTooLong Error

containedin=... 将当前语法元素添加到引用元素的包含列表中,但 它确实暗示 contained。如果 TooLongDocString 上没有该属性(为了保持一致性,BTW 也应该有 python... 前缀),该元素将匹配 anywhere.

无论如何,由于您可以控制这两个定义,因此您可以只在 pythonDocstring 上使用 contains=pythonDocstringTooLong。我还认为应该包含其他(默认)语法元素:

syn region pythonDocString  start=+^\s*[uU]\?[rR]\?"""+ end=+"""+ keepend excludenl contains=pythonEscape,@Spell,pythonDoctest,pythonDocTest2,pythonSpaceError,pythonDocstringTooLong
syn match pythonDocStringTooLong /\%80v.*/ contained

containedin=通常用于无法修改引用语法元素定义的情况。

最后,我会 link 现有的高亮组而不是定义(仅限 GUI)高亮:

hi def link pythonDocStringTooLong Error