我正在尝试修复python的语法突出显示;我的颜色与屏幕快照中不同Vim配色方案中“应该”显示的颜色不同。而且您可以看到将.rb(正确显示)与.py(看起来正确)进行比较的区别:例如,请注意self的状态如何?突出显示。 (这是在base16中进行的,但在其他配色方案中,其比较将是相似的)。通常,看起来对象语法高亮显示是错误的。

我尝试过的一些事情:


查看vim加载的语法脚本;在下面的示例中,.py和.rb之间的唯一区别是,当然,ruby获取了indent / ruby​​.vim和语法/ruby.vim,而python获取了indent / python.vim和语法/python.vim。这些是homebrew vim随附的文件。
在macvim中加载相同的文件,而不是在终端(iterm2)vim中加载;同样的问题,文件看起来与图片完全相同。
添加新的python.vim文件。即使用作.vim/after脚本也不能解决问题。

欢迎提出任何建议;我已经为此花了好几个小时的时间,无法弄清为什么突出显示无法按预期工作。

评论

请注意,Python没有符号,我强烈建议您将Python 3语法用于新代码。

#1 楼

语法高亮显示的工作原理很简单:


syntax/<filetype>.vim中,语法规则是使用:syntax命令定义的。这个命令定义了语法。它说:“如果文本匹配此正则表达式,则为字符串”,依此类推。为此,它分配了一个突出显示组。它没有对这种颜色说任何话。

:highlight说“用这些颜色突出显示该组”。这是在配色方案中完成的,而不是语法文件。有很多默认的高光组(StringFunctionSpecial等),所有配色方案都应定义。

您绝不限于这些默认组,您可以根据需要创建任意数量的组(但通常不创建默认语法文件)。

indent/<filetype>.vim文件控制自动缩进。例如,对于Ruby,它说“ def之后的行应增加缩进级别”和“ end之后的行应将缩进级别降低一级”。它对颜色或语法突出显示不起作用。


为什么不同的编程语言的突出显示方式不同?部分原因是因为个人美学和撰写者的观点。例如,在Ruby中,Type高亮组用于类名。但也可能是Function或其他问题。为什么是Type?可能是因为作者认为它在他或她的配色方案中看起来更好。

但更重要的是,这些语言具有不同的语义和敏感性。在Ruby中,self是一个特殊的关键字。您不能执行self = "foo"def self()。这些是错误。但这不是Python中的情况。这只是一个没有任何特殊属性的变量。正在执行:

x = Object()
x.foo()


确实被Python“翻译”为:

Object.foo(x)


名称self只是约定俗成的名称(几乎被普遍采用),但是您可以随意命名。 def x(this):def x(xxx):同样有效。您也可以在任何喜欢的地方使用名称selfself = 'foo'def self():都很好。

我认为self不应突出显示,因为它既不是特殊关键字,也不是预定义变量(例如str)。语法文件中没有单词self的痕迹,因此看起来它的作者也是如此:-)


如果要突出显示self,则必须创建它的语法规则:

:syn keyword pythonBuiltin self


默认语法文件中已经定义了pythonBuiltin组名,并链接到Function高亮组。要使用新的突出显示组,请使用以下命令:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special


要进行这些更改,您不能仅将它们粘贴在vimrc文件中。语法文件将覆盖它。取而代之的是,您需要在语法文件加载后运行它,可以通过两种方式执行:



使用FileType autocmd:

augroup python
    autocmd!
    autocmd FileType python
                \   syn keyword pythonSelf self
                \ | highlight def link pythonSelf Special
augroup end



使用after-directory~/.vim/after/syntax/python.vim

syn keyword pythonSelf self
highlight def link pythonSelf Special



这两种方法实际上是相同的。使用任何您喜欢的。