Hello, Emacs

Emacs の「底辺」。

Contents

Hello, Emacs

はじめに

自慢ではないが、ワタシは Emacs と出会って 20年近く経つが、その全体像の 1% も知らない。そして 2% の知識を得ようとも思ったこともない。それでいいと思っているし、あと20年使えば 3% くらいの理解度にはなってるだろうと思っている。

これはあなたを脅かしているのではないし、私が無能であることを白状したいのでもない。あなたが Emacs の専門家にでもなろうというのでもない限り、1割を知ろうとしなくたっていいのだ。それだけのものであるし、だからといって全てを知らなければ役に立たないような難物でもない、ということを言いたいだけなのだ。

であるから、「Emacs を使いこなそう」とか「Emacs を使い倒そう」というつもりはないし、そんなものは、10年でも20年でもかけて知っていけばいいことである。すなわち、このエントリでは、不可欠で必要最小限の機能しか説明しない。

このエントリは、Emacs に少しは興味を持っているが、身の回りに仲間がいないか、もしくは、周りが Emacs ユーザなので仕方なく Emacs を使わなければならないが、馴染めていない人に向けたものだ。

少しだけ歴史と現状と未来予想について

Emacs の歴史はとても古い。先ほど「20年」と言った。けれど、Emacs の歴史は既に40年にもなる。すなわち、私がはじめて Emacs に触れたその日でさえ、20年の歴史を持っていたのだ。

Emacs が本当に絶対的な人気を誇っていたのは、おそらく私がはじめてそれに触れた頃、であったのではないかと思っている。というのも、その時期が丁度 Unix ワークステーション文化の終焉期にあたっているからである。Emacs と vi の宗教論争などというものは、その時期に終わりを迎えた。

では現在はどうなのか? わかっているのではないか、あなたは。emacs を google 検索してみればいい。どれだけの情報が見つかるだろう? それは新鮮な情報だろうか? あなたの emacs で使える情報だろうか?

Emacs の今は、過渡期でもないし、終末でもない。ただホットでないだけであり、Emacs 情報が人を集めたりもしないだけのことである。

そしてこれによって何が起こっているかといえば、単に「知る人ぞ知る」化しているだけのことに過ぎない。使い続けたい人が内緒で使い続けている、それだけなのだ。信じて欲しい。Emacs の潜在ユーザ数は、あなたが思うよりも何桁も多い。

現状、について、もう一つ、私が使い始めた頃とは明らかに状況が変わったことが最低でも一つある。かつて Emacs と vi は、「キーバインドがキチガイ」であることで有名だった。今でもこれは踏襲されてはいるが、けれど「カーソルキーを使う」ために特別な設定が必要だった(vi はそれすら出来なかった)、というのは、今では信じられないことかもしれない。

カーソルキーさえ簡単に使えなかった頃と較べると、今や Emacs キーバインドのキチガイっぷりが障壁とはなりにくくなった。「デフォルトの」設定も、昔よりずっと親切になり、昔よりもずっと「電池付き」である。あなたが周りから脅されるほどには Emacs は難解なんかではない。信じて欲しい。私は最初に Emacs に触れた一週間というのは、嫌いで嫌いで仕方がなかったのだ。こんなものがどうして世の中に存在しているのだ、と憤慨していたのだ。でもいまやこうして、Emacs の魅力を伝えたい、と思うようになっている。

Emacs の未来は、暗黒でも安泰でもない。ただ淡々と、「ホットでない」まま静かに使われ続けていくだけであるはずである。既に欠くことの出来ない人にとっては欠くことの出来ない、そして欠くことの出来ない人の潜在数は計り知れないので、いつか開発が止まっても誰かが何が何でも復権しようとするだろう。だから暗黒ではないけれど、ホットでないならば、ちょうど今のように、情報難民だけは生み続けるほどには、安泰でない。

それでもあなたは Emacs に馴染みたいか? 馴染まなければならない? それでははじめようか。Hello, Emacs.

おそるおそる使う、一歩目

キーバインド説明のお約束について最初に

いくつか表記の慣習があるが、ここでは

C-x コントロールキーを押しながら「x」
C-x x コントロールキーを押しながら「x」、コントロールキーを離して「x」
C-x C-x コントロールキーを押したまま「x」「x」
M-x ALTキーを押しながら「x」
もしくは代替として、ESC キーと「x」

とする。SHIFT キーは必要であれば「SHIFT」と書く。

起動と終了

コントロールキーを…、から始めると思った?

さっき言ったはず。「昔よりずっと親切に」と。ほとんどの場合はメニューから Emacs を起動出来て、システムの終了ボタン(Windows なら「x」ボタン)で終了出来るし、未保存で終了しようとすれば、Emacs が問い合わせてくる。ごくごく普通だ。

Emacs らしくないと怯えなくていい。それでいいならそれでいい。

「Emacs らしく」であろうとなかろうと、必然的に Emacs キーバインドでこれを行う必要がある場合がある。言うまでもなく telnet などでリモートログインしている場合や、「-nw」モードで起動している場合である。この場合、「x」ボタンで閉じてしまったらログオフしてしまうだろう。それがしたいわけではあるまい。

C-x C-c 終了

である。

慌てるな

「C-g」(abort)は記憶しておいて欲しい。何か間違ったと思ったら、「C-g」で中断出来る(場合がある)。

開く

何を?

フォルダ(ディレクトリ)を開くことから始めることを、ワタシは薦めたい。
hello_emacs_findfile1

C-x C-f find-file

これは「ファイル」も開けるが、「フォルダ」を指定すると、dired モードに入り、直感的にわかりやすい、そう、Windows で言うところのエクスプローラに似たモードに入れる(上の画像でみての通り)。起動時点から dired モードに入ることも出来る。あなたの emacs が「emacs」だとして:

1 me@host: ~$ emacs /etc/ &

など。

dired 内で必要最小限で記憶しておくのは「e」と「v」と「^」だけである。最初は。カーソル移動はあなたが思う通りカーソルキーで移動すればよい。最初は。移動したファイルの位置で「e」をタイプすれば、編集モードに入れる。「v」では「view」モード、つまり読み取り専用で開くことが出来る。フォルダの位置で「v」をタイプすれば、「潜る」ことが出来る。「^」は、フォルダを「昇る」。

