ハッカー向けのエディタといえばviかEmacsか、という時代があって、演習で触った大学のUnixワークステーションでターミナルのviはカーソルキーで移動できなくて、GUIで動いていたEmacsでは移動出来た。だからEmacsを使うことにした。
家にあるパソコンといえば、ふとした拍子にHDDがジジジという音を無限にたて始めて、その後フリーズしてしまう非力なWindowsマシンだったけど、それでもEmacsを諦める理由にはならなかった。無限のように長い再起動中の暗闇も、すぐにスワップするメモリも、平気だった。なにしろ、私はハッカーになりたかったのだ。
EmacsとWindows
今日、EmacsはWindowsで使用することが出来る。日本語もIMEも問題ない(パッチを当てた「日本語版」を探す必要すらない)Vimmerたちが揶揄したメモリ使用量も15MB~200MB程度だ。VSCodeなどのElectronベースのエディタや、その他巨大なIDEと比較すれば、そのフットプリントはもはや気にするほどのものではないし、やたら皆が凌ぎを削る起動時間だって、現代のCPUパワーを持ってすれば、気にならない(そしてEmacsはやたらめったら終了、起動するものでもない)
Windows10での実用的なEmacs導入ドキュメントとしては、Doom Emacsのドキュメントがよくまとまっている。
https://github.com/hlissner/doom-emacs/blob/develop/docs/getting_started.org#on-windows
曰く
There are three methods for installing Emacs 26.x on Windows, each with their pros and cons:
- With chocolatey/scoop
- With a precompiled binary + Git Bash
- With WSL + Ubuntu
Emacs26.xのWindowへのインストールには、3つの手段がある、それぞれ一長一短がある。
- cholateyまたはscoop(訳注:どちらもパッケージマネージャー)を使用する方法
- コンパイル済みのバイナリとGit Bashを使用する方法
- WSL上のubuntuで使用する方法
なにか奥歯に物が挟まったような言い方だ。Emacsだって?へえ・・・・・・まあガンバんな、とネオンに照らされたゲームセンターの片隅でドクターペッパーを片手に先輩ハッカーが囁いているような文面だ。
新米ハッカー志願者である君は単に「イントーラーをダウンロードして、実行する」と書かれていないことを奇妙に思うかもしれない。あるいは、なぜEmacsを導入する前に、CLIのパッケージマネージャーや、Linux由来のシェル環境、あるいは完全な仮想Linuxシステム(WSL2のそれはVMと変わりない)を導入させられるのか、と考えるかもしれない。
勘の鋭い君がここでモヤモヤしても困るので、誤解を恐れずに答えを言ってしまおう。
EmacsとそのエコシステムがUnix(またはUnix風の)OSを前提としているから
というのがその理由だ。
Emacs本体とバンドルされている標準elispパッケージは、Windowsでも過不足なく動作する。そういう意味ではEmacsはOSから独立した存在だ。だが、実際にカスタマイズを始めて、小気味よさそうなパッケージを導入しようものなら、とたんに壁にぶち当たることになる。運が悪ければ、それは不機嫌なエラーメッセージを*Backtrace*バッファに吐き出すだろう。
Debugger entered--Lisp error:
grepコマンドがないだって?おたくどういうOSを使ってるわけ!?
だいたいはそんな感じの内容だ。elispパッケージをメンテしているLinuxユーザーやMacユーザーが当たり前にある、としているものが、Windowsには根こそぎ存在しないからである。
つまり孤独なEmacs User in Windowsは選択をすることになる。このパッケージを諦めるか、何とかWindowsで動かすかだ。
お得意のGoogle検索をしてみてもいいだろう、エラーメッセージを検索して、Stack Overflowを読んでみる。ただ一つだけある0スコアの回答が何の役にもたたないことを知る。あるいは、大昔の、CygwinやGnuPackといったWindowsに移植されたUnix環境を導入するというアイデアが目にとまるかもしれない。おっと、気をつけろよ、その記事が書かれたのはもう10年も昔だぞ・・・・・
WindowsでEmacsを使おうとする限り、少なくとも闇雲に日本語で検索しても有用な情報はほとんどヒットしない、ということは知っておくべき事柄だ。
君がやるべきことは、検索ではなく偵察だ。パッケージのelファイルを開き、それが呼び出している外部コマンドを調べ、例えばtrampが実際に何を使ってSSH接続しようとしているかを調べることだ、そうして、問題になっている関数名までわかったところで、ようやく英語のまともな情報にありつける。
C-x C-eでカーソル位置にあるelispコードが実行できることを覚えておこう。関数をいじったら、関数内でC-M-xだ。edebugを使えるならC-u C-M-xすれば該当の関数に入ったところでステップ実行に切り替えられる。これらのキーバインドが実際に何をしているかはC-h kの後にそのキーシークエンスを押してみればわかる。最新の情報は、Emacsとelispにある。あと少しだけredditにもある。
こうしていると、まるで2020年に日本で、Windows版Emacsを使ってるのが自分一人のような気分になる。広大なインターネットで一人ぼっちでいるような気分になる。
最悪だと思うだろうか?VSCodeにしときゃ良かったと思ってる?そうかもしれないな。もし、あんたが利口なら、そうするべきだろう。ただ―――
あんたはハッカーになりたかったんじゃないのかい?
C-cとCTRL+C
2000年頃、Meadowを使っていた。Meadowというのは英語環境でなんとかWindowsで動くようになったEmacsに日本語IMEを扱えるパッチを当ててインストーラーをつけたものだ。
これは当時の私のPCではひたすらに重かった。起動するのに1分は待たされるし、font-lockしてシンタックスハイライトを有効にしようものなら、C-vでスクロールすると再描画されている様子がうっすら分かるほどだった。これは、Meadowが、というより、当時のWindows版Emacsが重かったようだ。NTEmacsなど日本語IMEが使えない他のディストリビューションも試したが、事情は似たり寄ったりだった。
ある日の部室で、私は先輩に言った。
「WindowsのEmacsが途方もなく重いんです」
先輩は、部室に置いてあるプレステでスターオーシャンか何かのRPGをプレイしていた。そして目線をやらずに、ブラウン管テレビを見つめたまま、Linuxディストリビューションに含まれている日本語ビットマップフォントを使え、と言った。それで少しはマシになる。それに
「ちょっとしたテキスト編集ならxyzzyってのもある。あれは軽い。common lispだけど」
xyzzy - カスタマイズ可能で軽快な Windows 用テキストエディタ
xyzzyは亀のアイコンがキュートな、Windows用Emacsクローンだ。こいつのイカしたところは、動作が軽快なこと、シンタックスハイライトがあること、ファイル間grep(正規表現もいける)がGUIで出来ること、そしてemacs lispではなくcommon lispでGUI部分も含めて拡張できるというところだった。唯一イカしてないのが、CTRL+insertでコピーという点だったが、それは自分で変えれば良かった。
私はすぐにxyzzyに乗り換えてしまった。もはやEmacsですらなくなっていたが、他のWindowネイティブで軽くてフリーなエディタではなく、少しでもEmacsに似たものを使いたかった。C-cではなくCTRL+Cを押してコピーするのが当たり前になるのを恐れた。凡庸なプログラマーの群れに埋没することに怯えていた。自分は違うと信じたかった。いつかハッカーになるんだ、と思っていたから、いつでも本物のEmacsを扱えるように、ということだったのかもしれない。
2020年のWindows用Emacsバイナリを使ってみる
2020年現在、Windows10では共通のビルド済みバイナリで、快適に本物のGNU Emacsを使う事ができる。ひとまずDoom Emacsのハッカー連中の言うところの
- コンパイル済みのバイナリとGit Bashを使用する方法
を試してみよう。Git Bashはgitを扱うならインストールしておいて損はないが、今回はDoom Emacsを導入するわけではないので、なくても構わないし、環境を汚さないように(いつでも帰れるように)zip版を使う。
からemacs27.1のビルド済みバイナリのzipファイルをダウンロードする。
**解凍する時は必ずディレクトリを作ること!**でないとbinやetcといったディレクトリが、君のダウンロードフォルダにばら撒かれることになる。
解凍できたら
bin/runemacs.exe
を実行しよう。emacs.exeでもいいが、こちらはダブルクリックで起動するとコマンドプロンプトの黒窓がでて邪魔だ。(コマンドプロンプトから起動するならemacs.exeで構わない)
本物のEmacsがいとも容易く起動する。おもむろにAltキーとxを同時に押す。下のちっこいところにM-xと表示されるので"tetris"と入力してエンターキーを押す。
Welcome to GNU Emacs!
止める時は"q"キーだ。
さて、ここから初期設定をしていくのだが、このEmacs Advent Calendar 2020に紹介されているとおり
が完璧なチュートリアルになっている。Windowsでも全て問題なく実行可能だ。(flycheckあたりではclangがないとエラーが起きるかもしれないがプログラミングしない限りは問題に突き当たることはない)
ただ、初心者のうちはinit.elのバイトコンパイルはしないほうがいいと思うし、なんかinit.el書き換えたのに反映しないな、と思ったらinit.elcというファイルが残っていないか確認しよう。
Emacsと人生
私はプログラムで飯を食うようになった。年齢だけは重ねたから、職場でもベテランの扱いだけど、まだハッカーにも何者にもなれていないことはわかっている。
10年程前にいた会社に、新卒が入ってきて、エディタは何に使ってるの?と聞いたら、特に決めてないんです。大学ではEmacsでした。と答えられた。笑みを浮かべながら何でも使いやすいのを使うといいよ、と返した。
しばらく後で新人の画面にある、GnomeのデスクトップとダークテーマのEmacsを見て、思わず笑いながら、今どき、Emacsなんてやめときゃいいのに、と言ってしまった。新人君も曖昧な笑みを浮かべて困った様子だった。余計な一言だったな、とその夜に思い出した。無理してでも、Emacsのことなら何でも聞いてよ、と言えば良かったとも思った。あんな事を言ったのは自信がないからだった。自分のinit.elに自信があれば見せてあげることだってできたと思う。それが出来ないのは、謙遜ではなくて、自分が無能だと気づかれないための小賢しさでしかなかった。そこまで気づいてしまうと、やはり嫌な気分になった。
その年の忘年会に、新人君はもういなかった。私が関係していない案件の、とあるデスマーチに巻き込まれて、それでいなくなってしまったということだった。あの新人君がEmacs使ってたの、君に憧れてたからだよ、とそこで聞かされて、人が辞めるのが、若者が消えていくのが、当たり前の会社にしか居場所のない、ただ生き残っているだけのぼんくらの私に?、自嘲するように笑うと、それからずっと酒が苦くなった。
デスマーチを乗り切ったメンバーが宴の中心で酒を飲んで大声を上げた。私は居酒屋の片隅で一人で不味い日本酒を舐めてその様子を見ている。
新人君のinit.elを知りませんか?私は何も教えられなかったんです。Dark系のテーマで、コメントが少し見づらいぐらい背景に溶け込んでて、でもかっこいいテーマでしたよ。flycheckが上手く動いていなかったかもしれません。何しろ、何も教えてないんです。ネットで検索したってまとまったドキュメントなんてないんですよ。満足のいくinit.elになるまで何年もかかるんです。
IDEを使えばいいと思うでしょ?案件がたてこんで、納期が間近になって、気ばかり焦っている時なんかは特にね、IDEのエラーチェックがお前のコードは間違っていると言ってくるわけです。それが本当か疑わしくなる時があるんですよ。本当に間違えているか?IDEが間違ってるんじゃないか?って。そういう時はたいてい自分のほうが誤っていて、正しいのはIDEのほうです。ほとんどの場合はそうです。だけど、プレッシャーと疲労で頭が煮えてしまっている時に、そういう「道具が信用できない」ということが、心理的に重く横たわってきて、それが時には手を止めて、足を止めて、翌朝会社に向かうことすらできなくなるような、そんな致命傷になることがあるんです。
手をかけたinit.elだったら、先輩が見てくれたinit.elだったら、ただ自分が書いたままに自分が理解したままに動いているだけだから、信用するも何もなくて、限界に近い心理状態の時に、そういう道具に対する愛着があるかどうか、それだけの本当に紙一重で、人が一人救われることがあるんです。
いや彼がどうだったかは知りませんよ。ただ私が知ってることはそれだけです。そうやって生き残る方法があるって、なんで私は教えてやらなかったんでしょうか。ハッカーになれなかった自分でも、Emacsが何かってことだけは、ちゃんとわかっているんですよ。わかっていたのに。
いえ、少し悲しくなっただけです。若い頃の自分を見殺しにしたみたいな、寂しい気分になっただけです。
店を出ると、夜の街のいたるところにある照明の隙間から冷たい闇があふれてくるようで、私は一言も喋らないまま忘年会を終えて、当時の社長の一本締めも無表情で済ませて、家に帰った。
Emacsを起動する。正確にはWSL2上でdaemon化してあるEmacsのウィンドウがX410を介して表示されているだけだ。日本語入力はmozc。M-x doctor EmacsLispで作られた主治医を呼び出す。
「生き残ること以外に自分がすべきことはあっただろうか?(Was there anything I could do other than survive?)」
「何故そう思うんだい?(Why do you say that?)」
「何かを捨てることができたなら、誰かを救えた気がするんだ(I thought if I could throw something away, I could have saved someone)」
「多分、それはあなたの人生と関係するものだったんだ(Maybe your life has something to do with this.)
「慰めになってるか?それ?」
C-x C-c 私はEmacsを閉じた。フレームを閉じただけで、daemonモードで起動はし続けるから、次に開く時は一瞬だろう。
Emacsはずっとここにある。
皆に平等にあるだけなのだ。
私はといえば、それで転職することにしたのだった。