mac下posframe没有边框,这是一个已知问题吗

你用的哪个版本的 emacs 呀?我用 emacs-head@28 编译了几次我看都没有边框。。。不知道是哪里有问题。。

现在应该有了,我编译的28最新版本。你确认下这两个feature在不在:

(featurep 'cocoa)
(featurep 'ns)

有的,我看返回都是 t。下面这个是配置,不知道是不是有不对的地方。

(use-package ivy-posframe
  :custom-face
  (ivy-posframe-border ((t (:background "gold"))))
  :config
  (setq ivy-posframe-display-functions-alist
        '((counsel-M-x     . ivy-posframe-display-at-frame-center)
          (t               . ivy-posframe-display))
        ivy-posframe-height-alist '((t . 30))
        ivy-posframe-parameters '((internal-border-width . 2))
        ivy-posframe-width 50)
  (ivy-posframe-mode 1)
)

确定你编译的是最新的master。这个变量设置不对, ivy-posframe-parameters ,边框颜色未设置。试试这个:

'((:internal-border-width . 1)
  (:internal-border-color . "white"))

或者重新设置 ivy-posframe-border 。

我这里的效果:

好气呀,就是不行。

ivy-posframe-parameters is a variable defined in ‘ivy-posframe.el’.
Its value is
((:internal-border-width . 1)
 (:internal-border-color . "red"))

编译参数,我和你的比较了,好像就差你前面那几个,但是 ns 什么的应该是有的。

"--enable-locallisppath=/usr/local/share/emacs/site-lisp --infodir=/usr/local/Cellar/emacs-head@28/28.0.50_1/share/info/emacs --prefix=/usr/local/Cellar/emacs-head@28/28.0.50_1 --without-x --without-dbus --without-imagemagick --with-modules --with-gnutls --with-rsvg --with-xml2 --with-xwidgets --with-ns --disable-ns-self-contained --with-harfbuzz"

system-configuration-features 是这个

"JPEG TIFF GIF PNG RSVG GLIB NOTIFY KQUEUE ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS MODULES THREADS XWIDGETS JSON PDUMPER LCMS2"

GNU Emacs 28.0.50 (build 1, x86_64-apple-darwin19.6.0, NS appkit-1894.60 Version 10.15.7 (Build 19H2)) of 2020-11-01

@tumashu 有空帮忙看看。。

哇。。好像出来了。。居然是这个导致的 (add-hook 'ns-system-appearance-change-functions ..) ,这个会导致那个边框消失。

edit: 真是悲剧,人家那个 hook 也没问题,是我 copy 定义的时候移除了一行认为没用的代码,。。。

    (add-hook 'ns-system-appearance-change-functions
        #'(lambda (appearance)
            (mapc #'disable-theme custom-enabled-themes)  ;; 这行不能移除。。
            (pcase appearance
               ('light (load-theme 'tango t))
               ('dark (load-theme 'tango-dark t)))))

哈哈,对的,这行不要删掉,否则theme可能混乱。

好像还是不对,我设置了这个 hook 确实是不行了,我前面说的有错误。如果使用 (load-theme 'xxx t) 这样是可以的。

你用到这个 hook 了吗?我观察到使用这个 hook 后,child frame 出来前屏幕会闪一下,然后出来就是没有边框的。

mac下面的边框之前好像有问题,后来有个大牛解决了,可以翻翻posframe的issue,我没有苹果设备,也没啥测试的方法

我没有使用这个hook,是自己实现了一个load-theme-hook。

折腾了下,发现原因是那个 hook 在 posframe 的 minibuffer 出来的时候,也会被调用,所以会再次 load-theme 就出问题了。我加了一个判断,似乎就可以了。

不过目前还有问题是,theme 一切换,设置的那些边框样式什么的就回到默认了。

(defun wd/set-theme(theme)
  (unless (member theme custom-enabled-themes)
    (mapc #'disable-theme custom-enabled-themes)
    (load-theme theme t))
  )

(add-hook 'ns-system-appearance-change-functions
          #'(lambda (appearance)
              (let ((light 'modus-operandi)
                    (dark 'modus-vivendi))
                (pcase appearance
                  ('light (wd/set-theme light))
                  ('dark (wd/set-theme dark)))
                )
              )
          )

这个 hook 是 macOS 系统 appearance 变化的 hook,应该和 load-theme-hook 不一样。

这个 hook 之前确实和 posframe 有点冲突,每次调用 posframe 都会触发。我提过个 issue 但是应该修复了才是

感谢这个信息,我看了一下,我用的那个 emacs-head@28 并没有更新那个 patch,我给他们提了一个 issue 看看什么时候修复。

我知道ns-system-appearance-change-functions 的作用,但是我没用它,感觉意义不大。我使用 circadian来根据时间启用相应的theme。

emacs-head@28 也更新了那个 patch 了,现在 ns-system-appearance-change-functions 也可以正常工作了。

1 个赞