SICP のために Emacs の環境を整えた

# SICP のために Emacs の環境を整えた

Emacs をやるならなんか目標がほしいなという思いつきで環境構築。メモには org-mode を使う。

テキストは[真鍋訳](https://github.com/hiroshi-manabe/sicp-pdf)

Youtube に MIT の講義があったので興味がある方はどうぞ
- [Lecture 1A: Overview and Introduction to Lisp - YouTube](https://www.youtube.com/watch?v=-J_xL4IGhJA&list=PLE18841CABEA24090)


Github には SICP の解答例やライブラリなどが公開されているので詰まったりソースコードが動かなかった場合は検索するといいだろう。

##   環境

- OS: Ubuntu
- Emacs:version 29.3
- Scheme: gauche 0.9.10-3build1

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
```

##  エディタに求めるもの

    1.  必要
        1.  動作の軽さ
        2.  起動の速さ
        3.  外部プログラムの使いやすさ
        4.  正規表現による置換
    2.  ほしい
        1.  矩形選択
        2.  連番の入力補助
    3.  あったらうれしい
        1.  矢印キーなしの移動
        2.  入力補完機能

##   インストール

gauche は apt で一発で入った。

```bash
$ sudo apt-get install gauche
```

- apt を使いたくない、または Ubuntu 以外の OS、ディストリビューション使いは以下を参照
    - [Gauche ダウンロードページ](https://practical-scheme.net/gauche/download-j.html)


以下では自分で Emacs をコンパイルしますが、大体のパッケージマネージャーからインストールできますから、管理者権限があって、こだわりが無いならそっちからインストールしても大丈夫です。

Emacs は GNU のサイトから tar ボールをダウンロードしてきて、
解凍、`./configure` と `make` をすればコンパイルできる。

[GNU Emacs download - GNU Project](https://www.gnu.org/software/emacs/download.html#gnu-linux)

コンパイルをしようとすると足りないライブラリがアレコレでてくるので
一個一個 apt search して install すれば良し。わからなければパッケージ名でググるとだいたい解決する。

このときのオプションは次のようにした

```bash
$ ./configure --prefix=/home/user --with-imagemagick --with-json --with-native-compilation
```

`--prefix=` はビルドする場所を選ぶことができる。管理者権限なしでもビルドができる。
`--with-native-compilation` はバイトコンパイルされた設定ファイルを使えるようになる。動作が速くなるらしい。必ず入れよう。
`--with-json` json を使うので入れた
`--with-imagemagick` 同上

 ただ、--with-jsonをつけてビルドしようとしてパッケージが足りない場合、`apt search`が教えてくれる候補パッケージが多すぎて分かりづらい。

```bash
$ sudo apt install libjansson-dev
```

で動いた。

今回はホームにビルドしたので .bashrc に

```bash
# 好きな場所に emacs を置ける
$ alias E='~/bin/Emacs/emacs'
```
などと書き込んでおくと便利

## 設定

Emacs の設定ファイルは init.el です。
中身は基本的に[2020年代のEmacs入門](https://emacs-jp.github.io/tips/emacs-in-2020)をそのままコピペする。

それから、個人的な設定をしていく。
ファイルは上記の記事に倣って `~/.emacs.d` に置きます。

以下、私の例
```elisp
;;; 個人的な設定

;; 起動画面を映さない
(setq inhibit-startup-screen t)
;; 行番号を表示
(global-display-line-numbers-mode)
;; gauche 設定
;; gosh が呼び出せるようになる
(custom-set-variables '(scheme-program-name "/usr/bin/gosh -i"))
(autoload 'scheme-mode "cmuscheme" "Major mode for scheme." t)
(autoload 'run-scheme "cmuscheme" "Run a n inferior Scheme process." t)

;;; キーバインド
(add-hook 'scheme-mode-hook
    #'(lambda ()
        ;; 直前の S 式を gosh インタープリタに送る
        (define-key scheme-mode-map (kbd "<f5>")  'scheme-send-last-sexp)
        ;; gosh インタープリタを開く
        (define-key scheme-mode-map (kbd "<f6>")  'run-scheme))
)
```

最後に init.el をバイトコンパイルする

```bash
# 上記の通り alias E='~/bin/Emacs/emacs' している
# ~/.emacs.d 以外に init.el を置きたい場合は各自深めてください

$ E --batch -f batch-byte-compile ./init.el
```

バイトコンパイル時に警告が出るが動く。

## 便利コマンド早見表

必須というわけではないが便利なコマンドの表

| key         | name              | description                 |
|-|-|-|
| C-a         |                   | 行頭に移動            |
| C-e         |                   | 行末に移動            |
| C-SPC       |                   | 選択開始              |
| M-<         |                   | バッファの最初に移動   |
| M->         |                   | バッファの最後に移動   |
| C-x o       | other-window      | window 移動           |
| C-x 2       |                   | window を 2 分割        |
| C-M-\       | indent-region     | 選択範囲内の自動インデント|
| C-M-q       | indent-sexp       | 直前の S 式の自動インデント|
| M-g i       | imenu             | 見出しから移動        |
| M-s o       | occur             | 正規表現で見出しを作る |
| C-c C-x TAB | org-clock-in      | 時間カウントし始める   |
| C-c C-x C-o | org-clock-out     | 時間カウント終わる    |
| C-c C-x C-x | org-clock-in-last | 時間カウント再開      |

##   感想

-   Emacs Lisp によるカスタマイズ性が高い
    - プラグインの文化が根付いていると感じた
        - あまり深入りしないようにしたい
-   キーバインドが辛い
    -   手が小さいので、指をいっぱいに伸ばすよりモードでキーの意味が変わるほうが好き
-   Org-mode が最高
    -   チェックボックス
    -   画像表示
    -   折り畳み
    -   テーブル
    -   タイマー