あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

Emacs に衣替えした話

たぶん、Emacs に衣替えできたので、その話をします。

いつもですます調だけど、である調で書いた。

プロローグ

普段は Vim を使っているが、数年に一度くらい、Emacs を使いたい欲求がどうしても抑えきれなくなることがある。(Vimmerあるあるネタだろうか?)(多分、コイツは最近 Lisp の本を読んだ)

欲望のまま Emacs を立ち上げ、ひととおりチュートリアルをこなすと、不思議なことに抑えきれなかったはずの欲求が綺麗サッパリ消えているのだ。本当に微塵もないのだ。 そして、あの気持ちはなんだったのだろうかと我に帰り、Vim を立ち上げ、安堵する。「俺にはやっぱりコイツじゃなきゃダメなんだ」と。 そんなやりとりが、これまで何度もあった。

ところが、最近の Emacs には、Evil という悪魔が存在する。

去年も Emacs を使いたい欲求が抑えきれなくなった。(ねぇ?Land of Lisp でも読んだ??)

欲望のまま Evil をインストールした Emacs を立ち上げた。

普段であれば、すぐに退散してしまうその世界は、いつもと違い、居心地の良さを感じる。

そして、退散することなく、その世界にとどまってしまった。悪魔がそそのかしたのである。

気がついたら、Evil + Emacs を使い始めて半年を超えていたのだった。

Evil 移行期

前述のプロローグに書いたように Evil + Emacs に移行して結構な日数が経っていたが、実際に移行した実感は薄かった。

シェル操作が必要な時(基本は eshell 使いになっているが、たまに必要になる)に tmux でウィンドウを立ち上げて、vim でちょこっとファイル編集し出すと、ふと気づいた時には Emacs 使ってないみたいな状態になっていることが多々あった。

で、その状態でマシンをスリープして、翌日作業を再開したりすると、気づいたら今日 Emacs 使ってないみたいなこともよくあった。

利用時の違和感がなさすぎると、移行はスムーズだが、逆に移行した意義も見えなくなる。

なので、Emacs らしさを取り戻すために、magit や wanderlust のような大きめなアプリケーション使ってみたりして、移行した意義を再認識するようにした。

葛藤の日々

magit とか wanderlust など、ある程度の大きめなアプリケーションを使う時は、Evil 環境下でも、Emacs チックな操作系等を強いられる。

いつの間にか、ESC でモード変わらなくなって、

C-g「馬鹿め、そいつは残像だ」

・・・そして、画面上には j, k の残骸が無数に転がっていた。

みたいな感じになって辛い。

ウェブで探すと、Evil 向けのカスタマイズ例などが見つかるが、アプリケーションごとに書いていくの厳しそうだし、設定の事例自体少ない。

Emacs を使うと Emacs Lisp を書いたり、読んだりする機会が増えるわけだが、Emacs Lispデバッグをしようとして、emacs -QEmacs を立ち上げた後の自分の無力感が半端ない。

そういった事情があり、Evil を使っていると、Vim 脳と Emacs 脳の切り替えを強いられる状況が多々起こる。 その状態が半年も続くと、意図せず、ある程度 Emacsキーバインドに慣れてしまっている自分がいることに気づく。

Evil との別れの時

Evil をやめることにした。

ローマ字入力から、かな入力に移行した経験があるので、移行中はイライラ以外に得るものは何もないけれど、強制的に禁じることでちゃんと移行できる確信はあった。

Emacs でも Evil をアンインストールして、使いづらいからといって Vim にも逃げない日常生活を送ることにした。

やはり、数日は何をするにもイライラした。

C-h b (describe-bindings), C-h m (describe-mode) をひたすら叩いた。

でも、数日で慣れた。

かな入力の時より、移行期間は短かった。

まだ、たどたどしい部分はあるが、Vim を起動すると、一旦心落ち着けないと混乱する程度には Emacsキーバインドに慣れた。 たとえば、今 Vim でカーソル移動しようとすると、やたら補完される。

設定の見直しの日々

Vim 使っている時にもあまり大した設定はしていなかったし、あまりプラグインも入れてなかった。

現在の Emacs の設定もそんな感じである。

また、自分はデフォルト厨でもあるので、標準機能で事足りるならば、不便を強いられても標準機能を利用したいという指向性がある。

Emacs ビギナーあるあるだと思うが、最初はいろいろなユーザーのおすすめ設定とか、おすすめパッケージをコピペしたり、インストールしたりしていたが、実は使ってないとか、標準機能で十分ということがいろいろありそうだったので、一旦白紙にして標準機能でまかなえるものは標準機能を使うことを前提に、フルスクラッチで設定書くことにした。

