絶滅危惧種Emacser、TypeScript/Node.js/Reactモノレポ時代を生き抜く

VSCodeの台頭によりエディタ戦争が幕を閉じつつある中で、時代に取り残されたEmacserはどう生きるのか――

emacs-about-screenshot.jpg

この画面を見てホッとする人は確実に絶滅危惧種

そうなんです、皆様は驚かれるかもしれませんが、いまだにEmacsをメインエディタ(IDE)に使っている頑固な人間が世の中にいるのです。拙者はその一人、生粋なconfig職人、Emacsの道を8年以上進んでいる者でございます。

Emacserの中では8年はまだまだピチピチの赤ん坊のようなもんで、拙者を超える熟練の猛者がわんさかいらっしゃる中でここでEmacsを語るのは厚かましいのですが、一応知見レベルをざっくり説明すると、

  • Emacsのconfigをgitで管理していて育成履歴は8年以上(configは相棒みたいなもので転職などを経て自分と共に成長するもの)
  • いくつかのEmacsパッケージを執筆し継続的にメンテしている
  • MacPortsEmacsポートをメンテしている
  • Emacs本体(C言語のコア)への貢献はまだしていないが、周辺パッケージはバグ修正を提供したりしている

ということで中級の上といったところでしょうか。

でも…なんで?

「一体なぜEmacsなんだ」という疑問が自然と湧いてきますが、はじめて触ったのはLISPの勉強がきっかけでした。当時駆け出しの独学プログラマーとして、Paul Graham氏Peter Norvig氏が提唱しているLISP神話に魅了され、LISPの書籍や、Schemeを使った有名なマサチューセッツ工科大学のCSカリキュラム「SICP」を勉強するための推奨環境がEmacsをベースとしています。

LISPをかじった多くの方はおそらく「この言語はおもしろいけどあまり現実的ではない」という結論に至ると思いますが、自分もまさにそうでした。ではどうしてEmacsを継続したかというと、神アプリがあるからです。

Magitという、gitインターフェースです。

突然ですが、話を大きく巻き戻します。Emacsとは何なんでしょうか?「エディタ」と答えた方は間違ってはいませんが、少々表面的な理解といえます。Emacsとは、テキストという形のUIでアプリケーションを作る基盤です。Emacsに標準搭載のメインアプリケーションとしてたまたまみなさんが一番馴染んでいるのがエディタというだけなんです。

さて、Magitという神アプリとは、Emacsの中で動くgitインターフェースであって、思考のスピードでキー1つや2つでgitのあらゆる操作ができます。慣れてしまえばGUIやCLIに戻れません。

IDEとのギャップ

でも開発までもEmacsの中でやろうというのはあまりにも自虐ではないでしょうか?いやそうでもない、意外と快適であるのは実はVSCodeのおかげでなのです。MicrosoftがVSCodeにあらゆる言語の“ノウハウ”を組み込む代わりにLanguage Server Protocol (LSP)という形でエディタと言語固有のロジックを分割しましたが、EmacsもLSPに対応することによってVSCodeと同等のIDE機能を持つことができて、不自由なく開発ができます。

弊社で開発しているのは簡単にいうとウェブアプリであり、フロントエンドはサブシステムによってはReactやVue、Svelteなどが使われ、バックエンドはNode.jsで全体を通してTypeScriptを採用しています。ローカル開発の時はDocker Composeでコンテナを立ち上げたりMakefileを叩いたりします。これをすべてEmacsの中で快適にこなせるパッケージを以下にテーマ別で紹介します。

頑固Emacserのおすすめパッケージ

  • バージョン管理
    • Magit: 先ほど紹介した、神gitインターフェース。基本操作はもちろん、複雑なinteractive rebaseや行単位のstagingへの追加、blame、reflogなど何でも快適にサクサクできる。
    • git-link: カーソル位置の行をピンポイントで指すURLを素早くコピー
  • IDE
    • lsp-mode: 単なるテキストエディタをIDEにしてくれるパッケージ。様々な言語のLSPサーバを自動インストールできる。
    • Flycheck: コンパイラーやリンターのエラー・警告をインラインで表示する
    • company-mode: 入力補完。lsp-modeと自動連携する
    • prettier.el: コードフォーマッターを自動的にかけてくれる
    • copilot.el: 最近話題のAIアシスタントだってEmacsで使える
    • 各言語のモード: yaml-mode, json-mode, web-mode, typescript-modeなどは必要に応じて。ただしEmacs 29からはTree-sitterベースの*-ts-modeが色々ついてくるのでわざわざ追加しないで済むことも
  • プロジェクト操作
    • Projectile: プロジェクト管理パッケージ。.gitフォルダやMakefileでプロジェクトを自動検知する。単体というより次と組み合わせると本領を発揮する
    • counsel-projectile: 現在のプロジェクトの全ファイルをrgで爆速で検索したり、正規表現でファイルを開いたりする
    • docker.el: Dockerコンテナやイメージを便利に操作・管理できる。Emacsの中のlazygitのイメージ
    • vterm: ターミナルもEmacsでやるならこれに一択
  • その他
    • Org: 標準搭載のタスク管理・カレンダー・情報整理・Jupyterノートブック的な何でも屋パッケージ。機能が豊富すぎて10人に聞けば10とおりの使い方が返ってくるけれど、拙者の場合はコードスニペットとその実行結果を簡単に文章と混ぜることで作業メモや調査ログを残すのに使っている。(この記事はOrgで書いてMarkdownに変換してCMSに貼り付けた)
    • ELIZA: 標準搭載の元祖AI相談役。心が病んだときなどはM-x doctorで0割負担の治療を受けられる(効果に個人差あり。改善が見られない方はM-x tetrisをお試しください)

