臆病者のためのEmacs入門〜2025年春に愛を込めて

# 震える手で Emacs を起動しよう

この記事は、

- Emacs に憧れを抱きながらも、その敷居の高さゆえに最初の一歩を踏み出す勇気を持てない
- 過去に何度も Emacs に入門しようとしたが、そのたびに挫折を繰り返し、もはや起動する勇気すら持てない

......そんな臆病者のための Emacs 入門記事です。

ほとんどのエンジニアがプログラミングエディタに VSCode を選ぶ現代にあって、あえて Emacs を選ぶ理由があるとすれば、それは「なんとなくカッコいいから」という憧れだけでしょう。

ドナルド・クヌース（Donald Knuth）、グイド・ヴァン・ロッサム（Guido van Rossum）、まつもとゆきひろ（Matz）、スティーブ・イエギ（Steve Yegge）など、錚々たる顔ぶれが揃いも揃って Emacs 推しと聞いて、「じゃあ俺も」と憧れを抱いてしまったと。

ところが、Emacs はそんなピュアな憧れを一蹴します。「なんとなくカッコいい」などという軟派で脆弱な動機だけでは、エベレストより高い入門障壁を乗り越えられないのです。

でも、名だたるハッカーたちが愛用するのには、それなりに理由があるはず。
それを知りたい、俺も使いたい、でも......

この記事は、そんな臆病者のための Emacs 入門記事です。

# インストール

