wlh320 / rime-ls

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

英文标点符号后空格才能触发补全 #10

Closed harisonkhlil closed 6 months ago

harisonkhlil commented 1 year ago

录了一个 Gif 图:

CleanShot 2023-07-09 at 16 49 59

对于 markdown 来说这不是致命的嘛,触发斜体,粗体等都非常麻烦。

harisonkhlil commented 1 year ago

还发现一个问题:

CleanShot 2023-07-09 at 17 37 35

这里可以在 [ 后面补全,但是补全把前面的 [ 补没了。

wlh320 commented 1 year ago

我在我这试了一下,第一个问题在 vim + coc 的环境下可以稳定复现,在 nvim + 内置 lsp 的环境下没有这个问题。我猜测是由于不同的编辑器、lsp client、补全插件在各自实现补全功能的过程中触发自动补全的条件不同导致的。这个我在尝试测试vim之外的不同编辑器的过程中也发现过。可以先尝试根据你用的补全插件绑定一个快捷键手动触发补全临时解决下,我如果有时间会再详细检查下这个问题。

第二个问题在我这没有复现,这个应该是之前版本的问题,理论上已经解决了,不过不排除我测试不完善导致问题没有完全解决。你用的是最新的版本吗?

harisonkhlil commented 1 year ago

第二个其实原来会吧 [] 补全替换为 【你好],后来不知道为啥会吧前一个 [ 补全掉变成 你好]

wlh320 commented 1 year ago

由于 vim 和 rime 都是高度可配置的,说不定哪些配置碰到一起就会出问题,排查起来有一定难度。刚才我试了一下 lunar_pinyin 的配置确实会出现第二个问题,看来是 rime 配置对于特殊符号的处理不同导致的。

我初步判断是有候选项的符号会有问题,直接上屏的符号则没有问题。如果没有特殊输入需求可以参考一些 rime 输入方案的配置把每个标点符号都设置成直接上屏。我后面有时间会考虑下能否在 rime-ls 的代码层面解决一下。

wlh320 commented 6 months ago

一个新思路,还可以给 Rime 做一下配置,做一个适合 rime-ls 的输入方案。因为用户配置分离的,不会影响你的其他输入法。 以 markdown 为例,可以把不常输入但 markdown 需要的符号改成上屏半角英文符号,用额外的方式输入中文标点符号。

wlh320 commented 6 months ago

我又确认了一下,确实修改 rime 配置的 ascii_punct 强制输入西文标点可以避免因为有符号导致的不能补全还有吞字符的问题。上面说的自己写一个输入方案应该是可行的。要么标点符号直接上屏,要么强制西文标点,中文标点换一种输入方式。

Kaiser-Yang commented 3 months ago

你说的第二个问题,我也遇到了,关于中文输入我找到了比较好的解决方案:

  1. 将输入方案中标点设置为西文输入。
  2. 使用以下的代码通过标点+空格的方式在开启rime-ls的情况下输入中文标点,如果要输入英文标点,则是直接输入标点然后等一会儿(取决于updatetime的大小)
local punc_en = {',', '.', ':', ';', '?'}
local punc_zh = {',', '。', ':', ';', '?'}
vim.api.nvim_create_autocmd('FileType', {
    pattern = rime_ls_filetypes,
    callback = function ()
        for _, mode in ipairs({'i', 's'}) do
            for i = 1, #punc_en do
                local src = punc_en[i] .. '<space>'
                local dst = 'rime_enabled ? "' .. punc_zh[i] .. '" : "' .. punc_en[i] .. ' "'
                vim.api.nvim_buf_set_keymap(0, mode, src, dst, {
                    noremap = true,
                    silent = false,
                    expr = true,
                })
            end
        end
    end
})

如果需要新的标点支持,只需要在punc_en中添加英文标点,在punc_zh中添加中文标点即可。