関わる案件ごとに多少の調整はするものの、以上の基本構成は8年に渡り数回の転職を経て、仕事も趣味も上手く支えてくれました。やや大きめのモノレポの時代でも、Emacsそのものの高速化(Emacs 28から追加されたnative compilationなど)やワークフローの工夫で難なく対応できてしまいます。

emacs-demo.gif
①ProjectileでプロジェクトのMagitステータス画面を開いて②InterruptCallbackをプロジェクト全体で検索して③LSPで使用箇所から定義に飛んで④ExecutionCallbackにリネームして⑤git fixupで元のコミットを修正するデモ。コードは趣味プロジェクト。

そこまでしてEmacsにこだわるのか

前述のリストを見て「いろんなパッケージを入れてconfigをチューニングしないと使えないのか」と、Emacsの価値をあまり感じない方も多いと思いますが、そういう方には“Emacsスターターキット”と呼ばれる、チューニング済みの非公式ディストリビューションをお勧めします。SpacemacsDoom Emacsがその代表的な例です。

しかし、拙者は公式Emacsのconfig職人の道を選んだのにはわけがあるのです。そのわけとは、次のとおりになります。

  • (4割くらい)キャラ作り。「オフィスの唯一のEmacser」キャラだと勝手に玄人認定されるしなんだかんだネタにできる
  • (残り6割)真面目な理由
    • プロフェショナルとして、日々使っているツールを徹底的にマスターしたいのでconfigのチューニングは苦ではない。むしろ自分の好みに完全に合わせた、究極のツールに仕上げるのが楽しい。
    • ほかのツールやシステムがややブラックボックスであるのに対して、Emacsは抽象化レイヤーとして割と薄くて、中の仕組みが見えやすい。開発環境においてEmacsが操作する他パーツの理解が進みやすい。
    • 提供している会社や団体の都合によって使い方を制限されたり、はたや提供を止められて使えなくなるのはもってのほか。GNUの「自由ソフトウェア」理念の賜物であるEmacsは未来永劫なくなることはなく、昨今は不人気なイメージを持たれているが、開発は史上最高レベルに盛んに行われている(成長スピードが周りに比べて遅いだけ)。安心して投資できるのがEmacs。

Emacsのすすめ(or非すすめ)

ここまでEmacsを散々褒め称えてきましたが、拙者は自由ソフトウェア以外を認めない絶対主義者ではありません。仕事もプライベートも好みでmacOSを使うし、何が何でもすべてをEmacsで行うわけではありません。特に以下はやりようがあっても割に合わないと考え違うソフトウェアを使っています。

  • ブラウザ: 特にmacOSではEmacsの中にウェブブラウザを埋め込む良い方法がないのでメインはFirefoxを使う
  • メール: あまりメールヘビーなワークフローではないのでmacOSの標準Mail.appで事足りる
  • 文書の共同作業: 同僚に共有したり共同編集したりするような文書やスライドはやはりウェブベースのソリューションを使わざるを得ない

Emacsをみなさんに売り込むつもりは特になく、一人で細々とEmacs道を進む拙者は、「Emacser、まだいるぞ」ということを世に示すのが今回の目的でございます。が、もし、この道を共に歩むのに少しでも興味がある(orない)方がいらっしゃったならば、その方に朗報がございます。

RightTouchでは、エンジニアをはじめメンバーを募集しています!エンジニアリングだけでなく、プロダクトのコアやコンセプト創り、そして事業拡大における戦略・戦術検討まで、幅広く関われる今のRightTouchに興味を持っていただけたら、ぜひこちらの募集概要もご覧ください。気軽にお話しできればと思います!