全てを知り尽くそうとする必要はないが、どうしてもそうしたければ、dired モードのままで「?」ののちに「h」をタイプすれば、ヘルプを参照出来る。あまりの機能豊富さに驚いてみれば良い。けれど、心配せずとも、「吸い尽く」さなくても99%の日常はこなせる。10年「e」「v」「^」しか知らなくても、さほど人生損したりもしない。

編集し、保存する

C-x C-s 保存

をまず記憶しよう。

編集については、唯一、あるいはもしかすると、日本語入力についてだけは、一般化した説明が難しい。あなたの使うシステムによっては、特殊かもしれない。Windows 版では他の Windows アプリケーションと同じ(つまり「全角/半角キー」)で日本語入力開始出来るはずだが、そうでない場合はおそらく「C-\」ではないだろうか。周りに知っている人がいるなら、質問するのが早い。それ以外については、独特だがどの emacs でも同じである。まずはこれだけ憶えてみよう:

C-k キル。カーソル位置から行末までをキルリングに。これは emacs 以外のアプリケーションで言うところの「カット」。
C-y ヤンク。カーソル位置に、キルリングからヤンク。これは emacs 以外のアプリケーションで言うところの「ペースト」。
C-y直後のM-y これは絵で説明する。
C-x u アンドゥ。

C-y直後のM-yは、みてもらった方が早い:
hello_emacs_yank1

Emacs には「リドゥ」という概念そのものはない。が、慣れてくればわかるが、リドゥ機能そのものがなくても、他の機能、たとえば今説明した範囲ではヤンクが補ってくれるので、思うほどには困らない。

実際ここで既に「他と違い過ぎる」ので第一段階離脱者が出始めるのだと思うが、でも逆に言えば、これだけ憶えていれば、「Windows のメモ帳全機能まであと一歩」ということはわかるだろうか?

そうなのだ。メモ帳はそれほどまでに「何もない」のだ。

編集し「たくない」

読み取り専用モードで開きたいこと、ないかな? 間違って触りたくない場合、あるでしょう? ましてやあなた、初心者を自負するならば、自信満々に「編集したくない」、だろ?

emacs ではこれはいつでも切り替えられる。「C-x C-q」で、「リードオンリーモードのトグル」が出来る。

「いつでも」といった。そう。いつでも。「開くときに」とは言ってない、ワタシ。

実はワタシがカーソル移動を除けばおそらく最も使うのが「C-x C-q」ではないかと思う。おもむろに編集し、一息つく際にはもう「C-x C-q」している。そういう emacs ユーザが多いか少ないかはわからないが、普段がこうなものだから、これが出来ない編集環境を使わされると頗るストレスが溜まる。

Emacsらしさを垣間見てみたい、二歩目

Emacs好きはどうしてそんなにEmacs好きなのか。本当に必要最小限しか憶えずに一日過ごしてから、これを垣間見る二歩目に入ってみよう。

豊富過ぎるカーソル移動を垣間見てみる

わかりやすくもとっつきやすくもない「キチガイな」キーバインドが不可欠なのは、移動手段の豊富さを実現するためでもある。そこには「カーソルキーや PGUP/PGDN キーだけ」で過ごすのとは全く別世界が広がっている。

まず最初に言っておきたいのは、「C-v」「M-v」が「PGUP」「PGDN」に対応するからといって、そうしなければならない、わけではない。憶えていられる好きな方を使えばいい。実際キーボードのタイプしやすさというのがあって、ましてやノートPCなどでは「PGUP」「PGDN」ごときが一苦労であって、「C-v」「M-v」の方がタイプしやすいはずであるが、別に押しにくいから死ぬというものでもないのだから、恥ずかしがらずにわかりやすい方を使えばいいのだ。「ヘンチクリンなキーバインド」が功を奏するのはそういった普通の特殊キーでは出来ないことをする場合、なのだから、「右に行くには C-f」などとクソ真面目に記憶しようと躍起にならなくとも良い。

では行ってみよう。

最初に知っておくべきは、「C-」修飾と「M-」修飾の関係について、である。ちょっと試しに「M-」とともにカーソルの左右をタイプしてみて欲しい。「M-」なしでは当然一文字ずつの移動だが、「M-」をつけると、「ワード」単位になるはずである…。やってみた?

「C-」であるか「M-」であるかの違いしかないコマンドの関係は、多くは「単位が違うだけ」というものが多い。従って多くの場合、「C-」バージョンだけ記憶しておけばいい。正確にはこれは「モード依存」で、C++-modeでの M-a と python-mode での M-a は違う振る舞いをする。OK? ので、C- 系のカーソル移動をまずはみておく:

C-f → (Forward)
C-b ← (Backward)
C-p ↑ (Previous)
C-n ↓ (Next)
C-a 行頭。
C-e 行末。

実際に手を動かしてやってみて欲しい。「M-」ではどういう動きとなるか? M-n、M-p は何も起こらなかったとは思うが、それ以外は「ちょっと大胆に」なったと思う。

ファイル、というよりは正確にはemacs用語では「バッファ」の先頭・末尾にジャンプするのは、やや指がつりそうになるが、

M-< バッファ先頭。
M-> バッファ末。

である。

ちなみに、Unix の、いまやデファクトスタンダードなシェルの bash、そして、これもデファクトスタンダードなページャの less などは emacs キーバインドに倣っているものが多いので、emacs を知ればそれらも知ることになるし、逆もままある。

一応 PGUP/PGDN についても。

C-v PGDN。
M-v PGUP。

これについては、バッファがひとつの場合は記憶する価値はさほどないので、どうしても憶えられないなら無理しなくとも良い。バッファが一つなら。じゃないほう、については、のちほど改めて触れることにする。

ポイント移動はほかにもヘンなものがある。3.2 ポイント位置を移動するを参照のこと。

さて。カーソル移動は終わりである…、って? とんでもない。もう一つ、恐るべきものが残っている。それが「インクリメンタルサーチ」である:
hello_emacs_incremental_search

