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

我觉得以这个方式就行?实时取 margin 会有问题吗?

获取window-margins这个函数是Emacs自带的C编写的,设置中只有在windows的参数变更时才会重新获取margin, 我这边测试对性能没影响。

我配置中这个乘以13的值 没找到应该从哪里直接获取。我在两天windows上设置为13 是正常的。但是换到mac上需要改为10.

我是说感觉每次用的时候都获取就可以?加 hook 其实是不太好。

@DogLooksGood window-configuration-change-hook 确实不好。 经测试,每次弹出posframe 都会触发。我原先以为只有更改窗口大小的时候才会触发。
我有个想法:只在指定的mode加载的时候设置(mode-hook),以及更改frame大小以及缩放字体时设置(这2个目前还没找到是哪个hook)。

为什么我的位置感觉是对的呢,我也有 margin 的啊。

我的是通过olivetti 设置的margin,这个包改变的是window-margin,不是frame的margin。你是怎么加margin的?我试试看。

(let ((margin 24))
  (add-to-list 'default-frame-alist (cons 'internal-border-width margin))
  (set-frame-parameter nil 'internal-border-width margin))

你这个参数是改变的frame的margin,我这里测试也是正常的。
posframe 里面的 :x-pixel-offset 参考的是frame的边界。不知道posframe 有没有参考window-margin的参数?
@DogLooksGood 试试看 set-window-parameter

这个设置方式有什么特别的好处吗?

我对这块研究不深。同类的 olivetti ,还有一个是writeroom-mode,都是通过window实现的。

我的理解是:可能是因为我们平时使用的更多是一个Frame 上有多个window(每个windows上是一个buffer)。只有像posframe这种情况才开新的frame,而且开多个frame 在mac 上还有bug。

只有在 hook 里面,(window-margins) 才能取得到值?如果这样话是有点麻烦啊。

不会啊,直接执行的话返回的是一个cons。要有window才行,估计是你测试的buffer只是一个frame。 我直接在没开启elivetti的buffer上执行也是返回nil,但在org-mode的buffer下就返回(37 . 37), 然后在同样的位置,关闭elivetti-mode ,再执行,就是nil。

@DogLooksGood 报告一个问题,目前emacs-rime 中的 (setq rime-posframe-fixed-position t) 的实现方式还会影响其他的posframe。比如在开启固定的时候,打开snails进行搜索时,会有下面的效果,输入的内容还是在原来的buffer。

如果关闭固定模式的话,不影响snails的posframe:

请教一下,helm 里面的候选词不出现这个大家遇到过吗?

感觉期待进一步的信息,我这里没有除了 emacs-rime 的 posframe 应用。实际上我发现 posframe 会有一个全局的 hook 而且还有一定的成本,所以我已经全面去掉了 posframe, 连 emacs-rime 都改用了 minibuffer…

是以前就不能用,还是新出现的问题?

snails没有用posframe

看来我也要去posframe了。
我尝试了使用minibuffer,确实很流畅。不过会和awesome-tray 冲突,估计是显示高度不够。这个模式下,屏幕不会闪了 :smile:

我在慢慢缩小自己的配置,本着先可靠,再可用的原则。

rime-pasframe-fixed-position 也许以后可以找到更好的办法。目前我想到的就是在 preedit 的 overlay 里面,用 display 替代 after-string。今天搞的 meow 的 meow-search 的功能就尝试了一下,效果好像还可以。after-string 的话光标的位置比较怪,所以才要算。

赞同,我最近也在缩减配置 :grin:
打算暂时不用awesome-tray,换回modeline,然后通过minibuffer显示输入预选。

(setq rime-show-candidate nil)
(setq rime-show-preedit t)

上面的配置下,是完全不显示预选,只在当前光标显示中文,我个人觉得这样输入很舒服。 因为真正输入的时候我大部分时间是不看预选的,不知道有没有可能在上面的基础上设置,需要的时候我手动启用预选?因为有时遇到生僻字,或者需要切换输入方案的话,还是得看预选窗口。

ps: 现在已经喜欢上这种没有候选框的模式,输入中文的体验跟输入英文一样,直接看着当前输入内容打字就行。给Emacs-rime 点一个大大的赞 :+1: