从spacemacs迁移到DOOM;company-childframe by @tumashu

我试了 padding 可以了, internal-border background 设置以后无法显示边框颜色, 是不是最新git版才有的功能?

我的 sdcv.el 插件增加了对 internal-border-width 的支持, 现在优雅多了, 要把浅对比度的边框加上就完美了.

emacs 26.1 就可以呀,你不会设置后没有 Apply 吧?

输入位置靠近窗口下边缘的时候, company-posframe的窗口很容易正好挡住输入光标, 有可能是计算好的位置被emacs底层强制给移动了(比如因为遮住了mode line?) 这个问题有解吗?

贴个截图或者gif看看

你怎么设置 internal-border 的? 我怎么不行?

我就用 customize-face 界面设置了这个 faace 的背景颜色,测试了一下

木有用, 我已经试了, 一会看看是不是我的其他配置干扰了

aa

还有这种情况:

bb

使用 emacs -Q 测试一下

emacs -Q也会出现.

调试了一下, 大致结论是:

  1. posframe会缓存计算好的位置信息, 减少重复计算
  2. 缓存在一些情况下会失效, 比如用鼠标滚动之后, 位置需要重新计算了, 但是还是用的缓存的位置, 导致位置不对
  3. 出现问题后, 可以关闭" company-posframe-buffer", 这样会重新计算位置, 然后就ok了
  4. 失效检测: 可以把windows-start的值考虑进去, 还有当前所在行和列, 检查这些是否变化, 以决定是否使用缓存.

测试发现, 4里面的还不够, 窗口如果从下边框往上拉使得窗口变小, 也会导致位置失效(此时可能因为遮住mode-line了), 最全面的可能是记录整个窗口大小还有point的像素位置, 这样还能缓解另外一个情况: 输入位置太靠右边缘, emacs自动将buffer整体向左滚动, 而childframe还停留再原地.

影响速度的操作都需要缓存,不然posframe就出现卡顿了,可用性就差了,不过可以研究研究,看实际运行情况

记录了当前窗口像素高度(宽度好像不影响)和当前point的像素位置, 这两个值变化后, 会让缓存失效, 貌似ok了. 当用户调整窗口大小, 或者用鼠标滚动窗口内容时候会让缓存失效, 应该对性能不会有什么影响.

修改如下:

diff --git a/posframe.el b/posframe.el
index ca64dcf..834df40 100644
--- a/posframe.el
+++ b/posframe.el
@@ -352,6 +352,8 @@ you can use `posframe-delete-all' to delete all posframes."
          (min-width (or min-width 1))
          (min-height (or min-height 1))
          (parent-window (selected-window))
+		 (parent-window-height (window-pixel-height parent-window))
+		 (pixel-pos (posn-x-y (posn-at-point position parent-window)))
          (parent-frame (window-frame parent-window))
          (parent-frame-width (frame-pixel-width parent-frame))
          (parent-frame-height (frame-pixel-height parent-frame))
@@ -401,6 +403,8 @@ you can use `posframe-delete-all' to delete all posframes."
           :posframe-buffer ,posframe-buffer
           :parent-frame ,parent-frame
           :parent-window ,parent-window
+		  :parent-window-height ,parent-window-height
+		  :pixel-pos ,pixel-pos
           :x-pixel-offset ,x-pixel-offset
           :y-pixel-offset ,y-pixel-offset))
        parent-frame-width parent-frame-height)

已经更新了,不过由于涉及到的代码太多,可能引入新的bug, 需要大家反馈

上次更新之后, 后来使用过程中还是偶尔会出现位置不对的情况, 主要是高度不对, 刚刚跟踪了一下代码, 发现childframe调整好位置之后(缓存起来), 下一次位置竟然会变化, 实际位置跟缓存的位置不一样, 导致位置一直不对. 不是百分百出现, 特定情况下出现几率很高, 不知道是不是我插件问题, 插件本来用的不多, 又关了几个, 仅剩下company-mode, yasnippet和global-auto-revert了, 还是会出现.

容易出现的场景:

  1. 输入位置在窗口的靠近底部(mode-line上面三四行左右的位置)
  2. 补全候选项最大高度超过四行
  3. 输入时, 反复输入和删除字符, 让补全候选数量变化, 从而让补全窗口高度变化, 比如从2行变化到6行

只在靠近底部的时候出现, 在中上部还没出现过.

感觉好像是childframe隐藏的时候位置变化了. 再次显示就不对了.

现在把posframe–set-frame-position修改了一下, 绕开缓存位置, 直接比较真实位置, 问题暂时解决.

-  (unless (and (equal position posframe--last-posframe-pixel-position)
+  (unless (and (equal position (frame-position posframe))

DOOM 停止更新了吗?大半年没有 commit 了:Commits · doomemacs/doomemacs · GitHub

你得看develop分支

2 个赞

这个全屏配合 posframe 的代码, mac 下面 emacs-plus --HEAD 又不行了… 26.2 没有问题.

doom相比spacemacs到底会有多少性能提升?。。。求问 现在spaceemacs我用着就是卡了点别的挺好。。犹豫要不要切换过去