{"id":29361296,"url":"https://github.com/wlh320/rime-ls","last_synced_at":"2025-07-09T08:12:30.503Z","repository":{"id":65375408,"uuid":"588147491","full_name":"wlh320/rime-ls","owner":"wlh320","description":"A language server that provides input method functionality using librime 通过 LSP 代码补全使用 Rime 输入法","archived":false,"fork":false,"pushed_at":"2025-05-10T14:16:04.000Z","size":190,"stargazers_count":268,"open_issues_count":9,"forks_count":16,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-08T17:57:32.589Z","etag":null,"topics":["helix","input-method","librime","lsp","lsp-server","neovim","nvim","rime","vim","zed"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wlh320.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-01-12T12:48:36.000Z","updated_at":"2025-06-08T16:56:54.000Z","dependencies_parsed_at":"2023-04-17T17:48:59.610Z","dependency_job_id":"3773d164-b5c3-4f19-a2ac-c73613d6e0f2","html_url":"https://github.com/wlh320/rime-ls","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/wlh320/rime-ls","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlh320%2Frime-ls","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlh320%2Frime-ls/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlh320%2Frime-ls/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlh320%2Frime-ls/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wlh320","download_url":"https://codeload.github.com/wlh320/rime-ls/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wlh320%2Frime-ls/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264419580,"owners_count":23605204,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["helix","input-method","librime","lsp","lsp-server","neovim","nvim","rime","vim","zed"],"created_at":"2025-07-09T08:12:25.661Z","updated_at":"2025-07-09T08:12:30.496Z","avatar_url":"https://github.com/wlh320.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rime-ls\n\n\u003e A language server that provides input method functionality using librime.\n\n为 rime 输入法核心库 [librime](https://github.com/rime/librime) 的主要功能实现 LSP 协议，\n从而将编辑器的代码补全功能当作输入法使用。\n\n项目还处在**早期阶段**\n\n目标是提供 rime + LSP 的通用解决方案, 在不同编辑器内实现与其他 rime 前端类似的输入体验，\n解决 vim 编辑模式下的输入法冲突和切换问题。\n\n主要使用场景:\n\n- 在 vim 编辑模式下写 markdown, $\\LaTeX$ 等文档（更像输入法）\n- 在编程时输入特殊的变量名或者写注释（更像代码补全）\n\n## Features\n\n- 用 rime 能输入的东西按理说都能输入 ( 汉字, 标点, emoji ...)\n- 支持按数字选择补全项\n- 支持候选词翻页\n- 多种触发方式\n  - 默认开启, 随时补全, 用快捷键控制关闭 (大量输入)\n  - 平时关闭, 检测到配置的特殊字符或光标前有非英文字符时触发补全 (少量输入)\n- 可以按配置其他 rime 输入法的方式去配置 (只有能影响候选项的配置是有用的)\n- 可以同步系统中已有 rime 输入法的词频\n- 无需图形界面，可在远程登录服务器时使用\n- 可以通过 TCP 远程使用 (无任何加密，谨慎使用) (since v0.1.3)\n\n效果展示：\n\nhttps://user-images.githubusercontent.com/14821247/213079440-f0ab2ddd-5e44-4e41-bd85-81da2bd2957f.mp4\n\n更多编辑器（nvim, helix, zed, qt-creator）下的展示见 [Showcase](https://github.com/wlh320/rime-ls/wiki/%E6%A1%88%E4%BE%8B%E5%B1%95%E7%A4%BA-Showcase)\n\n## Usage\n\n\u003e [!WARNING]\n\u003e 第一次启动时 rime 需要做大量工作, 可能会很慢\n\n### 直接使用\n\n1. 下载 Release / 自己从源码编译 / 包管理器安装\n2. 创建一个专属 rime-ls 的 rime 配置目录\n3. 配置 LSP 客戶端, 例如:\n   - [Neovim](doc/nvim.md)\n   - [Vim + coc.nvim](doc/vim.md)\n   - [Vscode](doc/vscode.md)\n   - [Helix](doc/helix.md)\n   - [Zed](doc/zed.md)\n4. 像配置其他 Rime 输入法一样在 rime-ls 的用户配置目录进行配置\n5. 輸入拼音, 就可以看到补全提示\n6. 可以通过修改 rime-ls 的配置项控制补全行为\n\n### 通过容器使用\n\n1. 下载或自行编译 rime-ls 的 docker 镜像，例如 `docker pull ghcr.io/wlh320/rime-ls:master`\n2. 根据使用需求参考 docker-compose.yaml 以合适的参数运行容器\n3. 其他同上。注意配置客户端时需要使用容器内部的路径\n\n\u003e [!TIP]\n\u003e 容器中不包含 Rime 内置输入方案的数据。使用时可以根据需要映射到 `/usr/share/rime-data` 目录，\n\u003e 或者使用 [rime-ice](https://github.com/iDvel/rime-ice/releases/tag/nightly)\n\u003e 等不依赖 Rime 内置输入方案的方案。\n\n## Configuration\n\n所有可配置项及其默认值（以 json 为例）:\n\n```jsonc\n{\n  \"initializationOptions\": {\n    \"enabled\": true, // 是否启用\n    \"shared_data_dir\": \"/usr/share/rime-data\", // 指定 rime 共享文件夹\n    \"user_data_dir\": \"~/.local/share/rime-ls\", // 指定 rime 用户文件夹，最好别与其他 rime 前端共用\n    \"log_dir\": \"~/.local/share/rime-ls\", // 指定 rime 日志文件夹\n    \"max_candidates\": 9, // [v0.2.0 后不再有用] 与 rime 的候选数量配置最好保持一致\n    \"trigger_characters\": [], // 为空表示全局开启，否则列表内字符后面的内容才会触发补全\n    \"schema_trigger_character\": \"\u0026\", // [since v0.2.0] 当输入此字符串时请求补全会触发 “方案选单”\n    \"paging_characters\": [\",\", \".\", \"-\", \"=\"], // [since v0.2.4] 输入这些符号会强制触发一次补全，可用于翻页 见 issue #13\n    \"max_tokens\": 0, // [since v0.2.0] 大于 0 表示会在删除到这个字符个数的时候，重建所有候选词，而不使用删除字符操作，见 pr #7\n    \"always_incomplete\": false, // [since v0.2.0] true 强制补全永远刷新整个列表，而不是使用过滤，见 pr #7\n    \"preselect_first\": false, // [since v0.2.3] 是否默认选择第一个候选项\n    \"long_filter_text\": false, // [since v0.3.0] 使用更长的 filter_text，某些编辑器如 helix/zed 连续补全需要设置 true\n    \"show_filter_text_in_label\": false, // [since v0.3.0] 在候选项的 label 中显示 filter_text，某些编辑器如 zed 需要设置 true\n    \"show_order_in_label\": true // [since v0.4.0] 在候选项的 label 中显示数字\n  }\n}\n```\n\n## Build\n\n### Ubuntu\n\n1. 配置 Rust 环境, 安装额外依赖 `clang` 和 `librime-dev`\n2. 编译\n   - `librime \u003e= 1.6` =\u003e `cargo build --release`\n   - `librime \u003c 1.6` =\u003e `cargo build --release --features=no_log_dir`\n\n### ArchLinux\n\n可以通过我在 AUR 上打的包 [rime-ls](https://aur.archlinux.org/packages/rime-ls) 编译安装\n\n手动从源码编译与上面类似，其他 linux 发行版也差不多\n\n### NixOS\n\n本项目已收录至 [nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/ri/rime-ls/package.nix)\n\n编辑器配置 `shared_data_dir` 时，需要根据 `rime-data` 的管理方式进行对应设置：\n\n1. 如不使用 Nix 安装 `rime-data`（eg. 使用 Git 仓库管理）：\n\n   同其他发行版，`shared_data_dir` 设置为 `\u003crime-data-root-dir\u003e/share/rime-data` 即可（注意 NixOS 不提供 `/usr/share` 路径，请将 `rime-data` 保存至其他可写入路径下）。\n\n2. 如使用 Nix 安装 `rime-data`:\n\n   可以在 NixOS configuration 中设置 `RIME_DATA_DIR` 环境变量：\n   \n   ```Nix\n   {\n     environment.variables.\"RIME_DATA_DIR\" = \"${pkgs.rime-data}/share/rime-data\";\n   }\n   ```\n   \n   或在 NixOS configuration 中创建固定路径到 `rime-data` 的软链接：\n\n   ```Nix\n   { pkgs, ... }:\n   {\n     # symlink to `/var/lib/rime-ls/rime-data`\n     systemd.tmpfiles.rules = [\n       # ...\n       \"L+ /var/lib/rime-ls/rime-data - - - - ${pkgs.rime-data}/share/rime-data\"\n     ];\n     # OR symlink to `/etc/rime-ls/rime-data`\n     environment.etc.\"rime-ls/rime-data\" = {\n       enable = true;\n       mode = \"symlink\";\n       source = \"${pkgs.rime-data}/share/rime-data\";\n     };\n   }\n   ```\n\n   之后在编辑器配置中，设置 `shared_data_dir` 为 `${RIME_DATA_DIR}` 或以上设置的软链接路径。\n   \n   如需使用自定义的 `rime-data` 配置，可以通过 Nix expression 打包并安装，替换上述 `${pkgs.rime-data}` 为对应包名即可。\n\n   TIP: Nixpkgs/NUR 现提供了 `rime-ice` `rime-zhwiki` 等第三方配置，但暂无自动合并配置的解决方案，建议有需求的用户自行维护。\n\n### Windows\n\n1. 配置 Rust 环境, 安装额外依赖 `clang` 和 `librime`\n2. 通过 librime 的 [Release](https://github.com/rime/librime/releases/) 下载 windows 版本，例如 `rime-xxxx-Windows-msvc-x64.7z`，解压至某个目录\n3. 设置环境变量以便编译时找到 librime 的相关文件，在 powershell 下可以：\n   ```powershell\n   $env:LIBRIME_LIB_DIR=\"C:\\解压出来的目录\\dist\\lib\" # 找库文件\n   $env:LIBRIME_INCLUDE_DIR=\"C:\\解压出来的目录\\dist\\include\" # 找头文件\n   $env:LIB=\"C:\\解压出来的目录\\dist\\lib\" # 链接时找 lib 文件\n   ```\n4. 编译 `cargo build --release`\n\n### macOS\n\n1. 安装 [鼠须管输入法](https://github.com/rime/squirrel)\n2. 安装 [librime](https://github.com/rime/librime)\n   从此项目中的 [Release](https://github.com/rime/librime/releases/)\n   下载最新的 MacOS 相关的压缩包，解压缩后将 include 文件夹以及 lib 文件夹下的内容分别复制到 `/usr/local/include` 和 `/usr/local/lib`;\n3. 设置环境变量以便编译时找到 librime 的相关文件（参考[相关 issue](https://github.com/wlh320/rime-ls/issues/24)）\n\n   ```bash\n   # 用于编译\n   export LIBRIME_LIB_DIR=/usr/local/lib\n   export LIBRIME_INCLUDE_DIR=/usr/local/include\n   # 用于运行\n   export DYLD_LIBRARY_PATH=/usr/local/lib  # 最好放在~/.zshrc中，记得修改~/.zshrc 后，source ~/.zshrc\n   ```\n\n   lib 库文件后面调用的时候应该还需要到 MacOS 的“安全性与隐私”中进行授权，所以建议调用解压后 bin 文件下的可执行文件来提前触发授权。\n\n4. 编译，参考 [Ubuntu](#Ubuntu)\n5. 配置，`shared_data_dir` 应该设置为 `/Library/Input Methods/Squirrel.app/Contents/SharedSupport`\n\n## 个人词库同步\n\n\u003e [!WARNING] \u003e **不推荐**与系统中的已有 rime 输入法共用一个用户目录，避免数据库上锁无法使用。\n\u003e 使用前备份自己的数据, 避免因作者对 rime API 理解不到位可能造成的数据损失。\n\n可以通过 rime 的 sync 功能将系统中已安装的 rime 输入法的词库同步过来。\n\n如需同步词库, 可以在 rime-ls 自己的用户目录下的 `installation.yaml`\n添加`sync_dir: \"/\u003cexisting user data dir\u003e/sync\"` 配置项。\n\n通过 LSP 的 `workspace/executeCommand` 手動調用 `rime-ls.sync_user_data` 的命令进行同步 (since v0.1.2)\n\n## FAQ\n\n1. 为什么默认补全繁体中文？怎么修改候选个数？\n\n   答：这部分由 Rime 负责，参考 [Rime 的帮助文档](https://rime.im/docs/)。推荐对 Rime 有初步了解后再使用本软件。\n\n2. 某个编辑器不能用/不好用\n\n   答：由于 LSP 客户端在补全上的实现都很不一致（影响用户体验的差异主要有：怎样寻找单词边界、怎样过滤候选项），\n   不能保证每个编辑器默认就有很好的使用体验，可能需要配置或者插件支持。\n\n## Contributions\n\n欢迎为本项目贡献力量，你可以：\n\n- 发现并修改代码里的 bug\n- 为某个编辑器实现相关插件\n- 提供某个编辑器的更好用的用户配置\n- 提供专为 rime-ls 设计的 rime 输入方案\n- 帮助实现更好的 CI/CD\n\n## TODO\n\n- [x] 實現更多 librime 的功能\n  - [x] 按数字键选择候选项\n  - [x] 与 rime API 同步翻页\n  - [x] 与 rime API 同步提交\n  - [x] 输入标点符号\n  - [x] 输入方案选择\n- [x] 实现更友好的触发条件\n  - [x] ~~计划实现光标前面有汉字就开启, 但发现不同编辑器行为不一致, 搁置~~ 多加了一次正则匹配解决了, 不知道性能如何\n- [ ] 读 LSP 文档, 继续提升补全的使用体验\n- [x] 參數可配置 (用户目录, 触发条件, 候选数量)\n- [x] ~~實現一個更好的 librime 的 rust wrapper 庫~~ 目前功能比较固定，没必要了\n- [ ] 測試其他 LSP clients\n- [x] 测试不同操作系统和 librime 版本\n- [ ] 测试与不同 rime 配置的兼容性\n- [x] 配置 GitHub CI，编译各个平台的 Release\n- [ ] 各种编辑器插件 (help wanted)\n\n## Known Issues\n\n- [ ] #31 补全时吞符号，暂时可以通过在输入方案设置所有符号直接上屏进行规避\n- [ ] #20 用数字选词以后还需要一次确认，这是 LSP 协议本身带来的限制，需要编辑器插件配合提升体验\n- [ ] 调用 sync_user_data 后偶尔内存占用大，这是 rime 已知问题 https://github.com/rime/librime/issues/440\n\n## Credits\n\n受到以下项目启发\n\n- [ds-pinyin-lsp](https://github.com/iamcco/ds-pinyin-lsp)\n- [cmp-rime](https://github.com/Ninlives/cmp-rime)\n- [librime-sys](https://github.com/lotem/librime-sys)\n- [tower-lsp-boilerplate](https://github.com/IWANABETHATGUY/tower-lsp-boilerplate)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwlh320%2Frime-ls","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwlh320%2Frime-ls","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwlh320%2Frime-ls/lists"}