我试了 padding 可以了, internal-border background 设置以后无法显示边框颜色, 是不是最新git版才有的功能?
emacs 26.1 就可以呀,你不会设置后没有 Apply 吧?
输入位置靠近窗口下边缘的时候, company-posframe的窗口很容易正好挡住输入光标, 有可能是计算好的位置被emacs底层强制给移动了(比如因为遮住了mode line?) 这个问题有解吗?
贴个截图或者gif看看
你怎么设置 internal-border 的? 我怎么不行?
我就用 customize-face 界面设置了这个 faace 的背景颜色,测试了一下
木有用, 我已经试了, 一会看看是不是我的其他配置干扰了
还有这种情况:
使用 emacs -Q 测试一下
emacs -Q也会出现.
调试了一下, 大致结论是:
- posframe会缓存计算好的位置信息, 减少重复计算
- 缓存在一些情况下会失效, 比如用鼠标滚动之后, 位置需要重新计算了, 但是还是用的缓存的位置, 导致位置不对
- 出现问题后, 可以关闭" company-posframe-buffer", 这样会重新计算位置, 然后就ok了
- 失效检测: 可以把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了, 还是会出现.
容易出现的场景:
- 输入位置在窗口的靠近底部(mode-line上面三四行左右的位置)
- 补全候选项最大高度超过四行
- 输入时, 反复输入和删除字符, 让补全候选数量变化, 从而让补全窗口高度变化, 比如从2行变化到6行
只在靠近底部的时候出现, 在中上部还没出现过.
感觉好像是childframe隐藏的时候位置变化了. 再次显示就不对了.
现在把posframe–set-frame-position修改了一下, 绕开缓存位置, 直接比较真实位置, 问题暂时解决.
- (unless (and (equal position posframe--last-posframe-pixel-position)
+ (unless (and (equal position (frame-position posframe))
你得看develop分支
这个全屏配合 posframe 的代码, mac 下面 emacs-plus --HEAD 又不行了… 26.2 没有问题.
doom相比spacemacs到底会有多少性能提升?。。。求问 现在spaceemacs我用着就是卡了点别的挺好。。犹豫要不要切换过去