Aninhei aliases e desejo resolvê-los antes de executar o comando. Como faço isso?
Se existe uma função que não está vinculada a nenhuma tecla, também M-x foobar
é bom para mim. Eu poderia até usar comando externo ( type
, command
, which
, qualquer que seja). Eu tentei de tudo, desde o segmento Por que não usar "what"? O que usar então? mas nada funciona.
C-x a
expande o alias sob o cursor (supondo que você esteja usando o sistema de conclusão)._expand_alias (^Xa): expands the word the cursor is on if it is an alias
. Isso é útil, porém ainda é uma pena que no bash se possa expandir toda a linha, mas no zsh não._expand_alias
até que o buffer de edição não seja mais alterado.Respostas:
Observe que Ctrl-Alt-E in
bash
não apenas expande aliases. Também expande variáveis, substituição de comando (!), Substituição de processo (!), Expansão aritmética e remove aspas (não gera geração de nome de arquivo (globbing) ou expansão de til).Nem sempre consegue expandir aliases. Portanto, embora tenha seus usos, é importante perceber que seu resultado potencialmente altera o significado da linha de comando, tem efeitos colaterais e é potencialmente perigoso.
Por exemplo, em:
Se eu pressionar
M-C-E
aqui, isso me dá:O que me dá uma linha de comando completamente diferente (e imagine o que teria acontecido se eu tivesse tido em
rm -rf *
vez depwd
acima) e não expande ofoo
alias.Com
zsh
, para aumentar a nota de Gilles sobre aliases expandidos dentro de funções, você pode:Isso expandirá os aliases apenas se a linha de comando atual for sintaticamente válida (portanto, ela também funciona como um verificador de sintaxe).
Ao contrário
bash
do MCE, ele também resolve completamente os aliases. Por exemplo, se você tiver:Será expandido para:
Observe que ele também canoniza a sintaxe para coisas como:
será alterado para:
fonte
alias ls='ls --color'
e digiteC-x a
maisls
, eu recebo:\ls --color
(para que o novols
não é mal interpretado como um alias). Mas com o seuexpand-aliases
, eu recebols --color
:, tornando o resultado ambíguo.bash
equivalente). Mas é verdade que, se você executar o comando depois disso, obterá outra rodada de expansão de alias (como embash
); portanto, idealmente, você deseja desativar temporariamente a expansão de alias, por exemplo, envolva isso em a(){ setopt localoptions noexpandalias; ...; }
. Observe que você pode dizer que o_expand_alias
buggy é bem como expande o alias quando executado\ls
._expand_alias
também é facilmente enganada comoalias 'foo=repeat 3 foo'
oualias ls='ls --color'; alias '\ls=echo fooled'
. Não há solução perfeita aqui._expand_alias
a issoalias 'foo=repeat 3 foo'
, eu consideraria a barra invertida ausente como um bug. Ealias '\ls=echo fooled'
não deve ser permitido; aqui eu prefiro bash, que diz:bash: alias: '\ls': invalid alias name
.bash
. Se você não gosta de aliases com barras invertidas, não os use, mas por que deseja que o shell os rejeite? Embora os aliases sejam uma substituição das funções de um homem pobre no csh (de onde eles vêm), nos shells do tipo Bourne, eles são hacks para fazer truques que não podem ser feitos com funções, alguma forma de expansão de macro que se conecta no início no analisador de shell , Não vejo sentido em restringir o que ele pode fazer.Se você inserir uma linha de comando em uma definição de função e depois imprimir a função, os aliases serão expandidos. Você também terá espaço em branco normalizado.
Para colocar tudo isso em um comando interativo, você pode criar um widget zle. Você pode definir uma função diretamente inserindo seu código em uma entrada na
functions
matriz; você obterá o efeito de normalização quando voltar a ler.Você obtém o mesmo efeito de normalização no
preexec
gancho . Os aliases também são expandidos no momento em que uma função é carregada automaticamente (autoload -U
geralmente é usada para evitar a expansão do alias).A
_expand_alias
função de conclusão expande a palavra sob o cursor se for um alias. Ele usa aaliases
matriz . Não é recursivo. Você pode implementar um expansor de alias mais geral usandoaliases
, mas é um pouco difícil, porque descobrir os locais onde os alias são expandidos está intimamente conectado à sintaxe do shell.fonte
autoload -U
simplesmente porque a documentação do zsh o recomenda, mas nunca entendi o que-U
realmente fazia até ler isso :). Também para qualquer pessoa interessada, pode-se invocar as _expand_alias funcionar diretamente digitando seu alias na linha de comando, batendo<Esc>
,x
, para iniciar o minibuffer, em seguida, digitando_expand_alias<Enter>
Se você tem muitos aliases sofisticados aninhados e não tem certeza do que o zsh está realmente fazendo com eles e em qual ordem as opções são passadas para o comando, sempre é possível iniciar o zsh com a
-x
opção Isso imprimirá comandos e argumentos conforme eles são executados.Esteja ciente, no entanto, de que esta opção é destinada para fins de depuração, para que imprima muitas coisas inúteis logo após a
zsh -x
chamada (basicamente todas as funções / widget / plug-in do seu .zshrc) e, durante a execução do comando, também pode ser detalhada, especialmente se você tiver definidopreexec
eprecmd
gancho.Devo também mencionar que ele imprime apenas os comandos que são finalmente executados, e os comandos separados são impressos separadamente.
Você verá
fonte