não mantenha os arquivos da agenda organizacional abertos após gerar a agenda


14

A geração da agenda de hoje no Org-Mode ( C-c a a) abre os arquivos org-agenda-files. Não quero que o Emacs abra esses buffers extras.

Existe uma maneira fácil de dizer ao Emacs para não abrir esses buffers? (ou o que é o mesmo, para fechá-los automaticamente se eles não estivessem abertos antes de chamar a agenda?).

ATUALIZAR:

Esta é uma versão mais compacta da solução fornecida pelo @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)

Lamentavelmente, isso ainda não é perfeito, pois agora, clicar em um evento na agenda não abre o arquivo organizacional correspondente.

Respostas:


11

Você deseja org-agenda-exit, convenientemente vinculado a x por padrão na visualização da agenda

Como o `org-agenda-Quit ', mas mate os buffers criados pela agenda. Os buffers da organização visitados diretamente pelo usuário não serão tocados.

Eu encontrei isso usando describe-mode.


Sane responda aqui.
YoungFrog

1
Aprecie o ponteiro para describe-mode.
Matt

4

Os org-agenda-filesbuffers não devem ser eliminados até que as funções de pesquisa sejam concluídas. Os três (3) a maioria das funções de pesquisa comum utilizados para gerar um *Org Agenda*tampão são os seguintes: org-agenda-list; org-search-view; e org-tags-view. org-agenda-filesé uma variável e uma função - dois animais diferentes, mas relacionados.

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

Isso é bom. O único problema é que eu não gostaria de eliminar um buffer que estava aberto antes de criar a agenda. Assim, parece que a solução certa requer a criação de um conselho "em torno".
scaramouche

@scaramouche - No meu teste inicial, o rascunho revisado parece fazer o que você está procurando - ele incorpora o aroundcom advice.
Lawlist

Agora, há outro problema: pressionar enter em um evento na agenda não abre o arquivo correspondente. Talvez não haja uma maneira legal de implementar isso.
scaramouche

Sim, isso faz sentido (agora que penso nisso) porque o *Org-Agenda*buffer é apenas uma cópia e cola do org-agenda-files[tipo de, ele é realmente empurrado para uma lista e depois reorganizado e inserido no *Org-Agenda*buffer]. Ao editar, um usuário volta ao original org-agenda-filespara fazer a edição, que as funções de edição assumem já estar aberta. Se você realmente precisar fechar a org-agenda-filestela quando não estiver em uso, precisará revisar as funções de edição para abrir o arquivo necessário e depois fechá-lo novamente quando terminar. Também pode haver outros problemas
lawlist

1

Depois de abrir a agenda, basta sair dela pressionando x no buffer da agenda a qualquer momento. Se você usar q na agenda, manterá todos os buffers abertos.


3
A sua resposta é escentially uma duplicata user2699que foi publicado em 19 de Fevereiro de 2016.
lawlist

-1

Mudei para o novo fluxo de trabalho no modo organizacional.

Anteriormente eu uso:

  • NOTE.org como armazenamento principal para notas de forma livre editadas manualmente com encadernação de teclas para acesso rápido a este arquivo
  • TODO.orgpara org-rememberou(lambda () (interactive) (org-capture nil "t"))

TODO.orgEu visito apenas via C-c a a. Mas NOTE.orgtorne-se inalterável com tamanho maior que 1 MiB de texto sem formatação.

Então eu dividir este arquivo principais temas distintos fáceis, como LEARNING.org, PURCHASES.org, emacs-python.org, linux.org, vps.org, ...

Em vez de manter a lista de nomes possíveis, especifiquei o diretório:

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

Fico feliz com essa configuração, pois posso encontrar rapidamente o tópico necessário, alternando para o buffer (por IDO, através de um nome de arquivo significativo) e pesquisando (por C-s) em espaço limitado.

Todas as agendas disponíveis C-c a aem todos os .orgarquivos.

Mas agora tenho muitos .orgarquivos não utilizados abertos, após os C-c a aquais devo matar quando eles aparecerem durante as opções de buffer.

Eu acho que esse relatório de bug deve ser enviado:

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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.