Sanelu, joka selviää terminaalista
Sanelun liittäminen pettää hiljaa terminaalissa, SSH:ssa, tmuxissa ja ei-QWERTY-asetteluissa. Miksi leikepöytä ei toimi ja mitä kirjoitustila tekee.
Kehittäjät, jotka kokeilevat sanelutyökaluja, törmäävät usein epäonnistumiseen, jolla on hyvin tunnistettava muoto. Työkalu toimii demossa kauniisti. Se toimii Muistiinpanoissa, Slackissa, selaimessa. Sitten fokusoit terminaalin, sanelet lauseen, ja joko mitään ei ilmesty, tai ilmestyy jotain muuta kuin mitä sanoit, tai puolet ilmestyy ja toinen puoli on nyt salaperäisesti leikepöydälläsi. Joskus se toimii paikallisesti ja kuolee sillä hetkellä kun otat SSH-yhteyden koneelle.
Kuvio toistuu niin johdonmukaisesti, etten usko sen olevan bugi yhdessäkään yksittäisessä tuotteessa. Se on seuraus siitä, miten koko tuotekategoria syöttää tekstiä — ja se epäonnistuu täsmälleen niissä paikoissa, joissa kehittäjä elää.
Sillä on nyt enemmän väliä kuin kaksi vuotta sitten. Jos ohjaat Claude Codea äänellä — sitä työnkulkua, jonka kuvasin artikkelissa Claude Coden ohjaaminen äänellä — terminaali ei ole yksi sovellus muiden joukossa. Se on juuri se sovellus. Sinne promptisi laskeutuvat, siellä agenttisi odottavat uudelleenohjauksia, siellä koko rinnakkaiskaista-ajatus joko toimii tai ei. Sanelutyökalu, joka on epävakaa terminaaleissa, on vibe-koodaajalle epävakaa ainoassa tehtävässään.
Miksi liittäminen hajoaa juuri siellä missä kehittäjät elävät?
Tässä on kategorian tason mekaniikka. Useimmat sanelutyökalut syöttävät tekstin samalla tavalla: ne asettavat litteroidun lauseesi järjestelmän leikepöydälle ja syntetisoivat sitten Cmd+V-näppäinpainalluksen fokusoituun sovellukseen. Se on järkevä oletus — liittäminen on välitöntä, se toimii lähes jokaisessa graafisessa tekstikentässä eikä se vaatinut juuri lainkaan sovelluskohtaista työtä.
Ongelma on kaikki se, mistä tuo oletus hiljaa riippuu.
Se riippuu siitä, että fokusoitu sovellus tulkitsee Cmd+V:n merkitsevän ”liitä”. Terminaalit eivät usein tulkitse — moni käyttää Cmd+V:tä johonkin muuhun tai ei mihinkään, tmuxilla ja vimillä on omat käsityksensä siitä mitä liittäminen tarkoittaa, ja etäinen SSH-istunto voi tulkita liitetyn tekstiryöpyn tavoilla, joita paikallinen kone ei voi ennustaa. Bracketed paste, kopiotila, lisäystila vastaan normaalitila: terminaalimaailma on täynnä tiloja, joissa synteettinen liittäminen laskeutuu väärin tai ei mihinkään.
Se riippuu siitä, että leikepöytä on käytettävissä ja vartioimaton. Leikepöytäohjelmat kirjoittavat sen uusiksi. Salasanaohjelmat tyhjentävät tai suojaavat sen tarkoituksella — tietoturvaominaisuus, joka muuttaa ”liitä saneluni” muotoon ”liitä ei mitään”, äänettömästi. Ja silloinkin kun kaikki toimii, työkalu juuri ylikirjoitti sen mitä sinulla oli kopioituna. Se commit-SHA, jota kannoit ikkunasta toiseen, on poissa ja korvattu omalla lauseellasi. Usean kaistan jonglööraajalle se ei ole naarmu; leikepöytä oli tekemässä työtä.
Ja se riippuu — tämä on se kohta joka yllättää ihmiset — näppäimistöasettelustasi. Kun työkalu perääntyy näppäinpainallusten simulointiin, naiivi tapa on lähettää näppäinkoodeja: fyysisiä näppäinpaikkoja. Näppäinkoodit kartoittuvat merkeiksi asettelusi kautta. QWERTY:llä V:n koodi tuottaa V:n. Dvorakilla sama fyysinen paikka on eri kirjain. Työkalu, joka simuloi skannauskoodeja Dvorak-, AZERTY- tai Colemak-asettelulla, tuottaa siis tekstiä, joka näyttää käyneen läpi korvaussalauksen. Käyttäjät raportoivat siansaksaa ja olettavat puheentunnistuksen pettäneen. Se ei pettänyt — puhe oli täydellistä, syöttö sotki sen.
Mikään tästä ei ole kenenkään ilkeyttä tai laiskuutta. Leikepöydältä liittäminen on oikea oletus 90 prosentin tapaukselle. On vain niin, että kehittäjät viettävät päivänsä siinä toisessa kymmenessä prosentissa.
Mitä ”kirjoita se sen sijaan” oikeasti tarkoittaa
Keebyessä on asetus nimeltä insert_mode, jolla on kaksi arvoa: paste, joka on oletus, ja type.
Kirjoitustila ei liitä. macOS:llä se käyttää CGEventKeyboardSetUnicodeString-rajapintaa, joka liittää varsinaisen Unicode-tekstin synteettiseen näppäintapahtumaan. Merkki kulkee itse tapahtumassa, eikä sitä haeta näppäimistöasettelusi kautta. Se tekee siitä rakenteeltaan asettelusta riippumattoman: Dvorak, AZERTY, Colemak, millä tahansa kirjoitatkin, saapuva teksti on se teksti joka litteroitiin, koska skannauskoodista merkiksi -käännöstä ei ollut koskaan olemassa mokattavaksi.
Kirjoitustilan toinen ominaisuus on se, josta terminaalin käyttäjät välittävät: se ei koske leikepöytään koskaan. Nolla leikepöytäoperaatiota sillä koodipolulla. Leikepöytäsi sisältö pysyy sinun — SHA säilyy, salasanaohjelmalla ei ole mitään vartioitavaa, leikepöytäohjelmalla ei mitään kirjattavaa.
Ja koska terminaalit ja etäistunnot voivat tukehtua tekstiin, joka saapuu nopeammin kuin yksikään ihminen kirjoittaa, kirjoitustila tahdittaa itsensä tarkoituksella: teksti menee sisään 16 merkin paloina, joiden välissä on 4 millisekunnin tauko. Riittävän nopeasti, että lause laskeutuu selvästi alle sekunnissa; riittävän harkitusti, että tmux-paneeli SSH:n yli vastaanottaa sen näppäinpainalluksina, joissa se pysyy perässä, eikä möykkynä joka pitää tulkita.
Liittämistila on yhä olemassa ja yhä oletus, koska se on aidosti nopeampi isoille tekstilohkoille tavallisissa graafisissa sovelluksissa — kolmen kappaleen Slack-viesti saapuu yhtenä liittämisenä eikä palojen virtana. Asetteluoppitunnin sai kuitenkin myös liittämistila: synteettinen Cmd+V käyttää V:n fyysistä näppäinkoodia, joten liittäminen itsessään ei hajoa ei-QWERTY-asetteluilla samalla tavalla kuin merkkihakuun perustuvat lähestymistavat.
Käytännön asetus agenttityöhön on yksinkertainen: käännä insert_mode arvoon type, fokusoi terminaali jossa Claude Code pyörii, pidä näppäintä pohjassa, sano uudelleenohjaus, päästä irti. Prompti saapuu niin kuin näppäinpainallukset saapuisivat, koska terminaalin näkökulmasta ne ovat juuri sitä. Vaiheittainen versio tästä asennuksesta, mukaan lukien SSH:n ja tmuxin erityispiirteet, on artikkelissa puhesanelu macOS-terminaaliin.
Rehelliset rajat
Kirjoitustila on pitkälle tekstille hitaampi kuin liittäminen — se on laskuoppia, ei vika. Paloitellut näppäinpainallukset tahdistustaukoineen kestävät kauemmin kuin yksi liittämistapahtuma, ja jos sanelet useita kappaleita dokumenttiin, liittämistila tuntuu nopeammalta. Juuri siksi liittäminen pysyy oletuksena ja kirjoitustila on jotain, jonka otat asetuksista käyttöön itse; oikea tila riippuu siitä, minne tekstisi on menossa.
Jotkin sovellukset rajoittavat tai suodattavat synteettistä syötettä, yleensä tietoturvasyistä, eikä mikään syöttöstrategia pakene sitä täysin — sovellus, joka kieltäytyy synteettisistä tapahtumista, kieltäytyy niistä jokaisen sanelutyökalun osalta.
Ja jotta olisi selvää, mitä tämä artikkeli väittää ja mitä ei: liittäminen-hajoaa-terminaaleissa -valitus on koko sanelukategorian läpi kulkeva kuvio, ei yhdenkään kilpailijan yksilöllinen vika. Muilla työkaluilla on omat vastauksensa ja omat vahvuutensa — kirjoitimme rehelliset vertailut sivuille Keebye vs Superwhisper ja Keebye vs Wispr Flow, mukaan lukien se, missä kumpikin niistä voisi sopia sinulle paremmin.
Syöttö on sanelun epäglamouri puolisko
Puheentunnistus saa kaiken huomion — mallien nimet, tarkkuusväitteet, kielimäärät. Mutta sanelutyökalulla on kaksi tehtävää: kuulla sinut oikein ja sitten saada teksti sinne missä kursorisi on, kadottamatta tai runtelematta sitä. Toinen tehtävä kuulostaa triviaalilta ja on juuri se, jossa kategoria pettää kehittäjät hiljaa, koska toinen tehtävä on helppo TextEditissä ja vaikea tmux-paneelissa etäkoneella Dvorak-asettelun alla.
Jos promptisi laskeutuvat terminaaleihin — ja jos ohjaat koodausagentteja, ne laskeutuvat — syöttö ei ole alaviite. Se on ero demottavan työkalun ja käytettävän työkalun välillä. Sukulaisvirheillä on muuten sama maku: sanelun ensimmäisen sanan katoaminen mikrofonin kylmäkäynnistykseen on toinen koko kategorian laajuinen valitus mekaanisine selityksineen, ja kirjoitimme siitä artikkelin miksi sanelusovellukset syövät ensimmäisen sanasi.
Keebye on ennakkokäytössä macOS:lle. Jos sanelusi on koskaan kadonnut jonnekin suusi ja terminaalin väliin, aloita ilmainen kokeilu alta, ota kirjoitustila käyttöön ja yritä samaa promptia uudelleen. Kopioimasi SHA pysyy leikepöydällä samalla kun sanat saapuvat kirjoitettuna Unicode-tekstinä.
Testaa vaikein terminaalireittisi
Aloita ilmainen kokeilu, ota kirjoitustila käyttöön ja kokeile sitä SSH- tai tmux-promptia, joka yleensä rikkoo liittämisen.
Start free trialEarly access: we'll email you the moment the macOS build is ready — your 14 days start when you first sign in from the app.
Jatka lukemista
Promptien sanelu rinnakkaisagenteille, kaista kerrallaan
Kahden tai kolmen koodausagentin ajaminen tekee promptaamisesta pullonkaulan. Työnkulku rinnakkaiskaistojen syöttämiseen poistumatta siitä, jolla olet.
Claude Code äänellä: rakentamista rinnakkaiskaistoilla
AI-koodiagentit tekivät näppäilystä pullonkaulan. Työnkulku promptien, katselmointien ja suunnanmuutosten saneluun rinnakkaisille agenteille macOS:llä.
Sano mitä sanoin: sanelua ilman tekoälyn muokkauksia
Tekoälysanelu kirjoittaa sanasi uusiksi: varaukset katoavat, merkitys kääntyy. Miksi LLM-viimeistely muotoilee uudelleen ja Keebye pysyy kirjaimellisena.