例えば、helm とか auto-complete なんかは、ido で十分な気がしたので、ido + ido の拡張パッケージで済ませるようにした。

Evil 期に、いきなり Emacs の応用から入った感じになっていて、dired とか バッファリストの操作など、Emacs の基本をほとんど把握してなかったが、使ってみたら便利そうな機能もあった。 あと、eshell を常用していたが(今も常用している)、tmux + vim での作業文化を引きずっていただけということにも気づき、利用頻度は少し減った。

Emacs は標準でも普通に便利だし、今は、標準機能の理解をもっと深めようというフェーズにある。

Chromebook で使っている設定が下記で、一度すべてリセットしてスクラッチから書き直している途中。*1

内容も薄いので、起動もそれなりに速い。

Evil 期では、おすすめ設定みたいなのをウェブで拾いつつ、init-loader + 各パッケージごとの設定ファイル(ファイル名先頭が連番)みたいな構成にしていたが、各設定ファイルの記述内容が数行程度で、ファイル名の先頭に連番付けていたけど、途中で不要になったパッケージが出てきた時に、連番が飛んで辛い感じになるので、init.el だけの運用にすることにした。

init.el の中の記述についても、どの設定をどの設定の周辺に書こうか迷うのが面倒なので、パッケージ名のアルファベット順で機械的に判断して記述できるようにした。設定順に依存する依存関係が出てくると面倒なことになるかもしれないが。

また、パッケージを管理するために Cask を使っていたけど、実質的には、ただインストールするパッケージの一覧を可視化したいというだけだったので、標準機能で済ませることにした。

ちょうど、設定をスクラッチで書き直し始めるころに見つけた Emacs Startar kit の手法が良さそうだったので取り入れた格好。

init.el で指定したパッケージが未インストールだったら、標準のパッケージ関連機能でインストールするというもので、これで特に問題ない気がしている。

職種がサポートエンジニアで、普段は広く浅く技術を使うため、特定の言語(Perl は毎日使うのだけど、デバッガ+αという感じ)や技術に特化した設定とかはいらない模様。

Emacs に移行して良かったと思うこと(まとめ)

そもそも Vim を使いなしているユーザーでもなかったので、それ Vim でもできるよというツッコミはあるかもしれないけれど、その点はご容赦を。

Emacs に移行した中で、良かったと思うことは、Lisp (Lisp-1, Lisp-2) が読み書きしやすくなるということはもちろんあるけれど、Emacs のことを Emacs で把握でき、Emacs の定義を Emacs で再定義できるという点かもしれない。

例えば、新しく試すモードを理解する場合、C-h m (desribe-mode) でキーバインドを確認して、そこからコマンドの定義にジャンプできるし、コマンドの定義の中でわからない関数があれば、C-h f (describe-function) でさらに詳細を把握できる。そして、今、キーバインドに対応するコマンド名は C-h k (describe-key) で調べて追記している。

Info ドキュメントが提供されている場合は、C-h i (info) で、Info ドキュメントの閲覧ができるし、その操作もしやすい。

新しい設定を書くような場合も、C-h v (describe-variables) で変数の定義を確認して、書いた設定を C-M-x (eval-defun) すればすぐに反映される。

もっとざっくりと apropos-* で、コマンドや関数、変数を探すこともできる。

Emacs Lisp はどちらかと言えば、Common Lisp 寄りな感じなので、shiro さんの Common LispとScheme という記事で言及されている

全部Lispで完結するCL上のプロジェクトの場合、逆にとりあえず REPL起動してasdfでビルド/ロードして、aproposやタグジャンプを使って Lispの「中から」全体を把握してゆく方向になる。

という体験に近い感じかもしれない。

様々な機能が Emacs Lisp で書かれているので、Lisp の知識で読める。

必要に応じて定義を追ったり、デバッグしたり、機能書いたりできるということは、半永久的に日常で利用するツールとして、それ以上に心強いことはないと思う。(まぁ、そんなにする機会ないから詭弁かもしれないけど)

Emacs は、自分の誕生日より早く生まれているツールで、今日まで発展しているので、自分が死ぬころにも普通にあると思う。その頃には、Emacs 50 は超えているかもしれない。

ということで、新米になったところだが、今後は Vim に戻ることなく、Emacs を使い続けることになりそうという実感が、今のところある感じ。

ほなの。

*1:話は変わるが、今年から Chromebook をメインマシンにしていて、Chromebook のシェルで日本語入力できないクソみたいな問題があるので、Chromebook では、ウェブブラウジングChrome を使う以外には、基本的に Emacs ですべてのことをこなしていて Emacs 強制ギブス状態となっている。