Emacs もう少し

| Emacs について | この文書の読み方 | ファイル とバッファ | コピー・ペースト(マウス操作編) | コピー・ペースト(キー操作編) | 検索 | 置換 | 単語登録 | ちょっとした芸 | 良くある質問・トラブル | 参考書籍 |


Emacs について

Emacs は Richard Stallman が MIT に在籍していた 1974 年当時に存在していた TECO エディタを改造するところからその開発が始まったテキストエディタです。 現在でも開発は継続されており、X window system 対応、多言語化など積極的に新機能が取り込まれ続けています。

Emacs 最大の特徴は、その動作の多くが Lisp によって書かれており、これがユーザに自由に改変できる形で提供されている点でしょう。 そのため多くの機能追加(例えばエディット中に英文の綴りミスを調べるスペル・チェッカーなど)が従来から行われています。 同じ理由で利用者ごとのカスタマイズ(例えばよく使う機能を特定のキーに割り当てるなど)もよく行われています。

こうした自由度の高さがプログラマ好みなこともあり、Unix 利用者のなかでは伝統的に良く使われるエディタとしての地位を獲得しています。

 

ページ先頭へ戻る

この文書の読み方

この文書は Emacs を使ったファイルの編集が最低限できる利用者を対象に書かれています。 つまりもう一歩 Emacs についての理解を深め、より Emacs を使いこなすためのチュートリアルです。 以下にこの文書を読む時に押さえるべき点について説明します。

キー操作表記

Emacs でよく使われるキー操作として、Control キーや ESC (Escape) キーと併用するものがあります。 Emacs の世界では伝統的にこれらの操作を以下のように表記しており、この文書でもこれに倣うことにします。

表記例意味
C-xControl キーを押しながら x キーを押す。
C-x C-cControl キーを押しながら x キーを押し、Control キーを押しながら c キーを押す。
C-x tControl キーを押しながら x キーを押し、(Control を押さずに)t キーを押す。
M-xESC (Escape) キーを押してから x キーを押す。
M-x save-bufferESC (Escape) キーを押してから x キーを押し、次に save-buffer とタイプして Enter キーを押す。

ESC キーのことを M で表記していますが、これは Emacs の世界では Meta キーと呼ばれているためです。 逆にあなたが使う Emacs 環境では Emacs で言う Meta キーが ESC キーに割り当てられていると考えて下さい。

モードライン

画面下端にある色の違う一行は編集中の状態などを示しており、これをモードラインと呼びます。

コラム

本文中に、余り重要ではないけれども雑学的に知っておくと良いことなどをコラムとして書く場合があります。 以下のようなスタイルで書かれた文章がそれにあたります。

Emacs 内部で働いている Lisp 、つまり Emacs Lisp の機能をもっと積極的に使った一人前のアプリケーションソフトが幾つも存在します。 例えば MHE はメイルの読み書きをするアプリケーションですが、これが Emacs というテキストエディタに読み込まれて動作するのですから面白い。 つまり本来テキストエディタであったはずの Emacs ですが、こうした場面ではテキストを読み書きする機能とプログラムを実行する機能の主従関係が逆転しているわけです。 それ故、Emacs はもはやエディタとして捉えるべきでない、と表現されることがしばしばあります。

時間と心に余裕のあるときに少しずつ読むと良いでしょう。

 

ページ先頭へ戻る

ファイル とバッファ

まず Emacs の基礎知識として、ファイル とバッファの関係について見ていきましょう。

ディスクとメモリの関係

あらためてここに記しますが、 「Emacs はファイルを編集するものではなくバッファを編集するもの」 です。つまりメモリ上のデータを編集するのであって、ファイルの中身を直接変更するものではありません。

これは Emacs に限らず一般的なテキストエディタに共通の性質です。 今日の標準的なコンピュータシステムでは、編集したい文書データは恐らく初めはディスクにあるでしょう。 ところがエディタはこれを直接修正せず、いったんメモリの中に内容の複製をとってから、その複製を修正するように振る舞います。 その後、メモリ中の複製をディスクに書き戻すことで修正を完了させるわけです。

