una otra nombres nombre mover espacios entrar ejemplos copiar contenido con como comandos comando carpetas carpeta cambiar basicos archivos archivo bash directory bash-completion

bash - otra - mover carpetas en ubuntu terminal



la finalizaciĆ³n del directorio personalizado agrega espacios en blanco (4)

Tengo la siguiente estructura de directorio:

/home/tichy/xxx/yyy/aaa /home/tichy/xxx/yyy/aab /home/tichy/xxx/yyy/aac

Me gustaría ingresar cdw y <TAB> y obtener cdw yyy / <CURSOR> como resultado, así que podría agregar cdw yyy / a <TAB> y obtener cdw yyy / aa <CURSOR>

La solución que surgió me da lo siguiente:
cdw y <TAB> => cdw yyy <ESPACIO> <CURSOR>

El siguiente código que tengo hasta ahora:

_cdw () { local cur prev dirs COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" COMPREPLY=($(compgen -d -- /home/tichy/xxx/${cur}|perl -pe ''s{^/home/tichy/xxx/}{}'')) # no difference, a bit more logical: dirs=$(compgen -o nospace -d /home/tichy/xxx/${cur}|perl -pe ''s/{^/home/tichy/xxx/}{}'') COMPREPLY=($(compgen -d -W ${dir} ${cur}|perl -pe ''s{^/home/tichy/xxx/}{}'')) return 0 } complete -F _cdw cdw cdw () { cd /home/tichy/xxx/$@ }

Alguna idea de lo que está mal? Me parece que el proceso de finalización parece haber finalizado y no se espera más información.


Qué tal algo como esto:

COMPREPLY=( $(cdw; compgen -W "$(for d in ${cur}* ${cur}*/*; do [[ -d "$d" ]] && echo $d/; done)" -- ${cur}) )

(No estoy seguro de si puede llamar a su función de shell desde aquí o no; de lo contrario, es posible que deba duplicarla un poco).

Esto también elimina tu perl hack :-)


Si entiendo correctamente, ¿quieres bash-autocompletar un nombre de directorio, y no tener el espacio extra? (Eso es lo que estaba buscando cuando llegué a esta página).

Si es así, cuando registra la función de finalización, use "-o nospace".

complete -o nospace -F _cdw cdw

No sé si nospace funciona en compgen.


La solución más simple que he encontrado hasta ahora es generar terminaciones que se vean así:

COMPREPLY=$( compgen -W "file1 file2 file3 dir1/ dir2/ dir3/" )

y agrega esta línea justo antes de regresar

[[ $COMPREPLY = */ ]] && compopt -o nospace

Esto establece la opción nospace siempre que la finalización se complete hasta la barra para que el usuario termine con:

cmd dir1/<cursorhere>

en lugar de:

cmd dir1/ <cursorhere>

y no establece la opción nospace cada vez que la finalización puede completar hasta un nombre de archivo completo para que el usuario termine con:

cmd file1 <cursorhere>

en lugar de:

cmd file1<cursorhere>


completion proporciona una solución para esto sin ningún tipo de solución alternativa: funciton _filedir definido en / etc / bash_completion:

626 # This function performs file and directory completion. It''s better than 627 # simply using ''compgen -f'', because it honours spaces in filenames. 628 # @param $1 If `-d'', complete only on directories. Otherwise filter/pick only 629 # completions with `.$1'' and the uppercase version of it as file 630 # extension. 631 # 632 _filedir()

Entonces, especificar lo siguiente es suficiente:

_cdw () { local cur prev dirs cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" _filedir # add -d at the end to complete only dirs, no files return 0 }