не оставляйте открытыми файлы org-повестки дня после создания повестки дня


14

Генерация сегодняшней повестки дня в Org-Mode ( C-c a a) открывает файлы в org-agenda-files. Я не хочу, чтобы Emacs открывал эти дополнительные буферы.

Есть ли простой способ сказать Emacs не открывать эти буферы? (или, что то же самое, автоматически закрывать их, если они не были открыты до вызова повестки дня?).

ОБНОВИТЬ:

Это более компактная версия решения, предоставляемого @lawlist:

(require 'dash)

(defun my-org-keep-quiet (orig-fun &rest args)
  (let ((buffers-pre (-filter #'get-file-buffer (org-agenda-files))))
    (apply orig-fun args)
    (let* ((buffers-post (-filter #'get-file-buffer (org-agenda-files)))
           (buffers-new  (-difference buffers-post buffers-pre)))
      (mapcar (lambda (file) (kill-buffer (get-file-buffer file))) buffers-new))))

(advice-add 'org-agenda-list :around #'my-org-keep-quiet)
(advice-add 'org-search-view :around #'my-org-keep-quiet)
(advice-add 'org-tags-view   :around #'my-org-keep-quiet)

К сожалению, это все еще не идеально, так как теперь нажатие на событие в повестке дня не открывает соответствующий файл org.

Ответы:


11

Вы хотите org-agenda-exit, удобно привязан к х по умолчанию в представлении повестки дня

Подобно `org -nda-Quit ', но уничтожьте все буферы, созданные программой. Организационные буферы, посещенные непосредственно пользователем, не будут затронуты.

Я нашел это с помощью describe-mode.


Вменяемый ответ здесь.
YoungFrog

1
Цените указатель на describe-mode.
Matt

4

org-agenda-filesБуфер (ы) должны не быть убитым , пока после того , как функции поиска завершения. Три (3) большинство функций поиска общего используемых для генерации *Org Agenda*буфера являются: org-agenda-list; org-search-view; и org-tags-view. org-agenda-filesэто и переменная, и функция - два разных, но связанных животных.

(defvar opened-org-agenda-files nil)

(defun opened-org-agenda-files ()
  (let ((files (org-agenda-files)))
    (setq opened-org-agenda-files nil)
    (mapcar
      (lambda (x)
        (when (get-file-buffer x)
          (push x opened-org-agenda-files)))
      files)))

(defun kill-org-agenda-files ()
  (let ((files (org-agenda-files)))
    (mapcar
      (lambda (x)
        (when
            (and
              (get-file-buffer x)
              (not (member x opened-org-agenda-files)))
          (kill-buffer (get-file-buffer x))))
      files)))

(defadvice org-agenda-list (around opened-org-agenda-list-around activate)
  (opened-org-agenda-files)
  ad-do-it
  (kill-org-agenda-files))

(defadvice org-search-view (around org-search-view-around activate)
  (opened-org-agenda-files)
  ad-do-it
  (kill-org-agenda-files))

(defadvice org-tags-view (around org-tags-view-around activate)
  (opened-org-agenda-files)
  ad-do-it
  (kill-org-agenda-files))

Это хорошо. Единственная проблема заключается в том, что я не хотел бы уничтожать буфер, который был открыт до создания повестки дня. Таким образом, кажется, что правильное решение требует создания «круглого» совета.
Scaramouche

@scaramouche - В моем первоначальном тестировании, пересмотренный проект, кажется, делает то, что вы ищете - он включает в себя aroundс advice.
юрист

Теперь есть еще одна проблема: нажатие ввода в событии в повестке дня не открывает соответствующий файл. Может быть, нет хорошего способа реализовать это.
scaramouche

Да, это имеет смысл (теперь, когда я об этом думаю), потому что *Org-Agenda*буфер - это просто копия и вставка из org-agenda-files[вида, он фактически помещается в список, а затем реорганизуется и вставляется в *Org-Agenda*буфер]. При редактировании пользователь возвращается к оригиналу, org-agenda-filesчтобы выполнить редактирование, которое, как предполагают функции редактирования, уже открыто. Если вам действительно нужно org-agenda-filesзакрыть окно, когда оно не используется, вам нужно будет пересмотреть функции редактирования, чтобы открыть нужный файл, а затем снова закрыть его, когда закончите. Могут быть и другие проблемы
адвокат

1

После того, как вы открыли повестку дня, просто выйдите из нее, нажав x в буфере повестки дня в любое время. Если вы используете q для заполнения повестки дня, все буферы останутся открытыми.


3
Ваш ответ, по сути, является дубликатом, user2699который был опубликован 19 февраля 2016 г.
юрист

-1

Я переключился на новый рабочий процесс в режиме орг.

Ранее я использую:

  • NOTE.org в качестве основного хранилища для заметок произвольной формы, отредактированных вручную с привязкой клавиш для быстрого доступа к этому файлу
  • TODO.orgдля org-rememberили(lambda () (interactive) (org-capture nil "t"))

TODO.orgЯ посещаю только через C-c a a. Но NOTE.orgстановится не поддерживаемым с размером больше 1 МБ простого текста.

Поэтому я разделить этот файл по основным легким отмеченными темам, как LEARNING.org, PURCHASES.org, emacs-python.org, linux.org, vps.org, ...

Вместо того, чтобы поддерживать список возможных имен, я указал каталог:

(setq org-agenda-file-regexp "\\`[^.#].*[^_]\\.org\\'"
      org-agenda-files (list org-directory))

Я доволен этой настройкой, потому что я могу быстро найти необходимую тему, переключаясь в буфер (по IDO через осмысленное имя файла) и ища (по C-s) в ограниченном пространстве.

Все графики доступны C-c a aчерез все .orgфайлы.

Но теперь у меня есть много открытых неиспользуемых .orgфайлов, после C-c a aкоторых я должен убивать, когда они появляются во время переключения буфера.

Я думаю, что отчет об ошибке должен быть представлен:

http://debbugs.gnu.org/cgi/bugreport.cgi?archive=yes&bug=22734

24.5; do not leave opened org-agenda-files on org-agenda-list, etc.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.