C-s 前向きにインクリメンタルサーチ。
C-r 後向きにインクリメンタルサーチ。

すぐに慣れると思うが最初わかりにくいのは、検索したい文字列を入力し終わったのちに「次」に行きたい場合と、モードからの抜け方、であるが、前者は「C-s」(「C-r」)を続けてタイプするだけである。インクリメンタルサーチのモードから抜けるには、何かほかのカーソル移動コマンドなどを入力すればいい。私は「C-a」「C-e」を使うことが多いが、これは本当になんでもいい。目的の場所に辿り着いたあとで何をしたいかによって、最適なものはあろう。(まだ説明していない「C-l」(リドロー)もワタシは結構使う。)

驚くべきことだが、これは何十年も前に emacs が実現し、そしていまだにほとんど全てのエディタが、これを提供出来ていない。そしておそらく、emacs を好きになり始めるキッカケが、このインクリメンタルサーチであろうと思う。最近ブラウザがこれに近いものを提供し始めてきているが、テキストエディタでこれを提供しているものはかなり限られる。

emacs と vi が愛されるのは結局のところ、まずはこの豊富な移動コマンド群にあると言ってよく、そして多くの「emacs/viに勝ちたいエディタ」がこれをあまり理解出来ていない。

検索については、のちほど再び触れることとする。まずはインクリメンタルサーチを堪能して欲しい。

瑣末でも意外に便利な「ヘンな」編集コマンドをつまみ食いしてみる

emacs の編集コマンドには、便利で用途が多い割にはいまだに他のエディタで見たことがない、特殊なものが結構ある。

なぜ emacs にだけなのか。理由はまぁ簡単といえば簡単で、「膨大な機能」を、「わかりやすさ優先で使わせるためにメニューから選ばせて…」としない、からである。そのかわり「複雑で独特のキーバインドで駆動出来るようにして、憶えられるならハッピー」としている。(なお、キーバインド割り当てのないコマンドも膨大ではあって、使おうと思えば使える。)

まず、「C-t」「M-t」。「トグル」で、文字・ワードを「取り替える」。emacs の思想だからこそ提供出来るということは良くわかるのではないかな? こんなものをアプリケーションメニューや右クリックメニューで選択して実現するようなものとしてしまったら、鬱陶しくて誰も活用しないだろう。

次は「大文字小文字変換」系の3品:

M-u 大文字に。
M-l 小文字に。
M-c キャピタライズ。

「-c」がワード単位でしか意味がないので「M-」で説明したが、「C-」では文字単位。とてもニーズが多そうなのに、他のどのエディタも、これをほとんど提供していないのは驚かないか? (なお、これは bash でも出来る。)

ほかのエディタなら出来るのに、を知りたい三歩目

2歩目で一日過ごすと、少し不満が出始める。そう、あれだ…。

範囲指定であるとかそういったもの

カーソル移動だけいくら快適でも、「コピペが快適」ではない。2歩目までの知識だけでは。

思うに、インクリメンタルサーチで獲得しかけたユーザの、第二の離脱ポイントである、これは。だって SHIFT-マウスで選択してほにゃららできねーじゃん、と。

ゆえにここでは、「もっと編集コマンド」を、範囲指定の扱い方とともに紹介していく。が、いずれも独特で、慣れるまでは大変かもしれない。まずは最初に耐えてみて欲しい。

まず最初に、「C-k」だけ説明した、「コピー」「キル」「削除」系のコマンドをもう少しだけ:

C-k キル・ライン。ポイント(カーソル)位置から行末までをキルリングに。これは emacs 以外のアプリケーションで言うところの「カット」。
C-0 C-k 「C-k」とは逆に、ポイント位置から行頭までをキルする。
C-w 同じくキルだが、リージョンをキルする。
M-w リージョンをキルリングにコピーする。
C-d カーソル位置の文字を「削除」する。キルリングには入らない。

「C-」しか説明していないものでも、「M-」でどうなるかは、自身で試してみて欲しい。なお、バックスペースは歴史的にちょっとややこしいので、説明は割愛する。

「C-w」「M-w」が言うリージョンてなんだ? これには、「ポイント」「マーク」の説明が必要だ。

「ポイント」は単にカーソル位置であると思ってよい。「マーク」は、コマンドが暗黙に作る場合もあるし、「あなた」が明示的に付けることも出来る。「リージョン」は「ポイント」と「マーク」で挟まれた領域である。

すなわち、「C-w」に限らず、「ポイント」「マーク」「リージョン」を自在にコントロールすることが、「コピペの自由度」を得るための鍵である。

最初にこれを憶えて欲しい:

C-SPACE か、あるいは C-@
(多くの場合は、どちらでも出来る、のではなく、どちらか一方。)
カーソル位置を「マーク」する。

というかこれだけでもかなりの用を足せるはずである。マークしたら好きな位置までポイントを移動すればいい。その範囲がリージョンとなる。

もう一つはこれ:

M-h パラグラフをリージョンとする。
C-x h バッファ全体をリージョンとする。

ほとんどこの2つだけ記憶するだけでも、まぁまぁの emacs ライフを送れるようになるはずである。

なお、「SHIFTを押しながらカーソル移動」、は、多分あなたが思う通りのことをしてくれる
hello_emacs_shift-move

ほかには、「C-x C-x」は比較的よく使うかもしれない。これは実際にやってみて体感してみて欲しい。

なお、マークで迷子になることがある。「せっかくマークしたのに」戻りたいマークを忘れている、というケースだ。この場合は、マークコマンドに「C-u」をつけてみて欲しい:
hello_emacs_mark-pop
(emacs の独特の考え方「リング」があるのでこういうことが出来る。キルリング、マークリング。)

さて。ここで秀○ユーザあたりから攻撃されてもおかしくはない。「○丸は矩形の切り貼りが出来るんだぜ」。

残念だけれど、これ、「出来る」けれども、「ちょっと指がつる」。こんな具合:
hello_emacs_killandyankrectangle
マークとポイント移動は普通にやればいい。で、

C-x r k 矩形領域をキル。(kill-rectangle)
C-x r y 矩形領域をヤンク。(yank-rectangle)

