以前出したファイルのデュプリケート・コマンドにマークをつくようにしてみました。
dired でポイントされているファイルのファイル名の日付部分を現在の時間にしてデュプリケートします。
複製されたファイルには dired 上で W
マークがつきます。
ファイル名に日付部分が無ければ付け足します。
前の版だと秒の部分がなくて出来立てのファイルだと元の版と衝突してデュプれないとかあったので、秒もつけました。
自分の場合プログラムの更新をするとき目的のファイルをまずデュプリケートして複製されたものをいじっていき公開する版ではじめて ci して版が更新されます。
公開されるものの間と間にもいくつものマイナー版があったりなかったりです。
そもそもリビジョン・コントローラの類いはこういう雑多な手間を省くことも目的のひとつなんですが、自分の場合目標を実現するためにいくつかの段階を経てそこに到達させる事も多いので、この方が気楽にいじれていいのです。
以下を init.el
の中にそのまま入れるか dup-file.el
等として load するようにします。
dup-file.el
(require 'dired)
(require 'dired-aux)
(defvar dup-regexp "[12][0-9][0-9][0-9][01][0-9][0-3][0-9]\\([0-9][0-9]\\)*")
(defvar dup-char ?W)
(defun dup-date-part-update (file-name &optional date)
"FILE-NAME に `dup-regexp' が含まれていれば、\
その部分を現在の日付に置き換えた文字列を返す.
含まれていなければノードとエクステンションの間に\
日付を挟んだ文字列を返す.
DATE が non-nil なら日付をその日にする."
(let* ((node (file-name-sans-extension file-name))
(ext (file-name-extension file-name))
(date (format-time-string
"%Y%m%d%H%M%S" (or date (current-time))))
(reg dup-regexp))
(if (string-match reg file-name)
(replace-regexp-in-string reg date file-name)
(concat node "-" date "." ext))))
(defun dup-file (file &optional date)
"FILE 名に現在の日付を埋め込んだ複製を作ります.
DATE が non-nil ならタイムスタンプもコピーします."
(let ((new (dup-date-part-update file date)))
(if (string-equal file new)
(error "デュプリケートが同じ名前になる")
(copy-file file new nil date)
new)))
;;;###autoload
(defun dired-dup-file (prefix)
"ポイントのファイルを日付つきの名前にして複製します.
prefix 在りならタイムスタンプもコピーし名前の日付もその日にします."
(interactive "P")
(let* ((file (car (dired-get-marked-files)))
(date (if prefix (nth 5 (file-attributes file)))))
(dired-add-file (dup-file file date) dup-char)))
;; 任意のキーにバイド
(add-hook 'dired-mode-hook
(lambda ()
(define-key dired-mode-map "\C-cd" 'dired-dup-file)))
;; 単独のファイルにする場合は以下もつける
(provide 'dup-file)
Changes
- Sat Jan 23 10:04:43 2021
prefix をつけて実行するとタイムスタンプも複製され、 生成される日付もそのファイルのタイムスタンプのものになります。