Emacs Lispは、
テキストエディタGNU
EmacsおよびX
Emacsで使用されるプログラミング言語であり、LISPの方言です。
Emacsの核となる編集機能の多くが
Emacs Lispで実装されており、ユーザーによるカスタマイズや機能拡張にも広く用いられます。
- - スクリプト言語としての利用: コマンドラインや実行ファイルから呼び出すことができ、バッチ処理にも対応しています。
- - Maclisp方言との関連性: Common Lispの影響も見られますが、Maclisp方言との関係が深く、手続き型プログラミングと関数型プログラミングの両方をサポートします。
- - 動的スコープ: デフォルトで動的スコープを使用しており、関数の呼び出し関係で変数が共有されます。これにより、柔軟なカスタマイズが可能ですが、意図しない変数へのアクセスによるバグも発生しやすい側面があります。
- - 拡張性の高さ: Emacsの機能をユーザーが自由に拡張・変更できることが、Emacs Lispの大きな魅力です。簡単なキーバインドの変更から、複雑な機能追加まで、Emacs Lispを用いて実現できます。
Emacs Lispは、`.el`という拡張子の
テキストファイルに保存されます。
Emacsがこれらのファイルを読み込むと、インタプリタによって関数や変数が解析され、実行可能な状態になります。
カスタマイズの例
Emacs Lispを用いたカスタマイズ例として、ウィンドウ分割時の挙動変更があります。
例えば、`C-x 2`でウィンドウを分割する際、新しいウィンドウに別の
バッファを表示させるには、以下の
Emacs Lispコードを使用します。
lisp
(defun my-split-window-function ()
(interactive)
(split-window-vertically)
(other-window 1)
(next-buffer))
(global-set-key (kbd "C-x 2") 'my-split-window-function)
このコードは、`split-window-vertically`関数を呼び出し、その後、別の
バッファを表示するようにしています。`global-set-key`関数で`C-x 2`のキーバインドにこの関数を割り当てることで、キー操作だけでこの動作を実現できます。
`advice`機能
`advice`機能を使うと、既存の関数を再定義せずに処理を追加できます。上記の例は、`advice`を用いると以下のように記述できます。
lisp
(defun my-split-window-advice (function &rest args)
(apply function args)
(other-window 1)
(next-buffer))
(advice-add 'split-window-vertically :after 'my-split-window-advice)
`advice-add`を使用すると、`split-window-vertically`関数が実行された後に、`my-split-window-advice`関数が実行されるようになります。
実行と保存
これらの変更は、`M-x eval-buffer`コマンドを使ってコードを評価するとすぐに反映されます。
Emacsの設定ファイル(通常は`~/.emacs`)に保存することで、次回の起動時にもこれらのカスタマイズが適用されます。
Emacs Lispのコードは`.el`ファイルに保存されます。
Emacsは、これらのファイルを読み込むことで関数や変数をメモリにロードし、実行します。また、`.elc`という拡張子の
バイトコードファイルにコンパイルすることも可能です。
バイトコードは、ソースコードよりも高速にロード・実行でき、ディスクスペースやメモリ使用量も節約できます。
プリミティブ
Emacs Lispの一部の機能は
C言語で実装されており、これらはプリミティブと呼ばれます。プリミティブは
Emacsの
実行ファイルの一部であり、高速な実行が求められる場合や、
Emacs Lispからアクセスできない外部データを利用する場合に使用されます。ただし、
C言語のコードにバグがあるとエディタがクラッシュする可能性があるため、プリミティブの数は限られています。
言語機能
Emacs Lispは、動的スコープを採用しており、変数のスコープは関数呼び出しの際に決定されます。静的スコープに比べると柔軟性が高い反面、バグが発生しやすいというデメリットも持ち合わせています。近年では、静的スコープ(字句スコープ)を導入する動きもありますが、まだ完全に移行していません。
Emacs Lispは、末尾再帰の最適化をしません。そのため、再帰処理を多用するとスタックオーバーフローが発生する可能性があり、注意が必要です。
まとめ
Emacs Lispは、
Emacsエディタをカスタマイズ・拡張するための強力なプログラミング言語です。動的スコープや
バイトコードコンパイルなどの特徴を持ち、柔軟なプログラミングが可能です。
Emacsの利便性を最大限に引き出す上で、
Emacs Lispは欠かせない存在です。