とする。

置換さえ出来れば、もうメモ帳には追いついた

最初はこれだけでいい:

M-% Query Replace

今のうちに言っておくと、「Query」が付くコマンドは、必ずミニバッファでの問い合わせがある(また、置換の場合は、各マッチごとに置換するかどうかを選択出来る)。この理解は、のちほど検索の話でもう一度出てくる。

置換において、検索にマッチした箇所では、「SPC」で置換実行、「n」で置換せずに次のマッチに進める。「イチイチ質問すんな!」と思えば、その通り「!」。

さぁ、これでメモ帳と同じことは出来るようになったはずだ。そして十分に「メモ帳よりも快適かもしれない」と感じるに足るものは、少しずつわかってきた。しかしながら。それでもまだ「どうして何十年も使い続けるユーザがいるのか」がわかるほどでもないだろう。

Emacs らしさに浸かり始めてみたい四歩目

補完だらけ

今でこそ補完(completion)はどのアプリケーションでも当たり前となったが、emacs は「補完だらけ」のハシリである。

概ね大抵のものは、ミニバッファで入力するものについて補完が効く。中途まで入力したら TAB キーを押せばいい。

それだけではない:
hello_emacs_dabbreb-expand
これは「dabbreb-expand」といって、「M-/」にバインドされている。emacs 起動してからバッファに一度でも取り込んだものなら、どこからでも持ってきて補完してくれる。

ただし、「emacs 起動してからバッファに一度でも取り込んだ」は現代的とは言えなくて、まっさらなものから補完候補を持ってきてはくれない。これ以上のことももちろん出来るのだが、「Hello, emacs」がターゲットとする初学者向けではないので、割愛する。

正規表現だらけ

この特徴については、「emacsらしい」というよりは、「Unix育ち」の個性なのだが、驚くべきことに、いまだにこれすらままならないテキストエディタは後を絶たない。Unixユーザなら誰もが同意してくれると信じているが、「正規表現をまともに扱えないようなものはテキストエディタとは呼べない」と言ってよい。

なお、歴史的にはおそらく、「正規表現がテキストエディタを格段にパワフルにする」ことを最初に証明してみせたのは、ケン・トンプソンの ed なんだと思う。vi は ed の子供のようなもので、ed をフルスクリーンエディタに仕立て上げれば、概ね vi になる。ただし実際には vi のバックエンドは、ex という、ed とは別物だけど。

話が逸れた。

まずは「インクリメンタルサーチの正規表現バージョン」から行こう:
hello_emacs_incremental_regexp_search
「C-s」「C-r」を記憶していれば、記憶するのは簡単で、「M-」を余分に付けるだけである。「M-C-s」「M-C-r」と。

置換の「正規表現」バージョンも似た要領だが、「Query Replace」が「M-%」なので、「M-C-%」が「Query Replace Regexp」となる:
hello_emacs_query_replace_regexp
正規表現が色んな環境で違うのは付き物だが、emacs のものは、グルーピングとエスケープがほかと違う、程度の理解から始めればいい。上の動画では、こんな正規表現を打ち込んでいる:

1 \([a-z]+_\)types
2 \1TYPES

グルーピングは、括弧ではなく、「\(\)」とバックスラッシュをつける。置換テキストでのマッチへの参照は「\1」のようにする。なお、このような置換における参照が出来ないようなエディタは、エディタとは呼べない。

ウィンドウ・フレーム・バッファ祭り

フレーム、は、あなたが思うウィンドウとほぼ同じである。ウィンドウ、は、例えば HTML ならばむしろフレームである。バッファは、字句通り理解した方が良い。emacs 的には「メモリの塊」とほとんど同義だが、エンドユーザには大抵は「読み込んだファイル」にみえる。

というような、「アカデミックな」理解なんか忘れて、こんなのを堪能して欲しいのだ:
hello_emacs_window_frame
「C-x 2」「C-x 3」「C-x 1」、「C-x 5 2」。なお、ウィンドウ間の移動は「C-x o」である(面倒ならマウスで移動してしまえばいい。-nw で起動してない限り)。

着目して欲しいのは「フレーム」を増やせる「C-x 5 2」よりはむしろ「C-x 2」が同じファイルを分割していることである。思い出して欲しいのはこれは MS Excel の「ウィンドウの分割」機能である。そう。「なんてことない」ように思える。Excel を思い出せれば。そしてもう一つ思い出して欲しい。「いったいいくつのテキストエディタが、同じファイルの分割表示を提供しているだろうか?」。例えば Eclipse、例えば Visual Studio、たとえば桜エディタ。これが出来ないエディタは、エディタとは呼べない。

MS Excel の「ウィンドウの分割」機能の役割を思い起こせるならば、なぜこのことが重要なのか、わかるはずである。すなわち、「ある箇所に着目したままほかの場所に移動したい」のである。そして、インクリメンタルサーチも思い出して欲しい。検索結果の場所は、「あなたがいたい場所」にあるだろうか、ないだろうか。そう。「そこにあ」れば検索なんかしない。「そこにない」から検索するのだ。すなわち、検索成功後、「元に戻」らねばならない。

emacs のウィンドウ・フレーム・バッファに関しては、もう一つ、とても大事で、「らしい」機能がある。それが「ナローイング」である:
hello_emacs_narrowing
「C-x n n」でナローイング、戻すには「C-x n w」である。ナローイングが出来ないようなエディタはエディタではない。

ナローイングの価値は想像しやすいと思う。検索や置換の局所化は、時として「複雑な正規表現を不要にする」のに大いに役立ち、また、キーボードマクロと組み合わせて威力を発揮する場合も多い。そうでなくてもナローイングは、「読みたい(編集したい)箇所に集中出来る」というだけで十分に役に立つ。

ナローイングを提供しているエディタは、emacs 以外ではむしろ「最新のもの」ではなく「最古に属するもの」のなかにあって、いわゆる汎用機に付属のエディタなどは割とこれに近い機能を持っていた。つまりは、昔のものの方が良く考えられていた、ということもあるのだ、ということなのだろう。そしてこれを提供している現代のエディタがほとんど存在しないことにもまた驚く。

