Je voudrais demander à bash d'utiliser une méthode spéciale pour effectuer la complétion sur certains noms de répertoire. Par exemple, bash appellerait un de mes programmes pour effectuer la complétion si un chemin commence par "$$", et effectuer la complétion normalement sinon.
Est-ce possible? Comment le mettriez-vous en œuvre?
Bounty : J'apprécierais vraiment une réponse à cette question. Le but est de permettre au saut automatique de terminer les chemins pour toutes les commandes lorsque l'utilisateur les démarre avec un certain préfixe. Ainsi, par exemple, lors de la copie d'un fichier à partir d'un répertoire distant, vous pouvez taper:
cp $$patern + <Tab>
et le saut automatique se terminerait
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
et vous auriez juste à ajouter où vous voulez mettre le fichier. Bien sûr, je peux utiliser le commentaire d'ott pour l'ajouter à quelques commandes spécifiques, mais si quelqu'un a une meilleure idée, je serais très reconnaissant.
la source
Réponses:
Vous pouvez le faire en remplaçant la liaison par défaut pour TAB (^ i). Vous devez d'abord remplacer la liaison TAB, puis vous devez créer une fonction qui appelle votre commande, enfin vous devez prendre la sortie de cette commande et mettre à jour la variable qui contient la ligne de commande actuelle.
Cette fonction prend la ligne de commande actuelle et change les deux derniers caractères en «huugs».
Pour votre exemple, vous voudrez probablement changer la ligne new_argument pour ressembler à ceci:
Remplacez maintenant la liaison ^ i:
Maintenant, testez que cela fonctionne:
donc l'achèvement normal fonctionne toujours, vous pouvez tester la partie $$ en faisant cd $$ ... etc
Si vous rencontrez des problèmes, activez le mode détaillé:
Il imprimera tout ce que fait la fonction.
J'ai testé cela sur Ubuntu 11 en utilisant bash 4.2.8 (1) -release (la valeur par défaut).
la source
La routine de complétion bash peut être programmée comme un script shell.
Voici un exemple de script shell qui remplacera n'importe quel paramètre
$$[Tab]
parmy replacement string
, mais uniquement pour la commande spécifiquemycommand
et uniquement si le paramètre est exactement "$$":Vous devez source le script à bash via
source <file-name>
(ou la commande dot) pour le démarrer, puis:Pour toujours le faire fonctionner pour certains ou tous les utilisateurs, incluez-le dans l'une des routines de profil bash .
Le problème avec la
complete
commande, c'est qu'elle ne fonctionnera que pour un ou plusieurs noms de commandes, qui sont spécifiés comme paramètres. On pourrait simplement lui donner la liste de toutes les commandes qui pourraient éventuellement être utilisées par les utilisateurs, ou dans des cas désespérés se développer/bin/* /usr/bin/* ~/bin/*
.Testé sur CentOS 5.5.
Ce script simple est basé sur les sources que j'ai énumérées dans mon autre réponse - celle qui a été supprimée par le modérateur studiohack. Si vous êtes intéressé, demandez-lui simplement de le supprimer.
la source