no mantenga abiertos los archivos de la agenda de la organización después de generar la agenda


14

La generación de la agenda de hoy en Org-Mode ( C-c a a) abre los archivos en org-agenda-files. No quiero que Emacs abra estos búferes adicionales.

¿Hay alguna manera fácil de decirle a Emacs que no abra estos búferes? (¿o qué es lo mismo, cerrarlos automáticamente si no estaban abiertos antes de llamar a la agenda?).

ACTUALIZAR:

Esta es una versión más compacta de la solución provista por @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)

Lamentablemente, esto todavía no es perfecto, ya que al hacer clic en un evento en la agenda no se abre el archivo de organización correspondiente.

Respuestas:


11

Usted desea org-agenda-exit, convenientemente vinculado a x por defecto en la vista de agenda

Como 'org-agenda-Quit', pero elimine cualquier búfer creado por la agenda. Los buffers de organización visitados directamente por el usuario no serán tocados.

Encontré esto usando describe-mode.


Sane responde aquí.
YoungFrog

1
Apreciar el puntero a describe-mode.
Matt

4

El org-agenda-filesbúfer (s) no debe eliminarse hasta que las funciones de búsqueda hayan finalizado. Los tres (3) la mayoría de las funciones de búsqueda comunes utilizados para generar un *Org Agenda*tampón son: org-agenda-list; org-search-view; y org-tags-view. org-agenda-fileses a la vez una variable y una función: dos animales diferentes, pero 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))

Eso es bueno. El único problema es que no me gustaría matar un búfer que estaba abierto antes de crear la agenda. Por lo tanto, parece que la solución correcta requiere la creación de un consejo "alrededor".
scaramouche

@scaramouche: en mi prueba inicial, el borrador revisado parece hacer lo que buscas: incorpora el aroundcon advice.
leyes

Ahora hay otro problema: presionar enter en un evento en la agenda no abre el archivo correspondiente. Tal vez no haya una buena manera de implementar esto.
scaramouche

Sí, eso tiene sentido (ahora que lo pienso) porque el *Org-Agenda*búfer es solo una copia y pega del org-agenda-files[tipo de, en realidad se inserta en una lista y luego se reorganiza e inserta en el *Org-Agenda*búfer]. Al editar, un usuario vuelve al original org-agenda-filespara realizar la edición, que las funciones de edición suponen que ya está abierta. Si realmente tiene que org-agenda-filescerrarlo cuando no esté en uso, deberá revisar las funciones de edición para abrir el archivo necesario y luego cerrarlo nuevamente cuando haya terminado. También puede haber otros problemas
ley

1

Después de abrir la agenda, simplemente salga presionando x en el búfer de la agenda en cualquier momento. Si usa q para completar la agenda, mantendrá abiertos todos los búferes.


3
Su respuesta es esencialmente un duplicado de user2699la publicada el 19 de febrero de 2016.
lawlist

-1

Cambié al nuevo flujo de trabajo del modo org.

Anteriormente uso:

  • NOTE.org como almacenamiento principal para notas de forma gratuita editadas a mano con enlace de teclas para acceder rápidamente a este archivo
  • TODO.orgpara org-remembero(lambda () (interactive) (org-capture nil "t"))

TODO.orgVisito solo via C-c a a. Pero NOTE.orgno se puede mantener con un tamaño superior a 1 MiB de texto sin formato.

Así que he dividido este archivo por temas principales distinguidos fácil, como LEARNING.org, PURCHASES.org, emacs-python.org, linux.org, vps.org, ...

En lugar de mantener la lista de posibles nombres, he especificado el directorio:

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

Estoy contento con esta configuración porque puedo encontrar rápidamente el tema necesario al cambiar al búfer (por IDO a través de un nombre de archivo significativo) y buscar (por C-s) en un espacio limitado.

Todos los horarios están disponibles en C-c a atodos los .orgarchivos.

Pero ahora tengo muchos .orgarchivos abiertos no utilizados , después de lo C-c a acual debería matarlos cuando aparezcan durante los cambios de búfer.

Creo que el informe de error debe enviarse:

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.