Emacs: có chức năng tạo một tệp có ngày / giờ dưới dạng tên tệp và lối tắt cho nó


8

Tôi cần tạo tệp văn bản với định dạng tên sau : YYYYY-MM-DD--hh-mm-ss.org. Làm thế nào tôi có thể sử dụng chức năng chụp ảnh cho việc này? Đó là, thay vì thực hiện một mục nhập cho mỗi lần chụp trong một tệp, hàm sẽ tạo một tệp duy nhất cho mỗi lần chụp và hy vọng với tất cả các khả năng trong cơ chế chụp.


Xin lỗi, tôi quên bối cảnh cho câu hỏi của tôi. "chụp" là một phần của chế độ org của emacs
myotis

Câu trả lời:


6

Bạn sẽ có thể sử dụng functionmẫu mục tiêu để làm điều này:

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

Chỉnh sửa 2 : Hóa ra, mã được chuyển sang một filebiểu mẫu hoặc tương tự không được đánh giá cho đến khi bắt được thời gian, vì vậy có một cách nhỏ gọn hơn để làm điều này. Xem câu trả lời của Erik Sjöstrand để biết ví dụ.

Chỉnh sửa 1 : Để có được chức năng tương tự mà không cần thông qua giao diện chụp, bạn có thể sử dụng các chức năng tương tự như các chức năng này.

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

Đúng. Tôi đã chỉnh sửa câu trả lời của tôi để chỉ vào bạn.
JCH

Cảm ơn ! Tôi thấy, bằng cách kiểm tra mã, có lẽ không cần thiết phải sử dụng chức năng chụp. Bởi vì tôi viết rất nhiều trong mỗi tệp này, và sau đó tôi phải đóng bằng Cc c. Tôi muốn viết trực tiếp vào tập tin đã tạo và lưu như bình thường. Làm cách nào tôi có thể tạo một tệp có tên% Y-% m-% d -% H-% M-% S.org và chứa một số văn bản cố định (có thể từ một bộ xương?) Và sau đó mở nó để viết?
myotis

Tôi chỉ thêm hai chức năng tránh chụp hoàn toàn. Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm.
Aaron Harris

1

Dường như không có bất kỳ chức năng tích hợp nào để làm điều đó ( chỉnh sửa : có, xem bên dưới). Giải pháp đơn giản nhất, một giải pháp không yêu cầu đi sâu vào bên trong chức năng chụp, là liên kết giá trị org-default-notes-filetại thời điểm chụp:

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

Lời khuyên này xảy ra rất sớm, vì vậy vẫn chưa biết bạn sẽ sử dụng mẫu nào. Nếu tên của tệp phụ thuộc vào mẫu chụp, thì có lẽ bạn sẽ cần tư vấn org-capture-set-target-location.

Chỉnh sửa : functionmục tiêu mẫu là một cách tốt hơn để đạt được điều đó. Xem câu trả lời của Aaron cho một ví dụ.


Cảm ơn! Tôi không chắc chắn làm thế nào để sử dụng mã của bạn. Tôi đã thêm nó vào tập tin init.el của tôi. Tôi phải làm gì hơn?
myotis

Chỉ cần bất cứ điều gì bạn thường làm để gọi org-capturehàm - C-c cnếu bạn đã làm theo lời khuyên trong hướng dẫn sử dụng Org.
JCH

Tôi vẫn không hiểu. Nếu tôi gõ "Mx my-org-Capture-lời khuyên" thì không có gì xảy ra. Khi tôi gõ Cc bình thường của tôi, tôi nhận được danh sách các ảnh chụp như tôi đã xác định chúng. Vì vậy, mã của bạn đi vào đâu?
myotis

Nếu bạn org-capture-templateskhông chỉ định tệp để ghi vào, tệp được chọn sẽ được định dạng theo ý muốn của bạn.
JCH

Vì vậy, tôi cần phải tạo một tệp chụp mới mà không có tệp để ghi vào, và sau đó mã của bạn sẽ thực hiện công việc của nó?
myotis

1

Đây là một cách để giữ tất cả trong org-capture-templatesdanh sách mà không cần xác định các chức năng khác. org-directorycó thể được thay đổi thành bất kỳ thư mục nào bạn muốn lưu trữ các tập tin.

(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"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.