Emacsビギナー

Emacsはじめの一歩

背景

Emacsとは何か知りたいときは、WikiPedia:Emacsを見てください。

チュートリアル

Emacs には標準で「チュートリアル」が含まれています。ひととおりチュートリアルを終えるのにそれほど時間は掛かりませんし、これをこなせばより効率的に Emacs が使えるようになるでしょう。チュートリアルの開始方法は次のとおりです。

Emacsは当てにならない、というわけじゃないんです。 – キーシーケンスは、Xウィンドウや、コンソール、ターミナルエミュレータやssh越しなど多様なので、‘C-h’‘F1’の動作は環境によって異なる場合があるんです。

チュートリアルを英語以外の言語で読むには、‘help-with-tutorial-spec-language’コマンドを使ってください。これは「メタキー(Alt)を押しながら‘x’を押して、’Alt’を放してから‘help-with-tutorial-spec-language’と入力する」ということです。 現在、使用できる言語は次のとおりです: bg, cn, cs, de, es, fr, it, ja, ko, nl, pl, ro, ru, sk, sl, sv, th, zh

基本的な考え方

この項目ではEmacsの一般的な使い方について取り上げます。Emacsのマニュアルから基本的な考え方と使用上の注意を紹介します。もっとも、マニュアルそれ自身(‘C-h i’)を読めば、Emacsと関連することがらがすべてわかるのですが。 – ただし、Emacs用語(ジャーゴン)だけはマニュアルに含まれていません。

注意書き

Emacsドキュメント中の表記の意味:

C- コントロールキーを押しっぱなしにして何か別のキーを打つことを意味する。
M- メタキーを押しっぱなしにして何か別のキーを打つことを意味する。メタキーはたいていのキーボードでは‘Alt’と書いてあるキーのことです。
DEL バックスペースキー(‘Backspace’, ‘BS’)のことです。デリートキー(‘Del’)ではありません。
RET エンターキー(‘Enter’, ‘Return’)のことです。
SPC スペースキーのことです。
ESC エスケープキー(‘Esc’, ‘Escape’)のことです。
TAB タブキー(‘Tab’)のことです。

“C-M-“や"M-C-“のような組み合わせは、コントロールキーとメタキーを一緒に押しっぱなしにするという意味です。

Emacs用語(ジャーゴン)

Emacs用語の対応表(一般的な用語/ジャーゴン):

一般的な用語Emacs語
選択範囲・選択部分リージョン
切り取りキル・kill
貼り付けヤンク・yank
ウィンドウフレーム
ショートカットキーキーシーケンス

Emacs用語の意味:

注記: メニュー項目の選択とマウス操作はキーシーケンスとして扱われることもあります。 キーシーケンスを入力するべきときに、キーボードの代わりにメニュー項目を選択したり、マウスを操作する(「MB1をクリックする」など) ことがあります。

“ポイント"と"マーク"については、リージョン(テキストの選択)で詳しく説明します。さらにいろいろなEmacs用語の定義が知りたいときは、CategoryGlossaryを参照してください。

Emacs用語の使用例