Emacs のインストールは簡単です。Windows 版はインストーラ付きのバイナリパッケージが[配布されています](https://www.gnu.org/software/emacs/download.html)し、Mac 版も専用のパッケージが[配布されています](https://emacsformacosx.com/)し、Linux 版は apt でインストールできます。腕に覚えのある人は、ソースコードからビルドしてもよいでしょう。

インストールの敷居は低いので、各自好きな方法でインストールしてください。

# 設定ファイル

Emacs の設定は、すべて ```~/.emacs.d/init.el``` に、Emacs-Lisp と呼ばれるプログラミング言語で記述します。

......プログラミングに入門したくてエディタを選んだのに、そのエディタを使うためにプログラミング言語を１つ覚えなければならないのか......などと悲観する必要はありません。[Emacs の設定例などいくらでも落ちている](https://www.google.com/search?q=emacs+init.el+example&oq=emacs+init.el+example&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQABjvBTIHCAIQABjvBTIHCAMQABjvBTIKCAQQABiABBiiBDIKCAUQABiABBiiBDIGCAYQRRhA0gEINDIzNGowajeoAgCwAgA&sourceid=chrome&ie=UTF-8)ので、パクればいいだけです。

ここでは、適当なエディタ（VSCode でいいですよ！）で ```~/.emacs.d/init.el``` を開いて、下記をコピペしておきましょう。

```lisp:init.el
(eval-and-compile
  (when (or load-file-name byte-compile-current-file)
    (setq user-emacs-directory
          (expand-file-name
           (file-name-directory (or load-file-name byte-compile-current-file))))))

(eval-and-compile
  (customize-set-variable
   'package-archives '(("gnu"   . "https://elpa.gnu.org/packages/")
                       ("melpa" . "https://melpa.org/packages/")
                       ("org"   . "https://orgmode.org/elpa/")))
  (package-initialize)
  (unless (package-installed-p 'leaf)
    (package-refresh-contents)
    (package-install 'leaf))

  (leaf leaf-keywords
    :ensure t
    :init
    (leaf hydra :ensure t)
    (leaf blackout :ensure t)

    :config
    (leaf-keywords-init)))

(leaf leaf
  :config
  (leaf leaf-convert :ensure t)
  (leaf leaf-tree
    :ensure t
    :custom ((imenu-list-size . 30)
             (imenu-list-position . 'left))))

(leaf macrostep
  :ensure t
  :bind (("C-c e" . macrostep-expand)))

(leaf cus-edit
  :doc "tools for customizing Emacs and Lisp packages"
  :tag "builtin" "faces" "help"
  :custom `((custom-file . ,(locate-user-emacs-file "custom.el"))))

;;; ここに各自好きな設定を書く

(provide 'init)
```

この記述は「おまじない」です。なんのこっちゃ分からなくても構いません。Emacs に慣れてくると自動的に知ることになるので、いまは脳死でコピペしておいてください。

# 起動

それでは Emacs を起動します。初回起動時は少し時間がかかりますし、ずらずらと警告が表示されることがありますが、怯まずに待ちましょう。

下記ようなウィンドウが開けば起動成功です。ようこそ Emacs の世界へ！

![スクリーンショット 2025-03-01 11.20.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/74c16c1b-e93f-4f62-9ce5-ddfaf89ab85e.png)

# 外観の設定

さて、これからどんどん Emacs を使っていきたいのですが、その前にやっておきたいことがあります。それは外観の設定です。

Emacs の初期状態では見た目がクソダサいので、使っていて気分がアガりません。Emacs を使い続けるモチベーションを上げるためにも、外観をカッチョよく仕上げておきましょう。

```~/.emacs.d/init.el``` の「;;; ここに各自好きな設定を書く」の部分に、下記の記述を追加し、Emacs を再起動してください。

```lisp:init.el
(leaf doom-themes
  :doc "An opinionated pack of modern color-themes."
  :req "emacs-25.1" "cl-lib-0.5"
  :tag "faces" "themes" "emacs>=25.1"
  :url "https://github.com/doomemacs/themes"
  :ensure t
  :config
  (load-theme 'doom-dark+ t)
  (set-frame-parameter nil 'alpha 92))
```

どうでしょうか？ 背景が少し透過された、下記のようなウィンドウが開けば成功です。これでさっきよりは見た目がマシになりました。

![スクリーンショット 2025-03-01 11.38.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/76f88131-55f7-405f-a746-7b54446ec9d3.png)

なお、この外観は「doom-dark+」というテーマを適用したものです。どんなテーマがあるかは [doom-themes の公式レポジトリ](https://github.com/doomemacs/themes)にリストがあるので、好きなテーマを選ぶといいと思います。

# フォントの設定

次に、フォントを設定しておきたいと思います。ここでは、[Bizin ゴシック](https://github.com/yuru7/bizin-gothic)を使いたいので、```init.el``` に下記を追記します。

```lisp:init.el
(set-frame-font "Bizin Gothic 18")
```

当然ですが、フォントはあらかじめ OS にインストールされている必要があります。

プログラミングフォントとして名高かった Ricty Diminished はサポートが終了したので、個人的には、Bizn ゴシックか [PlemolJP](https://github.com/yuru7/PlemolJP) の二択ではないかと思います。

ちなみに、PlemolJP を使いたい場合は、以下のように設定します。

```lisp:init.el
(set-frame-font "PlemolJP light 18")
```

フォントが大きすぎる場合は、「18」の値を小さくしてください。

# キーバインド

さて、外観をカッコよくし、フォントも綺麗になったので、気分はアゲアゲのはずです。ここで、ようやく本格的に Emacs を触っていきましょう。

Emacs の特徴の１つとして、独特の「キーバインド」が挙げられます。これは特定のキー操作にコマンドや機能を割り当てる仕組みのことで、簡単に言うと、キーボードショートカットのことです。

キーバインドに習熟すれば、すべての操作をキーボードで完結させることができるため、マウスに手を伸ばす必要がなくなります。これによる作業効率の良さが、多くのハッカーたちを魅了する理由の１つです。

軽くググれば[キーバインドの一覧](https://hogehoge.konjiki.jp/emacs-command.html)が出てきますが、これらを全部覚える必要はありません。Emacs を辛抱強く使っているうちに、自分にとって有用なキーバインドだけが体に染み込み、残りは淘汰されていきます。

なお、Emacs で困ったら ```C-g``` を押してください。連打しても構いません。これは緊急脱出ボタンです。「困ったらとにかく ```C-g```」ですので、これだけは覚えておきましょう。

# Emacs で設定ファイルを編集

先ほどから編集している ```init.el``` を Emacs で開いてみてください。ファイルを開くキーバインドは ```C-x C-f``` です。

これを押すと、ウィンドウの下端領域（「ミニバッファ」と呼びます）でファイル名の入力を促されるので、```~/.emacs.d/init.el``` と入力しましょう。

![スクリーンショット 2025-03-01 14.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/245fb688-46ab-41af-a6dc-6d7e2ebacd75.png)

これまでは、他の適当なエディタ（VSCode とか！）で ```init.el``` を編集してきたと思いますが、これからは Emacs で Emacs の設定をいじっていきましょう。

なお、編集するにあたって最低限覚えておきたいキーバインドは、次の４つです。

| キーバインド | 機能         |
|:-----------|:------------|
| C-x C-s    | 変更を保存    |
| C-@        | マークセット  |
| M-w        | コピー       |
| C-y        | ペースト     |

# 設定例

ここでは、Emacs を活用するにあたっておすすめできる設定例を紹介します。なお、私の設定は [GitHub にアップしている](https://github.com/hajime-f/dotfiles/blob/master/init.el)ので、参考にしてください。

## 行番号の表示

プログラミングをするなら必須の設定です。下記の記述を追加しておきましょう。

```lisp:init.el
(global-display-line-numbers-mode t)
```

## 起動時のウィンドウの大きさの定義

下記の記述を追加することで、Emacs を起動した時に、ウィンドウをどの位置にどれくらい広げるかを設定できます。サイズ・位置の数値については、適当にいじってください。

```lisp:init.el
(setq default-frame-alist
      (append (list
               ;; サイズ・位置
               '(width . 200)           ; 横幅(文字数)
               '(height . 65)           ; 高さ(行数)
               '(top . 50)              ; フレーム左上角 y 座標
               '(left . 1000)            ; フレーム左上角 x 座標
               )
              default-frame-alist))
```

## シェル

下記の記述を追加すれば、```C-'``` を押すことでウィンドウが二分割され、下半分でシェルを操作できるようになります（Mac 版 VSCode でいえば ```Command+j``` と同じです）。

```C-'``` のキーバインドは私固有の設定なので、```global-set-key``` の行にある ```(kbd "C-'")``` の記述を適当に変えてキーバインドを変更してください。

なお、下記の設定は Windows 版 Emacs では正しく動作しませんので注意が必要です。

```lisp:init.el
(defun toggle-zsh-window ()
  (interactive)
  (if (get-buffer-window "*terminal*")
      (progn
        (switch-to-buffer (other-buffer))
        (delete-window (get-buffer-window "*terminal*")))
    (progn
      (split-window-below)
      (other-window 1)
      (term "/bin/zsh")
      (rename-buffer "*terminal*"))))
(global-set-key (kbd "C-'") 'toggle-zsh-window)
(add-hook 'term-mode-hook
          (lambda ()
            (define-key global-map (kbd "C-'") 'toggle-zsh-window)))
```

![シェル.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/c4dd4e48-9374-437a-baad-0e8256ede767.gif)

## 自動補完（company）

プログラミングにおいて、自動補完はもはやなくてはならないものだと思います。もちろん、自動補完は Emacs でも可能です。下記の設定を追加しておきましょう。

```lisp:init.el
(leaf company
  :doc "Modular text completion framework"
  :req "emacs-24.3"
  :tag "matching" "convenience" "abbrev" "emacs>=24.3"
  :url "http://company-mode.github.io/"
  :emacs>= 24.3
  :ensure t
  :leaf-defer nil
  :bind ((company-active-map
          ("M-n" . nil)
          ("M-p" . nil)
          ("C-s" . company-filter-candidates)
          ("C-n" . company-select-next)
          ("C-p" . company-select-previous)
          ("C-f" . company-complete-selection))
         (company-search-map
          ("C-n" . company-select-next)
          ("C-p" . company-select-previous)))
  :custom ((company-idle-delay . 0)
           (company-minimum-prefix-length . 1)
           (company-transformers . '(company-sort-by-occurrence)))
  :global-minor-mode global-company-mode)
```

![自動補完.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/924364b7-3917-478f-ac4d-4dcdfba808a8.gif)

## Git インターフェース（magit）

magit があれば、git のコマンド操作から解放されます。使い方は [magit チュートリアル](https://qiita.com/maueki/items/70dbf62d8bd2ee348274)を読んでください。

```lisp:init.el
(leaf magit
  :ensure t
  :bind
  (("C-q C-f" . magit-status)))
```

## Git 変更点の明示（Git Gutter）

Git Gutter があれば、前回 Commit からの変更点が一目瞭然になります。必ず入れておきましょう。

```lisp:init.el
(leaf git-gutter
  :ensure t
  :global-minor-mode global-git-gutter-mode
  :custom
  ((git-gutter:added-sign . "+")
   (git-gutter:deleted-sign . "-")
   (git-gutter:modified-sign . "=")))
```

## 自動再読み込み

git でブランチをスイッチしたときなど、Emacs の外部でファイルの内容が変更された場合に、自動的に再読み込みして変更内容を反映させる設定です。

```lisp:init.el
(global-auto-revert-mode t)
```


## タブ

下記の記述を追加すれば、VSCode のように Emacs をタブ化できます。

```lisp:init.el
(leaf tab-bar-mode
  :init
  (define-key global-map (kbd "C-<up>") 'tab-bar-switch-to-prev-tab)
  (define-key global-map (kbd "C-<down>") 'tab-bar-switch-to-next-tab)
  (define-key global-map (kbd "C-t") 'tab-bar-new-tab)
  (define-key global-map (kbd "C-w") 'tab-bar-close-tab)
  :custom
  ((tab-bar-new-tab-choice . "*scratch*"))
  :config
  (tab-bar-mode t)
  (face-spec-set 'tab-bar-tab '((((background light)) (:background "gold")) (((background dark)) (:background "#808080")))))
```

![タブ化.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/892dc68b-8331-4e53-937e-1c4618bb11e0.gif)

## GitHub Copilot

Emacs でも Copilot が使えます。node.js が必要になるので、npm で 20 以上をインストールしてください。

```lisp:init.el
(leaf copilot
  :doc "An unofficial Copilot plugin"
  :req "emacs-27.2" "s-1.12.0" "dash-2.19.1" "editorconfig-0.8.2" "jsonrpc-1.0.14" "f-0.20.0"
  :tag "copilot" "convenience" "emacs>=27.2"
  :url "https://github.com/copilot-emacs/copilot.el"
  :added "2025-02-27"
  :emacs>= 27.2
  :bind  (copilot-completion-map ("C-f" . copilot-accept-completion))
  :hook
  (prog-mode-hook .  copilot-mode)
  (git-commit-setup-hook . copilot-mode)
  :config
  (eval-after-load 'copilot
    '(progn
       (customize-set-variable 'copilot-indent-offset-warning-disable t)
       (customize-set-variable 'copilot-max-char-warning-disabled t))))
```

## メニューバーとツールバーを非表示にする

キーバインドに習熟すれば、メニューバーとツールバーは不要になるでしょう。下記の記述を追加することで、これらを非表示にできます。

なお、初級者の間は表示させておくのが無難だと思います。自分でわざわざ敷居を上げる必要はないですからね。

```
(menu-bar-mode 0)
(tool-bar-mode 0)
```

# おわりに

Emacs は 50 年以上の歴史があるエディタです。長い歴史に堪えて、名だたるハッカーたちに愛され続けながらここまで発展してきたのには、やはりそれなりの理由があります。

Emacs に少しでも憧れを抱いている人は、少し背伸びしてその歴史に触れてみることをおすすめします。キーバインドに慣れてきたころには、もう VSCode に戻れない体になっているでしょう。

本記事が、臆病者たちが Emacs の世界に足を踏み入れるきっかけになれば幸いです。