在模板选择之前中止组织捕获时的钩子或建议?

时间:2014-05-07 12:07:59

标签: emacs org-mode

我希望能够在选择捕获模板之前中止org-capture 时运行一些代码。我可以在使用defadvice完成捕获过程(无论是完成还是中止)时运行一些代码。例如:

(defadvice org-capture-finalize
  (after delete-capture-frame activate)
  "Advise capture-finalize to close the frame"
  (if (equal "capture" (frame-parameter nil 'name))
      (delete-frame)))

(defadvice org-capture-kill
  (after delete-capture-frame activate)
  "Advise capture-kill to close the frame"
  (if (equal "capture" (frame-parameter nil 'name))
      (delete-frame)))

我无法弄清楚当我在选择模板之前中止捕获时如何运行一些代码。这是 Org Select 缓冲区提示我"选择捕获模板"。我可以点击' q'或者' C-g'中止捕获但我无法弄清楚如何挂钩。对于上下文,我想要完成的是能够在中止时删除组织捕获帧。我将org-capture设置为open in a new frame,我可以在捕获完成后删除帧,或者在模板选择后中止

在模板选择之前中止捕获时,是否可以使用钩子或一些建议来运行某些代码?

2 个答案:

答案 0 :(得分:2)

不确定

(defadvice org-capture-select-template
    (before org-before-capture-template activate)
  (message "bar"))

或扩展版本(检查 C-g ):

(defadvice org-capture-select-template
    (around org-around-capture-template activate)
  (message "trying")
  (if (ignore-errors ad-do-it t)
      (message "success")
    (message "fail")))

如果你想检查 q ,你必须浏览组织来源, 找到它所在的位置并提出建议。

答案 1 :(得分:1)

这似乎有效:

(defadvice org-capture-select-template (around delete-capture-frame activate)
  "Advise org-capture-select-template to close the frame on abort"
  (unless (ignore-errors ad-do-it t)
    (setq ad-return-value "q"))
  (if (and
       (equal "q" ad-return-value)
       (equal "capture" (frame-parameter nil 'name)))
      (delete-frame)))

这会检查org-capture-select-template的返回值,这是org-capture调用设置entry的内容,如果它返回error "Abort",则会调用q,因为您和已经看过了。如果捕获帧确实返回q,则该建议将删除捕获帧。

请注意,它在模板选择中不处理C-g没关系,修复了。假设q中的结果行为相同,我在错误时将返回值设置为C-g(即在org-capture上)。据我所知,通过阅读来源,它是(唯一的区别是error而不是org-capture来调用org-capture-select-template

哦,org-capture-kill来电org-capture-finalize,所以你不需要告诉前者。