10

org-modeorg-idには、 org-mode ファイルのグローバルで一意の ID を実装する というバンドルされた拡張機能があります。:PROPERTIES:すべてのエントリ (本文を含む見出し) は、ドロワーに ID プロパティを持つことができます。

関数を使用して、単一のエントリの新しい ID を割り当てることができますorg-id-get-create

org-mode ファイルのすべてのエントリに ID を割り当てるにはどうすればよいですか?

org-id-get-createで始まるすべての文字列を呼び出すマクロのように、これを自動化する Emacs メソッドを使用できます*。しかし、org-mode に既にその機能があるかどうか知りたいです。そうでない場合は、この目的のために elisp コードを記述する最も慣用的な方法をお勧めします。

4

2 に答える 2

14

私は Stuart に同意します。org-id にはこれを自動的に行うものは何もないと思います。そのため、ID をいつ追加するかが問題になります。

org-captureを使用してすべての項目を追加する場合org-capture-prepare-finalize-hookは、コードを配置する論理的な場所です。

(add-hook 'org-capture-prepare-finalize-hook 'org-id-get-create)

または、Stuart が提案したようにして、org-mode ファイルの保存フックを追加することもできます。ファイル内のすべての見出しを処理する最も慣用的な方法は、マッピング APIを使用することだと思います。

(defun my/org-add-ids-to-headlines-in-file ()
  "Add ID properties to all headlines in the current file which
do not already have one."
  (interactive)
  (org-map-entries 'org-id-get-create))

最後にbefore-save-hook、組織モードでのみ実行されるa を追加する必要があります。

(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))

それはそれを行う必要があります!

于 2013-04-27T00:25:22.570 に答える
13

ソースを検索しましたが、これを行うための明白なものは何も見つかりませんでした。Org-mobileで使用されていることは知っていますが、あまり経験がありません。

スターターとして、次のスニペットは現在のファイル内のすべてのアウトライン見出しをループし (Org-mode 見出しは基本的に標準の Emacs アウトライン見出しです)、まだ ID がない場合は ID を追加します。

   (require 'org-id)
   (save-excursion
      (goto-char (point-max))
      (while (outline-previous-heading)
        (org-id-get-create)))

(なぜこのループが前方ではなくバッファーを逆行するのか疑問に思っているなら、それはwhileループが常にアウトライン ナビゲーション関数を少なくとも 1 回呼び出すためであり、組織モード ファイルが見出しで始まる場合、前方に進むとスキップされるためです。 .)

これは、Org-mode アジェンダに知られているすべてのファイルのループ内で、 function によって返されたエントリをループする(org-agenda-files)か、Org-mode ファイルの保存フックに追加することで、合理的に簡単に使用できます。

私よりも機敏な人が最初にそこにたどり着かない場合、IDを追加したい時期を特定できれば、上記を拡張して完全な解決策にすることができます。

于 2012-11-12T18:59:19.943 に答える