12k
All articles

Uso de expansores de texto para Git, PRs y prompts de IA

Snippets de Espanso para Git, PR y prompts de IA: usa shell, portapapeles y cursor para crear expansores contextuales.

OpenReplay Team
OpenReplay Team
Uso de expansores de texto para Git, PRs y prompts de IA

Un expansor de texto convierte un disparador corto como :cm en un bloque completo de texto en cualquier lugar donde escribas — mensajes de commit, descripciones de PR, prompts para LLMs — para que dejes de reescribir el mismo texto repetitivo decenas de veces al día. La opción preferida para desarrolladores es Espanso, un expansor gratuito, de código abierto y multiplataforma escrito en Rust, cuya configuración completa es YAML plano que puedes versionar en git. Este artículo es un recetario listo para copiar y pegar: snippets reales de Espanso para comandos de git, esqueletos de PR y prompts de IA reutilizables, además de las tres palancas dinámicas — salida de shell, inyección del portapapeles y posicionamiento del cursor — que convierten texto estático en herramientas conscientes del contexto.

Puntos clave

  • Espanso es un expansor de texto gratuito, de código abierto y multiplataforma escrito en Rust; instálalo en macOS con brew install --cask espanso (macOS 11+), en Linux mediante el paquete .deb o AppImage, y en Windows desde el instalador oficial.
  • Para que un snippet de commit sea consciente del contexto, inyecta la rama actual con una variable de shell que ejecute git rev-parse --abbrev-ref HEAD, de modo que un disparador siempre se expanda con la rama en la que estás trabajando.
  • Espanso posiciona el cursor tras la expansión con la indicación $|$, pero solo puedes definir una por match, y puede comportarse de forma inesperada en editores con auto-indentación — por eso conviene usar los esqueletos de PR en el campo de descripción del navegador.
  • Espanso no tiene una variable nativa de “texto seleccionado”: copia el código primero y luego dispara un snippet que lea {{clipboard}} para envolver una función destacada en un prompt para un LLM.
  • Al ser la configuración YAML plano, puedes versionar todo el directorio en un repositorio git y compartir los snippets del equipo como un paquete privado de Espanso.

Por qué un expansor de texto pertenece a tu flujo de trabajo de desarrollo

Un expansor de texto es cualquier herramienta que monitorea tus pulsaciones de teclado y reemplaza un disparador definido con un bloque de texto más largo y opcionalmente dinámico, a nivel de sistema. Si tu trabajo implica reescribir el mismo texto con plantilla una y otra vez — commits convencionales, descripciones de PR, prompts recurrentes — se amortiza de inmediato. La mayoría de las personas conocen los expansores por primera vez a través de las firmas de correo electrónico; el beneficio para los desarrolladores es mucho mayor porque gran parte del ciclo de terminal y GitHub es texto repetitivo.

Tres herramientas dominan el mercado:

HerramientaPlataformasFortaleza
EspansoMultiplataforma, código abiertoConfiguración en YAML plano, scriptable mediante shell y variables dinámicas — la opción elegida aquí
Raycast SnippetsCentrado en macOSFunción de lanzador con marcadores de posición dinámicos
TextExpanderMultiplataforma (de pago)Orientado a equipos, con grupos de campos compartidos

Elige Espanso cuando quieras una configuración scriptable y versionable en git que puedas llevar de una máquina a otra.

Instálalo y registra el servicio en segundo plano:

# macOS (macOS 11+)
brew install --cask espanso
espanso service register
espanso start

En Linux, la documentación oficial de instalación recomienda el paquete .deb (descárgalo con wget y luego ejecuta sudo apt install ./espanso-debian-x11-amd64.deb) o el AppImage, seguido de espanso service register y espanso start; el soporte para Wayland es experimental. En Windows se usa el instalador disponible en espanso.org. Edita los snippets en cualquier momento con espanso edit y recarga con espanso restart.

Snippets de Git: expande los comandos que reescribes constantemente

