如何更改org-agenda-goto的行为以在新框架中打开org-file?

时间:2019-06-17 09:45:16

标签: emacs org-mode

在组织议程中按TAB(org-agenda-goto)时,我想在新框架中打开相关的组织文件,而不是拆分现有框架。

我可以创建一个org-agenda-goto的修改函数,用switch-to-buffer-other-window替换switch-to-buffer-other-frame并重新绑定TAB键,但是我想有一种更优雅的方法吗?

快速解决方案如下,修改第8行:

(defun sk/org-agenda-goto (&optional highlight)
  "Go to the entry at point in the corresponding Org file."
  (interactive)
  (let* ((marker (or (org-get-at-bol 'org-marker)
             (org-agenda-error)))
     (buffer (marker-buffer marker))
     (pos (marker-position marker)))
    (switch-to-buffer-other-frame buffer)
    (widen)
    (push-mark)
    (goto-char pos)
    (when (derived-mode-p 'org-mode)
      (org-show-context 'agenda)
      (recenter (/ (window-height) 2))
      (org-back-to-heading t)
      (let ((case-fold-search nil))
    (when (re-search-forward org-complex-heading-regexp nil t)
      (goto-char (match-beginning 4)))))
    (run-hooks 'org-agenda-after-show-hook)
    (and highlight (org-highlight (point-at-bol) (point-at-eol)))))

我认为使用advice可以做得更好,但是我对emacs-lisp的经验并不丰富,并且不知道如何实现,或者是否使用advice是正确的选择方法。

我在override prefered method中发现了一些提示,可以使用这样的advice-add来用我自己的功能替换原始功能:

(advice-add 'org-agenda-goto :override #'sk/org-agenda-goto)

1 个答案:

答案 0 :(得分:0)

您可以使用建议,使用switch-to-buffer-other-window临时重新定义cl-letf。假设您至少使用emacs 25.1,则可以使用define-advice,例如。

(define-advice org-agenda-goto (:around (orig-fn &rest args) "new-frame")
  (cl-letf (((symbol-function 'switch-to-buffer-other-window)
             (symbol-function 'switch-to-buffer-other-frame)))
    (apply orig-fn args)))

建议中的orig-fnorg-agenda-goto的占位符。另外,您可以暂时覆盖display-buffer的功能(此处可以使用许多选项-请参见display-buffer的帮助),例如。

(define-advice org-agenda-goto (:around (orig-fn &rest args) "new-frame")
  (let ((display-buffer-overriding-action '(display-buffer-pop-up-frame)))
    (apply orig-fn args)))