Wstaw punkt Org-id w punkcie poprzez zakończenie ścieżki konspektu

11

Obecnie, aby wstawić wewnętrzne linki org-id org-mode, nawiguję do nagłówka lub podciągam go w widoku planu (wyszukiwanie testu nagłówka Ca RET), przechowuję link za pomocą Cl (org-store-link), wracając do miejsca Chcę wstawić link, a następnie wstawić link za pomocą Cc Cl (org-insert-link).

Zamiast tego wolę zmapować klucz, który pozwala mi wstawić łącze w bieżącym punkcie, używając uzupełniania tabulacji podobnego do org-refile (Cc Cw). Zamierzonym rezultatem byłby wewnętrzny link org-id w postaci:

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

Przeglądając org-id.el, wygląda na to, że org-id-get-with-outline-path-complete został zaprojektowany w tym celu. Próbowałem:

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

ale to nie działało zgodnie z przeznaczeniem.

W moim pliku init.el mam następujące elementy:

;; 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)
sk8ingdom
źródło
Brakuje „-” w org-id-get-with outline-path-completion. Czy to jest problem?
erikstokes
Niestety nie - był to tylko błąd typograficzny. Zaktualizowałem pytanie.
sk8ingdom
Szkoda Jak to się nie udaje? Działa, kiedy próbuję.
erikstokes
Funkcja jest zdecydowanie nazywana. Monituje mnie o wpis, pozwala mi nawigować poprzez uzupełnianie tabulatorów (co jest świetne i działa zgodnie z przeznaczeniem), ale kiedy nacisnę Enter, zamiast wkleić link, po prostu przesuwa kursor do bieżącego nagłówka, podobnie jak DW Cu (nagłówek do góry).
sk8ingdom
Myślałem, że mogło to być spowodowane nieaktualną wersją org, ale wypróbowałem najnowszą wersję Emacsa 24.5, więc musi to być coś w mojej konfiguracji. Czy ktoś może potwierdzić, że mój powyższy kod faktycznie wstawia dla nich link?
sk8ingdom

Odpowiedzi:

6

Przeszukałem źródło w trybie org i znalazłem minimalnie udokumentowaną funkcję. Jeśli zdefiniujesz funkcję org-TYPE-complete-link, zostanie ona użyta do uzupełnienia linków typu TYPE. Musimy więc zdefiniować funkcję, org-id-complete-linkktóra wykona nasze zakończenie i zwróci link (w tym przedrostek „id:”).

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

Wstaw link w normalny sposób (za pomocą C-c C-l), wybierz „id:” jako typ, a uruchomi się funkcja uzupełniania.

EDYCJA: Od org-modewersji 9.0 samo zdefiniowanie powyższej funkcji nie działa ( ref ). Zamiast tego musisz dodać funkcję uzupełniania do org-link-parametersużywania

(org-link-set-parameters "id"
                         :complete 'org-id-complete-link)
erikstokes
źródło
To jest doskonałe i działa zgodnie z przeznaczeniem! Jedyną modyfikacją, którą wprowadziłem, było dodanie celów org-refile-target jako argumentu do org-id-get-with-outline-path-complete. W ten sposób mogę pobierać linki z DOWOLNEGO z moich plików org. Dzięki za pomoc!
sk8ingdom
@ sk8ingdom Czy możesz zaktualizować pytanie, aby uwzględnić ostateczne rozwiązanie? Nie jestem pewien, co doktor rozumie przezTARGETS may be a setting for ‘org-refile-targets’ to define eligible headlines.
kshenoy
Ostatnim rozwiązaniem jest zdefiniowanie powyższej funkcji, a także wywołanie, org-link-set-parametersjeśli używasz org-mode9. Dodatkowy argument, który org-id-get-with-outline-path-completionpozwala ci ograniczyć nagłówki, które wybrałeś, podobnie jak org-refile-targetspodczas refile. Zobacz pomoc na wszystko, ale częstym ustawieniem jest ((org-agenda-files :maxlevel . 3) (nil :maxlevel . 2))ograniczenie do 3 poziomów głęboko w plikach programu i 2 w bieżącym buforze.
erikstokes