この振る舞いについて以下にアニメーションで図示します。

ファイルとバッファの関係

Emacs でもこのファイルとメモリの関係を踏襲して作業が行われます。 このメモリの部分にあたるものを Emacs の世界ではバッファ (buffer) と呼んでいます。

Emacs でファイルを編集する場合、まずバッファにファイルの内容を読み込み、それを編集し、バッファの内容を書き戻すわけです。

ファイルからバッファに読み込む

まずファイルからバッファに読み込みます。 この状態からユーザは内容を修正しはじめます。 この例では「12345678」と書き足すことにします。

ファイルには memo.txt というファイル名がついており、それを読み込んだバッファには memo.txt と同じバッファ名が着けられている点に注意しておいてください。

バッファからファイルに書き出す

書き足された内容を含んだバッファの内容をファイルに書き出します。 これによってファイルに修正結果が反映されました。 もちろんファイルに書き出さずにバッファを破棄すれば修正内容は全く反映されないままになります。 これが通常のファイル編集の作業となります。

バッファとは直訳すると緩衝装置にあたります。 つまり衝撃など何かの動きを和らげる、緩やかにするものです。 そのために一時的に何か流動させているものを蓄える場所のことをバッファと呼ぶことが(コンピュータ分野に限らず)あります。 「大雨の時には何段にも設けられた貯水湖がバッファの役割を果たす」といった具合いです。 なんとなく Emacs のバッファの意味(位置づけ)が見えてきませんか?

 

ページ先頭へ戻る

バッファを意識したチュートリアル

では実際にファイルとバッファを意識しながら一連の処理をやってみましょう。

ファイルを読み込む

Emacs にファイルを読み込むには C-x C-f に続けてファイル名を指定して Enter です。

例では memo.txt という名前のファイルを読み込んでいます。

読み込みの前後では、モードラインに表示されているバッファ名が「 *scrach* 」から「 memo.txt 」に変わっていることを確認して下さい。 memo.txt ファイルを読み込んだために memo.txt という名前をバッファが一つ作成され、いまそれが表示されていることを示しているのです。

このとき Emacs のウィンドウで Control キーを押しながらマウスの左ボタンをクリックしてください。 下図のようなバッファ・メニューが表示されます。

メニュー上に memo.txt バッファの名前が確認でき、それがどのファイルに結びつけられているかが確認できます。 それ以外に「 *Messages* 」「 *scratch* 」バッファが見えていますが、これについては後で説明します。

また、マウスの右ボタンをクリックすると、下図のようなグローバル・メニューが表示されます。

このグローバル・メニューの「バッファ」を選択すれば、同様にバッファ・メニューが表示されます。

 

ページ先頭へ戻る

複数のバッファを扱う

Emacs では複数のバッファを同時並行で扱うことができます。 つまり複数のファイルの編集を並行に行えるわけです。 以下に二つ目のファイルを読み込んだ状態を図示します。

それぞれのファイルに相当する二つのバッファが作成され、それぞれにファイル名と同じバッファ名がつけられた点に注意してください。 Emacs ではこのようにしてバッファを名前で管理しています。

普通の状態であれば、Emacs は存在する複数のバッファのいずれか一つを表示します。 それ以外のバッファは表示はされませんが、消えたわけではありません。 ただ保持された状態を維持すると考えて下さい。 下図のように複数のバッファの上下関係を切り替え、最も上にあるバッファを表示するものと考えても良いでしょう。

 

ページ先頭へ戻る

複数のバッファを意識したチュートリアル

では実際に複数のバッファを意識した一連の処理をやってみましょう。

二つ目のファイルを読み込む

再び C-x C-f に続けてファイル名(先ほどのファイルとは異なるもの)を指定して Enter です。

例では sample.txt という名前のファイルを読み込んでいます。

読み込み前にはモードラインのバッファ名が「 memo.txt 」だったものが「 sample.txt 」に変わっています。 sample.txt ファイルのための sample.txt バッファが作成され、いまはこれが表示されていることを示しているのです。

再び Control キーを押しながらマウスの左ボタンをクリックしてバッファ・メニューを表示させましょう。

