如何判断一个函数的发起是从用户还是elisp

(defun org-clock-out/change-todo-state-by-hand ()
  (org-clock-goto)
  (org-todo))

我现在这里有一个hook,作用是在结束计时的时候会去弹窗让用户选择更改TODO状态

但是!有一个问题

在org-capture中,我写了一个template,

("ri" "Item form" entry (clock) (function org-capture/task-map-reduce-entry-template) :clock-in t :clock-resume t))

先不用管这个function返回的template函数,这个不重要,这里:clock-in属性会去结束掉正在计时的任务,然后开启这个新capture的任务的计时。

那么这个时候会出发clock-out的hook

那么问题来,这个时候我是不希望这里去触发clock-out的hook

所以我想来想去怎么去区分,有没有一种能知道是用户C-c C-x C-o 触发的clock out,还是其他函数调用的

这样就能区分开了

called-interactively-p

1 个赞

感谢提供这个函数信息

但是看了一下文档

Return t if the containing function was called by ‘call-interactively’.

因为我这里是hook,他不管怎么样好像都是elisp其他函数发起的。

(defvar-local inside-org-clock-out nil "Bound to t only inside `org-clock-out'")

(defadvice! :around 'org-clock-out org-clock-out-a (&rest _)
  (let ((inside-org-clock-out t))
    (eval _)))

(defun org-clock-out/change-todo-state-by-hand ()
  (when inside-org-clock-out
    (org-clock-goto)
    (org-todo)))

advice-add! 是doom emacs 的一个宏,可以自己找一下。

1 个赞