なお、emacs が作られた頃に、どの程度「人間工学」であるとか「脳科学」が意識されたのかはわからないが、emacs は、目線の移動であったりとかそういったものに対して、相当意識的に思われる。あまり世間的には「emacsのここが凄い」としてフィーチャーされることがなく、だけれどもワタシにとってはとても大事なこれ:
hello_emacs_ux0
わかるだろうか。任意の行を一番上に持ってってる。上の例の場合は、「C-u 0 l」としている。なぜ大事か。これが出来ると、精神的な疲労が抑えられるから、なのだ。既読部分の切れ端が見切れてしまうのは、あなたが思うよりもずっと、疲労が蓄積する。

お隣ウィンドウのスクロール

割とウィンドウ分割した、「カーソルがいない方」をスクロールしたい状況になることが多い。だいたいこんなだ:
hello_emacs_scroll-other-window
これは「M-C-v」でやってる。逆方向には、「M-C-v」にさらに SHIFT をつける。

まぁこれはこれで出来るが、無理して憶えるほどのものでもない。画像で見てのとおり、「スクロールバー」、付いてるであろう? 憶えられないなら、マウスで動かせばいい。

少しは落とし穴にはまってみたい五歩目

四歩進んできて、なんとなく emacs の「想い」が理解出来始めて来たので、少し苛めてみたくもなる五歩目。

日本語を含んだ検索

これは始めてみるとすぐにわかる。インクリメンタルサーチと日本語入力の相性は頗る悪い。

日本語入力が必要な検索は、「C-s C-m」「C-r C-m」で「非インクリメンタル」で検索してしまえば良い:
hello_emacs_search-ja

大丈夫。仮に相性よくても、「それって人間業じゃないほどに苦痛」なはずだから。だって想像してみ。「インクリメンタル インクリメンタル日本語変換 サーチ」…、検索にマッチする文字列が変換変換のたびに行きつ戻りつ…するの??

「ハマリ」始めてみたい六歩目

「emacs を使い倒そう」と思い始めたい頃合。少しは高級なことへの欲が出てきたことだろう。

ん? これまでは高級じゃなかったのか、って? 最初に言ったはずだよ。ワタシは emacs の 1% も知らない、と。タイトルの通りだよ。ワタシはこのエントリを通して、1% 未満、しか提供するつもりはなく、十二分に初級編です。これは。

ファイルを引用したり、シェルを起動してみたり、その結果を引用してみたり

バッファに、ほかのファイルを丸ごと引用(挿入)するには、「C-x i」。結構使う…んだけど、よくよく考えるとなんでだ? というのは、続く話、「シェルを起動」に案外関係してる。

シェルコマンドの実行方法は大きくは2つあるのであるが、「M-x shell」がその一つだ。ただしこれ、「コマンドを実行する」というよりは、「シェルそのもの」である。Windows 版 emacs では(設定なしでは)ほとんど実用にならないし、Unix でも、ワタシと同じく、これが苦手な人は多いと思う。「M-x shell」の「ウリ」は、「あらゆる入力・結果が emacs バッファの中にある」こと、である。すなわち、これまで紹介してきたインクリメンタルサーチであれなんであれ、全てが emacs 箱庭に収まるわけである。このため、大好きな人は大好きなのである、が。これが苦手な人が苦手な理由はただ一つ。これは「ページング」に関係してる。emacs には関係ないが、これをみて欲しい:
pydoc_02
ページングされるので、前から順を追って読める。ではこれは?

つまり。「最初に見るのが末尾」なので、前から見る、には、「戻る」必要がある。M-x shell を苦手とする人は、これがイヤだ。実際は M-x shell が大好きな人にとっては、「C-r で検索出来るから問題ない」。あなたはどうだろうか。気に入ったら使えば良い。ただし、「bashと同じ」ように使おうとすると違うので注意。(emacs そのものと衝突しないように、C-p は M-p 、のように、bash とは「似ているが違う」キーバインドになっている。)

「M-x shell でない」シェルコマンドの起動には、「M-!」を使う。もしくは、dired 中なら、ファイルの位置で「!」でも実行できる(ファイルを引数にして実行)。ただし後者はワタシはあまり使わない。

さて。では、そのコマンドの結果をバッファに取り込みたい、の場合にどうするか。一つには、シェルコマンドの結果をファイルに吐き出してから、「C-x i」で取り込む。もしくは、直接結果を取り込む「C-u M-!」。こんな具合:
hello_emacs_insert-shellcmd

キーボードマクロ

「秀○は…」と、○丸ユーザの「誇り」はマクロらしい。毎日のように聞かされたので死にそうだった。

emacs の場合、キーボードマクロはどちらかといえば「初歩中の初歩中の初歩中の初歩」くらいの機能で、ご存知の通り、フルに使い倒したければ、emacs lisp を書くのが「究極」、なので、emacs ユーザはキーボードマクロがあるからといって、「だから emacs はすげーんだぜ」とはあんまし言わない。けれどもそれは確かに「日常」にあり、もはや空気のような存在である。

ちょっと記録と再生のキーバインドは「マゾヒスティック」なので、最初覚えるのは大変かもしれない。けれども、あまりに日常なので、すぐに慣れるはずです。

C-x ( キーボードマクロの記録開始。
C-x ) キーボードマクロの記録終了。
C-x e キーボードマクロの再生。

emacs のキーボードマクロが本当に凄いのは「あまりにも普通に当たり前のことが出来ること」なのであるが、あまりにも「当たり前」過ぎるので、誰も「凄い」と言わない。これは MS excel のマクロと比較すればすぐにわかる。要はキーボードマクロを使いこなすにあたって、何の小細工もいらない。「当たり前がどれだけ凄いことなのか」というのは、emacs から離れてみないとわからない。

なお、キーボードマクロを「緊張しながら」記録すると思いますが、これ、記録後に編集出来る(edit-kbd-macro (C-x C-k e))んで、多少間違えても大丈夫。ただし、「エラー(検索の not found とか)」もしくは「中断(C-g)」してしまうと記録も中断してしまうので、そこにだけ緊張してください。

