Autocompletar de nombre de archivo en el directorio

16

Esta pregunta es bastante similar a esta , pero no puedo entender la solución. También conozco este tutorial , pero aún no puedo entender lo que estoy haciendo mal.

Estoy tratando de completar automáticamente la lista de directorios que se encuentran en /something/:

$ ls /something/

One    Other    Three

de una manera que esto sucederá:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Solo cuando la primera palabra es hiy no solo adentro /something/.

Esto es lo que estoy haciendo en .profile:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen `ls /something/` -- $cur) )

}
complete -F _codeComplete "hi "
Donovan
fuente

Respuestas:

15

Tratar:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

Debe especificar la -Wopción encompgen y también citar el comando que produce la lista de palabras.

Más información sobre cómo escribir funciones de finalización en este blog: escribir su propia función de finalización de Bash

dogbane
fuente
66
Esto fallará en los nombres de archivos que contienen espacios en blanco y otros caracteres especiales.
Gilles 'SO- deja de ser malvado'
2
Es extrañamente difícil encontrar el nombre del completecomando si aún no lo sabe y está buscando autocompleteo tab-completion... Este fue el primer lugar donde encontré el nombre del comando, y para lo que necesitaba arreglarlo ejecten la actualización a Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt ls, entonces la solución fue complete -F _longopt eject
:)
1

Permítanme tratar de mejorar la respuesta aceptada.

La respuesta original fallará con los nombres de archivo que contienen espacios en blanco. Después de investigar un poco, me doy cuenta de que puede cambiar el separador de entrada al final de la línea:

IFS=$'\n'

haciendo que la función maneje espacios correctamente.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi
Eduardo Almeida dos Santos
fuente
1

Aquí hay una versión que no solo maneja espacios, sino que también los escapa:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local AUTO_COMPLETE_DIRS=$(ls /something/)

    IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
    COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
    COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))

}
complete -F _codeComplete "hi "

(Basado en las adelfas 's y Eduardo Almeida dos Santos ' respuestas, pero con escapar a lo dispuesto por antak en SO: /programming//a/11536437/1536933 )

EM0
fuente
0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
xdch47
fuente