wlh320 / rime-ls

A language server for Rime input method engine 通过 LSP 代码补全使用 Rime 输入法
BSD 3-Clause "New" or "Revised" License
198 stars 13 forks source link

rust编译出错 v0.1.0 #1

Closed yaowjit closed 1 year ago

yaowjit commented 1 year ago

发行版: Debian testing clang: 14.0.6 cargo: 1.65.0 librime-dev: 1.7.3 rime-ls: 0.1.0 编译命令: cargo build --release

编译报错 输出:

Updating crates.io index
    Updating git repository `https://github.com/lotem/librime-sys`
   Compiling proc-macro2 v1.0.50
   Compiling quote v1.0.23
   Compiling unicode-ident v1.0.6
   Compiling syn v1.0.107
   Compiling libc v0.2.139
   Compiling version_check v0.9.4
   Compiling autocfg v1.1.0
   Compiling memchr v2.5.0
   Compiling futures-core v0.3.25
   Compiling glob v0.3.1
   Compiling cfg-if v1.0.0
   Compiling pin-project-lite v0.2.9
   Compiling serde_derive v1.0.152
   Compiling log v0.4.17
   Compiling futures-task v0.3.25
   Compiling tinyvec_macros v0.1.0
   Compiling serde v1.0.152
   Compiling futures-channel v0.3.25
   Compiling unicode-width v0.1.10
   Compiling futures-sink v0.3.25
   Compiling regex-syntax v0.6.28
   Compiling textwrap v0.11.0
   Compiling tinyvec v1.6.0
   Compiling libloading v0.7.4
   Compiling nom v5.1.2
   Compiling proc-macro-error-attr v1.0.4
   Compiling termcolor v1.2.0
   Compiling slab v0.4.7
   Compiling futures-util v0.3.25
   Compiling clang-sys v1.4.0
   Compiling bitflags v1.3.2
   Compiling bindgen v0.57.0
   Compiling strsim v0.8.0
   Compiling once_cell v1.17.0
   Compiling vec_map v0.8.2
   Compiling humantime v2.1.0
   Compiling ansi_term v0.12.1
   Compiling aho-corasick v0.7.20
   Compiling tokio v1.24.2
   Compiling lock_api v0.4.9
   Compiling proc-macro-error v1.0.4
   Compiling rustc-hash v1.1.0
   Compiling lazycell v1.3.0
   Compiling smallvec v1.10.0
   Compiling atty v0.2.14
   Compiling unicode-normalization v0.1.22
   Compiling which v3.1.1
   Compiling clap v2.34.0
   Compiling futures-io v0.3.25
   Compiling parking_lot_core v0.9.6
   Compiling unicode-bidi v0.3.9
   Compiling lazy_static v1.4.0
   Compiling shlex v0.1.1
   Compiling peeking_take_while v0.1.2
   Compiling pin-utils v0.1.0
   Compiling serde_json v1.0.91
   Compiling percent-encoding v2.2.0
   Compiling form_urlencoded v1.1.0
   Compiling num_cpus v1.15.0
   Compiling tracing-core v0.1.30
   Compiling scopeguard v1.1.0
   Compiling ryu v1.0.12
   Compiling bytes v1.3.0
   Compiling idna v0.3.0
   Compiling async-trait v0.1.61
   Compiling itoa v1.0.5
   Compiling httparse v1.8.0
   Compiling tracing v0.1.37
   Compiling tower-layer v0.3.2
   Compiling tower-service v0.3.2
   Compiling hashbrown v0.12.3
   Compiling dirs-sys v0.3.7
   Compiling regex v1.7.1
   Compiling cexpr v0.4.0
   Compiling str_indices v0.4.1
   Compiling dashmap v5.4.0
   Compiling directories v4.0.1
   Compiling ropey v1.5.1
   Compiling env_logger v0.8.4
   Compiling futures-macro v0.3.25
   Compiling pin-project-internal v1.0.12
   Compiling tokio-macros v1.8.2
   Compiling serde_repr v0.1.10
   Compiling auto_impl v0.5.0
   Compiling tower-lsp-macros v0.6.0
   Compiling pin-project v1.0.12
   Compiling librime-sys v0.1.0 (https://github.com/lotem/librime-sys#094db695)
   Compiling tokio-util v0.7.4
   Compiling futures v0.3.25
   Compiling tower v0.4.13
   Compiling url v2.3.1
   Compiling lsp-types v0.93.2
   Compiling tower-lsp v0.17.0
   Compiling rime_ls v0.1.0 (/home/yaowj/.local/share/nvim/lazy/rime-ls)
error[E0658]: `let...else` statements are unstable
  --> src/lsp.rs:68:9
   |
68 | /         let Ok(settings) = serde_json::from_value::<Settings>(params) else {
69 | |             return ;
70 | |         };
   | |__________^
   |
   = note: see issue #87335 <https://github.com/rust-lang/rust/issues/87335> for more information

For more information about this error, try `rustc --explain E0658`.
error: could not compile `rime_ls` due to previous error
warning: build failed, waiting for other jobs to finish...
wlh320 commented 1 year ago

是我用了一个 1.66 版本的语法,忘记在 Cargo.toml 里限制最低版本了。现在发现好像没必要这么写,下个 commit 我会把这里修改一下,可以先把那一句修改成:

        let settings = match serde_json::from_value::<Settings>(params) {
            Ok(s) => s,
            Err(e) => {
                self.client.show_message(MessageType::ERROR, e).await;
                return ;
            }
        };

应该就可以通过编译了

wlh320 commented 1 year ago

更新了一个版本,应该解决了,还修了其他的问题,方便的话可以尝试下

yaowjit commented 1 year ago

我这里基本可以用了, 不错不错。不过我这里还有几个小问题

  1. 插件里是否有接口让我可以知道当前rime_ls的状态, 我现在是定义了一个全局变量vim.g.rime_ls_state来记录的,但是可能临时触发的时候无法获取rime_ls的状态
  2. 我在用cmp的时候定义了在已经选中一个item的时候按上屏,但还是不像常规输入法一样直接上屏第一个,还有按0-9只能过滤,我对cmp的接口不是很了解,没法按0-9之后自动上屏(当然这个问题不是那么急)
  3. 我发现每次重启nvim, rime的item在cmp里的排序权重会重置,这个应该是cmp的问题?

rime-ls配置, 其实这里我用nvim-lspconfig封装了一下(项目成熟了可以接入进去),但这里先放上你的写法

local client_id = vim.lsp.start_client({
    name = "rime-ls",
    cmd = { vim.fn.stdpath("data") .. "/lazy/rime-ls/target/release/rime_ls" },
    init_options = {
        enabled = false, -- 初始关闭, 手动开启
        shared_data_dir = "/usr/share/rime-data", -- rime 公共目录
        user_data_dir = vim.fn.expand("~/.local/share/rime-ls"), -- 指定用户目录, 最好新建一个
        log_dir = vim.fn.expand("~/.local/share/rime-ls/log"), -- 日志目录
        max_candidates = 10,
        trigger_characters = {},
    },
})

vim.g.rime_ls_state = "off"

vim.api.nvim_create_autocmd("BufReadPost", {
    pattern = "*",
    callback = function()
        vim.lsp.buf_attach_client(0, client_id)
        vim.keymap.set("i", "<C-o>", function()
            vim.lsp.buf.execute_command({ command = "toggle-rime" })

            if vim.g.rime_ls_state == "on" then
                vim.g.rime_ls_state = "off"
            else
                vim.g.rime_ls_state = "on"
            end
        end)
    end,
})

cmp的配置

    mapping = cmp.mapping.preset.insert({
       ......
        -- rime-ls 空格上屏
        ["<Space>"] = cmp.mapping(function(fallback)
            if cmp.visible() and vim.g.rime_ls_state == "on" then
                cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace })
                cmp.close()
            else
                fallback()
            end
        end),
        ......
    }),