次の文例の意味がわかるなら、もうEmacs語を理解してるってこと。ここに書かれてるすべての操作について理解したら、どういう風にEmacsを使えばよいかがだいたいわかるはず。 Good luck :D !

  1. バッファfoobarを保存する時に使うキーシーケンス‘C-x C-s’で、コマンド‘save-buffer’に割り当てられている。
  2. ‘split-window-horizontally’ というコマンドを実行したいのだが、“キーバインディング"も完全な名前も忘れてしまったので、キーシーケンスの‘M-x’ (Alt キーを押しながらx を入力)を使い、その後、 s-p-l-i-t---w-i-n とタイプした。入力内容は"ミニバッファ"に表示された: split-win
  3. TABを入力するとミニバッファの入力がsplit-windowに展開された。これは、“split-window"で始まる名前のコマンドが存在することを意味する
  4. もう一度TABを入力するとミニバッファは”[Complete, but not unique]“と返答してきた。これで、“split-window"は完全な名前だけど、他にも"split-window"で始まる名前のコマンドがあることがわかる。
  5. さらにもう一度TABと入力する。こうすると、同じのフレームに新しいウィンドウが開いて、*Completions*バッファが表れ、そこに"split-window"で始まる名前のいくつかのコマンドが表示される。MB2を使ってコマンド名split-window-horizontallyをクリックする。
  6. *Completions*バッファ(とそのウィンドウ)は姿を消し、操作中のフレームが二つのウィンドウに分割されて、両方にバッファfoobarが表示される。これはバッファのウィンドウfoobarsplit-window-horizontallyコマンドが実行された結果だ。
  7. 次に、左のウィンドウを‘split-window-vertically’を使って分割する。今回は、たまたまキーシーケンス‘C-x 2’というキーバインディングを覚えていたので、これを使った。この時点で、このフレームは3つのウィンドウを持ち、それぞれにfoobarが入った状態となった。それぞれのウィンドウのmode-lineに"foobar"という名前が表示されているのが確認できる。
  8. 左上のウィンドウをクリックすると、そこにカーソルが移動する(そしてフォーカスも)。そこで、キーシーケンス‘C-x C-f’を使って、totoファイルを開いた(このキーシーケンスは、‘find-file’コマンドに結びつけられている)。ウィンドウのモードライン部分が変わったので、そのバッファがtotoに変わったことが確認できた。僕はフレームでバッファtotoウィンドウサイズを変えるために、MB1を使ってモードラインをドラッグした。
  9. toto バッファ内では、テキストの一部分を MB1 を押しながらドラッグし、新たに リージョン を指定した。それから、キーシーケンス ‘C-w’ を使って、 そのリージョンのテキストを キル した。
  10. foobar 内で MB1 をクリックした。これによってカーソルがポインターの位置に移動した。 それから、toto バッファでキルしたテキストをfoobar バッファのポイントの位置にヤンクした。

練習問題: 上記の例を、(Emacs用語ではなく)一般的な用語を使って言い替えてください。

アボートする (キャンセルする)

