Emacs: berfungsi untuk membuat file dengan tanggal / waktu sebagai nama file, dan jalan pintas untuk itu

8

Saya perlu untuk menghasilkan file teks dengan format nama berikut: YYYYY-MM-DD--hh-mm-ss.org. Bagaimana saya bisa menggunakan funtionality tangkap untuk ini? Artinya, alih-alih membuat satu entri per tangkapan dalam satu file, fungsi tersebut seharusnya membuat satu file tunggal per tangkapan, dan semoga dengan semua kemungkinan dalam mekanisme penangkapan.

myotis
sumber
Maaf, saya lupa konteks untuk pertanyaan saya. "capture" adalah bagian dari emacs org-mode
myotis

Jawaban:

6

Anda harus dapat menggunakan functionformulir target untuk melakukan ini:

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

Sunting 2 : Ternyata, kode yang dikirimkan ke fileformulir atau sejenisnya tidak dievaluasi hingga waktu pengambilan, jadi ada cara yang lebih ringkas untuk melakukan ini. Lihat jawaban Erik Sjöstrand sebagai contoh.

Sunting 1 : Untuk mendapatkan fungsionalitas serupa tanpa melalui antarmuka tangkap, Anda dapat menggunakan fungsi yang mirip dengan ini.

(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)))
Aaron Harris
sumber
Baik. Saya telah mengedit jawaban saya untuk menunjukkan milik Anda.
jch
Terima kasih! Saya melihat, dengan menguji kodenya, mungkin tidak perlu menggunakan fungsi penangkapan sama sekali. Karena saya menulis sangat banyak di masing-masing file ini, dan kemudian saya harus menutup Cc. Saya lebih suka menulis langsung ke file yang dibuat dan menyimpan seperti biasa. Bagaimana saya bisa membuat file bernama% Y-% m-% d -% H-% M-% S.org dan berisi beberapa teks tetap (dari kerangka mungkin?) Dan kemudian membukanya untuk menulis?
myotis
Saya baru saja menambahkan dua fungsi yang menghindari penangkapan sepenuhnya. Saya pikir ini yang Anda cari.
Aaron Harris
1

Tampaknya tidak ada fungsi bawaan untuk melakukan itu ( edit : ya ada, lihat di bawah). Solusi paling sederhana, salah satu yang tidak memerlukan menggali ke dalam internal fungsi penangkapan, adalah untuk mengikat nilai org-default-notes-filepada waktu penangkapan:

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

Saran ini terjadi sangat awal, sehingga belum tahu templat mana yang akan Anda gunakan. Jika nama file tergantung pada template tangkap, maka Anda mungkin perlu memberi saran org-capture-set-target-location.

Sunting : functiontarget templat adalah cara yang lebih baik untuk mencapai itu. Lihat jawaban Harun sebagai contoh.

jch
sumber
Terima kasih! Saya tidak yakin bagaimana cara menggunakan kode Anda. Saya telah menambahkannya ke file init.el saya. Apa yang harus saya lakukan lagi?
myotis
Apa pun yang Anda lakukan biasanya untuk memanggil org-capturefungsi - C-c cjika Anda telah mengikuti saran dalam manual Org.
JCH
Aku masih tidak mengerti. Jika saya mengetik "Mx my-org-capture-advice" tidak ada yang terjadi. Ketika saya mengetikkan CC normal, saya mendapat daftar tangkapan seperti yang telah saya tetapkan. Jadi, dari mana kode Anda masuk?
myotis
Jika Anda org-capture-templatestidak menentukan file yang akan diambil, file yang dipilih akan diformat sesuai keinginan Anda.
JCH
jadi saya perlu membuat file tangkap baru tanpa file untuk menangkap, dan kemudian kode Anda akan melakukan tugasnya?
myotis
1

Inilah cara untuk menyimpan semuanya dalam org-capture-templatesdaftar, tanpa mendefinisikan fungsi lainnya. org-directorydapat diubah ke direktori apa pun yang Anda inginkan untuk menyimpan file.

(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"))
Erik Sjöstrand
sumber