При нажатии клавиши 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)