Guarda los disparadores de git en un archivo de matches y deja que :cm construya un mensaje de Conventional Commits o que :undo expanda un comando que nunca recuerdas. Aquí tienes un conjunto inicial estático:

# ~/.config/espanso/match/git.yml
matches:
  - trigger: ":cm"
    replace: "feat($|$): "
  - trigger: ":undo"
    replace: "git reset --soft HEAD~1"
  - trigger: ":unstage"
    replace: "git restore --staged ."
  - trigger: ":wip"
    replace: "chore: wip [skip ci]"

El $|$ en :cm coloca el cursor entre los paréntesis para que escribas el scope y continúes.

Ahora haz que un snippet sea consciente del contexto. La extensión de shell de Espanso ejecuta un comando e inserta su salida, por lo que puedes incluir la rama actual en el texto:

  - trigger: ":br"
    replace: "{{branch}}"
    vars:
      - name: branch
        type: shell
        params:
          cmd: "git rev-parse --abbrev-ref HEAD"

Escribe :br en el cuerpo de un commit o en un comentario de PR y se expande al nombre de la rama a la que apunta HEAD — sin copiar y pegar, sin nombres de rama desactualizados.

Plantillas de PR: un esqueleto con campos para completar

Un disparador :pr puede expandirse a un esqueleto completo de Summary / Changes / Testing / Screenshots con el cursor posicionado en el primer campo mediante $|$, convirtiendo un campo de PR vacío en un formulario:

  - trigger: ":pr"
    replace: |
      ## Summary
      $|$

      ## Changes
      -

      ## Testing
      -

      ## Screenshots

Espanso soporta la indicación de cursor $|$, pero solo puedes definir una por match — las indicaciones adicionales se ignoran — y la documentación advierte que puede comportarse de forma inesperada en expansiones multilínea porque Espanso simula pulsaciones de la tecla de flecha izquierda, lo que interfiere con los editores de código que tienen auto-indentación. Dispara :pr en el campo de descripción de GitHub, no en tu IDE, y el comportamiento será predecible.

Snippets de prompts de IA: scaffolds reutilizables para LLMs

Trata los prompts como plantillas de commit: define :review, :explain y :tests una sola vez y deja de reescribirlos. Las versiones estáticas son simplemente texto:

# ~/.config/espanso/match/ai.yml
matches:
  - trigger: ":explain"
    replace: "Explain the following code line by line, then note any bugs or edge cases:\n\n"
  - trigger: ":tests"
    replace: "Write unit tests for the following code. Cover happy path and edge cases:\n\n"

El movimiento diferenciador es inyectar código que acabas de copiar. Espanso no tiene una variable nativa de “texto seleccionado”, por lo que el patrón consiste en copiar primero y luego disparar un snippet que lea {{clipboard}} mediante la extensión de portapapeles:

  - trigger: ":review"
    replace: "Review this code for bugs, security, and readability:\n\n```\n{{clipboard}}\n```"
    vars:
      - name: clipboard
        type: clipboard

Selecciona una función, presiona copiar, escribe :review y obtendrás un prompt de revisión de código con el código delimitado, listo para pegar en cualquier modelo. Los usuarios avanzados pueden simular la copia dentro de una variable de shell — la solución de la comunidad ejecuta xdotool key --clearmodifiers ctrl+c antes de leer el portapapeles — pero el flujo de dos pasos copiar-y-luego-disparar es más simple y portable.

Cómo funcionan las variables dinámicas de Espanso

Un snippet dinámico obtiene su valor de una extensión — type: date para marcas de tiempo, type: shell para la salida de comandos y type: clipboard para {{clipboard}} — y Espanso evalúa las variables de arriba hacia abajo, por lo que las variables posteriores pueden consumir las anteriores. Según la documentación de variables, las extensiones de shell y script reciben el scope actual como variables de entorno, razón por la cual una variable de shell puede leer una variable de portapapeles definida antes que ella.

