Dictado que sobrevive a la terminal

El dictado no se pega, sin aviso, en terminales, SSH, tmux y teclados no QWERTY. Por qué falla el portapapeles y qué hace el modo de tecleo.

Teodor Deleanu10 de julio de 20268 min de lectura

Los desarrolladores que prueban herramientas de dictado suelen chocar con un fallo de forma muy concreta. La herramienta funciona de maravilla en la demo. Funciona en Notas, en Slack, en el navegador. Después enfocas una terminal, dictas una frase y o no aparece nada, o aparece algo que no es lo que dijiste, o aparece la mitad y la otra mitad está ahora misteriosamente en tu portapapeles. A veces funciona en local y muere en el momento en que entras por SSH a una máquina.

El patrón es lo bastante constante como para que no crea que sea un bug de un producto concreto. Es una consecuencia de cómo inserta texto la categoría entera — y falla exactamente en los sitios donde vive un desarrollador.

Eso importa más ahora que hace dos años. Si diriges Claude Code por voz — el flujo de trabajo que describí en dirigir Claude Code con tu voz —, entonces la terminal no es una app más entre muchas. Es la app. Es donde aterrizan tus prompts, donde tus agentes esperan redirecciones, donde todo el asunto de los carriles en paralelo funciona o no funciona. Una herramienta de dictado inestable en terminales es, para un vibe coder, inestable en su único trabajo.

¿Por qué el pegado se rompe justo donde viven los desarrolladores?

Esta es la mecánica a nivel de categoría. Casi todas las herramientas de dictado insertan texto igual: ponen tu frase transcrita en el portapapeles del sistema y luego sintetizan una pulsación de Cmd+V en la app con foco. Es un valor por defecto sensato: pegar es instantáneo, funciona en casi cualquier campo de texto de una GUI y no necesitaba prácticamente ninguna ingeniería app por app.

El problema es todo aquello de lo que esa suposición depende en silencio.

Depende de que la app con foco trate Cmd+V como «pegar». Las terminales a menudo no lo hacen — muchas usan Cmd+V para otra cosa o para nada, tmux y vim tienen sus propias ideas sobre qué significa pegar, y una sesión SSH remota puede interpretar una ráfaga de texto pegado de formas que la máquina local no puede predecir. Bracketed paste, copy-mode, modo inserción frente a modo normal: el mundo de la terminal está lleno de estados donde un pegado sintético aterriza mal o no aterriza en ninguna parte.

Depende de que el portapapeles esté disponible y sin vigilancia. Los gestores de portapapeles lo reescriben. Los gestores de contraseñas lo limpian o lo protegen deliberadamente — una función de seguridad que convierte «pega mi dictado» en «no pegues nada», en silencio. E incluso cuando todo funciona, la herramienta acaba de sobrescribir lo que tenías copiado. El SHA del commit que llevabas de una ventana a otra ha desaparecido, sustituido por tu propia frase. Para alguien que hace malabares con varios carriles, eso no es un arañazo; el portapapeles estaba haciendo un trabajo.

Y depende — esta es la que sorprende a la gente — de tu distribución de teclado. Cuando una herramienta recurre a simular pulsaciones, la forma ingenua es enviar códigos de tecla: las posiciones físicas de las teclas. Los códigos de tecla se traducen a caracteres a través de tu distribución. En QWERTY, el código de la «V» produce una V. En Dvorak, esa misma posición física es otra letra. Así que una herramienta que simula scancodes en una distribución Dvorak, AZERTY o Colemak produce texto que parece haber pasado por un cifrado por sustitución. Los usuarios reportan galimatías y suponen que falló el reconocimiento de voz. No falló — el habla fue perfecta, la inserción la revolvió.

Nada de esto es maldad ni pereza de nadie. El pegado por portapapeles es el valor por defecto correcto para el 90 % de los casos. Lo que pasa es que los desarrolladores se pasan el día en el otro 10 %.

Qué significa realmente «tecléalo en su lugar»

Keebye tiene un ajuste llamado insert_mode con dos valores: paste, que es el predeterminado, y type.

El modo de tecleo no pega. En macOS usa CGEventKeyboardSetUnicodeString — una API que adjunta el texto Unicode real a un evento de tecla sintético. El carácter viaja dentro del propio evento, no se busca a través de tu distribución de teclado. Eso lo hace independiente de la distribución por construcción: Dvorak, AZERTY, Colemak, lo que sea que uses, el texto que llega es el texto que se transcribió, porque nunca hubo una traducción de scancode a carácter que pudiera salir mal.

