如何修复Python关键字(例如“ self”)的“ missing”语法突出显示?


12

我正在尝试为python突出显示语法;我的颜色与屏幕快照中不同Vim配色方案中“应该”显示的颜色不同。您会看到将.rb(正确显示)与.py(看起来好像已经关闭)进行比较的区别:

在此处输入图片说明

例如,注意如何self不突出显示。(这是在base16中进行的,但在其他配色方案中,其比较将是相似的)。通常,看起来对象语法突出显示是错误的。

我尝试过的一些事情:

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

欢迎任何建议;我已经花了好几个小时不停地努力,无法弄清楚为什么突出显示效果不如预期。


请注意,Python没有符号,我强烈建议您对新代码使用Python 3语法。
马丁·图尔诺伊

Answers:


12

语法突出显示的工作原理很简单:

  • 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):同等有效。您也可以在self任何喜欢的地方使用该名称。self = 'foo'并且def self():非常好。

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


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

:syn keyword pythonBuiltin self

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

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

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

  1. 使用FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. 使用after-directory~/.vim/after/syntax/python.vim

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.