org-refile in una posizione fissa nota


11

Sto provando a scrivere una funzione che prenderà un'intestazione e la refili in una posizione specifica. Il documento per org-refileè

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

ed RFLOCè

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

ma non ho idea di quale sarebbe "un modo diverso" e sto googling da mezza giornata e non ho visto alcun esempio. Conosco il file e conosco il titolo del target, ma non conosco la sintassi per trasformarlo in quello che vuole. Il più vicino che ho ottenuto è:

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

che poi mi chiederà il titolo, ma ovviamente non voglio che mi spinga, voglio fornirlo.

Sono nuovo di Elisp e ho indovinato ogni sintassi che mi viene in mente. Qualcuno sa come pronunciare questo?


Deve esserci un modo per fare ciò che realmente vuoi qui, ma se non lo trovi, ecco una soluzione alternativa: stackoverflow.com/questions/7681326/…
Brian Z

Uso il seguente frammento per fare quello che stai cercando: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) probabilmente non lo inserirò in una risposta da quando mi hai chiesto org-refile, ma il frammento fa abbastanza bene il lavoro. Sono necessari i due punti . Lo uso sempre e ho persino creato una versione personalizzata di org-archive-subtreesopprimere il messaggio in modo che non ne abbia centinaia quando riorganizzo automaticamente il mio intero file organizzativo.
elenco delle leggi

Grazie alla lista della legge, questo è un bel frammento e probabilmente lo userò in un altro contesto. Buono per averlo documentato qui.
jtgd

Risposte:


9

Mi sono chiesto come dovrebbe apparire RFLOC prima, ma non ho mai studiato. Guardando il codice sorgente dell'organizzazione, dovrebbe essere un elenco composto da:

  • intestazione
  • file
  • re (espressione regolare)
  • pos (posizione della rotta target)

Non ho sperimentato l' reelemento, ma ecco una semplice funzione che invocherà org-refileun RFLOC costruito da un dato FILE e HEADING:

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

Questo apre il file di destinazione e utilizza una funzione org per trovare la posizione del titolo di destinazione, quindi crea l'elenco RFLOC a cui passare org-refile.


5

Grazie mille @glucas, ho elaborato la tua soluzione nel mio ultimo. Le informazioni chiave erano conoscere il formato di RFLOC. Ho sperimentato fornendo un elenco di nome file e testo del titolo, ma mi mancavano quegli altri elementi e il nulla in più. Questo è quello che ho finito 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))

Il documento per save-excursionafferma che saremo riportati nella posizione da cui siamo partiti, ma non sembra funzionare in questo modo. Mi lascia nella destinazione target, che potrebbe essere appropriata per il generale refile-to, ma volevo solo che facesse muovere la linea e rimanere dove mi trovavo, quindi salvo e ripristino all'interno refile-to-bookmark.

Il flusso di lavoro per cui è inteso è che inizio con un elenco di collegamenti HTML che provengono dal mio script per la lettura di feed RSS. Inizialmente avevo la sceneggiatura che produceva file maildir per mu4e, ma mi sono ritrovato a seguire comunque i collegamenti a un browser e quindi a aggiungere i segnalibri a quelli di interesse, quindi ora ho appena generato un elenco di ** [[uri][title]]righe. Dopo aver seguito il collegamento da emacs al browser uzbl, invece di aggiungere un segnalibro (che genera la stessa forma di linee) uso questo comando per spostare il collegamento sul mio bookmarks.org dopo aver impostato i tag. Solo un po 'più veloce poiché utilizzo anche i comandi speed dell'organizzazione, tper taggare e bper questo comando. Sono felice ora e amo imparare di più elisp!


Un paio di dettagli, non direttamente rilevanti per quello che stai facendo qui: il primo elemento di RFLOC può effettivamente essere qualsiasi stringa. Viene utilizzato solo come nome logico per la posizione di destinazione, mostrato nel messaggio "refiled to xxx". La posizione è definita semplicemente dal file e dall'indicatore di posizione. L' reelemento della RFLOC verrà ignorato, per quanto ne so. È utilizzato in alcune altre funzioni in org.el che si occupano delle posizioni di destinazione.
glucas,

1
Per ragioni che non capisco, sono stato in grado di ottenere la vostra refile-tofunzione per tornare alla posizione originale con l'aggiunta di questo alla fine, dopo il let: (switch-to-buffer (current-buffer)). Sembra che non dovrebbe fare nulla, ma funziona per me.
glucas,

Grazie ancora @glucas. Sì, sembra che funzioni e ho sostituito il mio -pushe -gotoquello. Sembra strano che tu sia lasciato in un altro buffer e tuttavia considera il buffer corrente come quello precedente.
jtgd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.