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

(setq rime-show-preedit t) 的时候也是一样。只有org-mode有问题,其他mode正常。

奇怪,我这个也是 org-mode 啊,有啥特别的设定吗

我试过不加载org的配置也是一样。等下我再试下完全空白的配置。感觉是因为左边页边缩进造成的,候选框跑到默认的最左边了。

更新:
问题确认了,就是这个默认的居中缩进造成的。下面这个空白的配置下就正常了 image

这个是因为Emacs最大化显示后,显示部分的左边界不在Emacs最左边界造成的。

有点不能理解,是在哪个平台上?

Windows和Mac 都是这样。看样子是配置中某个包的设置有问题,冲突了。等我debug出这个具体的设置先。

实在找不到哪个包在设置这个。只看到一条信息text body width set to 120,你试试将org-mode的buffer 设置这个宽度,然后最大化窗口,估计就可以重现问题。

我是用的字符的宽来偏移的,如果字符的宽被改了,那应该就算不对了。

试着在 elpa 目录搜下打印的 message?

大佬,我找到是什么原因造成Org-mode 不能使用(setq rime-posframe-fixed-position t)这个新特性了。 是因为之前用了这个olivetti包,使得整体居中了。有办法兼容这个包?

        (dolist (hook (list
                   'org-mode-hook
                   ))
      (add-hook hook
                '(lambda ()
                  (require 'olivetti)
                  (olivetti-mode 1)
                  (olivetti-set-width 120)
                  )))

这个要研究下,我觉得你可以看一下那个新加入的计算偏移 pixel 的函数的实现。

这个想法可行,在启动olivetti的hook中多加一个偏置应该就可以了。

很棒,在wsl下换这个了,输入响应速度不错,也没遇上什么问题。

@DogLooksGood 大佬,我通过将偏置的参数扩展一个变量出来可以实现emacs-rime的inline模式和 olivetti兼容了。

实现的比较难看,不知道大佬有什么建议吗?
rime 中的修改了 x-fixel-offset 这行:

(defvar my-posframe-offset 0)
(defun rime--posframe-display-content (content)
  "Display CONTENT with posframe."
  (if (and (featurep 'posframe) (display-graphic-p))
      (if (string-blank-p content)
          (posframe-hide rime-posframe-buffer)
        (let*
            ((preedit (rime--current-preedit))
             (x (cond
                 ((not rime-posframe-fixed-position) 0)
                 ((not preedit) 0)
                 ((not (overlayp rime--preedit-overlay)) 0)
                 (t (rime--string-pixel-width preedit)))))
          (apply #'posframe-show rime-posframe-buffer
                 :string content
                 :x-pixel-offset (- (- x my-posframe-offset))
                 :background-color (face-attribute 'rime-default-face :background nil t)
                 :foreground-color (face-attribute 'rime-default-face :foreground nil t)
                 rime-posframe-properties)))
    ;; Fallback to popup when not available.
    (rime--popup-display-content content)))

olivity配置中添加一个了hook,使得窗口变化的时候更新参数:

(olivetti-set-width 120)
(add-hook 'window-configuration-change-hook #'(lambda ()
                                                (setq-local my-posframe-offset
                                                            (cond
                                                             ((not olivetti-mode) 0)
                                                             ((<= (frame-width) olivetti-body-width)  0)
                                                             ((> (frame-width) olivetti-body-width)
                                                              (* (/ (- (frame-width) olivetti-body-width)
                                                                    2)
                                                                 13))))))

更新:本人elisp水平有限,目前只能先用这个方案了。使用上已经完全没问题。
如果谁有更好的方案,请指教下。

我个人觉得这样的设置不是很合理,应该看 olivetti 通过控制哪个变量达到的效果,然后可以把这个变量固定的加入计算,而不是针对性的 hack。

多谢建议,我再研究下olivetti的代码。 目前这种设置确实问题多,用了'window-configuration-change-hook 影响了其他mode,还要单独处理。

olivetti是改变了margin宽度实现的。按理说应该不用特别适配的啊?

因为新加入的特性(setq rime-posframe-fixed-position t) ,posframe的起算位置是以窗体的最左边0位起算,并没有识别left-margin。
而我在当前启用了olivetti的buffer下执行(left-margin)返回值也是0。

hi 请问你在WIN10下安装成功了吗 能教我一下吗

我是按原来的土办法安装的,可以正常使用。需要的话,可以参考我的emacs-rime安装记录,不过现在官方已经提交了librime到msys2,也可以从msys2编译安装,不过我折腾不明白。

好的 谢谢 我看一下

看看这个函数olivetti-set-window.