メニュー上に memo.txt バッファ、sample.txt バッファの両方が確認でき、それぞれどのファイルに結びつけられているかが確認できます。

バッファの切り替え

では表示するバッファを切り替えてみましょう。 バッファメニューを表示させた状態で、現在のバッファとは異なるバッファを選択して下さい。

例では sample.txt バッファを表示している状態で、memo.txt バッファを選択しています。 これによって再び memo.txt バッファの内容が表示され、モードラインのバッファ名表示も memo.txt になったことが確認できるでしょう。 再びバッファメニューを使ってバッファを切り替え、何度でもこの作業が繰り返せる事を確認して下さい。

キー操作によるバッファの切り替え

Emacs では全ての作業をキー操作のみで行うことができます。 バッファの切り替え作業をキー操作で試してみます。

バッファ切り替え操作は C-x b に続けてバッファ名を指定し、Enter です。 下図の例では memo.txt バッファに切り替えようとしています。

バッファが切り替わったことが確認できるでしょう。

Emacs では全ての操作がキー操作のみで完遂できるようになっています。 これはもともと Emacs がX window のような GUI 環境がない当時から存在している歴史的経緯からくるものと思いますが、しかしこの性質を好むユーザが多いことも確かです。 Emacs でのカーソル移動がカーソルキー(矢印キー)だけでなく C-f, C-b などによっても可能であることを知っていますか? 初心者には矢印キーの方が直感的であることは間違いありません。 しかしもしあなたが完全にタッチタイプできるのであれば、キーボードのホームポジションから手を動かさずに済む Control キーとフルキーだけで操作が完遂できる方が効率的だと思うでしょう。 Emacs を好む利用者のなかには、このフルキーのみによる操作を極めて重視する層がいます。 そしてファンクションキーも、テンキーも、カーソルキーもない、ただフルキーだけからなるキーボードもまた市販されています。 その名も HHK (Happy Hacking Keyboard) 。 やあ、奥が深いと感じますか?それとも呆れますか?

バッファの破棄

さまざまな理由からバッファを破棄することがあります。 修正内容をファイルに書き出した後でもバッファはそのまま残っていますから、そうした場合はバッファを破棄しておいた方が安全です。 (そうしないと何かの拍子にキーを押して意図せず内容を修正してしまい、最後に Emacs を終了する時に「はて、このバッファは修正してから正しく保存したのだろうか?それとも保存し忘れたのだろうか?」と混乱することがよくあります。)
もちろん修正したが保存したくない(ファイルに残したくない)という場合もあるでしょう。

バッファの破棄は C-k (kill の k と覚えると良いでしょう)に続いてバッファ名を指定して Enter です。

「 (default memo.txt) 」という表示の意味は、何もバッファ名を指定せずただ Enter キーを押した場合は memo.txt を破棄する、というものです。 C-x b による処理では現在表示されているバッファをデフォルトとして破棄しようとします。

もしこのバッファの内容が修正されていた(未保存だった)場合、Enter キーを押せば以下のような警告が出るでしょう。

破棄して問題なければ yes とタイプして Enter です。 破棄したくない場合(作業を中断したい場合)は no で Enter します。

上図のように再びバッファ・メニューを表示させると、破棄したバッファがリストにあがってこないことが確認できます。

コンピュータ用語でのデフォルト(default)は、省略した場合はこの処理をする、といったものの事を指し、初期値、既定値、と直訳されます。 ただ一般の英語としては不参加、(怠慢としての)義務不履行、といった意味合いのようですから、あまり英語圏での一般的な会話には使わない方が良さそうです。 (語源を知りませんが de - fault なのでしょうか?) 「約束を実行しない、決まり事を守らない」という意味から「(入力を省略した場合にとるべき)既定の値または処理」はなんとなくつながるのですが。

scratch バッファ

残ったバッファも試しに破棄し、その時バッファ・メニューがどうなるか、画面上の表示がどうなるか確認すると良いでしょう。 どうしても最後に「 *scratch* 」バッファが残り、一つもバッファがない状態にはできない、という Emacs の性質が観測できるからです。 scratch バッファは Emacs が起動された初期状態から存在する、一時利用に使えるバッファとして少々特別な存在なのです。

