Windows编程 如何改善 Emacs 系统中文输入法的拼音缩放问题

Windows上的emacs对于中文输入法来说 拼音的候选字符串是非常非常小的 不用我多说 这个体验非常非常糟糕 如图

这个想通过elisp修改是做不到的 我最近尝试了一下 librime 编辑体验来说是可以的 但是每次启动emacs都会加载字典 第一次往往有10-20秒 具体看字典的大小 有时候加载完一次以后 下次打开emacs会有缓存 可以做到1-2秒以内打开 但是这个缓存非常不稳定 有时候会丢缓存 第一次emacs打开以后下次打开还会重新加载整个字典 我的需求是让拼音的候选缩放变大 实际上用rime是 杀鸡用牛刀了 我会一点点Windows编程 所以我就打算自己解决 这是效果

aaaa

通过动态模块加载以后 先获得窗口句柄 然后窗口子类化获得窗口过程 也就是常见的 WndProc 然后拦截到对应的ime消息 巴拉巴拉 具体的看我的仓库代码 代码量很少

我打包好了dll进去 可以直接使用 如果没有编译的工具链的话

3 个赞

根据我的使用体验来说,liberime并不需要每次加载字典。如果方案没有变动,甚至不需要重复deploy。

我看了下你之前的回帖,卡顿可能是打开了 (liberime-auto-build t) 的问题?毕竟引用的目标在src文件夹中。实际上liberime有编译好的DLL,你可以放在某个地方然后直接设置 liberime-module-file 引用之。

1 个赞

以后尝试了 我目前对于我这个实现方案特别满意了 c++那边通过窗口消息来拿消息 elisp那边通过轮询来读取 我感觉非常不错

這個問題以前討論過,也有一個 Bug report ,如果有解决办法的话推荐直接贡献给 Emacs 上游

我看了一下这个bug请求 以我来说的话 我感觉这个东西很难修 我的Windows经验不足以支撑我完成这个bug的修复 我之所以能实现这个帖子里面的这个方案 是因为我是直接从窗口的消息循环里面拿的数据 然后通过命名管道的方式 发给emacs 让emacs用overlay去绘制出来 所以我做的只是简单的读数据 不过我会试试的吧

没想到在这里遇见librime贡献者大佬了。

昨天在UCRT64上编译librime 1.17.0的时候有两个test不通过,就翻了下对应的commit。

刚才点进帖子看新回复,发现头像和名称都很熟悉啊。

[==========] 90 tests from 30 test suites ran. (77 ms total)
[  PASSED  ] 88 tests.
[  FAILED  ] 2 tests, listed below:
[  FAILED  ] RimeSyllabifierTest.TrimLeadingDelimiters
[  FAILED  ] RimeSyllabifierTest.TrimBothLeadingAndTrailingDelimiters

我试着去修改了一下源码 照着gvim的去设置 我修改的是w32fns.c文件里面的 w32_wnd_proc 函数 这个是Windows的事件循环窗口 我找到相关的 IME 事件 调用这个bug报告里面说的 ImmSetCompositionFontW 方法去设置 编译成功以后去打开emacs发现输入法的拼音候选框缩放没有反应 按照我的经验来说这个候选框的dpi缩放应该是要在全局开启什么api来启用的 类似 com 接口的初始化api一样 我完全没有接触过这个 按我的经验来说 Windows上的软件 dpi的适配默认系统是不会帮你缩放的 得软件自己处理 emacs既然没有处理正确的话 那就让系统接管看看

设置好以后是这样 会比默认的大一倍

这是默认的

让系统接管dpi设置的话 会有渲染发虚的问题 想像vim那样根据字体大小动态缩放拼音候选的大小 得让有经验的Windows开发者和emacs维护者来解决这个问题了 我是这个月刚入坑的 我目前解决不了这个问题 但是我感觉我这个帖子的方案是比较好的一个选择 它把输入法的拼音渲染到emacs的buffer里面 我感觉很好 所以这对我来说想修复的动力就小了

1 个赞

这个问题看大家描述,会让人以为只有windows emacs才有这个问题?,实际应该是与emacs没有关系,任何使用windows原生输入法的程序都会遇到吧,但除了emacs用户无人反馈,所以解决方案也只对emacs有效

我用最直白最直观的话给你描述这个问题 在浏览器里面输入中文 浏览器会给你内联这些拼音候选 你可以试试 这是浏览器特别处理的。 Windows上有个经典软件叫记事本 我不知道它有没有内联拼音因为背景是白色的我看不清楚 不过有一点像上面那个bug报告说的一样 它和gvim是能在缩放的时候根据字体大小取缩放这个拼音缩放 我特地下了一个gvim测试过。 这和emacs是有关系的 不能算是bug但算是功能缺失。 任何使用Windows原生输入法的程序会不会遇到?这个很难跟你说明白 现在的主流软件是浏览器套壳 浏览器会帮你处理 如果是win32原生控件那也不会有这个问题 因为win32的原生编辑框控件大多用的也是记事本的编辑框 也不存在这个问题 只有像emacs这种高度定制的文本编辑器从零开始写的 需要处理大量的相关输入法事件才会有这种问题 具体的实现代码文件是w32fns.c 解决方案当然是只对emacs有效 我发帖子就是说的这件事情

2 个赞

修复了不支持 child-frame的问题 之前的代码只支持绑定一个窗口 有时序问题 现在可以支持child-frame的窗口了

aaa