与补全类似,emacs社区似乎对child-frame的折腾也是乐此不疲。估计大家多是设置为“居中心弹出”或“顶部弹出”。
我觉得科学的弹窗方式应该兼顾:
1、眼睛更少的移动,减少眼部肌肉疲劳(也许吧~),另外眼球水平移动更舒服,不用长距离往下或往上移动;
2、样式和弹出动作更为统一,看上去更美观。
ps:而需要展示内容较多的frame最好是在emacs正中心弹出,例如snails和which-key-posframe等。
在此以设置selectrum居中弹出为例展示一下。
在 @tumashu 大佬的帮助下:
自己捣鼓出这样的弹窗方式,即在高亮行的下一行居中弹出。如图:
可见,高亮行的下一行居中弹出可以较为靠近输入停顿的地方,眼睛移动距离小,满足上述要求1;固定居中弹出,所有弹窗的动作统一(和company动作也类似),而且如果设置弹窗背景色为hl-line的颜色,会产生弹窗在高亮行下拉展开的效果,整体上更美观,满足要求2。当然,“在光标处弹出”也有类似的效果,但不是很满足要求2,光标在屏幕靠边行尾或右下角时表现不大美观。
另外,这样的弹窗动作结合 centered-cursor-mode和darkroom等package结合使用,整个体验都非常好,全屏使用emacs过程中眼睛基本是保持在屏幕中段左右移动。如图:
补充:
1、po上selectrum居中弹出的设置:在这基础上改改,
(setq mini-frame-show-parameters
(lambda ()
(let* ((info (posframe-poshandler-argbuilder mini-frame-frame))
(posn (posframe-poshandler-point-window-center info)))
`((left . ,(car posn))
(top . , (cdr posn))
))))
2、不同emacs版本对child-frame支持不同,如下:
因为emacs-nightly性能不好,我现在用emacs 28 native comp,这个版本对child-frame的支持也非常好,全屏下company snails posframe等都没啥问题。期待eamcs 28早点release~
更新 (2021-18-25):
1、原来posframe早已有这种弹出方式(在高亮行下一行居window中间弹出),近日又添加了新的弹出方式(在高亮行下一行居emacs中间弹出)。都是符合本文所提要求的,力荐。谢谢 @tumashu 大佬!
2、 更新了上面selectrum配置,另外po上ivy-posframe的配置:
(defun ivy-posframe-display-at-p0.5p0-to-f0.5p1 (str)
(ivy-posframe--display str #'posframe-poshandler-p0.5p0-to-f0.5p1))
(setq ivy-posframe-display-functions-alist '((t . ivy-posframe-display-at-p0.5p0-to-f0.5p1)))