Emacsで開発するための最小構成

どうやら最近またツイッター上でEmacsがいじめられている。

Emacsユーザーとしては悲しい。

てことでプログラミングで特にエディタのこだわりはないんだけどな〜って人をEmacsサイドに引き込むためにEmacsで開発するための最小構成を公開しようと思う。

欲しい機能

開発に使えるエディタとしての要求を考えたとき、最小構成として求めるのは

あたり。

まあそこまで大した機能ではないのでぶっちゃけVimだろうがVSCodeだろうがなんでも実現できると思う。

今回はこれらを満たしたEmacsの設定ファイルについて考える。

ちょっと余談

先日に友人(@5ebec)と飲みながらちょっとエディタの話になったんだけれども、デスクトップ型コンピュータならキーボード上で全てが完結することになった方がいいのは容易にわかる。

なぜならデスクトップ型だとキーボードの近くにトラックパッドがあるわけではなくマウスにまで手を伸ばさないといけないから。

だけどラップトップ型の場合、キーボードのすぐ下にトラックパッドがあってちょっと親指を伸ばせば届くので、キーボード上だけで全て解決させずともなんとかなる。

これに加えて自分はMacbookが普段使いで、Macbookについてはトラックパッドの感度がかなり良い(エロい意味ではない)ので、トラックパッドはむしろ活用した方がいいんじゃないかと思っている。

Macbookトラックパッドが優秀だしキーボードの打鍵感も好きで、iPhoneなどの他の端末との相性がかなり良いので、自分がなかなかLinux端末に移れない理由にここらへんがあったりする。

Emacsの設定をする

余談はこの程度にしておいて、設定の方を早速やっていこうと思う。

ちなみに今回色々書いていく設定についてはこの記事の最後の方にgistとしてまとめておいたのでコピペする場合はそれを丸ごとパクってくれたら大丈夫だと思う。

ちなみに設定ファイルはホームディレクトリに.emacs.dというディレクトリを作り、その中にinit.elを作って設定を書き込んでいくのがオススメ。

パッケージ周りの設定

まずはパッケージのインストーラなどを設定する。

;; パッケージ設定
(require 'package)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/"))
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(package-initialize)
(unless package-archive-contents (package-refresh-contents))

このmelpaなどはEmacsのパッケージのリポジトリのことで、何かパッケージをインストールする際はここから取ってくる。

日本語オッケーに

次はUTF-8の設定。

;; 環境を日本語、UTF-8にする
(set-locale-environment nil)
(set-language-environment "Japanese")
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-buffer-file-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(prefer-coding-system 'utf-8)

Emacsのバージョンが上がってから文字崩れなどは無いようだけど、一応UTF-8の設定をしておく。

バックアップファイルを作らない

Emacsは優しい設計なのでバックアップファイルを作ってくれる。

ただ、あんまりそれをやるとディレクトリが汚れるので今回はその設定を外しておく。

;; *.~ とかのバックアップファイルを作らない
(setq make-backup-files nil)

;; .#* とかのバックアップファイルを作らない
(setq auto-save-default nil)

括弧の自動補完とかソフトタブとか

自動補完とか色々。

;; 括弧を自動で補完する
(electric-pair-mode 1)

;; tabにスペース4つを利用
(setq-default tab-width 4 indent-tabs-mode nil)

;; デフォルトの起動時のメッセージを表示しない
(setq inhibit-startup-message t)

;; 列の番号
(column-number-mode t)

;; 行番号の表示
(global-linum-mode t)

;; 1行ごとの改ページ
(setq scroll-conservatively 1)

;; 対応する括弧を光らせる
(show-paren-mode 1)

;; メニューバーの非表示
(menu-bar-mode -1)

;; ツールバーの非表示
(tool-bar-mode -1)

;; リージョンのハイライト
(transient-mark-mode 1)

;; タイトルにフルパス表示
(setq frame-title-format "%f")

;;current directory 表示
(let ((ls (member 'mode-line-buffer-identification
                  mode-line-format)))
  (setcdr ls
    (cons '(:eval (concat " ("
            (abbreviate-file-name default-directory)
            ")"))
            (cdr ls))))

;; 時刻をモードラインに表示
(display-time-mode t)