‘C-g’ を使えば、実行途中のアクションを中止(アボート)することができます。ただし、アクションの種類によっては、‘C-g’ を何度か繰り返し入力する必要があります (‘C-g’ を使っても完全にキャンセルされない場合は、`C-]’ または ‘top-level’ コマンドを使ってください。 これでなんとかなるはずです)。

例 1: ‘M-x some-command’ というコマンドを入力しました。RET を使ってコマンドを確定する前に ‘C-g’ を入力すると、先ほど開始したコマンド入力がキャンセルされます。

例 2: ‘M-x some-command’ を入力したところ、実行が開始されました。しかし、どうやら実行には時間がかかるようであり、また、どのような内容が実行されるのかについて自信がありません。このような場合も、‘C-g’ を使うと、コマンドの実行をキャンセルできます。

ヘルプ

すべてのEmacs helpを利用するには、‘C-h C-h’ (‘help-for-help’) を使ってみてください。‘Help’ メニューを利用することもできます。 EmacsManual を利用するには、 ‘Help’ > ‘Info’ > ‘Emacs’ を選択します。

次に、便利なヘルプ コマンドを紹介しておきます (ヘルプコマンドについては、‘C-h C-h’ 経由で調べることもできます):

コマンドとキーシーケンス

Emacs にはいくつもの コマンド があり、コマンドの中には キーシーケンス に関連づけられているものがあります。たとえば、「カーソルを1文字分前に進める」という意味の‘forward-char’ コマンドは、‘C-f’ というキーシーケンスに結びつけられています。

キーシーケンスは、‘C-x C-c’ のように複数の「キーの組合せ」で構成されていることがあります。また、キーシーケンスの構成要素は、キーボードのキーに限られているわけではありません。マウス操作やメニュー項目の選択なども、キーシーケンスとみなされます。

‘indent-code-rigidly’ コマンドは、(デフォルトでは)どのキーシーケンスにも対応づけられていません。 ‘grep’ コマンドは、(デフォルトでは)どのキーボードによるキーシーケンスにも対応づけられていませんが、メニューバーによるキーシーケンス 「‘Tools’ > ‘Search Files’」 (= [menu-bar tools grep])に対応づけられています。.

対応するキーシーケンスが存在するか否かにかかわらず、すべてのコマンドは ‘M-x’ 経由で実行することができます。たとえば、‘M-x grep’ によって ‘grep’ コマンドが実行されます。

‘M-x’ を入力した後、‘M-p’ (previous) を入力すると、以前実行したコマンドを呼び出されるので、これを編集したり再実行することができます。コマンドの履歴を先に進むには、‘M-n’ (next) を使います。より高度なコマンド編集方法については、‘C-x ESC ESC’ を参照してください。

ユーザーは、好きなコマンドを好きなキーシーケンスに割り当てることができます。先ほど、「‘indent-code-rigidly’ コマンドは、(デフォルトでは)どのキーシーケンスにも結びつけられていません」と述べたのはそのためです。 また、すべてのキー割り当ては、ユーザーが自由に解除できます。

入力

コマンドの動作によっては、コマンドの入力欄であるミニバッファにユーザーがテキストを入力しなければいけないことがあります。このとき、最初から入力欄にデフォルトのテキスト(たいていの場合は、カーソル位置の前後にあるテキスト)が与えられている場合があります。このテキストは自由に変更して利用することもできますが、‘M-C-DEL’ または ‘C-x DEL’ を使うと、このテキストを即座に消去することができます。‘RET’ で確定したのち、好きなテキストを入力してください。

たとえば、‘grep’ (メニューから ‘Tools’ Files’ を選択、または、‘M-x grep’ を実行)を実行すると、バッファに検索するテキストと検索対象とするファイル名のパターンを入力するよう求められます。デフォルトでは、このコマンドは、カーソルの前後にあるテキストを検索対象テキストとして表示します。このテキストがあなたの検索したい文字列ではなかった場合は、‘M-C-DEL’ (または、‘DEL’を何度も) 押し続けて、ミニバッファからテキストを消去した後、検索するテキスト、検索対象ファイル名のパターンを入力して、‘RET’ を押してください。

バッファモード

すべてのバッファには、固有の編集モード (バッファ固有のコマンドとキーバインディング)が存在します。 バッファの現在のモードに関する情報は、‘Help’メニューの‘Describe Mode’(または‘C-h m’)を使って調べることができます。

注意: Lisp:menu-bar+.el ライブラリ( DrewAdams 作)を使っている場合は、バッファ固有メニューは全体メニューと分離した状態で表示されます。具体的には、バッファ固有メニューはセパレータ”||“の左に、その他のすべてのモードに共通するメニュー(‘Buffers’‘Files’‘Tools’‘Edit’‘Search’‘Frames’‘Help’)はセパレータ”||“の右に配置されます。そして、セパレータをクリックすると、”← Current mode menus to left. || Common menus to right →”(訳注:「現在のモードに対するメニューは左||共通メニューは右」)と表示されます。

DrewsEmacsMenuBarBar

(Lisp:doremi-frm.el または Lisp:doremi-cmd.el をロードしている場合は、FramesメニューとHelpメニューの間に、Do Re Miメニューが表示されます。

アンドゥ(操作の取り消し)

すべての操作は‘Edit’メニューの‘Undo’項目(もしくは、‘C-/’または`C-_’)で、取り消すことができます。 この操作の取り消しは、何回分でも繰り返すことが可能です。

なにかしら他の操作を実行すると、アンドゥが中止されます。

アンドゥの中止後、再度アンドゥ操作を実行すると、リドゥ(やり直し)操作となります(直前のアンドゥ動作自体をアンドゥすることになるからです)。

前回ファイルをセーブしてから行った変更をすべて取り消した場合は、モードラインの左下部に‘**’ではなく‘--’と表示されるため、ここを見ればセーブされた状態までアンドゥを実行したことがわかります。‘M-x revert-buffer’を実行すれば、簡単に、前回セーブした後の変更をすべて取り消して、バッファの中身をファイルがセーブされたときの状態に戻すことができます。

マウス

