insert と shell-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))
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 が挿入されます。
以上です。