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

问题描述:

我想开发一个Python主题,它执行Python代码,并在用户输入一些文本时在输入()中着色令牌。如何使用带有readline的pygments根据标记对输入文本着色?

最近我已经开始学习readline和pygments。

我可以添加关键字标记到标签完成。此外,我可以使用pygments高亮功能对stdout文本着色。

但我仍然无法着色输入()中的标记。

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

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

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

问题是解决了用以下代码:

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