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)

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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.