org-refile an einen bekannten festen Ort

11

Ich versuche, eine Funktion zu schreiben, die eine Überschrift nimmt und sie an einem bestimmten Ort neu abfasst. Das Dokument für org-refileist

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

und RFLOCist

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

Aber ich habe keine Ahnung, was "ein anderer Weg" wäre, und ich habe einen halben Tag gegoogelt und keine Beispiele gesehen. Ich kenne die Datei und die Überschrift für das Ziel, aber ich kenne die Syntax nicht, um daraus das zu formen, was es will. Das nächste, was ich bekommen habe, ist:

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

Das wird mich dann zur Überschrift auffordern, aber natürlich möchte ich nicht, dass es mich auffordert, ich möchte es bereitstellen.

Ich bin neu bei elisp und habe jede Syntax erraten, die mir einfällt. Weiß jemand, wie man das ausdrückt?

jtgd
quelle
Es muss eine Möglichkeit geben, hier das zu tun, was Sie eigentlich wollen, aber wenn Sie es nicht finden, finden Sie hier eine Problemumgehung
Brian Z
Ich verwende das folgende Snippet, um das zu tun, was Sie suchen: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) Ich werde dies wahrscheinlich nicht in eine Antwort umsetzen, da Sie danach gefragt haben org-refile, aber das Snippet macht den Job ganz gut. Die beiden Doppelpunkte werden benötigt. Ich benutze dies die ganze Zeit und habe sogar eine benutzerdefinierte Version von erstellt org-archive-subtree, um die Nachricht zu unterdrücken, sodass ich nicht Hunderte davon habe, wenn ich meine gesamte Organisationsdatei automatisch neu organisiere.
Lawlist
Danke Lawlist, das ist ein netter Ausschnitt und ich werde ihn wahrscheinlich in einem anderen Kontext verwenden. Gut, dass es hier dokumentiert ist.
jtgd

Antworten:

9

Ich habe mich schon gefragt, wie RFLOC aussehen soll, habe es aber nie untersucht. Wenn Sie sich den Quellcode der Organisation ansehen, sollte es sich um eine Liste handeln, die Folgendes umfasst:

  • Überschrift
  • Datei
  • re (regulärer Ausdruck)
  • pos (Position der Zielüberschrift)

Ich habe nicht mit dem reElement experimentiert , aber hier ist eine einfache Funktion, die org-refilemit einem RFLOC aufgerufen wird, das aus einer bestimmten DATEI und HEADING erstellt wurde:

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

Dadurch wird die Zieldatei geöffnet und mithilfe einer Organisationsfunktion die Position der Zielüberschrift ermittelt. Anschließend wird die RFLOC-Liste erstellt, an die übergeben werden soll org-refile.

Glucas
quelle
5

Vielen Dank @glucas, ich habe Ihre Lösung in meine endgültige eingearbeitet. Die Schlüsselinformation war die Kenntnis des Formats des RFLOC. Ich habe mit der Bereitstellung einer Liste mit Dateinamen und Überschriftentext experimentiert, aber mir fehlten diese anderen Elemente und das zusätzliche Null. Das ist, was ich am Ende hatte:

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

Das Dokument für save-excursiongibt an, dass wir an den Ort zurückgebracht werden, an dem wir begonnen haben, aber es scheint nicht so zu funktionieren. Es lässt mich am Zielort, was für den General angemessen sein könnte refile-to, aber ich wollte nur, dass es die Linie verschiebt und dort bleibt, wo ich war, damit ich darin speichere und wiederherstelle refile-to-bookmark.

Der Workflow, für den dies gedacht ist, besteht darin, dass ich mit einer Liste von HTML-Links beginne, die aus meinem Skript zum Lesen von RSS-Feeds stammen. Ich ließ das Skript ursprünglich Maildir-Dateien für mu4e erstellen, folgte jedoch ohnehin nur den Links zu einem Browser und setzte dann Lesezeichen für die interessierenden, sodass ich jetzt nur eine Liste von ** [[uri][title]]Zeilen generiere . Nachdem ich dem Link von emacs zum uzbl-Browser gefolgt bin, verwende ich diesen Befehl, um den Link nach dem Setzen von Tags zu meinem bookmarks.org zu verschieben, anstatt Lesezeichen zu setzen (die dieselbe Form von Zeilen erzeugen). Nur ein bisschen schneller, da ich auch die org speed-Befehle verwende, tum und bfür diesen Befehl zu markieren . Ich bin jetzt glücklich und liebe es, mehr Elisp zu lernen!

jtgd
quelle
Ein paar Details, die für Ihre Arbeit hier nicht direkt relevant sind: Das erste Element des RFLOC kann tatsächlich eine beliebige Zeichenfolge sein. Es wird nur als logischer Name für den Zielspeicherort verwendet, der in der Nachricht "Refiled to xxx" angezeigt wird. Der Ort wird wirklich nur durch die Datei und die Positionsmarkierung definiert. Das reElement des RFLOC wird ignoriert, soweit ich das beurteilen kann. Es wird in einigen anderen Funktionen in org.el verwendet, die sich mit Zielpositionen befassen.
Glucas
1
Aus Gründen, die ich nicht verstehe, konnte ich Ihre refile-toFunktion dazu bringen, zur ursprünglichen Position zurückzukehren, indem ich diese am Ende nach dem let: hinzufügte (switch-to-buffer (current-buffer)). Dies scheint, als sollte es nichts tun, aber es funktioniert für mich.
Glucas
Nochmals vielen Dank @glucas. Ja, das scheint zu funktionieren und ich habe mein -pushund -gotodamit ersetzt. Es scheint seltsam, dass Sie sich in einem anderen Puffer befinden, und dennoch wird der aktuelle Puffer als der vorherige betrachtet.
Jtgd