【求助】如何设置snails frame从光标处弹出(及讨论mac下XXX-posrame的bug)?

由于平时在macos上习惯使用alfred,尝试了ivy helm selectrum snails等框架后,最后还是更倾向于使用snails

另外,emacs上的frame弹出方式,我想要统一为“从光标处弹出”,跟company-mode行为保持一致,因此想要实现snails-frame display at point

观察到company-posframe ivy-posframe which-key-posframe等插件包,以及selectrum display minibuffer in a child frame, 貌似借助posframe是最便捷的办法。

1、调用posframe估算光标的位置;

2、把位置信息传给snails set-frame-postion

瞎写了几句:

  (require 'posframe)
  (require 'snails)
  (let* ((info (posframe-poshandler-argbuilder snails-frame))
         (posn (posframe-poshandler-window-center info)))
    (set-frame-position snails-frame (car posn) (cdr posn)))

没报错,也没效果……有哪位大佬可以指正一下吗?谢谢! :pray:

光标处弹出容易空间不够,比如光标在右下角。

snails没用posframe的原因是posframe的细节控制达不到snails要求。

试试ivy-posframe

原来还有这样的考量,谢谢猫大。顺便再请教一下猫大,我好像没看到mdfind命令加单引号的,例如 mdfind -name 'file's name'就搜不出结果,我把 snails-backend-mdfind.el的(format “‘%s’” input)的单引号去掉之后才能搜到结果,麻烦看看要不要改一下? :pray:

欢迎提交补丁

应该PR了,门外汉还不会git,现学现用,麻烦猫大看看。

刚用最小配置(仅有use-package和straight)安装了ivy和ivy-posframe,出现了一个问题:第一次激活ivy-posframe会抢焦点,输入的内容会跑到ivy-poframe的展示区而不是输入框,如下图的“zheli”:

需要用鼠标点一下emacs才能恢复正常:

我昨晚刚好发现company-posframe也是类似的情况,company-box却没有这样的情况。环境是macos big sur emacs 27.2,不知道是macos的窗口管理的问题还是posframe的问题。麻烦半人马大佬帮我看看 :pray:

我这里没有问题哦。之前确实某个Emacs版本有问题,还有问题可以让 @tumashu 大佬看看,posframe 是他的作品。

嗯嗯,谢谢大佬提醒。分别重装了emacs-mac和emacs-plus,发现emacs-mac版没有出现这样的情况,美中不足的是company-posframe在select condidates的时候会闪烁。

我用的company-box

对了,用了emacs-mac版之后,macos下全屏后触发new frame而出现 新的黑色桌面或者ctl-tab出现两个emacs图标等问题都不见。记得之前大佬你在snails帖子里提到类似的情况。

emacs-mac版做了很多底层改动,对mac兼容更好,但是少很多新特性。最新的GNU emacs已经修复了黑屏的问题。

(defcustom posframe-mouse-banish (not (eq system-type 'darwin))

"Mouse banish.

when this variable is t, mouse will be moved to (0 , 0).

when this variable is a cons like (x . y), mouse will be moved

to (x , y).

This option is used to solve the problem of child frame getting

focus, with the help of `posframe--redirect-posframe-focus',

setting this option to `nil' will work well in *most* cases."

:group 'posframe

:type 'boolean)

试试设置这个变量

之前在posframe的issue里看到讨论了,可惜set nil还是不行。现在弃用emacs-plus,改用eamcs-nightly或emacs-mac,都没有grab focus的问题。emacs-mac下company-posframe在select condidates的时候会闪烁,官方版的emacs-nightly版则没什么问题,对 XXX-posframe 系列插件兼容都比较好。谢谢大佬!

设置为 t 试试

macos big sur下编译了多个GUI emacs 27.2 版本,配置仅添加use-package straightt ivy ivy-posframe company copany-posframe,偶尔换配置测试一下snails的make-frame。

测试并总结一下规律:

一、能发现的posframe的bug:

1、company-posframe在快速select condidates时出现闪烁,选一个闪一次。

2、company-posframe、ivy-frame在第一次激活时会grab focus,如下:

3、macos下非fullscreen,company-posframe show quickhelp doc时会把emacs遮住(部分或全部)的inactive窗口拉到最前面,但不会抢输入的焦点,如图:

4、macos下fullscreen,一旦激活posframe,则会产生一个以上的全黑“posframe桌面”,和snails的make-frame是类似的情况,如图:

二、emacs版本与bug的关系(经homebrew安装):

1、emacs-nightly:未出现上述posframe bug,只是company-posframe show quickhelp doc会出现resize小抖动。snail的make-frame会出现bug4。

2、emacs-plus:

2.1、会出现bug3和bug4。

2.2、(setq posframe-mouse-banish nil)或(setq posframe-mouse-banish t)都会出现bug3和bug4。

3、emacs-plus–with-no-titlebar:

3.1、会出现bug2和bug4,quickhelp doc没显示出来。

3.2、(setq posframe-mouse-banish nil)或(setq posframe-mouse-banish t)都会出现bug2和bug4,quickhelp doc没显示出来。

3、emcs-mac:

3.1、出现bug1,quickhelp doc不出现resize小抖动。

3.2、(setq posframe-mouse-banish nil)或(setq posframe-mouse-banish t)都会出现bug1。

比较直观的感受是,emacs-plus–with-no-titlebar运行最快,但可能因为no-titlebar,macos把posframe当成了一个系统上的窗口,会抢输入focus,会产生新桌面。

大致情况如此,麻烦 @tumashu 大佬看看,谢谢!

ps:测试用的配置就这么多:

这个我几乎无能为力:

  1. 我没有苹果的设备,没法试
  2. 大多数问题可能涉及 child-frame 的实现,这个是 emacs C 层面的东西,我搞不定。

emacs-plus–with-no-titlebar版本,用起来依旧不行,snails input弹出时会占用整个桌面,RET condidate后会变成黑色的桌面,如图。估计plus版本和no-titlebar的影响最大。

emacs-nightly版本用起来没问题,那就终于可以定下来用这个版本了,对所有的new frame都很友好。很早之前配置snails时看到你的fullscreen方法,现在没想起来……谢谢猫大!

:sob:虽然很喜欢emacs-plus–with-no-titlebar版本的性能,但frame会出现bug,那就只能用emacs-nightly了。玩开源,还得用linux啊…… 谢谢 @tumashu 大佬!