Organisationslink erhalten, um die Linkbeschreibung automatisch einzufügen?

11

F: Wie kann ich eine benutzerdefinierte orgLinkfunktion zum automatischen Einfügen einer Beschreibung erhalten?

Ich möchte orgLinks zu Dateien in einem diredPuffer speichern , möchte jedoch, dass die Linkbeschreibung der Dateiname ohne Pfad ist, anstatt den vollständigen Pfad zu melden, dh:

file:~/the/full/path/myfile.ext     ; default, but no thanks
myfile.ext                          ; what I want

Jetzt: org-store-linkHardcodes von dired, um die Standardeinstellung bereitzustellen. Stattdessen habe ich eine benutzerdefinierte Funktion geschrieben (Cribbing von der fest codierten Funktion) und sie hinzugefügt zu org-store-link-functions:

(defun dired-store-link ()
  (when (derived-mode-p 'dired-mode)
    (let ((file (dired-get-filename nil t)))
      (setf file (if file
                     (abbreviate-file-name (expand-file-name file))
                   default-directory))
      (org-store-link-props :type        "dired"
                            :link        file
                            :description (file-name-nondirectory file))
      file)))

(add-to-list 'org-store-link-functions #'dired-store-link)

So weit so gut und es funktioniert wie erwartet, aber zum einen:

  • Beim Aufrufen org-insert-linkmit dem integrierten Standardverhalten wird der Link einfach eingefügt, ohne dass ich nach einer Beschreibung gefragt werde.
  • Wenn org-insert-linkich mit meiner benutzerdefinierten Funktion aufrufe, werde ich aufgefordert, eine Beschreibung einzugeben (die korrekt mit dem in der :descriptionEigenschaft gespeicherten Dateinamen gefüllt wird ).

Ich möchte lieber nicht jedes Mal zur Beschreibung aufgefordert werden und möchte org-insert-linkden Wert verwenden :description, den die benutzerdefinierten Funktionen festlegen.

Wie kann ich überzeugen org-insert-link, das :descriptionautomatisch zu verwenden, ohne mich dazu aufzufordern?

Dan
quelle
Helfen die optionalen Argumente link-locationoder default-descriptionin der Funktion org-insert-link? Wenn der Parameter LINK-LOCATION nicht Null ist, wird dieser Wert als Verbindungsposition verwendet, anstatt eine interaktiv zu lesen. Wenn der Parameter DEFAULT-DESCRIPTION nicht null ist, wird dieser Wert als Standardbeschreibung verwendet.
Lawlist
@lawlist: Danke für den Vorschlag, obwohl ich nicht sicher bin, wie ich ihn interaktiv verwenden würde, ohne ihn in eine andere Funktion zu packen. Es brachte mich jedoch dazu, die Dokumentation genauer zu lesen, was mich zu einer Art Antwort brachte.
Dan

Antworten:

4

Am unteren Rand des Dokumentstrings org-insert-linkist ein Hinweis vergraben , der:

Wenn dies org-make-link-description-functionnicht Null ist, wird diese Funktion mit dem Linkziel aufgerufen, und das Ergebnis ist die Standard-Linkbeschreibung.

Anscheinend orgwerden beim Speichern eines Links viele Informationen weggeworfen, sodass org-stored-linksnur noch eine Liste der Einträge des Formulars übrig bleibt (link description). Sofern die frühere Funktion einen Dateinamen für den Link hat, sieht es folgendermaßen aus:

(defun org-link-describe (link desc)
  (if (file-exists-p link)
      desc
    (read-string "Description: " desc)))

(setf org-make-link-description-function #'org-link-describe)

Es ist irgendwie hackig und ich habe es nicht ausgiebig getestet, aber es scheint bisher zu funktionieren. Würde mich natürlich über eine elegantere Lösung freuen.

Dan
quelle
2
Können Sie, nachdem Sie diese Funktion kennen, nicht dired-store-linkeinfach die gewünschte Beschreibung erstellen? Ich denke, das würde viel kürzer enden.
Malabarba
1
@ Malabarba: Sie haben wahrscheinlich Recht - diese Funktion könnte umgeschrieben werden, um den Link auf eine Datei zu überprüfen und entsprechend fortzufahren. Werde es ausprobieren, wenn ich einen freien Moment habe.
Dan
3

Ich verwende org 9.1.6 und zu meiner Bestürzung scheint es org-store-link-functionssich nun um eine integrierte org-Funktion zu handeln (und nicht um einen Hook), sodass die ursprüngliche Lösung nicht mehr funktioniert. Es kann eine Problemumgehung geben org-link-parameters, aber stattdessen verwende ich den folgenden kleinen Hack, der den Trick zu tun scheint:

(defun my//dired-store-link (orig-fun &rest args)
  (if (derived-mode-p 'dired-mode)
      (let ((file (dired-get-filename nil t)))
        (setf file (if file
                       (abbreviate-file-name (expand-file-name file))
                     default-directory))
        (let ((link (concat "file:" file))
              (desc (file-name-nondirectory file)))
          (push (list link desc) org-stored-links)
          (car org-stored-links)))
    (apply orig-fun args)))
(advice-add 'org-store-link :around #'my//dired-store-link)

Als Bonus werden Sie nicht zur Beschreibung aufgefordert, da die Beschreibung, an die org-stored-linksgesendet wird, nicht Null ist.

Matt Kramer
quelle