Masukkan Tautan Org-id pada Titik melalui Penyelesaian Jalur Garis Besar

11

Saat ini untuk menyisipkan tautan internal org-mode org-id, saya menavigasi ke tajuk atau menariknya dalam tampilan agenda (tajuk penelusuran uji tajuk Ca), menyimpan tautan dengan Cl (tautan toko-org), kembali ke tempat Saya ingin memasukkan tautan, lalu menyisipkan tautan dengan Cc Cl (org-insert-link).

Alih-alih, saya lebih suka memetakan kunci yang memungkinkan saya memasukkan tautan pada titik saat ini menggunakan penyelesaian tab yang mirip dengan org-refile (Cc Cw). Hasil yang dimaksud adalah tautan internal org-id dalam bentuk:

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

Melihat melalui org-id.el, sepertinya penyelesaian org-id-get-with-outline dirancang untuk tujuan ini. Saya mencoba:

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

tapi itu tidak berfungsi sebagaimana dimaksud.

Saya memiliki yang berikut ini di file init.el saya:

;; 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
sumber
Anda melewatkan "-" di org-id-get-with outline-path-completion. Apakah itu masalahnya?
erikstokes
Sayangnya tidak - itu hanya kesalahan ketik. Saya telah memperbarui pertanyaan.
sk8ingdom
Sangat buruk. Bagaimana bisa gagal? Ini berfungsi ketika saya mencobanya.
erikstokes
Fungsi ini pasti dipanggil. Ini meminta saya untuk entri, memungkinkan saya untuk menavigasi melalui penyelesaian tab (yang bagus dan berfungsi sebagaimana dimaksud), tetapi ketika saya menekan enter, alih-alih menempelkan tautan, itu hanya memindahkan kursor ke judul saat ini, mirip dengan Cc Cu (outline-up-heading).
sk8ingdom
Saya pikir ini mungkin disebabkan oleh versi org yang sudah ketinggalan zaman, tetapi mencoba yang terbaru di Emacs 24.5 sehingga pasti ada sesuatu dalam konfigurasi saya. Adakah yang bisa mengkonfirmasi bahwa kode saya di atas benar-benar memasukkan tautan untuk mereka?
sk8ingdom

Jawaban:

6

Saya mencari-cari di sumber mode-org dan menemukan fitur minimal didokumentasikan . Jika Anda mendefinisikan suatu fungsi org-TYPE-complete-link, itu akan digunakan untuk menyediakan penyelesaian untuk tautan tipe TYPE. Jadi kita hanya perlu mendefinisikan fungsi org-id-complete-linkyang menyelesaikan dan mengembalikan tautan (termasuk awalan "id:").

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

Masukkan tautan dengan cara normal (dengan C-c C-l), pilih "id:" karena jenis dan fungsi penyelesaian akan menyala.

EDIT: Pada org-modeversi 9.0 hanya mendefinisikan fungsi seperti di atas tidak lagi berfungsi ( ref ). Sebaliknya Anda harus menambahkan fungsi penyelesaian untuk org-link-parametersmenggunakan

(org-link-set-parameters "id"
                         :complete 'org-id-complete-link)
erikstokes
sumber
Ini luar biasa dan berfungsi sebagaimana mestinya! Satu-satunya modifikasi yang saya buat adalah menambahkan org-refile-target sebagai argumen untuk org-id-get-with-outline-path-completion. Dengan begitu, saya dapat mengambil tautan dari APAPUN file org saya. Terima kasih atas bantuan Anda!
sk8ingdom
@ sk8ingdom Bisakah Anda memperbarui pertanyaan untuk menyertakan solusi akhir Anda? Saya tidak yakin apa yang dimaksud dengan dokumen olehTARGETS may be a setting for ‘org-refile-targets’ to define eligible headlines.
kshenoy
Solusi terakhir adalah hanya untuk mendefinisikan fungsi di atas dan juga menelepon org-link-set-parametersjika Anda menggunakan org-mode9. Argumen tambahan untuk org-id-get-with-outline-path-completionmembiarkan Anda membatasi tajuk utama yang Anda pilih seperti org-refile-targetshalnya ketika Anda melakukan refile. Lihat bantuan untuk semuanya, tetapi pengaturan umum adalah ((org-agenda-files :maxlevel . 3) (nil :maxlevel . 2))yang membatasi hingga 3 level dalam file agenda dan 2 di buffer saat ini.
erikstokes