J'ai des alias imbriqués et je veux tous les résoudre avant d'exécuter la commande. Comment je fais ça?
S'il y a une fonction qui n'est liée à aucune touche, cela M-x foobar
me convient aussi. Je pourrais même utiliser la commande externe ( type
, command
, which
, peu importe). J'ai tout essayé depuis le fil Pourquoi ne pas utiliser "qui"? Que faut-il utiliser alors? mais rien ne fonctionne.
C-x a
développe l'alias sous le curseur (en supposant que vous utilisez le système de complétion)._expand_alias (^Xa): expands the word the cursor is on if it is an alias
. C'est utile, mais c'est quand même dommage qu'en bash on puisse étendre toute la ligne mais pas en zsh._expand_alias
jusqu'à ce que le tampon d'édition ne change plus.Réponses:
Notez que Ctrl-Alt-E dans
bash
ne développe pas seulement les alias. Il développe également les variables, la substitution de commandes (!), La substitution de processus (!), L'expansion arithmétique et supprime les guillemets (il ne fait pas de génération de nom de fichier (globbing) ou d'expansion de tilde).Il ne parvient pas toujours à étendre les alias. Donc, même s'il a ses utilisations, il est important de réaliser que son résultat change potentiellement la signification de la ligne de commande, a des effets secondaires et est potentiellement dangereux.
Par exemple dans:
Si j'appuie
M-C-E
ici, cela me donne:Ce qui me donne une ligne de commande complètement différente (et imaginez ce qui se serait passé si j'avais eu
rm -rf *
au lieu depwd
ci - dessus) et ne développe pas l'foo
alias.Avec
zsh
, pour s'appuyer sur la note de Gilles sur les alias développés à l'intérieur des fonctions, vous pourriez faire:Cela ne développera les alias que si la ligne de commande actuelle est syntaxiquement valide (elle se double donc d'un vérificateur de syntaxe).
Contrairement à
bash
MCE, il résout également complètement les alias. Par exemple, si vous avez:Sera étendu à:
Notez qu'il canonise également la syntaxe pour des choses comme:
sera changé en:
la source
alias ls='ls --color'
et tapeC-x a
dessusls
, j'obtiens:\ls --color
(pour que le nouveauls
ne soit pas mal interprété comme un alias). Mais avec votreexpand-aliases
, je reçois:,ls --color
rendant le résultat ambigu.bash
équivalent). Mais il est vrai que si vous exécutez la commande après cela, vous obtiendrez un autre cycle d'expansion d'alias (comme dansbash
), donc idéalement, vous voudriez désactiver temporairement l'expansion d'alias, alors par exemple, enveloppez-le dans un(){ setopt localoptions noexpandalias; ...; }
. Notez que vous pouvez dire que le_expand_alias
buggy est aussi bien qu'il étend l'alias lorsqu'il est exécuté\ls
._expand_alias
est également facilement dupe commealias 'foo=repeat 3 foo'
oualias ls='ls --color'; alias '\ls=echo fooled'
. Il n'y a pas de solution parfaite ici._expand_alias
pouralias 'foo=repeat 3 foo'
, je considère le manque backslash comme un bug. Etalias '\ls=echo fooled'
ne devrait pas être autorisé; ici , je préfère bash, qui dit:bash: alias: '\ls': invalid alias name
.bash
. Si vous n'aimez pas les alias avec des barres obliques inverses, ne les utilisez pas, mais pourquoi voudriez-vous que le shell les rejette? Alors que les alias sont un remplacement de fonctions d'un pauvre homme dans csh (d'où ils viennent), dans les shells de type Bourne, ce sont des hacks pour faire des tours qui ne peuvent pas être faits avec des fonctions, une certaine forme d'expansion de macro qui s'accroche tôt dans l'analyseur shell , Je ne vois pas l'intérêt de restreindre ce qu'il peut faire.Si vous remplissez une ligne de commande dans une définition de fonction, puis imprimez la fonction, les alias seront développés. Vous obtiendrez également des espaces normalisés.
Pour mettre tout cela dans une commande interactive, vous pouvez créer un widget zle. Vous pouvez définir une fonction directement en insérant son code dans une entrée du
functions
tableau; vous obtiendrez l'effet de normalisation lorsque vous relirez.Vous obtenez le même effet de normalisation dans le
preexec
crochet . Les alias sont également développés au moment où une fonction est chargée automatiquement (autoload -U
est couramment utilisée pour éviter l'expansion des alias).La
_expand_alias
fonction d'achèvement développe le mot sous le curseur s'il s'agit d'un alias. Il utilise lealiases
tableau . Ce n'est pas récursif. Vous pouvez implémenter un expanseur d'alias plus général en utilisantaliases
, mais c'est un peu difficile, car déterminer les emplacements où les alias sont développés est intimement lié à la syntaxe du shell.la source
autoload -U
simplement parce que la documentation zsh le recommande, mais je n'ai jamais compris ce-U
qui s'est réellement passé avant d'avoir lu ceci :). Aussi pour toute personne intéressée, on peut invoquer les _expand_alias fonctionnent directement en tapant votre alias dans la ligne de commande, frapper<Esc>
,x
pour lancer le mini - tampon, puis en tapant_expand_alias<Enter>
Si vous avez de nombreux alias fantaisie imbriqués et que vous n'êtes pas sûr de ce que zsh fait réellement avec eux et dans quel ordre les options sont passées à la commande, vous pouvez toujours démarrer zsh avec
-x
option. Cela affichera les commandes et les arguments lors de leur exécution.Sachez cependant que cette option est plutôt destinée au débogage, elle imprime donc beaucoup de choses inutiles juste après l'
zsh -x
invocation (essentiellement chaque fonction / widget / plugin de votre .zshrc), et pendant l'exécution de la commande, elle peut également être verbeuse, en particulier si vous avez définipreexec
etprecmd
accroché.Je dois également mentionner qu'il imprime uniquement les commandes qui sont finalement exécutées et que les commandes séparées sont imprimées séparément, donc après
Tu verras
la source