リンクの説明を自動的に挿入する組織リンクを取得しますか?


11

Q:org説明を自動的に挿入するカスタムリンク関数を取得するにはどうすればよいですか?

orgファイルへのリンクをdiredバッファに保存したいのですが、フルパスを報告するのではなく、リンクの説明をパスではなくファイル名にすることをお勧めします。

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)

これまでのところ良好であり、期待どおりに機能しますが、1つの点で:

  • org-insert-link組み込みのデフォルトの動作で呼び出す場合、説明を要求せずにリンクを挿入するだけです。
  • org-insert-linkカスタム関数で呼び出すと、説明を入力するように求められます(説明には、:descriptionプロパティに保存されているファイル名が正しく入力されます)。

毎回説明を求めorg-insert-linkられるのでは:descriptionなく、カスタム関数が設定する値を使用したいと思います。

プロンプトを表示せずにを自動的org-insert-linkに使用するようにするにはどうすればよい:descriptionですか?


オプションの引数link-locationまたはdefault-description関数内でorg-insert-link何か助けになりますか? LINK-LOCATIONパラメーターが非nilの場合、この値は、1つを対話的に読み取るのではなく、リンクの場所として使用されます。DEFAULT-DESCRIPTIONパラメータが非nilの場合、この値はデフォルトの説明として使用されます。
法律家、2015年

@lawlist:提案に感謝しますが、別の関数でラップせずにインタラクティブな使用に設定する方法はわかりません。しかし、それにより、ドキュメント文字列をより詳細に読むことができるようになり、ある種の答えが得られました。
ダン

回答:


4

docstringの下部に埋められているのorg-insert-linkは、次の点です。

org-make-link-description-functionが非nilの場合、この関数はリンクターゲットを指定して呼び出され、結果はデフォルトのリンクの説明になります。

どうやら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、これを使用して必要な説明を作成することはできませんか?私はそれがはるかに短くなると思います。
マラバルバ2015年

1
@Malabarba:おそらくそのとおりです。この関数は、ファイルのリンクを検査してそれに応じて続行するように書き直すことができます。暇があれば試してみます。
ダン

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-linksnilでないため、これは説明を要求しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.