Emacsでは、通常どおりマウスを使うことができます。MB1(マウスの左ボタン)を押してドラッグすれば範囲の選択、MB2(マウスの中央ボタン)を押せば貼り付け(ペースト)が可能です。 MB3(マウスの右ボタン)をクリックすると、選択範囲の拡張(2回クリックすると、さらにその選択範囲をキルする)または、現在のバッファに応じたコンテキストメニューことができますのポップアップ表示が実行できます。 マウスの動作についてさらに詳しく知りたい場合は、EmacsManual を参照してください。 特に、マウスのドラッグ操作中にMetaキーを押し続けると、矩形選択が可能です。たとえば、‘M-’キーを押しつつ、マウスをドラッグして矩形選択を行い、 次に、MB2ボタンをクリックすれば選択した範囲の文書をペーストできます。 2つにわかれた選択範囲をペーストしたい場合などに、この方法はとっても便利です。

検索と置換

‘Search’メニューを使えば、検索と置換を実行できます。しかし、通常は、インクリメンタル検索を使ったほうが便利(手軽かつ強力)です。 インクリメンタル検索には‘C-s’‘C-r’を使います。 そのほかにも、正規表現(ワイルドカード)、複数ファイルの検索(‘M-x grep’)、置換(‘Q’ in Dired)などの検索オプションが利用できます。

リージョン(領域:選択範囲)

リージョンの一方の端となるポイントの位置は、テキストカーソル(マウスポインタではないことに注意)の位置となります。 もう一方の端は、マーク位置といいます。マークは画面に表示されませんが、ポインタ位置はカーソルを見ればわかります。

ポイントを設定するには、MB1をクリックするか、矢印キーを使います。 マークを設定するには、次の3つの方法があります。

マウスを使わずリージョンを設定する場合は、リージョンが視覚的に確認できないことがあります。このようなときは、ポイントとマークを入れ換える‘C-x C-x’を使うとよいでしょう。

直前のコマンドを繰り返す(または少しだけ変更して再実行する): `C-x ESC ESC'

さっき実行したコマンドをもう1度簡単に実行するには、どうすればよいでしょうか? ちょっとだけ変更して、もう1度実行したいのですが、どうすればよいでしょうか??

‘C-x ESC ESC’ を使ってください(Ctl-Xを押してから、エスケーブ、エスケーブと2回押す)。 これで、ミニバッファに最後に実行したコマンドのEmacs Lisp(またはキーシーケンス)が入ります。前回とまったく同じコマンドを実行したいときは、‘Enter’‘Return’)キーを押すだけでOKです。

実行例:

        Redo: (describe-function (quote undo))
        Redo: (describe-function (quote forward-sexp))

この例だとそれほど便利な機能に見えませんが、複数の異なるウィンドウ(異なるバッファ)で、“bush"のところを"kerry"に置換するために、引数まで同じ‘query-replace’ コマンドを何度か実行したい、というような場合を考えてみてください。まず、最初に1回実行します。それから、 別のウィンドウをクリックして、再実行のために‘C-x ESC ESC’と入力します。

        Redo: (query-replace "bush" "kerry" nil (if (and transient-mark-mode mark-active) (region-beginning)) (if (and transient-mark-mode mark-active) (region-end)))

The “(query-replace "bush" "kerry"“部分の意味はすぐにわかるでしょうが、そのほかの部分は厳しいかも知れませんね。心配無用です。‘Enter’キーを打つだけでよいのですから。

だけど、どうしても引数の意味が知りたいときは、どうやって調べたらよいでしょうか。 正解はこちら: ‘describe-function query-replace’‘C-h f’ query-replace)です。ヘルプを見れば、‘query-replace’は実際には5つの引数を取ることがわかります。

それぞれの引数については、ヘルプを読めばわかります。大まかに説明すると、最後の2つの引数は、”query-replace“検索に対する制限を指定するものです。アクティブなリージョンがある場合(つまり、テキストが選択された状態)に、検索対象がリージョン内に限られるようにしています。アクティブなリージョンがない場合は、バッファ全体のうち、カーソルより下にある部分がすべて検索対象となります。

[この項目の裏テーマがおわかりでしょうか? Emacs Lisp が少し理解できると、Emacs をより効率的に利用できるようになるということです。 学べば学ぶほど、効率的な作業が可能になるでしょう。]

さて、先ほどの例のように別のウィンドウをクリックして別のバッファにカーソルを移動し、query-replaceコマンド以外を再実行するだけではなく、そのほかの操作も実行しなければならないときはどうすればよいでしょうか。直前のコマンドは、実行したいコマンド”query-replace“ではなくなっているかも知れません。たとえば “switch-to-buffer another-buffer“コマンドかもしれません(switch-to-bufferコマンドは、‘C-x b’に割り当てられています)。

直前のコマンドではなく、それ以前に実行したコマンドを再実行するにはどうすればよいでしょうか?

まず ‘C-x ESC ESC’を入力した後、‘M-p’ を入力すると、最後に実行したコマンドの1個前に実行したコマンドを取得できます。さらに、その前に実行したコマンドならば‘M-p M-p’です。以下、同様にたどっていくことができます。‘M-p’ は以前に実行したコマンドを後方向にたどっていきますが、これに対し、‘M-n’ を入力すると、以前に実行したコマンドを前方向にたどっていきます。

キーボードマクロ −− 何度も何度も同じことを実行するには

覚えておくととっても便利なものとして、キーシーケンスを"キーボードマクロ"として記録し、(たいていの場合は、何度も)そのマクロを繰り返し再生する方法が挙げられます。 具体的な方法は、キーボードマクロ / KeyboardMacros を参照してください。

注意: Emacsでできることのうち、大抵のことは"キーボードマクロ"として記録できますが、キーボードへの入力だけを単体で記録することはできません。ここでいうキーボードへの入力には、マウス操作、メニュー選択も含まれます。

キーボードマクロの有効な活用法としては、Emacs Lisp コードを保存して、通常のコマンドとして使用するために変更するというものもあります。

学習のヒント

練習問題

Emacsチュートリアルを実行してみましょう(既述の EmacsTutorialの項目を参照)。

たいていの人は、コマンド一覧を眺めて記憶しようとがんばるよりも、実際に実行してみたほうがよく覚えられるものです。 実際に、大きなテキストファイルを手に入れて、いろいろと操作してみてください。データを壊してしまうのが心配なら、バックアップコピーをとっておけば安心です。 – でも、心配無用。Emacs を使っていれば、めったに作業内容が失われることはありません。 undo コマンド(‘C-/’ または `C-_’)が用意されています(練習用ファイルの入手先としては、「Project Gutenberg」([[1]])などがあります。【訳注:日本語ならば、「青空文庫」([[2]])などがよいのではないでしょうか】)

