2010/12/24

今日の elisp (insert-index)

さまざまなコードを書く仕事柄 Emacs は仕事では欠かせないツールですが、自宅と会社と .emacs をいろいろいじっていたのは昔の話でした。ところで最近、海外のサーバーから飛ばした若干狭い Window 上で Emacs を動かす機会が増えて来て、メニューバーが邪魔に感じるようになり .emacs に (menu-bar-mode 0) を追加して消してすっきり。メニューバーが必要になったら M-` で呼び出せばいいんです。

さて今日の elisp は insert-index。コードを書いていて変数に連番を入れたい時に重宝します。
例えば、

data[0]
data[1]
data[2]
...
data[9]

めんどうくさいし、間違ったら面倒。そういう時に、data[] をコピーして縦に必要数ペーストした後、先頭(最後)のカッコの中でマーク(C-SPC)して、最後(先頭)のカッコの中にカーソルを移動(ポイント)。その後に M-x insert-index を呼び出すだけ。若い行の方から 0 を初期値としてインクリメントした数値を埋めて行きます。その他、初期値を変更したり、フォーマットをオプションで変えられる関数も作ってみたけど、結局シンプルな今の関数に落ち着きました。
コードはいかに示す通り(二つの関数で構成されてます)。別ファイルにしてもいいのだけど、短いので .emacs に入れてしまってもいいかも。また、キーバインドに余裕があれば、お好きなキーにアサインして下さい。

※とりあえず以下を全部 .emacs にコピーペーストすれば関数が C-t で起動するようになります。

;; キーバインドの例 (任意)
(global-set-key "\C-t" 'insert-index)

;; insert-index 関数本体 insert-index-calc も必要です
(defun insert-index (beg end)
  (interactive "r")
  (let ((num 0)
(istart 0)
(istep  1))
    (setq num (1- (* istep (count-lines beg end))))
    (goto-char beg)
    (insert-index-calc istart num istep)))

(defun insert-index-calc (index end step)
  (if (> index end)
      nil
    (progn
      (let ((str ""))
(setq str (format "%d" index))
(insert str)
(forward-char (- (length str)))
(next-line 1)
(insert-index-calc (+ index step) end step)))))