さて。もう一度繰り返します。「あまりにも普通に当たり前のことが出来る」。これが何を意味しているかと言うと、「普段出来る全てのことが出来る」ということ。何一つ特別扱いされない。インクリメンタルサーチはもちろん、先に紹介した「フレーム分割」さえも例外でない。ワタシが良く使うのは「ナローイング」である。

キーボードマクロに名前を付けて再利用する

先に言っておくが、これは、出来るけれども、私がこれを使ってたのは最初の一年だけ。やってくうちにわかってくるが、キーボードマクロが再利用で大活躍する「ほどあなたはバカ作業ばかりやってないはず」だからである。テキストの編集という作業は、日々ニーズがほんの少しずつ異なる頭脳的な作業、である。であるから、あなたが思うほどには汎用化出来ない。

それに、である。もし汎用になるのなら。それは emacs lisp で書いた方が良いし、「既に汎用であることがわかっている」ならば、あなたが作るまでもなく、既に存在してるはず。だからなおのこと、「あなたのその場限りのニーズは、きっと2年後に一度必要になるかもしれない」程度の汎用性しかないはずだ、となるわけである。

のようなことは、一年も使ってればすぐに悟るはず。

それでもなお「名前を付けて残しておく」には、

1 M-x insert-kbd-macro RET macroname RET

とする。「macroname」はお好きな名前で。

繰り返し

キーボードマクロに一番関係するが、emacs のコマンドはどんなものでも、「数値プレフィクス」を付けることで繰り返せる。「C-u 数字」「M-数字」が「一般」で、特殊バージョンは「C-u」で、これは4回繰り返し、のエイリアス。なので、マクロ実行の「C-x e」は、「C-u C-x e」(4回実行)、「C-u C-u C-x e」(16回実行)、…と使うことが多い。

もちろんキーボードマクロ以外でも(ワタシはあまり使わないけど)使うことは出来て、「M-20 C-n」とすれば20行下に飛べる。

レジスタ

キーボードマクロ内で使うと特に威力を発揮するものの一つに、「レジスタ」がある。レジスタの一つは、「マーク」をもう一段発展させたもので、「名前付きマーク」みたいなもの。

「一つのファイルを二分割する」のニーズにも通じるが、レジスタが威力を発揮するのは、「戻ってきたい場所がある」場合である:
hello_emacs_register-point
かなり記憶しずらいが(しかもemacsのバージョンによって結構変わった):

C-x r SPC 現在ポイントをレジスタに記憶する。(SPC のあとに一文字入力すると、それがレジスタの名前になる。)
C-x r j レジスタに記憶されたポインタに移動する。(j のあとに入力した一文字を名前に持つレジスタが持つポイントに飛ぶ。)

とする。

なお、ワタシがずっと使ってきたレジスタはこの「位置を記憶する」レジスタだけなのであるが、今日調べてはじめて「それ以外のレジスタ」を知った。1.1%…。ここに説明あります

編集対象のファイルを機械的に何か変更したいこと、結構あるであろう? そのような場合に、例えば Python であったり Ruby であったり Perl であったりと、「プログラマティック」に解決することも選択肢ではあることは頭の片隅に置きつつ、emacs ユーザは案外、「まぁまぁ複雑なキーボードマクロ」を書いて手早く済ませてしまうことも多い。そして、その「まぁまぁ複雑な」マクロを記述するのにとても便利である、レジスタは。

モードを使いこなす

「emacsってどんななの?」という興味だけで、実際に手を動かして遊んでみることもなくこのエントリを読んでいるのでない限り、「emacs にはモードがある」ということは薄々感じていることと思う。

例えば「C++」のファイルを開けば「C++らしい見た目と編集」が出来るし、「Python」なら「Pythonらしく」、と。

これを emacs では「モード」といって…。

ここまでのこのエントリの説明は、「最も基礎的な部分」だけの説明、であった。そして「それらこそが emacs 人気の本質」といわんばかりのノリであった。けれど、「emacs が人気がある秘密」としてフィーチャーされるのはむしろ、この「モード」に依拠した説明が多い。というよりは、「少なくとも emacs を知らない人が情報収集すると、そういう記事が多く見つかって、そういうものだと思う」。

これこそが emacs のもう一つの大事な側面、「徹底的にやろうと思えばどんな拡張でも(emacs lispで)出来る」から派生した、膨大な数のパッケージ(モード)である。ワタシのサイトでこれまで紹介してきたものでも、powershell.elphp-mode.elpo-mode.elがあり、これらはいずれも、標準の emacs では添付されていないものだ。C++-mode であるとか、python-mode などなど、かなりの数が標準で含まれている。

最近どうかはわからないが、かつて「emacs はエディタではない。環境である。」と言われていた。これは今でいう「統合開発環境(IDE)」に近い。今となっては別に emacs だけの個性ではないと思うけれども、少なくとも20年前にここまで出来るもの、というものは、emacs 以外にはほぼ皆無ではあった。

さて。タイトルの「モードを使いこなす」だが、これは個々に個々、なので、都度情報収集して憶えるしかない。そして、最初の前置きに通じるが、「1%もわかってりゃ十二分にハッピー」という類のものだ。毎日ちょびっとずつ進化していける程度のつもりでいい。ワタシがそれで困ったことが一度もないんだから間違いない。「使い倒そう」なんて、よほど暇なときだけやればいい。

What’s the Next?

まずは emacs に標準搭載されているチュートリアルは、さらっと動かしてみたらいいと思う。「C-h t」で起動する:

ワタシが意図して説明しなかったことも割とあるので、それらを補ってくれるだろう。例えばバッファの切り替えなど。

それと、これまでどういうわけか気付いていなかったのだが、GNU Emacsマニュアルは、大変読みやすい。バージョンが古いのが問題ではあるが、基礎的な部分があまりに大きくかけ離れている、のようなことは、ないと思う。(デフォルトのキーバインドは違ってる可能性はある。)

また、「emacs はどんなことでもカスタマイズ出来て凄いんだぜ」のようにどこかから聞いて、興味を持っているかもしれない、あなたは。インターネット検索に頼るなら、「.emacs」で検索すれば、何か面白いものは見つかるかもしれない。