Emacs に訊いてみよう

Emacs についてわからないことがあれば、Emacs 自身に訊いてみましょう。メニュー項目、ドキュメント内の用語、コマンド名……など。Emacs でそれらを調べるためのヘルプコマンドとしては次のようなものがあります。

  1. キー シーケンスを指定して、意味を調べる: ‘C-h k’‘describe-key’コマンド)
  2. ヘルプコマンド‘C-h f’, ‘C-h v’, ‘C-h w’, ‘C-h m’, ‘C-h b’などの意味が知りたいときも、‘C-h k’を入力してから調べたいキーシーケンスをタイプすればOK。‘C-h’ で始まるキーシーケンスは、すべてEmacs ヘルプを表示するものです
  3. ‘C-h f’‘C-h v’などを使って、Emacs使いになるために必要なすべてを調べることができます。

そのほかにも、少々遠回りな方法になりますが、すべてのEmacs ヘルプ は、‘C-h C-h’‘help-for-help’コマンド)を通して利用できます。

ちょっと Emacs を触った経験がある方なら、Emacs ライブラリのロード方法をご存じでしょう(LoadingLispFiles と CategoryDotEmacs を参照)。そんな方には Lisp:help+.el( DrewAdams 作)に含まれる‘help-on-click/key’ コマンド(‘C-h RET’に対応)をお薦めします。 このコマンドでバッファ内の名前、Emacsウィンドウの 一部をクリックしたり、キーシーケンスを入力したり、メニュー項目を選択すると、そのオブジェクトに関する詳細な情報が表示されます。詳しくは HelpPlus を参照してください。

Drewの Lisp:menu-bar+.el ライブラリを使うと、現在使用できるすべてのEmacsヘルプが、メニューバーからもっと簡単に参照できるようになります。詳しくは、HelpMenuBarPlus と MenuBar を参照してください。

Emacs Lisp入門

