CUIのEmacsからGUIのEmacsに移行するためにやったこと

この記事は[.emacs Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dot-emacs)の10日目です。

# 概要

Emacs を使い始めて3ヶ月目にして、 CUI の Emacs から GUI の Emacs に移行しました。

環境は Arch Linux です。

そのために必要だったこと、できるようになったことも書いています。
Linux なので、やったことは Linux のウィンドウシステムに関係があるものが大半です。

特に、現在 CUI の Emacs を使っているが、 GUI の Emacs も使いたいという方にお読みいただければ幸いです。

# 動機

3年くらい Vim を使っていました。
Vim では起動が速い、メモリを消費しない、 GUI の無い環境でも一貫して動作する、などの理由から、テキストエディタをターミナルで動かすことに一種の美学を感じていました。（中二病）

Emacs を使い始めた時も、同じ理由で CUI で動かしていましたt。

ですが、ブログの記事などを見ると多くの人が GUI で起動しています。
確かに GUI で起動すると何となく便利そうな感じがしました。

そんな訳で GUI の Emacs には興味があったのですが、るびきちさんという Emacs 界隈で有名な方が、下記のように仰っていたのが移行を試みる決め手になりました。

> CUI 版にも根強いファンがいますが、思い切って GUI 版を使ってみましょう。
> 筆者も長いこと CUI 版を使っていましたが、乗り換えました。
> GUI 版には CUI 版にない多彩な表現方法が使えます。

> Emacsテクニックバイブル
> ～作業効率をカイゼンする200の技～

# 結論

移行して良かったです。
苦労したこともそれなりにありましたが、Emacsの真の力を見ることができました。

# 移行するメリット

## CUI では使えないキーバインドが設定できる

`M-%` や `M-right`といった特殊なキーバインドは、CUIのEmacsでは使えません。

`tty` について詳しく知りませんが、`tty` コンソールの多くはこれらのキーが使えません。
 `M-%` 等のキーバインドは `XTerm` や `urxvt` 等のターミナルでは使うことができましたが、それらのターミナルにロックアップされる上、若干使いにくい部分がありました（ Fcitx のインライン入力ができないなど）。Linux のデスクトップ環境に限った話ですが。

上記のようなキーが使えないと、 Org-mode の使い勝手が格段に悪くなってしまいます。

代替案として、これらの機能を別のキーにバインドする方法が、 Org-mode の Wiki に書いてありました。

