Inserire il collegamento Org-id nel punto tramite Completamento percorso contorno


11

Attualmente per inserire collegamenti org-id interni in modalità org, navigo verso un'intestazione o lo tiro in alto nella vista agenda (RET ricerca test intestazione Ca), memorizzo il collegamento con Cl (org-store-link), tornando a dove Voglio inserire il link, quindi inserire il link con Cc Cl (org-insert-link).

Preferirei invece mappare una chiave che mi permetta di inserire un collegamento nel punto corrente usando il completamento della tab simile a org-refile (Cc Cw). Il risultato previsto sarebbe un collegamento interno org-id nel modulo:

[[id:d7534b2f-c221-4dea-8566-d5ce3e4e1b78][Example Link]]

Guardando org-id.el, sembra che org-id-get-with-outline-path-completamento sia stato progettato per questo scopo. Provai:

(global-set-key "\C-ci" (lambda () (interactive) (org-id-get-with-outline-path-completion)))

ma non ha funzionato come previsto.

Ho il seguente nel mio file init.el:

;; Use global IDs
(require 'org-id)
(setq org-id-link-to-org-use-id t)

;; Update ID file .org-id-locations on startup
(org-id-update-id-locations)

;; Refile options
(setq org-refile-targets (quote ((nil :maxlevel . 9) (org-agenda-files :maxlevel . 9))))
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps t)
(setq org-refile-allow-creating-parent-nodes t)

Ti manca un "-" in org-id-get-with outline-path-completion. È questo il problema?
erikstokes

Purtroppo no - è stato solo un errore tipografico. Ho aggiornato la domanda.
sk8ingdom

Peccato. Come sta fallendo? Funziona quando lo provo.
erikstokes

La funzione è sicuramente chiamata. Mi richiede la voce, mi permette di navigare tramite il completamento della scheda (che è fantastico e funziona come previsto), ma quando premo invio, invece di incollare il collegamento, sposta semplicemente il cursore sul titolo corrente, simile a Cc Cu (schema di sintesi).
sk8ingdom

Ho pensato che questo potrebbe essere stato causato da una versione obsoleta dell'organizzazione, ma ho provato il più recente in Emacs 24.5, quindi deve essere qualcosa nella mia configurazione. Qualcuno può confermare che il mio codice sopra inserisce effettivamente un link per loro?
sk8ingdom,

Risposte:


6

Ho cercato nella fonte in modalità org e ho trovato una funzione minimamente documentata . Se si definisce una funzione org-TYPE-complete-link, verrà utilizzata per fornire il completamento per i collegamenti di tipo TYPE. Quindi dobbiamo solo definire una funzione org-id-complete-linkche compia il nostro completamento e restituisca il collegamento (incluso il prefisso "id:").

(defun org-id-complete-link (&optional arg)
  "Create an id: link using completion"
  (concat "id:"
          (org-id-get-with-outline-path-completion)))

Inserire il collegamento nel modo normale (con C-c C-l), selezionare "id:" poiché il tipo e la funzione di completamento verranno attivati.

EDIT: A partire dalla org-modeversione 9.0 la definizione della funzione come sopra non funziona più ( rif ). Invece devi aggiungere la funzione di completamento org-link-parametersall'utilizzo

(org-link-set-parameters "id"
                         :complete 'org-id-complete-link)

Questo è eccellente e funziona come previsto! L'unica modifica che ho fatto è stata aggiungere org-refile-target come argomento a org-id-get-with-outline-path-completamento. In questo modo, posso prendere i collegamenti da QUALUNQUE dei miei file dell'organizzazione. Grazie per l'aiuto!
sk8ingdom,

@ sk8ingdom Puoi aggiornare la domanda per includere la soluzione finale? Non sono sicuro di cosa significhi il documentoTARGETS may be a setting for ‘org-refile-targets’ to define eligible headlines.
kshenoy il

La soluzione finale è solo quella di definire la funzione sopra e chiamare anche org-link-set-parametersse stai usando org-mode9. L'argomento extra per org-id-get-with-outline-path-completionfarti limitare i titoli che hai scelto proprio come org-refile-targetsfa quando si refile. Vedi l'aiuto per tutto, ma un'impostazione comune è ((org-agenda-files :maxlevel . 3) (nil :maxlevel . 2))che limita a 3 livelli di profondità nei file dell'agenda e 2 nel buffer corrente.
erikstokes
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.