Peek 2023-01-20 18-17

  1. rime-ls的结果都是繁体的问题(昨天有人遇到了) 对于非rime用户,应该是没有配置文件的,我觉得有必要在rime-ls的文档里说明一下这个问题:)

rime-ls的用户目录,比如~/.local/share/rime-ls,新建一个user.yaml文件,在里面添加以下内容

var:
  option:
    simplification: true
wlh320 commented 1 year ago

感谢反馈!

  1. 现在的实现是 server 在收到 toggle-rime 的命令后会发送一个 work done progress notification,从通知的内容里可以解析的到现在的状态。有一个叫 fidget.nvim 的插件可以接收到这个消息并显示出来,具体这个插件是什么原理我没仔细研究过。主动查询的话我还要看看 LSP 规范里有没有这样的接口可以利用。
  2. 我的 cmp 配置是照抄 kickstart.nvim 的,按 Tab 键可以在候选项之间来回循环,vim 默认的补全行为对于 rime-ls 来说可能不那么好用。

    我也是在这两天才发现:本来是希望实现了 LSP 就能够通用,但事实上发现不同编辑器对自动补全的实现方案是五花八门的,对用户体验影响非常大。通用的目标是很难实现了,只能保证主流编辑器的主流补全插件的某些配置是好用的🤣。

    数字这个应该没办法,毕竟对代码补全来说并没有这样的需求,用代码补全做输入法算是歪门邪道,能实现用数字过滤已经是意外之喜了。

  3. 这个我不太清楚,我是按我文档里写的把 cmp 的全局排序顺序配置了一下。
  4. 我是默认会用这个软件的应该是都有一定的 rime 使用经验,就没有写太详细。感谢补充。
yaowjit commented 1 year ago

那rime-ls可以主要做和rime交互的功能,然后多留出接口,比如选字,翻页等,具体的补全行为和适配交给单独的插件来做

wlh320 commented 1 year ago

这个项目主要还是考虑以尽可能不需要额外插件为目标开发。如果考虑单独做插件其实更适合的方式是用熟悉的语言给 librime 的接口做一个 wrapper,然后在插件里调用功能。类似的插件也有一些,这样做 LSP 就不太必要了。

wlh320 commented 1 year ago

关于状态检测,我现在的解决方案可以参考 doc/nvim.md 的更新

后面讨论的内容有些偏题,我就先把这个 issue 关掉了,有其它问题可以再开新的。