Three pieces:
- librime — the engine. Written in C++, library form. On Debian 13 / Ubuntu 26.04 it ships as
librime1t64plus thelibrime-datametapackage (which drops a stockdefault.yamlwithschema_list: [luna_pinyin, cangjie5]at/usr/share/rime-data/default.yaml). That’s all you need for the engine itself. - fcitx5-rime — the binding into the fcitx5 IM framework. Pulls librime in as a dependency. On Ubuntu 26.04 it’s
fcitx5-rime 5.1.13-1; on Debian 13 it’s the same package under a different version number. Source:github.com/fcitx/fcitx5-rime. - Optional: librime-plugin-lua — only if you want Lua filters (custom phrases, inline-English completion, the fancy features in rime-ice / rime-wanxiang). On Debian 13 this package exists as
librime-plugin-lua; some older Ubuntu repos still call itlibrime-lua.
For Wubi specifically, you also need rime-wubi itself, which ships the schemas. The official repo (github.com/rime/rime-wubi) provides three schemas: pure wubi86.schema.yaml, traditional-output wubi_trad.schema.yaml, and the mixed-input wubi_pinyin.schema.yaml (五笔·拼音). None are in apt — they come from the Plum installer.
Step 1 — install (Debian 13 / Ubuntu 26.04)
sudo apt update
sudo apt install fcitx5 fcitx5-rime fcitx5-frontend-gtk3 fcitx5-frontend-gtk4
fcitx5-frontend-qt5 fcitx5-frontend-qt6 fcitx5-configtool
# Optional: for Lua-based community schemas
sudo apt install librime-plugin-luaSet the environment variables fcitx5 needs under GNOME Wayland or KDE Plasma 6 (otherwise only X11 apps pick it up):
sudo tee /etc/environment.d/fcitx5.conf > /dev/null << 'EOF'
GTK_IM_MODULE=fcitx5
QT_IM_MODULE=fcitx5
XMODIFIERS=@im=fcitx5
INPUT_METHOD=fcitx5
EOFAutostart fcitx5 on login (GNOME Wayland won’t start it for you):
mkdir -p ~/.config/autostart
cp /usr/share/applications/org.fcitx.Fcitx5.desktop ~/.config/autostart/
# On GNOME, also enable the AppIndicator extension
gnome-extensions enable ubuntu-appindicators@ubuntu.comLog out and back in. Run fcitx5-configtool, click +, search Rime, add it. Move it to the top of the active list. Save.
Now is the moment you run RIME is not configured — that’s expected. The framework is loaded, the engine is empty. Time to fill it.
Step 2 — install Plum
Plum is the one-liner installer for the schema library. It’s not in apt (and the project says it never will be); you curl-and-bash it.
sudo apt install git # only if you don't have git
curl -fsSL https://raw.githubusercontent.com/rime/plum/master/rime-install | bashPlum drops a plum/ directory in your home folder and a few helpers in ~/.local/bin. Verify:
which rime-install
rime-install --list-presets # see the available preset tiersTier naming convention: :preset is the default curated set, :extra adds less-maintained schemas, :all is everything. For Wubi you want :preset plus the wubi schema itself.
Step 3 — install the Wubi schema and its dependency
The mixed-input wubi_pinyin.schema.yaml depends on pinyin_simp (rime-pinyin-simp on GitHub). Plum pulls dependencies automatically, but it doesn’t enable anything — that comes in step 5.
rime_frontend=fcitx5-rime bash rime-install wubi pinyin-simp
# Adds: wubi86.schema.yaml, wubi_trad.schema.yaml, wubi_pinyin.schema.yaml,
# wubi86.dict.yaml (~2 MB), pinyin_simp.schema.yaml, pinyin_simp.dict.yaml
# Files land in ~/.local/share/fcitx5/rime/If you also want a full-pinyin backup (smart Chinese with freq ranking, English-aware candidates):
bash rime-install luna-pinyin
# Adds: luna_pinyin.schema.yaml, luna_pinyin_simp.schema.yaml, luna_pinyin_fluency.schema.yamlOptional extras worth knowing about (these need librime-plugin-lua):
bash rime-install iDvel/rime-ice # 霧凇拼音: curated long-maintained vocab + 9 schemas
bash rime-install gaboolic/rime-frost:others/recipes/full # 白霜拼音: 745M-char corpus rebuild, 2026 SOTA
bash rime-install amzxyz/rime-wanxiang # 萬象拼音: 200M-scale .gram language modelFrost and Wanxiang both rebuild frequencies from scratch in 2025 and have the best open-source RIME dictionaries right now. Pick one if you’re starting fresh; pick ice if you want the most-configurable community setup; pick Luna if you want to stay close to defaults.
Step 4 — the mixing mechanism (what wubi_pinyin actually does)
Open the schema file plum just dropped:
less ~/.local/share/fcitx5/rime/wubi_pinyin.schema.yamlThe relevant block is:
abc_segmentor:
extra_tags:
- reverse_lookup
reverse_lookup:
dictionary: pinyin_simp
prefix: "`"
suffix: "'"
tips: 〔拼音〕
recognizer:
import_preset: default
patterns:
reverse_lookup: "`[a-z]*'?$"Read this together:
- The main translator (
table_translator) useswubi86as the dictionary — every keystroke you type without any prefix is matched against the Wubi86 root table. - A second translator (
reverse_lookup_translator) is registered with tagreverse_lookup. When the recognizer fires (pattern: "^[a-z]*’?$”— anything starting with a backtick and ending in an apostrophe, with only ASCII letters in between), the engine hands the buffer to thepinyin_simp` dictionary. - Both translators’ hits join the same candidate list. There’s no mode switch.
- The
disable_user_dict_for_patterns: "^z.*$"line means RIME won’t pollute your personal dictionary when you’re typingz-prefixed stuff (which in purewubi86is the single-character reverse-lookup helper — irrelevant when you’re already inwubi_pinyin).
In practice:
| You type | Engine does |
|---|---|
wg |
Looks up wg in wubi86. Candidates: 我, 什, 拿, etc. |
wg `ni' | Looks up wg in wubi86 AND `ni' in pinyin_simp. Candidates from both. |
|
wgn (a non-existent code) |
No Wubi match. Falls through to pinyin_simp on the next recognizer fire (no backtick needed, because the buffer is invalid for Wubi; this is a happy accident of the speller). |
`hainihaoniu | Single token, no apostrophe suffix. Recognizer doesn’t fire. Looks up whole string in wubi86, gets nothing. Hit Backspace and add the '. |
The mistake almost everyone makes: thinking wubi_pinyin uses the z prefix the way wubi86 does. It doesn’t. z is irrelevant in wubi_pinyin — that’s an old wubi86 idiom for one-shot character reverse-lookup. The whole point of wubi_pinyin is that you don’t need that mode any more.
For Wubi86 混输 specifically (you want raw wubi_pinyin as your primary engine), this is it. If you want Wubi98 + pinyin mixed, fcitx5’s wbpy schema is the only Debian/Ubuntu option; see the previous article for that comparison.
Step 5 — enable what you installed
Create the user overlay. RIME merges everything by reading default.custom.yaml over the system default.yaml. Without it, your installed schemas are invisible to the engine.
mkdir -p ~/.local/share/fcitx5/rimeWrite ~/.local/share/fcitx5/rime/default.custom.yaml. Put schemas in priority order — the first one is what RIME starts in:
patch:
schema_list:
- schema: wubi_pinyin
- schema: wubi86
- schema: luna_pinyin
- schema: double_pinyin_flypy
menu/page_size: 9
switcher/hotkeys:
- Control+grave
- Control+Shift+graveThe menu/page_size: 9 raises the visible-candidate count from the default 5 to 9. Control+grave is the standard schema-switcher hotkey.
Deploy. RIME only reads its YAML when prompted to rebuild:
# Either: GUI tray → Rime → 部署 (Deploy)
# Or CLI:
rime_deployer --buildIf your new schema still doesn’t appear in Control+grave, double-check the file actually landed:
ls ~/.local/share/fcitx5/rime/
# Should show: default.custom.yaml, wubi_pinyin.schema.yaml, wubi86.dict.yaml, ...Now type something. The candidate bar should populate with Wubi codes; typing `ni plus ' should pull up pinyin candidates inline.
Step 6 — the eleven customizations worth knowing
These go into default.custom.yaml (engine-wide) or <schema>.custom.yaml (per-schema overlay). Per-schema overrides take precedence over engine-wide when both define a key.
Add a custom phrase
RIME learns phrases by promoting candidates you pick. For shortcuts you type often, write to <schema>.userdb.txt:
# ~/.local/share/fcitx5/rime/wubi_pinyin.userdb.txt
# Format: syllable<TAB>phrase<TAB>weight
nianhai 你好 100
ssch 随时随地 100Then rime_deployer --build. The phrases appear at the top of the candidate list when you type the trigger.
Use Shift_L to commit code (instead of plain Shift toggle)
The default fcitx5-rime binds Shift_L to “toggle ascii mode” — which means pressing Shift mid-composition kills your buffer. Patch it:
patch:
ascii_composer:
switch_key:
Shift_L: commit_code
Shift_R: commit_code
Eisu_toggle: clearNow Shift commits the buffer AND toggles ascii mode. You don’t lose what you typed.
More visible candidates
patch:
menu/page_size: 9 # default is 5; cap is 10
menu/alternative_select_labels: ["1","2","3","4","5","6","7","8","9"]Turn on inline English completion (rime-ice / rime-frost style)
This does not work for wubi_pinyin itself — Lua fusion with wubi is non-trivial. What works: install a community schema that has it baked in (rime-ice → melt_eng, rime-frost → melt_eng); then add to your schema_list:
schema_list:
- schema: rime_ice # or frost_simp / wanxiang / etc.
- schema: wubi_pinyinrime_ice‘s melt_eng translator triggers off any prefix that contains the [a-z]+ shape inline with your pinyin — but wubi_pinyin‘s shape isn’t pinyin, so the trigger doesn’t fire on Wubi strokes. Treat the English fusion as a perk of the pinyin schemas only.
Quick schema switching during typing
Control+grave opens the schema/option menu. To jump directly to a specific schema, add key_binder to your default.custom.yaml:
patch:
key_binder:
bindings:
- {accept: "Control+1", select: ".next", when: always}
- {accept: "Control+2", toggle: ascii_mode, when: always}The select: ".next" cycles forward (wraps around); .prev cycles backward. You can bind any key chord to .next/.prev.
Toggle simplified ↔ traditional mid-stream
wubi_pinyin doesn’t expose per-schema simplification switch the way luna_pinyin_simp does. To get the same behavior, install rime-prelude‘s opencc config and override:
patch:
__include: opencc:/ # brings in the OpenCC simplifier
switches:
- name: simplification
reset: 0Then F4 (or Control+grave) shows a 汉字 / 漢字 toggle in the options menu.
Disable candidate paging on Space
Default behavior: Space commits candidate 1, Tab moves to next candidate. If you press Space once and want it to commit instead of starting over from the first page:
patch:
key_binder:
bindings:
- {accept: "space", send: Escape, when: composing}
- {accept: "Return", send: Return, when: composing}That cancels the composition when you press Space, then re-types as ASCII on the next app key event.
Set a custom trigger key for ASCII mode
patch:
ascii_composer:
switch_key:
Caps_Lock: commit_code
Shift_L: commit_code
Shift_R: commit_codeCaps_Lock toggles without committing — useful for long bursts of English in the middle of Chinese composition.
Sync your user dictionary across machines
RIME ships a built-in syncer. The config goes in installation.yaml (auto-generated; you don’t write it directly — rime_deployer --build creates it). To opt in:
patch:
sync_dir: /dropbox/rime-sync # or any sync target
sync_user_dir: same
# Supported syncers: dropbox, nutstore, others
# (Check `librime/build` for compiled-in syncers via ldd / librime.so)You need the binary to be linked against the syncer plugin. Default fcitx5-rime builds typically have all the sync backends.
Manual install of a third-party schema (without Plum)
Sometimes Plum chokes on a recipe. Falling back to a manual install:
git clone --depth=1 https://github.com/iDvel/rime-ice.git
cp -r rime-ice/cn/full/* ~/.local/share/fcitx5/rime/
# Add only the .yaml files you want to schema_list
rime_deployer --buildcp -r is safe — RIME ignores duplicates, picks the last one written. Just don’t .git into the rime directory; the engine doesn’t care but you do (~/ shouldn’t get that dirty).
Reset everything
If a config goes sideways:
mv ~/.local/share/fcitx5/rime ~/.local/share/fcitx5/rime.bak.$(date +%s)
rime_deployer --build
# The engine reloads with system defaults only.Then re-do step 5.
Step 7 — diagnose the common failure modes
Each of these has bitten someone you know.
“RIME is not configured” / no candidates
Cause: engine installed, but default.custom.yaml either doesn’t exist or has no schema_list. Fix: create the file (step 5) and deploy.
New schema doesn’t show in Control+grave
Cause: plum installed the .yaml files but you forgot rime_deployer --build (or the tray-menu equivalent). The files exist; the engine hasn’t read them. Fix: deploy.
Custom phrase disappears after restart
Cause: edited <schema>.userdb.txt, the file format was wrong, or the deploy didn’t happen. Fix: verify tab-separated syllable<TAB>phrase<TAB>weight, re-Deploy. If the file is empty after restart, check ~/.local/share/fcitx5/rime/build/ for cached binaries — a stale *.bin there overrides your dict.
Wubi+Pinyin mix “doesn’t work”
Cause: most commonly, you typed `ni without the trailing apostrophe. The recognizer pattern is `[a-z]*'?$ — the ' is required. Without it, the engine waits for more input and the spelling buffer keeps growing. Fix: type the apostrophe. Alternatively, install pinyin-simp cleanly: bash rime-install pinyin-simp and check ~/.local/share/fcitx5/rime/pinyin_simp.dict.yaml exists.
fcitx5 eats Shift and toggles ASCII layout
Cause: ascii_composer default. Fix: see “Use Shift_L to commit code” above. Restart fcitx5 after editing (fcitx5-ctl restart).
Wayland: nothing types, but the tray is alive
Cause: env vars not picked up by the app. Fix: systemctl --user restart fcitx5 from inside the affected Wayland session, and double-check /etc/environment.d/fcitx5.conf exists with the four lines above.
After a system update in early 2026: fcitx5-rime broke on Arch / CachyOS
CachyOS shipped an librime ABI bump that mismatched fcitx5-rime; the workaround (April 2026) was pinning librime to the LTS version and ensuring default.yaml‘s schema_list was explicit. On Debian/Ubuntu this hasn’t reproduced, but if you see “undefined symbol” errors from librime after an update, run apt policy librime1t64 and pin.
Where to go next
If you got this far and your default.custom.yaml actually has the schemas you want, you have a complete working stack. Two follow-ups worth their own articles:
- rime-ice / rime-frost / rime-wanxiang head-to-head — each one bundles a curated
default.custom.yamlyou can fork; comparing them in their default state would save a week of experimentation. - Syncing user dictionaries across Linux + macOS + Windows — librime’s
sync_dirwith Dropbox is straightforward on paper but the directory naming (userdb.txtvs the schema’s own filename) trips people up.
Tell me in the comments which one you’d rather see next.
Sources verified July 2026: github.com/rime/rime-wubi/blob/master/wubi_pinyin.schema.yaml (master branch — prefix: `,suffix: ”’, dependencies[pinyin_simp]),packages.ubuntu.com/resolute/fcitx5-rime(5.1.13-1),github.com/rime/plumREADME,github.com/fcitx/fcitx5-rimeREADME,github.com/rime/librime` releases (1.16.1 in stable, 1.17.0 upstream).
Comments