Vim中Python语法高亮类方法而非属性及正则优化问题
在Vim中高亮Python类方法名(排除属性)的正确姿势
嘿,这个问题我之前折腾过好一阵子,刚好能帮到你!你遇到的括号被意外高亮的问题,核心是没把Vim正则里的零宽断言用对——咱们需要确保前后的self.和(都只是“断言条件”,不被包含在实际高亮的文本里。
先分析你原来的正则问题
你写的\v%(self\.)@<=(\w+)(\()@=(应该是@<=而不是@5<=吧?估计是手滑打错了),问题出在虽然用了前瞻断言(\()@=,但Vim里的语法匹配需要更精准的零宽边界控制。其实只要调整一下断言的写法,就能只高亮self.和(之间的方法名。
正确的正则匹配规则
直接用这个正则,完美命中你的需求:
syn match pythonSelfMethod /\v%(self\.)@<=\k+%(\\()@=/ containedin=pythonIdentifier
拆解一下:
\v:启用Vim的“very magic”模式,减少转义字符的使用,写起来更清爽。%(self\.)@<=:零宽后行断言——告诉Vim“匹配的内容必须紧跟在self.后面”,但self.本身不会被包含在高亮范围内。\k+:匹配Python的标识符(字母、数字、下划线),比\w+更准确,因为Python方法名允许下划线。%(\\()@=:零宽前行断言——确保匹配的内容后面紧跟着左括号(,同样,(不会被包含在高亮文本里。containedin=pythonIdentifier:让这个匹配继承默认Python标识符的语法组属性,避免和其他高亮规则冲突。
怎么应用这个规则
把上面的代码放到你的~/.vim/after/syntax/python.vim文件里(如果没有就新建一个),这样不会覆盖Vim默认的Python语法文件,重启Vim后就能生效:
- 对于
self.foo(bar),只会高亮foo这个方法名,括号完全不会被选中; - 对于
self.foo(类属性),因为后面没有括号,不会被高亮,完美区分方法和属性。
额外小提示
如果你的Vim版本比较新(8.0+),还可以用更简洁的写法,把断言里的非捕获组简化:
syn match pythonSelfMethod /\v(self\.)@<=\k+(\()@=/ containedin=pythonIdentifier
效果是一样的,因为very magic模式下,()默认就是非捕获组。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

