【Linux】Emacs Lisp（Elisp）の基本文法と実際の使い方

Emacs Lisp（Elisp）は、Emacsエディタをカスタマイズするために使用されるプログラミング言語です。この記事では、Emacs Lispの基本文法を学び、実際にスクリプトとして保存して実行する方法を解説します。また、Emacsの設定ファイル（`init.el`）でのElispの使用方法についても紹介します。

## 1. Lispとは

**Lisp（リスプ）**は、1950年代に登場したプログラミング言語の一つで、特に**リスト処理**に強みを持っています。Lispの特徴は、「データとコードが同じ形式で表現できる」点です。Lispでは、すべての式がリスト（S式）として書かれ、コードもデータもリストとして扱います。この特性により、Lispは非常に柔軟で高い抽象度を持った言語となっています。

例えば、Lispで「1 + 2」を計算する式は次のように書きます：

```lisp
(+ 1 2)  ; 結果: 3
```

ここで、`+`が演算子、`1`と`2`が引数です。すべてがリスト形式で表現されており、非常にシンプルで読みやすい構造です。

## 2. Emacs Lispとは

`Emacs Lisp (Elisp)`は、Emacsエディタを拡張・カスタマイズするために使用されるLisp系のプログラミング言語です。Emacsは強力でカスタマイズ性の高いエディタで、その動作やインターフェースは主にElispを使ってカスタマイズします。ユーザーは`init.el`という設定ファイルにElispコードを記述して、Emacsの動作を自分好みに変更することができます。

例えば、キーバインディングの変更、パッケージのインストール、テーマの変更など、Emacsのあらゆる設定はElispで実現できます。

## 3. Emacs Lispの実行方法

Elispのコードは、Emacs内でスクリプトとして保存し、後で実行することができます。これにより、Emacsの設定や自分で書いた関数を再利用できます。

### 3.1. スクリプトの保存

Elispコードをファイルに保存するには、通常のテキストファイルとして保存します。ファイルの拡張子は`.el`が一般的です。例えば、以下のようなコードを`test.el`という名前で保存します：

```lisp
(defun square (x)
  "xの2乗を返す関数"
  (* x x))

(setq result (square 5))
(message "5の2乗は: %d" result)  ; 結果: 25
```

### 3.2. スクリプトの実行

Elispスクリプトを実行する方法は以下の通りです：

1. Elispコードをファイル（例えば、`test.el`）として保存します。
2. Emacsでそのファイルを開き、`M-x load-file`を実行して、スクリプトを読み込みます。

実行すると、`*Messages*`バッファに次のように表示されます：

```
5の2乗は: 25
```

## 4. Emacs Lispの基本文法

### 4.1. 関数の定義

Elispでは、関数を定義するために`defun`を使用します。例えば、引数`x`を受け取って、その2乗を返す関数は次のように定義します：

```lisp
(defun square (x)
  "xの2乗を返す関数"
  (* x x))
```

この関数`(square)`は、引数`x`に対して`x * x`を計算して返します。

#### 実行例
定義した関数を実行すると、次のように`x`の2乗が計算されます：

```lisp
(square 4)  ; 結果: 16
```

### 4.2. 変数の定義

変数の定義は`setq`を使います。例えば、変数`x`に`10`を設定するには次のように書きます：

```lisp
(setq x 10)
```

#### 実行例
変数`x`の値を確認するには、次のように書きます：

```lisp
x  ; 結果: 10
```

### 4.3. 条件分岐（`if`）

Elispでは`if`を使って条件分岐を行います。例えば、引数`x`が正の数かどうかを判定する関数を定義するには次のように書きます：

```lisp
(defun positive? (x)
  "xが正の数かどうかを判定する関数"
  (if (> x 0)
      t  ; 正の場合はtを返す
    nil))  ; 負または0の場合はnilを返す
```

#### 実行例
関数`positive?`を使って、いくつかの値を確認してみましょう：

```lisp
(positive? 5)  ; 結果: t
(positive? -3) ; 結果: nil
```

### 4.4. リストの操作

Elispではリストが基本的なデータ型です。リストを作成するには、次のように書きます：

```lisp
(setq my-list '(1 2 3 4))
```

リストから最初の要素を取り出すには`car`、残りの要素を取り出すには`cdr`を使います：

```lisp
(car my-list)  ; 結果: 1
(cdr my-list)  ; 結果: (2 3 4)
```

### 4.5. ループ（`while`）

Elispでは、`while`を使ってループ処理を行うことができます。例えば、`i`を1から5まで増やして表示するループを作成する場合、次のように書けます：

```lisp
(setq i 1)
(while (<= i 5)
  (message "iの値は: %d" i)
  (setq i (+ i 1)))
```

このコードは、`i`が5以下の間、`i`の値を1ずつ増やして表示します。


## 5. `init.el`での実践的な使い方

`init.el`は、Emacsの設定ファイルで、Emacsを起動するたびに実行されるElispコードが書かれています。このファイルを使ってEmacsの動作をカスタマイズすることができます。以下では、`init.el`の一部を使って実際のElispコードを紹介し、理解を深めます。

### 5.1. パッケージ管理の設定

まず、`init.el`で外部パッケージをインストールするための設定を行います。例えば、`use-package`を使って`magit`をインストールするコードは次のようになります：

```lisp
;; パッケージアーカイブを設定
(require 'package)
(setq package-archives '(("melpa" . "https://melpa.org/packages/")))
(package-initialize)

;; 'use-package'がインストールされていない場合はインストール
(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

;; Magitをインストール
(use-package magit
  :ensure t)
```

このコードでは、MELPAリポジトリを設定し、`use-package`を使って`magit`をインストールしています。

### 5.2. キーバインディングのカスタマイズ

次に、キーバインディングを変更する方法です。`init.el`に以下のコードを追加することで、`C-x g`で`magit-status`を呼び出すように設定できます：

```lisp
(global-set-key (kbd "C-x g") 'magit-status)
```

これにより、`C-x g`を押すことでGitの操作を行う`magit`が起動します。

## 6. まとめ

Emacs Lisp（Elisp）は、Emacsのカスタマイズを行うために非常に強力で柔軟なツールです。この記事では、Elispの基本的な文法を紹介し、スクリプトを保存して実行する方法を解説しました。さらに、`init.el`を使った実践的な設定方法も学び、Emacsを自分好みにカスタマイズするための第一歩を踏み出しました。Elispの力を活用して、作業環境をさらに便利にしていきましょう。