これ以上? ワタシは、「これでいいならそれでいい」と思う。この 1% 理解でも十分生きていけるし、あなたが本当に手を動かしながらこのエントリを読んでくれたなら、もう十分に emacs を愛せる素質を持ってくれてると思っている。

そもそも本当にそのように愛してくれたなら、もはやあなたの emacs はワタシのものではないし、自分から情報収集出来るでしょう?

蛇足

初心者向け説明にはゴマカシが多い

このエントリでは、意図的に全てを「キーバインド」で説明した。だって、「それが日常」だから。

けれども本当は、この説明、NG である。なぜかといえば、「ありとあらゆるキーバインドを、emacs では変更可能」だから。ただ単に「このコマンドにはデフォルトのキーバインドとして~が割り当たっている」というだけなのだが、いちいちそう説明してたら、クドくて仕方ないであろう。

実際には「カーソルを右に一つ進める」ということでさえも、「forward-char」という emacs lisp 関数になっていて、この関数をキーに「バインド」することで、あらゆる操作を実現している(*)。であるから、「C-f なんてキチガイだ、死んでしまえ」と、これを変更したければ、出来ることは出来る。

実生活では、「C-f なんてキチガイだ」を変えるなんて「キチガイ」なことをするためにキーバインド変更をしようとする emacs ユーザなんかもちろん皆無で、たとえば「goto-line にはキー割り当てがない」を割り当てたい、のようなことでカスタマイズするニーズがほとんどである:

