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

feat: add rime-ls.get-first-candidate command #41

Closed weirongxu closed 1 week ago

weirongxu commented 1 month ago

添加一个命令直接补全候选词,避免在盲打的时候(补全菜单还没有弹出时)按空格会无效。

wlh320 commented 1 month ago

之后一段时间我事情比较多,得下个月才有时间处理。

我理解这个命令的用途是打字太快了补全菜单跟不上? 如果这个新加命令的作用是直接输入字符串返回第一个候选的话,其实没有什么状态信息需要维护,实现起来似乎还能更简单?直接像下面那样调用 Rime 接口就好 https://github.com/wlh320/rime-ls/blob/a92445f6133b2d470a7e03f0e7428b64a2310042/src/rime.rs#L305-L314

weirongxu commented 1 month ago

我理解这个命令的用途是打字太快了补全菜单跟不上?

是的。

如果这个新加命令的作用是直接输入字符串返回第一个候选的话,其实没有什么状态信息需要维护,实现起来似乎还能更简单?直接像下面那样调用 Rime 接口就好

但如果只是这样实现的话,就会有一些功能不太一致。因为没有判断 trigger_characterspaging_characters 这两个前置和后置符号。所以这里才加上了 input 的解析。

剩下的部分是添加一些 vim script 例子,实现如何调用这个命令的。

wlh320 commented 4 weeks ago

但如果只是这样实现的话,就会有一些功能不太一致。因为没有判断 trigger_characters,paging_characters 这两个前置和后置>符号。所以这里才加上了 input 的解析。

很多配置项是用来配合 LSP 的 completion 功能的。 trigger_characters 在实现的函数里加个 if 判断一下就行了?用全套的 input 解析感觉有些重。 paging_characters 这个是作为 LSP completion 功能弹出补全菜单的触发字符,如果自己调用命令的话估计也用不到? schema_trigger_character 这个需要菜单才能选择,只选第一个也没用处了。

通过 LSP 的自定义命令来做跟补全相同的功能,我总感觉怪怪的。而且那些插件支持差一些的编辑器似乎也用不上这个。 如果只是输入字符串简单返回第一个补全项,我认为更适合新开个项目做一个单独的程序和 vim 插件提供而不用通过 LSP。

不过自动弹出补全菜单的速度太慢确实是个重要的问题,不知道还有没有更好的解决方案了? 感谢对项目的贡献。我过段时间再研究一下。

weirongxu commented 2 weeks ago

paging_characters 这个是作为 LSP completion 功能弹出补全菜单的触发字符,如果自己调用命令的话估计也用不到?

通过 LSP 的自定义命令来做跟补全相同的功能,我总感觉怪怪的。而且那些插件支持差一些的编辑器似乎也用不上这个。 如果只是输入字符串简单返回第一个补全项,我认为更适合新开个项目做一个单独的程序和 vim 插件提供而不用通过 LSP。

实际使用上,这个命令还是会搭配补全菜单一起用的。还可以尽量和系统的输入法功作方式保持一致。 如果空格补全项和补全菜单的内容不一样会导致使用者的一些混淆。 虽然大多数情况下用不到补全菜单,但是当对于个别的词不熟悉时,就需要等待补全菜单来确认。

(比如我用五笔拼音,对于不熟悉的生僻字,就会用拼音输入,这时输入法会在菜单告诉我五笔的输入字母)

不过自动弹出补全菜单的速度太慢确实是个重要的问题,不知道还有没有更好的解决方案了?

之前考虑过用 codeAction 来实现,然后空格触发固定的 codeAction,但是 codeAction 触发的 applyEdit 不负责移动光标,所以可能会导致替换内容后光标跑到内容中间。所以这个方案就暂时放弃了。

还有一个可能的方案是让 LSP client 提供一些 API 去等待补全菜单的触发,但是 LSP client 似乎没有这方面的需求。

weirongxu commented 1 week ago

感觉这个 command 不是很必要了,我打算写一个插件主动发起 textDocument/completion 请求代替这个 command。

weirongxu commented 6 days ago

https://github.com/weirongxu/coc-rime-ls