Question

J'ai écrit un programme simple comme shell qui utilise readline afin d'assurer l'achèvement intelligent des arguments. Je voudrais que le mécanisme pour appuyer les arguments qui ont des espaces et sont indiqués pour signifier comme un argument (comme fournissant la coquille avec une telle).

Je l'ai vu que shlex.split () sait comment analyser les arguments cités, mais dans le cas où un utilisateur veut terminer la mi-tapant échoue (par exemple: « complet « Bonjour » causerait une exception à jeter lorsque passé à shlex, à cause des citations asymétriques).

est le code là pour le faire?

Merci!

Était-ce utile?

La solution

Je ne connais pas de code existant pour la tâche, mais si je devais le faire j'Intercepter l'exception, essayez d'ajouter une citation de fuite faux, et voir comment shlex.split fait avec la chaîne ainsi modifiée.

Autres conseils

GNU Readline permet ce scénario avec la rl_completer_quote_characters variable. Unfortunatelly, Python n'exporte pas cette option sur le module readline de la bibliothèque standard (même sur 3.7.1, la dernière de cette écriture).

J'ai trouvé un moyen de le faire avec ctypes, bien que:

import ctypes

libreadline = ctypes.CDLL ("libreadline.so.6")
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
    libreadline, 
    "rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'

Notez que c'est évidemment pas portable (peut-être même entre les distributions Linux, comme la version libreadline est hardcoded, mais je ne pas libreadline.so plaine sur mon ordinateur), donc vous pouvez avoir à l'adapter à votre environnement.

En outre, dans mon cas, je mets des guillemets doubles seulement comme spécial pour la fonction d'achèvement, comme ce fut mon cas d'utilisation.

Références

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top