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.