つまり今まで作業してきましたが、実際には読み込んだファイル以外に、Emacs 自身の作業などの必要性から幾つかのバッファが作成されていたのです。

イメージとしては上図のような状態でしょうか。Emacs はこのように、ファイルと結びつけられたバッファと、ユーザが意識的に作成したわけではないバッファを区別せず扱い、ユーザに見える状態にしています。
(つまりユーザは scratch バッファや Messages バッファの内容をファイルに書き出すことがごく自然にできます。)

 

ページ先頭へ戻る

コピー・ペースト(マウス操作編)

Emacs におけるコピーとペースト(貼り付け)の方法について説明します。 例として編集中の一行、「学部:理学部コンピュータ科学科」を少し下に複製する操作を示します。

コピー

まずコピーする元となる文字列の先頭位置にマウスを移動し、左ボタンをプレスします。

この状態でコピーしたい文字列の終わりの位置までドラッグし、マウスボタンを離します。 文字の色が反転表示(白黒反転のような状態)になっていることで選択範囲が示されています。
この選択された範囲のことをリージョン( region )と呼びます。

特別な操作はなく、この選択された範囲が次にペーストを行った時に処理対象となります。

なお、選択は左ボタンでクリックして先頭位置を決め、右ボタンをクリックして終わりの位置を決める、といった方法もあります。

ペースト

ペーストしたい場所に(例では「特技」の行の下)マウスポインタを移動させ、そこで中ボタンをクリックします。 この操作によって先ほど選択した部分が目的の場所に貼り付けられます。

メニューによるペースト

中ボタンではなく、グローバル・メニューによるペースト操作も可能です。 ペーストしたい場所にカーソルを移動し、そこで右ボタンをクリックすれば下図のようにグローバルメニューが表示されます。 ここで「編集」から「貼り付け」を選んで下さい。

メニューに見えているので分かるでしょうが、コピー操作もメニューを利用して明示的に行うこともできます。 コピーは余り意味がないと思いますが、カットについては意味があるでしょう。 両者の違いについてはコピーとカットで説明します。

 

ページ先頭へ戻る

コピー・ペースト(キー操作編)

Emacs では全ての作業がキー操作だけで行えます。 コピー・ペーストも例外ではありません。

コピー

まずコピーする元となる文字列の先頭位置にカーソルを移動し、C-Space (Control キーを押しながら Space キーを押す)とします。

ウィンドウ最下行に Mark set と表示されています。 この位置(例では「学部;」の最初の位置)をリージョンの先頭位置としてマークした(一時的に記憶した)事を意味しています。 この状態でコピーしたい文字列の終わりの位置までカーソルを移動してください。 文字の色が反転表示(白黒反転のような状態)になっていることで選択範囲が示されています。
(X Window 環境でなければこのような表示は行われません。)

この状態で M-w (Escape キーを押してから w キーを押す)とすると、選択されたリージョンがコピー(一時的に記憶)されます。

ペースト

ペーストしたい場所(例では「特技」の行の下)にカーソルを移動させ、そこで C-y とします。 この操作によって先ほどコピーした部分が目的の場所に貼り付けられます。

コピーとカット

「コピー・ペースト」ではなく「カット・アンド・ペースト」といった表現を見ることがあるでしょう。 元の文書の選択した部分を目的の文書に貼り付けることには違いがないのですが、元の文書で選択した部分の扱いが異なります。

コピー 選択した部分を残して、その複写を目的の場所に貼り付ける
カット 選択した部分を削除し、その部分を目的の場所に貼り付ける

Emacs におけるカットのキー操作は、C-w です。 つまり C-Space によるマークを行ったあと、 M-w とするとマークからカーソルまでをコピーし、C-w とするとカットが行われます。

マウスによる操作とキーによる操作は等価なものですから、マウスで選択し、C-w でカットしても構いませんし、その後マウスの中ボタンを押してペーストすることもできます。

 

ページ先頭へ戻る

