J'essaie de configurer l'achèvement du répertoire dans tcsh et/ou bash (les deux sont utilisés sur mon site) avec une légère rotation: pour une commande particulière "foo" , J'aimerais que l'achèvement utilise une fonction personnalisée pour faire correspondre le premier terme/-delimited à un nœud de sous-arbre réel, puis suivre l'achèvement normal du répertoire pour tous les termes successifs. C'est en quelque sorte une combinaison de cdpath et d'achèvement, ou je suppose que c'est une forme d'achèvement de répertoire où le point de départ est contrôlé par le script d'achèvement. Il fonctionnerait comme suit:Achèvement du répertoire Tcsh et/ou bash avec préfixe racine caché variable
$ 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/...
Nous aimerions faire cela parce que nous avons un grand arbre de développement de la production (ce qui est une installation de production de CGI), que les utilisateurs shell avertis naviguent et sauter dans tous les temps. La plainte est que les niveaux supérieurs de l'arbre sont encombrants et redondants; ils ont juste besoin d'une recherche rapide sur le premier terme pour trouver des choix de tête possibles et faire l'achèvement du répertoire à partir de là. Il semble que l'achèvement programmable pourrait offrir un moyen de le faire, mais il s'avère être assez difficile à atteindre. J'ai fait plusieurs tentatives de complétion personnalisée de bash et de tcsh pour cela, mais le plus proche est une forme de "complétion de mot" où l'utilisateur doit traiter les niveaux de répertoire comme des mots séparés avec des espaces (par ex. foo scène/tir/élément/espace de travail/...). Je pourrais continuer à pirater mes scripts actuels - mais je me demandais s'il y avait quelque chose que je ne comprends pas - c'est ma première tentative d'achèvement du programme, et les docs et exemples sont assez minces dans les livres shell et sur internet . S'il y a un gourou de l'achèvement qui peut me mettre sur la bonne voie, j'apprécierais. FWIW: voici ce que j'ai jusqu'ici (dans tcsh d'abord, puis bash). Notez que la racine statique '/ root/sub1/sub2/sub3' est juste un espace réservé pour une fonction de recherche qui trouverait différentes correspondances dans différents niveaux. Si je peux obtenir que cela fonctionne, je peux sous la fonction de recherche plus tard. Encore une fois, les deux exemples font l'achèvement du mot, ce qui oblige l'utilisateur à taper un espace après chaque terme correspondant (je dois également supprimer les espaces dans la fonction pour construire un chemin réel, beurk!)
TCSH EXEMPLE (notez que la fonction est en fait un 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 Exemple:
_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 variable d'environnement CDPATH de bash fonctionnerait-elle pour vous? – Cascabel
J'ai regardé dans CDPATH, mais cela ne fonctionne pas avec l'achèvement. Vous pouvez "cd name", mais pas "cd name ..." J'ai vraiment besoin de l'achèvement. –
Je pensais que l'achèvement de bash (le script supplémentaire plein de goodies utiles qui sont livrés avec bash sur la plupart des distributions) incluait une définition mise à jour de l'achèvement de CD en utilisant CDPATH. – Cascabel