Crear comandos expandibles

Crear comandos expandibles

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:

https://infinit.io/_/DjmxTCK.gif

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í:

ingrese la descripción de la imagen 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-outputfunción.
  • BUFFERcontiene la línea de comando actual
  • BUFFER='$('$BUFFER')'lugares $(antes y )después de la línea de comando. $(...)es equivalente a `...`pero se puede anidar.
  • CURSORes la posición del cursor en la línea de comando
  • CURSOR=0coloca el cursor al principio de la línea de comando (editada), es decir, en $. Sin mover el cursor allí, podría suceder que zshintente expandir una palabra dentro de $(...)en lugar de todo el proceso de sustitución.
  • zle redisplayvuelve 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-wordllama al expand-wordwidget, que generalmente se llama como parte de la finalización de tabulación.
  • zle -N expand-to-outputregistra la función como widget del mismo nombre.
  • bindkey "^[^I" expand-to-outputvincula el expand-to-outputwidget a Alt+ Tab.

información relacionada