La finalización automática de Bash no funciona después de cierto comando

La finalización automática de Bash no funciona después de cierto comando

Estoy usando GraphViz en bash/Cygwin, pero de alguna manera, cuando lo llamo, el autocompletado de la pestaña bash no hace nada.

Archivos de ejemplo:

  • myGraph.graphvizes el archivo de entrada
  • myGraph.graphviz.pngdebería ser el archivo de salida.

El comando para hacer el gráfico es

dot -T png -o myGraph.graphviz.png myGraph.graphviz

Por supuesto que quiero ingresar

punto -T png -o mi Tab.png miTab

para autocompletar estos nombres de archivos, ¡pero no pasa nada! Puedo entrar y da , pero ¿por qué no funciona después ? ¿Bash necesita un módulo de autocompletar adicional para cada comando que pueda ingresar?cat myTabcat myGraph.graphvizdot

Respuesta1

Creé los archivos de ejemplo en mi Debian. De hecho, no funciona. Luego (después de completar manualmente) tampoco funciona. Hay dos cuestiones separadas.dot -T png -o myTabdot -T png -o myGraph.graphviz.png myTab


el manual generalpara programas Graphviz especifica:

-ooutfile
Escribir salida en archivoarchivo. […]

La finalización de Bash en mi Debian obedece esto literalmente: admite archivos , no archivos . Incluso si este último funciona (y no lo sé), la finalización no lo admite. Deberías proceder así:-ooutfile-o outfiledot

punto -T png -omiTab

sin ningún espacio después -o. En mis pruebas, lo anterior funciona.


Para hacer el segundo Tabtrabajo lo inspeccioné /usr/share/bash-completion/completions/dot. La línea relevante cerca del final es:

_filedir dot

Esto le ofrecerá directorios a los que descender y archivos que especificar, pero sólo archivos con nombres que terminen en .doto .DOT. Probablemente puedasa manoproporcione un archivo que no coincida con este patrón y no sucederá nada malo; sin embargo, si confía en el mecanismo de finalización, el nombre del archivo debería terminar correctamente.

De hecho, no sé dotnada, conozco un poco las completaciones de Bash. Tal vez el requisito no tenga sentido y completarlo dotsería más útil si lo permitiera.cualquierarchivo. En tal caso copio el archivo original /etc/bash_completion.d/y modifico la copia, por lo que la línea

_filedir dot

al final de la función se convierte

_filedir

Este es un cambio que afecta a todo el sistema. El cambio no afectará a los shells existentes, así que inicie uno nuevo bashpara probarlo. Si no puede (o no quiere) modificar /etc/bash_completion.d/, consulteesta respuesta. Proporciona una manera de tener su archivo privado (específico del usuario) bash_completion.d/.

Tenga en cuenta que este cambio le permitirá escribir y la finalización funcionará. Sin embargo, en este caso particular, no tiene nada que ver internamente, es la finalización general de operandos y funcionaría incluso después de alguna opción inesperada o no válida (por ejemplo ).dot -T png -o myTab-odot -T png -: myTab

Respuesta2

Esto puede suceder si hay otro dotcomando en el sistema para el cual está instalada una definición de autocompletar real y ese comando no espera un archivo en ese momento. Obtiene el autocompletado de archivos en todos los parámetros de forma predeterminada para comandos desconocidos, pero comandos específicos pueden establecer su propio autocompletado específico. Verifique /etc/bash_completiony /etc/bash_completion.d/.

PD: Otra explicación es que el dotscript de autocompletar no es coherente con el documento o que cometiste un error en tus argumentos.

información relacionada