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
}