
Utilizo ZSH a través de Oh-my-zsh, y una característica interesante que veo es que el shell expande mis comandos cuando están entre comillas invertidas.
Por ejemplo, `pwd`
+ tab, se reemplaza `pwd`
con mi ruta actual:
Me pregunto si hay una manera relativamente fácil de hacer lo mismo con algunos comandos sin tener que usar comillas invertidas. Me gustaría aplicar eso a algunos alias (o funciones).
Para ser claros, no estoy hablando de expandir argumentos a un comando, sino al comando en sí.
Esta es una característica realmente sorprendente, pero no es exactamente lo que estaba buscando. A menos que haya hecho algo mal, esto expande mi alias a lo que se definió, pero no al resultado. Por ejemplo aquí:
Me gustaría ver el resultado de ese comando en lugar del comando completo.
Respuesta1
Puede usar un widget zle personalizado para esto y llamarlo mediante combinación de teclas, por ejemplo Alt+ Tab(idéntico a Esc, Tab)
expand-to-output () {
BUFFER='$('$BUFFER')'
CURSOR=0
zle redisplay
zle expand-word
}
zle -N expand-to-output
bindkey "^[^I" expand-to-output
Ahora, si escribe cualquier comando seguido de Alt+ Tab, todo el comando será reemplazado por su salida,siel comando se pudo ejecutar exitosamente. Si el comando no se puede ejecutar correctamente, la línea de comando escrita simplemente estará rodeada $(...)
pero no expandida. Si hubiera mensajes de error, deberían imprimirse encima del búfer de edición. Es posible que esto no funcione de manera confiable con indicaciones de varias líneas.
Explicación:
expand-to-output () {...}
define la (nueva)expand-to-output
función.BUFFER
contiene la línea de comando actualBUFFER='$('$BUFFER')'
lugares$(
antes y)
después de la línea de comando.$(...)
es equivalente a`...`
pero se puede anidar.CURSOR
es la posición del cursor en la línea de comandoCURSOR=0
coloca el cursor al principio de la línea de comando (editada), es decir, en$
. Sin mover el cursor allí, podría suceder quezsh
intente expandir una palabra dentro de$(...)
en lugar de todo el proceso de sustitución.zle redisplay
vuelve a mostrar el búfer de edición. Esto evita errores de visualización en caso de que el comando expandido imprima algo enstderr. (Nota: puede haber algunos problemas con las indicaciones de varias líneas)zle expand-word
llama alexpand-word
widget, que generalmente se llama como parte de la finalización de tabulación.zle -N expand-to-output
registra la función como widget del mismo nombre.bindkey "^[^I" expand-to-output
vincula elexpand-to-output
widget a Alt+ Tab.