Completar automáticamente Bash con espacios adicionales: ¿por qué y cómo solucionarlo?


29

Utilizo completar pestañas más que escribir letras. Solía ​​escribir rm ~/De<TAB>y se completaría para rm ~/Desktop/poder continuar en el siguiente nivel.

Recientemente, ese comportamiento cambió. La finalización ahora produce rm ~/Desktop<SPACE>, lo que significa que debo retroceder y escribir la barra diagonal si quiero continuar. Esto me hace llorar.

Los cambios parecen estar situada en la función _longopt()de /etc/bash_completion, sin embargo, que es por lo que yo puedo seguir. ¿Es este cambio intencional y, de ser así, para qué sirve? ¿Puedo recuperar el comportamiento anterior, preferiblemente mediante una opción de configuración en lugar de simplemente copiar el código anterior desde algún otro sistema?

Editar: La función de referencia.

_longopt()
{
    local cur prev split=false
    _get_comp_words_by_ref -n = cur prev

    _split_longopt && split=true

    case "$prev" in
        --*[Dd][Ii][Rr]*)
            _filedir -d
            return 0
            ;;
        --*[Ff][Ii][Ll][Ee]*|--*[Pp][Aa][Tt][Hh]*)
            _filedir
            return 0
            ;;
    esac

    $split && return 0

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W "$( $1 --help 2>&1 | \
            sed -ne 's/.*\(--[-A-Za-z0-9]\{1,\}\).*/\1/p' | sort -u )" \
            -- "$cur" ) )
    elif [[ "$1" == @(mk|rm)dir ]]; then
        _filedir -d
    else
        _filedir
    fi
}

La única forma en que podría ver que esto tendría sentido es si ~ / Desktop es un archivo o un directorio vacío . Y en el segundo caso, eso solo es útil para comandos como rmdir, no para mkdiro touch.
2011

¿Podría publicar el cuerpo de su _longopt()función?
Aleksandr Levchuk

@MPi: tenga en cuenta que la finalización podría depender del comando (primera palabra de la línea de comando). También puede depender de la readlineconfiguración (¿tiene un ~/inputrcarchivo?) Y del hecho de que el elemento es un directorio real o un enlace simbólico a un directorio.
enzotib

Por supuesto, la finalización depende de la primera palabra de la línea. Es por eso que a veces uso un comando de fantasía para engañar a la finalización, y solo lo cambio al comando real antes de enviarlo. Y no tengo más .inputrcen este sistema. (Esos eran los días, arreglando las teclas de retroceso y cursor ...) Y sucede para todos los elementos, directorio o archivo, enlace simbólico o no.
MPi

1
Excelente pregunta, he observado exactamente el mismo comportamiento, y me molesta. Sin embargo, no tengo idea de la razón.
Christoph

Respuestas:


22

Este es un error conocido. Vea esta pregunta de LP y estos errores 1 2 .

Este comentario parece ser la solución. Si no puede esperar a que una solución se filtre por los canales normales, edite la /etc/bash_completionlínea 1587, cambie defaulta filenames(haga una copia de seguridad primero).


3
Resumen: es un error, puede solucionarlo localmente hasta que llegue el parche editando la /etc/bash_completionlínea 1587, cambie defaulta filenames.
MPi

edited my anwer
Christoph

9

Tuve y resolví el mismo problema después de instalar Adobe Reader en Ubuntu 12.04.

Comenté el _filedirbloqueo /etc/bash_completion.d/acroread.shy funcionó normalmente de nuevo.


A partir de la fecha de hoy, esto es lo que también funcionó para mí.
John Moeller

1
Lo mismo aquí: acroread lo activó y comentar el _filedirbloque (justo en la parte superior) lo arregló. Tienes que cerrar sesión o ejecutar 'exec bash' en todos tus shells para ver el efecto, mira esta pregunta .
dirkjot

2

Tuve el mismo problema y lo solucioné eliminando el directorio /etc/bash_completion.d/, luego reinstalé bash_completion. Supongo que un archivo antiguo estaba en este directorio ... Espero que también resuelva su problema.



2
Esto, de hecho, lo arregló. Sin embargo, ese método es demasiado radical, ya que arroja muchas terminaciones. Después de eliminar el paquete bash-completion, uno de los archivos restantes /etc/bash_completion.d/debe ser el culpable. Fue acroread.shen mi caso, redefine _filedir.
MPi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.