2011-02-01 7 views
7

Tengo una especie de clase completa con una función de autocompletado. Versión sencilla:¿Cómo hacer que la visualización de autocompletado de Python coincida?

class Completer: 
    def __init__(self): 
     self.words = ["mkdir","mktbl", "help"] 
     self.prefix = None 

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

y ejecutar algo como esto para conseguir la finalización automática con readline:

import readline 
readline.parse_and_bind("tab: complete") 

completer = Completer() 
readline.set_completer(completer.complete) 
user_input =raw_input("> ") 

Por lo tanto, hay 3 palabras para el completado automático [ "ayuda", "mkdir "," mktbl "] en el ejemplo.

si un usuario ejecuta:
> he<tab>
el usuario obtiene:
> help

pero si el usuario ejecuta
> mk<tab>
no pasa nada, porque no hay un solo partido (mkdir y mktbl)

¿Cómo mostrar opciones en caso de que haya varias coincidencias? ¿Como el Bash con un autocompletado de nombres de archivo?

Así usuario whold obtener algo como:
> mk<tab>
mktbl mkdir
> mk<cursor>


P. S. He tratado de poner
_readline.insert_text (...) _
y
de impresión ...
en función más completa pero los frenos de la inserción, por lo que un usuario obtiene algo como esto:
> mk<tab>
> mkmktbl mkdir <cursor>

PPS Necesito una solución de Linux.

+1

Esta no es una respuesta completa, y puede ser exagerado por algo tan simple, pero usar 'curses' es una buena (aunque compleja) forma de hacer este tipo de cosas: http://docs.python.org /library/curses.html Eche un vistazo al tutorial aquí: http://docs.python.org/howto/curses.html#curses-howto –

+0

¡Podría ser! ¡Gracias! Pero estamos absolutamente satisfechos con la funcionalidad que readline proporciona. Y lo único que necesitamos es mostrar esta opción en el autocompletado. Investigamos las maldiciones, pero en realidad es demasiado complejo para una pequeña cosa como esta. – MajesticRa

+0

Pregunta interesante, he tenido ideas sobre algo similar. – Skurmedel

Respuesta

6

la opción Set readline

set show-all-if-ambiguous on 

si quieres terminaciones después de la primera <tab>. De lo contrario, simplemente pulse <tab> dos veces.

Referencia: http://caliban.org/bash/, Sección readline Consejos y trucos

PS. Probé su código en OS X y Linux, funciona bien (en mis máquinas;)

+0

¡Gracias! Tu respuesta resolvió problemas en Linux. No funciona en Windows. Pero Windows tiene una versión perversa de readline y cmd, por lo que desafortunadamente está bien. – MajesticRa

2

Me sugirieron una solución que completara la respuesta. Permite organizar la salida de finalización de las opciones de autocompletado.

Para linux readline hay función readline.set_completion_display_matches_hook
http://docs.python.org/library/readline.html?highlight=readline#readline.set_completion_display_matches_hook

Así, para el ejemplo mencionado anteriormente el código

def print_suggestions(self, substitution, matches, longest_match_length) : 
    print "useless text to be displayed" 
    print substitution 
    print " ".join[match for match in matches] 
    print longest_match_length 

readline.set_completion_display_matches_hook(print_suggestions) 

esto será produse:
> mk<tab>

useless text to be displayed 
mk 
mkdir mktbl 
5 

> mk<cursor>

Para ventanas readl ine hay una respuesta en el desbordamiento de la pila:
How do I make IPython organize tab completion possibilities by class?

No sé cómo funciona para mac.

Cuestiones relacionadas