org-refile a una ubicación fija conocida

11

Estoy tratando de escribir una función que tome un encabezado y la vuelva a colocar en una ubicación específica. El documento para org-refilees

(org-refile &optional GOTO DEFAULT-BUFFER RFLOC MSG)

y RFLOCes

RFLOC can be a refile location obtained in a different way.

pero no tengo idea de qué sería "una forma diferente" y he estado buscando en Google durante medio día y no he visto ningún ejemplo. Conozco el archivo y sé el título del objetivo, pero no sé la sintaxis para formarlo en lo que quiere. Lo más cerca que he llegado es:

(org-refile nil #("~/Org/bookmarks.org")

que luego me solicitará el título, pero por supuesto no quiero que me lo solicite, quiero proporcionarlo.

Soy nuevo en elisp y he adivinado cada sintaxis que se me ocurre. ¿Alguien sabe cómo expresar esto?

jtgd
fuente
Debe haber una manera de hacer lo que realmente quiere hacer aquí, pero si no lo encuentra, aquí hay una solución alternativa: stackoverflow.com/questions/7681326/…
Brian Z
Utilizo el siguiente fragmento para hacer lo que está buscando: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) probablemente no responderé a esto desde que me preguntó org-refile, pero el fragmento hace el trabajo bastante bien. Son los dos puntos dobles son necesarios. Lo uso todo el tiempo e incluso he creado una versión personalizada de org-archive-subtreepara suprimir el mensaje para que no tenga cientos de ellos cuando reorganizo automáticamente todo mi archivo de organización.
abogados
Gracias lawlist, este es un buen fragmento y probablemente lo usaré en otro contexto. Es bueno tenerlo documentado aquí.
jtgd

Respuestas:

9

Me he preguntado cómo debería ser RFLOC antes, pero nunca he investigado. Mirando el código fuente de la organización, debería ser una lista que consta de:

  • Bóveda
  • expediente
  • re (expresión regular)
  • pos (posición del rumbo objetivo)

No he experimentado con el reelemento, pero aquí hay una función simple que invocará org-refilecon un RFLOC construido a partir de un ARCHIVO y TÍTULO dado:

(defun my/refile (file headline)
  (let ((pos (save-excursion
               (find-file file)
               (org-find-exact-headline-in-buffer headline))))
    (org-refile nil nil (list headline file nil pos))))

Esto abre el archivo de destino y utiliza una función de organización para encontrar la posición del título de destino, luego construye la lista RFLOC para pasar org-refile.

glucas
fuente
5

Muchas gracias @glucas, he trabajado su solución en mi última. La información clave era conocer el formato del RFLOC. Experimenté con proporcionar una lista de nombre de archivo y texto de título, pero me faltaban esos otros elementos y el nulo adicional. Esto es lo que terminé con:

(defun jay/refile-to (file headline)
    "Move current headline to specified location"
    (let ((pos (save-excursion
                 (find-file file)
                 (org-find-exact-headline-in-buffer headline))))
      (org-refile nil nil (list headline file nil pos))))

(defun jay/refile-to-bookmarks ()
    "Move current headline to bookmarks"
    (interactive)
    (org-mark-ring-push)
    (jay/refile-to "~/Org/bookmarks.org" "New")
    (org-mark-ring-goto))

El documento de los save-excursionestados dice que seremos devueltos a la ubicación desde la que comenzamos, pero no parece funcionar de esa manera. Me deja en el destino objetivo, que podría ser apropiado para el general refile-to, pero quería que moviera la línea y permaneciera donde estaba, así que guardo y restauro dentro refile-to-bookmark.

El flujo de trabajo para el que está destinado es que empiezo con una lista de enlaces HTML que provienen de mi script para leer fuentes RSS. Originalmente hice que el script produjera archivos maildir para mu4e, pero me encontré simplemente siguiendo los enlaces a un navegador de todos modos y luego marcando los de interés, así que ahora solo genero una lista de ** [[uri][title]]líneas. Después de seguir el enlace de emacs al navegador uzbl, en lugar de marcar (que genera la misma forma de líneas), uso este comando para mover el enlace a bookmarks.org después de configurar las etiquetas. Solo un poco más rápido ya que también uso los comandos de velocidad de la organización, tpara etiquetar y bpara este comando. ¡Estoy feliz ahora y amo aprender más elisp!

jtgd
fuente
Un par de detalles, que no son directamente relevantes para lo que está haciendo aquí: el primer elemento del RFLOC puede ser cualquier cadena. Solo se usa como un nombre lógico para la ubicación de destino, que se muestra en el mensaje "rellenado a xxx". La ubicación está realmente definida por el archivo y el marcador de posición. El reelemento del RFLOC será ignorado, por lo que puedo decir. Se utiliza en algunas otras funciones en org.el que se ocupan de las ubicaciones de destino.
glucas
1
Por razones que no entiendo, yo era capaz de obtener su refile-tofunción para volver a la posición original añadiendo esto al final, después de la let: (switch-to-buffer (current-buffer)). Parece que no debería hacer nada, pero funciona para mí.
glucas
Gracias de nuevo @glucas. Sí, eso parece funcionar y he reemplazado mi -pushy -gotocon eso. Parece extraño que te quedes en otro búfer y, sin embargo, considera que el búfer actual es el anterior.
jtgd