Skip to content

Releases: EricWay1024/spellless

Spellless 0.1.6

Choose a tag to compare

@EricWay1024 EricWay1024 released this 08 Sep 10:27
8e9ad4f

macOS users should reinstall. The Squirrel build shipped up to 0.1.5 carried Rime's own auto-updater, pointed at Rime's release feed. Once upstream Squirrel moves past 1.1.2, that updater would have offered an update which replaces the Spellless build with stock Squirrel — leaving Spellless typing but silently without the features that need our frontend. This build's updater is switched off and its feed is empty. Nothing else changed; the schema is identical to 0.1.5.

What that would have looked like

Nothing, which is the problem. The schema lives in ~/Library/Rime and would have survived the swap untouched, so Spellless would have gone on producing candidates exactly as before. What would have stopped is everything that needs the frontend to edit the document: punctuation reclaiming its automatic space, a half-typed word being picked up, Backspace deleting a whole word, and the caret-inside-a-word handoff. Those degrade silently by design — the schema asks nothing of a frontend that has never set surrounding_text, so on stock Squirrel they are simply inert. There would have been no error, and zzver would still have said spellless 0.1.5.

Sparkle is compiled into Squirrel and cannot be removed without touching code the fork's unused-code scan would then reject. So instead the feed points at an empty appcast in the fork, and automatic checking is off. Nothing is ever offered, and a manual check finds an empty channel. SPARKLE.md records what publishing real updates from here would take; it is deliberately not done.

In this build's Info.plist:

SUEnableAutomaticChecks => 0
SUFeedURL => https://raw.githubusercontent.com/EricWay1024/spellless-squirrel/spellless/appcast.xml

Getting it

spellless-0.1.6-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.6.zip the schema, the matcher and the dictionary, for Windows, macOS and Linux
Spellless-Squirrel-0.1.6.pkg the macOS frontend, which carries no schema — pair it with the zip

The macOS package 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. It is unsigned, as upstream Squirrel's own releases are: right-click → Open the first time.

Windows and Linux are unaffected. Sparkle is macOS-only; Weasel has no auto-updater of its own. The Windows installer and the zip are here for version parity and carry the same schema as 0.1.5 — if you are on 0.1.5 and not on a Mac, there is nothing here you need.

The schema archive differs from 0.1.5 in two version strings and nothing else. On a stock Rime the features above are inert whatever the configuration says, and step 4 says what to turn on instead.

Spellless 0.1.5

Choose a tag to compare

@EricWay1024 EricWay1024 released this 08 Sep 00:57

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.
  • iPhone and eBay resist the sentence capital, because a spelling that opens lower case means it.
  • The possessive ending follows the candidate, not the input: mther's is mother's and mthers' is mothers', and mothers's is 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.

Spellless 0.1.4

Choose a tag to compare

@EricWay1024 EricWay1024 released this 07 Sep 15:11

Eleven commits since 0.1.3. Two of them are bugs you would have noticed; the rest is vocabulary and a new way to argue with the capitalisation.

qq mid-word, then a key, is an instruction

Capitalisation is otherwise inferred — from what you typed, from whether a sentence just ended, from what you have picked before — and inference is right most of the time and unarguable-with when it is not. This is the argument:

wndows qqf Windows — first letter, for a name the dictionary reads as an ordinary word
api qqc API — all caps, for an acronym
but qql but — lower case, defeating an automatic sentence capital
qqd forget the highlighted candidate, as Ctrl+Shift+D does

qq because no English word contains it. Arming costs nothing: the letters stay in the composition until a key that is a command arrives, so zzxxqq still commits as itself and anything unrecognised is ordinary text. The one cost of the whole feature is that qqc cannot be typed literally.

Two capitalisation fixes

Shouting a word once is not a statement about how it is spelled. Writing MATHEMATICS in a heading made mathe offer MATHEMATICS and nothing else, for ever — not demoted but gone, the two spellings deduplicating to one candidate. The guard covered a leading capital and not all of them. The deliberate route still works: pick the capitalised candidate by its number twice and it leads, with the ordinary spelling right behind.

Familiarity settles a tie; it does not overturn the evidence. immsn gave the literal first and immersion third, because sixteen commits of instead were worth enough to cover a full extra point of edit cost — and then, the leader being that loose, nothing was trustworthy and the literal was promoted over the good reading behind it. The bonus now applies only within one edit of the best reading on offer.

195 words the corpus was too old for

Google Books knows docker, python and linux — all of which had other lives — and had never heard of macOS, JSON, kubectl or numpy. Measured before writing anything: 4 of 32 tech acronyms present, 2 of 11 libraries — but 18 of 18 UK cities and 15 of 15 Chinese cities, because a books corpus has read about places. What was missing there was acronyms (NHS, HMRC, EPSRC) and provinces (Guangdong, Shaanxi).

