Как автоматически сохранить буферы в режиме орг?

22

Я регулярно использую org-modeи повестку дня, чтобы отслеживать мой список дел. Поскольку я использую Dropbox для синхронизации своего списка, мне нужно, чтобы одни и те же задачи были доступны на всех компьютерах. Иногда в ходе моей очистки я забываю сохранить свои изменения, оставляя emacs открытым дома, когда я иду в офис (поэтому мне не предлагается экономить на закрытии emacs). Как я могу автоматически сохранять изменения в *.orgбуферах повестки дня, которые изменяются через повестку дня?

РЕДАКТИРОВАТЬ: Чтобы уточнить, я использую повестку дня моих задач, чтобы показать мне обзор. С этой точки зрения, я могу изменить статус задач. Кроме того, я использую режим запоминания для добавления новых задач, которые затем можно перегруппировать в виде повестки дня. Эти изменения в повестке дня приводят к измененным буферам повестки дня в режиме org, которые затем должны быть сохранены. Когда эти изменения будут сделаны, я бы хотел, чтобы буферы сохранялись автоматически.

Райан
источник
Не могли бы вы уточнить: «Как я могу автоматически сохранять изменения в буферах повестки дня * .org, которые изменяются с помощью повестки дня?» ? Я не могу решить, будет ли это «автоматически сохранять ... через повестку дня» (что, по-видимому, противоречит самому себе) или «буферы, которые изменяются с помощью повестки дня» (что я не понимаю)
Sigma
@ Сигма Я обновил вопрос, чтобы уточнить.
Райан
1
Мое решение до сих пор состояло в том, чтобы заново натренировать мои пальцы, чтобы они sчасто нажимали на клавиши в режиме просмотра Повестки дня.
Mankoff
@mankoff Я думаю, что я переучил себя наносить удары C-x C-sкаждый раз, когда я делаю какие-либо изменения в файле org-повестки дня (из повестки дня или напрямую). Не автоматически, но сохраняет все сохраненным.
Джонатан Лич-Пепин

Ответы:

16

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

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

Пока буфер повестки дня Org открыт, все буферы org будут периодически сохраняться (это эквивалентно тому, что происходило бы, если бы sрегулярно нажимать в представлении повестки дня).

Это несколько злоупотребляет auto-save-modeтем, что сам буфер повестки дня не имеет особого смысла в auto-saveэтом отношении.

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

Сигма
источник
1
Основная проблема этого подхода заключается в том, что автосохранение сохранит буфер повестки дня в файл в активном каталоге. Это создало огромное количество осиротевших файлов автосохранения, разбросанных по моей файловой системе. Не уверен, как исправить.
holocronweaver
7

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

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

Кроме того, вы можете сохранить все орг-буферы после каждого редактирования, например, после добавления крайнего срока:

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

Это будет работать как в орг-повестке дня, так и в орг-буферах. Используйте org-agenda-deadlineвместо этого, если вы хотите ограничить автосохранение в повестке дня.

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

holocronweaver
источник
2
Это сработало для меня лучше, чем принятый ответ, так как я забываю сохранить только после пересылки. (advice-add 'org-refile :after 'org-save-all-org-buffers)автоматически сохраняет файлы org после того, как я перекомпилировал их в другие файлы.
Этому ПОЛЬЗОВАТЕЛЮ НУЖНА ПОМОЩЬ
Это лучший ответ, так как он может быть применен к любой функции организации, которую вы хотите.
KevinG
Я обнаружил, что применение этого к org-refileзначению означает, что я больше не могу «перейти» к определенному заголовку (в отличие от перезаписи заголовка под курсором), вызывая org-refileс префиксным аргументом ..
Quantum 285
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вместо тире!
Ли Х