auto-insert-modeでひな形を自動入力

スクリプトの最初の行の

#!/usr/bin/env ruby

みたいなのってシバンって呼ぶらしい。

新しいスクリプトを書くときにこれをいちいち書くのって面倒だなあと思ってた。
pythonとかだとimport sys, osあたりも必ず書くからなおのこと面倒だった。
emacsにauto-insert-modeというのがあって、ひな形を自動入力してくれるらしい。
新しく何かを入れる必要はなくて、init.elとかに

(require 'autoinsert)
(add-hook 'find-file-hooks 'auto-insert)
;; (setq auto-insert-query nil) ;; 自動補完しますか?って最初に聞かれる機能のオンオフ

と書けばよい。
C-x fとかで新しいファイルを作ると、拡張子で判断してそれぞれの自動入力がスタートする。
ミニバッファで何か聞かれたり聞かれなかったりして、その結果に応じて自動的にいろいろと入力してくれる。
デフォルトではc++のヘッダとかemacs lispのひな形とかが入っていた。
emacs lispのひな形は自動的にGNUライセンスとかまで入れてくれてなかなかの見物。

ひな形はテキスト形式かSkeleton言語形式で与えられる。
テキスト形式だと入力されることはされるんだけどカーソルが一番上にあって面倒だからSkeleton言語で書くほうがおすすめ。
デフォルトのひな形を全部切って、よく書くスクリプトのやつだけ書いた。

;; テキスト形式で与える方法
;; (setq auto-insert-directory "~/.emacs.d/insert/") ;; 最後にスラッシュ必要
;; (define-auto-insert "\\.rb$" "template.rb")
(setq auto-insert-alist nil) ;; デフォルトのひな形を一度全部オフにする。
(setq auto-insert-alist
      (append '(
                (("\\.rb$" . "ruby template")
                 nil ;; ここに"name?"とか書くと、最初にミニバッファで"name?"ってでて入力を促される。入力したものはstrという変数に入る。
                 "#!/usr/bin/env ruby\n"
                 "\n"
                 _ ;; アンダーバーを書いたところにカーソルが移動する
                 )) auto-insert-alist))
(setq auto-insert-alist
      (append '(
                (("\\.py$" . "python template")
                 nil
                 "#!/usr/bin/env python\n"
                 "\n"
                 "import sys, os, math\n"
                 "# import numpy as np\n"
                 "# import scipy as sp\n"
                 "# import ROOT\n"
                 "# import pyfits as pf\n"
                 "\n"
                 _
                 )) auto-insert-alist))
(setq auto-insert-alist
      (append '(
                (("\\.sh$" . "shell script template")
                 nil
                 "#!/bin/bash\n"
                 "\n"
                 _
                 )) auto-insert-alist))

これでたとえばhoge.rbというファイルを新しく作ると

#!/usr/bin/env ruby

って入力されて、3行目にカーソルが移動した状態から編集をスタートできる。

ちなみにシバンがあるファイルを保存したときに、実行権限がなければ自動的にchmodして実行権限をつけるということもできる。

(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)

ここも参考になった。
autoinsert mode - Yasuto Takenaka 's
autoinsert