Emacsの使い方

(LaTeXの使い方はこちら

(Emacsのコマンド一覧表だけ見れたらいいやって 人はこちらへ)

 UNIXシステムの高機能エディタであるEmacsの使い方を紹介する。
 基本的にEmacsをほとんど使ったことのない人向けだが、 後半は少し詳しい内容も含むので ある程度使える人も気が向いたら目を通してみてほしい。

<補足>
Emacsの利用環境によっては、このページの内容と一部のコマンド等が異なる場合があります。

目次

Emacsの起動

まず、Emacsを起動するにはターミナルを開いて

$ emacs
と入力。("$" はターミナルにもともと 表示されているので、実際に入力するのは"emacs"だけ)
これでEmacsが起動する。

ちなみに、このとき開いたEmacsを終了するまではターミナルでコマンドの 実行ができなくなる。もしEmacsを開いたままターミナルも 使いたい場合は、
$ emacs &
と入力して起動すればよい。

Emacsの起動時は下のようになっている。

snap-emacs_01.png
今開いているのは*scratch*というバッファで、落書き用紙のような もの。バッファ(buffer)というの は作業中のファイルのことで、 とりあえずはファイルと同じようなものだと 思っておけばよい。
 また、ウィンドウ下部の*scratch*と書かれている 部分はモード行(あるいはモードライン)と 言い、現在開いているバッファ名などの情報が書かれている。
 さらに、ウィンドウの一番下の 行はエコー領域と言い、 いろいろなメッセージが表示される。


カーソルの移動

まずは上のスナップショットのように、カーソルを2行目の真ん中あたりのiの 位置にもってきてみよう。

ここで Ctrlキーを押しながらf を押すと カーソルが1つ右に移動する。
次に、 Ctrlキーを押しながらb を押すと。 カーソルが1つ左に移動。
同様に Ctrlキーを押しながらn を押すと1つ下に、
さらに Ctrlキーを押しながらp を押すと1つ上に移動する。

もちろん矢印キーを使って移動することもできるが、これらのコマンドを 使えばわざわざそこまで指を持っていかなくても移動できるので、 慣れれば作業効率は格段に上がる。
 ちなみにfはforward、bはbackward、nはnext、pはpreviousの意味なので、 それぞれ意識しておくと覚えやすい。

他にも次のようなものがある。

これ以外にもたくさんのコマンドがあり、 コマンド一覧表 によく使うものをまとめておく。


操作の中止

Emacsを使っていると、キーを打ち間違えて変な動作になったときや、 ファイルを開こうとしてやっぱりやめたいときなど、 操作を途中で中止したくなることがある。 そのときは Ctrlキーを押しながらg で中止できる。
最重要コマンドなので必ず覚えておこう。


日本語入力の切り替え

日本語入力のOn/Offは、Ctrlキーを押しながら\ で 切り替えられる。
 また、他にも

で切り替えられることもあるが、Emacsの環境によってできるものと できないものがある。


バッファの保存

では、今度はバッファを保存してみよう。
 Ctrlキーを押したまま x s と続けて入力してみると下のようになる。

snap-emacs_02.png
カーソルが一番下の行に移動したのがわかる。ここをエコー領域と言ったが、 カーソルが移動して何か書き込める状態になっている ときはミニバッファが 開かれていると言う。
 ここで ~/ に続いてファイル名を書き込むことでバッファの保存ができる。 ~はホームディレクトリの意味で、例えば ~/sample.txt と入力 してEnterを押すと、ホームディレクトリの下にsample.txtという名前で 保存される。
 もちろん他のディレクトリも指定できるので、 例えば ~/study/sample.txt とすると、ホームディレクトリの中の studyというディレクトリの中に保存される。

というわけで、~/sample.txtと入力してEnterを押すと、

snap-emacs_03.png
となり、sample.txtが無事に保存された。 モードラインを見ると、*scratch*というバッファ がsample.txtというバッファ名に変更されたのがわかる。また、 バッファ名の左の**となっていた部分が--になった。 **は編集中で未保存--は保存済み という意味。 ちなみに、ここでは出てきていないが %%はread-only(書き込み不可)のバッファ となる。

これで「書きかけ のバッファファイ ルとして保存された」ことになる。 これ以降は、Ctrlを押したまま x s を押す度にsample.txtを 上書き保存する。
このコマンドも超重要なので必ず覚えておこう。
 また、別名で保存するには、Ctrlを押したまま x w と 続けて入力した後、ミニバッファでファイル名を指定すればできる。

なお、カーソルがミニバッファに 移動しているのを中止する 場合、 Ctrlを押しながらg でできることも併せて覚えておこう。


Emacsの終了

ここで一旦Emacsを終了してみよう。Ctrlを押したまま x c と 続けて入力するとウィンドウが閉じてEmacsが終了する。 このとき、もし未保存のバッファがある場合は保存するかどうか 聞いてくる。ただし、例外として*scratch*バッファは 未保存の場合でも確認なしで終了するので注意。


ファイルを開く

ターミナルに戻って、今度は最初に開くファイル名を指定してEmacsを起動して みよう。

$ emacs sample.txt &
と入力してみると、先ほど保存したsample.txtがEmacsで開く。
もしターミナルで現在いるディレクトリと違うところに ファイルがあるときは、正しくファイルのパスを書いてやる必要がある。

また、ファイルを開くのはEmacs上からでも できる。Ctrlを押したまま x f と続けて入力し、 ファイル名を指定すればOK。個人的にはこちらの開き方の方が好み。

ちなみに、ファイルを開くときに、存在しない ファイル名を入力するとその名前を持つ新規バッファが作られる。 そして、そのバッファを Ctrlを押したまま x s で保存する と、その名前のファイルとして保存されます。新しいファイルを 作るときはこの方法でやるとよい。

その他のコマンドについては コマンド一覧表 を参照。


ちょっと休憩

ここまでで、Emacsの大まかな使い方はわかってもらえたと思う。 とりあえずこれだけ覚えていればEmacsを使うことはできるが、もっとコマンド を覚えることでどんどん便利になっていくので、この後はもうちょっと 進んだ内容を説明していく。

ところで、ここからは Ctrlを押しながら 何かキーを押す操作を C-○ と 表すことにする。例えば、カーソルを右に進めるのは C-f、 ファイルを開くのは C-x C-f と表す。
 また、Altを押しながら何かキーを押す 操作を M-○ と表す。

なぜAltキーなのに M-○ と書くかというと、MはMetaの略で、昔の あるキーボードにはメタキーというキーが付いており、 今のキーボードにはメタキーは付いていないので、 Altキーを代わりに割り当ててあり、 M-○ という表記はその名残。

これらの表記はEmacsで一般的に使われる表記法なので ぜひ覚えておこう。

ちなみに、M-○ は Escキーを押した後に○を押す ことでも 入力できたりする。ただしこちらはEscを押した後指を離すことに 注意。


文字列処理

基本的な文字列処理の方法を覚えよう。 まずは文字の削除から。
 先ほどのsample.txtを開いて、どこか適当なところに カーソルを合わせて C-d と入力してみよう。すると 今カーソルがある場所の文字が削除される。つまりDeleteキーと同じ。
 では、Backspaceキーにあたるコマンドは何かというと、 おそらく C-h を使うのが一般的だと思うが、C-h は デフォルトではヘルプに割り当てられている場合が多い。 一度試してみて、もしエコー領域に C-h (Type ? for further options)- と 表示された場合はヘルプに割り当てられているので C-g で 中止しよう。C-h をBackspaceとして割り当てる方法は .emacsの便利な設定 のキー割り当てに関する設定のところに載せているが、設定には少しだけ知識が必要。 今はとりあえずBackspaceキーで我慢しておこう。
 また、C-h をBackspaceとして割り当てているときは C-h でヘルプが 見れなくなるが、F1キーもヘルプに割り当てられているので、必要な ときはそちらを使うとよい。

次にコピーやカットをやってみよう。
 Emacsでキーボードを使ってコピーやカットをする方法はちょっと特殊で、 WindowsのようにShiftキーを押しながらカーソルを移動しても 範囲が選択されない。
 そこで、まずは範囲を選択したい最初の文字に カーソルを合わせて C-SPC を押してみよう。 するとエコー領域に Mark set と表示される。 このマークセット(Mark set)が範囲の選択を 始める合図で、この後カーソルを移動させるとその範囲が 選択される。マークセットして選択した範囲のこと をリージョン(region)と言う。 とりあえず適当にリージョンを選択してみよう。
 リージョンの選択時、Emacsの環境によっては選択範囲が強調表示されない 場合があるが、強調表示されるように設定を変える方法は こちら に載せている。

リージョンを選択したら、コピーは M-w、 カットは C-w でできる。 また、マークセットの中止は C-g で可能。
 今度はコピーやカットした文字をペーストしてみよう。 ペーストしたい場所にカーソルを合わせて C-y でペーストできる。 ちなみに、ペーストのことはヤンク(yank)とも言う。

また、カットはもう一つ方法があって、 C-k で カーソル位置から行末までをカットする。 カーソルを動かさずに繰り返し C-k でカットすると、 繰り返しカットした行全てがコピーされる。適当に数行カット した後 C-y でペーストして、実際にどうなるか確かめてみよう。

C-k によるカットは非常に便利。 これなしにEmacsは語れない。

なお、マウスでドラッグしてもリージョンの選択ができ、M-w のコピー や C-w のカットもできるが、Linuxの場合はドラッグで選択した後 マウスのホイールをクリックすると、コピーやカットをしなくても 貼り付けることができる

これはEmacsの機能ではなく、X Window SystemというUNIX系の ウィンドウシステムの仕様。X Window Systemでは文字列を ドラッグした時点でクリップボードにコピーされ、ホイールクリックで 貼り付けることができる。 例えばブラウザのテキストをEmacsに貼り付けたり、逆にEmacsから ブラウザに貼りつけたりするときはこの方法がいいだろう。
 ただし、C-SPC でマークセットしてリージョンを 選択した場合は、ホイールクリックで貼り付けることはできない。 あくまで マウスでドラッグ → ホイールクリック という流れになる。

また、Emacsのウィンドウをマウスのホイールでスクロールしているときに 誤ってホイールクリックしてしまうと、そのときマウスカーソルがあった位置に 貼り付けられてしまう。こうなるとどこにどんなテキストが 貼り付けられたかわからなくなることがあるので、 スクロールにはなるべくホイールを使わないようにし、 もしホイールを使うときは十分気をつけてほしい。 もしホイールクリックで貼り付けてしまったときは、すぐに C-/ または C-_アンドゥ (Undo:元に戻す)しよう。


ウィンドウ操作

複数のファイルを編集するとき、複数のウィンドウを並べて 表示したいことがある。まず、C-x 2 でウィンドウを 縦に分割できる。C-x 3 でウィンドウを横に分割できる。 ウィンドウの分割は複数回できるので、何度もやるとたくさんのウィンドウを 作れる。
 C-x 1 で分割されたウィンドウを1つにする。このとき、 カーソルを合わせているウィンドウが表示される。 C-x 0 でカーソルを合わせているウィンドウを削除。
 ちなみに、C-x 1 や C-x 0 でウィンドウを減らしても、 そのウィンドウで表示していたバッファ自体は削除されない。

 実際にウィンドウを分割してみると例えば下のようになる。

snap-emacs_04.png
これは C-x 2 で縦に分割した後 C-x 3 で横に分割している。

分割したウィンドウの大きさを変えることもできる。 マウスカーソルをモードラインに合わせたとき、カーソルの形が変わるところで ドラッグすると調節できる。
 コマンドで行う場合は、C-x ^ でカーソルのあるウィンドウを 縦に伸ばし、C-x { でカーソルのあるウィンドウを横に縮め、 C-x } で横に伸ばす。 一度やってみるとよくわかると思うので、いろいろ試してみてほしい。

また、C-x o で次のウィンドウにカーソルを移動する。 もし C-x C-f でファイルを開くときなど、エコー領域に ミニバッファが開いているときはミニバッファにもカーソルが移動する。


バッファの切り替え

Emacsでは一度に複数のファイルを開くことができ、バッファとして 記憶されている。
 例えば、まず C-x C-f でsample.txtを開き、次にもう一度 C-x C-f で 今度はsample2.txtを開いたとする。 現在ウィンドウはsample2.txtのバッファを表示している(下の図の状態)。

snap-emacs_05.png
ここで、C-x b と入力してみよう。 (C-x を入力したあと、Ctrlは押さずにbを押す) するとカーソルがミニバッファに移動し、下のように表示される。

snap-emacs_06.png
ここでバッファ名を入力することで、バッファの切り替えができる。
ミニバッファに (default sample.txt) とあるのは、何も書かずに Enterを押すとsample.txtのバッファに切り替えるという意味。 つまり、 直前に開いていたバッファがdefaultとなり、 何も書かずにEnterを押すとdefaultのバッファ名を入力したことと同じ になる。
 まぁ実際にやってみた方が早いので、試しに何も書かないか、sample.txtと 入力してみよう。バッファ名を 入力するときは、途中でTabもしくはSPCキーを押すと補間でき、続けて押すと 補間候補が表示される。
 すると、

snap-emacs_07.png
sample.txtに切り替えられた。このように、Emacsでは 1つのウィンドウでも複数のバッファを管理できる。

ちなみに、密かにモードラインのバッファ名のところをマウスでクリックしても バッファの切り替えができたりする。他にも、モードライン上の ドラッグでウィンドウの移動ができるところで、 マウスを右クリックするとそのウィンドウを削除(C-x 0 と同じ)できたり、 ホイールクリックするとそのウィンドウを1つに(C-x 1 と同じ)できたりする。

次の内容はそれほど重要ではないので飛ばしてもらって構わない。 興味があれば読んでみてほしい。

今どのバッファが開かれているかを調べたいときは、C-x C-bバッファリスト(*Buffer List*)を表示することがでる。 バッファリストが表示されたら、 C-x o で*Buffer List*が開かれているウィンドウに移動する。
 バッファリスト内で行える主な操作は、

などがある。
 なお、バッファの削除はEmacs上から消去するだけで、元のファイルが削除 されるわけではない。

バッファリストはバッファをたくさん開いて同時に管理する場合 などは便利。 ただ、バッファリストを表示するために*Buffer List*バッファを 作って勝手にウィンドウが分割されてしまうので、基本的には C-x b で バッファを切り替える方が楽。そのとき、もしCtrlキーから 指を離すのが遅れたりして C-x C-b が暴発して しまったら、C-x 1 で分割されたウィンドウを1つにすればよい。


バッファを閉じる

バッファを閉じるには、C-x kでできる。このとき ミニバッファにカーソルが移動し、そのままEnterを押すと 現在開いているバッファ(カレントバッファ)を閉じる。
 ミニバッファでは閉じるバッファ名を入力できるが、実際に使うときは 何も入力せずにカレントバッファを閉じることが多くなるだろう。


文字列の検索

文字列の検索は C-s で行う。C-s を押すとカーソルが ミニバッファに移動し、I-search: と表示される。ここで文字を 入力すると、1文字入力する度にヒットした候補にカーソルがジャンプする。 つまり電子辞書で単語を調べるときと同じ方式で、このような検索方式 をインクリメンタルサーチと 言う。
 では実際に検索してみよう。 まずは"this"という文字列を検索してみる。

snap-emacs_08.png
これは C-s を入力後、th まで入力した状態。 ヒットした候補が強調表示されている。そして、最初にヒット した1行目の"This"のThの後ろにカーソルがジャンプした。 このように大文字が含まれる場合、小文字で検索してもヒットする。 ただし、逆に小文字の文字列を大文字で検索してもヒットしない。
 続けてiを入力してみよう。

snap-emacs_09.png
候補が2つまで絞り込まれた。今度は"that"を検索するために 、Backspaceを一度押してからaを入力してみよう。

snap-emacs_10.png
新たにヒットした候補にジャンプした。
 ここで、次の候補にジャンプするときはもう一度 C-s を押す。 また、前の候補にジャンプするときは C-r を押す。 もし文書の最後まで検索してもヒットしなかったときは、 再び C-s を押せば先頭から検索し直してくれる。
 検索を終了するときはEnterを押す。

ちなみに、今回は最初に C-s で検索を開始した が、C-r を押すことでも検索を開始でき、そのときは カーソル後方の文字列を検索する。もちろん C-r で検索中 でも C-s を押せば前方の検索に切り替えられる。

また、日本語を検索するときは注意が必要。C-s で I-search: と表示されているときは日本語が入力できなくなっているので、 何も入力せずにEnterを押そう。すると、今度はミニバッファに Search: と表示され、このときは日本語も入力できるようになる。 こちらはインクリメンタルサーチではないので、検索ワードを 入力後にEnterを押して初めて検索を開始する。 また、たぶんヒットした候補が強調表示されないと思うが、 検索自体はちゃんとできている。


文字列の置換

次は強力なツールである文字列の置換をやってみよう。
 文字列の置換は M-% でできる。ちょっと押しにくいが、 Alt + Shift + 5 と押すか、一度Escを押した後、Shift + 5 と 押してもよい。
 ミニバッファにカーソルが移動し、Query replace: と表示されるので、 まずは置き換える前の文字列を入力してEnterを押す。すると、 その右にwith: と表示されるので、 置き換えたい文字列を入力してEnterを押す。 なお、置換には日本語も使用可能。

では、"abc"という文字列を"ABC"という文字列に置換してみよう。
 M-%を押した後、まずは abc と入力し、次に ABC と入力する。
snap-emacs_11.png
するとエコー領域に上のように表示され、ヒットした abc という 文字列を ABC という文字列に置換してよいかと聞いてくる。
 ここで、置換する場合は yまたはSPC、置換せずにスキップする 場合は nまたはDEL を押す。途中で置換を終了する 場合は qまたはRET です。C-g でも中止できる。
 また、! でヒットした全ての置換候補を一発置換できるが、 思わぬところまで置換してしまう可能性があるので、長い文書では 使わない方がいいだろう。

ということで、適当に置換を進めると、

snap-emacs_12.png
このように置換できた。
 なお、置換は M-% を押したときのカーソル位置より 前方だけ行うため、 カーソル位置より前の文字列は ! でも置換されないことに注意。

置換は非常に便利なツールで、例えばC言語のソースを書いていて変数名を 変えたくなったりしたときなどは、置換がないとやってられない。

置換の活用例としては他にも、

などいろいろ工夫できる。


コマンドに引数を与える

Emacsのコマンドには引数を与えることができる。
 例えば、C-5 a と入力すると、aが5回出力される。 次に、C-1 C-0 C-n と入力すると、カーソルが10行下に移動する。 このように、何か入力する前に C-数字キー で予め引数を 入力しておくことで、次に入力するコマンドを 引数の回数だけ実行することができる。Ctrlの代わりにAltを 使って M-5 a としても同じ。

また、C-u でも引数を与えることができる。C-u は デフォルトで4が引数として与えられるので、例えば C-u a と するとaが4回出力される。C-u C-u a とすると16回、C-u C-u C-u a と すれば64回出力される。
 主な使い道は、カーソルを一度にたくさん移動することなど だろうか。C-u C-u C-n あたりは使い勝手がいい。


M-x 関数について

実は、今まで紹介してきたコマンドのほとんどは M-x ○○ という コマンドで実行することができる。例えば C-f でカーソルを1つ右に進める のは M-x forward-char と入力しても同じ。また、forward-char の部分 は関数と言う。今までやって きた C-f などのコマンドはそれぞれの関数のショートカットコマンド であり、キーバインドとして 割り当ててあったわけである。

M-x と入力するとカーソルがミニバッファに移動するので、まずはTabを 押してみよう。するとたくさんの候補が出てきたと思う。 カーソルを動かすのもファイルを保存するのも、 全てこの中のある関数で実行されている。

今まで紹介してきたコマンドがどんな関数なのかを調べる1つの方法としては、 何かコマンドを実行した後 C-x z とするのが簡単。 C-x z は直前の操作を繰り返すコマンドで、例えばカーソルを右に移動した後 に C-x z と入力すると、エコー領域に Repeating command forward-char と 表示され、forward-char という関数が繰り返されたことがわかる。
 ただし、この方法で調べられないものもある。 ファイルを保存する C-x C-s などがそうなのだが、 なぜできないのかは・・・まぁやってみればわかる。 ちなみに正解は save-buffer という関数。 キーバインドを調べるには M-x describe-bindings とすればできる。 これを実行するとキーバインドと関数の一覧が表示されるので、 キーバインドに対応する関数を調べることができる。


メジャーモードとマイナーモード

例えばtxtファイルを開いたときにモードラインを 見ると、(Text Fill) などと表示されていると思う。 また、texファイルを開いたときは (LaTeX Fill) または (やてふ Fill) などと 表示されていると思う。
 ( )内の "Text" や "LaTeX"、"やてふ" の部分はそれぞれ、txtファイルを 開いたときは text-mode に、texファイルを 開いたときは latex-mode または yatex-mode になった ということを表している。 これをメジャーモードと言う。 どのバッファも必ず1つのメジャーモードになっている。
 各々のメジャーモードではまずテキストの編集機能が大きく違う。 それぞれのモードに応じて、適切なインデントや 文字の色付け(font-lockと言います)を行ってくれる。 また、そのメジャーモードのときだけ使える関数やコマンド が定義されていることもある(コメントアウトなど)。

ちなみに、ファイルを開くと適切なメジャーモードが自動的に 選択されるが、自分でモードを切り替えたいときは、M-x の後に モード名を入力することでできる。上で書いた text-mode や yatex-mode の 他にも c-modec++-modejava-mode などがある。

また、M-x shell でEmacs上でシェルを開くことが できる(shell-mode)。

また、( )内の "Fill" の部分 は auto-fill-mode がオンになっているという意味で、 これをマイナーモードと 言う。auto-fill-mode はテキストを書いていて行が長くなると、 自動的に改行を入れてくれるマイナーモード 。M-x auto-fill-mode を実行する度にオン・オフの 切り替えが可能。 マイナーモードは他にも数種類あり、メジャーモードと違い 個別にオン・オフを切り替えることができる。
 ちなみにInsertキーが付いているキーボードでは、Insertキーを押す ことで overwrite-mode になり、モードラインに Ovwrt と 表示される。作業中に突然テキストが上書き入力されるようになって しまったときは、おそらく間違ってInsertキーを押して overwrite-mode に なっているはず。そのときはもう一度 Insert を 押して overwrite-mode をオフにすればよい。 ちなみに、M-x overwrite-mode とすることでもオン・オフの切り替えが できる。


Emacsのカスタマイズ

Emacsはデフォルトでも十分高機能なエディタだが、 気に入らない設定があったり新しく機能を追加したい ときは、.emacsというファイルを編集する ことで設定を自分好みにカスタマイズできる。
 .emacsはEmacsの起動時に自動的に読み込まれるファイルで、 普通はホームディレクトリに置かれている。
 ちなみに、LinuxなどのUNIX系OSでは、"." で始まるファイルは隠しファイル として扱われるので、ファイラなどでは表示設定を変えないと 見えないが、Emacs上では普通に開ける。
 ただし、.emacsはEmacs Lispという言語で書かれて いるため、自分で本格的に編集するにはLispの知識が必要になる。 基本的には人の書いた設定をコピーして使うことになるだろう。

.emacsの設定例を紹介する。
 このページの上で述べた C-h をBackspace に割り当てる設定と、 リージョンを強調表示する設定は下のようになる。

;; C-h をBackspaceに割り当て
(global-set-key "\C-h" 'delete-backward-char)

;; リージョンを強調表示
(transient-mark-mode t)
以上を必要に応じて.emacsにコピー&ペーストして保存しよう。Linuxなら マウスでドラッグしてホイールクリックで貼り付けられる。 セミコロン(;)で始まる行はコメントとみなされる。
 編集した設定は、Emacsを再起動すると有効になる
 この他にも便利な設定をいくつかまとめたものを .emacsの便利な設定 に載せている。

<CS23研究室内限定の注意事項>
研究室のマシンで設定を書く場合、.emacsとは別のファイルに分けて 置いておくためにホームディレクトリの すぐ下に .emacs.my.el というファイルを作り、 そこに書くようにしよう。
 Emacsは起動時に.emacsを読み込むが、研究室の 設定では.emacsから.emacs.elというファイルを読み込み、 さらにそこから.emacs.my.elを読み込むように予め書かれているため。


Meadowについて

EmacsをWindows用に移植したMeadowというフリーソフトがある。 若干異なるところもあるが、基本的にはEmacsと同じなので、 ここで書かれていることのほとんどはMeadowでも使用可能。
 ただ、Meadowのインストールはちょっとややこしい。解説サイトも いくつかあるので、興味があれば調べてインストールしてみてほしい。 インストールの仕方は気が向いたらこのページでも載せるかも。


リンク