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

对了,用了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:测试用的配置就这么多:

https://github.com/manateelazycat/snails#why-doesnt-snails-frame-work-when-i-open-a-fullscreen-emacs-on-mac

这个我几乎无能为力:

  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 大佬!

设置为“在光标处弹出”,当光标处于左上角时表现尚可。貌似 set-frame-postion 这个function设置的位置并不是很准?

snails只有居中弹出和helm style,没有光标处的选项。

最近在折腾弹窗 魔改了一下snails试试 :smile:

新版本的emacs 28、29 用child frame在全屏时没有问题了,不用设置 ns-use-native-fullscreen.

真的吗。28快发布,应该也稳定了,我删掉29,重新编译个新版28。macos下的child fame真够折腾的……谢谢半人马大佬~

我确信,28.0.60没有问题了

:sob: 我这边还是没什么改善,该有的问题一个没落下。环境:macos big sur 11.5.1GNU Emacs 28.0.60 (build 2, x86_64-apple-darwin20.6.0, NS appkit-2022.60 Version 11.5.1 (Build 20G80)) of 2021-10-31(brew install emacs-plus@28 --with-modern-vscode-icon)

问题依旧是,全屏下snails产生黑桌面(下图,需要猫大的全屏方案才能解决),非全屏下snails与posframe会有输入焦点冲突问题(emacs启动后先在全屏下激活一次snails才能解决):

handle-focus-out: Invalid function: (snails-quit #[128 "��\"��\"��" [apply posframe--redirect-posframe-focus #[128 "��\"��\"��" [apply blink-cursor--rescan-frames ignore nil] 5 nil nil] nil] 5 nil nil]) [2 times]

handle-focus-in: Invalid function: (snails-quit #[128 "��\"��\"��" [apply posframe--redirect-posframe-focus #[128 "��\"��\"��" [apply blink-cursor--rescan-frames ignore nil] 5 nil nil] nil] 5 nil nil])

我的小macbook是16年早期生产的,而且还是在ebay买的官方翻新版,撑到现在挺不错的了,差不多该换了。后面买个小服务器,macbook当屏幕,用vnc连服务器玩……

@manateelazycat 猫大,好像macos下emacs全屏后,snails出现黑桌面而posframe mini-frame没黑桌面是因为macos把snails生成的 frame 当成了一个窗体,把posframe mini-frame生成的frame和emacs当成一个窗体。这一区别可以通过系统的截图工具(截取整个窗体)来发现。

snails生成 frame 的函数是 make-frame-visible;posframe mini-frame用的则类似show-parameters(不是很确定):

snails用的是frame,posframe用的是child-frame,所以从理论上讲这个现象是正常的。

frame 和 child-frame 的区别是是否设置了 parent-frame 参数,snails 一开始就设置了 parent-frame 参数,所以 snails 的 frame 本质是 child-frame.