Як я можу вставити поточну дату та час у файл за допомогою Emacs?


74

Які команди в Emacs я можу використовувати для вставки в текстовий буфер файлу поточної дати та часу?

(Наприклад, еквівалентом у Блокноті є просто натискання клавіші F5, що є єдиною корисною функцією Блокнота!)


2
Ctrl + G у блокноті відкриває діалогове вікно "Перейти до рядка", це теж корисно!
cfeduke

Відповіді:


136
C-u M-! date

58
Тільки для повноти: M-!це комбінація клавіш для функції shell-command. Тому M-! dateбуде викликати команду оболонки dateі показати її в області виводу (мінібуфер, оскільки результат досить короткий, щоб поміститися). C-uЄ префікс аргумент , що марка M-!поставила свою продукцію в поточному буфері замість цього.
ShreevatsaR

11
З цим ви отримаєте дивовижні результати, якщо ви використовуєте Windows, "date" - це команда для зміни системної дати. Відповіді на це питання за допомогою elisp не залежать від Unix, Unix-подібної або навіть операційної системи Linux.
Річард Хоскінс

40

Вставте файл .emacs:

;; ====================
;; insert date and time

(defvar current-date-time-format "%a %b %d %H:%M:%S %Z %Y"
  "Format of date to insert with `insert-current-date-time' func
See help of `format-time-string' for possible replacements")

(defvar current-time-format "%a %H:%M:%S"
  "Format of date to insert with `insert-current-time' func.
Note the weekly scope of the command's precision.")

(defun insert-current-date-time ()
  "insert the current date and time into current buffer.
Uses `current-date-time-format' for the formatting the date/time."
       (interactive)
       (insert "==========\n")
;       (insert (let () (comment-start)))
       (insert (format-time-string current-date-time-format (current-time)))
       (insert "\n")
       )

(defun insert-current-time ()
  "insert the current time (1-week scope) into the current buffer."
       (interactive)
       (insert (format-time-string current-time-format (current-time)))
       (insert "\n")
       )

(global-set-key "\C-c\C-d" 'insert-current-date-time)
(global-set-key "\C-c\C-t" 'insert-current-time)

Довідково


1
Я використовую щось подібне до цього, але я змінюю його з Cc Ct на Cx Ct, тому що Cc Ct заважає прив'язці "Позначити предмет" в організаційному режимі. Що для мене, на жаль, вкладається в м’язову пам’ять. :)
AssembledGhost

"\C-c\C-d"у мене нічого не трапляється. Насправді він видаляє поточний рядок при C-dнаборі. Але я думаю, що чому C-cце не працює.
Джек

30

Я використав ці короткі фрагменти:

(defun now ()
  "Insert string for the current time formatted like '2:34 PM'."
  (interactive)                 ; permit invocation in minibuffer
  (insert (format-time-string "%D %-I:%M %p")))

(defun today ()
  "Insert string for today's date nicely formatted in American style,
e.g. Sunday, September 17, 2000."
  (interactive)                 ; permit invocation in minibuffer
  (insert (format-time-string "%A, %B %e, %Y")))

Спочатку вони прийшли з journal.el


2
Дякую. дуже мило. для тих, хто повністю є нубом у emacs: використовуйте це, додаючи його до свого .emacs.файлу та зберігаючи, а потім перемістіть курсор (точку) в кінцеві дужки кожної функції, а потім M-x M-eдля кожної. Тепер ви можете вставити за допомогою M-x nowабо M-x todayкуди завгодно.
celwell

21

Для вставки дати:

M-x org-time-stamp

Для вставки дати:

C-u M-x org-time-stamp

Ви можете прив’язати глобальний ключ для цієї команди.

org-modeМетод дуже зручний для користувача, ви можете вибрати будь-яку дату з календаря.


чи є спосіб відформатувати його інакше, ніж формат дати в організаційному режимі?
Асалле

1
Формат дати і часу вставки org-time-stampвказано параметром org-time-stamp-formats. ;; вставити дату з індивідуальним форматом. (нехай ((org-time-stamp-format '("% Y-% m-% d". "% Y-% m-% d% H:% M:% S")))) (org-time- штамп нуль)) ;; вставити дату з індивідуальним форматом. (нехай ((org-time-stamp-format '("% Y-% m-% d". "% Y-% m-% d% H:% M:% S")))) (org-time- штамп '(4)))
tangxinfa

15

Ви можете встановити yasnippet , який дозволить вам ввести "час" і клавішу табуляції, а також набагато більше. Він просто дзвонить current-time-stringза лаштунки, тому ви можете керувати форматуванням за допомогою format-time-string.


2
yasnippet - ресурсна свиня порівняно із вбудованими шаблонами та хіпі-розширенням.
Річард Хоскінс


2

М-1 М-! дата

це призводить до того, що команда оболонки, яку ви запускаєте, буде вставлена ​​в буфер, який ви зараз редагуєте, а не в новий буфер.


2

Дякую, CMS! Моя варіація, на що це варте, робить мене досить щасливим:

(defvar bjk-timestamp-format "%Y-%m-%d %H:%M"
  "Format of date to insert with `bjk-timestamp' function
%Y-%m-%d %H:%M will produce something of the form YYYY-MM-DD HH:MM
Do C-h f on `format-time-string' for more info")


(defun bjk-timestamp ()
  "Insert a timestamp at the current point.
Note no attempt to go to beginning of line and no added carriage return.
Uses `bjk-timestamp-format' for formatting the date/time."
       (interactive)
       (insert (format-time-string bjk-timestamp-format (current-time)))
       )

Я поміщаю це у файл, який викликається моїм .emacs за допомогою:

(load "c:/bjk/elisp/bjk-timestamp.el")

що одночасно полегшує модифікацію, не ризикуючи зламати щось інше в моєму .emacs, і дозволило мені легку точку входу в те, можливо, колись насправді дізнавшись, про що це програмування Emacs Lisp.

PS Критика щодо моєї техніки n00b дуже вітається.


1

Найпростіший спосіб без обстрілу на "дату", мабуть, такий:

(вставка (рядок поточного часу))


0

Ось мій погляд на це.

(defun modi/insert-time-stamp (option)
  "Insert date, time, user name - DWIM.

If the point is NOT in a comment/string, the time stamp is inserted prefixed
with `comment-start' characters.

If the point is IN a comment/string, the time stamp is inserted without the
`comment-start' characters. If the time stamp is not being inserted immediately
after the `comment-start' characters (followed by optional space),
the time stamp is inserted with “--” prefix.

If the buffer is in a major mode where `comment-start' var is nil, no prefix is
added regardless.

Additional control:

        C-u -> Only `comment-start'/`--' prefixes are NOT inserted
    C-u C-u -> Only user name is NOT inserted
C-u C-u C-u -> Both prefix and user name are not inserted."
  (interactive "P")
  (let ((current-date-time-format "%a %b %d %H:%M:%S %Z %Y"))
    ;; Insert a space if there is no space to the left of the current point
    ;; and it's not at the beginning of a line
    (when (and (not (looking-back "^ *"))
               (not (looking-back " ")))
      (insert " "))
    ;; Insert prefix only if `comment-start' is defined for the major mode
    (when (stringp comment-start)
      (if (or (nth 3 (syntax-ppss)) ; string
              (nth 4 (syntax-ppss))) ; comment
          ;; If the point is already in a comment/string
          (progn
            ;; If the point is not immediately after `comment-start' chars
            ;; (followed by optional space)
            (when (and (not (or (equal option '(4)) ; C-u or C-u C-u C-u
                                (equal option '(64))))
                       (not (looking-back (concat comment-start " *")))
                       (not (looking-back "^ *")))
              (insert "--")))
        ;; If the point is NOT in a comment
        (progn
          (when (not (or (equal option '(4)) ; C-u or C-u C-u C-u
                         (equal option '(64))))
            (insert comment-start)))))
    ;; Insert a space if there is no space to the left of the current point
    ;; and it's not at the beginning of a line
    (when (and (not (looking-back "^ *"))
               (not (looking-back " ")))
      (insert " "))
    (insert (format-time-string current-date-time-format (current-time)))
    (when (not (equal option '(16))) ; C-u C-u
      (insert (concat " - " (getenv "USER"))))
    ;; Insert a space after the time stamp if not at the end of the line
    (when (not (looking-at " *$"))
      (insert " "))))

Я вважаю за краще пов'язати це C-c d.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.