Как изменить поведение org -nda-goto для открытия org-файла в новом фрейме? - PullRequest
1 голос
/ 17 июня 2019

При нажатии клавиши TAB (org-agenda-goto) в org-повестки дня я хочу открыть связанный файл org в новом кадре, а не разбивать существующий кадр.

Я мог бы создать модифицированную функцию 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 будет правильным подходом.

Я обнаружил в переопределить предпочтительный метод это подсказки для использования типа «добавить совет», чтобы заменить исходную функцию своей собственной:

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

1 Ответ

0 голосов
/ 19 июня 2019

Вы можете использовать совет для временного переопределения 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)))
...