Este orden de evaluación habilita la composición. Un campo de fecha para una entrada de changelog:

  - trigger: ":today"
    replace: "{{today}}"
    vars:
      - name: today
        type: date
        params:
          format: "%Y-%m-%d"

Espanso 2.3.0 añadió un parámetro tz a la extensión de fecha para generar horas en cualquier zona horaria IANA. Combina variables de shell, portapapeles y fecha en un solo match y tendrás una micro-herramienta genuina: procesa el contenido del portapapeles a través de un formateador, añade una marca de tiempo y coloca el cursor donde continuarás escribiendo.

Versiona tu configuración en git y compártela

Dado que la configuración de Espanso es YAML plano — ejecuta espanso path para encontrar el directorio (en Linux, ~/.config/espanso) — puedes hacer git init en toda la carpeta, publicarla y clonarla en cada máquina en la que trabajas. Tus snippets se convierten en un artefacto versionado y revisable en lugar de algo que existe solo en un portátil específico.

Para equipos, publica los snippets compartidos de commits y PRs como un paquete. Espanso instala paquetes desde cualquier repositorio git con la opción --git, obteniendo los archivos directamente desde tu host:

espanso install team-snippets --git https://github.com/your-org/espanso-snippets --external

Todo el equipo obtiene las mismas convenciones de :cm, :pr y :review con un solo comando. TextExpander ofrece una capacidad comparable a través de grupos compartidos; Espanso lo hace con las herramientas de git que ya utilizas.

Empieza con tres archivos — git.yml, ai.yml y un esqueleto de PR — haz commit de ellos y añade un snippet cada vez que te sorprendas reescribiendo algo. La configuración crece con tus hábitos, y el patrón de copiar-y-luego-:disparar con el portapapeles es el movimiento que convierte un expansor estático en una parte consciente del contexto de tu flujo de trabajo con git e IA.

Preguntas frecuentes

¿En qué se diferencia Espanso de Raycast Snippets y TextExpander?

Espanso es gratuito, de código abierto, multiplataforma y se configura en YAML plano que puedes versionar en git y extender mediante shell y variables dinámicas. Raycast Snippets es una función de lanzador centrada en macOS con marcadores de posición dinámicos. TextExpander es un producto de pago y multiplataforma orientado a equipos y grupos de campos compartidos. Elige Espanso cuando quieras una configuración scriptable y versionable en git que puedas llevar a todas las máquinas en las que trabajas.

¿Puedo colocar el cursor en más de un punto después de que se expanda un snippet?

No. Espanso permite solo una indicación de cursor por match; cualquier indicación `$|$` adicional en el mismo reemplazo se ignora. La documentación también advierte que la indicación puede comportarse de forma inesperada en expansiones multilínea porque Espanso simula pulsaciones de la tecla de flecha izquierda, lo que interfiere con los editores de código con auto-indentación. Para los esqueletos de PR, dispara el snippet en el campo de descripción del navegador en lugar de tu IDE para que el cursor único se posicione de forma predecible.

¿La extensión de shell se ejecuta dentro del directorio de mi proyecto para que los comandos de git funcionen?

Sí. La extensión de shell de Espanso ejecuta el comando en tu contexto de trabajo actual, por lo que `type: shell` con `cmd` ejecutando `git rev-parse --abbrev-ref HEAD` devuelve la rama del repositorio en el que estás escribiendo. La extensión inserta la salida estándar del comando en la expansión, permitiendo que un disparador como `:br` se resuelva al nombre de la rama activa sin copiar y pegar y sin valores desactualizados.

¿Dónde almacena Espanso su configuración para que pueda versionarla en git?

Ejecuta `espanso path` para imprimir el directorio de configuración en lugar de asumir una ruta fija, ya que difiere según el sistema operativo. En Linux suele ser `~/.config/espanso`, mientras que macOS usa una ruta en Application Support. El directorio contiene archivos de matches en YAML plano, por lo que puedes hacer `git init` en toda la carpeta, publicarla y clonarla en otras máquinas. Edita los archivos con `espanso edit` y recarga con `espanso restart`.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.