Jak automatycznie zapisywać bufory w trybie organizacji?

22

Regularnie używam org-modei porządku dziennego, aby śledzić moją listę rzeczy do zrobienia. Ponieważ używam Dropbox do synchronizacji mojej listy, potrzebuję tych samych zadań, aby były dostępne na wszystkich komputerach. Czasami w trakcie mojego czyszczenia zapominam zapisać moje zmiany, pozostawiając emacsa otwarte w domu, kiedy wchodzę do biura (dlatego nie jestem monitowany o oszczędzanie po zamknięciu emacsa). Jak mogę automatycznie zapisywać zmiany w *.orgbuforach programu, które są modyfikowane w programie?

EDYCJA: Aby to wyjaśnić, używam widoku planu moich zadań, aby pokazać mi przegląd. Z tego widoku mogę zmienić status zadań. Dodatkowo używam trybu zapamiętywania, aby dodać nowe zadania, które można następnie przeklasyfikować w widoku planu. Te zmiany w programie powodują modyfikację buforów agendy w trybie organizacji, które należy następnie zapisać. Po dokonaniu tych zmian chciałbym, aby bufory były zapisywane automatycznie.

Ryan
źródło
Czy możesz wyjaśnić „Jak mogę automatycznie zapisywać zmiany w buforach * .org programu, które są modyfikowane w programie?” ? Nie mogę zdecydować, czy „automatycznie zapisze ... poprzez agendę” (co wydaje się wewnętrznie sprzeczne) lub „bufory, które zostaną zmodyfikowane przez agendę” (czego nie rozumiem)
Sigma
@ Sigma Zaktualizowałem pytanie, aby wyjaśnić.
Ryan
1
Moim dotychczasowym rozwiązaniem było ponowne trenowanie palców, aby sczęsto naciskać klawisz w widoku Agenda.
mankoff
@mankoff Wydaje mi się, że przekwalifikowałem się, by uderzyć za C-x C-skażdym razem, gdy wprowadzę jakiekolwiek zmiany w pliku org-agenda-file (z porządku obrad lub bezpośrednio). Nie automatyczne, ale zachowuje wszystko zapisane.
Jonathan Leech-Pepin

Odpowiedzi:

16

Byłby to szybki hack, który nie jestem pewien, czy zaspokoi twój przypadek użycia

(add-hook 'org-agenda-mode-hook
          (lambda ()
            (add-hook 'auto-save-hook 'org-save-all-org-buffers nil t)
            (auto-save-mode)))

Dopóki bufor agendy organizacji jest otwarty, wszystkie bufory organizacji będą okresowo zapisywane (jest to równoważne z tym, co by się stało, gdyby sbył naciskany regularnie z widoku agendy).

Jest to nieco nadużywające auto-save-mode, ponieważ sam bufor programu nie ma większego sensu auto-save.

Jeśli zdarzy ci się użyć tego hacka, lepiej upewnij się, że pliki kopii zapasowych są przechowywane dla wszystkich plików .org, aby być bezpiecznym.

Sigma
źródło
1
Poważnym problemem związanym z tym podejściem jest to, że automatyczne zapisywanie spowoduje zapisanie buforu programu do pliku w katalogu aktywnym. Stworzyło to ogromną liczbę osieroconych plików automatycznego zapisywania rozrzuconych po całym systemie plików. Nie jestem pewien, jak to naprawić.
holocronweaver 11.04.17
7

Możesz zapisać wszystkie bufory organizacji za każdym razem, gdy wywoływana jest określona funkcja programu. Na przykład, aby zapisać wszystkie bufory organizacji po wyjściu z programu:

(advice-add 'org-agenda-quit :before 'org-save-all-org-buffers)

Alternatywnie możesz zapisać wszystkie bufory organizacji po każdej edycji, powiedzmy po dodaniu terminu:

(advice-add 'org-deadline :after 'org-save-all-org-buffers)

Działa to zarówno w buforach organizacji, jak i buforach organizacji. Użyj org-agenda-deadlinezamiast tego, jeśli chcesz ograniczyć automatyczne zapisywanie do planu.

Możesz zrobić to samo dla dowolnej funkcji organizacji, więc ta metoda pozwala dokładnie wybrać, kiedy chcesz zapisać bufory organizacji. Podejście to obejmuje niektóre narożne przypadki, których brakuje w metodzie @Sigma: możesz zapisać swoje zmiany w agendzie, nawet jeśli opuścisz agendę wcześniej, aby auto-savemieć szansę na wyzwolenie lub wprowadzisz zmiany poza agendą i zapomnisz o ich zapisaniu. Osobiście używam obu metod, aby pokryć wszystkie moje bazy. [Edycja: Zobacz komentarz na temat rozwiązania @ Sigma, dlaczego już go nie używam.]

holocronweaver
źródło
2
To działało dla mnie lepiej niż zaakceptowana odpowiedź, ponieważ jedyny raz, kiedy zapomniałem oszczędzać, to po uzupełnieniu. (advice-add 'org-refile :after 'org-save-all-org-buffers)automatycznie zapisywałem pliki org po ponownym przejrzeniu różnych plików.
TEN UŻYTKOWNIK POTRZEBUJE POMOCY
To najlepsza odpowiedź, ponieważ można ją zastosować do dowolnych funkcji organizacji.
KevinG
Przekonałem się, że zastosowanie tego do org-refileoznacza, że ​​nie mogę już „przejść do” określonego nagłówka (w przeciwieństwie do org-refile
uzupełniania wiersza
6

Widzę wiele bardziej skomplikowanych odpowiedzi, to zadziałało dla mnie:

`(add-hook 'auto-save-hook 'org-save-all-org-buffers)`

Automatyczne zapisywanie domyślnie działa po 30 sekundach bezczynności (oraz w innych niepowiązanych scenariuszach udokumentowanych w instrukcji )

Karim Nassar
źródło
Dokładnie tego szukałem.
LVB
4

Używam następującego fragmentu, aby automatycznie zapisać wszystkie bufory trybu agendy po nowym przechwytywaniu, ale możesz zaczepić go w dowolnym miejscu:

(defun my/save-all-agenda-buffers ()
  "Function used to save all agenda buffers that are
currently open, based on `org-agenda-files'."
  (interactive)
  (save-current-buffer
    (dolist (buffer (buffer-list t))
      (set-buffer buffer)
      (when (member (buffer-file-name)
                    (mapcar 'expand-file-name (org-agenda-files t)))
        (save-buffer)))))

;; save all the agenda files after each capture
(add-hook 'org-capture-after-finalize-hook 'my/save-all-agenda-buffers)

Zmienić 'org-capture-after-finalize-hooksię 'org-agenda-finalize-hook, co wierzę, jest wywoływana tuż przed wyświetleniem bufor porządku obrad.

Lee H.
źródło
Zapomniałem wspomnieć, że moja funkcja wymaga dostępności dash.el, więc miej to na uwadze.
Lee H
2
Podczas przechwytywania możesz natychmiast ponownie złożyć pliki do dowolnego miejsca org-refile-targetsdocelowego, więc możliwe jest, że zapisanie org-agenda-filesnie jest wystarczające. Prawdopodobnie po prostu zadzwoniłbym do org-save-all-org-bufferssiebie.
sanityinc
1
PS Nie trzeba dashtam używać : mapcarjest wbudowany i robi to samo.
sanityinc
@sanityinc dzięki, zaktualizowałem kod do użycia mapcarzamiast kreski!
Lee H