Nothing was bulk-imported. Every entry is checked against the dictionary first, because giving a key a written form applies it everywhere — adding RAM would make ram commit as RAM, including when you meant the animal. Out went REST, POP, CD, ARM, CAD, Bash, React, Notion and Fedora (a hat). And ML, which is not a word but is millilitres.

Also

Contractions the base list lost, you've among them — the corpus contains you'v, a truncated token the build correctly rejects, leaving a hole where you'd, you'll and you're all exist.

83,364 words. Held out over five fresh seeds: 89.3% / 99.2%. 2,158 + 64 assertions.

Downloads

you are take
already using Rime, any platform spellless-0.1.4.zippython3 scripts/install.py
on Windows, not using Rime spellless-0.1.4-installer.exe — schema and frontend in one
on macOS, not using Rime Spellless-Squirrel, then the zip

Both frontends are unsigned, as upstream Squirrel's own releases are: right-click → Open the first time.

Spellless 0.1.3

Choose a tag to compare

@EricWay1024 EricWay1024 released this 06 Sep 23:30

Adds eleven contractions the base frequency list did not have.

you've is the one worth explaining. The corpus does not contain it — what it contains is you'v, a truncated token, which the build's contraction filter rejects because v is not a contraction ending. That is correct, and it left a hole: you'd, you'll and you're were all there and you've simply was not.

Ten more were missing for no reason at all — should've and could've were in the list and would've was not. Also must've, how's, when's, that'll, there'd, ain't, shan't, daren't.

They get apostrophe-free spellings by the same pass as the rest, so youve finds you've exactly as dont finds don't.

83,169 entries. Held out over five fresh seeds: 90.2% / 99.3%.

Downloads

you are take
already using Rime, any platform spellless-0.1.3.zip — the schema. python3 scripts/install.py
on Windows, not using Rime spellless-0.1.3-installer.exe — schema and frontend in one
on macOS, not using Rime Spellless-Squirrel, then the zip

The Windows installer sits beside a stock Weasel rather than replacing it — its own registry key, user directory and text service — so a Chinese input method on the same machine carries on untouched. Both frontends are unsigned, as upstream Squirrel's own releases are: right-click → Open the first time.

The three document-editing features need one of those frontends and switch themselves on when they find one. On a stock build they stay inert, whatever the configuration says.

Spellless 0.1.0

Choose a tag to compare

@EricWay1024 EricWay1024 released this 06 Sep 21:07

Superseded by 0.1.3. Kept as the first release; the installer attached here bundles the 0.1.0 schema, which predates the missing contractions and the document features switching themselves on. Take the latest instead.


Type an approximate spelling — drop the vowels, transpose letters, run two words together — and pick the word you meant.

recieve   → receive        mthmtcs → mathematics    grthndck → Grothendieck
teh       → the            satfcatn → stratification  mther's → mother's
cmplctd   → complicated    dffmrphsm → diffeomorphism  sth    → something

The word you meant is first 90.0% of the time and on the first page 99.3%, measured on 1,535 cases the tuning never saw. About 2.5 ms per keystroke.

Which download

you are take
already using Rime (any platform) spellless-0.1.0.zip
on Windows, not using Rime spellless-0.1.0-installer.exe
on macOS, not using Rime install Squirrel, then the zip

spellless-0.1.0.zip — the schema

Everything in it is data and Lua, so it runs wherever Rime does: Weasel on Windows, Squirrel on macOS, ibus-rime or fcitx5-rime on Linux. Unpack it and run

python3 scripts/install.py

It finds the Rime user directory itself, adds the schema to default.custom.yaml without disturbing what is already there, and --uninstall removes exactly what it wrote. Then redeploy the frontend and pick Spellless from the schema menu (F4).

MIT.

spellless-0.1.0-installer.exe — Windows, batteries included

A Rime frontend and Spellless in one installer, for a machine with neither. It is built from spellless-weasel, a fork of Weasel that adds three things a schema cannot do: punctuation takes its automatic space back, a word you re-type is picked up mid-word, and Backspace deletes a whole word.

It installs beside a stock Weasel rather than over it — separate registry key, separate user directory (%APPDATA%\Spellless), separate text service — so a machine can run both.

GPL-3.0, like Weasel. Source: spellless-weasel.

There is no bundled macOS build, and there will not be one soon: Weasel is a Windows text service and the three features above are written against the Text Services Framework. macOS uses Squirrel and a different API. The schema archive covers macOS in full.

Checking what you are running

Type zzver in any text box. It reports the build the input method process actually loaded, which is not always the one on disk.

Known limits

  • Inside VS Code the three document-editing features are refused by name. Its integrated terminal re-sends a hidden buffer whenever a backwards edit changes it, so taking text back duplicates the line. F4 → "edits document" overrules it for a session.
  • Every candidate is a choice you make. Enter always commits exactly what you typed.

README · how it works · evaluation