Spellless 0.1.5
Thirty-four commits since 0.1.4. The theme is the caret: what the input method may assume about the text it is sitting in, and what it should stop assuming.
A caret inside a word now means plain typing
Type 4, then D. The 4 was never composed — digits go straight into the document — so D opened a fresh composition and offered a page of English words beginning with D, for a token that was never going to be English. The same thing happens wherever the caret is flush against a word: the letters after it are invisible, because the frontend reads the text in front of the caret and no further, so every rule downstream — the trailing space, the sentence capital, the candidate list itself — is answering a question about a word it can only see half of.
So it stops answering. A caret sitting hard against a letter or a digit hands the keyboard to plain typing until the next space: the letters land as letters, no candidates, no capital, no automatic space, nothing to undo. A space ends the run, and nothing else printable does — which matters, because the tokens this exists for are full of punctuation. p.m., v1.2, a.out, foo_bar, and/or all arrive whole.
It deletes nothing, so unlike everything else in this family it needs no permission to edit the document: it works in a terminal, and in every application on commit_only_apps.
Four features, two on, and all four in the F4 menu
absorb_fragment — pulling a half-typed word back into the composition — was the other answer to that situation, and it now ships off. It is not unsafe, it is opinionated: it moves text you can see into a composition you did not open, and then asks the matcher about the word whose end nobody can see. word_backspace ships off too. A key that deletes a character sometimes and a whole word at other times is worse than either, so Backspace ships as the one everybody already knows.
Whether you want either is a question about how it feels to type with them, and that cannot be answered by editing a file and redeploying between every comparison. So each of the four is now a switch in the F4 menu as well as a setting in the schema. The setting is what happens unless somebody says otherwise; the switch is somebody saying otherwise for the window they are in. zzver reports the switches rather than the settings, because "I turned it on and nothing happened" is nearly always "that is not what is on".
were before we're, for good
Type were meaning we're a few times, pick it by number, and both readings end up confirmed — at which point the tally decides between them and it is a race between two things you meant on different days. In one real store its led it's 8 to 7, one keystroke from turning over, after which every its you typed would have come out apostrophised. window and windows were actually tied, so typing windows gave window.
When both readings are confirmed the tally stops deciding, and the reading that is what you actually typed leads — however far ahead the other one gets, because the count is the thing being distrusted. Only when both are confirmed: where you have said one thing and one thing only, dont for don't, diff for different, the correction still leads, which is what the store is for.
Ctrl+Shift+D on a word that was never yours
hae is Scots for "have". It is in the dictionary because English corpora contain it, so typing hae puts it in front of have for ever — you typed it exactly, and that is the strongest evidence the matcher has.
No ranking fixes that, and it is worth saying why rather than tuning something. Sweeping the dictionary finds 2,358 short low-frequency words with a far commoner rival directly behind them: aback behind back, abut behind but, agog behind ago, ail behind all. Every one of them must keep winning when it is typed. Which of the pair a given word is depends entirely on who is typing.
So the forget key grows the meaning it was missing. On your own entry it forgets, as before. On a word that is the dictionary's — where it used to do nothing at all, and log that it had — it means never offer me this one, written as a - word line in the same personal file. The literal is untouched, so nothing becomes untypeable, and committing the word again takes it back.
After a modal, the bare verb
"would relate", never "would related". English forces the indefinite form after would could should must may might shall will can, after their contractions, after to where to is not a preposition, and across an adverb or two: "would probably relate", "could no longer relate". The -ed readings are not removed, they are moved — a page-local reordering, four places at most — and typing a d at the end overrules the whole thing, because a consonant skeleton always carries its d (1,118 of 1,118 inflections checked).
Also
- A word picked up out of the middle of a line no longer brings a second space back. Absorbing takes the letters out and leaves everything else, so the space after that word never left the document.
leading_space, for stock Rime, which cannot take a committed space back. Off by default; the trade is a line that ends flush.- Five vocabulary packs: Europe travel (airports by name, airlines, railways), philosophy, algebra and general mathematics, literature and film and music, and the internet as it is actually written —
ChatGPT,Instagram,COVID,arXiv,LaTeX. iPhoneandeBayresist the sentence capital, because a spelling that opens lower case means it.- The possessive ending follows the candidate, not the input:
mther'sismother'sandmthers'ismothers', andmothers'sis gone. - An exact hit costs 1.64 ms at the 95th percentile rather than 4.21, by not running the fuzzy skeleton scan when the word is already in the dictionary. That is 44% of all keystrokes.
docs/PIPELINE.md: the whole program in pseudocode, 2,700 lines, written so that somebody who has never seen it can criticise the design without reading the source.
Getting it
spellless-0.1.5-installer.exe |
Windows, and the only download you need — the schema inside a Rime frontend, installed beside the Weasel you already have |
spellless-0.1.5.zip |
the schema, the matcher and the dictionary, for Windows, macOS and Linux |
Spellless-Squirrel-0.1.5.pkg |
the macOS frontend, which carries no schema — pair it with the zip |
On a stock Rime the four features above are simply inert, whatever the configuration says, and step 4 says what to turn on instead.
The macOS package is byte-identical to the 0.1.3 build, because nothing in the frontend has changed since: it is Squirrel 1.1.2 with the document convention added, built by that fork's CI from its current tip. It installs under the ordinary Squirrel bundle identifier im.rime.inputmethod.Squirrel, so it upgrades a Squirrel you already have rather than sitting beside it, and it asks you to log out. Both it and the Windows installer are unsigned, as upstream Squirrel's own releases are: right-click → Open the first time.