2010-02-26 3 views
9

J'essaie de créer un script d'achèvement Bash pour un programme Java. Un appel typique de ce programme pourrait ressembler à ceci:Ajouter des espaces à la fin de certaines options Bash autocomplete, mais pas à d'autres?

$ javaProgram -Dproperty=foo option1 option2 

Une partie de mon script sera de suggérer les différentes propriétés Java qui sont disponibles pour ce programme (lorsque les types d'utilisateurs -D, le script suggère, disons, property=, permettant à l'utilisateur de taper ensuite la valeur).

Je voudrais que l'achèvement n'insère pas d'espace après le signe égal. Cependant, lorsque l'utilisateur saisit les différentes options pour le programme (option1 et option2 dans l'exemple ci-dessus), je voudrais que le script fasse l'achèvement et insère un espace quand il est terminé.

Je suis nouveau dans le script de complétion Bash, mais je connais l'option nospace pour le shell intégré complete. Il ne semble pas fonctionner pour le compgen intégré, cependant, ce qui semble être ce que je veux. J'ai essayé d'utiliser nospace, puis j'incluais explicitement les espaces à la fin des options appropriées, mais ils ne semblaient pas le faire.

Est-ce que quelqu'un sait comment obtenir des espaces à la fin de certaines options, mais pas d'espaces à la fin des autres?

Répondre

1

Il serait utile de voir le code que vous avez jusqu'à présent.

Cependant, regardez le code d'achèvement pour scp dans /etc/bash_completion.d/ssh si vous en avez. Il place des espaces après les noms de fichiers locaux mais pas après les noms d'hôtes.

1

Dennis est juste sur l'argent, dans la fonction que vous faites référence avec complete -F _your_func, vous voulez quelque chose comme ceci (extrait de/etc/bash_completion):

# escape spaces; remove executables, aliases, pipes and sockets; 
    # add space at end of file names 
    COMPREPLY=($(ssh -o 'Batchmode yes' $userhost \ 
       command ls -aF1d "$path*" 2>/dev/null | \ 
       sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \ 
       -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g')) 
    return 0 

Cet exemple particulier utilise l'option -o nospace mais ajoute la espace manuellement. C'est la dernière -e ('s/[^\/]$/& /g') qui ajoute l'espace. Dans ce cas, il s'agit d'ajouter seulement si le dernier paramètre ne se termine pas par une barre oblique (qui serait un répertoire et aurait des fichiers à compléter automatiquement). La différence clé semble être d'ajouter une esperluette avant l'espace. Essayez cela et voyez si cela fonctionne.

5

La fonctionnalité dans l'achèvement de bash de scp mentionné par C4H5As qui retient l'espace ajouté n'est pas l'esperluette, c'est juste la syntaxe sed pour "replace with match".

Vous devez changer les IFS afin compgen ne divise pas l'entrée sur les espaces, mais sur les nouvelles lignes ou onglets:

local IFS=$'\t\n' 
COMPREPLY=($(compgen -W "$options" -- $cur)) 
0

Vous pouvez le faire en supprimant des espaces avec l'option correspondante, puis les ajouter manuellement les options où vous le souhaitez, tout en utilisant la -W simple ("wordlist") achèvement:

complete -o nospace -W 'Dproperty= "option1 " "option2 "' javaProgram 

Autocompletion va maintenant insérer un espace après option1 et option2, mais aucun après Dproperty=

Questions connexes