検索

エディタにとって検索は基本的な機能のひとつです。

インクリメンタル・サーチ

インクリメンタル・サーチ (incremental search) は増分検索などと訳され、追加的に検索キーワードを伸ばしていくタイプの検索です。 つまり「sample」という単語を検索する場合、まず「s」とタイプすれば最初に「s」が見つかった場所を表示し、次に「a」とタイプすれば、最初に「sa」が見つかった場所を表示します。 使ったことがないとピンと来ないかもしれませんが、使ってみるとこれは非常に便利です。

C-s が前向き(下向き)のインクリメンタル・サーチです。 C-s とタイプすると下図のような表示になるでしょう。

この「 I-search: 」 に続けて、検索する文字列を一文字ずつタイプしていきます。 例えば下図では、「coun」とタイプした状態を示します。

検索文字列とマッチしている部分は色が変わって表示されます。 C-s をもう一度押せば、更に下に向かって次々と検索を続けます。 (この例では次は二行下にある count にマッチするでしょう。)

逆向け(上向け)の検索

検索をカーソル位置から上に向かって行いたい場合は、C-r です。 操作方法は C-s と同じです。 C-s で検索している途中で、検索方向を C-r によって切り替えることもできます。 その逆、つまり上向け検索を下向けに切り替えることも可能です。

単語(漢字含む)の検索

インクリメンタル・サーチは便利なのですが、2 バイト文字(漢字)を検索することができません。 インクリメンタル・サーチをしている最中に C-\ しても「 No EGG!! 」とエラーメッセージが出てくるだけです。 漢字を含む文字列の検索をする場合は、インクリメンタルでない検索機能を使います。

方法は C-s とした後、何も検索文字を入れずに Enter キーを押し、続けて検索したい単語を入力します。

表示が「 I-search: 」ではなく「 Search: 」になっています。 この状態で Enter キーを押せば、その単語の検索がはじまります。

インクリメンタルサーチとは異なり、マッチした文字列の色を変えて表示されたりはしません。 カーソルがマッチした文字列の最後の位置に移動しますので、それで判断してください。

さらに下に向かって検索したければ C-s です。 (この時はマッチする文字列に色が付きます。)

この単語検索も、C-s ではなく C-r で始めれば、カーソル位置から上に向かって単語検索するようになります。 検索途中で C-s や C-r によって検索方向を切り替えることができる点もインクリメンタルサーチと同じです。

漢字を含んだ単語の指定

この単語検索の場合には、検索文字列を入力する時に C-\ として Wnn によるかな漢字変換を始めることができます。 これで漢字を含んだ単語の検索が可能になるわけです。

 

ページ先頭へ戻る

置換

対話的な(または問い合わせ型の)置換、と呼ばれる置換方法について紹介します。 例では文字列「 count 」を「 number 」に置き換えます。

M-% としてください。下図の表示になります。

ここでは置き換える元の文字列をたずねています。 「count」とタイプし、Enter キーを押してください。 下図のような表示になります。

続いて置き換え後の文字列をたずねています。 「number」とタイプし、Enter キーを押してください。 下図のような表示になります。

まず最初にマッチした文字列(count)の色が変わって表示されています。 対話的置換では次に押すキーによってその後の処理が変わります。

Space この文字列を新文字列に置換し、次にマッチする部分を検索・表示する
Delete この文字列は置換せず、次にマッチする部分を検索・表示する
Enter 置換処理をこれで終了とする(この文字列は置換しない)
! (エクスクラメーションマーク) この文字列は置換せず、次にマッチする部分を検索・表示する
^ (ハット) 直前に置き換えた文字について元に戻す(最後の一つより前の置換にはさかのぼれない)

最終的に何箇所が置換されたかを下図のようにして表示します。

検索の再開

一度途中で終了した置換をカーソルの位置から再開することもできます。 C-x Escape Escape (Control キーを押しながら x キーをおし、Escape キーを二度押す)としてください。 下図のような表示になります。

この状態で Enter キーを押せば、最後の置換動作が再開されます。

 

ページ先頭へ戻る

単語登録

