Ottieni il collegamento dell'organizzazione per inserire automaticamente la descrizione del collegamento?


11

D: Come posso ottenere una orgfunzione di collegamento personalizzata per inserire automaticamente una descrizione?

Vorrei archiviare i orgcollegamenti ai file in un diredbuffer, ma preferirei che la descrizione del collegamento sia il nome del file senza percorso piuttosto che riportare il percorso completo, ovvero:

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

Ora: org-store-linkcollegamenti hardcodes da diredper fornire l'impostazione predefinita. Invece, ho scritto una funzione personalizzata (paralizzando dalla funzione hard-coded) e l'ho aggiunta a 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)

Fin qui tutto bene, e funziona come previsto, ma per prima cosa:

  • Quando si chiama org-insert-linkcon il comportamento predefinito predefinito, inserisce semplicemente il collegamento senza chiedermi una descrizione.
  • Quando chiamo org-insert-linkcon la mia funzione personalizzata, mi chiede di inserire una descrizione (che popola correttamente con il nome del file memorizzato nella :descriptionproprietà).

Preferirei non essere richiesto per la descrizione ogni volta e vorrei org-insert-linkutilizzare il valore :descriptionimpostato dalla funzione personalizzata.

Come posso convincere org-insert-linka utilizzare :descriptionautomaticamente senza chiedermelo?


Gli argomenti opzionali link-locationo default-descriptionnella funzione org-insert-linkaiutano? Se il parametro LINK-LOCATION è diverso da zero, questo valore verrà utilizzato come posizione del collegamento anziché leggerne uno in modo interattivo. Se il parametro DEFAULT-DESCRIPTION è diverso da zero, questo valore verrà utilizzato come descrizione predefinita.
elenco delle leggi

@lawlist: grazie per il suggerimento, anche se non sono sicuro di come l'avrei impostato in uso interattivo senza includerlo in un'altra funzione. Tuttavia, mi ha fatto leggere più da vicino la documentazione, il che mi ha portato a una sorta di risposta.
Dan

Risposte:


4

Sepolto nella parte inferiore della documentazione per org-insert-linkuna nota che:

Se org-make-link-description-functionè diverso da zero, questa funzione verrà chiamata con la destinazione del collegamento e il risultato sarà la descrizione del collegamento predefinita.

Apparentemente orggetta via molte informazioni nel processo di memorizzazione di un collegamento, quindi tutto ciò che rimane org-stored-linksè un elenco di voci del modulo (link description). Nella misura in cui la funzione precedente ha un nome file per il collegamento, sembra che le seguenti funzioni:

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

È un po 'confuso, e non l'ho testato ampiamente, ma sembra funzionare finora. Sarei felice di vedere una soluzione più elegante, ovviamente.


2
Ora che conosci questa funzione, non puoi abbandonare dired-store-linke semplicemente usarla per creare la descrizione che desideri? Penso che sarebbe molto più breve.
Malabarba,

1
@Malabarba: probabilmente hai ragione: questa funzione potrebbe essere riscritta per ispezionare il collegamento per un file e procedere di conseguenza. Lo proverò quando avrò un momento libero.
Dan

3

Sto usando org 9.1.6, e con mio grande sgomento sembra che org-store-link-functionsora sia una funzione org integrata (piuttosto che un hook), quindi la soluzione originale non funziona più. Potrebbe esserci una soluzione alternativa usando org-link-parameters, ma invece sto usando il seguente piccolo trucco, che sembra fare il trucco:

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

Come bonus, questo non richiede una descrizione, dal momento che la descrizione inserita org-stored-linksè nulla.

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.