[Using Org on a tty](http://orgmode.org/manual/TTY-keys.html)

が、これらを全て設定して覚えるのは正直面倒です。

これらのような問題は、GUIのEmacsでは解決されます。
`Muhenkan` や `Super` といった日本語キーボード特有のキーもキーボードに設定できます。

## 表現力が豊かになる

テキストエディタに似つかない言葉ですが、 GUI の Emacs の表現力は本当に豊かです。

下記のようなことができるようになりました。

- 行番号をさり気なく表示する
- Powerline で様々な情報をきれいに表示する(`powerline`)
- HTMLカラーをプレビューする(`rainbow-mode`)
- カラーテーマを導入する(`color-theme`)

カラフルなGUIのEmacs

![Screenshot_2016-12-06_08-14-51.png](https://qiita-image-store.s3.amazonaws.com/0/103885/346151ac-461f-ae36-7a4c-a0ac74a6a22e.png)

CUIのEmacs、これはこれで好き

![Screenshot_2016-12-06_08-23-56.png](https://qiita-image-store.s3.amazonaws.com/0/103885/b27393ed-10c1-f867-9849-c532fddbd077.png)

ただし、ターミナルでやっていた背景透過はできなくなりました。
できるとは思うのですが、ハードルが高いようなのでやめておきます。

ハードルが高いと言えば、フォントの導入も難しかったです。
`.Xresources`を何回も書き直しました。

そのあたりのことはこちらの記事に書きました。

[Emacsで日本語フォントを個別設定](http://qiita.com/acro5piano/items/f86cfcbb5e8978bfc750)

## 日本語入力をいい感じにする

私が CUI の時に感じていた不満は、日本語入力 ON の時に`helm-M-x`などで絞り込んでコマンド実行したい、という場合に、
日本語入力のままコマンドを打とうとしてイラッとすることが多かったです。

それを回避する方法もあるようですが、たまに切り替わらない時があったりして安定しませんでした。
※これは自分が設定できていないだけかもしれません。

[C-x * とかを入力した時にfcitxをオフにする fcitx.elの導入](http://qiita.com/Ouvill/items/d21be847753eb5adf414)

GUI 版の Emacs では、下記を行うと非常に快適になりました。

- Fcitx などの日本語 IME を起動しないようにする
- `emacs-mozc` を使って、 `mozc-mode` が有効になっているバッファのみ日本語入力状態にする

また、下記のように設定することでより快適になりました。

- mozc-modeの時にカーソルを青くして、見分けをつけるようにする
- `C-;`でmozc-modeを開始
- `C-g`でmozc-modeを終了
- いくつかのキーがmozc-modeで消えてしまうので、取り返す

```lisp
;; Mozc settings
(require 'mozc)
(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")

(setq mozc-candidate-style 'overlay)

(defun mozc-start()
  (interactive)
  (set-cursor-color "blue")
  (message "Mozc start")
  (mozc-mode 1))

(defun mozc-end()
  (interactive)
  (set-cursor-color "gray")
  (message "Mozc end")
  (mozc-mode -1))

(bind-key* "C-;" 'mozc-start)
(bind-key "C-g" 'mozc-end mozc-mode-map)
(bind-key "C-x h" 'mark-whole-buffer mozc-mode-map)
(bind-key "C-x C-s" 'save-buffer mozc-mode-map)
```

※emacs-mozcはCUIのEmacsでも使えますが、CUIのEmacsだとOSのIMEと共存させる必要があり、少々面倒です

## OSのクリップボードとの連携

GUI の Emacs では、特に何も設定しなくともクリップボードの内容が OS と同期されます。 CUI 版だと、 Emacs 内でヤンクされ、他のアプリケーションに貼り付けできません。

ただこれは、 Emacs のクリップボードを OS から独立させた方が使い勝手が良いという意見もあるので、好みが分かれるかもしれません。

# 移行するデメリット（と思えたもの）

## シェルの呼び出しが面倒

これは今でも思っています。
`M-x shell`や`M-x term`を試したのですが、うまくいきませんでした。特にzshとの相性が悪い。
こみいったことをターミナルで行わなければよいのかもしれませんが。

結局、ターミナルは別のアプリケーションを入れています。

今までの画面構成として、デュアルモニタで片方はターミナル、片方はブラウザという感じで使えていたのですが、新たに Emacs が加わったことにより、2画面に収まらなくなってしまいました。

そのため、`awesome`というタイル型ウィンドウマネージャを使って、ウィンドウサイズをキーボードで調節できるようにしています。

また、 Emacs 流儀に従って、なるべく多くの操作を Emacs 上で行うことにして、そもそもターミナルへの依存頻度を減らしました。

- Magit
- Dired, WDired
- helm-ghq
- counsel-git-grep

あたりを使うようになってから、ターミナルを使う頻度が減りました。

あ、でもこれ使えば `M-x term` を快適にできるかも・・・
[Copy/Paste in emacs ansi-term shell](http://stackoverflow.com/questions/2886184/copy-paste-in-emacs-ansi-term-shell)

（追記） 
`term+`をありがたく使わせてもらえば、なんとかなりそう。
http://tarao.hatenablog.com/entry/20121021/1350844264

## 背景の透過の設定が面倒

これは、 `Solarized-dark` テーマがいい感じに機能しているので、トントンかと。好みの問題ですし。

## インプットメソッドが正常に動作しない

これは Arch Linux 特有の問題なのですが、 `fcitx-mozc` と `emacs-mozc` パッケージが競合してしまいます。

なので、`systemd-nspawn`でArch Linuxのコンテナを作り、
その中で `emacs-mozc` をビルドして `mozc_emacs_helper` を取り出すことで解決しました。

[Arch Linuxで、Systemd-nspawnによる仮想環境を構築し、Emacs-mozcをインストールする方法](http://qiita.com/acro5piano/items/854f966474100cae2528)

多分もっと Arch Linux に詳しい人ならそんな力技しなくて良いのだと思う。

## フォントの依存関係

これも面倒でした。
CUI だとターミナルの設定次第で簡単に変わるのに、一筋縄ではいきませんでした。

Macの人はもっと楽なのかもしれません。

# 結論

Emacs最高