Bağlantı açıklamasını otomatik olarak eklemek için kuruluş bağlantısı alınsın mı?


11

S:org Otomatik olarak açıklama eklemek için özel bağlantı işlevini nasıl alabilirim ?

orgBir diredarabellek dosyalara bağlantılarını saklamak istiyorum , ancak bağlantı açıklamasının dosya adı sans yolu yerine tam yol rapor, yani:

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

Şimdi: varsayılantan sağlamak için org-store-linkgelen hardcodes bağlantıları dired. Bunun yerine, özel bir işlev yazdım (sabit kodlu işlevden cribbing) ve ekledim 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)

Şimdiye kadar çok iyi ve beklendiği gibi çalışıyor, ama bir kere:

  • Yerleşik org-insert-link, varsayılan davranış ile arama yaparken, bir açıklama istemeden sadece bağlantıyı ekler.
  • Çağrılırken org-insert-linkbenim özel bir işlevle, bu (doğru saklanan dosya adıyla dolduran bir açıklama girmek için beni ister :descriptionmülkiyet).

Her seferinde açıklama istenmez ve özel işlevin ayarladığı org-insert-linkdeğeri kullanmak :descriptionisterim.

Bana sormadan otomatik olarak org-insert-linkkullanmayı nasıl ikna edebilirim :description?


İsteğe bağlı bağımsız değişkenler link-locationveya default-descriptionişlevdeki org-insert-linkherhangi bir yardımcı olur mu? LINK-LOCATION parametresi sıfır değilse, bu değer etkileşimli olarak okumak yerine bağlantı konumu olarak kullanılır. DEFAULT-DESCRIPTION parametresi sıfır değilse, bu değer varsayılan açıklama olarak kullanılır.
hukukçu

@lawlist: öneri için teşekkürler, ancak başka bir işleve sarmadan etkileşimli kullanımda nasıl ayarlayacağımdan emin değilim. Ancak, doktora daha yakından okumamı sağladı, bu da beni bir tür cevaba götürdü.
Dan

Yanıtlar:


4

Öğretinin dibine gömülmüş org-insert-linkbir not:

org-make-link-description-functionNil değilse , bu işlev bağlantı hedefi ile çağrılır ve sonuç varsayılan bağlantı açıklaması olur.

Görünüşe göre orgbir bağlantı saklama sürecinde çok fazla bilgi atıyor, bu yüzden kalan tek şey org-stored-linksformun girişlerinin bir listesidir (link description). Önceki işlevin bağlantı için bir dosya adı olduğu sürece, aşağıdaki gibi görünür:

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

Bu biraz çirkin ve kapsamlı bir şekilde test etmedim, ama şimdiye kadar çalışıyor gibi görünüyor. Elbette daha şık bir çözüm görmek heyecan verici olurdu.


2
Artık bu işlevi bildiğinize göre, hendek dired-store-linkedip sadece istediğiniz açıklamayı oluşturmak için kullanamaz mısınız? Bunun çok daha kısa olacağını düşünüyorum.
Malabarba

1
@Malabarba: muhtemelen haklısınız - bu işlev bağlantıyı bir dosya için incelemek ve buna göre ilerlemek için yeniden yazılabilir. Boş bir an bulduğumda deneyeceğim.
Dan

3

Org 9.1.6 kullanıyorum ve benim dehşet için org-store-link-functionsşimdi bir kanca yerine, yerleşik bir org işlevi gibi görünüyor , bu yüzden orijinal çözüm artık çalışmıyor. Kullanarak bir geçici çözüm olabilir org-link-parameters, ancak bunun yerine hile yapıyor gibi görünen aşağıdaki küçük kesmek kullanıyorum:

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

Bonus olarak, bir açıklama istenmez, çünkü itilen açıklama org-stored-linkssıfır değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.