nie przechowuj plików org-agenda-open po wygenerowaniu agendy

14

Generowanie dzisiejszego programu w trybie Org ( C-c a a) otwiera pliki org-agenda-files. Nie chcę, aby Emacs otwierał te dodatkowe bufory.

Czy jest prosty sposób powiedzieć Emacsowi, aby nie otwierał tych buforów? (lub co to samo, aby automatycznie je zamknąć, jeśli nie były otwarte przed wywołaniem agendy?).

AKTUALIZACJA:

To jest bardziej kompaktowa wersja rozwiązania dostarczonego przez @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)

Niestety, nadal nie jest to idealne, ponieważ teraz kliknięcie wydarzenia w programie nie powoduje otwarcia odpowiedniego pliku organizacji.

scaramouche
źródło

Odpowiedzi:

11

Chcesz org-agenda-exit, dogodnie przypisany domyślnie do x w widoku planu

Jak `org-agenda-Quit ', ale zabij wszystkie bufory utworzone przez agendę. Bufory organizacji odwiedzane bezpośrednio przez użytkownika nie zostaną dotknięte.

Znalazłem to za pomocą describe-mode.

użytkownik2699
źródło
Zdrowa odpowiedź tutaj.
YoungFrog,
1
Doceń wskaźnik do describe-mode.
Matt
4

org-agenda-filesBufor (y) powinny nie być zabity dopiero po zakończeniu funkcji wyszukiwania. Trzy (3) najczęściej używane funkcje wyszukiwania używane do generowania *Org Agenda*bufora to org-agenda-list:; org-search-view; a org-tags-view. org-agenda-filesjest zarówno zmienną, jak i funkcją - dwoma różnymi, ale spokrewnionymi zwierzętami.

(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))
lista prawnicza
źródło
Dobre. Jedynym problemem jest to, że nie chciałbym zabić bufora, który był otwarty przed utworzeniem programu. Wydaje się zatem, że właściwe rozwiązanie wymaga stworzenia porady „wokół”.
scaramouche
@scaramouche - W moim wstępnych testów, poprawiony projekt wydaje się robić to, co to jest, że szukasz - to wciela aroundsię advice.
prawnik
Teraz jest inny problem: naciśnięcie Enter w wydarzeniu w programie nie powoduje otwarcia odpowiedniego pliku. Może nie ma dobrego sposobu na wdrożenie tego.
scaramouche
Tak, to ma sens (teraz, gdy o tym myślę), ponieważ *Org-Agenda*bufor jest tylko kopią i wklejeniem z org-agenda-files[rodzaju, jest on właściwie wypychany na listę, a następnie reorganizowany i wstawiany do *Org-Agenda*bufora]. Podczas edycji użytkownik przeskakuje z powrotem do oryginału, org-agenda-filesaby dokonać edycji, która, jak zakładają funkcje edycji, jest już otwarta. Jeśli naprawdę musisz org-agenda-fileszamknąć, gdy nie jest używany, musisz zmodyfikować funkcje edycji, aby otworzyć potrzebny plik, a następnie zamknąć go ponownie po zakończeniu. Mogą też występować inne problemy
prawnik
1

Po otwarciu programu wystarczy wyjść z niego, naciskając x w buforze programu w dowolnym momencie. Jeśli użyjesz q do porządkowania programu, wszystkie bufory pozostaną otwarte.

Diogo
źródło
3
Twoja odpowiedź jest zasadniczo duplikatem tego, user2699który został opublikowany 19 lutego 2016 r.
lista prawników
-1

Przełączyłem się na nowy przepływ pracy w trybie org.

Wcześniej używam:

  • NOTE.org jako główna pamięć dla notatek w dowolnej formie edytowanych ręcznie z kluczem do szybkiego dostępu do tego pliku
  • TODO.orgdla org-rememberlub(lambda () (interactive) (org-capture nil "t"))

TODO.orgOdwiedzam tylko przez C-c a a. Ale NOTE.orgstają się niemożliwe do utrzymania przy rozmiarze większym niż 1 MiB zwykłego tekstu.

Więc podzielić ten plik przez wybitnych głównych łatwych tematów, jak LEARNING.org, PURCHASES.org, emacs-python.org, linux.org, vps.org, ...

Zamiast utrzymywać listę możliwych nazw, podałem katalog:

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

Jestem zadowolony z tej konfiguracji, ponieważ mogę szybko znaleźć potrzebny temat, przechodząc do bufora (według IDO poprzez znaczącą nazwę pliku) i wyszukując (według C-s) w ograniczonej przestrzeni.

Wszystkie harmonogramy dostępne za C-c a apośrednictwem wszystkich .orgplików.

Ale teraz mam wiele otwartych nieużywanych .orgplików, po C-c a aktórych powinienem zabijać, gdy pojawiają się podczas przełączania buforów.

Myślę, że raport o błędzie powinien zostać przesłany:

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.
gavenkoa
źródło