我如何更改Emacs中Python文档字符串的字体?

8
我刚开始学习Python并使用Emacs作为我的编辑器。目前,Emacs对普通字符串(单引号)和文档字符串(三引号)使用相同的颜色。我想让文档字符串有不同的颜色,所以我使用“选项->自定义Emacs”菜单选项将'font-lock-doc-face'更改为新颜色并保存更改。然而,Emacs仍然将文档字符串保持与普通字符串相同的颜色。改变普通字符串的颜色也会同时应用于文档字符串。
看起来Emacs把文档字符串和普通字符串视为相同。有没有办法让Emacs正确找到并将Python文档字符串与普通字符串分开颜色呢?
编辑:我正在使用Emacs 23.1.1(Kubuntu 10.10包)和默认的Python模式设置。我还使用午夜主题的color-theme包。

5
我不知道答案,但是想澄清一下:docstrings和三引号字符串是两个不同的东西(虽然三引号经常用于docstrings)。defclass行后面的字符串称为docstring。三引号可以让你轻松地将一个字符串分布在多行上。 - Thomas K
这是个好消息。我是Python的新手,所以认为三引号字符串会被隐式地视为文档字符串。看起来问题在于Emacs无法区分你所描述的文档字符串和Python文件中的其他任何三引号字符串。 - Jesse DeGuire
请参见 http://stackoverflow.com/questions/27317396/how-to-distinguish-python-strings-and-docstrings-in-an-emacs-buffer。 - Brian Burns
2个回答

2
有趣。由于emacs语法表的工作方式,emacs认为"""'''表示一个空字符串后跟一个新字符串。
您可以在Python缓冲区中粘贴以下代码来轻松验证此问题:
class MrsRobinson(object):
    '''
    What's that you say?
    '''
    pass

在emacs 23.1.1中[更新:显然在stackoverflow上也是如此!],这会完全破坏文件的其余部分的语法高亮。
我总是使用"""来避免文档字符串中的撇号问题,所以直到现在我才注意到在emacs 23.2.1中,这个问题终于得到了解决……
(是的,在python.el中有一个名为python-quote-syntax的新函数)
因此,在您的emacs版本中,这是不可能的,因为字符串没有被正确解析。如果您升级到最新的emacs,您可以通过修改python.el中的该函数来使其以不同的方式处理字符串。

我把你的小例子复制到了Emacs中,它实际上可以正确地工作。也就是说,整个文档字符串被突出显示为字符串,并且'pass'被正确地突出显示为关键字。但是,我不知道是否有一种方法可以让Emacs区分代码中出现的文档字符串和任何其他三引号('''或""")字符串。我想必须有一些方法可以向Emacs提供一些正则表达式,告诉它文档字符串的外观,你知道如何做到这一点吗? - Jesse DeGuire
哦,我可能正在旧版emacs上运行“其他”python模式。无论如何,你仍然需要修改同一个函数。它可以对所有python字符串进行语法高亮。你只需要确定这个字符串(不管它使用了多少引号)是否立即出现在文件、类或函数的顶部(忽略注释和空白)。也许你可以修改词法分析器,在遇到classdef时设置一个标志,在遇到:时设置另一个标志,在遇到任何非注释内容时取消设置这两个标志,并且如果这两个标志都被设置且遇到的是一个字符串,则覆盖其显示格式。 - tangentstorm
我查看了python.el文件,确实需要在那里更改才能实现我想要的功能。目前这超出了我的能力范围,但我将不得不在某个时候尝试一下。感谢您让我离解决问题更近了一步。 - Jesse DeGuire

1
我能够完成这个:

通过执行M-x customize-face并输入:font-lock-doc-face

它们都是相同的颜色,因为font-lock-doc-face继承自font-lock-string-face

我将font-lock-string-face更新为font-lock-comment-face(因为我喜欢我的文档字符串与我的注释具有相同的颜色)。您可以选择做相同的更改或选择“显示所有属性”来选择自己的颜色。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接