Emacs Lispに挑戦

今まで「あんなに括弧だらけの言語やってられるか!」と、見て見ぬふりをしてきたEmacs Lispだが、興味が無かったわけではなかったので挑戦することにした。極めるとまでいかなくても、ちょっとしたときに自分でEmacsをカスタマイズ出来ればかなり楽しいはず。

もう少し勉強したら、説明ページでも作るつもりだけれど、興味がある人のためにメモ程度にここで書いておく。

まず、Emacs Lisp(以下、Elisp)の実行方法だ。これにはいろいろあるわけだけど、練習段階ではM-x eval-buffer・M-x eval-region・lisp-interaction-modeのいづれかが良いと思う。最初の二つはそれぞれ『カレントバッファ内のLispを実行』と『リージョン内のLispを実行』という意味だ。最後のlisp-interaction-modeはEmacs起動時に自動的に開く*scratch*バッファのモードなのだが、このモードの時はC-jで現在の行のLispを実行出来る。例えば、以下のように書いてC-jとタイプすると10と表示される。

(+ 8 2)  ; この行末でC-jとタイプ
10

見てわかると思うが、ElispLisp全般)では前置記法が使われる。だから上記の式は中置記法では8+2という意味になるわけだ。この程度のことだと簡単なのだが、凝ったことをしようとすると、覚えることが増えるのでそれは別の日に。とりあえず、.emacsに書いておいて、ちゃんと動作する例を紹介してみる。次のputdateというのは現在のカーソル位置に日付を入力するコマンドだ。これを.emacsに記入しておき、M-x putdateで実行できる。

(defun putdate() (interactive)
  (insert (format-time-string "%4Y/%2m/%2d"(current-time))))

Elispではカーソル移動、正規表現、ウィンドウ操作、バッファ操作といったことが結構簡単に出来るので、書き方さえ分かればいろいろ出来ると思う。


簡単なメジャーモードを作ることまでは出来たのだけど、構文テーブルの扱いがわからない。これが出来れば自作の色付けパターンが出来るはずなのだが…。


(追記)

色づけ出来た。以下、例。

;; "\" になっている文字は実際は半角のバックスラッシュになる。
(modify-syntax-entry ?# "\"")
(modify-syntax-entry ?C "\"")
(font-lock-mode t)

これで、#(シャープ)またはC(大文字のC)で挟まれた箇所を文字列として色づけしてくれる(C言語などのダブルクオートと同じ扱いになる)。かなり面白い。目指すはHatena::Diaryモードだな*1

*1:すでに作っている人がいるのは知っているが、格好の練習題材なので再発明でも良い