在组织议程中按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)
答案 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-fn
是org-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)))