;; 別のウィンドウ
(global-set-key "\C-t" 'other-window)

今回別のウィンドウへの移動はCtrl - tで設定。

自動補完

変数名などを自動補完してくれるパッケージを利用する。

;; auto-complete(自動補完)
(require 'auto-complete-config)
(global-auto-complete-mode 0.5)

サイドバー

画面の左部分に自分の今いるディレクトリのファイルが見えるようにする。

;; neotree(サイドバー)
(require 'neotree)
(global-set-key "\C-o" 'neotree-toggle)

ここでキーバインドCtrl - oと設定しておいたので、コントロールキーを押しながらoを押せばサイドバーを出したり閉じたりできる。

ちなみにこれはneotreeというパッケージを使うので、あとでEmacs起動後にパッケージインストールしておく。

コードをエディタ内で実行

VImにはquickrunという内部実行のパッケージがあるのだけれど、これをEmacsに移植したのがquickrun.el。

;; quickrun.elのキーバインド
(require 'quickrun)
(global-set-key (kbd "C-i") 'quickrun)

;; quickrun.elでPythonをPython3に
(quickrun-add-command "python"
  '((:command . "python3")
    (:exec . "%c %s")
    (:compile-only . "pyflakes %s"))
  :mode 'python-mode)

自分は昔にAtomを触っていたときに内部実行のキーバインドcommand + iだったので、未だに内部実行のキーバインドはiじゃないと気持ち悪く感じてしまう。

ということでキーバインドはそのように設定した。

quickrun.elのconfigについて、ターミナル上での実行コマンドを変えることができ、今回は.pyのファイルについてはpython hoge.pyではなくpython3 hoge.pyとするように設定した。

見た目を色々

最後に見た目の問題を。

ここまではCUIでも有効だけれど、自分はEmacsGUI版のやつを使っているのでウィンドウのサイズやカラーテーマを以下のように設定している。

;; 起動時のフレーム設定
(if (boundp 'window-system)
  (setq default-frame-alist
    (append (list
      '(top . 0) ;ウィンドウの表示位置(Y座標)
      '(left . 0) ;ウィンドウの表示位置(X座標)
      '(width . 140) ;ウィンドウ幅
      '(height . 50) ;ウィンドウ高
    )
    default-frame-alist)
  )
)
(setq initial-frame-alist default-frame-alist)

;; color theme
(load-theme 'monokai t)

;; alpha
(if window-system 
    (progn
      (set-frame-parameter nil 'alpha 80)))

;; フォント
(set-fontset-font t 'japanese-jisx0208 (font-spec :family "Source Han Code JP"))

ウィンドウサイズは横140文字×縦50文字のサイズにし、カラーテーマをmonokai、背景の透過度を80%、フォントをSource Han Code JPとしている。

一般に、ターミナルの画面もエディタも透過させるのがオシャレ(と言われている)

パッケージ等をインストール

いくつかのパッケージを使ったのでインストールをする。

Emacsを立ち上げたら、M-x package-installでインストールするパッケージを書く。

M-xはメタキー+xで、EscキーだったりoptionキーだったりAltキーだったり。

今回入れるパッケージはauto-complete-configneotreequickrunmonokai-theme

各種コマンド

Emacsを触るときはCtrlキーが基本的に使われていて、なのでずっと小指を伸ばしている感じになる。

以下に自分がよく使っているコマンドを並べておく。

ファイル操作系

  • ファイル保存 : C-x C-s
  • 他のファイルを開く : C-x C-f {ファイルのパス}

ウィンドウ操作系

  • 今いるウィンドウを閉じる : C-x 0
  • 今いるウィンドウを全面に : C-x 1
  • ウィンドウを上下で分割 : C-x 2
  • ウィンドウを左右で分割 : C-x 3
  • 他のウィンドウに移動 : C-t

サイドバー

  • サイドバー : C-o

終了系

  • コマンド中止 : C-g
  • 終了 : C-x C-c

まとめ

今回は自分が普段使っている設定とか諸々を並べておいた。

多分誰かの役に立つと思う。

以下に今回の設定ファイルを置いておいた。

中には自分がLispを使うための設定とかも書き込んであるので、適度に取捨選択してコピペすれば大丈夫だと思う。

gist.github.com