对了,用了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:测试用的配置就这么多:
这个我几乎无能为力:
- 我没有苹果的设备,没法试
- 大多数问题可能涉及 child-frame 的实现,这个是 emacs C 层面的东西,我搞不定。
emacs-plus–with-no-titlebar版本,用起来依旧不行,snails input弹出时会占用整个桌面,RET condidate后会变成黑色的桌面,如图。估计plus版本和no-titlebar的影响最大。
emacs-nightly版本用起来没问题,那就终于可以定下来用这个版本了,对所有的new frame都很友好。很早之前配置snails时看到你的fullscreen方法,现在没想起来……谢谢猫大!
虽然很喜欢emacs-plus–with-no-titlebar版本的性能,但frame会出现bug,那就只能用emacs-nightly了。玩开源,还得用linux啊…… 谢谢 @tumashu 大佬!
snails只有居中弹出和helm style,没有光标处的选项。
最近在折腾弹窗 魔改了一下snails试试
新版本的emacs 28、29 用child frame在全屏时没有问题了,不用设置 ns-use-native-fullscreen
.
真的吗。28快发布,应该也稳定了,我删掉29,重新编译个新版28。macos下的child fame真够折腾的……谢谢半人马大佬~
我确信,28.0.60没有问题了
我这边还是没什么改善,该有的问题一个没落下。环境:macos big sur 11.5.1
、GNU 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.