【分享】一种更科学的child-frame pop up方式?以selectrum居中弹出为例

与补全类似,emacs社区似乎对child-frame的折腾也是乐此不疲。估计大家多是设置为“居中心弹出”或“顶部弹出”。

我觉得科学的弹窗方式应该兼顾:

1、眼睛更少的移动,减少眼部肌肉疲劳(也许吧~),另外眼球水平移动更舒服,不用长距离往下或往上移动;

2、样式和弹出动作更为统一,看上去更美观。

ps:而需要展示内容较多的frame最好是在emacs正中心弹出,例如snails和which-key-posframe等。

在此以设置selectrum居中弹出为例展示一下。

@tumashu 大佬的帮助下:

自己捣鼓出这样的弹窗方式,即在高亮行的下一行居中弹出。如图:

可见,高亮行的下一行居中弹出可以较为靠近输入停顿的地方,眼睛移动距离小,满足上述要求1;固定居中弹出,所有弹窗的动作统一(和company动作也类似),而且如果设置弹窗背景色为hl-line的颜色,会产生弹窗在高亮行下拉展开的效果,整体上更美观,满足要求2。当然,“在光标处弹出”也有类似的效果,但不是很满足要求2,光标在屏幕靠边行尾或右下角时表现不大美观。

另外,这样的弹窗动作结合 centered-cursor-modedarkroom等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)))
3 个赞

目前还有个小瑕疵,启动emacs后,selectrum child-frame首次弹出会在水平方向上找不到居中位置。是不是因为mini-frame首次弹出时的高度和宽度还没传给posframe?麻烦 @tumashu 大佬帮忙看看。谢谢! :pray: 另外,大佬如果有空,可不可以给posframe加上这种弹出位置? :smiling_face_with_three_hearts:

有可能。。。。,你看看这时候miniframe的尺寸

实现起来不难,但应该怎么命名呢? :rofl:

posframe-poshandler-point-newline-center 这个如何? :grin:

不加了,还是让用户自己组合已经有的poshandler吧。。。。

我今天整理posframe, 发现,posframe-poshandler-point-window-center可能就是你需要的

1 个赞

更新点内容,方便emacs小白。