在python中创建语法高亮显示(PyQt4)

时间:2014-01-06 14:04:52

标签: python pyqt4 text-editor syntaxhighlighter

我一直在网上搜索文本编辑器中特定文件的语法突出显示,我读到了 Lexers和Yacc 。我对语法高亮的概念很困惑。

我使用 PyQt4 创建了一个简单的文本编辑器,我希望它能够启用语法高亮的编程语言,如HTML,CSS,Python,C / C ++。但我不知道如何开始实施这个以及从哪里开始。请有人指出我正确的方向,并清楚我对语法高亮的疑虑。请。

3 个答案:

答案 0 :(得分:5)

如果您想让自己的生活更轻松,请使用QScintilla - 它可以完成您需要的一切,并且更直接。

QScintilla包含在适用于Windows的PyQt二进制安装程序(可以找到here)中,几乎所有Linux发行版都会在其存储库中包含QScintilla软件包。或者,可以找到QScintilla源代码here

这里有一个最小的QScintilla示例,显示了入门是多么容易:

import sys, os
from PyQt4 import QtGui, Qsci

class Window(Qsci.QsciScintilla):
    def __init__(self):
        Qsci.QsciScintilla.__init__(self)
        self.setLexer(Qsci.QsciLexerPython(self))
        self.setText(open(os.path.abspath(__file__)).read())

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 500, 500)
    window.show()
    sys.exit(app.exec_())

答案 1 :(得分:2)

您需要将文本划分为词法标记(单词,数字,符号等),找出每个标记的内容,并相应地对其进行着色。识别数字和符号很容易,但要知道单词是变量,函数,关键字还是根据语言的语法规则解析文本。这就是为什么你的搜索找到词法分析(Lex)和解析(Yacc)的参考。词法分析是关于将字母和符号组合成单词和其他标记,解析是关于这些标记如何组合在一起构成一个语法上有效的程序。

Python有一个库模块tokenize,它完全符合Python语言的要求。该文档甚至表示它对于漂亮打印和着色屏幕显示非常有用。希望使用它可以让您更好地了解所有这些东西是如何工作的。然后你可以搜索Python库来解析其他语言,或者自己编写一个。

有一个Stack Overflow问题here建议pyPEG解析其他语言。 Jimothy对Pygments的建议也很好。

答案 2 :(得分:2)

我知道这个问题已经得到解答,但就像我一样,许多其他新用户来到这里,并且会知道上面提到的选项中提到的选项都没什么先进水平。我发布这个答案,以供其他一些新成员进一步参考

使用python和Qt创建语法Highlighter是一个不错的选择。由于python是非常强大的语言,QT是GUI应用程序开发的优秀框架 语法highlighter是使用QTextEdit Object的最简单的Regex表达式。您只需解析Regex表达式,然后为该类正则表达式选择特定的QTextFormat,并将该文本格式应用于该块。 下面是使用Qt4在Python中实现的最简单语法高亮显示的代码示例,该高亮函数在QSyntaxHighlighter中驱动的syntaxHighlighter类中实现

    def highlightBlock(self, text):
    for pattern, format in self.highlightingRules:
        expression = QtCore.QRegExp(pattern)
        index = expression.indexIn(text)
        while index >= 0:
            length = expression.matchedLength()
            self.setFormat(index, length, format)
            index = expression.indexIn(text, index + length)

    self.setCurrentBlockState(0)

    startIndex = 0
    if self.previousBlockState() != 1:
        startIndex = self.commentStartExpression.indexIn(text)

    while startIndex >= 0:
        endIndex = self.commentEndExpression.indexIn(text, startIndex)

        if endIndex == -1:
            self.setCurrentBlockState(1)
            commentLength = len(text) - startIndex
        else:
            commentLength = endIndex - startIndex + self.commentEndExpression.matchedLength()

        self.setFormat(startIndex, commentLength,
                self.multiLineCommentFormat)
        startIndex = self.commentStartExpression.indexIn(text,
                startIndex + commentLength);

使用这个例子,我在Python中使用Qt4为8051微控制器创建了一个Assembly语法高亮显示器。如需进一步参考和良好的起点can refer to that code.