From bd9d694df6ed45f6b482ce83fe6f5b3a013f643f Mon Sep 17 00:00:00 2001 From: zilcH40 Date: Mon, 27 Feb 2023 16:46:31 +0800 Subject: [PATCH] bump version to v0.2.0 - feat: do not show number for complete completion - update README --- Cargo.toml | 2 +- README.md | 44 ++++++++++++++++++++++---------------------- doc/nvim.md | 7 +++++-- doc/vim.md | 3 ++- doc/vscode.md | 1 + src/lsp.rs | 21 +++++++++++---------- 6 files changed, 42 insertions(+), 36 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6adc447..9940341 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rime_ls" -version = "0.1.3" +version = "0.2.0" edition = "2021" authors = ["ZilcH40 "] rust-version = "1.63" diff --git a/README.md b/README.md index 9365593..361a283 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 为 rime 输入法核心库 librime (的部分功能) 实现 LSP 协议, 从而通过编辑器的代码补全功能输入汉字. -项目还处在**早期阶段**, 各方面都非常不成熟. +项目还处在**早期阶段**, 各方面相对不成熟. 目标是提供 rime + LSP 的通用解决方案, 在不同编辑器内实现与其他 rime 前端类似的输入体验. @@ -20,12 +20,26 @@ https://user-images.githubusercontent.com/14821247/213079440-f0ab2ddd-5e44-4e41-bd85-81da2bd2957f.mp4 +## Usage + +> **Warning** +> 第一次启动时 rime 需要做大量工作, 可能会很慢 + +1. 下载 Release 或自己从源码编译 +1. 将编译好的二进制文件放在喜欢的目录下 +2. 配置 LSP 客戶端, 例如: + - [neovim + nvim-cmp](doc/nvim.md) + - [vim + coc.nvim](doc/vim.md) + - [vscode](doc/vscode.md) +3. 默认輸入拼音, 就可以看到补全提示 +4. 可以通过改变配置控制补全行为 + ## Build ### Ubuntu 1. 配置 Rust 环境, 安装额外依赖 `clang` 和 `librime-dev` -2. 编译 +2. 编译 - `librime >= 1.6` => `cargo build --release` - `librime < 1.6` => `cargo build --release --features=no_log_dir` @@ -56,24 +70,11 @@ index a53dd2c..e51a63e 100644 3. 修改本项目的 `Cargo.toml` 指向本地的依赖 4. 用 `i686` 的 target 编译 (因为 librime 只给了 32 位的 dll) -## Usage - -> **Warning** -> 第一次启动时 rime 需要做大量工作, 可能会很慢 - -1. 将编译好的二进制文件放在喜欢的目录下 -2. 配置 LSP 客戶端, 例如: - - [neovim + nvim-cmp](doc/nvim.md) - - [vim + coc.nvim](doc/vim.md) - - [vscode](doc/vscode.md) -3. 默认輸入拼音, 就可以看到补全提示 -4. 可以通过改变配置控制补全行为 - ### 个人词库同步 > **Warning** > **不推荐**与系统中的已有 rime 输入法共用一个用户目录, 免得出什么问题 -> +> > 使用前备份自己的数据, 避免因作者对 rime API 理解不到位可能造成的数据损失 目前 rime-ls 还不能拿到补全的反馈, 向 rime 提交选择的汉字, 所以自身的用户词库总是空的. @@ -87,12 +88,12 @@ index a53dd2c..e51a63e 100644 ## TODO -- [ ] 實現更多 librime 的功能 +- [x] 實現更多 librime 的功能 - [x] 按数字键选择候选项 - [x] 与 rime API 同步翻页 - - [ ] 与 rime API 同步提交 + - [x] 与 rime API 同步提交 - [x] 输入标点符号 - - [ ] 输入方案选择 + - [x] 输入方案选择 - [x] 实现更友好的触发条件 - [x] ~~计划实现光标前面有汉字就开启, 但发现不同编辑器行为不一致, 搁置~~ 多加了一次正则匹配解决了, 不知道性能如何 - [ ] 读 LSP 文档, 继续提升补全的使用体验 @@ -105,9 +106,8 @@ index a53dd2c..e51a63e 100644 ## Known Issues - [x] ~~補全的觸發條件很奇怪,現在我是手動觸發補全寫的這些字~~ 解决, 要设置 is_incomplete 来连续补全 -- [x] ~~還沒完成開始這個項目的最初目的, 即直接復用 rime 配置~~ 直接设置不同的用户目录好像可以, 比如我现在可以写简体了, 还需要进一步测试 -- [ ] 沒有完全實現 rime 功能, 只是读取了候选项, 沒有把选到的字真正提交 -(因为还没获取到补全的反馈, 计划自己处理用户输入再与 rime 交互, 感觉有点麻烦, 可能搁置) +- [x] ~~還沒完成開始這個項目的最初目的, 即直接復用 rime 配置~~ 维护一份独立的用户目录,与外部输入法互相同步词频 +- [x] ~~沒有完全實現 rime 功能, 只是读取了候选项, 沒有把选到的字真正提交~~ v0.2.0 基本解决 - [ ] 第一次嘗試從 Rust 調用 C 接口,寫的非常不專業且 unsafe - [ ] 同时开启多个共用同一个用户目录的程序时,会因为用户数据库的锁导致不工作 diff --git a/doc/nvim.md b/doc/nvim.md index 8c77aa0..a66c859 100644 --- a/doc/nvim.md +++ b/doc/nvim.md @@ -14,8 +14,9 @@ local start_rime = function() shared_data_dir = "/usr/share/rime-data", -- rime 公共目录 user_data_dir = "~/.local/share/rime-ls", -- 指定用户目录, 最好新建一个 log_dir = "~/.local/share/rime-ls", -- 日志目录 - max_candidates = 10, -- 与 rime 的候选数量配置最好保持一致 + max_candidates = 10, -- [v0.2.0 后不再有用] 与 rime 的候选数量配置最好保持一致 trigger_characters = {}, -- 为空表示全局开启 + schema_trigger_character = "&" -- [since v0.2.0] 当输入此字符串时请求补全会触发 “方案选单” }, }); vim.lsp.buf_attach_client(0, client_id) @@ -102,8 +103,9 @@ function M.setup_rime() shared_data_dir = "/usr/share/rime-data", user_data_dir = "~/.local/share/rime-ls", log_dir = "~/.local/share/rime-ls", - max_candidates = 9, + max_candidates = 10, -- [v0.2.0 后不再有用] 与 rime 的候选数量配置最好保持一致 trigger_characters = {}, + schema_trigger_character = "&" -- [since v0.2.0] 当输入此字符串时请求补全会触发 “方案选单” }, }); if client_id then @@ -223,6 +225,7 @@ A language server for librime log_dir = "~/.local/share/rime-ls", max_candidates = 9, trigger_characters = {}, + schema_trigger_character = "&" -- [since v0.2.0] 当输入此字符串时请求补全会触发 “方案选单” }, on_attach = rime_on_attach, capabilities = capabilities, diff --git a/doc/vim.md b/doc/vim.md index 453f304..436ec1a 100644 --- a/doc/vim.md +++ b/doc/vim.md @@ -19,8 +19,9 @@ "shared_data_dir": "/usr/share/rime-data", // rime 公共目录 "user_data_dir": "~/.local/share/rime-ls", // 指定用户目录,最好新建一个 "log_dir": "~/.local/share/rime-ls", // 日志目录 - "max_candidates": 9, // 与 rime 的候选数量配置最好保持一致 + "max_candidates": 9, // [v0.2.0 后不再有用] 与 rime 的候选数量配置最好保持一致 "trigger_characters": [], // 为空表示全局开启 + "schema_trigger_character": "&" // [since v0.2.0] 当输入此字符串时请求补全会触发 “方案选单” } }, diff --git a/doc/vscode.md b/doc/vscode.md index 39c91fd..9ba2a74 100644 --- a/doc/vscode.md +++ b/doc/vscode.md @@ -30,6 +30,7 @@ export function activate(context: vscode.ExtensionContext) { log_dir: "C:\\Users\\wlh23\\AppData\\Roaming\\Rime", // 日志目录 max_candidates: 10, trigger_characters: [], + schema_trigger_character: "&", } }; console.log(clientOptions); diff --git a/src/lsp.rs b/src/lsp.rs index 9dabd1c..a592ecf 100644 --- a/src/lsp.rs +++ b/src/lsp.rs @@ -201,16 +201,18 @@ impl Backend { utils::build_order_to_sort_text(max_candidates) }; let candidate_to_completion_item = move |c: Candidate| -> CompletionItem { + let text = submitted.clone() + &c.text; + let label = match c.order { + 0 => text.to_string(), + _ => format!("{}. {}", c.order, &text), + }; CompletionItem { - label: format!("{}. {}{}", c.order, &submitted, &c.text), + label, kind: Some(CompletionItemKind::TEXT), detail: utils::option_string(c.comment), filter_text: Some(filter_text.clone()), sort_text: Some(order_to_sort_text(c.order)), - text_edit: Some(CompletionTextEdit::Edit(TextEdit::new( - range, - submitted.clone() + &c.text, - ))), + text_edit: Some(CompletionTextEdit::Edit(TextEdit::new(range, text))), ..Default::default() } }; @@ -352,13 +354,12 @@ impl LanguageServer for Backend { let position = params.text_document_position.position; // TODO: Is it necessary to spawn another thread? let completions = self.get_completions(uri, position).await; - match completions { - None => Ok(completions.map(CompletionResponse::Array)), - Some(items) => Ok(Some(CompletionResponse::List(CompletionList { + Ok(completions.map(|items| { + CompletionResponse::List(CompletionList { is_incomplete: true, items, - }))), - } + }) + })) } async fn execute_command(&self, params: ExecuteCommandParams) -> Result> {