Nhận liên kết org để chèn mô tả liên kết tự động?


11

Q: Làm thế nào tôi có thể có được một orgchức năng liên kết tùy chỉnh để tự động chèn một mô tả?

Tôi muốn lưu trữ orgcác liên kết đến các tệp trong một diredbộ đệm, nhưng muốn mô tả liên kết là đường dẫn tên tệp sans hơn là báo cáo đường dẫn đầy đủ, tức là:

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

Bây giờ: org-store-linkhardcodes liên kết từ diredđể cung cấp mặc định. Thay vào đó, tôi đã viết một hàm tùy chỉnh (cũi từ hàm được mã hóa cứng) và thêm nó vào 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)

Cho đến nay rất tốt, và nó hoạt động như mong đợi, nhưng vì một điều:

  • Khi gọi org-insert-linkvới hành vi mặc định, tích hợp sẵn, nó chỉ cần chèn liên kết mà không yêu cầu tôi mô tả.
  • Khi gọi org-insert-linkvới chức năng tùy chỉnh của mình, nó sẽ nhắc tôi nhập một mô tả (nó được điền chính xác với tên tệp được lưu trữ trong thuộc :descriptiontính).

Tôi không muốn được nhắc về mô tả mỗi lần và muốn org-insert-linksử dụng giá trị của :descriptionbộ chức năng tùy chỉnh đó.

Làm thế nào tôi có thể thuyết phục org-insert-linkđể sử dụng :descriptiontự động mà không cần nhắc tôi về nó?


Các đối số tùy chọn link-locationhoặc default-descriptiontrong hàm org-insert-linkgiúp bất kỳ? Nếu tham số LINK-LOCATION không phải là con số không, giá trị này sẽ được sử dụng làm vị trí liên kết thay vì đọc tương tác. Nếu tham số DEFAULT-DESCRIPTION không phải là con số không, giá trị này sẽ được sử dụng làm mô tả mặc định.
luật

@lawlist: cảm ơn vì lời đề nghị, mặc dù tôi không chắc chắn làm thế nào tôi thiết lập nó trong sử dụng tương tác mà không gói nó trong một chức năng khác. Tuy nhiên, nó khiến tôi đọc các chuỗi chặt chẽ hơn, điều đó đưa tôi đến một câu trả lời.
Dan

Câu trả lời:


4

Chôn ở dưới cùng của chuỗi doc org-insert-linklà một lưu ý rằng:

Nếu org-make-link-description-functionkhông phải là số không, hàm này sẽ được gọi với mục tiêu liên kết và kết quả sẽ là mô tả liên kết mặc định.

Rõ ràng orgsẽ ném đi rất nhiều thông tin trong quá trình lưu trữ một liên kết, vì vậy tất cả những gì còn lại trong đó org-stored-linkslà một danh sách các mục của biểu mẫu (link description). Trong chừng mực, hàm trước có tên tệp cho liên kết, có vẻ như các công việc sau:

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

Đó là một loại hacky, và tôi đã không thử nghiệm nó rộng rãi, nhưng nó dường như hoạt động cho đến nay. Tất nhiên sẽ vui mừng khi thấy một giải pháp thanh lịch hơn.


2
Bây giờ bạn đã biết chức năng này, bạn có thể bỏ qua dired-store-linkvà chỉ sử dụng chức năng này để tạo mô tả bạn muốn không? Tôi nghĩ rằng nó sẽ kết thúc ngắn hơn rất nhiều.
Malabarba

1
@Malabarba: bạn có thể đúng - chức năng này có thể được viết lại để kiểm tra liên kết cho một tệp và tiến hành theo đó. Sẽ thử nó khi tôi có thời gian rảnh rỗi.
Dan

3

Tôi đang sử dụng org 9.1.6 và đến lúc mất tinh thần, có vẻ như org-store-link-functionsbây giờ là chức năng org dựng sẵn (chứ không phải là hook), vì vậy giải pháp ban đầu không còn hoạt động. Có thể có một cách giải quyết bằng cách sử dụng org-link-parameters, nhưng thay vào đó tôi đang sử dụng bản hack nhỏ sau đây, có vẻ như thực hiện thủ thuật:

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

Như một phần thưởng, điều này không nhắc cho một mô tả, kể từ khi mô tả đẩy lên org-stored-linkslà phi nil.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.