从spacemacs迁移到DOOM;company-childframe by @tumashu

或者你把 toggle-frame-fullscreen 替换 run-at-time 的 set-frame-paramater 内容,这样既能解决问题,也能切换全屏.

这样玩

;; 在Mac平台, Emacs不能进入Mac原生的全屏模式,否则会导致 `make-frame' 创建时也集成原生全屏属性后造成白屏和左右滑动现象.
;; 所以先设置 `ns-use-native-fullscreen' 和 `ns-use-fullscreen-animation' 禁止Emacs使用Mac原生的全屏模式.
;; 而是采用传统的全屏模式, 传统的全屏模式, 只会在当前工作区全屏,而不是切换到Mac那种单独的全屏工作区,
;; 这样执行 `make-frame' 先关代码或插件时,就不会因为Mac单独工作区左右滑动产生的bug.
;;
;; Mac平台下,不能直接使用 `set-frame-parameter' 和 `fullboth' 来设置全屏,
;; 那样也会导致Mac窗口管理器直接把Emacs窗口扔到单独的工作区, 从而对 `make-frame' 产生同样的Bug.
;; 所以, 启动的时候通过 `set-frame-parameter' 和 `maximized' 先设置Emacs为最大化窗口状态, 启动5秒以后再设置成全屏状态,
;; Mac就不会移动Emacs窗口到单独的工作区, 最终解决Mac平台下原生全屏窗口导致 `make-frame' 左右滑动闪烁的问题.
(setq ns-use-native-fullscreen nil)
(setq ns-use-fullscreen-animation nil)
(set-frame-parameter (selected-frame) 'fullscreen 'maximized)
(run-at-time "5sec" nil (lambda () (toggle-frame-fullscreen)))

dock在emacs在另外一个屏幕全屏的时候不显示好像是因为(setq ns-use-native-fullscreen nil)这句

其实如果你要用 Dock , 你完全不需要我的代码, 直接最大化就可以了.

我的代码是解决全屏状态下和 make-frame 冲突的问题.

@tumashu EmacsWiki 上加了一个连接, 避免别人也被坑到了: EmacsWiki: Emacs For Mac OS

1 个赞

弄了个完美的版本:

(setq ns-use-native-fullscreen nil)
(setq ns-use-fullscreen-animation nil)
(run-at-time "5sec" nil
             (lambda ()
               (let ((fullscreen (frame-parameter (selected-frame) 'fullscreen)))
                 ;; If emacs has in fullscreen status, maximized window first, drag from Mac's single space.
                 (when (memq fullscreen '(fullscreen fullboth))
                   (set-frame-parameter (selected-frame) 'fullscreen 'maximized))
                 ;; Manipulating a frame without waiting for the fullscreen
                 ;; animation to complete can cause a crash, or other unexpected
                 ;; behavior, on macOS (bug#28496).
                 (when (featurep 'cocoa) (sleep-for 0.5))
                 ;; Call `toggle-frame-fullscreen' to fullscreen emacs.
                 (toggle-frame-fullscreen))))
  1. 先设置不准用Mac原生全屏窗口
  2. 5秒以后, 先检测是不是已经被 Mac 窗口管理器自助主张全屏了,如果已经全屏了,先最大化把Emacs从独立工作区拉回来, 如果Mac没有自作主张就不管窗口状态
  3. 窗口正常状态后, 调用 toggle-frame-fullscreen 进入全屏状态, 这样以后再调用命令 toggle-frame-fullscreen 也不会出错了.
2 个赞

坑爹的, 终于可以舒服的用 posframe.el 来显示单词翻译和实时语法错误了.

你太能折腾了。。。。。佩服佩服

你不知道苹果操作系统有多坑,你折腾linux还很累。

我现在折腾guixsd,不过机子不行,编译太耗时间。。。

输入光标靠近窗口下边缘的时候, company-posframe的窗口很容易正好挡住输入光标, 有可能是计算好的位置被emacs底层强制给移动了(比如因为遮住了mode line?)

emacs-mac port没有这个问题(日本开发者还是厉害lol),标题栏可以通过打patch去掉,--with-natural-title-bar。没记错的话emacs-plus也有这个patch。

现在 posframe 可以直接设置边框宽度了,另外 emacs 也提供了 边框颜色设置功能

求简单的实例代码

border border 的颜色通过 internal-border face 设置

(posframe-show "fff" :string "this is a test"
               :internal-border-width 10)

我试了 padding 可以了, internal-border background 设置以后无法显示边框颜色, 是不是最新git版才有的功能?

我的 sdcv.el 插件增加了对 internal-border-width 的支持, 现在优雅多了, 要把浅对比度的边框加上就完美了.

emacs 26.1 就可以呀,你不会设置后没有 Apply 吧?

输入位置靠近窗口下边缘的时候, company-posframe的窗口很容易正好挡住输入光标, 有可能是计算好的位置被emacs底层强制给移动了(比如因为遮住了mode line?) 这个问题有解吗?

贴个截图或者gif看看