diff --git a/.typos.toml b/.typos.toml index 9493ba73..2954acc0 100644 --- a/.typos.toml +++ b/.typos.toml @@ -11,7 +11,7 @@ extend-exclude = [ "rime-data/", # small-duck flypy user dictionary: entries are pinyin codes ("delt", "juli"), # not English words, so the spell checker flags every one of them - "overlays/fcitx5/flypy_user.txt", + "home/base/gui/rime/flypy_user.txt", ] [default] diff --git a/flake.lock b/flake.lock index d13394a8..9990819a 100644 --- a/flake.lock +++ b/flake.lock @@ -941,11 +941,11 @@ ] }, "locked": { - "lastModified": 1791100543, - "narHash": "sha256-DsuozPwOkBqrobxHGRdAkIJ/XH4RlkklDAdCRZPspIc=", + "lastModified": 1791202937, + "narHash": "sha256-80qCd/nbv2E2SybjMwzu9nQNXEkU14skcWj4tBpM/wo=", "owner": "ryan4yin", "repo": "nur-packages", - "rev": "f7b563dd38adf37579465b28bfa5f34305cb59f3", + "rev": "ff5441119f114a934578f8c092bd6d1d01696ae8", "type": "github" }, "original": { diff --git a/home/base/README.md b/home/base/README.md index 02a75055..ff542ca2 100644 --- a/home/base/README.md +++ b/home/base/README.md @@ -27,6 +27,7 @@ systems. - **dev-tools.nix**: Misc development and network tools (mitmproxy, wireshark) - **media.nix**: Media players and utilities - **zed-editor.nix**: Zed editor configuration (primary GUI editor) + - **rime/**: Rime (flypy) customisation shared by fcitx5-rime (Linux) and Squirrel (macOS) - **terminal/**: Terminal emulator configurations - **ghostty.nix**: Ghostty terminal (default) - **kitty.nix**: Kitty terminal diff --git a/home/base/gui/rime/README.md b/home/base/gui/rime/README.md new file mode 100644 index 00000000..84308564 --- /dev/null +++ b/home/base/gui/rime/README.md @@ -0,0 +1,47 @@ +# Rime (flypy) customisation + +Personal Rime setup for the [flypy](https://flypy.com/) (小鹤音形) schema, shared by fcitx5-rime +(Linux) and Squirrel (macOS) so both behave the same. + +## Files + +- `flypy.custom.yaml`: the preferences, layered by Rime on top of the shared rime-data. +- `flypy_user.txt`: the user dictionary (custom phrases, symbols, missing characters). +- `default.nix`: per-platform wiring (see that file for the details). + +The schema data comes from the `rime-data-flypy` package in `nur-ryan4yin` and stays untouched, so +updates survive. Personal preferences and the dictionary live here. On macOS the shared data +includes an empty `flypy_user.txt`, so the user files set `home.fileOverlapResolution = "override"` +to win over it. + +## Preferences + +- Right Shift switches CN/EN. Left Shift stays a plain modifier; Ctrl+Space also switches (fcitx5 on + Linux, the system input-source shortcut on macOS). +- Shift+Space does not toggle full/half width. +- `[ ] { }` produce corner brackets `「」『』`. + +These sit in a schema-level patch rather than `default.custom.yaml` so they also override the +`default` preset and flypy's own bindings, and to avoid colliding with the `default.custom.yaml` +that ships in Squirrel's user directory. + +## Hotkeys + +The flypy schema brings its own bindings. Two worth remembering: + +- Ctrl+J toggles simplified/traditional Chinese (简繁). +- Ctrl+. toggles Chinese/ASCII punctuation (中英标点). + +## Applying changes + +`flypy.custom.yaml` is a store symlink with an epoch mtime, so Rime does not redeploy when it +changes. Remove `build/` and reload: + +```sh +# Linux +rm -rf ~/.local/share/fcitx5/rime/build +fcitx5-remote -r + +# macOS: remove build/, then restart Squirrel +rm -rf ~/Library/Rime/build +``` diff --git a/home/base/gui/rime/default.nix b/home/base/gui/rime/default.nix new file mode 100644 index 00000000..5bc02d6d --- /dev/null +++ b/home/base/gui/rime/default.nix @@ -0,0 +1,42 @@ +{ + inputs, + lib, + pkgs, + ... +}: +let + # flypy (小鹤音形) rime data from nur-ryan4yin (`pkgs/rime-data-flypy`). The + # package stays pristine; personal preferences live in flypy.custom.yaml. + rime-data-flypy = inputs.nur-ryan4yin.packages.${pkgs.stdenv.hostPlatform.system}.rime-data-flypy; + # Personal Rime customisation, layered by Rime on top of the shared rime-data. + custom = ./flypy.custom.yaml; + # Manually maintained user dictionary (custom phrases, symbols, missing + # characters); Rime reads it from the user directory. + user-dict = ./flypy_user.txt; +in +lib.mkMerge [ + # Linux: fcitx5-rime, with its user directory in ~/.local/share/fcitx5/rime. + (lib.mkIf pkgs.stdenv.hostPlatform.isLinux { + # Chinese: flypy (小鹤音形) data instead of the default rime-data. + i18n.inputMethod.fcitx5.addons = [ + (pkgs.fcitx5-rime.override { rimeDataPkgs = [ rime-data-flypy ]; }) + ]; + xdg.dataFile."fcitx5/rime/flypy.custom.yaml".source = custom; + xdg.dataFile."fcitx5/rime/flypy_user.txt".source = user-dict; + }) + + # macOS: Squirrel reads shared data from ~/Library/Rime, so link the data there. + # Its `flypy_user.txt` template overlaps our dictionary, so the regular files + # below must win. This is the only recursive link in the configuration. + (lib.mkIf pkgs.stdenv.hostPlatform.isDarwin { + home.fileOverlapResolution = "override"; + home.file."Library/Rime" = { + source = "${rime-data-flypy}/share/rime-data"; + recursive = true; + # overwrite possible existing data dynamically generated by squirrel + force = true; + }; + home.file."Library/Rime/flypy.custom.yaml".source = custom; + home.file."Library/Rime/flypy_user.txt".source = user-dict; + }) +] diff --git a/home/base/gui/rime/flypy.custom.yaml b/home/base/gui/rime/flypy.custom.yaml new file mode 100644 index 00000000..3890a3f1 --- /dev/null +++ b/home/base/gui/rime/flypy.custom.yaml @@ -0,0 +1,52 @@ +# Personal Rime customisation for the flypy (小鹤音形) schema, layered on top of +# the shared rime-data by Rime's .custom.yaml mechanism. See README.md. +patch: + # Right Shift switches CN/EN; left Shift stays a plain modifier. The stock + # flypy schema switches on Shift_L, so keep the explicit noop. Ctrl+Space also + # switches (fcitx5 on Linux; the system input-source shortcut on macOS). + ascii_composer/switch_key/Shift_L: noop + ascii_composer/switch_key/Shift_R: commit_code + + # Disable the stock `Shift+space -> toggle full_shape` binding. flypy declares + # its own copy after the one imported from `default`, so the override must be a + # schema-level `bindings/+` (appended last, highest priority) with `unset_option`. + key_binder/bindings/+: + - { when: always, accept: "Shift+space", unset_option: full_shape } + + # Prefer corner brackets over the upstream `【】{}` for [ ] { }. + "punctuator/full_shape/[": + - 「 + - 【 + - 〔 + - [ + "punctuator/full_shape/]": + - 」 + - 】 + - 〕 + - ] + "punctuator/full_shape/{": + - 『 + - 〖 + - { + "punctuator/full_shape/}": + - 』 + - 〗 + - } + "punctuator/half_shape/[": + - 「 + - 【 + - 〔 + - [ + "punctuator/half_shape/]": + - 」 + - 】 + - 〕 + - ] + "punctuator/half_shape/{": + - 『 + - 〖 + - { + "punctuator/half_shape/}": + - 』 + - 〗 + - } diff --git a/overlays/fcitx5/flypy_user.txt b/home/base/gui/rime/flypy_user.txt similarity index 100% rename from overlays/fcitx5/flypy_user.txt rename to home/base/gui/rime/flypy_user.txt diff --git a/home/darwin/README.md b/home/darwin/README.md index cc0142a1..eb7250ca 100644 --- a/home/darwin/README.md +++ b/home/darwin/README.md @@ -9,8 +9,6 @@ This directory contains macOS-specific Home Manager configurations for Darwin sy - **default.nix**: Entry point that imports all Darwin configurations - **shell.nix**: Shell configurations and environment settings - **terminal.nix**: Sets a 15px font size across Ghostty and Kitty -- **rime-squirrel.nix**: [Rime Squirrel](https://github.com/rime/squirrel) input method - configuration ### Network Configuration diff --git a/home/darwin/rime-squirrel.nix b/home/darwin/rime-squirrel.nix deleted file mode 100644 index 2903630e..00000000 --- a/home/darwin/rime-squirrel.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ pkgs, ... }: -{ - # Squirrel Input Method - home.file."Library/Rime" = { - # my custom squirrel data (flypy input method) - source = "${pkgs.flypy-squirrel}/share/rime-data"; - recursive = true; - # overwrite possible existing data dynamically generated by squirrel - # https://github.com/nix-community/home-manager/blob/release-23.05/modules/lib/file-type.nix#L101-L111 - force = true; - }; -} diff --git a/outputs/default.nix b/outputs/default.nix index 59231dae..f91c9de4 100644 --- a/outputs/default.nix +++ b/outputs/default.nix @@ -192,7 +192,7 @@ in configPath = ".typos.toml"; # relative to the flake root # git-hooks passes paths on the command line, which makes typos # ignore .typos.toml's extend-exclude, so repeat it here - exclude = "rime-data/|overlays/fcitx5/flypy_user.txt"; + exclude = "rime-data/|home/base/gui/rime/flypy_user.txt"; }; }; prettier = { diff --git a/overlays/README.md b/overlays/README.md index 9c301b1e..54d2f5e5 100644 --- a/overlays/README.md +++ b/overlays/README.md @@ -13,27 +13,8 @@ overlays/ ├── default.nix # Entrypoint for all overlays ├── computer-use-linux.nix # computer-use-linux from ryan4yin/nur-packages ├── cua-driver.nix # cua-driver from ryan4yin/nur-packages -├── smartctl-exporter/ # smartctl_exporter pinned to the #329 fix -│ └── default.nix -└── fcitx5/ # Chinese input method configuration - ├── README.md - ├── default.nix # fcitx5 overlay definition - └── rime-data-flypy/ # Custom rime data for 小鹤音形输入法 - └── share/ - └── rime-data/ - ├── build/ - ├── default.custom.yaml - ├── default.yaml - ├── flypy.schema.yaml - ├── flypy_full全码字.txt - ├── flypy_sys.txt - ├── flypy_top.txt - ├── flypy_user.txt - ├── lua/ - │ └── calculator_translator.lua - ├── rime.lua - ├── squirrel.custom.yaml - └── squirrel.yaml +└── smartctl-exporter/ # smartctl_exporter pinned to the #329 fix + └── default.nix ``` ## Components @@ -43,17 +24,7 @@ overlays/ The entrypoint of overlays, it execute and import all overlay files in the current directory with the given args. -### 2. `fcitx5` - -fcitx5's overlay, add my customized Chinese input method - [小鹤音形输入法](https://flypy.com/) - -This overlay provides: - -- Custom rime data for 小鹤音形输入法 (Flypy input method) -- Cross-platform support for both Linux (fcitx5-rime) and macOS (squirrel) -- Pre-configured input method settings - -### 3. Package overlays +### 2. Package overlays - `computer-use-linux.nix`: exposes `computer-use-linux` from the `nur-ryan4yin` flake input. - `cua-driver.nix`: exposes `cua-driver` from the `nur-ryan4yin` flake input (used by the diff --git a/overlays/fcitx5/README.md b/overlays/fcitx5/README.md deleted file mode 100644 index 74111430..00000000 --- a/overlays/fcitx5/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# rime-data for flypy input method - -Useful for Linux(fcitx5-rime) & macOS(squirrel). - -## Data source - -The schema data comes from the `rime-data-flypy` package in -[nur-ryan4yin](https://github.com/ryan4yin/nur-packages). This overlay adds the personal user -dictionary (`flypy_user.txt`) on top and exposes the merged result as `pkgs.rime-data`, -`pkgs.fcitx5-rime`'s `rimeDataPkgs`, and `pkgs.flypy-squirrel`. - -## Linux(fcitx5-rime) - -1. `~/.config/fcitx5/profile` is linked to - [home/linux/gui/base/fcitx5/profile](../../home/linux/gui/base/fcitx5/profile), which hardcode - rime as the default input method, so you do not need to use fcitx-configtool to adjust fcitx5's - input method. - -## macOS(squirrel) - -1. ` ~/Library/Rime/` is force linked to this rime-data, see - [home/darwin/rime-squirrel.nix](../../home/darwin/rime-squirrel.nix) for details. - -## Docs about fcitx5 - -- [Fcitx5 - Arch Linux Wiki](https://wiki.archlinux.org/title/Fcitx5) -- [Fcitx5 - Official Wiki](https://fcitx-im.org/wiki/Fcitx_5/zh-cn) diff --git a/overlays/fcitx5/default.nix b/overlays/fcitx5/default.nix deleted file mode 100644 index e4ca1ad3..00000000 --- a/overlays/fcitx5/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -# 为了不使用默认的 rime-data,改用小鹤音形数据,这里需要 override -# 参考 https://github.com/NixOS/nixpkgs/blob/e4246ae1e7f78b7087dce9c9da10d28d3725025f/pkgs/tools/inputmethods/fcitx5/fcitx5-rime.nix -{ inputs, ... }: -( - _: super: - let - # 小鹤音形 schema 数据,来自 nur-ryan4yin 的 rime-data-flypy, - # 再叠加我自己的用户词库 flypy_user.txt。 - rime-data-flypy = inputs.nur-ryan4yin.packages.${super.stdenv.hostPlatform.system}.rime-data-flypy; - - rime-data = super.runCommandLocal "rime-data-flypy-custom" { } '' - mkdir -p $out/share/rime-data - cp -r ${rime-data-flypy}/share/rime-data/. $out/share/rime-data/ - chmod -R u+w $out/share/rime-data - cp ${./flypy_user.txt} $out/share/rime-data/flypy_user.txt - ''; - in - { - inherit rime-data; - fcitx5-rime = super.fcitx5-rime.override { rimeDataPkgs = [ rime-data ]; }; - - # used by macOS Squirrel - flypy-squirrel = rime-data; - } -)