Emacs:日付/時刻をファイル名として持つファイルを作成する関数とそのショートカット


8

次の名前形式のテキストファイルを生成する必要があります YYYYY-MM-DD--hh-mm-ss.org。これにキャプチャ機能をどのように使用できますか?つまり、単一のファイルでキャプチャごとに1つのエントリを作成する代わりに、関数はキャプチャごとに1つのファイルを作成する必要があります。うまくいけば、キャプチャメカニズム内のすべての可能性があります。


すみません、質問のコンテキストを忘れてしまいました。"capture"はemacs org-modeの一部です
myotis

回答:


6

functionこれを行うには、ターゲットフォームを使用できる必要があります。

(defun my/org-file-by-date ()
  "Create an Org file with current time as name."
  (find-file (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))

(add-to-list 'org-capture-templates
             '("x" "Template Name" plain
              (function my/org-file-by-date)
              "Capture template contents"))

編集2実はfileフォームなどに渡されたコードはキャプチャ時まで評価されないため、これを行うにはよりコンパクトな方法があります。例については、ErikSjöstrandの回答を参照してください。

編集1:キャプチャインターフェイスを経由せずに同様の機能を取得するには、これらと同様の機能を使用できます。

(defun my/org-file-by-date-with-inline-skeleton ()
  "Create Org file from skeleton with current time as name."
  (interactive)
  (find-file (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org"))
  (insert "Skeleton contents"))

(defun my/org-file-by-date-with-file-skeleton ()
  "Create Org file from skeleton file with current time as name."
  (interactive)
  (let ((filename (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))
    (copy-file "path/to/skeleton/file" filename)
    (find-file filename)))

正しい。私はあなたの答えを指すように私の答えを編集しました。
jch 2015年

よろしくお願いします!コードをテストすることにより、キャプチャ機能を使用する必要がまったくない可能性があることがわかりました。私はこれらのファイルのそれぞれに非常に多く書き込み、その後Cc cで閉じる必要があるためです。作成したファイルに直接書き込み、通常どおり保存したいと思います。%Y-%m-%d-%H-%M-%S.orgという名前のファイルを作成し、(スケルトンからの)固定テキストを含むファイルを作成して、書き込み用に開くにはどうすればよいですか?
myotis 2015年

完全にキャプチャを回避する2つの関数を追加しました。これはあなたが探しているものだと思います。
アーロンハリス

1

そのための組み込み機能はないようです(編集:はい、あります。以下を参照してください)。キャプチャ機能の内部を掘り下げる必要のない最も簡単な解決策は、キャプチャorg-default-notes-file時にの値をバインドすることです。

(defun my-org-capture-advice (func &rest args)
   (let ((org-default-notes-file
         (format-time-string "~/org/%Y-%m-%d--%H-%M-%S.org")))
    (apply func args)))

(advice-add 'org-capture :around #'my-org-capture-advice)

このアドバイスは非常に早い段階で行われるため、どのテンプレートを使用するかはまだわかりません。ファイルの名前がキャプチャテンプレートによって異なる場合は、おそらくアドバイスが必要になりますorg-capture-set-target-location

編集functionテンプレートターゲットは、それを達成するためのより良い方法です。例については、Aaronの回答を参照してください。


ありがとう!コードの使い方がわかりません。それを私のinit.elファイルに追加しました。もっと何をしますか?
myotis 2015年

Orgマニュアルのアドバイスに従っている場合は、org-capture関数を呼び出すために通常行うことと同じですC-c c
jch 2015年

私はまだ理解していません。「Mx my-org-capture-advice」と入力しても何も起こりません。通常のCc cを入力すると、定義したキャプチャのリストが表示されました。それであなたのコードはどこに入るのですか?
myotis 2015年

org-capture-templatesキャプチャするファイルを指定しない場合、選択したファイルは希望どおりにフォーマットされます。
jch 2015年

キャプチャするファイルなしで新しいキャプチャファイルを作成する必要があります。そうすると、コードが機能しますか?
myotis 2015年

1

org-capture-templates他の関数を定義せずにすべてをリストに保持する方法は次のとおりです。org-directoryファイルを保存するディレクトリに変更できます。

(add-to-list 'org-capture-templates
             '("x" "Template name" plain
               (file (expand-file-name
                      (format-time-string "%Y-%m-%d--%H-%M-%S.org")
                      org-directory))
               "This string is inserted in the capture"))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.