Software Design 2025年3月号にEmacsについて書きました
Introduction
Software Design 2025年3月号に「第3章:Emacs 拡張性に優れた、ハッカーのためのエディタ Lispがもたらす無限の自由さとは」というテーマで @tadsan と一緒に書きました。 着手開始から校了まで計12ページ、約1ヵ月程度かけて執筆しました。
全体の流れ
寄稿まで
当初、雑誌の寄稿依頼はtadsanの所に来ていました。 tadsanが次のような見出し案を作って提出していました。
GNU Emacsは長い歴史を持つ伝統的なテキストエディタです。単なるテキストエディタではなく、しばしば「Emacsは環境だ」「EmacsはOSだ」とも言われます。 また、初心者が定着しにくい一方で一度手に馴染んだ人が熱狂的に使い続けることでも知られています。 本記事ではさまざまなテキストエディタを利用してきて10年前から毎日Emacsを使って生活している筆者が、Emacsの魅力について伝えます。
以前から雑誌寄稿してみたいという話をしょっちゅうしていたのもあり、「ぜひ一緒に書かないか」ということを12月の頭に打診が来て2つ返事で承諾しました。
執筆
ISUCON14参加やvim-jpラジオの収録、本業の仕事が猛烈に忙しかったり、バイト先の納期ギリギリの仕事があったり、2024年12月は怒涛の1ヵ月でした。
ようやく精神的に落ち付けた12/29にtadsanと直接会って方針決めとアウトライン決めをしました。 「チュートリアルというよりは読み物としておもしろくしたい」や「テキストエディタだけじゃなくてオフィススイートとして活用できる」などをテーマにしたいよねという話をしていました。
役割分担は次のようにしました。終わってみると自分とtadsanの作業量はちょうど半々くらいで落ち着いたかなといった感じです。 自分はクオリティはともかくイケイケドンドンで進めるのが得意、tadsanは手直したり校正するのが得意ということで、得意をちゃんと生かせた分担だったと思っています。
- [take] 7〜8割のクオリティで一気に書く
- [take] textlintを導入
- [take] スクリーンショットを用意する
- [tadsan] Emacsの歴史やLispについて書く
- [tadsan] 全体的な文章の校正をする
当初は8ページで依頼が来ていたのですが、なんやかんやでたくさん書いてしまい12ページで着地しました。 よく考えたらカラー印刷ではないので、挿絵に使う画像はライトテーマでスクショを撮る必要があるんだなという気付きがありました。
textlintは自分以外の執筆者に聞いたら使っていない人がほとんどでしたが、共著だった入れてもよいのではということで導入しました。
校正〜校了
文章を書き終わった後、技評の編集者の吉岡さんに校正をしていただきました。 正直相当マニアックな内容を書いた自信があったのですが、さすがベテランの技評の編集者なだけあり指摘事項が鋭く、非常に学びが多かったです。
普段ビジネスメールでのやりとりをする習慣がなかったので、人生経験として自分がなるべくやりとりするようにしました。 Gmailの「全員へ送信」を押し忘れてたびたびtadsanをハブってしまっていました。 メールはEmacsから見られるようにしてたんですが、あくまで受信専用として使っていただけですので、ビジネスメールを送信する機会は貴重でした。
文章を指摘していただいた後、PDFに組版していただいた上で校正しました。 個人で組版をしたことは過去に数度あったのですが、実際にプロが組版したものを見ると全然クオリティが違いますね。 初稿を見た時あまりにもうれしすぎて仕事中に同僚に自慢してしまいました。
寄稿者特典として発売前に見本の雑誌が届きました。
寄稿記事について
目次は以下です。
- 始めに
- Emacsの概要
- Emacsの歴史
- 3.1. コンピュータ史におけるEmacs
- 3.2. 現代のLispマシンとしてのEmacs
- Emacsのコンセプト
- 4.1. Emacsの基本操作
- 4.2. Lispについて
- 4.3. Emacsの基礎用語
- 4.4. EmacsとLisp
- Emacsのキラーアプリケーション紹介
- 5.1. Magit
- 5.2. Dired / TRAMP
- 5.3. メール
- 5.4. AI連携
- Org Mode
- 6.1. 文芸的プログラミングとは
- 6.2. Org Modeとは
- 6.3. Org Modeの基本機能
- 6.3.1. Org Babel
- 6.3.2. Org文書の変換
- 6.3.3. Org Capture
- 6.3.4. Org Agenda
- 6.3.5. Org Roam
- 6.4. 現実のユースケース
- 6.4.1. 設定ファイルの出力
- 6.4.2. ブログ記事
- 6.4.3. 作業手順書
- 6.4.4. タスク管理
Emacsの歴史から実際のユースケースを重点的に触れる構成にしました。 Emacsは独特のキーバインドが特徴的ですが、私とtadsanにとってはEmacsはあくまでLispマシンとして機能してくれればよく、キーバインドはユーザーが好きなように設定すればよいと思っているので省きました。 結局Emacsの魅力を伝えるには細かいキーバインドや基本機能よりもユースケースやライフスタイルなのでは、というのが最近の私の感想です。
本編にもこのような文章を入れました。
これまで歴史の通り、Emacsは現代の一般的なGUIアプリケーションの操作体系が一般化されるよりも20年ほど前に開発されました。その頃にはまだマウスも普及していなかったので、Emacsの操作は基本的にキーボードのみで完結します。 現在ではGUIではもちろん、ターミナルでもマウスのようなポインティングデバイスを利用できます。本記事の筆者二人も、それぞれ「基本的に全く使わない」「積極的に使う」と意見が真っぷたつに分かれています。
個人的には「Emacsの歴史」の項がお勧めです。 私は1995年生まれなのですが、自分が生まれる前のコンピュータの歴史を知れておもしろかったです。 共立出版 コンピュータサイエンス誌『bit』 は電子復刻版があるようなので暇ができたら古い順に読んでいきたいですね。(1969年03月号が第1号)
基本的な内容は「vim-jpラジオのEmacs回に出演しました」に書いたことがかなり被っていますのでぜひこちらも合わせて読んでください。
「Org Mode」について4ページ分くらい詳細に書きました。 2025年にOrg Modeについて言及している雑誌記事は今回くらいじゃないでしょうか。 Org Modeの操作方法というよりは、具体的にどんな機能があるのか、私自身どういうユースケースにOrg Modeを使っているのかということを書きました。 Org Modeはあまりにも幅広い使い方ができるので、実際のライフスタイルをもっと紹介していかなければいけませんね。
個人的には org-nix-shell が熱く、可能な限りOrg Babelする時は使っていきたいなと思っています。
vim-jpラジオのときと同様、Embark をかなり使いこなしている自負がありながらうまく説明できなくて省いてしまいました。 私個人のEmbarkの使い方についてどこかでちゃんと言語化するので少々お待ちください。
AI連携に関して、私はcopilot.elとcopilot-chat.elとellamaとorg-aiを平行して使っています。 自分の中でしっくりくる運用がまだ見出せていないので、もう少しやりこんでしっくりくればブログを書きます。
編集長吉岡さんのnoteについて
今回のSoftware Designは「コードエディタ大研究」が特集テーマでした。 Software Designの編集長で自分の編集も担当してくれた吉岡さんのnoteが非常に良かったです。
普段の慣れた使い方をし続けると成長が頭打ちになってしまう、エディタの熟練者から学ぶことによって自分の作業をより効率的にすることが可能になる、といった内容が書かれています。
自分の愛用のエディタで慣れた使い方をしているだけでは、もっと効率的なやり方があることに、なかなか気づけないものだ
これまで面倒だった作業が簡単にできたという経験を一つすると、「もう一つ改善してみようか」と設定を試行錯誤する手間も、操作に慣れる努力も惜しくなくなってきます。
私もかつてSublime TextやAtomといったGUIエディタ、VimやNanoやLemといったCLIエディタ、XcodeやIntelliJといった商用IDEなどさまざまなエディタを使ってきました。 今回の寄稿と吉岡さんのnoteに触発されてvim-jpの方々から教えてもらいNeovimの設定をして実業務でも使えるくらいの設定をしました。(実際に使っています) 他のテキストエディタのことを知るとEmacsの善し悪しが際立つので非常によいですね。
今個人的に使いたいテキストエディタはClineです。 私はコードを編集する時アシストしてもらう程度にしかAIを使っていませんので、そもそもAI自体がコードやファイルを生成してくれるというメンタルモデルがありません。 Clineのような新しいAIネイティブのテキストエディタからインスピレーションを受けることによって、Emacsをより強くできるだろうなという感覚があります。
他の特集記事の感想
今回のテキストエディタ特集はvim-jp回と言っても過言ではないほどvim-jpの人が寄稿していました。 Shougoさんやtomoyaさんやmattnさんといったテキストエディタ界隈の大御所と肩を並べて寄稿できたことを誇りに思います。
「[Part1]人気のエディタの魅力を深掘り」は各テキストエディタについて、「[Part2]エディタを極める理由」はテキストエディタをやりこんだ人の思想について書かれています。 特に「[Part2]エディタを極める理由」は読み応えがありお勧めです。
mattnさんの記事の「エディタ選びのポイント、ITエンジニア人生を左右するツールのいろは」は技評の公式サイトから読めます。
ネタバレになってしまうので詳細なことは書けないのですが、「設定からの卒業」や「超高速ファイル/バッファ操作」、「テキストエディタに時間を使うのは人生の無駄なのか」、「私はデフォルトキーマップが嫌い」などほかにない強い思想が書かれています。 また「キーマップ設定のコツ」についてなど、特定のエディタに依存しない共通の話が存分に盛り込まれています。
ちなみに、ShougoさんへEmacsを使わないのかと言っているのは私です。(出典)
「すべての道はEmacsに通じる」のでみんなEmacsにたどり着くと思っています。 じきにShougoさんも暗黒美夢王から暗黒威魔苦巣王になるでしょう。(本人は今はその意思はなさそうだが)
エディタを極める文脈でいうと、tadsanの「なぜテキストエディタを極めるのか #techramen24conf」もおもしろいのでぜひ読んでください。
終わりに
自分にとって商業誌デビュー作品になったのでうれしい限りです。 ぜひ実際に本を買って読んでみてください。
今年は特に商業誌への寄稿やブログへのアウトプットを増やしていきたいと考えているので頑張ります。
やはり俺とtadsanは最高のタッグだぜ!!!
Misc
特集記事以外の感想
コードエディタ特集以外にも記事がたくさんあります。 個人的には「インターネットの姿をとらえる 【7】インターネットからみたデータセンター事業者」やそーだいさんの「実践データベースリファクタリング 【14】地図を検索する」がおもしろかったです。
これだけの情報量と質の高い文章がそろって定価1,562円(本体1,420円+税10%)はさすがに価格設定を間違っていますね。 普段ネットサーフィンで読む記事はどうしても自分の好みのものだけになりがちですので、こういう質の高い雑誌記事を定期的に読む必要があるなと反省させられました。
東京Emacs勉強会イベントについて
東京Emacs勉強会は引続きイベントを開催していくつもりです。 直近はゴリラvimと共同開催するつもりなのでぜひ参加してください。(2/18現在調整中)
textlintについて
textlintは次のようにflake.nixを用意してGitHub Actionsで回しました。 一部nixpkgsになかったので自前でパッケージングしました。 参考までにflake.nixを載せておきます。
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs";
nur-packages.url = "github:takeokunn/nur-packages";
};
outputs = { self, nixpkgs, nur-packages }:
let
systems = [
"x86_64-linux"
"aarch64-darwin"
];
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
in
{
devShells = forAllSystems (
system:
let
pkgs = nixpkgs.legacyPackages.${system};
nur-pkgs = nur-packages.legacyPackages.${system};
textlintrc = (pkgs.formats.json { }).generate "textlintrc" {
plugins = {
org = true;
};
rules = {
preset-ja-technical-writing = {
ja-no-weak-phrase = false;
ja-no-mixed-period = false;
no-exclamation-question-mark = false;
sentence-length = false;
no-doubled-joshi = false;
};
write-good = {
weasel = false;
};
preset-japanese = {
sentence-length = false;
no-doubled-joshi = false;
};
prh = {
rulePaths = [
"${pkgs.textlint-rule-prh}/lib/node_modules/textlint-rule-prh/node_modules/prh/prh-rules/media/WEB+DB_PRESS.yml"
"${pkgs.textlint-rule-prh}/lib/node_modules/textlint-rule-prh/node_modules/prh/prh-rules/media/techbooster.yml"
];
};
};
};
in
{
default = pkgs.mkShell {
packages = with pkgs; [
nodejs
(textlint.withPackages [
textlint-rule-preset-ja-technical-writing
textlint-rule-prh
textlint-rule-write-good
textlint-plugin-org
nur-pkgs.textlint-rule-preset-japanese
])
];
shellHook = ''
[ -f .textlintrc ] && unlink .textlintrc
ln -s ${textlintrc} .textlintrc
'';
};
}
);
};
}
Discussion