Skip to content

Commit

Permalink
bump version to v0.2.0
Browse files Browse the repository at this point in the history
- feat: do not show number for complete completion
- update README
  • Loading branch information
wlh320 committed Feb 27, 2023
1 parent b9b9b4a commit bd9d694
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 36 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rime_ls"
version = "0.1.3"
version = "0.2.0"
edition = "2021"
authors = ["ZilcH40 <[email protected]>"]
rust-version = "1.63"
Expand Down
44 changes: 22 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

为 rime 输入法核心库 librime (的部分功能) 实现 LSP 协议, 从而通过编辑器的代码补全功能输入汉字.

项目还处在**早期阶段**, 各方面都非常不成熟.
项目还处在**早期阶段**, 各方面相对不成熟.

目标是提供 rime + LSP 的通用解决方案, 在不同编辑器内实现与其他 rime 前端类似的输入体验.

Expand All @@ -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`

Expand Down Expand Up @@ -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 提交选择的汉字, 所以自身的用户词库总是空的.
Expand All @@ -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 文档, 继续提升补全的使用体验
Expand All @@ -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
- [ ] 同时开启多个共用同一个用户目录的程序时,会因为用户数据库的锁导致不工作

Expand Down
7 changes: 5 additions & 2 deletions doc/nvim.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion doc/vim.md
Original file line number Diff line number Diff line change
Expand Up @@ -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] 当输入此字符串时请求补全会触发 “方案选单”
}
},

Expand Down
1 change: 1 addition & 0 deletions doc/vscode.md
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
21 changes: 11 additions & 10 deletions src/lsp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
};
Expand Down Expand Up @@ -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<Option<Value>> {
Expand Down

0 comments on commit bd9d694

Please sign in to comment.