生成议程后不要打开组织议程文件


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)

遗憾的是,这仍然不是完美的,因为现在单击议程中的事件无法打开相应的组织文件。

Answers:


11

您想要org-agenda-exit在默认情况下在议程视图中方便地绑定到x

就像“ org-agenda-Quit”一样,但是杀死由议程创建的所有缓冲区。用户直接访问的组织缓冲区不会被触及。

我发现使用describe-mode


Sane在这里回答。
YoungFrog

1
感谢指向的指针describe-mode
马特

4

org-agenda-files缓冲区(一个或多个)应被杀死,直到后的搜索功能已经完成。三(3)最常见的搜索用于生成功能*Org Agenda*缓冲器是: org-agenda-list; org-search-view; 和org-tags-vieworg-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 2014年

@scaramouche-在我的初始测试中,修订后的草案似乎可以满足您的要求- around与结合在一起advice
法律列表

现在还有另一个问题:在议程中的事件中按Enter键不会打开相应的文件。也许没有实现它的好方法。
scaramouche 2014年

是的,这是有道理的(现在我已经考虑过了),因为*Org-Agenda*缓冲区只是org-agenda-files[种类,实际上是复制并粘贴到列表中,然后重新组织并插入到*Org-Agenda*缓冲区中] 的复制和粘贴。编辑时,用户跳回到原始位置org-agenda-files进行编辑,编辑功能假定该编辑已打开。如果确实需要org-agenda-files在不使用时关闭文件,则需要修改编辑功能以打开所需的文件,然后在完成后再次将其关闭。可能还存在其他问题
律师名单

1

打开议程后,只要随时在议程缓冲区中按x即可退出。如果使用q来安排议程,它将使所有缓冲区保持打开状态。


3
您的回答从小角度上是重复user2699于2016
。–法律列表

-1

我切换到新的组织模式工作流程。

以前我使用:

  • NOTE.org 作为免费格式笔记的主要存储空间,这些备注可以手工编辑,并具有可快速访问该文件的键绑定
  • TODO.orgorg-remember(lambda () (interactive) (org-capture nil "t"))

TODO.org我只能通过访问C-c a a。但NOTE.org变得无法维持,其大小大于纯文本的1 MiB。

所以我分裂由主要容易区分的主题文件,如LEARNING.orgPURCHASES.orgemacs-python.orglinux.orgvps.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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.