wlh320 / rime-ls

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

MacOS Support #5

Closed rainzm closed 1 year ago

rainzm commented 1 year ago

Hi,谢谢你的插件,非常好的想法。

我使用的是MacOS with M1,把项目拉到本地编译会有以下报错:

error: failed to run custom build command for `librime-sys v0.1.0 (https://github.com/lotem/librime-sys#094db695)`

Caused by:
  process didn't exit successfully: `/Users/rain/code/rust/rime-ls/target/release/build/librime-sys-ce57fb0828704e4a/build-script-build` (exit status: 101)
  --- stdout
  cargo:rustc-link-lib=rime

  --- stderr
  wrapper.h:1:10: fatal error: 'rime_api.h' file not found
  wrapper.h:1:10: fatal error: 'rime_api.h' file not found, err: true
  thread 'main' panicked at 'Unable to generate bindings: ()', /Users/rain/.cargo/git/checkouts/librime-sys-fbe83737eec7c58b/094db69/build.rs:15:10
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

我去看了librime-sys这个项目,这个项目没有文档,而我也不是一个ruster,你知道是怎么回事嘛?

wlh320 commented 1 year ago

这个项目理论上是能在 macOS 上面跑的,但因为涉及到依赖的 librime 的 C 库,我没有 macOS 设备,不太清楚 Rime 在 macOS 上一般是怎么安装和使用的,只能说一下我的理解,不一定对

这个编译错误我猜是与我文档里的 Windows 的那个情况类似,没有找到 librime 的头文件。解决方法可以尝试下我文档里写的,安装 librime 后找到 librime 的头文件的位置,clone 一份 librime-sys 到本地,修改代码,然后修改 rime-ls 的 Cargo.toml 的依赖项,指向本地的 librime-sys (大概是这样:librime-sys = { version = "0.1.0", path = "../librime-sys" }),再尝试编译。

librime-sys 我感觉是 Rime 作者的一个实验性的尝试,维护不太积极。 我后续有可能 fork 一份 librime-sys 加上一些环境变量让编译更容易一些。

我也是 Rust 的新手,不太清楚 在 macOS 上与 C 语言的库进行交互一般是什么样的过程,我预感在最后链接的过程中在找动态库的时候可能还会出现一些问题。

不知道 rime-ls 现在的用户里有没有 macOS 用户,请看到这的高手们帮忙解决一下

rainzm commented 1 year ago

经你的提醒,那我应该是没有安装librime依赖导致的,我去 https://github.com/rime/librime/releases/tag/1.8.5 下载了最新的macos相关的文件,解压之后,把lib文件夹和include文件夹,放到/usr/local目录下,现在编译通过了: image

设置好lsp之后,发现 lsplog 里有以下报错:

[ERROR][2023-03-16 00:03:03] .../vim/lsp/rpc.lua:733    "rpc"   "/Users/rain/code/rust/rime-ls/target/release/rime_ls"  "stderr"    'E20230316 00:03:03.691471 671998 deployment_tasks.cc:65] Error reading file information: boost::filesystem::canonical: No such file or directory [generic:2]: "/usr/share/rime-data"\n'

所以这里的 rime 公共目录是什么意思呢?是用户可以随便创建的嘛?还是不同的系统是不一样的?

rainzm commented 1 year ago

我是rime的新人,看来是我对此输入法了解的不够到位,我尝试创建了一个~/.local/share/rime-data,并将默认 MacOS Rime的目录~/Library/Rime 下的内容都copy了过去,现在应该是能正常工作了: image 不知道我这种用法是否合理?

wlh320 commented 1 year ago

我理解就是全局配置和用户配置的区别。如果你的电脑装过鼠须管,那么它跟 rime-ls 是并列的关系,两个前端可以共用同一个后端也就是 librime。安装鼠须管时应该是前端和后端会一并安装,有一个公共的目录存放不同前端可以共享的配置,此外每个前端有一个自己的配置目录进行自定义配置。这个目录在 macOS 下的具体位置我就不太清楚了,但应该是不需要复制一份。

rainzm commented 1 year ago

那 rime 公共目录的东西,rime-ls会去修改嘛?rime公共目录的这个概念,有没有文档可以查阅的?

wlh320 commented 1 year ago

rime-ls 本质还是调用 librime 提供的一些 API ,据我所知应该不会去修改里面的内容。

文档可以参考 rime 的 wiki 里面的 Shared Data 部分 其他部分的文档也可以看官方的 wiki。

相比其他输入法,Rime 带来很多可定制性,同时也让配置和使用变得极其复杂,对刚接触的人来说是不太友好的。

rime-ls 更多还是面向系统里已经有一个 Rime 输入法,想要复用已有配置的情况。需要一些折腾 Rime 的知识才能用的比较顺畅。如果是第一次接触 Rime 而且输入的需求比较简单,觉得折腾 Rime 这一套东西比较浪费时间,可以尝试下 ds-pinyin-lsp 这个项目,原理类似但会更加开箱即用一些。

rainzm commented 1 year ago

ds-pinyin-lsp这个项目,我在尝试你的这个项目之前就尝试了,它背后没有类似rime的这种输入引擎,所以只能应付简单地输入,真正使用还是有些问题的,容易出错。

我稍微折腾了以下,MacOS下,rime的公共目录应该是 /Library/Input Methods/Squirrel.app/Contents/SharedSupport,这个目录下保存着公用的配置,不同的前端可以在此基础上做自己的配置,通过*.custom.yaml做 patch。配置好之后,我感觉使用还是蛮方便的。我目前配置的是在markdown文件下启用此ls,通过<leader><space> toggle,然后&补全切换 schema。感觉已经蛮完备了。

非常棒的插件!也谢谢你耐心的指导,感觉这个插件会是一个未来。

wlh320 commented 1 year ago

谢谢!您过奖了

rainzm commented 1 year ago

我还有两个问题想请教一下:

  1. 怎么翻页呀?我看README中支持翻页,但是我没看到相关的配置。
  2. 关于同步功能,我设置了 sync_dir 为 /Users/rain/Library/Rime/sync 也就是MacOS上的鼠须管输入法的用户目录,我触发了同步操作之后,看上去是吧rime-ls用户目录的配置同步到了上面的那个目录中,这样是OK的吗?怎么看词库有没有同步过来呢?
wlh320 commented 1 year ago
  1. 这个也是遵从输入方案的配置。默认应该是逗号句号和减号等号翻页,想要其他按键在配置的 "key_binder/bindings" 这一项也可以修改,但目前我只把默认的翻页按键作为触发键,其他按键可能不会触发自动的补全,要手动请求补全。
  2. installation.html 里应该会有一个 installation_id,sync 目录下会创建一个同名的目录,里面会有一个 *.userdb.txt 的文件,内容就是用户的词频等信息。同步时应该是会把 sync 目录下其他 id 的 userdb.txt 也一起合起来。
rainzm commented 1 year ago

了解了 感谢!