【问题标题】:Creating a syntax highlighter in python(PyQt4)在 python(PyQt4) 中创建语法荧光笔
【发布时间】:2014-01-06 14:04:51
【问题描述】:

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

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

【问题讨论】:

  • 你可以从学习正则表达式开始,虽然我不确定这是否是大多数语法高亮的工作方式。但它通常用于网站。
  • 看看Pygments,这是一个开源的Python语法高亮器。
  • 我认为 pygments 是一个命令行语法高亮器......但我想即时实现语法高亮。是否可以使用 pygments 进行动态语法高亮? @Jimothy
  • @LucyJaa:是的,这应该是可能的,因为您也可以将 Pygments 用作库。事实上,这里有一个开源的text editor,它使用 Pygments 进行语法高亮(用 PyGTK 编写)。
  • @Jimothy 感谢编辑器链接...

标签: python pyqt4 text-editor syntaxhighlighter


【解决方案1】:

我知道这个问题已经得到解答,但是和我一样,许多其他新用户来到这里并且会知道上述答案中提到的选项是不高级的。我发布此答案以供其他一些新来者进一步参考

使用 python 和 Qt 创建语法荧光笔是一个不错的选择。由于 python 是非常强大的语言,而 QT 是用于 GUI 应用程序开发的绝佳框架。
语法高亮是带有 QTextEdit 对象的最简单的正则表达式。您只需解析 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 中为 8051 微控制器创建了一个带有 Qt4 的汇编语法荧光笔。为了进一步的参考和一个好的起点你can refer to that code.

【讨论】:

    【解决方案2】:

    如果您想让生活更轻松,请使用QScintilla - 它可以满足您的一切需求,而且开箱即用。

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

    下面是一个最小的 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_())
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 至少你的解释让我对这个话题有所了解..好的,我会试一试..谢谢@Peter Westlake..由于我的代表很低,无法投票:)跨度>
      猜你喜欢
      • 2010-11-12
      • 2010-10-23
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多