wlh320 / rime-ls

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

补全一次之后再次输入无法触发补全 #4

Open 416207298 opened 1 year ago

416207298 commented 1 year ago

补全了一次后,直接输入就不再能触发补全了,需要输入一个“空格”之后才可以。

wlh320 commented 1 year ago

如果说的是补全后删掉,从之前的起始位置重新输入相同的拼音,发现不能触发补全,这个确实是这个版本引入的已知 bug,是我在判断输入状态时有些问题,我会尝试在下个版本修复。

wlh320 commented 1 year ago

可以试一下 Release v0.2.1 或者编译最新的 master 。我这边没有复现不能再次触发的问题。如果还是存在问题,提供下环境信息,比如编辑器,补全插件,配置等

416207298 commented 1 year ago

rime-issue 可能是我没有表达清楚,我录了一段gif,是更新到 Release v0.2.1 之后的;

环境是:ubuntu20.04,运行在WSL2 编辑器:nvim0.9.0 补全插件:coc coc配置:

 "languageserver": {
        "clangd": {
            "command": "clangd",
            "rootPatterns": [
                "compile_flags.txt",
                "compile_commands.json",
                ".git"
            ],
            "filetypes": [
                "c",
                "cc",
                "cpp",
                "c++",
                "objc",
                "objcpp",
                "h",
                "hpp"
            ]
        },
        "rime-ls": {
            "command": "/usr/local/bin/rime_ls",
            "filetypes": [
                "text",
                "md"
            ],
            "initializationOptions": {
                "enabled": true,
                "shared_data_dir": "/usr/share/rime-data", // rime 公共目录
                "user_data_dir": "~/.local/share/rime-ls", // 指定用户目录,最好新建一个
                "log_dir": "~/.local/share/rime-ls", // 日志目录
                "max_candidates": 9, // [v0.2.0 后不再有用] 与 rime 的候选数量配置最好保持一致
                "trigger_characters": [], // 为空表示全局开启
                "schema_trigger_character": "&" // [since v0.2.0] 当输入此字符串时请求补全会触发 “方案选单”
            }
        }
    },
.......
wlh320 commented 1 year ago

收到,我再确认下。之前也许是我自己对 coc 做的其他配置导致没有复现这个问题。

wlh320 commented 1 year ago

我没有完全一样的环境,试了一下 WSL2 + kali 和直接安装的 Ubuntu 20.04,都是 neovim nightly ,用的是 coc.nvim 的推荐配置,还是没有复现出来。我推测原因是 coc.nvim 的某些配置项或者其他插件会对补全的触发条件有影响,如果方便的话你可以通过修改自己的 nvim 配置尝试下

416207298 commented 1 year ago

好的,那我用minimal配置调试一下。

416207298 commented 1 year ago

我在init.vim里只配置了Plugin coc和官方的coc配置,还是无法连续补全。

wlh320 commented 1 year ago

这个问题确实比较棘手,我找了一台机器装了个 WSL2,还是没能复现这个问题。

记录了一下我的复现过程: https://gist.github.com/wlh320/d33391bb9fef0e2ce97f58726e70323b

我猜测可能是依赖的这些插件、软件等在某些特殊版本的组合下会触发这个问题。

nibon7 commented 10 months ago

用emacs 29.1 company + eglot是一样的现象,另外发现在 3748398e72a629184d30dadb3618c9657213da64 之后,逗号(,)强制触发补全自动选择第一个,其他的候选字没有了,但是 3748398e72a629184d30dadb3618c9657213da64 之前的版本都可以显示。

(use-package eglot :hook (text-mode . eglot-ensure) :config (add-to-list 'eglot-server-programs `(text-mode . ("/path/to/rime-ls/target/debug/rime_ls"))))



[Screencast from 2023-12-30 22-36-21.webm](https://github.com/wlh320/rime-ls/assets/15247421/b43d1287-6f93-4638-aa79-a36406b74355)
wlh320 commented 10 months ago
  1. 第一个问题我猜测跟编辑器的 lsp client 的实现有关。我尝试过目前只能保证 vim/neovim/vscode 的连续输入体验比较正常,在 helix,qt creator 等编辑器里也会有类似的无法再次补全的行为。
  2. 第二个问题我猜测是所用的 rime 配置造成的,如果配置了标点符号直接上屏就会这样。用小狼毫输入法+雾凇拼音配置也是这个表现,输入逗号会把当前的第一项给一起上屏。原因是在 https://github.com/wlh320/rime-ls/commit/3748398e72a629184d30dadb3618c9657213da64 这个 commit 之前不会调用 librime 的提交功能,拿到候选列表后就清空 librime 这边的输入,这个 commit 之后为了记住用户操作 rime-ls 就是无脑把输入都交给 librime。

另外, emacs 用户可以尝试下 https://github.com/DogLooksGood/emacs-rime ,毕竟 rime-ls 用的是 LSP ,还是会有一定的局限性,比如第一个问题我猜就是因为 LSP 是为了代码补全设计,所以很多编辑器在实现时不会把紧跟中文的英文当作可以补全的对象。

wlh320 commented 5 months ago

最近的更新对 helix,zed,Qt creator 都做了适配。目前这几个编辑器通过 rime-ls 新加的额外配置项都可以正常连续输入了。

上面几个编辑器都是因为补全边界判断导致的,我不清楚 emacs 这边是什么情况,有可能是一样的原因。如果愿意可以再试试