Como salvo automaticamente os buffers do modo organizacional?

22

Uso regularmente org-modee a agenda para acompanhar minha lista de tarefas. Como uso o Dropbox para sincronizar minha lista, preciso que as mesmas tarefas estejam disponíveis em todos os computadores. Às vezes, durante o processo de limpeza, esquecerei de salvar minhas alterações, deixando o emacs aberto em casa quando vou ao escritório (portanto, não sou solicitado a economizar no fechamento do emacs). Como posso salvar automaticamente as alterações nos *.orgbuffers da agenda modificados pela agenda?

EDIT: Para esclarecer, eu uso a exibição da agenda das minhas tarefas para me mostrar uma visão geral. Nessa visão, eu posso alterar o status das tarefas. Além disso, uso o modo de lembrete para adicionar novas tarefas, que podem ser recategorizadas na exibição da agenda. Essas alterações na agenda resultam em buffers de agenda no modo organizacional modificados, que devem ser salvos. Quando essas alterações são feitas, eu gostaria que os buffers fossem salvos automaticamente.

Ryan
fonte
Você pode esclarecer "Como posso salvar automaticamente as alterações nos buffers da agenda * .org que são modificados pela agenda?" ? Eu não posso decidir se é "salvar automaticamente ... através da agenda" (que parece auto-contradizem) ou "buffers que são modificados por meio da agenda" (que eu não entendo)
Sigma
@Sigma Atualizei a questão para esclarecer.
Ryan
1
Até agora, minha solução foi treinar meus dedos para tocar a stecla frequentemente quando estiver no modo de exibição Agenda.
Mankoff
@mankoff Acho que me treinei para bater C-x C-ssempre que fizer alterações em um arquivo de agenda organizacional (da agenda ou diretamente). Não é automático, mas mantém tudo salvo.
Jonathan Leech-Pepin

Respostas:

16

Um hack rápido, que não tenho certeza de que satisfará seu caso de uso, seria

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

Enquanto o buffer da agenda da organização estiver aberto, todos os buffers da organização serão salvos periodicamente (é equivalente ao que aconteceria se spressionado regularmente a partir da exibição da agenda).

Isso é um pouco abusivo auto-save-mode, pois o próprio buffer da agenda não faz muito sentido no que diz auto-saverespeito.

Se você usar esse hack, é melhor garantir que os arquivos de backup sejam mantidos para que todos os seus arquivos .org estejam no lado seguro.

Sigma
fonte
1
Um grande problema dessa abordagem é que o salvamento automático salvará o buffer da agenda em um arquivo no diretório ativo. Isso criou um grande número de arquivos de salvamento automático órfãos espalhados pelo meu sistema de arquivos. Não tenho certeza de como remediar.
precisa
7

Você pode salvar todos os buffers da organização sempre que uma função específica da agenda for chamada. Por exemplo, para salvar todos os buffers da organização após sair da agenda:

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

Como alternativa, você pode salvar todos os buffers da organização após cada edição, digamos, após a adição de um prazo:

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

Isso funcionará tanto na agenda organizacional quanto nos buffers da organização. Use em org-agenda-deadlinevez disso, se você quiser restringir as gravações automáticas à agenda.

Você pode fazer o mesmo para qualquer função organizacional, portanto, esse método permite escolher exatamente quando salvar os buffers da organização. Essa abordagem abrange alguns casos esquecidos que o método do @Sigma perde: você pode salvar as alterações na agenda mesmo que saia da agenda antes que auto-saveela possa ser acionada, ou faça alterações fora da agenda e esqueça de salvá-las. Eu pessoalmente uso os dois métodos para cobrir todas as minhas bases. [Editar: Veja o comentário na solução @Sigma para saber por que eu não uso mais a solução dele.]

holocronweaver
fonte
2
Isso funcionou melhor para mim do que a resposta aceita, pois a única vez que esqueço de salvar é depois de refilar. (advice-add 'org-refile :after 'org-save-all-org-buffers)automaticamente salvei os arquivos org depois que eu refilei para arquivos diferentes.
ESTE USUÁRIO PRECISA DE AJUDA
Essa é a melhor resposta, pois pode ser aplicada a qualquer função organizacional que você desejar.
28917 KevinKit
Eu descobri que aplicar isso org-refilesignifica que eu não posso mais "Ir para" um determinado título (em vez de refilar o texto abaixo do cursor) chamando org-refilecom um argumento de prefixo.
quantum285
6

Vejo muitas respostas mais complicadas, isso funcionou para mim:

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

O Auto Save tem como padrão a execução após 30 segundos de inatividade (e em outros cenários não relacionados documentados no manual )

Karim Nassar
fonte
Exatamente o que eu estava procurando.
LVB
4

Eu uso o seguinte snippet para salvar automaticamente todos os buffers do modo agenda após uma nova captura, mas você pode conectá-lo em qualquer lugar que desejar:

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

Mude 'org-capture-after-finalize-hookpara 'org-agenda-finalize-hook, que acredito ser chamado pouco antes de exibir o buffer da agenda.

Lee H
fonte
Esqueci de mencionar que minha função exige que dash.el esteja disponível, portanto, lembre-se disso.
Lee H
2
Durante a captura, você pode registrar novamente os itens imediatamente em qualquer um dos org-refile-targetsdestinos, para que seja possível que a economia org-agenda-filesnão seja suficiente. Eu provavelmente org-save-all-org-buffersme chamaria .
sanityinc 30/09
1
PS Não há necessidade de usar dashlá: mapcarestá embutido e faz a mesma coisa.
sanityinc 30/09
@ Sanityinc obrigado, eu atualizei o código para usar em mapcarvez de traço!
Lee H