Home About Contact
Emacs , Emacs Lisp

date コマンドの結果を Emacs のバッファに挿入

insertshell-command-to-string を使うと、実行したコマンドの結果を emacs の buffer に挿入できることがわかった。

date コマンドを試してみる。

普通に シェル で実行した場合:

$ date
Tue Oct 29 08:11:56 AM UTC 2024

emacs を起動して *scratch* で書いてみる。

(shell-command "date" t)

C-j すると:

171
Tue Oct 29 05:04:26 PM JST 2024

date の標準出力が挿入された。

171 というのがなんなのかまだわかっていない。

ならば、これを変数に入れてみよう。

変数 v に hello という文字列を入れるには:

(setq v "hello") ; ここで C-j
"hello"

v ; ここで C-j
"hello"

shell-command-to-string という関数がある。

(shell-command-to-string "date") ; ここで C-j
"Tue Oct 29 05:21:50 PM JST 2024
"

これで date を shell で実行した結果を得ることができる。 ただ末尾に改行が入っている。 この改行を削除したい。

正規表現を使って末尾の改行文字を削除する remove-line-break 関数を書く。

(defun remove-line-break (v)
  (replace-regexp-in-string "\n$" "" v))

これと先ほどの日付文字列を取得するやつをあわせて使えば:

(defun remove-line-break (v)
  (replace-regexp-in-string "\n$" "" v)) ; ここで C-j
remove-line-break

(remove-line-break (shell-command-to-string "date")) ; ここで C-j
"Tue Oct 29 05:28:29 PM JST 2024"

改行を削除した日付文字列を得ることができました。

日付文字列を変数 v に代入したければ次のように書く:

(setq v (remove-line-break (shell-command-to-string "date")))

この v の値の文字列をカーソル位置に挿入したければ:

(insert v)

挿入操作時点でのカーソル位置を維持したければ save-excursion を使う。

(save-excursion (insert v))

日付情報を挿入する関数 my-date

date コマンドを次のように実行すると yyyy-mm-dd の形式で日付情報を得ることができる。

$ date +%Y-%m-%d
2024-10-29

これと今まで試したことを使って 編集中バッファのカーソル位置に yyyy-mm-dd 形式で日付を挿入する関数 my-date をつくる。

例によって ~/.emacs.d/foo/my-date.el にコードを書く。

(defun remove-line-break (v)
  (replace-regexp-in-string "\n$" "" v))

(defun my-date ()
  (interactive)
  (save-excursion (insert (remove-line-break (shell-command-to-string "date +%Y-%m-%d")))))

そして、この my-date 関数が使えるように ~/.emacs.d/init.el に登録:

(add-to-list 'load-path "~/.emacs.d/foo")
(autoload 'my-date "my-date" "日付を挿入" t)

emacs を起動し直して適当なバッファで M-x my-date すると、現在のカーソル位置に日付 2023-10-29 が挿入されます。

以上です。