Sto cercando di impostare il completamento della directory in tcsh e/o bash (entrambi sono utilizzati nel mio sito) con una leggera svolta: per un comando particolare "foo" , Mi piacerebbe avere il completamento utilizzare una funzione personalizzata per abbinare il primo/-limitato termine a un vero sottostrato nodo, e quindi seguire il normale completamento della directory per eventuali termini successivi. È una specie di combinazione di cdpath e completamento, o suppongo una forma di completamento della directory in cui il punto di partenza è controllato dallo script di completamento. Funzionerebbe come segue:Completamento della directory Tcsh e/o bash con prefisso radice nascosto variabile
$ foo xxx<TAB>
(custom completion function produces choices it finds at arbitrary levels in the dir tree)
xxxYYY xxxZZZ xxxBLAH ...
foo xxxYYY/<TAB>
(normal directory completion proceeds from this point on, to produce something like:)
foo scene/shot/element/workspace/user/...
Vorremmo fare questo perché abbiamo un grande albero di sviluppo della produzione (si tratta di un impianto di produzione CGI), che gli utenti della shell-savvy navigano e saltare in giro per tutto il tempo. La lamentela è che i livelli superiori dell'albero sono ingombranti e ridondanti; hanno solo bisogno di una rapida ricerca sul primo termine per trovare possibili scelte "di testa" e fare il completamento delle directory da lì. Sembra che il completamento programmabile possa offrire un modo per farlo, ma si sta rivelando piuttosto elusivo.
Ho fatto diversi tentativi di completamento personalizzato bash e tcsh per farlo, ma il più vicino che ho ottenuto è una forma di "completamento delle parole" in cui l'utente deve trattare i livelli di directory come parole separate con spazi (ad es. foo scene/shot/element/workspace/...). Potrei continuare a hackerare i miei script correnti, ma mi sono chiesto se c'è qualcosa che non sto capendo - questo è il mio primo tentativo di completamento del programma, e i documenti e gli esempi sono piuttosto sottili nei libri di shell e su internet . Se c'è qualche guru del completamento là fuori che può farmi sulla strada giusta, lo apprezzerei.
FWIW: ecco quello che ho ottenuto finora (in tcsh prima, quindi bash). Si noti che la root statica '/ root/sub1/sub2/sub3' è solo un segnaposto per una funzione di ricerca che troverà corrispondenze diverse in livelli diversi. Se riesco a farlo funzionare, posso inserire successivamente la funzione di ricerca. Ancora, entrambi gli esempi eseguono il completamento delle parole, che richiede all'utente di digitare uno spazio dopo ogni termine corrispondente (devo anche rimuovere gli spazi nella funzione per costruire un percorso effettivo, yuck!)
ESEMPIO TCSH (notare che la funzione è in realtà uno script bash):
complete complete_p2 '[email protected]*@`./complete.p2.list.bash $:1 $:2 $:3 $:4 $:5 $:6 $:7 $:8 $:9`@@'
#!/bin/bash --norc
# complete.p2.list.bash - Completion prototype "p2" for shotc command
# Remove spaces from input arguments
ppath=`echo [email protected] | sed -e 's/ //g'`
# Print basenames (with trailing slashes) of matching dirs for completion
ls -1 -d /root/sub1/sub2/sub3/$ppath* 2>/dev/null | sed -e 's#^.*/##' | awk '{print $1 "/"}'
bASH ESEMPIO:
_foo()
{
local cur prev opts flist
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Get all command words so far (omit command [0] element itself), remove spaces
terms=`echo ${COMP_WORDS[@]:1} | sed -e 's/ //g'`
# Get basenames (with trailing slashes) of matching dirs for completion
flist=`ls -1 -d /root/sub1/sub2/sub3/${terms}* 2>/dev/null | sed -e 's#^.*/##' | awk '{print $1 "/"}' | xargs echo`
COMPREPLY=($(compgen -W "${flist}" ${cur}))
return 0
}
complete -F _foo foo
La variabile di ambiente CDPATH di bash può funzionare correttamente? – Cascabel
Ho esaminato CDPATH, ma non funziona CON il completamento. Puoi "cd name", ma non "cd name ..." Ho davvero bisogno del completamento. –
Ho pensato che il completamento di bash (lo script extra pieno di chicche utili fornite con la maggior parte delle distro) includesse una definizione aggiornata del completamento del cd usando CDPATH. – Cascabel