Emacs で利用しているかな漢字変換システムである Wnn7 は一度変換した文字は極力覚えるようになっていますが、もとから辞書に載っていないような固有名詞などは変換できません。 その場合は単語登録をすることで次回から簡単に変換候補にあがるようにできます。

Emacs を使った単語登録

以下に「中山広洋」(なかやまひろみ)という人名を例にとり、Emacs に用意されている単語盗録機能について説明します。

まず「なかやまひろみ」と入力して変換してみました。

「中山」は問題なく変換されたのですが、やはり「ひろみ」の読みに対して「広洋」は候補としてあがってきません。 仕方ありませんので「広」だけ先に変換し、あとは「よう」とタイプして「洋」に変換することにします。

正しく「広洋」と入力できた所で、この「広洋」を「ひろみ」の読みで単語登録することにします。 以下の図のように、まず登録したい単語を選択します。

選択の要領はコピー・ペーストの文字列選択と同じです。 まずカーソルを「広」の字まで移動させたところで、C-Space (Control キーを押しながら Space キーを押す)でマークをします。 続いてカーソルを「洋」の後まで移動させます。マウスで「広洋」をドラッグして選択しても構いません。

この状態で M-x wnn7-toroku-region としてください。(Escape キーを押してから x キーを押し、wnn7-toroku-region とタイプしてから Enter です。)

Enter キーを押すと下図のように、画面最下行に登録用のメッセージが表示されます。

もしこうならず、「The mark is not active now」といったメッセージが表示された場合は、登録単語の選択に失敗しています。やり直して下さい。もしこの時点で希望と異なる単語が登録されようとし ていた場合(つまりは選択範囲を間違えたのでしょうが)は、C-g で作業を中断できます。

続いて「ひろみ」と読みがなを入力します。このじてんでは既にローマ字入力モードになっていますので、単に「hiromi」とタイプすればいいでしょう。Enter を押すと、下図のようになります。

ここでは登録する辞書の種類を尋ねています。0. の 「 ud 」(user dictionary) をカーソルキーで選択して、Enter キーを押して下さい。

次は品詞を尋ねています。今回は固有名詞ですので 1. の「固有名詞」をカーソルキーで選択して、Enter です。

続いて更に細かく尋ねています。0. の「人名」をカーソルキーで選択して、Enter です。 これで「広洋」が読みを「ひろみ」として登録されました。 試みに「なかやまひろみ」とタイプして変換してみました。

今まではなかった変換候補である「広洋」が二番目に現れています。

「広洋」を「ひろみ」と読ませるとは余りぱっとしないサンプルだなと思われるかも知れません。 いろいろ捜したのですが、私が思いつくありそうな名前はすべて既に登録されてしたのです。 ご容赦下さい。

辞書ユーティリティを使った単語登録

登録するのは Wnn7 に対してであって Emacs にではありません。 当然ですが Emacs を使わずに単語登録するための辞書ユーティリティ、wnndictutil コマンドが用意されています。

% wnndictutil

wnndictutil コマンドを実行すると、新しいウィンドウが一つ開き、単語登録処理ができるようになります。

「詳細表示」ボタンをクリックすると、品詞の設定などができます。 ツールを終了するにはウィンドウ右上端の×マークをクリックします。

単語登録ユーティリティへの漢字と読みの入力について

cc 環境の UNIX 環境では、単語登録ユーティリティには漢字や読みがなが入力できません。 通常なら「語句」や「読み」のフィールドに Wnn を使ったかな漢字変換ができるはずなのですが、この原稿を書いている時点(2005.4)ではできません。
しばらくは kterm のウィンドウなどに登録する単語や読みがなを入力して表示させ、それを Copy & Paste で「語句」「読み」フィールドに記入するようにしてください。
(まずドラッグして Copy する文字列を選択してから、貼り付ける場所を中ボタンでクリックすれば Paste されます。)

 

ページ先頭へ戻る

ちょっとした芸

 

ページ先頭へ戻る

良くある質問・トラブル

 

ページ先頭へ戻る

参考文献

 

ページ先頭へ戻る

Valid HTML 4.01!