如何使用带有readline的pygments根据标记着色输入文本?

时间:2017-10-18 14:21:13

标签: python readline pygments

我想开发一个Python主题,它执行Python代码,并在用户输入一些文本时为input()中的标记着色。

最近我开始学习readline和pygments。

我可以在标签页完成中添加关键字标记。此外,我可以使用pygments高亮显示功能为stdout文本着色。

但是我仍然无法在input()中对标记进行着色。

有没有人给我一个想法,做我想做的事情?

以下代码来自示例应用程序。

import readline
from pygments.token import Token
from pygments.style import Style
from pygments.lexers import Python3Lexer
from pygments import highlight
from pygments.formatters import Terminal256Formatter
import keyword


class Completer:
    def __init__(self, words):
        self.words = words
        self.prefix = None
        self.match = None

    def complete(self, prefix, index):
        if prefix != self.prefix:
            self.match = [i for i in self.words if i.startswith(prefix)]
            self.prefix = prefix
        try:
            return self.match[index]
        except IndexError:
            return None


class MyStyle(Style):
    styles = {
        Token.String: '#ansiwhite',
        Token.Number: '#ansired',
        Token.Keyword: '#ansiyellow',
        Token.Operator: '#ansiyellow',
        Token.Name.Builtin: '#ansiblue',
        Token.Literal.String.Single: '#ansired',
        Token.Punctuation: '#ansiwhite'
    }


if __name__ == "__main__":
    code = highlight("print('hello world')", Python3Lexer(), Terminal256Formatter(style=MyStyle))
    readline.parse_and_bind('tab: complete')
    readline.set_completer(Completer(keyword.kwlist).complete)
    print(code)
    while True:
        _input = input(">>> ")
        if _input == "quit":
            break
        else:
            print(_input)

这是此应用程序如何工作的屏幕截图。正如您所看到的,当程序启动时,“print('hello world')”字符串会以pygments突出显示。然后按TAB 2次给出关键字。

提前致谢。

enter image description here

1 个答案:

答案 0 :(得分:0)

问题通过以下代码解决:

from pygments.lexers import Python3Lexer
from prompt_toolkit.shortcuts import prompt
from prompt_toolkit.layout.lexers import PygmentsLexer
text = prompt('>>> ', lexer=PygmentsLexer(Python3Lexer))