Dapatkan tautan org untuk menyisipkan uraian tautan secara otomatis?

11

T: Bagaimana saya bisa mendapatkan orgfungsi tautan khusus untuk memasukkan deskripsi secara otomatis?

Saya ingin menyimpan orgtautan ke file dalam diredbuffer, tetapi saya lebih suka bahwa deskripsi tautan menjadi path nama file sans daripada melaporkan path lengkap, yaitu:

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

Sekarang: org-store-linktautan hardcodes dari direduntuk menyediakan default. Sebagai gantinya, saya telah menulis fungsi khusus (menjiplak dari fungsi hard-coded) dan menambahkannya ke 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)

Sejauh ini bagus, dan berfungsi seperti yang diharapkan, tetapi untuk satu hal:

  • Saat menelepon org-insert-linkdengan perilaku bawaan bawaan, itu hanya menyisipkan tautan tanpa meminta saya untuk deskripsi.
  • Saat memanggil org-insert-linkdengan fungsi kustom saya, itu meminta saya untuk memasukkan deskripsi (yang diisi dengan benar dengan nama file yang disimpan di :descriptionproperti).

Saya lebih suka tidak diminta untuk deskripsi setiap kali, dan ingin org-insert-linkmenggunakan nilai :descriptionyang ditetapkan fungsi kustom.

Bagaimana saya bisa meyakinkan org-insert-linkuntuk menggunakan :descriptionsecara otomatis tanpa meminta saya untuk itu?

Dan
sumber
Apakah argumen opsional link-locationatau default-descriptiondalam fungsi org-insert-linkmembantu? Jika parameter LINK-LOCATION adalah non-nil, nilai ini akan digunakan sebagai lokasi tautan alih-alih membaca satu secara interaktif. Jika parameter DEFAULT-DESCRIPTION adalah nihil, nilai ini akan digunakan sebagai deskripsi default.
hukum
@lawlist: terima kasih atas sarannya, meskipun saya tidak yakin bagaimana saya akan mengaturnya dalam penggunaan interaktif tanpa membungkusnya dengan fungsi lain. Namun, itu membuat saya membaca docstring lebih dekat, yang memberi saya semacam jawaban.
Dan

Jawaban:

4

Dikubur di bagian bawah dokumen org-insert-linkadalah catatan bahwa:

Jika org-make-link-description-functionnon-nil, fungsi ini akan dipanggil dengan target tautan, dan hasilnya akan menjadi deskripsi tautan default.

Rupanya orgmembuang banyak informasi dalam proses menyimpan tautan, sehingga yang tersisa org-stored-linkshanyalah daftar entri formulir (link description). Sejauh fungsi sebelumnya memiliki nama file untuk tautan, sepertinya berfungsi sebagai berikut:

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

Ini semacam peretasan, dan saya belum mengujinya secara luas, tetapi sepertinya berhasil sejauh ini. Akan senang melihat solusi yang lebih elegan, tentu saja.

Dan
sumber
2
Sekarang Anda sudah tahu fungsi ini, tidak bisakah Anda parit dired-store-linkdan gunakan saja ini untuk membuat deskripsi yang Anda inginkan? Saya pikir itu akan menjadi jauh lebih pendek.
Malabarba
1
@Malabarba: Anda mungkin benar - fungsi ini dapat ditulis ulang untuk memeriksa tautan file dan melanjutkannya. Akan mencobanya ketika saya mendapat waktu luang.
Dan
3

Saya menggunakan org 9.1.6, dan saya kecewa tampaknya org-store-link-functionssekarang menjadi fungsi org built-in (bukan hook), jadi solusi asli tidak lagi berfungsi. Mungkin ada solusi menggunakan org-link-parameters, tetapi saya menggunakan hack kecil berikut ini, yang sepertinya melakukan trik:

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

Sebagai bonus, ini tidak meminta deskripsi, karena deskripsi yang didorong ke org-stored-linksnon-nil.

Matt Kramer
sumber