欢迎尝试 emacs-rime,计划中功能已全部完成。

依赖powershell的包管理工具很难用,既要求powershell高版本,下载也慢,powershell里面配置代理好像很麻烦。原来试过没成功。

前一段时间我简短的用过 windows,当时使用的 WSL,使用的 TUI 的 emacs。里面按装 librime 还是比较方便的。

我很多软件在Windows 上都是用scoop安装,但是scoop install gcc 安装的是有问题的,一直都没修复。建议还是用msys2,体验更好。

话说 RIME 的 API 有文档、demo或者什么示例代码吗?

想要自己试试用 C/C++ 编译成动态模组实现一个根据输入获取所有候选词的功能用到中文搜索上面(还是说有轮子了),但是看了半天 emacs-rime/lib.c 和 liberime 的源码都没有摸到头脑。

现在大概明白主要的过程就是先用rime->api->initialize(&traits)建立一个实例,然后再用rime->api->simulate_key_sequence(rime->session_id, str);向这个实例输入按键,最后通过 get_context(rime->session_id, &context)来得到候选列表

但是还是有很多的东西不是非常明白,比如这个session建立的时候会在终端里面输入很多东西,并且我在第二步发送键位的时候也在终端里面得到了一个

I20210731 23:24:57.815593 91882 engine.cc:203] Oops, got a futile translation.

的错误

最近因为要在 vterm 里用,切换到了 emacs-rime ,但是上屏似乎有问题,要按下别的一个什么键才能上屏。

你可以直接用 emacs-rime 里面那些动态模块的 api 啊,rime-lib-* 的这些函数。

我想输入一个词,然后得到这个词的所有候选应该怎么做呢?比如:

Input: wanyi
Output: "万一 玩意 万亿 玩艺"

我这每次只能上屏一个字。。

看liberime,里面有一个现成的函数,就是做这个事情的

liberime-search

循环把这些输入送到 librime, 然后取 context 里面的 candidate 就行。

请教一个关于 Fcitx5 rime 的问题,如果没法点状态栏图标上的部署命令,有没有办法设定一个快捷键来启动 rime 的部署? 我看 Fcitx5 界面上设定的快捷都是给它自身的。

命令行的方法

多谢 :+1:, 我用的 Arch ,确实有一个部署的命令 /usr/bin/rime_deployer

再请教一下,通过命令行进行同步个人词库的命令 rime_dict_manager --sync 是怎么用的?
我在rime用户配置目录(包含installation.yaml的目录)下执行,提示很多错误,加了 sudo 也是一样:

sync dir: /home/aqua/Sync
user id: Area51-Arch
E20210816 22:01:24.681025  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:24.681335  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/Area51-Arch-Emacs/luna_pinyin.userdb.txt
E20210816 22:01:24.741209  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:24.741457  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/MacBook-Emacs/luna_pinyin.userdb.txt
E20210816 22:01:24.800449  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:24.800683  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/Dell-Precision-Emacs/luna_pinyin.userdb.txt
E20210816 22:01:24.861429  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:24.861641  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/Area51/luna_pinyin.userdb.txt
E20210816 22:01:24.922355  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:24.922567  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/Area51-Arch/luna_pinyin.userdb.txt
E20210816 22:01:24.971128  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:24.971386  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/Area51-Emacs/luna_pinyin.userdb.txt
E20210816 22:01:25.028563  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:25.028815  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/Dell-Precision/luna_pinyin.userdb.txt
E20210816 22:01:25.089843  8302 level_db.cc:277] Error opening db 'luna_pinyin': IO error: lock /home/aqua/.local/share/fcitx5/rime/./luna_pinyin.userdb/LOCK: Resource temporarily unavailable
E20210816 22:01:25.090086  8302 user_dict_manager.cc:208] failed to merge snapshot file: /home/aqua/Sync/MacBook/luna_pinyin.userdb.txt
E20210816 22:01:25.090162  8302 level_db.cc:291] Error opening db 'luna_pinyin' read-only.
E20210816 22:01:25.090171  8302 user_dict_manager.cc:214] error backing up user dict 'luna_pinyin'.
E20210816 22:01:25.090180  8302 user_dict_manager.cc:230] failed synchronizing 1/1 user dicts.

问题找到了,原理是 rime 同步的时候需要临时关闭输入法才能同步。

所以只要写个脚本,先关闭 fcitx5 然后再 cd 到rime的用户目录执行rime_dict_manager -s 命令就可以同步了。完成后再打开 fcitx5.

@DogLooksGood 狗哥,请教下 emacs-rime 自动编译时编译结果的路径能否修改?

最近切到用 Nix 来安装 emacs 包,nix 的安装路径下好像是写保护的。
执行rime-compile-module 编译时会出现这个错误:

gcc lib.c -o librime-emacs.dylib -fPIC -O2 -Wall -I /Users/aqua0210/emacs-data/librime/dist/include/ -I /nix/store/kmy412lpynyc8ihqi9pfk2k791kdajs3-emacs-git-20211102.0/include/ -dynamiclib -L /Users/aqua0210/emacs-data/librime/dist/lib/ -Wl,-rpath /Users/aqua0210/emacs-data/librime/dist/lib/ -lrime
ld: can't open output file for writing 'librime-emacs.dylib.ld_kNTibv', errno=13 for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [lib] Error 1
rime-compile-module: Compile Rime dynamic module failed

rime 的安装目录如下:

Directory /nix/store/5hfzf19lc2jryij7al8qkp66ny6ldk3i-emacs-packages-deps/share/emacs/site-lisp/elpa/rime-20211014.548/

Mac 平台,Emacs 29. 通过package.el 安装是可以正常编译的。

说来好像有人提到过这个问题。现在 TARGET 是写死的,只有后缀可以控制。但是因为编译出来的库需要在 load-path 里面,如果不放到包的目录的话,就还要考虑 load-path 的处理。

不知道 telega, vterm 这块是怎么做的呢?

确实,改 TARGET 不是个好办法。回头我到 Nix 社区问一下

这两个还没用 Nix 安装过。

我用 nix 管理 emacs 的 package 的,telega 是直接用的。tdlib 是在 nixpkgs 打好的。而对应的 telega 有个 override,在 pkgs/applications/editors/emacs/elisp-packages/melpa-packages.nix 里。

          postPatch = ''
            substituteInPlace telega-customize.el \
              --replace 'defcustom telega-server-command "telega-server"' \
                        "defcustom telega-server-command \"$out/bin/telega-server\""

            substituteInPlace telega-sticker.el --replace '"dwebp"' '"${pkgs.libwebp}/bin/dwebp"'

            substituteInPlace telega-vvnote.el --replace '"ffmpeg' '"${pkgs.ffmpeg}/bin/ffmpeg'
          '';

emacs-rime 也像这样去推个 pr 加个 patch 就好。比如说 build 过程把 emacs-rime 的脚本也跑了。或者单独把 emacs-rime 那个要编译的库拉出来打个包当依赖用,这里 patch 一个 load-path 什么的