La segunda propiedad del modo de tecleo es la que importa a quienes viven en terminales: nunca toca el portapapeles. Cero operaciones de portapapeles en esa ruta de código. El contenido de tu portapapeles sigue siendo tuyo — el SHA sobrevive, el gestor de contraseñas no tiene nada de lo que protegerse, el gestor de portapapeles no tiene nada que registrar.

Y como las terminales y las sesiones remotas pueden atragantarse con texto que llega más rápido de lo que teclea cualquier humano, el modo de tecleo se marca su propio ritmo deliberadamente: el texto entra en fragmentos de 16 caracteres con un hueco de 4 milisegundos entre fragmentos. Lo bastante rápido para que una frase aterrice en bastante menos de un segundo; lo bastante medido para que un panel de tmux sobre SSH lo reciba como pulsaciones que puede seguir, no como un bloque que tiene que interpretar.

El modo de pegado sigue ahí, y sigue siendo el predeterminado, porque es genuinamente más rápido para bloques grandes de texto en apps GUI normales — un mensaje de Slack de tres párrafos llega como un solo pegado en vez de como un flujo de fragmentos. Aun así, incluso el modo de pegado aprendió la lección de las distribuciones: el Cmd+V sintético usa el keycode físico de la V, así que el pegado en sí no se rompe en distribuciones no QWERTY como sí puede pasarle a los enfoques basados en buscar caracteres.

La configuración práctica para trabajar con agentes es simple: pon insert_mode en type, enfoca la terminal que ejecuta Claude Code, mantén pulsada la tecla, di la redirección y suelta. El prompt llega como llegarían las pulsaciones, porque hasta donde la terminal puede saber, eso es lo que son. Hay una versión paso a paso de esta configuración, incluyendo los detalles de SSH y tmux, en dictado por voz para la terminal de macOS.

Los límites honestos

El modo de tecleo es más lento que el pegado para textos largos — eso es aritmética, no un defecto. Las pulsaciones fragmentadas con huecos de ritmo tardan más que un único evento de pegado, y si estás dictando varios párrafos en un documento, el modo de pegado se sentirá más ágil. Justo por eso el pegado sigue siendo el predeterminado y el modo de tecleo es algo que activas en los ajustes; el modo correcto depende de adónde vaya tu texto.

Algunas aplicaciones limitan la tasa o filtran la entrada sintética, normalmente por motivos de seguridad, y ninguna estrategia de inserción escapa del todo a eso — una app que rechaza eventos sintéticos los rechaza de cualquier herramienta de dictado.

Y para dejar claro qué afirma y qué no afirma este artículo: la queja de que el pegado se rompe en terminales es un patrón de toda la categoría del dictado, no un defecto exclusivo de ningún competidor. Otras herramientas tienen sus propias respuestas y sus propias fortalezas — escribimos comparaciones honestas en Keebye vs Superwhisper y Keebye vs Wispr Flow, incluyendo dónde cada una podría encajarte mejor.

La inserción es la mitad poco glamurosa del dictado

El reconocimiento de voz se lleva toda la atención: nombres de modelos, afirmaciones sobre precisión, recuentos de idiomas. Pero una herramienta de dictado tiene dos trabajos: oírte bien y luego llevar el texto hasta donde está tu cursor sin perderlo ni destrozarlo. El segundo trabajo suena trivial y es donde la categoría falla calladamente a los desarrolladores, porque el segundo trabajo es fácil en TextEdit y difícil en un panel de tmux, en una máquina remota, bajo una distribución Dvorak.

Si tus prompts aterrizan en terminales — y si diriges agentes de programación, lo hacen —, la inserción no es una nota al pie. Es la diferencia entre una herramienta que enseñas en una demo y una herramienta que usas. Por cierto, hay modos de fallo relacionados con el mismo sabor: que la primera palabra de un dictado se la coma el arranque en frío del micro es otra queja de toda la categoría con una explicación mecánica, y la contamos en por qué las apps de dictado se comen tu primera palabra.

Keebye está en acceso anticipado para macOS. Si alguna vez tu dictado se ha esfumado entre tu boca y una terminal, empieza tu prueba gratuita abajo, activa el modo de tecleo y repite el mismo prompt. El SHA que copiaste se queda en el portapapeles mientras las palabras llegan como Unicode tecleado.

Prueba tu ruta de terminal más difícil

Empieza tu prueba gratuita, activa el modo de tecleo y prueba ese prompt de SSH o tmux que normalmente rompe el pegado.

Start free trial

Early access: we'll email you the moment the macOS build is ready — your 14 days start when you first sign in from the app.

Sigue leyendo