そうなんです。Emacs Lisp は、初心者 にも十分役立ちます。実際、ほんの少し Emacs Lisp を学ぶだけで、ずっと Emacs を効率的に使いこなせるようになるのです。その理由は次のとおり。

では、Emacs Lisp について学ぶにはどうすればよいでしょうか。

はじめての人のためのリファレンス

Noorulが、Emacsで本当によく使われる関数とキーの対応の一覧表を作ってくれています。次のリンクを参照してください(http://noorul.mybesthost.com/Emacs.php#2)。

それから、Windows ユーザーは一度 ScrollLock を覗いておいた方がよいかもしれません。

Emacs で文書を書くために

Randall Wood が、Emacsで(コードではなく)文書を書くための簡単なガイドを書いてくれました。この項目では、Emacsをワープロとして使うための機能について、だいたい網羅されています。きっと初心者にとってもこの項目が役に立つことでしょう(Randall Wood著: http://www.therandymon.com/papers/emacs-for-writers.pdf

書籍案内

モニタをじっと見るのは辛いので、紙の書籍が欲しいという人もいることでしょう。 EmacsLispIntro、EmacsLispReference、EmacsManual は GnuPress が出版しています。 これらの書籍はよくできていますし、購入によって FreeSoftwareFoundation を応援することができます。

GnuFreeDocumentationLicense は “Free"ではないと考える人もいます。詳しくは、EmacsManualLicense でのディスカッションを参照してください。 当Wikiでは、2003-11-16から始まる議論にともなって GnuFreeDocumentationLicense から現在のライセンスに移行されました(このページのフッターを見てみてください)。

O'Reilly社の『Learning GNU Emacs 2nd Edition』(邦訳『入門 GNU Emacs 第2版』)のレビュー

訳注:本項目は個人的なレビューとして書かれていますが、レビューの著者はよくわかりませんでした。


わたしは、はじめてEmacsを触りはじめたとき、Learning GNU Emacs(Cameron, Rosenblatt & RaymondDebra Cameron, Bill Rosenblatt, Eric Raymond共著 日本版は、福崎俊博訳)を入手した(出版社は、技術者なら大半の人が聞いたことがあるだろう O’reilly press(日本版はオライリー・ジャパン))。 まず、構成がすばらしい。この本に書かれたことで、オンラインドキュメントに載っていないことは何もないのだが、それでもこの本は役に立つ。

最初の5章分(150ページ分)は、Emacsを使う上での基本が詳細に述べられている。 その後は、多種多様な人々に向けた、いろいろな話題に特化した章がいくつも続く。 ちなみに、著者による前書きには、さまざまな仕事の人に向けて、どの部分が役に立つかというガイドが含まれている。 扱われている内容は次のとおり。

個人的に、この本は気に入っている。本書には、スクリーンショットやダイアグラムが数多く掲載されているので、コンピュータの前にいなくても、何について書かれているのかが理解できる。 さらに、本書は技術者以外の人も対象にしている。 1つだけ気に入らないのは、こちらのマシン上のMetaキーがESC[0]であるものと想定していることだ。これは見逃すことのできない問題だ。ほとんどのコンピュータ書籍には、自分とは合わない部分があるものだが。しかしながら、本書は貴重なリファレンスに違いない – もちろん、紙による書籍という意味で

本書を購入しようかなと思った人は、お好きな本屋にいって自分に役立ちそうかどうかを確認してほしい。ネット上の古本屋も利用できるだろう。最安値ならば送料込で7ドル程度だ。幸運を祈る。

[0] Emacsでは、多くの操作をキーバインディングによって実行する。“M-x"はMetaキーと文字xをいっしょに押すという意味だ。同様に、C-x、A-xは、それぞれ[Ctrl]キー+[x]キー、 [Alt]キー+[x]キーという意味だ。 Emacsにおいて、どのキーをMetaキーとするかはコンパイル時に決定される。 それによっては、MetaキーがAltキーの場合(これが望ましい)もあるし、ESCキーの場合もあるし、Windowsキーやまったく違うその他のキーの場合だってある。 MetaキーをAltに変えるのは可能であり、もしMetaキーとしてESCキーを使っているのなら、できるだけはやく変更するべきだ。


CategoryHelp CategoryDotEmacs