Dictarea care supraviețuiește terminalului

Paste-ul dictării eșuează în terminale, SSH, tmux și layout-uri non-QWERTY, fără avertisment. De ce se rupe inserarea prin clipboard și cum ajută tastarea.

Teodor Deleanu10 iulie 20268 min de citit

Dezvoltatorii care încearcă instrumente de dictare dau adesea peste un eșec cu o formă foarte specifică. Instrumentul funcționează impecabil în demo. Funcționează în Notes, în Slack, în browser. Apoi dai focus unui terminal, dictezi o propoziție și fie nu apare nimic, fie apare ceva ce nu ai spus, fie apare jumătate, iar cealaltă jumătate e acum, misterios, în clipboardul tău. Uneori funcționează local și moare în clipa în care intri prin SSH pe o mașină.

Tiparul este suficient de consecvent încât nu cred că e un bug într-un singur produs. E o consecință a felului în care inserează text întreaga categorie — și eșuează exact în locurile în care trăiește un dezvoltator.

Asta contează mai mult acum decât acum doi ani. Dacă îl conduci pe Claude Code prin voce — fluxul de lucru pe care l-am descris în Cum conduci Claude Code cu vocea — atunci terminalul nu e o aplicație printre multe altele. E aplicația. Acolo ajung prompturile tale, acolo așteaptă agenții tăi redirecționări, acolo toată treaba cu lane-urile paralele fie funcționează, fie nu. Un instrument de dictare instabil în terminale este, pentru un vibecoder, instabil la singura lui treabă.

De ce se rupe paste-ul exact acolo unde trăiesc dezvoltatorii?

Iată mecanica la nivel de categorie. Majoritatea instrumentelor de dictare inserează textul la fel: îți pun propoziția transcrisă în clipboardul sistemului, apoi sintetizează o apăsare Cmd+V în aplicația cu focus. E un implicit rezonabil — paste-ul e instantaneu, funcționează în aproape orice câmp de text GUI și nu a cerut aproape deloc inginerie per aplicație.

Problema e tot ce presupune discret asumpția asta.

Presupune că aplicația cu focus tratează Cmd+V drept „paste". Terminalele adesea nu o fac — multe folosesc Cmd+V pentru altceva sau pentru nimic, tmux și vim au propriile idei despre ce înseamnă paste, iar o sesiune SSH remote poate interpreta o rafală de text inserat în feluri pe care mașina locală nu le poate prezice. Bracketed paste, copy-mode, insert-mode versus normal-mode: lumea terminalelor e plină de stări în care un paste sintetic ajunge greșit sau nu ajunge deloc.

Presupune că clipboardul este disponibil și nepăzit. Managerele de clipboard îl rescriu. Managerele de parole îl golesc sau îl protejează deliberat — o funcție de securitate care transformă „inserează dictarea mea" în „inserează nimic", în tăcere. Și chiar când totul funcționează, instrumentul tocmai a suprascris ce aveai copiat. SHA-ul de commit pe care îl cărai între ferestre a dispărut, înlocuit de propria ta propoziție. Pentru cineva care jonglează cu mai multe lane-uri, asta nu e o zgârietură; clipboardul avea o treabă de făcut.

Și presupune — asta e cea care surprinde lumea — ceva despre layout-ul tău de tastatură. Când un instrument recurge la simularea de apăsări de taste, metoda naivă e să trimită coduri de tastă: pozițiile fizice ale tastelor. Codurile de tastă se mapează la caractere prin layout-ul tău. Pe QWERTY, codul pentru „V" produce un V. Pe Dvorak, aceeași poziție fizică e altă literă. Așa că un instrument care simulează scancode-uri pe un layout Dvorak, AZERTY sau Colemak produce text care arată de parcă ar fi trecut printr-un cifru de substituție. Utilizatorii raportează aiureli și presupun că a eșuat recunoașterea vocală. Nu ea a eșuat — vorbirea a fost perfectă, inserarea a amestecat-o.

Nimic din toate astea nu e răutate sau lene din partea cuiva. Paste-ul din clipboard e implicitul corect pentru cazul de 90%. Doar că dezvoltatorii își petrec ziua în celelalte 10%.

Ce înseamnă de fapt „tastează-l în schimb"

Keebye are o setare numită insert_mode cu două valori: paste, care e implicită, și type.

Modul de tastare nu face paste. Pe macOS folosește CGEventKeyboardSetUnicodeString — un API care atașează textul Unicode propriu-zis la un eveniment sintetic de tastă. Caracterul e transportat chiar în eveniment, nu e căutat prin layout-ul tastaturii. Asta îl face independent de layout prin construcție: Dvorak, AZERTY, Colemak, orice ai tasta, textul care ajunge e textul care a fost transcris, pentru că nu a existat niciodată vreo traducere scancode-la-caracter care să iasă greșit.

