2017-10-18 6 views
0

Je veux développer un thème Python qui exécute des codes Python et qui colorise les jetons dans input() pendant que les utilisateurs tapent du texte.Comment utiliser pygments avec readline pour colorier le texte d'entrée en fonction des jetons?

Récemment j'ai commencé à apprendre readline et pygments.

Je peux ajouter des jetons de mot-clé à l'achèvement de l'onglet. Aussi je peux coloriser le texte stdout avec la fonction de mise en évidence de pygments.

Mais je ne peux toujours pas coloriser les jetons en entrée().

Y at-il quelqu'un pour me donner une idée de faire ce que je veux?

Les codes ci-dessous proviennent d'un exemple d'application.

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) 

Et voici la capture d'écran du fonctionnement de cette application. Comme vous pouvez le voir, lorsque le programme démarre, une chaîne "print ('hello world')" est mise en évidence avec des pygments. Et après que pressant le TAB 2 fois donne les mots-clés.

Merci d'avance.

enter image description here

Répondre

0

Le problème est résolu avec les codes ci-dessous:

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