programa - ejecutar script python en windows
Cómo hacer la autocompletación de la línea de comando de python, pero NO solo al principio de una cadena (1)
Python, a través de sus enlaces de línea de lectura, permite una gran autocompletación de la línea de comandos (como se describe aquí ).
Pero, la finalización solo parece funcionar al comienzo de las cadenas. Si desea hacer coincidir el medio o el final de una cadena, la línea de lectura no funciona.
Me gustaría autocompletar cadenas, en un programa de línea de comando python al hacer coincidir lo que escribo con cualquiera de las cadenas en una lista de cadenas disponibles.
- Un buen ejemplo del tipo de autocompletado que me gustaría tener es el tipo que ocurre en GMail cuando escribe en el campo Para. Si escribe uno de los apellidos de sus contactos, aparecerá igual de bien que si escribió su nombre.
- Puede ser necesario usar algunas flechas hacia arriba y hacia abajo o algún otro método para seleccionar entre las cadenas combinadas (y no es necesario en el caso de readline) y eso está bien en mi caso.
- Mi caso de uso particular es un programa de línea de comandos que envía correos electrónicos.
- Ejemplos de código específico serían muy útiles.
Usar emuladores de terminal como maldiciones estaría bien. Solo tiene que ejecutarse en Linux, no en Mac o Windows.
Aquí hay un ejemplo: Digamos que tengo las siguientes tres cadenas en una lista
[''Paul Eden <[email protected]>'',
''Eden Jones <[email protected]>'',
''Somebody Else <[email protected]>'']
Me gustaría un código que complete automáticamente los dos primeros elementos de la lista después de que escriba ''Eden'' y luego me permita elegir uno de ellos (a través de la línea de comandos con el teclado).
No estoy seguro de entender el problema. Puede usar readline.clear_history y readline.add_history para configurar las cadenas completables que desee, luego control-r para buscar la palabra clave en el historial (como si estuviera en un intérprete de comandos de shell). Por ejemplo:
#!/usr/bin/env python
import readline
readline.clear_history()
readline.add_history(''foo'')
readline.add_history(''bar'')
while 1:
print raw_input(''> '')
Alternativamente, puede escribir su propia versión completa y vincular la clave adecuada para ello. Esta versión utiliza el almacenamiento en caché en caso de que su lista de coincidencias sea enorme:
#!/usr/bin/env python
import readline
values = [''Paul Eden <[email protected]>'',
''Eden Jones <[email protected]>'',
''Somebody Else <[email protected]>'']
completions = {}
def completer(text, state):
try:
matches = completions[text]
except KeyError:
matches = [value for value in values
if text.upper() in value.upper()]
completions[text] = matches
try:
return matches[state]
except IndexError:
return None
readline.set_completer(completer)
readline.parse_and_bind(''tab: menu-complete'')
while 1:
a = raw_input(''> '')
print ''said:'', a