He anidado alias y quiero resolverlos todos antes de ejecutar el comando. ¿Cómo puedo hacer eso?
Si hay una función que no está vinculada a ninguna tecla, también M-x foobar
está bien para mí. Incluso podría utilizar comando externo ( type
, command
, which
, lo que sea). Intenté todo desde el hilo ¿Por qué no usar "which"? ¿Qué usar entonces? Pero nada funciona.
C-x a
expande el alias debajo del cursor (suponiendo que esté utilizando el sistema de finalización)._expand_alias (^Xa): expands the word the cursor is on if it is an alias
. Eso es útil, sin embargo, es una pena que en bash se pueda expandir toda la línea, pero en zsh no._expand_alias
hasta que el búfer de edición ya no cambie.Respuestas:
Tenga en cuenta que Ctrl-Alt-E
bash
no solo expande los alias. También expande variables, sustitución de comandos (!), Sustitución de procesos (!), Expansión aritmética y elimina comillas (no genera generación de nombre de archivo (globbing) o expansión de tilde).No siempre logra expandir los alias. Entonces, aunque tiene sus usos, es importante darse cuenta de que su resultado potencialmente cambia el significado de la línea de comando, tiene efectos secundarios y es potencialmente peligroso.
Por ejemplo en:
Si presiono
M-C-E
aquí, eso me da:Lo que me da una línea de comando completamente diferente (e imagina lo que hubiera pasado si hubiera tenido en
rm -rf *
lugar depwd
arriba) y no expande elfoo
alias.Con
zsh
, para construir sobre la nota de Gilles sobre alias expandidos dentro de las funciones, puede hacer:Eso expandirá los alias solo si la línea de comando actual es sintácticamente válida (por lo que funciona como un verificador de sintaxis).
Contrariamente a
bash
la MCE, también resuelve completamente los alias. Por ejemplo si tienes:Se ampliará a:
Tenga en cuenta que también canoniza la sintaxis para que cosas como:
se cambiará a:
fuente
alias ls='ls --color'
y escribo deC-x a
nuevols
, obtengo:\ls --color
(para que lo nuevols
no se malinterprete como un alias). Pero con tuexpand-aliases
, obtengo:ls --color
haciendo que el resultado sea ambiguo.bash
equivalente). Pero es cierto si ejecuta el comando después de eso, obtendrá otra ronda de expansión de alias (como enbash
), por lo que idealmente desearía deshabilitar temporalmente la expansión de alias, por ejemplo, envuelva eso en a(){ setopt localoptions noexpandalias; ...; }
. Tenga en cuenta que podría decir que_expand_alias
es defectuoso y expande el alias cuando se ejecuta\ls
._expand_alias
también se engaña fácilmente comoalias 'foo=repeat 3 foo'
oalias ls='ls --color'; alias '\ls=echo fooled'
. No hay una solución perfecta aquí._expand_alias
aalias 'foo=repeat 3 foo'
, consideraría la barra invertida faltante como un error. Yalias '\ls=echo fooled'
no debería permitirse; aquí prefiero fiesta, que dice:bash: alias: '\ls': invalid alias name
.bash
. Si no le gustan los alias con barras invertidas, no los use, pero ¿por qué querría que el shell los rechace? Si bien los alias son el reemplazo de las funciones de un hombre pobre en csh (de dónde provienen), en los shells tipo Bourne, son trucos para hacer trucos que no se pueden hacer con funciones, alguna forma de expansión macro que se engancha temprano en el analizador de shell , No veo el punto de restringir lo que puede hacer.Si inserta una línea de comando en una definición de función y luego imprime la función, los alias se expandirán. También obtendrá espacios en blanco normalizados.
Para poner todo esto en un comando interactivo, puede hacer un widget zle. Puede definir una función directamente insertando su código en una entrada en la
functions
matriz; obtendrá el efecto de normalización cuando lea de nuevo.Obtiene el mismo efecto de normalización en el
preexec
gancho . Los alias también se expanden en el momento en que una función se carga automáticamente (autoload -U
se usa comúnmente para evitar la expansión de alias).La
_expand_alias
función de finalización expande la palabra debajo del cursor si es un alias. Utiliza laaliases
matriz . No es recursivo. Puede implementar un expansor de alias más general usandoaliases
, pero es algo difícil, porque descubrir las ubicaciones donde se expanden los alias está íntimamente conectado con la sintaxis de shell.fuente
autoload -U
simplemente porque la documentación de zsh lo recomienda, pero nunca entendí lo que-U
realmente hice hasta que leí esto :). También para cualquier persona interesada, se puede invocar las _expand_alias funcionan directamente escribiendo sus alias en la línea de comandos, golpear<Esc>
,x
, para poner en marcha el minibúfer, a continuación, escribiendo_expand_alias<Enter>
Si tiene muchos alias elegantes anidados y no está seguro de qué está haciendo realmente zsh con ellos y en qué orden se pasan las opciones al comando, siempre puede iniciar zsh con la
-x
opción. Esto imprimirá comandos y argumentos a medida que se ejecutan.Sin embargo, tenga en cuenta que esta opción está destinada más bien a fines de depuración, por lo que imprime muchas cosas inútiles justo después de la
zsh -x
invocación (básicamente todas y cada función / widget / complemento de su .zshrc), y durante la ejecución del comando también podría ser detallado, especialmente si has definidopreexec
yprecmd
gancho.También debo mencionar que imprime solo los comandos que finalmente se ejecutan, y los comandos separados se imprimen por separado, así que después
Ya verás
fuente