震える手で Emacs を起動しよう
この記事は、
- Emacs に憧れを抱きながらも、その敷居の高さゆえに最初の一歩を踏み出す勇気を持てない
- 過去に何度も Emacs に入門しようとしたが、そのたびに挫折を繰り返し、もはや起動する勇気すら持てない
......そんな臆病者のための Emacs 入門記事です。
ほとんどのエンジニアがプログラミングエディタに VSCode を選ぶ現代にあって、あえて Emacs を選ぶ理由があるとすれば、それは「なんとなくカッコいいから」という憧れだけでしょう。
ドナルド・クヌース(Donald Knuth)、グイド・ヴァン・ロッサム(Guido van Rossum)、まつもとゆきひろ(Matz)、スティーブ・イエギ(Steve Yegge)など、錚々たる顔ぶれが揃いも揃って Emacs 推しと聞いて、「じゃあ俺も」と憧れを抱いてしまったと。
ところが、Emacs はそんなピュアな憧れを一蹴します。「なんとなくカッコいい」などという軟派で脆弱な動機だけでは、エベレストより高い入門障壁を乗り越えられないのです。
でも、名だたるハッカーたちが愛用するのには、それなりに理由があるはず。
それを知りたい、俺も使いたい、でも......
この記事は、そんな臆病者のための Emacs 入門記事です。
インストール
Emacs のインストールは簡単です。Windows 版はインストーラ付きのバイナリパッケージが配布されていますし、Mac 版も専用のパッケージが配布されていますし、Linux 版は apt でインストールできます。腕に覚えのある人は、ソースコードからビルドしてもよいでしょう。
インストールの敷居は低いので、各自好きな方法でインストールしてください。
設定ファイル
Emacs の設定は、すべて ~/.emacs.d/init.el
に、Emacs-Lisp と呼ばれるプログラミング言語で記述します。
......プログラミングに入門したくてエディタを選んだのに、そのエディタを使うためにプログラミング言語を1つ覚えなければならないのか......などと悲観する必要はありません。Emacs の設定例などいくらでも落ちているので、パクればいいだけです。
ここでは、適当なエディタ(VSCode でいいですよ!)で ~/.emacs.d/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 の世界へ!
外観の設定
さて、これからどんどん Emacs を使っていきたいのですが、その前にやっておきたいことがあります。それは外観の設定です。
Emacs の初期状態では見た目がクソダサいので、使っていて気分がアガりません。Emacs を使い続けるモチベーションを上げるためにも、外観をカッチョよく仕上げておきましょう。
~/.emacs.d/init.el
の「;;; ここに各自好きな設定を書く」の部分に、下記の記述を追加し、Emacs を再起動してください。
(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))
どうでしょうか? 背景が少し透過された、下記のようなウィンドウが開けば成功です。これでさっきよりは見た目がマシになりました。
なお、この外観は「doom-dark+」というテーマを適用したものです。どんなテーマがあるかは doom-themes の公式レポジトリにリストがあるので、好きなテーマを選ぶといいと思います。
フォントの設定
次に、フォントを設定しておきたいと思います。ここでは、Bizin ゴシックを使いたいので、init.el
に下記を追記します。
(set-frame-font "Bizin Gothic 18")
当然ですが、フォントはあらかじめ OS にインストールされている必要があります。
プログラミングフォントとして名高かった Ricty Diminished はサポートが終了したので、個人的には、Bizn ゴシックか PlemolJP の二択ではないかと思います。
ちなみに、PlemolJP を使いたい場合は、以下のように設定します。
(set-frame-font "PlemolJP light 18")
フォントが大きすぎる場合は、「18」の値を小さくしてください。
キーバインド
さて、外観をカッコよくし、フォントも綺麗になったので、気分はアゲアゲのはずです。ここで、ようやく本格的に Emacs を触っていきましょう。
Emacs の特徴の1つとして、独特の「キーバインド」が挙げられます。これは特定のキー操作にコマンドや機能を割り当てる仕組みのことで、簡単に言うと、キーボードショートカットのことです。
キーバインドに習熟すれば、すべての操作をキーボードで完結させることができるため、マウスに手を伸ばす必要がなくなります。これによる作業効率の良さが、多くのハッカーたちを魅了する理由の1つです。
軽くググればキーバインドの一覧が出てきますが、これらを全部覚える必要はありません。Emacs を辛抱強く使っているうちに、自分にとって有用なキーバインドだけが体に染み込み、残りは淘汰されていきます。
なお、Emacs で困ったら C-g
を押してください。連打しても構いません。これは緊急脱出ボタンです。「困ったらとにかく C-g
」ですので、これだけは覚えておきましょう。
Emacs で設定ファイルを編集
先ほどから編集している init.el
を Emacs で開いてみてください。ファイルを開くキーバインドは C-x C-f
です。
これを押すと、ウィンドウの下端領域(「ミニバッファ」と呼びます)でファイル名の入力を促されるので、~/.emacs.d/init.el
と入力しましょう。
これまでは、他の適当なエディタ(VSCode とか!)で init.el
を編集してきたと思いますが、これからは Emacs で Emacs の設定をいじっていきましょう。
なお、編集するにあたって最低限覚えておきたいキーバインドは、次の4つです。
キーバインド | 機能 |
---|---|
C-x C-s | 変更を保存 |
C-@ | マークセット |
M-w | コピー |
C-y | ペースト |
設定例
ここでは、Emacs を活用するにあたっておすすめできる設定例を紹介します。なお、私の設定は GitHub にアップしているので、参考にしてください。
行番号の表示
プログラミングをするなら必須の設定です。下記の記述を追加しておきましょう。
(global-display-line-numbers-mode t)
起動時のウィンドウの大きさの定義
下記の記述を追加することで、Emacs を起動した時に、ウィンドウをどの位置にどれくらい広げるかを設定できます。サイズ・位置の数値については、適当にいじってください。
(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 では正しく動作しませんので注意が必要です。
(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)))
自動補完(company)
プログラミングにおいて、自動補完はもはやなくてはならないものだと思います。もちろん、自動補完は Emacs でも可能です。下記の設定を追加しておきましょう。
(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)
Git インターフェース(magit)
magit があれば、git のコマンド操作から解放されます。使い方は magit チュートリアルを読んでください。
(leaf magit
:ensure t
:bind
(("C-q C-f" . magit-status)))
Git 変更点の明示(Git Gutter)
Git Gutter があれば、前回 Commit からの変更点が一目瞭然になります。必ず入れておきましょう。
(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 の外部でファイルの内容が変更された場合に、自動的に再読み込みして変更内容を反映させる設定です。
(global-auto-revert-mode t)
タブ
下記の記述を追加すれば、VSCode のように Emacs をタブ化できます。
(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")))))
GitHub Copilot
Emacs でも Copilot が使えます。node.js が必要になるので、npm で 18 以上をインストールしてください。
(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
:ensure t
:bind (copilot-completion-map ("C-f" . copilot-accept-completion)))
メニューバーとツールバーを非表示にする
キーバインドに習熟すれば、メニューバーとツールバーは不要になるでしょう。下記の記述を追加することで、これらを非表示にできます。
なお、初級者の間は表示させておくのが無難だと思います。自分でわざわざ敷居を上げる必要はないですからね。
(menu-bar-mode 0)
(tool-bar-mode 0)
おわりに
Emacs は 50 年以上の歴史があるエディタです。長い歴史に堪えて、名だたるハッカーたちに愛され続けながらここまで発展してきたのには、やはりそれなりの理由があります。
Emacs に少しでも憧れを抱いている人は、少し背伸びしてその歴史に触れてみることをおすすめします。キーバインドに慣れてきたころには、もう VSCode に戻れない体になっているでしょう。
本記事が、臆病者たちが Emacs の世界に足を踏み入れるきっかけになれば幸いです。