Bash autocompletar con el comando vim

13

En bash, el autocompletado de rutas ha dejado de funcionar recientemente al emitir vimcomandos donde la ruta es más profunda que dos directorios (continúa funcionando como se esperaba con otros comandos, como lsy cd).

Por ejemplo, si escribo ls .config/btsync/bty luego presiono TAB, se expande a ls .config/btsync/btsync.conf.

Si escribo vim .config/bty luego presiono TAB, se expande a vim .config/btsync/.

Sin embargo, si escribo vim .config/btsync/bty luego presiono TAB, no sucede nada (esperaría que se expanda vim .config/btsync/btsync.conf, como en el lsejemplo anterior).

Tengo el mismo problema cuando ejecuto como mi propio usuario y cuando ejecuto como su.

Leí esta publicación que mencionaba un problema con versiones anteriores de bash-complete pero estoy ejecutando 2.1-5.

ACTUALIZACIÓN: Después de algunas pruebas adicionales, descubrí que el problema raíz es que bash solo completará los nombres de directorio, no los nombres de archivo.

ACTUALIZACIÓN: Resulta que esa bash-completionfue la causa general. Vea mi segundo comentario sobre la respuesta aceptada.

¡Cualquier sugerencia sobre la posible causa de este comportamiento sería recibida con gratitud!

TheRogueWolf
fuente
Publica tu .bashrc!
Gilles 'SO- deja de ser malvado'
Enlace a mi .bashrcpublicado, según lo exigido.
TheRogueWolf
Se eliminaron los enlaces a .bashrc, .aliases y .functions como no relevantes para el problema ahora que se ha descubierto la causa.
TheRogueWolf
mismo problema en Debian 9, algunas instalaciones pero no todas: $
Philippe Gachoud

Respuestas:

10

Investigué un poco más para usted y esto es lo que encontré: la clave para el autocompletado es el bashcomando complete. Puede imprimir las reglas para vimusar:

complete -p vim

Del mismo modo, puede eliminar estas reglas específicas con:

complete -r vim

Este comando lo restablece a los valores predeterminados: las rutas habituales y la finalización de los nombres de archivo sin ninguna lógica adicional. Eso es probablemente lo que quieres.

Para obtener más información, consulte help completeo man bashbusque la sección sobre el completecomando (es un bash incorporado, por lo tanto, está documentado en la página de manual de bash).

Un último punto: los cambios anteriores solo afectan a la bashsesión actual , si desea eliminar las reglas vim después de cada inicio de sesión, coloque el complete -r vimen su ~/.bashrc.

Espero que ayude :)

MLu
fuente
Eso lo hizo. Muchas muchas gracias. El complete -p vimcomando regresó complete -F _filedir_xspec vimque fue eliminado por el complete -r vimcomando, resolviendo el problema. Voy a leer un poco sobre el completecomando y la información devuelta por el modificador -p. Ligeramente desconcertado por qué este comportamiento cambió, también lo investigará.
TheRogueWolf
3
Parece que después de todo, culpar a bash fue el culpable. La _filedir_xspecfunción /usr/share/bash-completion/bash_completionsolo completa directorios. Desinstalé bash-completion, eliminé la complete -r vimlínea .bashrcy reinicié y vimahora se comporta como se esperaba.
TheRogueWolf
3

Bash por defecto autocompleta solo la ruta y los nombres de archivo. Sin embargo, el mecanismo es extensible y se puede enseñar a bash a realizar diferentes autocompletados para diferentes programas. Por ejemplo git, puede completar automáticamente los nombres de los subcomandos (clonar, confirmar) y revisiones en lugar de solo nombres de ruta. A veces es útil, a veces bastante molesto, por ejemplo, cuando se gzip -dniega a completar automáticamente los nombres de archivo que no tienen la .gzextensión.

La finalización de Bash generalmente se configura en /etc/bash_completion.d: probablemente encontrará un archivo llamado vimallí. Ese es el archivo que contiene las reglas de autocompletado para la vimlínea de comandos.

Ahora tienes dos opciones:

  1. Arregle el archivo para completar automáticamente las rutas como los usuarios probablemente esperan de todos modos.
  2. Elimine el archivo para deshabilitar las vimreglas especiales y solo realice el autocompletado de ruta predeterminado.

Y, por supuesto, presente un informe de error que describa el problema para que se solucione en las futuras versiones :)

MLu
fuente
Muchas gracias por la gran explicación :) He echado un vistazo /etc/bash_completion.dy solo hay un hgarchivo presente (para Mercurial). Muy extraño.
TheRogueWolf
1
Entonces debe estar en otra parte. Intente /usr/share/bash-completion/o enumere todos los archivos del vimpaquete o desde basho bash-completionpaquetes (no estoy seguro de cómo se llama en ArchLinux). Estará allí en alguna parte.
MLu
1
El listado de archivos del bash-completionpaquete muestra /usr/share/bash-completion/completionscontiene reglas para muchos programas, pero no vim. La lista de archivos instalados con el vimpaquete no muestra ningún archivo relacionado con la finalización y la búsqueda en todo el sistema usando find / -name vimtampoco muestra ningún archivo relacionado con la finalización.
TheRogueWolf
2

Quizás podría reinstalar bash-complete: apt-get install --reinstall bash-completion

Y eche un vistazo al archivo /etc/bash.bashrc: nano /etc/bash.bashrc

Y verifique que la siguiente línea no esté bien comentada:

if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

Luego, reinicie su sesión de terminal

Djidiouf
fuente
Traté de eliminar bash-completion, probar el vimcomportamiento y luego reinstalar bash-completiony probar, pero aún tuve el mismo problema en ambas circunstancias. Las líneas que ha enumerado no están presentes /etc/bash.bashrc. Esta línea es, sin embargo[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf