Як автоматично зберігати буфери OR-режиму?


22

Я регулярно використовую org-modeта порядок денний, щоб відстежувати свій список справ. Оскільки я використовую Dropbox для синхронізації списку, мені потрібні однакові завдання, щоб бути доступними на всіх комп’ютерах. Іноді під час прибирання я забуду зберегти свої зміни, залишаючи emacs відкритими вдома, коли я заходжу в офіс (таким чином, мені не пропонується економити на закритті emacs). Як я можу автоматично зберігати зміни в *.orgбуферах порядку денного, які змінюються через порядок денний?

EDIT: Для уточнення я використовую подання порядку денного своїх завдань, щоб показати мені огляд. З цього погляду я можу змінити статус завдань. Крім того, я використовую режим пам'яті для додавання нових завдань, які потім можуть бути перекомпоновані у поданні порядку денного. Ці зміни порядку денного призводять до модифікованих буферів порядку денного в режимі org, які потім необхідно зберегти. Коли ці зміни будуть внесені, я хотів би, щоб буфери зберігалися автоматично.


Чи можете ви уточнити "Як я можу автоматично зберігати зміни до * .org буферів порядку денного, які змінюються через порядок денний?" ? Я не можу вирішити, чи це "автоматично зберегти ... через порядок денний" (який, здається, суперечить) або "буфери, які змінюються через порядок денний" (що я не розумію)
Sigma

@Sigma Я оновив питання, щоб уточнити.
Райан

1
Наразі моїм рішенням було перевчити пальці, щоб sчасто натискати клавішу під час перегляду порядку денного.
mankoff

@mankoff Я думаю, що я перекваліфікувався, щоб потрапити в C-x C-sбудь-який час, коли я вносив будь-які зміни у файл-порядку денного (з порядку денного чи безпосередньо). Не є автоматичним, але зберігає все збережене.
Джонатан Ліч-Пепін

Відповіді:


16

Швидкий злом, який я не впевнений, задовольнить ваше використання

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

Поки буфер Org порядку денного відкритий, всі органні буфери періодично зберігатимуться (це еквівалентно тому, що буде, якщо sрегулярно натискати з виду порядку денного).

Це дещо зловживає auto-save-modeтим, що сам буфер порядку денного не має великого сенсу auto-save.

Якщо ви випадково використовуєте цей хак, краще переконайтеся, що збережені файли резервного копіювання для всіх .org-файлів, щоб вони були надійними.


1
Основна проблема такого підходу полягає в тому, що автоматичне збереження збереже буфер порядку денного у файлі в активному каталозі. Це створило величезну кількість осиротілих файлів автоматичного збереження, розкиданих по моїй файловій системі. Не знаєте, як виправити.
holocronweaver

7

Ви можете зберігати всі буфери org кожного разу, коли викликається певна функція порядку денного. Наприклад, щоб зберегти всі буфери org після виходу з порядку денного:

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

Крім того, ви можете зберегти всі org-буфери після кожного редагування, скажімо, після додавання терміну:

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

Це буде працювати як в порядку денного, так і в органах. Використовуйте org-agenda-deadlineнатомість, якщо ви хочете обмежити автоматичне збереження порядку денного.

Ви можете зробити те ж саме для будь-якої функції org, тому цей метод дозволяє точно вибрати, коли зберігати org буфери. Цей підхід охоплює деякі основні випадки, у яких метод @Sigma відсутній: ви можете зберегти зміни у порядку денному, навіть якщо ви вийдете з порядку денного, перш ніж auto-saveбуде можливість викликати або внести зміни за межі порядку денного і забути їх зберегти. Я особисто використовую обидва методи для покриття всіх моїх підстав. [Редагувати: Дивіться коментар до рішення @Sigma, чому я більше не використовую його рішення.]


2
Це працювало для мене краще, ніж прийнята відповідь, оскільки єдиний раз, коли я забуваю зберегти, - це після перепрофілювання. (advice-add 'org-refile :after 'org-save-all-org-buffers)автоматично зберігав org файли після того, як я переправлявся в різні файли.
ЦЕ ПОТРІБНИЦЯ ПОТРІБНА ДОПОМОГА

Це найкраща відповідь, оскільки вона може бути застосована до будь-яких організаційних функцій.
KevinG

Я виявив, що застосувати це org-refileозначає, що я більше не можу "перейти" до певного заголовка (на відміну від повторного введення під курсором), зателефонувавши org-refileз аргументом префікса ..
quantum285

6

Я бачу багато складних відповідей, це працювало для мене:

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

Автоматичне збереження за замовчуванням на роботі після 30 секунд бездіяльності (та в інших непов'язаних сценаріях, задокументованих в посібнику )


Саме те, що я шукав.
LVB

4

Я використовую наступний фрагмент, щоб автоматично зберігати всі буфери режиму порядку денного після нового захоплення, але ви можете підключити його де завгодно:

(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)

Зміна 'org-capture-after-finalize-hookдо 'org-agenda-finalize-hook, якому я вірю , викликається безпосередньо перед відображенням порядку буфера.


Забув згадати, що моя функція вимагає наявності dash.el, тому пам’ятайте про це.
Лі Н

2
Під час захоплення ви можете негайно повторно подати предмети до будь-якого з org-refile-targetsпунктів призначення, тому можливо збереження org-agenda-filesнедостатньо. Я, мабуть, просто подзвонив би org-save-all-org-buffersсобі.
sanityinc

1
PS Тут не потрібно використовувати dash: mapcarвбудований і робить те саме.
sanityinc

@sanityinc дякую, я оновив код, щоб використовувати mapcarзамість тире!
Лі Н
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.