.emacsに
1 (global-set-key "\M-gl" 'goto-line)

など。

詳しくは、28.4.6 初期化ファイルでのキーの変更をみて頂ければ良い。

Windows ユーザへの些細な注意

Windows ユーザは、コントロールキー + Z で DOS アプリケーションが終了することに慣れている可能性がある。

これは「DOSアプリケーションの慣習」に過ぎない(つまりアプリケーションの好意)。かつての DOS アプリケーションは、「C-z 文字」を入力として受け取ると、アプリケーションを終了する、「というただのお約束」に「従うことになっていた」。

ところが Unix ではこれは全く違う。Unix では、ある特定のキーバインドは、「シグナル」を励起する。これを処理するのは「シェル」であって、アプリケーションではない。そして Ctrl-z は Unix シェルのほぼ全てでアプリケーションを「サスペンド」する。

emacs は結局のところ「Unix育ち」なので、Windows 版 emacs も「Unix流儀」に従おうとする。すなわち、「サスペンドのような」振る舞いをする。(実は単に Windows アプリケーションとして最小化するだけ。)

ヘルプについて

どうしてこういう重大なものが「蛇足」にいるのか? これは、歴史的な事情からちょっと説明がややこしいのと、それと、今の時代の場合は、オンラインヘルプ頼みにせずとも、案外インターネット検索の方が手早かったりするであろうから、というのと。

「歴史的にややこしい」というのはこれは、キーバインドに関係している。「C-h」というのは実は、伝統的には emacs 以外では、「バックスペース」として機能する。bash でもそうである。ところが emacs ではこれは、「ヘルプ起動のプレフィクス」として振舞う。そして、emacs のバージョンや設定のデフォルトなどの違いによっては、「バックスペースキーも」ヘルププレフィックス「だったりそうでなかったり」する。昔の emacs 初心者は、まずバックスペースキーでびっくりするのが定番だった。今は「そうだったりそうでなかったり」する。ここ何年かの emacs 経験(ほとんどは何種類かの linux)で、バックスペースがヘルププレフィクスとなっている環境は見た記憶はないけれど、おそらく今でも「バックスペースでびっくり」する設定のままのものはあると思う。

「C-h」は、実際に押してみればこうなるのがわかるはず:
hello_emacs_helpcommand
つまり、「C-h」そのものは「プレフィクス」で、「どんな」ヘルプを起動したいのかを、「C-h」に続けてタイプする。

ワタシが良く使うのは「C-h k」(describe-key)かもしれない。おそらくキーバインドを変更したい、であるとかそういう理由で。

emacs を喰らい尽くして猛烈編集、について

「猛烈なスピードで編集する」ことに命をかける、なら、アビバにいってブラインドタッチでも練習すればいい。きっとあなたは、頭脳労働に向いていない。

編集速度なんか、いくら遅くたって構わない。少しでも速くするのに、猛烈に慌てる必要もない。少しでも速く、を、少しずつ学べばいい。「正しく頭を使いながら」、「正しいものを確実に着実に」書くことにこそ、時間を費やすべきです。

2016-09-22 追記: バッファのエンコーディングについて

「Hello, emacs」という見出しに合うかどうか若干微妙だが、かなり肝心なトピックが欠落していることに気付いた。

10~15年くらい前だとこれの説明には「但し書き」をたくさん付けなければならなかったのだが、幸い現在の emacs は(日本発の Mule (Multilingual 拡張された emacs))が統合されたため、これの説明は至ってシンプルになった。

まず原則として emacs はファイルを開く際には、ファイルのエンコーディングを自動で推測する。従って、「うまくいっている限りは」何も意識する必要はない。(新規ファイル編集時も保存時に emacs に質問されるので困らないであろう。)

問題は「自動推測は完璧ではない」ということと、もう一つは当然「エンコーディングを変更したい」場合だ。

もしも emacs が推測を誤っているならば、「C-x RET r」をタイプして、エンコーディングを続けて入力する。たとえば「C-x RET r utf-8-unix」など。

保存時のエンコーディングを変更したい場合は、「C-x RET f」をタイプして、エンコーディングを続けて入力する。たとえば「C-x RET f utf-8-unix」など。

どちらも普段の作業内容によってはかなり頻繁に利用することになる。(なお、「RET == C-m」なので、「C-x C-m r」「C-x C-m f」のほうが入力しやすければそちらをどーぞ。)

2018-01-20 追記: デフォルトのエンコーディングを変えちゃう話

(ここ読む前に先に下の .emacs の話を読んでね。)

いや、自分がやりたくなったの。昔と違って「もう utf-8 一択でしょ」でいい時代になってきたのだけれど、今でも「Windows は cp932 一択だ」と OSS アプリケーションが思い込む癖は全然抜けてなくって、emacs Windows 版もそう、「どーせバカなおまいらは cp932 だろ」をデフォルトにしている。やぁねぇ。(まぁどんな作業を主食にするか次第だけどね。)

直接のそのものズバリな答えは例によって探しにくいが近いものは EmacsWiki ですぐに見つかる。ワタシはこうした:

1 (setq coding-system-for-read 'utf-8-unix)
2 (setq coding-system-for-write 'utf-8-unix)

.emacs に書いておけばいい。

2017-08-13 追記: やっぱり .emacs について少しだけ

「初心者向け説明にはゴマカシが多い」と上に書いた通りで、意図してごまかしたのがこの .emacs の話。

「必須の .emacs 設定10選」みたいなタイトルを付けりゃそれこそ人が集まるんだろう、割とこのネタは需要は多いに違いない、が、ワタシとしてはそういうことがしたいわけではなくて、やはり「ごまかし続けたい」のはそう、「廃れやすい情報だから」だ。なぜならマジメにやろうとすれば当然 emacs のバージョンに依存する話も避けては通れないし、「初心者向けとは言えない話」からも逃れられないからだ。

ほんとに小さな話だけ。

まず、「emacs は .emacs という設定(実際は「emacs lisp プログラム」)に従う」ということ自体は昔から揺るがない、「.emacs.d」というサブフォルダが発明されたこと以外は。けれども、「近年の」、と言ってももう 15年くらいは経つけれど、そこで「進化」したことは、「自分で手で編集する以外の方法」が標準になったことである。

こういうこと:

この操作が実は .emacs に書き込みを行ってくれる(無論 save options で)「ことになっている」。これだけで話が済むなら良かったんだけれど、あなたが使っているバージョンによってはこれは機能しない可能性がある。

そもそもが「こんな使いにくい操作で編集したって美味しくない」と考える emacs ユーザがほとんどで、動かなくても誰も文句を言わないので平気でこういったことが起こっているし、今後もこれは繰り返されるだろう。そういうわけなので、「.emacs は手で編集するものである」と思い込んでしまっても良い。そのほうが精神衛生上良い。(メニューから手繰るともう一つ「Customize」というモードがあるのがわかると思うが、これも同類。別に使いやすくないし。)

だとして次に「Windows ユーザが」困るのが、「その .emacs ってどこにあんのよ」ということ。Unix 系では「ホームディレクトリ」だが、Windows 版のバイナリを使っている場合にこれが判然としない。どこやねん? 答えは簡単で、記事本編で紹介した「find-file」(C-x C-f) で「~」(チルダ)を開いてみればいい。そこが「あなたの(emacs にとっての)ホームディレクトリ」。ので .emacs はそこにある。なければそこに作る。

いくつか「ワタシなら必須」と思う設定があるが、まさにこの「メニュー」に関するもの。非常にデザインセンスを疑う、だろ? こんなバカみたいに場所を取るもの、出しっぱなしにしときたくない、ということを「ワタシなら必ず真っ先に」やる:

1 (menu-bar-mode -1)
2 (tool-bar-mode -1)
3 ;;(scroll-bar-mode -1)

そして「こうしてしまった」場合に、もはや「メニューからは戻せない」というのが、いかにこのユーザインタフェイスが軽視されてるか、ということだ。再度 .emacs 編集に戻ることなくメニューを出したければ、「*scratch*」バッファ内に:

1 (menu-bar-mode 1)
2 (tool-bar-mode 1)
3 ;;(scroll-bar-mode 1)

を打ち込み、閉じ括弧の位置にカーソルを移動の上で「C-x C-e」(eval-last-sexp) する。

この「「*scratch*」バッファ内で eval-last-sexp」というのがいわゆる一つの「
基本」で、これは .emacs に書き込むことなく「現在のセッションでだけ試してみる」ということが出来る。(正確に言えばこれは「emacs lisp の実行」そのものであって、必ずしも .emacs に関係するわけでもない。)

昔は「カーソルキー」(や C-n) でバッファ末尾に到達すると自動的に改行を挿入し続けてしまう振る舞いがデフォルトで、毎度これを変えるのがお決まりだったが、今ワタシの .emacs をみてもそんな設定をしてないところをみると、デフォルトじゃなくなった、てことかな。末尾に到達すると「End Of Buffer」と言ってくれるなら問題なし。これがイヤな人はいる? けど自動的に伸張してくモード、頭いたくなるぞ、やめた方がいいと思う。

もう一つもやはり「Windows ユーザは」検討した方がいい、「Shell command」(M-! でコマンド起動出来るヤツ) のカスタマイズ。これをせずとも「cmd.exe」経由でコマンド呼び出しは出来るものの、これは非常に鬱陶しい。

これについてはまず「Unix もどき環境」をどうにかして入手する。ワタシは MSYS ユーザなので MSYS 向けに設定を書くことになるが、ほかにも候補はいくつもある。msys2、cygwin や、最近だと git とセットでくっついてくる Unix ライクなシェルが使えたりもするので、そうしたい人もいるだろう。ワタシの環境、つまり MSYS 向けだとこんな感じ:

1 (setq explicit-shell-file-name
2       "c:/MinGW/msys/1.0/bin/bash.exe")
3 (setq shell-file-name explicit-shell-file-name)
4 (add-to-list 'exec-path "c:/MinGW/msys/1.0/bin")

これにより 「Shell command」が快適になる。(というか相当 Unix 的になる。)

emacs を「プログラミング環境」と考えるなら、例えばこれ系も不可欠に思うであろう:

1 ;; C++ style
2 (add-hook 'c++-mode-hook
3           '(lambda()
4              (c-set-style "stroustrup")
5              (setq indent-tabs-mode nil)     ; インデントは空白文字で行う(TABコードを空白に変換)
6              ;(c-set-offset 'innamespace 0)   ; namespace {}の中はインデントしない
7              (c-set-offset 'arglist-close 0) ; 関数の引数リストの閉じ括弧はインデントしない
8              ))

まさにこの手のは「インターネット検索」の出番、探してお好みの設定を探るとよろしい。