A doua proprietate a modului de tastare e cea care contează pentru utilizatorii de terminal: nu atinge niciodată clipboardul. Zero operațiuni de clipboard pe acea cale de cod. Conținutul clipboardului rămâne al tău — SHA-ul supraviețuiește, managerul de parole nu are împotriva a ce să se apere, managerul de clipboard nu are ce loga.

Și pentru că terminalele și sesiunile remote se pot îneca la text care sosește mai repede decât tastează orice om, modul de tastare își impune deliberat un ritm: textul intră în bucăți de 16 caractere, cu o pauză de 4 milisecunde între bucăți. Suficient de rapid încât o propoziție să ajungă în mult sub o secundă; suficient de măsurat încât un panou tmux prin SSH să o primească drept apăsări de taste cu care poate ține pasul, nu drept un bloc pe care trebuie să-l interpreteze.

Modul paste e tot acolo și e tot implicit, pentru că e într-adevăr mai rapid pentru blocuri mari de text în aplicații GUI obișnuite — un mesaj de Slack de trei paragrafe ajunge ca un singur paste, nu ca un șir de bucăți. Chiar și modul paste a învățat însă lecția layout-ului: Cmd+V-ul sintetic folosește keycode-ul fizic al lui V, așa că paste-ul în sine nu se rupe pe layout-uri non-QWERTY așa cum se pot rupe abordările bazate pe căutare de caractere.

Configurarea practică pentru lucrul cu agenți e simplă: comută insert_mode pe type, dă focus terminalului care rulează Claude Code, ține tasta apăsată, spune redirecționarea, dă drumul. Promptul ajunge așa cum ar ajunge niște apăsări de taste, pentru că, din câte își poate da seama terminalul, exact asta sunt. Există o versiune pas cu pas a acestei configurări, inclusiv specificul SSH și tmux, în dictare vocală pentru terminalul macOS.

Limitele sincere

Modul de tastare e mai lent decât paste-ul pentru text lung — asta e aritmetică, nu un defect. Apăsările de taste în bucăți, cu pauze de ritmare, durează mai mult decât un singur eveniment de paste, iar dacă dictezi câteva paragrafe într-un document, modul paste se va simți mai vioi. Exact de aceea paste-ul rămâne implicit, iar modul de tastare e ceva ce alegi din setări; modul potrivit depinde de unde se duce textul tău.

Unele aplicații limitează sau filtrează inputul sintetic, de obicei din motive de securitate, și nicio strategie de inserare nu scapă complet de asta — o aplicație care refuză evenimente sintetice le refuză de la orice instrument de dictare.

Și, ca să fim clari despre ce afirmă și ce nu afirmă articolul ăsta: plângerea „paste-ul se rupe în terminale" este un tipar la nivelul întregii categorii de dictare, nu un defect unic al vreunui concurent. Alte instrumente au propriile răspunsuri și propriile puncte forte — am scris comparații oneste la Keebye vs Superwhisper și Keebye vs Wispr Flow, inclusiv despre unde ți s-ar potrivi fiecare mai bine.

Inserarea e jumătatea nespectaculoasă a dictării

Recunoașterea vocală primește toată atenția — nume de modele, afirmații despre acuratețe, numărători de limbi. Dar un instrument de dictare are două treburi: să te audă corect și apoi să ducă textul acolo unde e cursorul tău fără să-l piardă sau să-l mutileze. A doua treabă pare trivială și e acolo unde categoria eșuează discret în fața dezvoltatorilor, pentru că a doua treabă e ușoară în TextEdit și grea într-un panou tmux, pe o mașină remote, sub un layout Dvorak.

Dacă prompturile tale ajung în terminale — și dacă conduci agenți de programare, chiar ajung — inserarea nu e o notă de subsol. E diferența dintre un instrument pe care îl demonstrezi și unul pe care îl folosești. Apropo, modurile de eșec înrudite au aceeași aromă: primul cuvânt al unei dictări mâncat de pornirea la rece a microfonului e o altă plângere la nivel de categorie, cu o explicație mecanică, iar despre ea am scris în de ce aplicațiile de dictare îți mănâncă primul cuvânt.

Keebye este în acces anticipat pentru macOS. Dacă dictarea ta a dispărut vreodată undeva între gura ta și un terminal, începe proba gratuită mai jos, activează modul de tastare și reîncearcă același prompt. SHA-ul tău copiat rămâne în clipboard, iar cuvintele sosesc ca Unicode tastat.

Testează-ți cea mai dificilă cale de terminal

Începe proba gratuită, activează modul de tastare și încearcă promptul din SSH sau tmux care de obicei rupe paste-ul.

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.

Citește mai departe