Emacs設定講座 その3「scratch バッファと eval(評価)」。

追記 この記事を元に書籍が出来ました!

時間と命を削って、より詳細に解説しましたので、Emacs に興味がある人はぜひ一度手に取ってみて下さい。

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

前回は install-elisp を使った elisp のインストールから設定の調べ方あたりを紹介しました。
今回は多分、今後入門記事を書く中でも、個人的に最も重要だと思う内容です。
例えば色の設定やインデントなど、色々と試してから実際に使っていきたい項目がありますが、.emacs に書いた設定を、いちいち再起動したり、load したりして読み込むのはとても面倒です。エラーが出てたり、その結果が分からなかったりしたら、もう最悪です。
実は、Emacs の設定は、その設定を評価した瞬間に反映されます。.emacs に書かれた設定は、Emacs 起動時に全て評価して下さいという設定の項目リストに過ぎなかったのです。
とりあえず、設定を評価してみるには、scratch バッファを使うのが最適です。scratch バッファが使える様になると、Lisp の勉強にも最適ですし、Emacs への理解も深まり、良い事づくめです。
この記事を読めば、まだ Emacs よく分かんないよーという人も、ちょっぴり幸せになること間違いなしです。

scratch バッファとは?

Emacs を起動して、最初に開かれている scratch バッファ。
メモの場所かと思いきや、終了すると内容が残りませんし、Emacs を使い始めたばかりの頃は、何のためにあるのかさっぱりです。
scratch (スクラッチ) バッファというのは「Emacs Lisp の実行環境です」という説明が多いと思いますが、実際には、Emacs の設定を試し書きしたりする場所という感じです。
早速、試してみましょう。

(- 1983 1925)

と scratch バッファ(以下、scratch) に入力して、とじ括弧の後ろにカーソルがある状態で、C-j (Ctrを押しながらj) というキーバインドを使ってみましょう。

すると、こんな感じで、1983 - 1925 の解、58 がすぐ下の行に表示されます。
(- 1983 1925) というのは、Lisp (というプログラミング言語) の式です。もの凄くテキトーかつ簡単に Lisp について説明しておくと、数学の式とは違い、+ とか - などの演算子っぽいもの(正確には関数)を先頭に置いて式を作る(前置記法)言語です。参考: Karetta|Gaucheプログラミング(立読み版)|LispとScheme
式を実行(計算)する事を評価(evaluation)すると言います。eval と言うと、プログラムをした事のある人にとってはおなじみですね。
C-j は scratch 上では、eval-print-last-sexp というコマンドが実行されます。これは、カーソルの最寄りの関数や変数を評価して、返り値を下の行に表示してくれます*1

設定を即時反映してみる。

(transient-mark-mode t)

という式をscratchに書いて、C-j すると、t という文字が返されます。

transient-mark-mode というのは、リージョンを一時的にハイライト表示するための設定です。Emacs の設定は、その設定を評価した瞬間から有効になるので、範囲選択してみると、既にハイライトされます。

オフにしたければ、(transient-mark-mode nil) の様に t を nil に変更して C-j すれば。今度は nil と表示され、リージョンがハイライトしない様になります。
transient-mark-mode がオンの状態で、次の式を評価してみましょう。

(set-face-background 'region "darkgreen")

リージョンの背景色が darkgreen に変化したはずです。色の変更について詳しくはMeadow/Emacs memo: フェイスの変更を参考にして下さい。

という感じで、elisp の設定を変更したり、追加したりするときは、まずscratchで評価して、試してみてから .emacs に記述するという流れを身につけると、作業を進めながら設定をいじる事が出来るので、面倒な感じが大幅に軽減されます。
Emacs の設定を変更するたびに、再起動するのはこれでおさらばという訳です。
ただし、今 eval した設定は、あくまで今だけのものですので、今後も Emacs を起動するたびに使いたければ、先ほどの式を .emacs に記述しておく事で、毎回起動時に評価されて使える様になります。

どこでも eval。

C-j の eval-print-last-sexp はで式を評価してその結果を下の行に表示します。これは結果を残せるという意味で非常に便利ですが、モードのオン・オフなどは、別に t とか nil しか返さないので結果を残さなくて良かったりします。
また、C-j のキーバインドlisp-interaction-mode のキーバインドなので、例えば .emacs に書いてある式を評価してみたいという時にはモードを変更しないと使えません。
Emacs には、グローバルなキーバインドに C-x C-e で eval-last-sexp というコマンドが登録されています。
これは、eval-print-last-sexp の print を抜いた版、つまり結果を残さずに評価するコマンドです。結果は一時的にミニバッファ(一番下のコマンドを打つ場所)に表示されますが、編集バッファ内には残りません。そして、どのモードでも使えます。

長くなってきたので、そろそろ纏め。

  • Emacs の設定は、式を評価した時点で反映される。
  • scratch バッファで C-j で式を評価できる。
  • どのバッファ・モードでも C-x C-e で式を評価できる(ただし、計算結果は残らない)。

という3点を紹介しました。
以前の記事で何度か言いましたが、Emacs の設定は全て Lisp で書かれています。しかし、多くの設定はオン・オフを指定するか、設定値を与えてやるくらいです。
オン・オフは、(設定名 設定値) という形になっている事が多いので、(設定名 t) でオン、(設定名 nil)でオフと覚えておけば問題ありません。
設定値は文字数や秒数などの数値、また load-path などの文字列を指定する感じなので、(setq 設定名 数値)、(setq 設定名 "文字列") と覚えておきましょう。
あとは、elisp をどんどん導入して、詳しい設定を調べて、ばしばし評価して試して、最後に .emacs に設定を纏めるという流れになるでしょう。
そのうち、Lisp に慣れてきて、Emacs を使っている時にちょっとした計算をする場合は、電卓など使わずに Lisp で式を書いて評価してしまった方が楽になるかと思います。
Lisp をちょっと覚えてみたいなという人は、Lisp 一夜漬けが参考になります。僕も最初にここを見て Lisp に興味を持ちました。
最後に書き忘れてましたが、式を評価したときにエラーが出ると、エラー内容が Backtrace バッファに表示されます。大抵が、void-variable とか void-function だったりするんですが、void 系ってのは、そんなのねぇよ的なエラーなので、通常がスペルミスだったします。見なおしてから評価してみましょう。
こうして、エラーをチェックしてから .emacs に書くのも大切な事だったりします。
それではまた次回 :-)

*1:"正確には、scratch でなくとも、lisp-interaction-mode 上である、または、(global-set-key "\C-j" 'eval-print-last-sexp) という式を評価すれば、C-j でいつでも eval できます。しかしながら、scratch 以外では、C-x C-e を使う方が一般的です。