링크 설명을 자동으로 삽입하는 조직 링크를 받으시겠습니까?


11

Q :org 설명을 자동으로 삽입하는 사용자 정의 링크 기능을 얻으려면 어떻게 해야합니까?

버퍼 org에 파일에 대한 링크 를 저장하고 싶지만 dired전체 경로를보고하는 대신 링크 설명을 파일 이름 sans 경로로 사용하는 것이 좋습니다.

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

Now : org-store-link링크를 하드 코드 dired하여 기본값을 제공합니다. 대신, 나는 사용자 정의 함수를 작성하고 (하드 코딩 된 함수에서 제거) 다음에 추가했습니다 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)

지금까지는 좋았으며 예상대로 작동하지만 한 가지 사항은 다음과 같습니다.

  • org-insert-link내장 된 기본 동작으로 호출 하면 설명을 요구하지 않고 링크를 삽입하기 만하면됩니다.
  • org-insert-link내 사용자 정의 함수로 호출 하면 설명을 입력하라는 메시지가 표시됩니다 ( :description속성에 저장된 파일 이름으로 올바르게 채 웁니다 ).

매번 설명을 입력하라는 메시지가 표시되지 않고 해당 사용자 정의 함수 세트 org-insert-link의 값을 사용 하고 싶습니다 :description.

메시지가 표시되지 않고 자동으로 org-insert-link사용 하도록 어떻게 확신 할 :description수 있습니까?


선택적 인수 link-location또는 default-description함수에서 org-insert-link도움이 되나요? LINK-LOCATION 매개 변수가 0이 아닌 경우이 값은 대화식으로 읽지 않고 링크 위치로 사용됩니다. DEFAULT-DESCRIPTION 매개 변수가 0이 아닌 경우이 값이 기본 설명으로 사용됩니다.
lawlist

@lawlist : 제안 해 주셔서 감사합니다. 다른 기능으로 래핑하지 않고 대화 형 사용으로 어떻게 설정했는지는 확실하지 않습니다. 그러나 그것은 docstring을 더 자세히 읽게하여 일종의 대답을 얻었습니다.
Dan

답변:


4

docstring의 맨 아래에 묻힌 org-insert-link것은 다음과 같습니다.

경우 org-make-link-description-functionnil이 아닌이며,이 기능은 링크 대상으로 호출되며, 결과는 기본 링크 설명 될 것이다.

분명히 org링크를 저장하는 과정에서 많은 정보를 버려서 남은 org-stored-links것은 양식의 항목 목록입니다 (link description). 이전 함수에 링크의 파일 이름이 있으면 다음과 같이 작동합니다.

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

그것은 해키 종류이며, 광범위하게 테스트하지는 않았지만 지금까지는 효과가있는 것 같습니다. 물론 더 우아한 솔루션을 보게되어 기쁩니다.


2
이제이 기능을 알고 있으므로 dired-store-link원하는 설명을 작성하는 데 버리고 사용할 수 없습니까? 나는 그것이 훨씬 짧아 질 것이라고 생각합니다.
Malabarba

1
@ Malabarba : 당신이 옳을 것입니다-이 기능은 파일의 링크를 검사하고 그에 따라 진행하도록 다시 작성할 수 있습니다. 여분의 순간이되면 그것을 시도합니다.
Dan

3

나는 org 9.1.6을 사용하고 있으며, 당황스럽게도 org-store-link-functions이제 훅이 아닌 내장 org 함수 인 것처럼 보이므로 원래 솔루션은 더 이상 작동하지 않습니다. 를 사용하는 해결 방법이있을 수 org-link-parameters있지만 대신 다음과 같은 작은 핵을 사용하고 있습니다.

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

보너스로, 설명 org-stored-links은 0이 아니므로 설명을 요구하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.