有朋友使用 alert 包吗?遇到一个奇怪的问题

elisp
org

#1

When I start emacs in terminal, the notifier style works well. If I start emacs in gui mode, it fails.

这是我第一个觉得奇怪的点。

Run describe variable in GUI mode, the output looks like this:

alert-notifier-command is a variable defined in ‘alert.el’. Its value is nil Original value was “/usr/local/bin/terminal-notifier”

This variable may be risky if used as a file-local variable.

Documentation: Path to the terminal-notifier command. From https://github.com/julienXX/terminal-notifier.

You can customize this variable.

Additional info:

(executable-find "terminal-notifier")
;; output is /usr/local/bin/terminal-notifier

I’m pretty sure that I have not set alert-notifier-command variable manually, and no package set it

这是我第二个觉得奇怪的点:alert-noitifier-command 变量的值为啥会变呢?

~/.emacs.d/elpa > ag 'alert-notifier-command'
alert-20180827.422/alert.el
837:(defcustom alert-notifier-command (executable-find "terminal-notifier")
851:  (if alert-notifier-command
856:        (apply #'call-process alert-notifier-command nil nil nil args))
~/.emacs.d/elpa > cat ~/.emacs | grep "alert-notifier-command"

Version:

  • My OS is macOS 10.13.4.
  • Emacs Version is 26.1.1
  • alert version is alert-20180827.422

我在 GitHub 上也提了 issue,但是想想这里或许可以更快的获得解答,所以在这里也提个问。


更新 (18-10-09 22:54):

  1. 问题一,为啥 GUI 不能 work:exec-path 不对,导致 GUI 模式下不能正确执行,解决办法见讨论
  2. 问题二,为啥 Emacs 说 original value 是 xxx:因为 describle variable 的实现是 eval 一下定义语句。
  3. 问题三:为啥当时 Terminal 模式可以?暂时未解决

#2

变量为 nil 是在 GUI 中 吧?应该说清楚。

假设是在 GUI 中为 nil,可能是 exec-path 的问题。


#3

嗯,确实是 exec-path 的问题。

(when (memq window-system '(mac ns x))
     (exec-path-from-shell-initialize)))

我刚把这段代码放在 (use-package alert) 的前面,似乎就能正常 work。

不过,我又有一个疑问:

Its value is nil Original value was “/usr/local/bin/terminal-notifier”

Emacs 为什么说它的 original value 是 /usr/local/bin/terminal-notifier 这个呢? 我看了下 alert 的源码,它的定义是这样:

(defcustom alert-notifier-command (executable-find "terminal-notifier")
  "Path to the terminal-notifier command.
From https://github.com/julienXX/terminal-notifier."
  :type 'file
  :group 'alert)

难道 Emacs 计算 original value 的方式是重新执行一下这个定义语句么?


#4

嗯,我把描述改一下,让大家知道变量为 nil 的背景


#5

看了下 describe-variable 的源码,好像它计算 original value 的方式就是 eval 一下定义语句。


#6

Terminal 模式继承了 shell 的环境变量