GNU Emacs Manual(Japanese Translation)





Seventeenth Edition, Updated for Emacs Version 24.5.





Richard Stallman et al.

This is the GNU Emacs Manual, updated for Emacs version 24.5.

Copyright © 2015–2016 Ayanokoji Takesi <ayanokoji.takesi@gmail.com>
Copyright © 1985–1987, 1993–2015 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “The GNU Manifesto,” “Distribution” and “GNU GENERAL PUBLIC LICENSE,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”

(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”



Published by the Free Software Foundation
51 Franklin Street, Fifth Floor
Boston, MA 02110-1301 USA
ISBN 978-0-9831592-4-7



Cover art by Etienne Suvasa; cover design by Matt Lee.


[ < ] [ > ]   [Contents] [Index] [ ? ]

The Emacs Editor

Emacsは、拡張可能で、カスタマイズ可能な、セルフドキュメント方式のリアルタイム画面エディターです。このinfoファイルでは、Emacsでの編集方法や Emacsのカスタマイズ方法について説明します。GNU Emacs 24.5に対応します。

Emacsの拡張に関しては、Emacs Lisp in The Emacs Lisp Reference Manualを参照してください。

This is the GNU Emacs Manual, updated for Emacs version 24.5.

Copyright © 2015–2016 Ayanokoji Takesi <ayanokoji.takesi@gmail.com>
Copyright © 1985–1987, 1993–2015 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “The GNU Manifesto,” “Distribution” and “GNU GENERAL PUBLIC LICENSE,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”

(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ディストリビューション

GNU Emacsはfree software(フリーソフトウェアー、自由なソフトウェアー)です。これはすべての人が自由に使用でき、特定の条件の元に自由に再配布できることを意味します。GNU Emacsはパブリックドメイン(public domain: 特許権の消滅状態)ではありません。copyright(版権)されており、配布については制限があります。しかし、それらの制限は良き共同的な市民(good cooperating citizen)が行ないたいと欲するであろう、すべてのことを許すようデザインされています。なにが許されていないか、それはあなたから取得するかもしれないGNU Emacsの任意のバージョンの更なる共有を妨げる試みです。これの正確な条件はEmacsのGNU General Public Licenseで見ることができ、このマニュアルにも記載されています1GNU GENERAL PUBLIC LICENSEを参照してください。

GNU Emacsのコピーを入手する1つの方法は、それを所有する他の誰かから入手する方法です。これを行なうための許可を求めたり、他の誰かに告げる必要はありません。ただコピーするだけです。インターネットへアクセスできるなら、匿名FTPからGNU NEmacsの最新のディストリビューションバージョンを入手できます。わたしたちのウェブサイトについての詳細は、http://www.gnu.org/software/emacsを参照してください。

コンピューターを購入したときに、GNU Emacsを入手するかもしれません。コンピューター業者は、他のすべての人に適用されるのと同じ条件で、コピーを自由に配布できます。これらの条件は、コンピューター業者がソースにたいして行なった変更を含む完全なソースをあなたに与えることと、General Public Licenseの通常の条件の下に、入手したGNU Emacsをあなたが再配布できることを要求します。言い換えると、そのプログラムはあなたが入手したときはフリーでなければならず、業者にとっては単にフリーという訳ではありません。

GNU Emacsが有用だと思ったら、わたしたちの作業をサポートするために、どうかFree Software Foundationに寄付を送ってください。合衆国ではFree Software Foundationへの寄付は、税金が控除されます。職場でGNU Emacsを使用している場合は、どうかその企業に寄付を行なうよう提案してください。寄付をするには、https://my.fsf.org/donate/を参照してください。あなたが手助けできる他の方法については、http://www.gnu.org/help/help.htmlを参照してください。

わたしたちは、このマニュアルと、Robert J. ChassellによるAn Introduction to Programming in Emacs Lispのハードコピーも販売しています。あなたは、わたしたちのオンラインショップhttp://shop.fsf.org/を訪れることができます。販売による収益は、Free Software Foundationの目的 — すなわち新しいソフトウェアーの開発、GNU Emacsを含む既存のプログラムの改良をサポートします。

Free Software Foundationに連絡する必要がある場合は、http://www.fsf.org/about/contact/を参照するか、下記に手紙を送ってください

Free Software Foundation
51 Franklin Street, Fifth Floor
Boston, MA 02110-1301
USA

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

イントロダクション

あなたはEmacsのマニュアル読んでいるところです。Emacsは、セルフドキュメント方式で、カスタマイズ可能で、拡張可能エディターであり、GNUの先進性を具現化したものです( GNU (GNU’s Not Unix) の‘G’は発音します)。

Emacsは先進的(advanced)であるというのは、単純な挿入と削除だけでなく、プロセスの制御、プログラムのインデントの自動化、複数ファイルの同時表示、整形済みテキストの編集、文字、単語、行、文、段落、ページを扱うのと同様に、異なるプログラミム言語の式やコメントを扱う機能なども提供するからです。

セルフドキュメント方式(Self-documenting)とは、いつでもヘルプコマンドとして知られる、特別なコマンドを使うことができることです。これはどのようなオプションがあるのか、コマンドが何をするのかを見つけたり、与えられたトピックと関連するすべてのコマンドを見つけることができるコマンドです。ヘルプを参照してください。

カスタマイズ可能(Customizable)とは、シンプルな方法でEmacsコマンドの動作を簡単に変更できるということです。たとえば、‘<**’で始まり‘**>’で終わるようなコメントのプログラム言語を使っている場合は、Emacsのコメント操作コマンドに、これらの文字列を使うように指示できます(コメントの操作を参照してください)。別の例としては、カーソル動作(上下左右)を再編成して使いやすくカスタマイズできます。カスタマイズを参照してください。

拡張可能(Extensible)とは、単純なカスタマイズではなく、まったく新しいコマンドを作成できるということです。新しいコマンドは、Emacs自身のLisp処理系で動作する、Lisp言語でプログラムを記述されます。既存のコマンドは、編集を行なっている最中でさえ、Emacsを再起動することなく再定義できます。Emacsのほとんどの編集コマンドはLispで記述されています。Lispで記述することも可能ですが、効率のためにCで記述されているものもあります。拡張機能の記述はプログラミングですが、プログラマーでない人も後でそれを使うことができます。もしあなたがEmacs Lispを学びたければ、Preface in An Introduction to Programming in Emacs Lispを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1 画面の構成

Xウィンドウシステムを使うGNU/Linuxのようなグラフィカルなディスプレーの場合、Emacsは“グラフィカルなウィンドウ”に表示されます。テキスト端末の場合、Emacsは端末スクリーン全体を表示領域として使います。Emacsが占有する画面スクリーンや、グラフィカルなウィンドウを指して、フレーム(frame)という用語を使用します。Emacsの振る舞いは、どちらのフレームでも同じです。通常は1個のフレームだけで始まりますが、必要ならば新たにフレームを作れます(フレームとグラフィカルなディスプレーを参照してください)。

それぞれのフレームにはいくつかの領域が含まれています。いちばん上のフレームはメニューバー(menu bar)で、メニューにある一連のコマンドにアクセスできます。グラフィカルなディスプレーでは、メニューバーのすぐ下にツールバー(tool bar)があり、アイコンをクリックすることにより編集コマンドを実行できます。いちばん下のフレームはエコーエリア(echo area)で、メッセージが表示されたり、Emacsが入力を求める際に使用されます。

(もしあれば)ツールバーの下とエコーエリアの間の、フレームの主要な領域の部分を、ウィンドウ(the window)といいます。このマニュアルでは“ウィンドウ”という言葉を、上記のような場合に使います。グラフィカルなディスプレーのシステムでは、“ウィンドウ”という言葉を違う意味で用いますが、上述したとおり、そのような“グラフィカルなウィンドウ”のことは、“フレーム”と呼ぶことにします。

Emacsのウィンドウには、バッファー(buffer) — 編集中のテキスト — が表示されます。グラフィカルなディスプレーでは、ウィンドウの片側にスクロールバー(scroll bar)あり、これを使ってバッファー内をスクロールできます。ウィンドウのいちばん下の行は、モードライン(mode line)です。これには保存されてない変更や、使用されている編集モード、現在のライン番号など、バッファーについての様々な情報が表示されます。

Emacsを起動すると、通常フレームには1つのウィンドウが表示されます。しかしこのウィンドウを水平方向、または垂直方向に分割して複数のウィンドウを作成し、それぞれ異なるバッファーを表示することもできます(複数ウィンドウを参照してください)。

どんな時でも、1つのウィンドウが選択されたウィンドウ(selected window)となります。グラフィカルなディスプレーでは、選択されたウィンドウには目立つカーソル(通常は塗りつぶされて点滅している)が表示され、他のウィンドウには目立たないカーソル(通常はぬりつぶされていない四角)が表示されます。テキスト端末では、選択されたウィンドウのカーソルだけが表示されます。選択されたウィンドウ上に表示されているバッファーを、カレントバッファー(current buffer)と呼び、それが編集が行われているバッファーとなります。多くのEmacsコマンドはカレントバッファーに暗黙に適用され、選択されてないウィンドウに表示されているテキストは参照用に使用します。もしグラフィカルなディスプレーで複数のフレームを使っている場合、特定のフレームを選択すると、そのフレームのウィンドウが選択されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1 ポイント

カーソルは、選択されたウィンドウで多くの編集コマンドが作用する場所を示し、その場所をポイント(point)2と呼びます。多くのEmacsコマンドはポイントをテキスト中で移動し、テキスト中のさまざまな箇所で編集できるようにします。マウスのボタン1(通常は左ボタン)をクリックしても、ポイントを移動できます。

デフォルトでは、選択されたウィンドウ上にある、塗りつぶされたボックスのカーソルは文字のに表示されますが、ポイントは2つの文字のにあると考える必要があります。つまりポイントは、カーソルが重なっている文字のにあります。たとえば、‘frob’というテキストで、‘b’にカーソルがある場合、ポイントは‘o’と‘b’の間にあります。その位置に‘!’という文字を挿入すると、‘fro!b’という結果になり、ポイントは‘!’と‘b’の間にあります。つまりカーソルは‘b’の上にあり、実行前と同じです。

Emacsでいくつかのファイルを編集して、各ファイルがそれぞれ専用のバッファーにある場合、各バッファには独自のポイント位置があります。バッファーが表示されていなくても、後で表示されるときに備えて、ポイント位置を記録しています。1つのフレームに複数のウィンドウがある場合、各ウィンドウには独自のポイント位置があります。

Emacsがカーソルをどのように表示するか制御する方法については、カーソルの表示を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2 エコーエリア

フレームの1番下の行は、エコーエリア(echo area)です。ここは、いろいろな目的向けの短いテキスト表示に使われます。

エコーエリアという名前は、あなたが打った文字がエコーされることが由来で、これは複数の文字からなるコマンドが表示されることを意味します。1文字のコマンドをエコーすることはありません。複数の文字からなるコマンド(キーを参照してください)の途中で、入力中に1秒以上間を置くとエコーされます。Emacsはそれまでに入力されたコマンドの文字を表示し、ユーザーに残りの文字の入力を促します。いったんエコーが始まると、コマンドの残りは、打つと同時にただちにエコーされます。これは、タイプに自信のあるユーザーには速い応答を提供する一方で、自信のないユーザーには最大限のフィードバックを与えるための機能です。

エコーエリアは、コマンドを実行できなかったときに、エラーメッセージ(error message)を表示するためにも使用されます。エラーメッセージと共に、ビープ音が鳴ったり、画面が点滅する場合もあります。

エコーエリアに有用なメッセージを表示するコマンドもあります。これらの有用なメッセージは、エラーメッセージによく似ていますが、ビープ音を伴わず点滅もしません。たとえば、コマンドC-x =(Ctrlを押したままxをタイプし、Ctrlを離してから=をタイプします)は、テキスト中のポイントの文字位置と、ウィンドウの現在の列位置を示すメッセージを表示します。処理に時間のかかるコマンドでは、実行中に‘...’(どの程度進行したかをパーセント表示で示す場合もあります)で終わるメッセージをエコーエリアに表示し、完了時には‘done’を最後に付け加えることがよくあります。

エコーエリアに表示される有益なメッセージは、*Messages*と呼ばれる特別なバッファーに保存されます(まだバッファーについては説明していませんが、詳細は複数バッファーの使用を参照してください)。画面上に短時間しか表示されないメッセージを見逃してしまった場合には、*Messages*バッファーに切り替えて、もう一度そのメッセージを見ることができます。*Messages*のサイズは、ある行数に制限されています。変数message-log-maxは、その行数を指定します(まだ変数については説明していませんが、詳細は変数を参照してください)。いったんバッファーがこの行数を超えると、最後に1行加わるごとに先頭の1行を削除します。

Emacsがエコーエリアをどのように使用するか制御するオプションについては、ディスプレーのカスタマイズを参照してください。

エコーエリアはミニバッファー(minibuffer)の表示にも使われます。これは、編集しようとするファイル名のような、コマンドへの引数を読むのに使われるウィンドウです。ミニバッファーが使用されているとき、エコーエリアにはプロンプト文字列(prompt string)で始まるテキストが表示され、エコーエリアが一時的に選択されたウィンドウとなり、カーソルもその行に表示されます。C-gを打つと、いつでもミニバッファーから抜けられます。ミニバッファーを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3 モードライン

ウィンドウの最後の行はモードライン(mode line)で、そのウィンドウで何が進行しているか表示します。ウィンドウが1つしかない場合、モードラインはエコーエリアのすぐ上に表示されます。フレームでは最後から2番目の行になります。グラフィカルなディスプレーでは、モードラインは立体的に描画されます。通常、Emacsは目立つように選択されたウィンドウのモードラインを、選択されていないウィンドウと異なるカラーで描画します。

モードラインに表示されるテキストは以下の書式です:

 cs:ch-fr  buf      pos line   (major minor)

テキスト端末では、上記テキストの後ろからウィンドウの右端まで一連のダッシュ表示されます。これらのダッシュはグラフィカルなディスプレーでは省略されます。

csとその後ろのコロンは、カレントバッファーのキャラクターセットと改行の規則を説明しています。通常Emacsはこれらの設定を自動的に処理しますが、このメッセージが便利なときもあります。

csはバッファーのキャラクターセットを説明します(コーディングシステムを参照してください)。もしこれがダッシュ(‘-’)の場合、特定のキャラクターセットの処理が行われていないことを意味します(例外として、以降で説明する行末規則があります)。‘=’の場合は、変換が行われていないことを意味し、通常はテキストに非テキストデータが含まれているときに使用されます。他の文字はさまざまなコーディングシステム(coding systems) — たとえば‘1’はISO Latin-1を表します。

テキスト端末ではcsの前に追加で2つの文字が表示され、それによりキーボード入力と端末出力のコーディングシステムが示されます。さらに何らかの入力メソッドを使用している場合は、csの前に入力メソッドを識別する文字列が表示されます(インプットメソッドを参照してください)。

csの後ろの文字は、通常コロンです。もし違う文字が表示されている場合、それはファイルのエンコーディングに特別な行末規則が使われていることを意味します。通常ファイル内のテキストの各行は改行文字(newline characters)で区切られていますが、他の2つの規則が使われる場合もあります。MS-DOSのファイルを編集する場合には“キャリッジリターン(carriage-return)”と“ラインフィード(linefeed)”が使われ、コロンではなくバックスラッシュ(‘\’)または‘(DOS)’(オペレーティングシステムに依存する)が表示されます。古いマッキントッシュシステムのファイルでは、改行文字の代わりに“キャリッジリターン(carriage-return)”が使われ、そのような場合コロンではなくスラッシュ(‘/’)または‘(Mac)’が表示されます。いくつかのシステムでは行の区切りとして改行文字を使う場合、コロンではなく‘(Unix)’と表示されます。

モードラインの次の要素はchで示される文字列です。2つのダッシュ(‘--’)が表示されている場合、ウィンドウに表示されているバッファーとディスク上のファイルの内容が同じことを意味し、たとえばバッファーが“未変更(unmodified)”の場合です。バッファーが変更されている場合には2つの星印(‘**’)が表示されます。読み出し専用のバッファーの場合には、バッファーが編集されている場合には‘%*’になり、バッファーが編集されていない場合には‘%%’となります。

通常、chの後ろの文字はダッシュ(‘-’)です。しかしカレントバッファーのデフォルトディレクトリーがリモートマシン上にある場合、かわりに‘@’が表示されます(ファイルの名前を参照してください)。

frは選択されているフレームの名前です(フレームとグラフィカルなディスプレーを参照してください)。これはテキスト端末でだけ表示されます。フレーム名の初期値は‘F1’です。

bufは、ウィンドウに表示されているバッファーの名前です。通常は編集中のファイル名と同じです。複数バッファーの使用を参照してください。

posはウィンドウの上またはウィンドウの下に、まだテキストがあるかを知らせます。もしバッファーが小さくてウィンドウに全体が表示されている場合、posには‘All’が表示されます。そうではなくバッファーの一部が表示されているときには、バッファーの先頭が表示されている場合には‘Top’、バッファーの最後が表示されている場合には‘Bot’、‘nn%’と表示されている場合、nnはウィンドウの上部がバッファーのどこかをパーセント表示したものです。Size Indication(サイズ表示)モードでは、バッファー全体のサイズを表示できます。

lineは、‘L’のあとに現在ポイントがある行の番号が続いたものです(Column Number(列番号)モードをオンにすると、現在の列番号も表示できます。モードラインのオプションを参照してください)。

majorは、そのバッファのメジャーモード(major mode)の名前です。メジャーモードはバッファーを編集する際の主要なモードで、Textモード、Lispモード、Cモードなどがあります。メジャーモードを参照してください。メジャーモード名の後ろに追加の情報を表示するメジャーモードもあります。たとえばCompilation buffer(コンパイルバッファー)やShell buffer(Shellバッファー)などは、サブプロセスの状態を表示します。

minorは有効になっているマイナーモード(minor modes)の一覧で、上位のメジャーモードに追加の機能を提供するための編集モードです。マイナーモードを参照してください。

いくつかの機能は、それらが本当はマイナーモードではなくても、有効になっていればマイナーモードの一覧とともに表示されます。‘Narrow’は、表示中のバッファーが、そのテキストの一部のみを編集するように制限されていることを示します(ナローイングを参照してください)。‘Def’は、キーボードマクロを定義中であることを示します(キーボードマクロを参照してください)。

さらにEmacsがリカーシブエディットにあるときには、モードを囲んでいるカッコの周りに角カッコ(‘[…]’)が現れます。リカーシブエディット中も別のリカーシブエディットに入ると、角カッコは2重になります。リカーシブエディットは、特定のバッファにだけ関係するものではなく、Emacs全体に影響するので、角カッコはすべてのウィンドウのモード行に表示されるか、まったく表示されないのどちらかです。再帰編集レベルを参照してください。

モードラインの外観は、その内容の書式と同様、変更できます。モードラインのオプションを参照してください。さらにモードラインはマウスに反応します。モードラインの違う部分をクリックすることでさまざまなコマンドを実行できます。モードラインのマウスコマンドを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.4 メニューバー

各Emacsフレームには通常、最上部にメニューバー(menu bar)があり、よく使われる操作を実行するために使用できます。これはあなた自身で簡単に確かめられますから、ここではそれらを列挙する必要はないでしょう。

マウスをサポートするディスプレー上では、マウスを使ってメニューバーからコマンドを選ぶことができます。メニューアイテムの後にある右矢印は、そのアイテムにサブメニューがあることを示します。アイテムの最後に‘...’がある場合は、コマンドを実際に実行する前に、そのコマンドがキーボードから引数を読み取ることを意味します。

メニューのコマンドの中には、他のコマンドと同様、キーが割り当てられているものもあります。そのような場合、メニューのアイテムの後ろのカッコ内にキーバインディングが表示されます。メニューアイテムの完全なコマンド名や説明文を見るには、C-h kとタイプしてから、通常どおりにマウスでメニューバーを選択してください(キーのドキュメントを参照してください)。

マウスを使う代わりにF10(コマンドmenu-bar-openを実行します)を押せば、メニューバーの最初のアイテムを呼び出すことができます。その後は矢印キーでメニュー操作できます。選択されたメニューアイテムを起動するときはRET、メニュー操作をキャンセルするときはC-gESC ESC ESCを押します。

テキスト端末では、エコーエリアからメニューバーのメニューにアクセスすることもできます。これを行うには、変数tty-menu-open-use-tmmをカスタマイズして、非nil値にします。その後はF10をタイプするとメニューをドロップダウンせずに、コマンドtmm-menubarが実行されます(M-`は常にtmm-menubarを呼び出します)。tmm-menubarでは、キーボードでメニューアイテムを選択できます。暫定的な候補がエコーエリアに表示されるので、上矢印か下矢印でメニューの異なるアイテムを表示し、RETを押せばアイテムを選択できます。各メニューアイテムを文字か数字で指定することもできます(通常メニューアイテム名のイニシャル)。この文字または数字とアイテム名は‘==>’で区切られています。アイテムの文字または数字を押せばアイテムを選択することができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2 ユーザーインプットの種類

GNU Emacsは、主にキーボードを使うようにデザインされています。マウスを使ってメニューバーやツールバーの編集コマンドを実行することはできますが、キーボードを使う場合に比べて効率的ではありません。したがって、このマニュアルには主にキーボードで編集する方法を記します。

Emacsにたいするキーボード入力は、ASCIIを大きく拡張したバージョンが基本となっています。‘a’、‘B’、‘3’、‘=’や空白文字(SPC)と表記します)などの単純な文字は、それぞれに対応するキーをタイプして入力します。RETTABDELESCF1HomeLEFTなどの制御文字なども、この方法で入力できますし、非英語キーボードの特定の文字も同様です(国際化文字セットのサポートを参照してください)。

Emacsは修飾キー(modifier keys)を用いて入力された制御文字も認識します。よく使用される修飾キーは、Control(通常Ctrl)というラベル)と、META(通常Alt3というラベル)の2つです。たとえば、Control-aCtrlを押したままでaを押して入力しますが、これを短くC-aと記します。同様に、META-aまたは短くM-aは、Altを押したままaを押すことです。修飾キーは英数文字以外のキーにも適用できます。例: C-F1M-LEFT

ESCで始まる2文字キーシーケンスを使って、Meta文字を入力することもできます。したがってM-aESC aと入力することができます。C-M-aESC C-aと入力できます。METAと違い、ESCは切り離された文字です。次の文字を押すときESCを押しっぱなしにするのではなく、ESCを押して離してから次の文字を入力します。この機能はMETAキーをあてにできない、一部のテキスト端末で有用です。

グラフィカルなディスプレーでは、ウィンドウマネージャーがM-TABM-SPCC-M-dC-M-lなどのキーボード入力をブロックするかもしれません。このような問題がある場合、ウィンドウマネージャーがこれらのキーをブロックしないようにカスタマイズしたり、影響を受けるEmacsのコマンドを“リバインド(rebind)”したりできます(カスタマイズを参照してください)。

単純な文字や制御文字、同様にマウスのクリックなどの非キーボード入力は、総じて入力イベント(input events)と呼ばれます。Emacsが内部で入力イベントをどのように処理するかについての詳細は、Input Events in The Emacs Lisp Reference Manualを参照してください.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3 キー

Emacsコマンドには、ただ1つの入力イベントで呼び出されるものが、いくつかあります。たとえばC-fはバッファーを1文字前方に移動します。他のコマンドは、C-x C-fC-x 4 C-fのように、2つ以上の入力イベントにより呼び出されます。

キーシーケンス(key sequence)、短く書くとキー(key)は、1つの単位として考えることのできる、1つまたはそれ以上の一連の入力イベントの集まりのことです。もし、あるキーシーケンスがコマンドを呼び出すような場合、それをコンプリートキー(complete key)と呼ぶことにします。たとえばC-fC-x C-fC-x 4 C-fなどはコンプリートキーです。もし、あるキーシーケンスがコマンドを呼び出すほど十分長くないとき、それをプレフィクスキー(prefix key)と呼ぶことにします。たとえば前の例でいうと、C-xC-x 4はプレフィクスキーです。すべてのキーシーケンスは、コンプリートキーかプレフィクスキーのどちらかになります。

プレフィクスキーは、その後の入力イベントと組み合わせて、もっと長いキーシーケンスを作るためのものです。たとえばC-x はプレフィクスキーなので、C-xと入力しただけではコマンドは呼び出されません。かわりにEmacsは更なる入力を待ちます(もし1秒以上入力がない場合、入力を促すためにC-xがエコーされます。エコーエリアを参照してください)。C-xは、それに続く次の入力イベントと組み合わされる、2イベントのキーシーケンスで、それはプレフィクスキー(C-x 4)など)のときもあれば、コンプリートキー(C-x C-fなど)のときもあります。キーシーケンスの長さに制限はありませんが、実際に3つ、4つ以上の入力イベントの場合は、ほとんどありません。

コンプリートキーに入力イベントを付け加えることはできません。たとえば、C-fはコンプリートキーなので、2イベントのシーケンスC-f C-kは、1つではなく2つのキーシーケンスです。

デフォルトではEmacsのプレフィクスキーはC-cC-hC-xC-x RETC-x @C-x aC-x nC-x rC-x vC-x 4C-x 5C-x 6ESCM-gM-oです(F1F2は、C-hC-x 6のエイリアスです)。このリストは不変のものではありません。Emacsをカスタマイズすれば、新しいプレフィクスキーを作ることができます。標準のプレフィクスキーを無効にすることさえできますが、これはほとんどのユーザーにたいして推奨はできません。たとえばプレフィクス定義C-x 4を削除すると、C-x 4 C-fは無効なキーシーケンスになります。キーバインディングのカスタマイズを参照してください。

プレフィックスキーのあとにヘルプ文字(C-hF1)を押すと、そのプレフィックスで始まるコマンド一覧を表示できます。唯一の例外はESCです。ESC C-hC-M-hと同じで、これは何かまったく別のことを行うコマンドです。しかしF1ならば、ESCで始まるコマンドの一覧を表示できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4 キーとコマンド

このマニュアルは、特定のキーが何を行うかを説明するページばかりです。しかし、Emacsは直接キーに意味を与えてはいません。そのかわりに、Emacsは名前を付けたコマンド(commands)に意味を持たせ、キーとコマンドをバインディング(binding)することによって、キーに意味を与えています。

すべてのコマンドには、プログラマーが選んだ名前が付いています。名前は、たとえばnext-lineforward-wordのように、いくつかの英単語をダッシュで区切って作られます。内部的には、それぞれのコマンドはLispの関数(function)の特別な型で、コマンドに関連付けられたアクションは、関数を実行することによって機能します。What Is a Function in The Emacs Lisp Reference Manualを参照してください。

キーとコマンドの間のバインディングは、keymapsというテーブルに記憶されます。キーマップを参照してください。

C-nは下に1行動きます”という言い方は、通常の使用では関係ないが、Emacsをカスタマイズする上では重要になる点を隠蔽しています。1行下に移動するコマンドはnext-lineです。C-nnext-lineにバインドされているから効果があるのです。もしC-nをコマンドforward-wordにリバインドしたら、C-nで1語前方に動くことになります。

厳密に言えばキーはコマンドにバインドされているだけですが、このマニュアルではC-nをコマンドであるかのような言い回しをするときがあります。そのようなときは、処理を実行させるキーの後ろに、本当に処理を行うコマンドの名前をカッコ内に記します。たとえば、“コマンドC-n (next-line)は、ポイントを垂直下方に移動します”というときは、コマンドnext-lineがポイントを垂直下方に移動し、それは通常C-nにバインドされている、ということを意味します。

カスタマイズについて議論したので、変数(variables)にもふれておくべきでしょう。コマンドの説明で、“これを変更する場合、変数 mumble-fooをセットしてください”というときがあります。変数とは、値を保存するときに使用する名前のことです。このマニュアルに記載されている変数は、ほとんどがカスタマイズに関するものです。いくつかのコマンド、およびEmacsのある部分は、変数調べてその変数にセットされた値により、動作がかわります。カスタマイズに興味がでるまでは、、変数に関する情報は無視してかまいません。その後で変数(変数を参照してください)の基本を読めば、特定の変数についての情報に合点がいくでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5 Emacsの起動

Emacsを呼び出す通常の方法は、シェルコマンドemacsです。Xウィンドウシステムで実行される端末ウィンドウからは、emacs &によりEmacsをバックグラウンドで実行できます。この方法だとEmacsが端末ウィンドウに結びつけられないため、他のシェルコマンドを実行できます。

Emacsを起動すると、初期フレームは‘*GNU Emacs*’という名前の特別なバッファーを表示します。このスタートアップ画面(startup screen)には、Emacsについての情報と、初心者にとって便利な一般的タスクへのリンクが含まれています。たとえば‘Emacs Tutorial’というリンクはEmacsのチュートリアルを開きます。これはコマンドC-h t (help-with-tutorial)と同じです。リンクをアクティブにするには、ポイントをそこに動かしてRETをタイプするか、mouse-1(マウスの左ボタン)をクリックしてください。

コマンドライン引数を使うと、Emacsが起動直後に1つ以上のファイルをアクセスするよう指示できます。たとえばemacs foo.txtは、‘foo.txt’の内容を表示するバッファーとともにEmacsを起動します。これは他のエディターとの互換性により存在する機能で、シェルから短い編集セッションを始めるときのためにデザインされています。Emacsをこの方法で呼び出すと、初期フレームは2つのウィンドウに分割されます。1つは指定されたファイルで、もう1つはスタートアップ画面です。複数ウィンドウを参照してください。

一般的に、ファイルを編集するたびに新たにEmacsを起動するのは不必要で無駄です。Emacsを使うときの推奨方法は、Emacsを1度だけ起動する方法で、ログインしたら起動して、同じEmacsセッションですべての編集作業を行うのです。1つ以上のファイルをアクセスする方法は、ファイルの処理を参照してください。この方法でEmacsを使うと、Emacsのセッションはキルリング(kill ring)、レジスター(registers)、アンドゥヒストリー(undo history)、マークリング(mark ring)などの、値をもつコンテキストを蓄積するので、これを共有すれば編集がより快適になります。これらの機能については、このマニュアルの後で説明します。

Emacsを実行中に、他のプログラムからファイルを編集する場合、既存のEmacsセッションのファイルを開くために、emacsclientというヘルパープログラムを使うことができます。サーバーとしてのEmacsの使用を参照してください。

コマンドライン引数を使って、EmacsにLispファイルをロードして初期フレームに適用させたりできます。Emacs呼び出しにたいするコマンドライン引数を参照してください。

変数inhibit-startup-screenが非nilの場合、Emacsはスタートアップ画面を表示しません。この場合、コマンドラインに1つ以上のファイルが指定されていれば、Emacsは単にそれらのファイルを表示し、指定されていないときはLispの式を対話的に評価できる、*scratch*という名前のバッファーを表示します。Lisp Interactionバッファーを参照してください。変数inhibit-startup-screenのセットは、Emacsのカスタマイズ機能(Easy Customizationインターフェースを参照してください)を使うか、初期設定ファイル(Emacs初期化ファイルを参照してください)を編集して行うことができます。4

変数initial-buffer-choiceにファイルやディレクトリーの名前をセットすることにより、Emacsのスタートアップ時にファイルやディレクトリーを表示させることもできます。initial-buffer-choiceの値に、その後に表示するバッファーを戻す関数(引数なし)をセットすることもできます。 initial-buffer-choiceが非nilの場合、コマンドラインにファイルを指定しても、それらのファイルは表示されますが、初期画面としては表示されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6 Emacsの終了

C-x C-c

Emacsをkill(終了)します。(save-buffers-kill-terminal)。

C-z

テキスト端末ではEmacsをサスペンドします。グラフィカルなディスプレーでは選択されたフレームを“最小化”します。(suspend-emacs)。

EmacsをKillするというのは、Emacsプログラムを終了するという意味です。これを行うには、C-x C-c (save-buffers-kill-terminal)とタイプします。2文字キーシーケンスが使われているのは、アクシデントにより間違ってタイプしづらくするためです。もし変更されたファイルがある場合、C-x C-cをタイプすると、Emacsとそれらのバッファーを巡回して、バッファーを保存するか問い合わせます。それらすべてを保存しない場合、未保存の変更が失われてしまう前に、もう一度問い合わせます。サブプロセスがまだ実行中の場合にも、Emacsをkillするとサブプロセスもkillされるので、問い合わせを行います(Emacsからのシェルコマンドの実行を参照してください)。

もしEmacsをサーバーとして使っている場合、C-x C-cは特別に振る舞います。もし“クライアントフレーム”からタイプした場合は、クライアントのコネクションをクローズします。サーバーとしてのEmacsの使用を参照してください。

Emacsはオプションで、killしたときに表示していたファイルなどの、セッション情報を記録することができます。この情報は次回Emacsを起動するとき利用可能です。Emacsセッションの保存を参照してください。

変数confirm-kill-emacsの値が非nilの場合、C-x C-cはその値が関数だとみなして、その関数を呼び出します。その関数呼び出しの結果が非nilの場合、セッションはkillされ、そうでない場合、Emacsは実行を続けます。confirm-kill-emacsの値として使うのに適した関数の1つが、yes-or-no-pです。confirm-kill-emacsのデフォルト値はnilです。

保存の問い合わせを行わずにEmacsをkillするときは、M-x kill-emacsとタイプします。

C-zは、コマンドsuspend-frameを実行します。グラフィカルなディスプレーでは、このコマンドは選択されたEmacsのフレームを後で戻れるように、最小化(またはアイコン化)して隠します(どのように隠されるかはウィンドウシステムに依存します)。テキスト端末では、C-zはEmacsをサスペンド(休止)します。プログラムは一時的に停止し、制御は親プロセス(通常はシェル)に戻ります。ほとんどのシェルではシェルのコマンド%emacsで、サスペンド中のEmacsを再開できます。

テキスト端末は、通常、実行中のプログラムをkillしたりサスペンドする、特定の特殊文字を監視しています。この端末の機能は、Emacsではオフになっています。EmacsでのC-zC-x C-cのキーの意味は、いくつかのオペレーティングシステムでプログラムを休止させたり終了させたりするために用いる文字、C-zC-cにヒントを得たものですが、オペレーティングシステムとの関係はそれだけです。これらのキーは、他のコマンドを実行するようにカスタマイズできます(キーマップを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7 基本的な編集コマンド

ここではテキストの入力、修正、ファイルへの保存といった基本操作について説明します。これらに接するのが初めてなら、learn-by-doing(行ってみることで学ぶ)形式のチュートリアルをやってみることを提案します。チュートリアルを行うにはC-h t (help-with-tutorial)とタイプしてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.1 テキストの挿入

普通のグラフィック文字(graphic character)(例 ‘a’、‘B’、‘3’、‘=’)は、対応するキーをタイプして挿入することができます。これによりバッファーのポイント位置に文字が追加されます。挿入によりポイントは前方に移動するので、ポイントは挿入された文字の直後になります。ポイントを参照してください。

行を終了して新しい行を開始するにはRET(newline)を入力します(キーボードでRETキーは、ReturnEnterというラベルがついているかもしれませんが、このマニュアルではRETと呼ぶことにします)。このコマンドは改行文字をバッファーに挿入してから、メジャーモードに基づきインデント(インデントを参照してください)を行います。ポイントが行末にある場合には、新しく空行を作成してから新しい行をインデントします。もしポイントが行の途中にある場合、行はその位置で分割されます。自動インデントをオフにするには、Electric Indentモード(インデントの便利な機能を参照してください)を無効にするか、自動インデントを行わず改行だけを挿入するC-jを入力します。

マニュアルの後ろで説明しますが、マイナーモード(minor modes)を利用することにより、Emacsが挿入を処理する方法を変更できます。たとえばAuto Fillモードというマイナーモードは行が長くなりすぎたとき自動的に行を分割します(see section テキストのフィル)。Overwrite modeというマイナーモードは、既存の文字を右方に押しやるかわりに、既存の文字を置き換え(上書き)ます。マイナーモードを参照してください。

対応するキーを押して挿入できるのはグラフィック文字だけです。他のキーは編集コマンドとして動作し、文字自体の挿入はしません。たとえば、デフォルトではDELは、コマンドdelete-backward-charを実行します(違うコマンドにバインドされているモードもあります)。このキーはリテラルの‘DEL’(ASCIIの文字コード127)を入力する訳ではありません。

非グラフィック文字や、キーボードがサポートしていない文字を挿入するには、最初にC-q (quoted-insert)で文字をクォート(quote)します。C-qの使い方は2つあります:

8進のかわりに10進や16進を使うには、変数read-quoted-char-radixに、10や16をセットします。もし基数が16の場合、aからfは文字コードの一部として扱われます。大文字小文字は区別されません。

かわりにコマンドC-x 8 RET (insert-char)を使うこともできます。これはミニバッファーを使って、Unicode名かコードポイント(code-point)の入力を求めます。もし名前を入力する時、コマンドが補完機能を提供します(補完を参照してください)。コードポイントを入力する場合、それは16進(Unicodeの規約による)、または指定した基数の数字(例 #o23072 (octal); Integer Basics in The Emacs Lisp Reference Manualを参照してください)であるべきです。このコマンドは対応する文字をバッファーに挿入します。たとえば以下の2つはどちらも無限記号(infinity sign: Unicode code-point U+221E)を挿入します。

C-x 8 RET infinity RET
C-x 8 RET 221e RET

C-qまたはC-x 8 RETへの数引数は、文字のコピーを何個挿入するかを指定します(数引数を参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.2 ポイント位置の変更

文字の挿入以上のことを行うには、ポイントを移動する方法について知る必要があります(ポイントを参照してください)。キーボードのコマンドC-fC-bC-nC-pは、それぞれ右・左・下・上にポイントを移動します。ほとんどのキーボードにある矢印キー — RIGHTLEFTDOWNUPでもポイントを移動できます。しかし多くのEmacsユーザーは矢印キーより、コントロールキーのほうが速いと考えています。なぜなら矢印キーを押すためにそれらが配置されている領域に手を動かす必要があるからです。

ポイントを移動したい場所でマウスの左ボタンをクリックしてもポイントを移動できます。Emacsは、さらに洗練された方法でポイントを移動する、さまざまなキーボードコマンドを提供します。

C-f

1文字前方(forward)に移動します (forward-char)。

RIGHT

このコマンド(right-char)は、C-fと同じように振る舞いますが1つ例外があります。もしアラビア語のようにright-to-left(右から左に記述する)な文書を編集する場合、現在のパラグラフが右から左で記述するパラグラフなら、後方に移動することになるのです。双方向の編集を参照してください。もしvisual-order-cursor-movementが非nilの場合、このコマンドは現在のスクリーン位置の右の文字に移動し、前または次のスクリーン行に適切に移動します。これはその場所の双方向コンテキストに依存するので、多くのバッファーのポイントがあいまいになる可能性があることに注意してください。

C-b

1文字後方(backward)に移動します (backward-char)。

LEFT

このコマンド(left-char)は、C-bと同じように振る舞いますが1つ例外があります。もしアラビア語のようにright-to-leftの文書を編集する場合、現在のパラグラフが右から左で記述するパラグラフなら、前方に移動することになるのです。双方向の編集を参照してください。もしvisual-order-cursor-movementが非nilの場合、このコマンドは現在のスクリーン位置の左の文字に移動し、前または次のスクリーン行に適切に移動します。

C-n
DOWN

スクリーンに表示された行で1行下に移動します(next-line)。このコマンドは横方向の位置を変更しないよう試みます。そのため行の途中でコマンドを開始すると、次の行の途中に移動することになります。

C-p
UP

スクリーンに表示された行で1行上に移動します(previous-line)。このコマンドはC-nと同様、行内の位置を保ちます。

C-a
Home

行の先頭に移動します(move-beginning-of-line)。

C-e
End

行の最後に移動します(move-end-of-line)。

M-f

1単語前方に移動します(forward-word)。

C-RIGHT
M-RIGHT

このコマンド(right-word)はM-fと同様に振る舞います。例外は現在のパラグラフがright-to-leftの場合、1語後方に移動することになります。双方向の編集を参照してください。

M-b

1単語後方に移動します(backward-word)。

C-LEFT
M-LEFT

このコマンド(left-word)はM-bと同様に振る舞います。例外は現在のパラグラフがright-to-leftの場合、1語前方に移動することになります。双方向の編集を参照してください。

M-r

スクリーン上のテキストを移動させることなく、ポイントの位置をウィンドウ上で中央にもっとも近いテキスト行の左端に移動します。連続して呼び出すと、最上行の左端、最下行の左端へと循環的にポイントを移動します(move-to-window-line-top-bottom)。

数引数はスクリーンの行の何行目にポイントを移動するか指定します。数値はウィンドウの最上行から数えた行数です(0は最上行を意味します)。負の引数は最下行から数えた行数です(-1は最下行を意味します。数引数については詳細は、数引数を参照してください。

M-<

バッファーの先頭に移動します(beginning-of-buffer)。数引数nが与えられた場合、最上行からn/10に移動します。

M->

バッファーの最後に移動します(end-of-buffer)。

C-v
PageDown
next

画面を1画面前方にスクロールします。もし必要ならポイントをスクリーン上の位置に移動します(scroll-up-command)。スクロールを参照してください。

M-v
PageUp
prior

画面を1画面後方にスクロールします。もし必要ならポイントをスクリーン上の位置に移動します(scroll-down-command)。スクロールを参照してください。

M-g c

数値nを読み取り、ポイントをバッファー位置nに移動します。1を指定するとバッファーの先頭に移動します。

M-g M-g
M-g g

数値nを読み、ポイントをバッファーの先頭からn行目に移動します。行に1を指定するとバッファーの先頭に移動します。もしポイントがバッファーの数字の上または直後にある場合、その数がnのデフォルトになります。ミニバッファーで単にRETを押すと、その数が使われます。数値のプレフィクス引数でnを指定してM-g M-gに与えることもできます。単にプレフィクス引数を与えた場合のM-g M-gの動作については、バッファーの作成と選択を参照してください。

M-g TAB

数値nを読み取り、現在行のn列目に移動します。列0は最左列です。プレフィクス引数とともに呼び出された場合、引数で指定された数の列に移動します。

C-x C-n

現在ポイントがある列をC-nC-p半恒久的な目標列(semipermanent goal column)として使用します。目標列が有効な場合、これらのコマンドで垂直に移動すると、その列もしくはできる限り近い列に移動しようと試みます。目標列はキャンセルされるまで有効です。

C-u C-x C-n

目標列をキャンセルします。それ以降のC-nC-pは通常どおり水平位置を保とうと試みます。

バッファーのテキストがウィンドウの幅より長い場合、通常Emacsは2行以上のスクリーン行(screen lines)で表示します。便宜上、C-nC-pそしてdownupも、同様にスクリーン行にしたがってポイントを移動します。これらのコマンドを論理行(logical lines)(たとえばバッファーのテキスト行)にしたがって移動させるには、line-move-visualnilをセットします。そうすると論理行が複数のスクリーン行となるような場合、カーソルは追加されたスクリーン行をスキップします。詳細は継続行を参照してください。line-move-visualなどの変数をセットする方法については、変数を参照してください。

C-nC-pと異なり、ほとんどのEmacsコマンドは論理的な行に作用します。たとえばC-a (move-beginning-of-line)やC-e (move-end-of-line)は、論理行の先頭もしくは最後に移動します。C-nC-pのようにスクリーン行に作用するコマンドの場合、わたしたちはそれを示すようにします。

line-move-visualnilの場合、変数track-eolにも非nil値をセットできます。そうすると論理行の行末でC-nC-pを開始すると、次の論理行の行末に移動します。通常track-eolnilです。

通常C-nをバッファーの最後の行で使用した場合、バッファーの最後でストップします。しかし変数next-line-add-newlinesに非nil値をセットした場合、バッファーの最後の行でC-nを押すと、行を追加してその行に移動します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.3 テキストの消去

DEL
BACKSPACE

ポイントの前の文字、またはリージョンがアクティブのときはリージョンを削除します(delete-backward-char)。

Delete

ポイントの後の文字、またはリージョンがアクティブのときはリージョンを削除します(delete-forward-char)。

C-d

ポイントの後ろの文字を削除します(delete-char)。

C-k

行末までkillします(kill-line)。

M-d

次の単語(word)の末尾までを前方にkillします(kill-word)。

M-DEL

前の単語の先頭までを後方にkillします(backward-kill-word)。

コマンドDEL (delete-backward-char)は、ポイントの前の文字を削除して、カーソルと後ろの文字を後方に移動します。ポイントが行の先頭にある場合、前の改行を削除して、その行を前の行と連結します。

しかしリージョンがアクティブのとき、DELはリージョンのテキストを削除します。リージョンの説明は、マークとリージョンを参照してください。

ほとんどのキーボードでは、DELにはBACKSPACEというラベルがついていますが、このマニュアルではDELと呼ぶことにします(DELDeleteと混同しないでください。Deleteについてはこの後で議論します)。いくつかのテキスト端末では、EmacsはDELを正しく認識しません。もしこの問題に遭遇したときには、DELで削除できない場合を参照してください。

コマンドDelete (delete-forward-char)は、“反対方向”に削除します。これはポイントの後ろの文字、たとえばカーソルの下の文字を削除します。ポイントが行末にある場合は、その行を次の行と連結します。DELと同様、リージョンがアクティブのときはリージョンのテキストを削除します(マークとリージョンを参照してください)。

C-d (delete-char)は、Deleteと同じようにポイントの後ろの文字を削除しますが、リージョンがアクティブかどうかは関係ありません。

上述した削除コマンドについての詳細な情報は、削除を参照してください。

C-k (kill-line)は行を一度に消去(kill)します。もし行頭または行の途中でC-kとタイプすると、行末までのすべてのテキストをkillします。行末でC-kとタイプすると、その行を次の行と連結します。

C-kと関連するコマンドについては、テキストのkillと移動を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4 変更のアンドゥ

C-/

undoレコードにあるエントリーをundoします。通常1つのコマンドを元に戻す(undo)ことに相当します。

C-x u
C-_

同じです。

Emacsはバッファー内のテキストに行われた変更のリストを記録しているので、最近の変更はundoできます。これはC-/(およびC-x uC-_)にバインドされているコマンドundoを使って行われます。通常このコマンドは最後の変更をundoして、ポイントを変更前の位置に移動します。undoコマンドはバッファーへの変更のみに適用されるので、カーソルの動きをundoすることはできません。

個々の編集コマンドは、通常undoレコードの個別のエントリーとなりますが、とても単純なコマンドはグループ化される場合があります。1つのエントリーが、実は複雑なコマンドのほんの一部の場合もあります。

もしC-/(またはそれの別名コマンド)を繰り返すと、undoされた箇所はさらにundoされ、初期の変更もundoされ、ついには利用可能なundo情報の限界に達します。もし記録された変更がすべてundoされている場合、undoコマンドはエラーメッセージを表示して、何も行いません。

undoコマンドについてさらに学ぶには、Undo(取り消し)を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.5 ファイル

Emacsのバッファーに挿入したテキストは、Emacsのセッションの間だけ存在します。テキストを永続化させるためには、それをファイル(file)に保存しなければなりません。

ホームディレクトリーに、test.emacsという名前のファイルがあるとしましょう。このファイルをEmacsで編集するには、以下を入力します

C-x C-f test.emacs RET

ここでファイル名は、コマンドC-x C-f (find-file)に与えられる、引数(argument)です。このコマンドは引数を読み取るためにミニバッファー(minibuffer)を使い、RETは引数を終端させます(ミニバッファーを参照してください)。

このコマンドに従うために、Emacsはそのファイルをvisit(訪問)します: すなわちバッファーを作成し、ファイル内容をバッファーにコピーし、編集のためにバッファーを表示します。テキストを変更したら、C-x C-s (save-buffer)と入力することにより、ファイルを保存(save)できます。これにより変更されたバッファー内容は、test.emacsに書き戻され永続化されます。保存するまでは、テキストへの変更はEmacs内部にだけ存在し、ファイルtest.emacsは変更されません。

ファイルを作成するには、すでにファイルが存在するかのようにC-x C-fでファイルをvisitするだけです。これはファイルに書き込みたいテキストを入力できる、空のバッファーを作成します。最初にこのバッファーをC-x C-sで保存するとき、Emacsは実際にファイルを作成します。

Emacsでファイルを使うことについてさらに学ぶには、ファイルの処理を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.6 ヘルプ

もしキーが何をするか忘れた場合、C-h k (describe-key)と入力して、それに続けて関心のあるキーを入力します。たとえばC-h k C-nは、C-nが何をするか表示します。

プレフィクスキーC-hは“ヘルプ(help)”が由来です。F1キーはC-hの別名です。C-h k以外にも、異なる種類のヘルプを提供する多くのヘルプコマンドがあります。

詳細については、ヘルプを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.7 空行

空行を挿入したり削除するための、特別なコマンドとテクニックがあります。

C-o

カーソルの後ろに空行を挿入します(open-line)。

C-x C-o

連続する空行を、1行残してすべて削除します(delete-blank-lines)。

これまでRET (newline)が、どうやってテキストの新しい行を開始するのか見てきました。しかし最初に空行を作ってからテキストを挿入するほうが、何を行っているのかわかりやすいでしょう。これはキーC-o (open-line)を使えば、簡単に行うことができます。これはポイントの後ろに改行を挿入し、ポイントを改行の前に維持します。C-oの後に新しい行のためのテキストを入力します。

複数の空行はC-oを数回入力するか、何個の空行を作るのかを数引数で与えれば作れます。方法については、数引数を参照してください。もしフィルプレフィクスがあって、行頭でC-oが入力された場合、新しい行にフィルプレフィクスを挿入します。フィルプレフィクスを参照してください。

余分な空行を取り除く簡単な方法は、C-x C-o (delete-blank-lines)です。連続する空行の中にポイントがあるとき、C-x C-oは1行残してすべての空行を削除します。ポイントが単独の空行にある場合、C-x C-oはその空行を削除します。ポイントが空でない行にある場合、C-x C-oは、後続する空行があれば、それらすべてを削除します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.8 継続行

バッファー内のテキストの行 — 論理行(logical line) — がウィンドウに収まらないほど長い場合、Emacsがそれを2行以上のスクリーン行(screen lines)で表示するときがあります。これは行の折り返し(line wrapping)または継続(continuation)と呼ばれ、論理行は継続された行(continued line)と呼ばれます。グラフィカルなディスプレーでは、Emacsは行の折り返しをウィンドウの左右のフリンジ(fringes、縁)の小さな曲矢印で示します。テキスト端末では、Emacsは右の余白に‘\’を表示して行の折り返しを示します。

ほとんどのコマンドは、スクリーン行ではなく論理行にたいして作用します。たとえばC-kは論理行をkillします。前に説明したように、C-n (next-line)とC-p (previous-line)は特別な例外です。これらはスクリーン行にたいしてポイントを上下に移動させます(ポイント位置の変更を参照してください)。

Emacsはオプションで長い論理行を継続するかわりに、切り詰める(truncate)ことができます。これは論理行が1つのスクリーン行を占めることを意味します。もし論理行がウィンドウ幅より長い場合、行の残りは表示されません。グラフィカルなディスプレーでは切り詰められた行は、右フリンジの小さな直矢印で示されます。テキスト端末では右余白の‘$’で示されます。行の切り詰めを参照してください。

デフォルトでは継続行はウィンドウの右端で折り返されます。折り返しが単語の途中で発生すると、継続された行は読むのが難しくなります。普通の解決策は、行が長くなりすぎる前に改行を挿入することです。もしお好みなら、行が長くなりすぎたときにEmacsが自動的に改行を挿入するように、Auto Fillモードを使うことができます。テキストのフィルを参照してください。

多くの長い論理行を含むファイルを編集する必要があり、それらすべてを改行で分割するのが実用的でない場合があります。そのようなケースでは単語折り返し(word wrapping)が有効なVisual Lineモードを使うことができます。これは長い行を正確にウィンドウの右端で折り返すのではなく、ウィンドウの右端に一番近い単語境界(スペースやタブなど)で折り返します。Visual Lineモードでは、C-aC-nC-kなどの編集コマンドも、論理行ではなくスクリーン行を処理するように再定義されます。Visual Lineモードを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.9 カーソル位置の情報

バッファーのある部分にたいしてサイズや位置、単語数や行数についての情報を得るためのコマンドがあります。

M-x what-line

ポイントの行番号を表示します。

M-x line-number-mode
M-x column-number-mode

現在の行番号および列番号の自動表示を切り替えます。モードラインのオプションを参照してください。

M-=

現在のリージョンの行数、単語数、文字数を表示します(count-words-region)。リージョンについては、マークとリージョンを参照してください。

M-x count-words

現在のバッファーの行数、単語数、文字数を表示します。リージョン(マークとリージョンを参照してください)がアクティブのときは、かわりにリージョンの数字を表示します。

C-x =

ポイントの後ろの文字の文字コード、ポイントの文字位置、ポイントの列位置を表示します(what-cursor-position)。

M-x hl-line-mode

現在行のハイライト表示を有効または無効にします。カーソルの表示を参照してください。

M-x size-indication-mode

バッファーのサイズの自動表示を切り替えます。モードラインのオプションを参照してください。

M-x what-lineは、エコーエリアに現在の行番号を表示します。通常このコマンドは不必要です。なぜならモードラインに現在の行番号が、すでに表示されているからです (モードラインを参照してください)。しかしバッファーがナロー(narrow: 制限)されている場合、モードラインはアクセスできる範囲についての行番号しか表示しません(ナローイングを参照してください)。それにくらべてwhat-lineは、制限されたリージョンとバッファー全体、両方の行番号を表示します。

M-= (count-words-region)はリージョン内の行数、単語数、文字数を報告するメッセージを表示します(リージョンについての説明は、マークとリージョンを参照してください)。プレフィクス引数C-u M-=を指定すると、このコマンドはバッファー全体の数字を表示します。

M-x count-wordsは同じことを行いますが、呼び出し規約が異なります。もしリージョンがアクティブの場合はリージョン、そうでない場合はバッファーの数字を表示します。

コマンドC-x = (what-cursor-position)は現在のカーソル位置と、その位置にあるバッファー内容についての情報を表示します。エコーエリアには、以下のような行が表示されます:

Char: c (99, #o143, #x63) point=28062 of 36168 (78%) column=53

Char:’には、バッファー中のそのポイントにある文字が表示されます。カッコ内にはその文字に対応する文字コードが10進、8進、16進で表示されます。C-x =が文字の情報について表示する方法については、国際化文字セットのイントロダクションを参照してください。‘point=’はポイント位置を文字数(バッファーの最初の文字は1、次の文字は2、...)で表示します。その後ろの数字ではバッファー内の文字数の合計が表示され、カッコ内にはその位置が全体から見て何パーセントの位置なのかが表示されます。‘column=’にはポイントの水平位置、すなわちウィンドウの左端から数えて何番目の列かが表示されます。

もしバッファーがナローされている場合、最初と最後の部分のテキストが一時的にアクセス不能になります。C-x =は現在アクセス可能な範囲についての追加説明を表示します。たとえば以下のように表示します:

Char: C (67, #o103, #x43) point=252 of 889 (28%) <231-599> column=0

ここで、新たに追加された2つの数字が、ポイントを設定できる文字位置の下限と上限を示します。これら2つの位置のあいだの文字が参照可能な文字です。ナローイングを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.10 数引数

数学や計算機の用語では、引数(argument)という単語は、“関数や操作に与えるデータ”を意味します。Emacsのコマンドには、数引数(numeric argument)(プレフィクス引数(prefix argument)とも呼ぶ)を指定できるものがあります。引数を反復回数として解釈するコマンドもあります。たとえば、引数10をC-fに指定すると、カーソルを通常の1文字ではなく、10文字分前向きに移動します。これらのコマンドでは、引数を指定しないと引数1を指定したのと同等になります。この種のコマンドの多くでは、負の引数を指定すると、逆向きの移動や逆の操作を指示することになります。

数引数を指定するもっとも簡単な方法は、METAキーを押しながら数字またはマイナス記号(と数字)を入力する方法です。以下はその例です:

M-5 C-n

これは5行下に移動します。キーM-1M-2、...、同様にM--は、次のコマンドへの引数をセットアップするコマンド、(digit-argumentnegative-argument)にバインドされています。数字をともなわないM--は、通常-1を意味します。

2桁以上の数字を入力したい場合、2文字目以降の数字を入力するときにMETAを押しつづける必要はありません。つまり50行下に移動するときは、以下のように入力します:

M-5 0 C-n

これは、(あなたが期待するように)‘0’を5つコピーして挿入してから1行下がるのではないことに注意してください。‘0’はプレフィクス引数の一部として扱われます。

(‘0’を5つコピーして挿入するときは、M-5 C-u 0と入力します。ここでC-uはプレフィクス引数を“終端させる”ので、次のキー入力はあなたが実行したいコマンドです。ここでのC-uの意味はこのケースだけに適用される使い方です。C-uの通常の役割については以下を参照してください。)

数引数を指定する別の方法として、M-1M-2、...と入力するかわりに、C-u (universal-argument)のあとに数字(負の引数の場合はマイナス記号と数字)を入力する方法があります。通常、数字をともなわないマイナス記号は-1を意味します。

単独のC-uは、“4倍”という特別な意味をもち、次のコマンドの引数を4倍にします。C-u C-uは16倍です。つまりC-u C-u C-fは16文字前方に移動します。その他に便利な使い方としてはC-u C-nC-u C-u C-n(適当な割り合いで画面を下に移動する)や、C-u C-u C-o(空行を“たくさん”作る)、C-u C-k(4行削除する)、などがあります。

自分自身を挿入する文字の前に数引数を使えば、指定した分のコピーを挿入できます。これは挿入したい文字が数字でないときは簡単です。たとえばC-u 6 4 aは、‘a’を64個コピーして挿入します。しかし数字を挿入したいときは、これではうまくいきません。C-u 6 4 1は引数に641を指定することになってしまいます。このようなときは引数と挿入したい数字を分けるために、他のC-uを使うことができます。たとえばC-u 6 4 C-u 1とすれば、これは‘1’を64個コピーして挿入します。

引数の有無は確認しても、その値は無視するコマンドもあります。たとえばコマンドM-q (fill-paragraph)は、1行に収まるようできるだけテキストをフィルしますが、引数をともなうと、余分なスペースを挿入してテキストが正確に1行の最大幅を使うよう均等に割り付けてフィルします(M-qについては、テキストのフィルを参照してください)。このようなコマンドは、引数として単にC-uを指定するだけで充分です。

引数の値を繰り返しの回数として使いますが、引数がないときは特別な処理を行うコマンドもあります。たとえばコマンドC-k (kill-line)に引数nを指定すると、これは行末の改行も含めてn行をkillします。しかし引数を指定しないでC-kした場合、ポイントから改行までのテキストをkillするか、ポイントが行末にある場合は改行をkillします。つまりコマンドC-kを引数なしで2回呼び出すと、C-kに引数1を指定したのと同様、空でない行をkillできます(C-kについての情報は、テキストのkillと移動を参照してください)。

いくつかのコマンドは、C-uだけの引数を通常の引数とは異なるものとして扱います。また、マイナス記号のみの引数を、-1とは区別するコマンドもあります。これらの例外については、必要になったときに説明します。これらの例外は、それぞれのコマンドを使いやすくするためにあり、コマンドのドキュメント文字列に記載されています。

コマンドの前に引数を入力するという点を強調するために、そしてコマンドが呼び出されてから入力されるミニバッファー引数(ミニバッファーを参照してください)と区別するために、わたしたちはプレフィクス引数(prefix argument)という言葉を使います。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.11 コマンドの繰り返し

単純なキーで呼び出されるものや、M-x command-name RETで実行できるような多くのコマンドは、数引数で繰り返し回数(数引数を参照してください)を与えることで、その回数だけ繰り返すことができます。しかし、入力を求めるものや数引数を別の目的に使うコマンドでは、この方法はうまくいきません。

コマンドC-x z (repeat)は、Emacsコマンドを何回も反復する別の方法です。このコマンドは、直前のEmacsコマンドが何であっても、それを繰り返します。繰り返されるコマンドは、まえと同じ引数を使います。毎回新たに引数を読み取ることはしません。

コマンドを2回以上繰り返すにはzを追加して入力します。1つのzでコマンドを1回繰り返します。z以外の文字を入力するか、マウスボタンを押すと繰り返しを終了します。

たとえば、20文字削除するためにC-u 2 0 C-dと入力したとしましょう。C-x z z zと入力すれば、(引数を含めて)削除コマンドをさらに3回繰り返し、全部で80文字削除できます。始めのC-x zでコマンドを1回繰り返し、そのあとのそれぞれのzで1回ずつ繰り返します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8 ミニバッファー

ミニバッファー(minibuffer)とは、Emacsのコマンドがファイル名、バッファー名、Emacsコマンド名、Lisp式といった、複雑な引数を読み取るための場所です。なぜ“ミニバッファー”と呼ぶかというと、それがスクリーン上の小領域を占める、特別な目的のためのバッファーだからです。ミニバッファーで引数テキストを編集するために、通常のEmacs編集コマンドを使うことができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.1 ミニバッファーを使う

ミニバッファーを使用中、ミニバッファーはエコーエリアにカーソルとともに表示されます。ミニバッファーは通常、コロンが最後についたプロンプト(prompt)から開始されます。プロンプトはどのような入力が期待されるか、そしてそれがどのように使われるのかを示します。プロンプトは、フェイスminibuffer-promptを使ってハイライトされます。

ミニバッファーで入力するもっとも簡単な方法は、テキストを入力してからRETで引数入力を完了してミニバッファーを終了する方法です。かわりにC-gを入力して引数を求めているコマンドをキャンセルし、ミニバッファーを終了することもできます(中止と中断を参照してください)。

コロンの前のカッコ内にデフォルト引数(default argument)を表示するプロンプトもあります。このデフォルト値は、RETだけを入力したときに、引数として使用されます。たとえばバッファー名を読み取るコマンドは、通常デフォルト値としてバッファー名を表示します。RETを入力することでデフォルトのバッファーにたいして処理を行うことができます。

Minibuffer Electric Defaultモードというグローバルマイナーモードを有効にしている場合、ミニバッファーの内容の変更を開始すると、Emacsはデフォルト引数を非表示にします。ミニバッファーのテキストを元に戻せば、ふたたびプロンプトにデフォルト値が表示されます。さらに変数minibuffer-eldef-shorten-defaultを非nil値に変更すると、スクリーンのスペースを節約するために、‘(default default)’のかわりに‘[default]’の形式でデフォルト値を表示します。このマイナーモードを有効にするには、M-x minibuffer-electric-default-modeとタイプしてください。

エコーエリアにミニバッファーが表示されると、他のエコーエリアの使用と競合するかもしれません。ミニバッファーがアクティブなとき、エラーメッセージや情報メッセージは一時的な表示となります。メッセージは数秒ミニバッファーを隠すように表示されるか、なにかタイプするまでのあいだ表示され、その後ミニバッファーに戻ります。ミニバッファーの使用中、キーストロークはエコーされません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.2 ミニバッファーでのファイル名

C-x C-f (find-file)のようなコマンドは、ミニバッファーを使ってファイル名引数を読み取ります。ファイル名を読み取るためにミニバッファーを使用しているとき、通常は最後にスラッシュがついたテキストで開始されています。これはデフォルトディレクトリー(default directory)です。たとえば以下のように開始されていたとします:

Find file: /u2/emacs/src/

ここで‘Find file: ’はプロンプト、‘/u2/emacs/src/’はデフォルトディレクトリーです。ここでbuffer.cを入力すると/u2/emacs/src/buffer.cを指定したことになります。デフォルトディレクトリーについての情報は、ファイルの名前を参照してください。

..で親ディレクトリーを指定できます。つまり/a/b/../foo.el/a/foo.elと同じです。M-DELを使えば、ディレクトリー名を後方にkillできます(単語を参照してください)。

デフォルトディレクトリーとは無関係のファイルを指定する場合、デフォルト値全部をC-a C-kでkillできます。かわりにデフォルト値を無視することもできます。これはスラッシュで始まる絶対パスのファイル名か、チルダで始まるファイル名をデフォルトディレクトリーに続けて入力します。たとえば以下のようにして/etc/termcapを指定できます:

Find file: /u2/emacs/src//etc/termcap

Emacsはダブルスラッシュを、“2番目のスラッシュより前のすべてを無視する”と解釈します。上の例では/u2/emacs/src/は無視されるので、引数は/etc/termcapとなります。無視される部分のファイル名は、端末に可能なら目立たないような表示になります(これを無効にするには、コマンドM-x file-name-shadow-modeでFile Name Shadowモードをオフにしてください)。

Emacsは~/をホームディレクトリーと解釈します。~/foo/bar.txtはホームディレクトリーにある、fooというディレクトリーの、bar.txtという名前のファイルを指定します。さらに~user-id/はログイン名がuser-idというユーザーの、ホームディレクトリーを意味します。~の前のディレクトリー名は無視されるので、/u2/emacs/~/foo/bar.txt~/foo/bar.txtと同じです。

MS-WindowsとMS-DOSでは、ユーザーは常にホームディレクトリーを持つとは限らないので、Emacsはいくつかの代替ディレクトリーを使います。MS-WindowsについてはMS-WindowsでのHOMEディレクトリーと開始ディレクトリー、MS-DOSについては MS-DOSでのファイル名を参照してください。 これらのシステムでは~user-id/は現在のユーザーの場合だけ、つまりuser-idが現在のユーザーのログイン名のときだけがサポートされます。

Emacsがファイル名を読みとるとき、デフォルトディレクトリーを挿入しないようにするには、変数insert-default-directorynilに変更します。この場合、ミニバッファーは空で開始されます。それでも相対パスでのファイル名引数は、同じデフォルトディレクトリーにもとづいて解釈されます。

ミニバッファーにリモートファイル名を入力することもできます。 リモートファイルを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.3 ミニバッファーでの編集

ミニバッファーは一風変わっていますがEmacsのバッファーなので、引数テキストを編集するための、通常のEmacsコマンドが利用可能です(しかしプロンプトは読み取り専用(read-only)なので変更できません)。

ミニバッファーでのRETは引数を完了させるので、これを使って改行を挿入することはできません。C-q C-jを使えば制御文字C-j(改行文字と等しい)を挿入できます(テキストの挿入を参照してください)。かわりにC-o (open-line)を使うこともできます(空行を参照してください)。

ミニバッファーの中ではTABSPC?補完コマンド(completion commands)にバインドされている場合があります。これによりテキスト全部を入力せずに、入力したいテキストを簡単に入力できます。補完を参照してください。RETのときと同様、C-qを使ってTABSPC、‘?’のような文字を入力できます。

便宜上ミニバッファーでのC-a (move-beginning-of-line)は、プロンプトの先頭ではなく引数テキストの先頭にポイントを移動します。これにより、たとえばC-a C-kで引数全体をkillことができます。

ミニバッファーがアクティブのとき、エコーエリアは通常のEmacsウィンドウのように扱われます。たとえば(C-x oで)他のウィンドウに切り替えて、そこでテキストを編集して、またミニバッファーのウィンドウにもどって引数の入力を完了できます。ほかのウィンドウでテキストをkillしてからミニバッファーのウィンドウにもどり、引数にテキストをyankすることさえ可能です。しかしミニバッファーのウィンドウは分割(split)できないなどの制限もあります。複数ウィンドウを参照してください。

通常ミニバッファーのウィンドウは、スクリーン行で1行を占めます。しかし2行以上のテキストをミニバッファーに追加すると、そのテキストに対応して自動的に拡張されます。変数resize-mini-windowsは、ミニバッファーのサイズ調整を制御します。デフォルト値はgrow-onlyで、これは今説明したとおりの振る舞いを意味します。もし値がtの場合、ミニバッファーから行を削除すると。ミニバッファーのウィンドウは自動的に縮小されて、スクリーン行で1行まで小さくなります。値がnilの場合、ミニバッファーのウィンドウは自動的にサイズを変更しません。しかし通常のウィンドウのサイズ調整コマンドは使用できます(複数ウィンドウを参照してください)。

変数max-mini-window-heightは、ミニバッファーのウィンドウのサイズ変更するときの、最大高さを制御します。浮動少数を指定した場合は、フレームの高さにたいする比になります。整数を指定した場合は最大行数になります。nilを指定すると、ミニバッファーのウィンドウの自動サイズ調整は行われません。デフォルト値は0.25です。

ミニバッファーでのC-M-vコマンドは、他のウィンドウに表示されたコマンドのヘルプテキストをスクロールします。M-priorM-next(またはM-PageUpM-PageDown)でも、ヘルプテキストをスクロールできます。これは長い補完候補のリストを選ぶときなどに便利です。他のウィンドウの使用を参照してください。

通常Emacsはミニバッファーがアクティブのときは、ミニバッファーにたいして多くのコマンドを使用できないようにしています。ミニバッファーでこれらのコマンドを使えるようにするには、変数enable-recursive-minibufferstをセットしてください。

アクティブでないとき、ミニバッファーはminibuffer-inactive-modeになっており、Mouse-1をクリックすると、*Messages*バッファーを表示します。ミニバッファー専用のフレームを使用している場合、Emacsはそこでのキー入力も認識します。たとえばnは新しいフレームを作成します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4 補完

引数を入力する助けとなる、補完(completion)という機能が使えるときがあります。これは引数の一部を入力すると、それまでに何を入力したかにもとづいて、Emacsが残りあるいは残りの一部を補完してくれることを意味します。

補完が利用可能なとき、特定のキー(通常はTABRETSPC)が、ミニバッファーの特別な補完コマンド(補完コマンドを参照してください)にリバインドされています。これらのコマンドは、ミニバッファーのテキストを完了させようと試みます。これは引数を要求したコマンドが提供する、補完候補(completion alternatives)にもとづいています。通常?を入力すると、補完候補のリストを見ることができます。

補完は通常ミニバッファー内で行われますが、通常のバッファーないでもこの機能を利用可能なときがあります。シンボル名の補完を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.1 補完の例

ここでは簡単な例が理解しやすいでしょう。M-xは、コマンド名を読み取るためにミニバッファーを使います。補完はミニバッファーのテキストと、既存のEmacsコマンドの名前のマッチによって機能します。コマンドをauto-fill-modeを実行したいとします。M-x auto-fill-mode RETをタイプすればよいのですが、補完を使えばもっと簡単になります。

M-x a u TABとタイプすると、TABは‘au’で始まる補完候補(この例ではコマンド名)を探します。auto-fill-modeautoconf-modeなどの候補がいくつかありますが、候補はすべてautoで始まるので、ミニバッファーの‘au’は‘auto’に補完されます(あなたのEmacsのセッションには、もっと多くのコマンドが定義されているかもしれません。たとえばauthorize-meというコマンドが定義されている場合には、Emacsが補完できるのは‘aut’までです)。

もう一度TABをタイプしても、次の文字は‘-’、‘a’、‘c’のどれなのか決定できません。そのため文字は追加されず、かわりにTABは可能性のある補完候補の一覧を別のウィンドウに表示します。

次に-fと入力します。ミニバッファーには‘auto-f’が入力されました。この文字で始まるコマンド名は、auto-fill-modeだけです。ここでTABを入力すると、残りの部分が補完されて、ミニバッファーの引数は‘auto-fill-mode’になります。

したがってa u TAB - f TABと入力するだけで、‘auto-fill-mode’と入力できるのです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.2 補完コマンド

以下は補完が使えるときに、ミニバッファーで定義されている補完コマンドの一覧です。

TAB

可能な限りミニバッファーのテキストを補完します。補完できないときは、可能性のある補完候補のリストを表示します(minibuffer-complete)。

SPC

ミニバッファーのテキストを単語単位で補完します(minibuffer-complete-word)。このコマンドは、引数にスペースが含まれる可能性のあるファイル名などでは利用できません。

RET

最初に可能な限り補完した後で、ミニバッファーのテキストを引数として確定します。補完の終了を参照してください。

?

補完候補の一覧を表示します(minibuffer-completion-help)。

TAB (minibuffer-complete)は、もっとも基本的な補完コマンドです。これはミニバッファーのテキストとマッチする可能性のある、すべての補完候補を検索して、できるかぎりの補完を試みます。補完候補が選択される方法については、補完候補が選択される方法を参照してください。

SPC (minibuffer-complete-word)は、TABと同じように補完をおこないますが、次のハイフンまたは空白までしか補完しません。ミニバッファーが‘auto-f’の場合、‘auto-fill-mode’まで補完できますが、‘ill-’しか挿入しないので‘auto-fill-’となります。次にSPCを入力すると‘auto-fill-mode’が補完されます。

TABSPCが補完できない場合、マッチする補完候補のリスト(複数ある場合)を、別のウィンドウに表示します。同じリストは? (minibuffer-completion-help)でも表示できます。以下は補完一覧で使うことができるコマンドです:

Mouse-1
Mouse-2

マウスのボタン1もしくはボタン2で補完候補を選択します(mouse-choose-completion)。

M-v
PageUp
prior

ミニバッファーでM-vを入力すると、候補リストを表示しているウィンドウを選択します(switch-to-completions)。以下のコマンドを使うには、この方法がよいでしょう。PageUppriorは同じことをおこないます。他の方法でもウィンドウを選択できます(複数ウィンドウを参照してください)。

RET

補完候補リストのバッファー内では、ポイント位置の補完候補を選択します(choose-completion)。

RIGHT

補完候補リストのバッファー内では、次の補完候補にポイントを移動します(next-completion)。

LEFT

補完候補リストのバッファー内では、前の補完候補にポイントを移動します(previous-completion)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.3 補完の終了

コマンドがミニバッファーの補完を使って引数を読みとる場合、引数を確定するためにRET (minibuffer-complete-and-exit)をタイプしたときに、何が起こるかも制御します。これには4種類の動作があります:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.4 補完候補が選択される方法

補完コマンドは、たくさんの可能性のある補完候補を、ミニバッファーに入力したものと“マッチ(match)”する、より少ないサブセットへと絞り込むことにより機能します。補完の例では、そのようなマッチングの簡単な例を紹介しました。どのような構成が“マッチ”なのかを決定する手続きはとても複雑です。Emacsは多くの状況下でもっとも妥当と思われる補完を試みます。

Emacsは1つ以上の補完スタイル(completion styles)を使って補完をおこないます。これはミニバッファーのテキストを補完候補とマッチングするための条件のセットです。補完を行うとき、Emacsは補完スタイルを順番に試します。もしあるスタイルが1つ以上のマッチを獲得した場合、それらは補完候補リストのために使用されます。もしあるスタイルがマッチを獲得できなかった場合、Emacsは次のスタイルにフォールバックします。

リスト変数completion-stylesは、使用する補完スタイルを定義します。それぞれのリスト要素(list element)は、補完スタイルの名前(Lispシンボル)です。デフォルトの補完スタイルは、リスト変数に以下の名前の要素が順番に並んでいます。

basic

ミニバッファーのポイントより前のテキストと、補完候補の先頭が同じでなければなりません。さらにミニバッファーのポイントより後ろのテキストがある場合、補完候補の残りそれが含まれていなければなりません。

partial-completion

このアグレッシブな補完スタイルは、ミニバッファーのテキストをハイフンまたは空白で区切り、各単語ごとに補完をおこないます(たとえばコマンド名を補完する場合、‘em-l-m’は、‘emacs-lisp-mode’に補完されます)。

さらにミニバッファーのテキスト中の‘*’は、ワイルドカード(wildcard)として扱われます。これは補完候補の対応する位置にある、任意の文字とマッチします。

emacs22

この補完スタイルはbasicとにていますが、ミニバッファーのポイントより後のテキストを無視します。この名前は補完の動作がEmacs 22と同じだからです。

以下の追加の補完スタイルが定義されており、completion-stylesに追加することもできます(カスタマイズを参照してください)。

substring

補完候補は、ミニバッファーのポイントより前のテキストと、ポイントより後のテキストが同じ順番で含まれていなければなりません。

したがって、ミニバッファーのテキストが‘foobar’で、ポイントが‘foo’と‘bar’の間にある場合、‘afoobbarc’にマッチします。この場合abcは空文字列を含む任意の文字列です。

initials

このとてもアグレッシブな補完スタイルは、頭文字とイニシャルで補完を試みます。たとえばコマンド名の補完をする場合、‘lch’は‘list-command-history’とマッチします。

emacs21と呼ばれる、とてもシンプルな補完スタイルもあります。このスタイルでは、ミニバッファーのテキストが‘foobar’の場合、‘foobar’で始まるものだけにマッチします。

変数completion-category-overridesを設定することにより、状況に応じて異なる補完スタイルを使うことができます。たとえばバッファー名を補完するときは、デフォルトでbasicsubstringだけを使うよう指定できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.5 補完オプション

大文字小文字の違いは、コマンド名のように大文字小文字を区別する(case-sensitive)引数では重要です。たとえばコマンド名の補完では、‘AU’では‘auto-fill-mode’に補完されません。大文字小文字の違いは、それが問題にならない引数の補完では無視されます。

ファイル名を補完するとき、変数read-file-name-completion-ignore-caseが非nilなら、大文字小文字の違いは無視されます。GNU/Linuxのように、ファイル名の大文字と小文字を区別するシステムでは、デフォルト値はnilです。Microsoft Windowsのように、ファイル名の大文字と小文字を区別しないシステムでは、非nilです。バッファー名を補完するとき、read-buffer-completion-ignore-caseが非nilなら、大文字小文字の違いは無視されます。デフォルトはnilです。

通常Emacsはファイル名を補完するとき、選ばれるべきではないと思われる、特定の候補を無視します。これはリスト変数completion-ignored-extensionsにより決定されます。リストの要素はに文字列を指定します。それらの文字列で終わるファイル名は、補完候補としては無視されます。スラッシュ(/)で終わる要素は、ディレクトリー名を表します。completion-ignored-extensionsの標準的な値は".o"".elc""~"を含むいくつかの要素です。たとえばディレクトリーに‘foo.c’、‘foo.elc’があるとき、‘foo’は‘foo.c’に補完されます。しかしすべての補完候補が“無視すべき”文字列で終わるとき、これらの候補は無視されません。前の例でいうと‘foo.e’は‘foo.elc’に補完されます。Emacsは補完候補リストで補完候補を表示するとき、completion-ignored-extensionsを無視します。

Shellでの補完は、ファイル名補完の拡張されたバージョンです。Shellモードのオプションを参照してください。

completion-auto-helpnilがセットされていると、補完コマンドは補完リストバッファーを表示しません。表示するには?を入力しなければなりません。値がlazyの場合、Emacsは2度目の補完を試みたときだけ、補完リストバッファーを表示します。もし補完すべきものがない場合、1度目のTABは‘Next char not unique’と表示し、2度目のTABで補完リストバッファーが表示されます。

completion-cycle-thresholdが非nilのとき、補完コマンドは補完候補を“循環(cycle)”できます。通常ミニバッファーのテキストで1つ以上の補完候補がある場合、補完コマンドは補完できた文字までを表示します。completion-cycle-thresholdtに変更すると、補完コマンドは補完候補の中から最初の候補を表示します。それ以降の補完コマンドの呼び出しでは、その次の補完候補を循環的に表示します。completion-cycle-thresholdを数値nにすると、補完候補がn以下のときだけ循環表示の動作をします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.5 ミニバッファーヒストリー

ミニバッファーで入力したすべての引数は、ミニバッファーヒストリーリスト(minibuffer history list)に保存されているので、簡単に後でまた使うことができます。以下のコマンドにより、前の引数をすばやく探してミニバッファーに呼び出すことができます:

M-p
UP

ミニバッファーヒストリーの前のアイテム、つまり以前のアイテムに移動します(previous-history-element)。

M-n
DOWN

ミニバッファーヒストリーの次のアイテムに移動します(next-history-element)。

M-r regexp RET

regexpにマッチする、ミニバッファーヒストリーの以前のアイテムに移動します(previous-matching-history-element)。

M-s regexp RET

regexpにマッチする、ミニバッファーヒストリーの以降のアイテムに移動します(next-matching-history-element)。

ミニバッファーでのM-pまたはUP (previous-history-element)は、ミニバッファーのヒストリーリストのアイテムを1つずつ移動します。M-pはヒストリーリストの以前のアイテムを取り出して、ミニバッファーの既存の内容を置き換えます。M-nまたはDOWN (next-history-element)は、ミニバッファーのヒストリーリストを反対方向、つまり以降のエントリーを取り出してミニバッファーの既存の内容を置き換えます。

ミニバッファーヒストリーに以降のエントリーがないとき(たとえば前に1回もM-pを入力していないとき)、Emacsはデフォルト引数のリストから、あなたが入力するだろうと思われる値を取り出します。これは“未来のヒストリー”を移動すると考えることもできます。

ミニバッファーコマンドのM-pまたはM-nで挿入されたテキストを編集しても、ヒストリーリストのエントリーは変更されません。かわりに編集された引数が確定されたとき、ヒストリーリストの最後に追加されます。

M-r (previous-matching-history-element)でヒストリーリストの古い要素を、M-s (next-matching-history-element)で新しいエントリーを探すことができます。これらのコマンドはどちらも引数として正規表現(regular expression)を要求し、それにマッチした最初のエントリーをミニバッファーに取り出します。正規表現についての説明は、正規表現の構文を参照してください。数引数nを指定すると、それはn番目に一致したエントリーを取り出すことを意味します。これらのコマンドはミニバッファーから呼び出されたとはいえ、ミニバッファーを使って正規表現を読みとるという点では、変わったコマンドです。正規表現に大文字が含まれていると、大文字小文字を区別する検索(検索と大文字小文字を参照してください)となります。

ヒストリーをインクリメンタルサーチすることもできます。ミニバッファーの検索を参照してください。

Emacsは引数の種類ごとに個別のリストを保持します。たとえばファイル名のリストは、ファイル名を読みとるすべてのコマンドで使われたファイル名、といった具合です。ほかのヒストリーリストとしてはバッファー名やコマンド名(M-xで使われたもの)、コマンド引数(query-replaceのような引数で使われたもの)があります。

変数history-lengthには、ミニバッファーのヒストリーリストの最大の長さを指定します。リストが長くなりすぎたときは、一番古い要素を削除して新しい要素を追加します。tを指定したときは、長さは無制限になります。

変数history-delete-duplicatesには、重複したヒストリーを削除するかを指定します。非nilの場合、新しい要素が追加されるとリストからそれと同じ要素がすべて削除されます。デフォルトはnilです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.6 ミニバッファーでのコマンドの繰り返し

ミニバッファーを使用したコマンドはすべて、コマンドヒストリー(command history)という特別なヒストリーリストに記録されます。これにはコマンドの引数の値も記録されるので、コマンド全体を再実行できます。特にM-xはコマンド名を読みとるので、M-xを使用したものはすべてそこに記録されます。

C-x ESC ESC

コマンドヒストリーから最近のミニバッファーのコマンドを再実行します(repeat-complex-command)。

M-x list-command-history

コマンドヒストリー全体を表示します。表示されたすべてのコマンドはC-x ESC ESCで再実行できます。一番最近のものが先頭に表示されます。

C-x ESC ESCは、ミニバッファーを使った最近のコマンドを再実行します。引数を与えないと、一番最近のコマンドを実行します。数引数で再実行したいコマンドを指定します。1は一番最近のコマンド、2はその前、といった具合です。

C-x ESC ESCは、前のコマンドをLisp式に変換して、その式でミニバッファーのテキストを初期化します。Lispを知らなくても、何のコマンドが再実行用に表示されているか明白でしょう。単にRETを入力すると、コマンドを変更せずに再実行します。実行する前にLisp式を編集して、コマンドを変更できます。実行されたコマンドは、一番最近のコマンドと等しくなければ、コマンドヒストリーの一番先頭に追加されます。

C-x ESC ESCで一度ミニバッファーの中に入れば、通常のミニバッファーのヒストリーコマンド(ミニバッファーヒストリーを参照してください)を使って、ヒストリーリスト中を移動できます。以前に実行したコマンドが見つけたら、式を編集してRETにより実行できます。

厳密に言うとインクリメンタルサーチはミニバッファーを使いません。これが複雑なコマンドのように振る舞うとしても、通常はC-x ESC ESCで表示されるヒストリーリストに含まれません。ヒストリーにインクリメンタルサーチコマンドを表示させるには、isearch-resume-in-command-historyに非nilをセットしてください。インクリメンタル検索を参照してください。

ミニバッファーを使用した以前のコマンドのリストは、Lispのリスト値としてcommand-historyに格納されています。Lisp式の各要素は、1つのコマンドとその引数をあらわしています。Lispプログラムはevalcommand-historyの要素を使って呼び出すことで、コマンドを再実行できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.7 パスワードの入力

Emacsでパスワードを入力したい場合があります。たとえばEmacsにFTPのようなネットワークプロトコルを介して他のマシンのファイルをvisitし、マシンへのアクセスのためにパスワードを与える場合などです(リモートファイルを参照してください)。

パスワードの入力はミニバッファーの使用と似ています。Emacsは(‘Password: ’のような)プロンプトをエコーエリアに表示します。要求されたパスワードを入力した後、それを確定するためにRETを押します。他の人がパスワードを見るのを防ぐために、入力した文字は通常の形式ではなく、ドット(‘.’)で表示されます。

ミニバッファーに関連付けられた多くの機能およびコマンドは、パスワード入力では使用できません。ヒストリーや補完はできず、ウィンドウの変更やEmacsでの他の処理も、パスワードをsubmitするまでは行うことができません。

パスワードのタイプ中は、DELを押して後方に、すなわち最後に入力した文字から削除できます。C-uで入力したすべての文字を削除できます。C-gはパスワードプロンプトを閉じます(中止と中断を参照してください)。C-yは現在のkillリングからパスワードを挿入します(see section テキストのkillと移動)。パスワードを確定するには、RETまたはESCを入力します。他の自己挿入文字は、対応する文字をパスワードに入力します.それ以外の入力は無視されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.8 Yes or No プロンプト

Emacsのコマンドが実行の過程で、“yes or no(はい/いいえ)”形式で質問して答えを求めるかもしれません。これらの質問は大きく2つにわけることができます。

1番目の“yes or no”形式の質問は、‘(y or n)’で終わるプロンプトのものです。このような質問は、実際のところミニバッファーを使用しません。プロンプトがエコーエリアに表示され、答えを‘y’または‘n’で入力すると、ただちにそれが答えとなります。たとえばバッファーの保存でC-x C-w (write-file)を入力して既存のファイル名を入力すると、Emacsは以下のようなプロンプトを表示します:

File `foo.el' exists; overwrite? (y or n)

この質問はミニバッファーを使用しないので、通常のミニバッファー編集コマンドは使えません。しかしいくつかのウィンドウをスクロールする操作は行えます。C-lによる選択されたウィンドウの再センタリング、M-v(またはPageDownnext)による前方へのスクロール、C-v(またはPageUpprior)による後方へのスクロール、C-M-vによる次のウィンドウの前方へのスクロール、C-M-S-vによる次のウィンドウの後方へのスクロールができます。C-gは質問を打ちきり、質問を発したコマンドを終了します(中止と中断を参照してください)。

2番目の“yes or no”形式の質問は、間違った答えが深刻な事態を招くような場合に使用されます。これはミニバッファーを使い、‘(yes or no)’で終わるプロンプトという特徴があります。たとえば変更が保存されていないファイルをvisitしているバッファーで、C-x k (kill-buffer)を呼び出すと、Emacsはミニバッファーをアクティブにして以下のようなプロンプトを表示します:

Buffer foo.el modified; kill anyway? (yes or no)

これに答えるには、ミニバッファーに‘yes’または‘no’と入力してから、RETを押さなければなりません。ミニバッファーは前のセクションで説明したように動作します。C-x oによる他のウィンドウへのスイッチ、ヒストリーコマンドのM-pM-fなどが使用できます。C-gでミニバッファーを閉じて、質問を発したコマンドを終了できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9 名前を指定してコマンドを実行する

すべてのEmacsコマンドは、それを使えば実行できるような名前を持っています。使いやすいようにキーバインディングされているコマンドも、たくさんあります。これらのコマンドはキーまたは名前で実行できます。キーがバインドされていないコマンドもたくさんあり、そのようなコマンドは名前でしか実行できません(キーバインドをセットアップする方法については、キーバインディングのカスタマイズを参照してください)。

慣例によりコマンド名はauto-fill-modemanual-entryのように、ハイフンで区切られた、1つ以上の単語となっています。コマンド名は覚えやすいように、略されていない英単語が主に使われます。

コマンドを名前で実行するには、最初にM-xをタイプしてから、コマンド名をタイプしてRETで実行します。M-xはミニバッファーを使ってコマンド名を読みとります。ミニバッファーの先頭には、実行のために名前の入力が必要なことを気付かせるため、‘M-x’という文字がプロンプトとして表示されます。RETでミニバッファーを抜けだしコマンドを実行します。ミニバッファーについての詳細は、ミニバッファーを参照してください。

コマンド名の入力には補完が使用できます。たとえばforward-charを呼び出すには以下のように入力できます

M-x forward-char RET

または

M-x forw TAB c RET

forward-charは、キーC-fで呼び出されるのと同じコマンドであることに注意してください。キーバインドの存在は、名前によるコマンドの実行を妨げません。

M-xとコマンドの実行をキャンセルするには、コマンド名の入力のかわりにC-gを入力します。これによりコマンドを呼び出したレベルまで戻ります。

M-xで呼び出すコマンドに数引数を渡すには、M-xの前に数引数を指定します。引数の値はコマンド名が読みとられるときにプロンプトとして表示され、最終的にM-xは引数をコマンドに渡します。

M-xで実行するコマンドがキーバインディングを持つ場合、Emacsはコマンド実行後にその旨をエコーエリアに表示します。たとえばM-x forward-wordと入力すると、同じコマンドをM-fで実行できるというメッセージが表示されます。このメッセージは変数suggest-key-bindingsnilにセットすればオフにできます。

このマニュアルではコマンドを名前で実行するとき、名前を終了させるためのRETを省くことがあります。つまりM-x auto-fill-mode RETではなくM-x auto-fill-modeと表記します。RETはコマンドに引数がある場合に強調させる意味で使用します。

M-xexecute-extended-commandを実行します。これは他のコマンドの名前を読み取って実行するコマンドです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10 ヘルプ

Emacsはバラエティに富んだヘルプコマンドを提供しており、それらにはプレフィクスキーC-h(ファンクションキーF1でも可)からアクセスできます。以下のセクションではこれらのコマンドについて説明します。C-h C-h (help-for-help)と入力すれば、ヘルプコマンドの一覧を見ることもできます。この一覧はSPCDELでスクロールでき、それから見たいヘルプコマンドを入力するか、C-gでキャンセルできます。

多くのヘルプコマンドは、ヘルプバッファー(help buffer)という特別なバッファーに情報を表示します。このバッファーではSPCDELによりスクロールし、RETでハイパーリンクをフォローすることができます。ヘルプモードのコマンドを参照してください。

特定の機能を探しているが、それが何と呼ばれているかわからない、どこを見ればよいのかわからないときには、次の3つの方法を推奨します。まず最初にaproposコマンドを試してください。次にマニュアルのインデックスを探してください。そしてFAQとパッケージのキーワードを探してください。

C-h a topics RET

引数topicsと名前が一致するコマンドを検索します。引数にはキーワード、キーワードのリスト、正規表現(正規表現の構文を参照してください)を指定できます。Apropos(適切な)を参照してください。

C-h i d m emacs RET i topic RET

Emacsのinfoマニュアルのインデックスから、topicを検索して最初にマッチしたものを表示します。,を押すと次にマッチしたものを表示します。topicには正規表現を指定できます。

C-h i d m emacs RET s topic RET

同様ですが、インデックスではなくマニュアル本文のテキストを検索します。

C-h C-f

Infoを使ってEmacs FAQを表示します。

C-h p

キーワードに基づいて、利用可能なEmacsパッケージを表示します。パッケージのキーワード検索を参照してください。

他のさまざまなコンテキストでも、C-hF1は“ヘルプ”を意味します。たとえばプレフィクスキーの後にこれらのキーを入力すると、プレフィクスキーに続けて入力できるキーの一覧を表示することができます(このコンテキストでは?も使用できます。いくつかのプレフィクスキーはC-h?に別の意味を持たせているものがあるので使えませんが、それらのものでもF1はサポートされています)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.1 ヘルプの概要

ここではビルトインのドキュメントにアクセスする、ヘルプコマンドの要約を記します。これらの大部分については、以下のセクションで詳細を説明します。

C-h a topics RET

名前がtopicsにマッチするコマンドの一覧を表示します(apropos-command)。

C-h b

有効なキーバインディングをすべて表示します。最初はマイナーモード、次にメジャーモード、それからグローバルのバインディングを表示します(describe-bindings)。

C-h c key

キーシーケンスkeyがバインドされているコマンドの名前を表示します(describe-key-briefly)。cは“character”からきています。keyについてさらに詳しい情報を得るには、C-h kを使います。

C-h d topics RET

topicsにマッチするドキュメントをもつ、コマンドまたは変数を表示します(apropos-documentation)。

C-h e

バッファー*Messages*を表示します(view-echo-area-messages)。

C-h f function RET

functionという名前の、Lisp関数のドキュメントを表示します(describe-function)。コマンドもLisp関数なので、これはコマンドにも使用できます。

C-h h

ファイルHELLOを表示します。このファイルは様々な文字セットの例です。

C-h i

GNUドキュメントブラウザー(info)を実行します。Emacsのマニュアルはinfoで利用できます。

C-h k key

keyで実行されるコマンドの名前と、ドキュメントを表示します(describe-key)。

C-h l

最近のキーストローク300回分の説明を表示します(view-lossage)。

C-h m

現在のメジャーモードのドキュメントを表示します(describe-mode)。

C-h n

最近のEmacsの変更に関するニュースを表示します(view-emacs-news)。

C-h p

トピックのキーワードでパッケージを見つけます(finder-by-keyword)。これはパッケージメニューバッファーを使ってパッケージを一覧します。Emacs Lispパッケージを参照してください。

C-h P package RET

指定したパッケージのドキュメントを表示します(describe-package)。

C-h r

Emacsのマニュアルをinfoで表示します(info-emacs-manual)。

C-h s

現在の構文テーブル(syntax table)を表示します(describe-syntax)。構文テーブルは、どの文字が開始デリミッターで、その文字が単語の一部なのかを定義します。詳細については、Syntax Tables in The Emacs Lisp Reference Manualを参照してください。

C-h t

Emacsの対話的なチュートリアルを開始します(help-with-tutorial)。

C-h v var RET

Lisp変数varのドキュメントを表示します(describe-variable)。

C-h w command RET

commandという名前のコマンドを実行するキーを表示します(where-is)。

C-h C coding RET

コーディングシステムcodingを説明します(describe-coding-system)。

C-h C RET

現在使用されているコーディングシステムを説明します。

C-h F command RET

infoを開始して、Emacsコマンドcommandのドキュメントのノードに移動します(Info-goto-emacs-command-node)。

C-h I method RET

インプットメソッドmethodを説明します(describe-input-method)。

C-h K key

infoを開始して、キーシーケンスkeyのドキュメントのノードに移動します(Info-goto-emacs-key-command-node)。

C-h L language-env RET

言語環境(language environment)language-envで使用される文字セット、コーディングシステム、インプットメソッドに関する情報を表示します。

C-h S symbol RET

編集中のプログラム言語に基づいて、シンボルsymbolのinfoドキュメントを表示します(info-lookup-symbol)。

C-h .

ポイントが特別なテキスト領域のとき(これには、たとえば*Help*のリンクなどが含まれます)、ヘルプメッセージを表示します(display-local-help)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2 キーのドキュメント

キーシーケンスに関する情報を得るためのヘルプコマンドは、C-h c (describe-key-briefly)とC-h k (describe-key)です。

C-h c keyは、keyにバインドされているコマンドの名前を、エコーエリアに表示します。たとえばC-h c C-fは、‘forward-char’と表示します。

C-h k keyも同様ですが、さらに多くの情報が得られます。これはコマンドが何をするかが正確に説明する、ドキュメント文字列(documentation string)を含むヘルプバッファーを表示します。

C-h K keyは、keyに対応するコマンドが説明されている、Emacsマニュアルのセクションを表示します。

C-h cC-h kC-h Kはファンクションキー、メニュー、マウスイベントを含む、任意のキーシーケンスにたいして動作します。たとえばC-h kの後で、メニューバーからメニューアイテムを選択すれば、それにより実行されるコマンドのドキュメントが表示されます。

C-h w command RETは、commandがバインドされているキーをリストします。リストはエコーエリアに表示されます。コマンドがキーにバインドされていないとき、それはM-xを使って実行しなければならないことを意味します。C-h wはコマンドwhere-isを実行します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.3 コマンドと変数名のヘルプ

C-h f function RET (describe-function)は、Lisp関数functionのドキュメントをウィンドウに表示します。コマンドもLisp関数なので、この方法を使えば、名前を知っている任意のコマンドのドキュメントを閲覧できます。たとえば

C-h f auto-fill-mode RET

auto-fill-modeのドキュメントを表示します。これはキーにバインドされていないコマンド(通常M-xで実行する)のドキュメントを閲覧する、唯一の方法です。

C-h fは、LispプログラムからLisp関数を使うときも便利です。たとえば式(make-vector len)を書いたとしましょう。正しく(make-vector len)を使っているかチェックしたいときは、C-h f make-vector RETと入力します。C-h fはコマンド名だけでなくすべての関数名を許容するので、M-xでは機能するいつもの補完による短縮形が、C-h fでは機能しないと気付くかもしれません。コマンド名では省略形が一意であっても、すべての関数名を含めたら一意ではないかもしれないからです。

C-h f RETを入力すると、バッファーのポイントがある位置の、一番内側のLisp式で呼び出されている関数の名前が有効で、Lisp関数として定義されていれば、その関数の説明が表示されます(引数を入力するときデフォルトとして関数名が表示されます)。たとえばポイントが‘(make-vector (car x)’の後ろにあるとき、ポイントを含む一番内側のリストは‘(make-vector’で始まっているので、C-h f RETにより関数make-vectorの説明が表示されます。

C-h fは、関数名を正しく記述しているか確かめたいときも便利です。C-h fのミニバッファーのプロンプトで、編集中のバッファーの関数名がデフォルトとして表示されるなら、それは定義されたLisp関数であることを意味します。本当にドキュメントを見たい訳でなければ、C-gを押してコマンドC-h fをキャンセルできます。

C-h v (describe-variable)は、C-h fと似ていますがLisp関数ではなく、Lisp関数の説明を表示します。ポイントの周囲または前にあるLispシンボルが、定義されたLisp変数名のときはそれがデフォルトとなります。変数を参照してください。

通常Emacsの変数または関数を説明するヘルプバッファーには、ソースファイルがインストールされていれば、対応するソースコードへのハイパーリンクが含まれています(ハイパーリンクと操作機能を参照してください)。

マニュアルからコマンドのドキュメントを探すには、C-h F (Info-goto-emacs-command-node)を使います。これはEmacsのマニュアルだけでなく、さまざまなマニュアルを認識するので、正しいものを見つけられるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.4 Apropos(適切な)

apropos(折よい、適切な)コマンドは、“What are the commands for working with files?(ファイルを処理するコマンドは?)”のような質問に答えるものです。より正確に言うと単語、単語のリスト、正規表現によって、aproposパターンを指定します。

以下の各aproposコマンドは、ミニバッファーでaproposパターンを読み取り、パターンにマッチするアイテムを検索して、結果を別のウィンドウに表示します。

C-h a

コマンドを検索します(apropos-command)。プレフィクス引数を指定すると、非インタラクティブな関数も検索します。

M-x apropos

関数と変数を検索します。これを使えばインタラクティブな関数(コマンド)と非インタラクティブな関数の両方を検索できます。

M-x apropos-user-option

ユーザーがカスタマイズできる関数を検索します。プレフィクス引数を指定すると、カスタマイズできない変数も検索します。

M-x apropos-variable

変数を検索します。プレフィクス引数を指定すると、カスタマイズできる変数だけを検索します。

M-x apropos-value

指定したパターンにマッチする値の変数を検索します。プレフィクス引数を指定すると、定義がパターンにマッチする関数と、プロパティーリストがパターンにマッチする、Lispシンボルも検索します。

C-h d

指定されたパターンにマッチするドキュメント文字列の関数、または変数を検索します(apropos-documentation)。

最も簡単な種類のaproposパターンは単語です。その単語が含まれていれば、パターンにマッチします。ファイルを処理するコマンドを探すには、C-h a file RETと入力します。これはcopy-filefind-fileなどの、名前に‘file’を含むすべてのコマンドの一覧を表示します。各コマンド名には簡単な説明と、それを呼び出すためのキーの一覧が一緒に表示されます。この例だと、find-fileC-x C-fで呼び出せることがわかります。

aproposバッファーの関数定義、変数、シンボルの属性についてもっと情報が欲しいときは、Mouse-1またはMouse-2でクリックするか、そこに移動してRETを押してください。

2つ以上の単語をaproposパターンに指定したときは、マッチするために少なくとも名前に2つの単語が含まれていなければなりません。たとえばポイントの前のテキストをkillするコマンドを探すときは、C-h a kill back backward behind before RETなどと試みることができます。これは実際のコマンド名kill-backwardにマッチするでしょう。もしkill-text-beforeというコマンドがあったなら、これも指定した単語を2つ含んでいるのでマッチします。

より一層フレキシビリティを高めるために、正規表現(see section 正規表現の構文)を指定できます。aproposパターンに正規表現の特殊文字‘^$*+?.\[’が含まれていると、それは正規表現として扱われます。

Emacsコマンド命名の慣習に従うと、aproposパターンとして便利な単語がいくつかあります。これらをC-h aで使うことにより、命名の慣習の必要性を感じることができるでしょう。

char、line、word、sentence、paragraph、region、page、sexp、list、defun、rect、buffer、frame、window、face、file、dir、register、mode、beginning、end、forward、backward、next、previous、up、down、search、goto、kill、delete、mark、insert、yank、fill、indent、case、change、set、what、list、find、view、describe、default

変数apropos-do-allが非nilの場合、aproposコマンドは常にプレフィクス引数が指定されたものとして振る舞います。

デフォルトでは、apropos-documentationを除くすべてのaproposコマンドは、結果をアルファベット順に一覧します。変数apropos-sort-by-scoresが非nilのときは、かわりに結果の関連度を推測して、一番関連度が高いと思われるものを最初に表示します。apropos-documentationコマンドは、デフォルトで結果を関連度順で一覧します。これをアルファベット順にするには、変数apropos-documentation-sort-by-scoresnilに変更してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5 ヘルプモードのコマンド

ヘルプバッファーはViewモード(Viewモードを参照してください)と同じコマンドを提供します。たとえば前方へのスクロールはSPC、後方へのスクロールはDELS-SPCです。他にも特別なコマンドをいくつか提供します:

RET

ポイント位置のクロスリファレンス先をフォローします(help-follow)。

TAB

ポイントを次のハイパーリンクへ進めます(forward-button)。

S-TAB

ポイントを前のハイパーリンクへ戻します(backward-button)。

Mouse-1
Mouse-2

クリックしたハイパーリンク先をフォローします。

C-c C-c

ポイント位置のシンボルに関する、すべてのドキュメントを表示します(help-follow-symbol)。

C-c C-b

前のヘルプトピックに戻ります(help-go-back)。

もし関数名、変数名、フェイス名(テキストのフェイスを参照してください)がヘルプバッファーのドキュメントにあると、通常はアンダーラインされたハイパーリンク(hyperlink)として表示されます。関連するドキュメントを閲覧するには、ポイントをそこに移動してRET (help-follow)をタイプするか、ハイパーリンクをMouse-1またはMouse-2でクリックします。するとヘルプバッファーの内容が入れ替わりますが、C-c C-b (help-go-back)で元に戻すことができます。

ヘルプバッファーには、infoマニュアル、ソースコード定義、URL(ウェブページ)へのハイパーリンクを含むこともできます。最初の2つはEmacs上で表示され、3番目のURLはコマンドbrowse-urlにより、ウェブブラウザーを使って表示されます。

ヘルプバッファーでは、TAB (forward-button)はポイントを次のハイパーリンクへ進め、S-TAB (backward-button)は前のハイパーリンクへ戻します。これらのコマンドは循環的です。たとえば最後のハイパーリンクでTABをタイプすると、最初のハイパーリンクに戻ります。

テキスト中のシンボルに関するすべてのドキュメントを閲覧するには、ポイントをそこに移動してC-c C-c (help-follow-symbol)とタイプします。これはシンボル(変数、関数、フェイス)に関する、すべての利用可能なドキュメントを表示します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.6 パッケージのキーワード検索

Emacsのたいていのオプション機能は、パッケージ(packages)にグループ化されています。Emacsには数百のビルトインパッケージが含まれており、ネットワークを通じて他のパッケージのインストールもできます(Emacs Lispパッケージを参照してください)。

あるトピックに関連するパッケージを探すのを簡単にするため、ほとんどのパッケージは、それが何をするかにもとづき、1つ以上のキーワード(keywords)に関連付けられています。C-h p (finder-by-keyword)とタイプすると、パッケージキーワードとキーワードの意味を説明するリストが表示されます。キーワードに属するパッケージのリストを表示するには、そのキーワードの行でRETをタイプします。これによりパッケージメニューバッファー(Package Menuバッファーを参照してください)で、パッケージの一覧が表示されます。

C-h P (describe-package)はパッケージ名の入力を求めて、パッケージの属性と、それが実装する機能をヘルプバッファーで表示します。このバッファーは、ボタン形式で関連するパッケージのキーワードを一覧します。ボタンをクリックすると、そのキーワードに関連する他のパッケージを見ることができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.7 国際化言語のサポートに関するヘルプ

特定の言語環境(language environment: 言語環境を参照してください)の情報を得るには、C-h Lとタイプします。これはヘルプバッファーを開いて、言語環境でサポートされる言語の説明と、関連する文字セット、コーディングシステム、インプットメソッド、およびその言語環境のサンプルテキストを表示します。

コマンドC-h h (view-hello-file)は、ファイルetc/HELLOを表示します。このファイルはさまざまな言語で“hello”をどのように言うのかを、いろいろな文字セットで表示するデモンストレーションです。

コマンドC-h I (describe-input-method)は、指定されたインプットメソッド、または現在使われているインプットメソッド(デフォルト)の説明します。インプットメソッドを参照してください。

コマンドC-h C (describe-coding-system)は、指定されたコーディングシステム、または現在使われているものを説明します。コーディングシステムを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.8 その他のヘルプコマンド

C-h i (info)は、infoプログラムを実行します。infoは構造化されたドキュメントファイルを閲覧するものです。Emacsマニュアル全体は、GNUシステムのための他のマニュアルとともに、infoで利用可能です。infoを開始した後、hをタイプすると、infoの使い方のチュートリアルが実行されます。

数引数nを指定すると、C-h iはinfoバッファー‘*info*<n>’を選択します。これは同時に複数のinfoマニュアルを閲覧するとき便利です。プレフィクス引数C-uだけを指定した場合、C-h iはドキュメントのファイル名を尋ねるので、infoメニューのトップレベルにエントリーがないファイルでも閲覧できます。

上記で説明しているヘルプコマンドC-h F function RETC-h K keyは、infoを実行して関数(function)またはキー(key)に関するドキュメントを直接開きます。

プログラムを編集しているとき、そのプログラム言語のinfo版のマニュアルを持っていれば、C-h S (info-lookup-symbol)を使ってシンボル(キーワード、関数、変数)のエントリーを、適切なマニュアルから探すことができます。コマンドがどのように動作するかの詳細は、メジャーモードに依存します。

何か予期しないことが起こって、何をタイプしたかわからなくなったときは、C-h l (view-lossage)を使います。C-h lは最近の300回分のキーストロークを表示します。身に覚えのないキー入力を見つけたら、C-h cを使えばそのキーが何を行うか調べることができます。

最近のエコーエリアのメッセージを調べるには、C-h e (view-echo-area-messages)を使います。これはそれらのメッセージを保持するバッファー、*Messages*を表示します。

Emacsの各メジャーモードでは、一般的にいくつかのキーが再定義されていて、編集動作も異なります。C-h m (describe-mode)は、現在のメジャーモードのドキュメントを表示します。これには通常このモードで変更されているコマンドや、機能が説明されています。

C-h b (describe-bindings)とC-h s (describe-syntax)は、現在のEmacs環境に関する、それ以外の情報を表示します。最初は現在のマイナーモードのローカルバインディング、次に現在のメジャーモードで定義されているローカルバインディング、最後にグローバルバインディングが表示されます。C-h sは各文字の構文の説明とともに、構文テーブルの内容を表示します(Syntax Tables in The Emacs Lisp Reference Manualを参照してください)。

プレフィクスキーの後にC-h?F1をタイプすることにより、特定のプレフィクスキーにたいする、サブコマンドのリストを得ることができます(この方法が機能しないプレフィクスキーもあります。たとえばESCです。ESC C-hは実際にはC-M-hと解釈され、これはdefunをマークするコマンドです。このような場合でもESC F1ESC ?はうまく機能します)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.9 ヘルプファイル

ビルトインのドキュメントとマニュアル以外にも、Emacsにはコピー条件(copying conditions)、リリースノート(release notes)、デバッグ説明書(instructions for debugging)、バグ報告(reporting bugs)などのトピックを説明する、いくつかのファイルが含まれています。これらのファイルは、以下のコマンドで閲覧することができます。C-h gをのぞき、これらはすべて、C-h C-charという形式になっています。

C-h C-c

Emacsをコピー、再頒布する場合の規則を表示します(describe-copying)。

C-h C-d

Emacsをデバッグするためのヘルプを表示します(view-emacs-debugging)。

C-h C-e

外部のパッケージをどこで入手するかについての情報を表示します(view-external-packages)。

C-h C-f

EmacsのFAQ(frequently-answered-questions: 頻繁に答えられる質問)のリストを表示します(view-emacs-FAQ)。

C-h g

GNUプロジェクトに関する情報を表示します(describe-gnu-project)。

C-h C-m

Emacsマニュアルの印刷されたコピーの注文に関する情報を表示します(view-order-manuals)。

C-h C-n

このバージョンの新しい機能の一覧が含まれる“news”ファイルを表示します(view-emacs-news)。

C-h C-o

Emacsおよび他のGNUソフトウェアーの最新バージョンを、注文またはダウンロードする方法を表示します(describe-distribution)。

C-h C-p

Emacsの既知の問題(それにどう対処するかの提案がある場合もあります)を表示します(view-emacs-problems)。

C-h C-t

EmacsのTODOリストを表示します(view-emacs-todo)。

C-h C-w

GNU Emacsが完全に無保証なことにたいする、すべての詳細を表示します(describe-no-warranty)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.10 アクティブテキストのヘルプとツールチップ

Emacsでは拡大解釈される“アクティブテキスト(active text: マウスのクリックやRETに特別な反応をするテキスト)”は、しばしばヘルプテキストに関連付けられています。これにはEmacsのバッファーのハイパーリンク、同様にモードラインの一部が含まれます。グラフィカルなディスプレー、同様にいくつかのテキスト端末は、マウストラッキングをサポートしており、アクティブテキストの上をマウスが通過することにより、ヘルプテキストをツールチップ(tooltip)で表示します。ツールチップを参照してください。

マウストラッキングをサポートしない端末では、バッファーのアクティブテキストにポイントを移動して、C-h . (display-local-help)をタイプすれば、ヘルプテキストを表示できます。これはヘルプテキストをエコーエリアに表示します。ポイントがある場所のヘルプテキストが利用可能な場合に、常に表示させるには、変数help-at-pt-display-when-idletをセットしてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11 マークとリージョン

Emacsのコマンドには、現在のバッファー内の、任意の連続する領域(region)を操作するものがたくさんあります。そのようなコマンドが操作するテキストを指定するには、領域の一方の端にマーク(mark)をセットし、もう一方の端にポイントを移動します。ポイントとマークの間のテキストを、リージョン(region)と呼びます。リージョンは常にポイントとマークの間で拡張され、それは一方がテキストの先頭にある場合も変わりません。ポイントを移動すれば、常にリージョンは変化します。

テキストのある位置にマークをセットすると、マークはアクティブ(active)になります。マークがアクティブのときは、リージョンもアクティブになります。Emacsはアクティブなリージョンの中にあるテキストを、フェイスregionでハイライト表示します(フェイスのカスタマイズを参照してください)。

バッファーのテキストを変更するコマンドを含む、特定の非移動系コマンド(non-motion commands)の後で、Emacsは自動的にマークを非アクティブ(deactivates)にし、これによりハイライトも解除されます。C-gをタイプすれば、いつでも明示的に非アクティブにすることができます(中止と中断を参照してください)。

上記のデフォルト動作は、Transient Markモード(暫定マークモード)という名で知られています。Transient Markモードを無効にすると、Emacsは通常ではリージョンをハイライトしなくなります。Transient Markモードを無効にするを参照してください。

あるバッファーでマークをセットしても、他のバッファーのマークは影響を受けません。アクティブなマークがあるバッファーに戻ったとき、マークは以前と同じ場所にあります。複数のウィンドウで同じバッファーを表示しているとき、これらのウィンドウはそれぞれのポイント位置をもっているので、リージョンも異なります。しかしこれらのウィンドウでは、マークの位置は共通です。複数ウィンドウを参照してください。通常、選択されたウィンドウのリージョンだけがハイライトされます。しかし変数highlight-nonselected-windowsが非nilの場合、各ウィンドウのリージョンがハイライトされます。

“rectangular region(矩形リージョン)”という、違う種類のリージョンもあります。矩形領域(Rectangles)を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.1 マークのセット

マークをセットするためのコマンドがいくつかあります:

C-SPC

ポイント位置にマークをセットしてアクティブにします(set-mark-command)。

C-@

同じです。

C-x C-x

ポイント位置にマークをセットしてアクティブにしてから、以前のマークがあった位置にポイントを移動します(exchange-point-and-mark)。

Drag-Mouse-1

ドラッグしたテキストの周りにポイントとマークをセットします。

Mouse-3

ポイント位置にマークをセットしてから、クリックした場所にポイントを移動します(mouse-save-then-kill)。

シフトを押したカーソル移動キー

マークが非アクティブなら、ポイント位置にマークをセットしてポイントを移動します。シフト選択を参照してください。

マークをセットするもっとも一般的な方法は、C-SPC (set-mark-command)です5。これはポイントがある位置にマークをセットしてから、アクティブにします。その後、マークをそこに残したままポイントを移動できます。

たとえばバッファーの一部を大文字に変換したいとします。これを行うには対象のテキストの一方の端に移動して、C-SPCをタイプし、対象のテキストがハイライトされるまでポイントを移動します。そしてC-x C-u (upcase-region)をタイプすると、リージョンのテキストが大文字に変換されて、マークが非アクティブになります。

マークがアクティブなときに非アクティブにしたいときは、C-gをタイプします(中止と中断を参照してください)。リージョンにたいして操作を行うほとんどのコマンドは、上記の例のC-x C-uのように、自動的にマークを非アクティブにします。

リージョンにたいしての操作は行わず、バッファーの位置を“覚えておく”ためにマークをセット(C-SPC C-SPCとタイプ)して、後でそこに戻る(C-u C-SPCとタイプ)こともできます。詳細については、マークリングを参照してください。

コマンドC-x C-x (exchange-point-and-mark)は、ポイントとマークの位置を交換します。ポイントの位置に問題はないが、リージョンのもう一方の端にポイントを移動したいときC-x C-xは便利です。2回目のC-x C-xで、マークを新しいポイント位置にマークをセットしてから、ポイントを元の位置に戻すことができます。このコマンドはマークが非アクティブのとき、最初にマークをアクティブにします。これはマークが最後にどこにセットされたかを明確にするために、リージョンをハイライトするためです。しかしプレフィクス引数とともに呼び出せば、マークは非アクティブのままでリージョンもハイライトされません。これを使えばC-u C-SPCと同様の方法で、マークの位置にジャンプできます。

マウスでマークをセットすることもできます。マウスの左ボタン(down-mouse-1)をクリックしてから、テキスト範囲をドラッグすると、最初にマウスボタンを押した位置にマークがセットされ、マウスボタンを話した位置にポイントが置かれます。かわりにマウスの右ボタン(mouse-3)をクリックすれば、ポイントのある位置にマークがセットされ、クリックした位置にポイントが移動します。これらのマウスコマンドに関する詳細な説明は、編集のためのマウスコマンドを参照してください。

最後にシフトキーを押しながらカーソルを移動するコマンド(S-RIGHTS-C-fS-C-nなど)でマークをセットできます。これはシフト選択(shift-selection)と呼ばれ、(シフト選択するときにアクティブなマークがないときに限り)ポイントを移動する前の位置にマークをセットします。マウスコマンドやシフト選択によるマークのセットは、通常のマークとは少し異なります。続けてシフトを押さないカーソル移動コマンドを実行するにより、マークは自動的に非アクティブになります。詳細は、シフト選択を参照してください。

C-y (yank)のようなテキストを挿入するコマンドの多くは、挿入されたテキストの先頭に、非アクティブなマークをセットします。これにより簡単にその位置に戻ることができます(マークリングを参照してください)。コマンドがこれを行っていることは、エコーエリアに‘Mark set’が表示されることで見分けることができます。

Xではアクティブなリージョンが変化するたびに、Emacsはリージョンのテキストをプライマリー選択(primary selection)に保存します。これによりmouse-2をクリックして、他のXアプリケーションへテキストを挿入することができるようになります。他のウィンドウアプリケーションにたいするカットアンドペーストを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2 テキストオブジェクトをマークするコマンド

単語(word)、リスト(list)、パラグラフ(paragraph: 段落)、ページ(page)などのテキストオブジェクトの周辺に、ポイントを配置してマークするコマンドがあります:

M-@

次の単語の末尾の後にマークをセットします(mark-word)。ポイントは移動しません。

C-M-@

次の対応のとれた式の後にマークをセットします(mark-sexp)。ポイントは移動しません。

M-h

ポイントを現在のパラグラフの先頭に移動して、パラグラフの最後にマークをセットします(mark-paragraph)。

C-M-h

ポイントを現在のdefunの先頭に移動して、defunの最後にマークをセットします(mark-defun)。

C-x C-p

ポイントを現在のページの先頭に移動して、ページの最後にマークをセットします(mark-page)。

C-x h

ポイントを現在のバッファーの先頭に移動して、バッファーの最後にマークをセットします(mark-whole-buffer)。

M-@ (mark-word)は、次の単語の最後にマークをセットします(単語についての情報は、単語を参照してください)。繰り返し呼び出されると、マークを1度に1単語進めてリージョンを拡張します。例外として、マークがアクティブでポイントの前にある場合、M-@はマークを現在の位置から1単語後方に移動します。

このコマンドに数引数nを指定することにより、n単語進めてマークするよう指定できます。負の引数はn単語後方にマークを移動します。

同様にC-M-@ (mark-sexp)は、対応のとれた式の最後にマークをセットします(対応が取れたカッコの式を参照してください)。繰り返し呼び出すことにより、後続の式にリージョンを拡張します。正または負の数引数を指定するとその数に応じて前方または後方にマークを移動します。

上記のリストの他のコマンドは、ポイントとマークの両方をセットするので、バッファー内のオブジェクトを区切るコマンドです。M-h (mark-paragraph)はパラグラフ(パラグラフを参照してください)、C-M-h (mark-defun)はトップレベルの関数定義(defunの移動を参照してください)、C-x C-p (mark-page)はページ(ページを参照してください)をマークします。繰り返して呼び出すと、同種の連続するオブジェクトへと、リージョンを拡張します。数引数も同様で、マークを移動したいオブジェクトの数を指定します。

C-x h (mark-whole-buffer)はポイントをバッファーの先頭、マークを最後にセットすることによりバッファー全体をリージョンとします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.3 リージョンを操作する

一度リージョンを設定すると、それを処理するいくつかの方法があります:

マークが非アクティブのときにはデフォルトの動作をするが、マークがアクティブのときはリージョンを処理するコマンドがいくつかあります。たとえばM-$ (ispell-word)は、通常はポイントのある単語のスペルをチェックしますが、マークがアクティブのときはリージョンの中のテキストをチェックします(スペルのチェックと訂正を参照してください)。通常そのようなコマンドはリージョンが空のとき(たとえばマークとポイントが同じ位置のとき)は、デフォルトの動作をします。空のリージョンにたいして処理を行いたいときは、変数use-empty-active-regiontに変更してください。

テキストの消去で説明したように、DEL (backward-delete-char)とdelete (delete-forward-char)もこの方法で動作します。マークがアクティブのときはリージョンのテキストを削除します(例外として数引数nに1以外が指定されたとき、これらのコマンドはマークがアクティブか関係なく、n文字を削除します)。変数delete-active-regionnilに変更すると、これらのコマンドはマークがアクティブのとき異なる動作をしなくなります。これをkillに変更するとリージョンを削除するかわりに、killするようになります(テキストのkillと移動を参照してください)。

その他のコマンドにはデフォルトの動作はなく、常にリージョンを処理します。通常このようなコマンドには、C-w (kill-region)やC-x C-u (upcase-region)のように、名前にregionがついています。マークが非アクティブのときは“非アクティブなリージョン”、すなわちポイントと最後にマークをセットした位置の間にあるテキストにたいして処理を行います(マークリングを参照してください)。この動作を無効にするには、変数mark-even-if-inactivenilに変更してください。そうするとこれらのコマンドはマークが非アクティブのときエラーをシグナルします。

デフォルトでは、マークがアクティブでもテキストの挿入は普通に行われます。たとえばaをタイプすると、‘a’が挿入されてからマークが非アクティブになります。マイナーモードのDelete Selectionモードを有効にしていると、マークがアクティブなときは、最初にリージョンのテキストを削除してから、テキストが挿入されます。Delete Selectionモードをオフにするには、M-x delete-selection-modeとタイプしてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.4 マークリング

各バッファーは、マークリング(mark ring)の中に、以前のマークの位置を記録しています。マークをセットするコマンドは、古いマークをこのリングにpushします。マークリングの1つの使い方として、後で戻りたい場所を記録させる使い方があります。

C-SPC C-SPC

マークをアクティブにせずにマークをセットしてから、マークリングにpushします。

C-u C-SPC

マークがあった場所にポイントを移動し、マークリングから1つ前のマークを復元します。

コマンドC-SPC C-SPCは、後で戻ってきたい位置をマークするときに便利です。これは現在の位置をマークを(Emacsがリージョンをハイライト表示してしまう)アクティブにすることなく、マークリングにpushします。実際にこれはC-SPC (set-mark-command)を連続して2回呼び出しています。最初のC-SPCはマークをセットし、2回目のC-SPCはそれを非アクティブにしています(Transient Markモードがオフの場合、C-SPC C-SPCは一時的にTransient Markモードを有効にします。Transient Markモードを無効にするを参照してください)。

マークした位置に戻るには、C-u C-SPCのようにプレフィクス引数を指定して、set-mark-commandを使います。これはマークがあった場所にポイントを移動して、もしマークがアクティブのときは非アクティブにします。C-u C-SPCを連続して呼び出すと、マークリングに保存された前の位置へジャンプしていきます。この方法で移動した位置の情報は失われません。それらはリングの最後に移動します。

set-mark-command-repeat-popを非nilにセットすると、C-u C-SPCの後に続けて、C-u C-SPCではなく、C-SPCでマークリングを巡回できます。デフォルトではset-mark-command-repeat-popnilです。

各バッファーは自身のマークリングを持ちます。すべての編集コマンドは現在のバッファーのマークリングを使います。特にC-u C-SPCは常に同じバッファーに留まります。

変数mark-ring-maxは、マークリングに保持する最大のエントリー数を指定します。デフォルトは16エントリーです。もしエントリー数が最大の場合、他のエントリーをpushするとリストの一番古いものが捨てられます。C-u C-SPCを繰り返すと、リングの現在位置を巡回します。

もし何度も同じ場所に戻りたいときは、マークリングでは不十分でしょう。そのような場合は後で使うために、その位置をレジスターに記録できます(レジスターに位置を保存するを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5 グローバルマークリング

各バッファーに属する普通のマークリングに加えて、Emacsにはグローバルマークリング(global mark ring)が1つあります。以前マークをセットしてからバッファーを切り替えた場合、マークをセットすると、マークはカレントバッファーのマークリングに加えて、グローバルマークリングにも記録されます。その結果、グローバルマークリングには訪れていたバッファーの系列が記録され、各バッファーではマークを設定した箇所が記録されます。グローバルマークリングの長さは、global-mark-ring-maxで制御され、デフォルトは16です。

コマンドC-x C-SPC (pop-global-mark)は、グローバルリングの最新のバッファー位置にジャンプします。これもリングを巡回するので、連続してC-x C-SPCを使うことにより、古いバッファーのマーク位置に移動します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.6 シフト選択

シフトキーを押しながらカーソル移動コマンドをタイプすると、ポイントを移動する前の位置にマークをセットするので、リージョンが元のポイント位置から新しいポイント位置に拡張されます。この機能はシフト選択(shift-selection)と呼ばれます。これは他のエディターでテキストを選択する方法と似ています。

シフト選択によるマークのセットは、これまでの説明とは少し異なる振る舞いをします。最初に、マークを非アクティブにする通常の方法(バッファーのテキストを変更したりC-gをタイプするなど)に加え、シフトキーを押さない(unshifted)カーソル移動コマンドでも、マークが非アクティブになります。次に、連続するシフトキーを押した(shifted)カーソル移動コマンドでは、マークの更新はされません。つまりシフトキーを押しながらカーソル移動コマンドを繰り返すと、リージョンは継続的に変更されます。

シフト選択は、シフトキーを押したカーソル移動キーが、別のコマンドにバインドされていない場合のみ動作します(カスタマイズを参照してください)。たとえばS-C-fを他のコマンドにバインドしていると、S-C-fはシフト選択バージョンのC-f (forward-char)ではなく、バインドされたコマンドを実行します。

マウスコマンドによるマークのセットも、シフト選択によるマークのセットと同様です(マークのセットを参照してください)。たとえばマウスをドラッグしてリージョンを指定すると、シフトキーを押したカーソル移動コマンドを使って、そのリージョンの拡張を続けることができます。どちらのケースも、シフトキーを押さないカーソル移動コマンドで、マークが非アクティブになります。

シフト選択をオフにするには、shift-select-modenilにセットしてください。これをセットしても、マウスコマンドによるマークのセッティングは無効になりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7 Transient Markモードを無効にする

マークとリージョンのデフォルト動作では、マークをアクティブにセットすると、リージョンがハイライトされます。これはTransient Markモードと呼ばれます。これはデフォルトで有効になっているマイナーモードです。M-x transient-mark-mode、または‘Options’メニューの‘Active Region Highlighting’で切り替えることができます。オフにすることによりEmacsの操作モードは変更されます。

Transient Markモードがオフのときは、C-SPC C-SPCまたはC-u C-x C-xを使って一時的にアクティブにすることができます。

C-SPC C-SPC

ポイント位置にマークをセット(普通のC-SPCと同様)して、マークが非アクティブになるまでの間、1度だけTransient Markモードを有効にします(実際にはこれは独立したコマンドではなくC-SPCコマンドを2回行っています)。

C-u C-x C-x

ポイントとマークを交換してからマークをアクティブにして、次にマークが非アクティブになるまでの間、Transient Markモードを一時的に有効にします(これはプレフィクス引数を指定したC-x C-x (exchange-point-and-mark)コマンドです)。

これらのコマンドはマークをセットまたはアクティブにして、マークが非アクティブになるまでの間Transient Markモードを有効にします。これらを使う1つの理由は、いくつかのコマンドはTransient Markモードがオフのとき、リージョンにたいしてではなくバッファー全体を処理するからです。Transient Markモードを一時的に有効にできれば、これらのコマンドをリージョンにたいして処理させることができます。

リージョンをマウス(マークのセットを参照してください)、またはシフト選択(シフト選択を参照してください)で指定したときも、一時的にTransient Markモードが有効になり、リージョンがハイライトされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12 テキストのkillと移動

Emacsでkillとはテキストを消去して、killリングにコピーすることを意味します。yankとは、killリングからテキストを取り出して、バッファーに戻すことを意味します(“cut(カット、切り取り)”と“paste(ペースト、貼り付け)”という用語を使うアプリケーションもあります)。これはテキストブロックのセットが、循環的にアクセスできるリングに格納されているイメージから、killリングと名付けられました。killリングを参照してください。

killとyankは、Emacsでテキストを移動したりコピーするための、もっとも一般的な方法です。これは用途が広いコマンドです。なぜなら、多くの異なる種類の構文単位をkillするためのコマンドが存在するからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1 削除とkill

バッファーからテキストを消去するコマンドの多くは、それをkillリングに保存します。これらはkillコマンドとして知られており、通常名前に‘kill’が含まれます(例 kill-line)。killリングには、最近killしたものが、1つだけではなくいくつか格納されているので、killはとても安全な操作と言えます。なぜなら、以前にkillしたテキストが失われる心配をする必要がないからです。killリングは、すべてのバッファーで共有されているので、あるバッファーでkillしたテキストを、別のバッファーにyankすることができます。

C-/ (undo)を使うと、killコマンドはアンドゥ(Undo(取り消し)を参照してください)されるので、killしたテキストはバッファーに戻されますが、killリングからは削除されません。

グラフィカルなディスプレーでは、テキストをkillすると、それはシステムのクリップボードにもコピーされます。 グラフィカルなディスプレーでのカットアンドペーストを参照してください。

テキストを消去してkillリングに保存しないコマンドは、削除(delete)コマンドとして知られており、名前に‘delete’が含まれています。これらはC-d (delete-char)やDEL (delete-backward-char)のように、一度に1文字削除するものや、スペースや改行だけを削除するものが含まれます。重要なデータの有意な量を消去するコマンドには、一般的にkill操作が用いられます。

killとyankでマウスを使うこともできます。グラフィカルなディスプレーでのカットアンドペーストを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1.1 削除

削除とは、テキストを消去してkillリングに保存しないという意味です。テキストを削除するたいていのEmacsコマンドは、1文字または空白文字しか消去しません。

DEL
BACKSPACE

前の文字を削除します。リージョンがアクティブのときは、リージョンのテキストを削除します(delete-backward-char)。

Delete

次の文字を削除します。リージョンがアクティブのときは、リージョンのテキストを削除します(delete-forward-char)。

C-d

次の文字を削除します(delete-char)。

M-\

ポイントの周囲のスペースとタブを削除します(delete-horizontal-space)。

M-SPC

スペースを1つ残して、ポイントの周囲のスペースとタブを削除します(just-one-space)。

C-x C-o

現在行の周囲の空行を削除します(delete-blank-lines)。

M-^

行間にある改行をインデントと共に削除して2行を1行にします(delete-indentation)。

基本的な削除コマンドDEL (delete-backward-char)、delete (delete-forward-char)、C-d (delete-char)については既に説明しました。テキストの消去を参照してください。数引数を指定すると、指定した数の文字を削除します。リージョンがアクティブのとき、数引数に1を指定するか省略した場合は、リージョンのすべてのテキストを削除します。

他の削除コマンドは、空白文字(スペース、タブ、改行)だけを削除するものです。M-\ (delete-horizontal-space)は、ポイントの前後にあるすべてのスペースとタブを削除します。プレフィクス引数を指定すると、ポイントの前にあるスペースとタブだけを削除します。M-SPC (just-one-space)も同様ですが、前にスペースが何個あるかに関係なく、ポイントの前に1つのスペースを残します。数引数nを指定すると、nが正のときはポイントの前に、n個のスペースを残します。nが負の場合は、スペースとタブに加えて改行も削除し、ポイントの前に-n個のスペースを残します。コマンドcycle-spacingは、just-one-spaceのようなコマンドで、よりフレキシブルな動作をします。これは連続で呼び出すと異なる処理を行います。1番目の呼び出しではjust-one-spaceと同様の処理をし、2番目の呼び出しではすべての空白文字を削除し、3番目の呼び出しでは元の空白文字を復元します。

C-x C-o (delete-blank-lines)は、現在行の下にあるすべての空行を削除します。現在行が空行のときは、現在行の上にあるすべての空行も削除します(空行を1つ、つまり現在行は残します)。単独の空行で実行するとその行を削除します。

M-^ (delete-indentation)は、改行と周囲のスペース(通常1つのスペースを残す)を削除することにより、現在行とその上の行を結合します。M-^を参照してください。

コマンドdelete-duplicate-linesは、リージョン内の重複した行を検索して、それぞれ1行を残して削除します。通常は重複した行の最初の行を残しますが、プレフィクス引数C-uを指定すると、最後の行を残します。プレフィクス引数C-u C-uを指定すると、隣接した重複行だけを検索します。これは行がソート済みのとき効果的です。プレフィクス引数C-u C-u C-uを指定すると、連続する空行は残します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1.2 行のkill

C-k

行の残り、または1行以上をkillします(kill-line)。

C-S-backspace

1度に行全体を削除します(kill-whole-line)。

もっとも簡単なkillコマンドは、C-k (kill-line)です。これを行末で使うと、その行を終端している改行をkillして、現在行と次の行を継げます(空行なら削除します)。そうでない場合、C-kはポイントから行末までを削除します。ポイントの元の位置が行頭の場合は、空行が残ります。

どちらのケースを適用するか決める際には、行末のスペースとタブは無視されます。ポイントが行の一番最後の可視の文字の後ろにあるとき、C-kは改行をkillすることに注意してください。空でない行全体をkillするときは、行頭でC-kを2回タイプしてください。

このコンテキストで“行”とは、スクリーン行ではなく論理行を意味します(継続行を参照してください)。

C-kに正の数値nを与えると、n行とそれに続く改行をkillします(現在行のポイントの前にあるテキストはkillされません)。負の引数-nを与えると、現在行のポイントの前にあるテキストと、前のn行をkillします。C-kに0を指定すると、現在行のポイントの前にあるテキストをkillします。

変数kill-whole-lineが非nilのときは、行頭でのC-kにより行末の改行も含めて行全体がkillされます。この変数は通常nilです。

C-S-backspace (kill-whole-line)は行中のポイントの位置に関わらず、改行を含めた行全体をkillします。キーシーケンスC-S-backspaceをタイプできないテキスト端末がたくさんあることに注意してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1.3 その他のkillコマンド

C-w

リージョンをkillします(kill-region)。

M-w

リージョンをkillリングにコピーします(kill-ring-save)。

M-d

次の単語をkillします(kill-word)。単語を参照してください。

M-DEL

後方に1単語killします(backward-kill-word)。

C-x DEL

センテンスの先頭までを後方にkillします(backward-kill-sentence)。センテンスを参照してください。

M-k

文の末尾までをkillします(kill-sentence)。

C-M-k

後に続く対応のとれた式(balanced expressions)をkillします(kill-sexp)。対応が取れたカッコの式を参照してください。

M-z char

次のcharまでをkillします(zap-to-char)。

一般によく使われるkillコマンドはC-w (kill-region)で、これはリージョンのテキストをkillします(マークとリージョンを参照してください)。同様にM-w (kill-ring-save)は、バッファーからテキストを消去せずに、リージョンのテキストをkillリングにコピーします。C-wまたはM-wをタイプしたとき、マークが非アクティブの場合、これらのコマンドはポイントと最後にセットしたマークの間にあるテキストにたいして処理を行います(リージョンを操作するを参照してください)。

Emacsは特定の構文単位にたいするkillコマンドを提供します。単語(words)にたいしてはM-DELM-d(単語を参照してください)、対応のとれた式(balanced expressions)にたいしてはC-M-k(対応が取れたカッコの式を参照してください)、センテンス(sentences: 文)にたいしてはC-x DELM-k(センテンスを参照してください)です。

コマンドM-z (zap-to-char)は、killと検索が組み合わされています。これは文字を読み取り、ポイントからバッファー内の次にその文字が現れる場所までをkillします。数引数は繰り返し回数です。負の引数の場合は後方に検索することを意味し、ポイントの前のテキストをkillします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1.4 killのオプション

いくつかの特別なバッファーは、読み取り専用(read-only)のテキストを含んでいて、それらは変更できないのでkillもできません。killコマンドは読み取り専用のバッファーにたいして特別な動作をします。バッファーから実際にテキストを削除せずに、killリングにコピーします。通常はビープ音をならし、その旨のエラーメッセージを表示します。しかし変数kill-read-only-okを非nilにセットすると、なぜテキストが消去されないのかをエコーエリアにメッセージ表示します。

変数kill-do-not-save-duplicatesを非nilに変更すると、同じものにたいするkillは重複なくkillリングの1つのエントリーとなります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2 yank

yankするとは、以前killしたテキストを再び挿入するという意味です。テキストを移動またはコピーする通常の方法は、それをkillしてからどこかにyankする方法です。

C-y

最後にkillしたものをポイント位置にyankします(yank)。

M-y

yankしたテキストを、それより前にkillしたテキストに置き換えます(yank-pop)。過去にkillしたテキストをyankするを参照してください。

C-M-w

次のコマンドがkillコマンドのときは、killしたものを、以前にkillしたものに追加します(append-next-kill)。killしたテキストの追加を参照してください。

基本的なyankコマンドは、C-y (yank)です。これはもっとも最近killされたものを挿入し、カーソルを挿入されたテキストの最後に移動します。また挿入されたテキストの先頭にマークをセットして、それを非アクティブにします。これによりC-u C-SPCで簡単にその位置にジャンプできます(マークリングを参照してください)。

C-u C-yのようにプレフィクス引数を指定すると、カーソルを挿入されたテキストの前に移動して、マークをテキストの最後にセットします。他のプレフィクス引数は、何回前のkillかを指定します。たとえばC-u 4 C-yは、もっとも最近killされたものから4番目に古いものを挿入します。

グラフィカルなディスプレーでは、C-yはまず最後にEmacsがkillした後に、他のアプリケーションがシステムのクリップボードに、何らかのテキストをコピーしていないか調べます。もしコピーしていたなら、かわりにクリップボードのテキストを挿入します。このようにEmacsは効果的に“カット(cut)”や“コピー(copy)”などの、他のアプリケーションで処理されたクリップボード操作を、Emacsのkillのように扱います(ただしkillリングには記録されません)。詳細については、グラフィカルなディスプレーでのカットアンドペーストを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.1 killリング

killリング(kill ring)とは、以前にkillされたテキストブロックからなるリストです。すべてのバッファーにたいして、killリングは1つしかないので、あるバッファーでkillしたテキストを、他のバッファーにyankすることができます。これはバッファーから他のバッファーへテキストを移動する、通常の方法です(他の方法もいくつかあります。たとえばテキストをレジスターに格納することもできます。レジスターを参照してください。テキストを移動する他の方法については、テキストの追加を参照してください)。

killリングのエントリーの最大数は、変数kill-ring-maxで制御されます。デフォルトは60です。エントリー数が制限に達しているとき新たにkillすると、Emacsはkillリングの一番古いエントリーを削除して空きを作ります。

killリングの実際の内容は、kill-ringという名前の変数に格納されています。killリングのエントリーの内容は、C-h v kill-ringで見ることができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.2 過去にkillしたテキストをyankする

yankで説明したように、C-yに数引数を指定して、最後にkillされたものではないテキストをyankできます。これはkillリングのどのエントリーが欲しいか覚えているとき便利です。もし覚えていないときは、M-y (yank-pop)コマンドを使って、候補を探すことができます。

もし前のコマンドがyankコマンドのとき、M-yはyankされたテキストを、1つ前にkillされたテキストで置き換えます。つまり2番目に新しいkillされたテキストを復元するには、最初にC-yで最後にkillされたテキストをyankし、次にM-yでその1回前にkillされたテキストで置き換えます。M-yは、C-yまたは他のM-yの後しか使えません。

killリングのエントリーを指す(ポイントする)、“last yank”ポインターという概念で、M-yを理解できるでしょう。なにかをkillする度に、“last yank”ポインターはリングの先頭に新たに作られたエントリーを指すように移動します。C-yは、“last yank”ポインターが指すエントリーをyankします。M-yは“last yank”ポインターが違うエントリーを指すように移動して、バッファーのテキストをポインターが指すテキストに変更します。M-yコマンドを繰り返すことにより、リングの任意のエントリーにポインターを移動できるので、任意のエントリーをバッファーに取り込むことができます。やがてリングの最後に到達すると、次のM-yにより再び最初のエントリーに戻ります。

M-yはリング内で“last yank”ポインターを移動させますが、リング内のエントリーの順番は変更しません。リングのエントリーは、常に最後にkillされたものを先頭に、記憶されているもので一番古いエントリーへと並んでいます。

“last yank”ポインターを何回進めるかを、M-yに数引数で指定できます。負の引数はリングの先頭に向かってポインターを移動させます。リングの先頭では一番古いエントリーに“戻り”、そこから先頭へと移動します。

望むテキストを見つけてバッファーに取り込んだら、M-yコマンドを止めればそのテキストはそこに残ります。このテキストはkillリングのエントリーの単なるコピーなので、それを編集してもリングの中のエントリーは変更されません。新しく何かをkillしない限り、“last yank”ポインターは同じ位置に留まるので、C-yでそのテキストの別のコピーをyankできます。

C-yに数引数を指定するときも、yankするエントリーに“last yank”ポインターをセットします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.3 killしたテキストの追加

通常はkillコマンドを実行するごとに、新しいエントリーがkillリングにpushされます。しかし2回以上の連続するkillコマンドにより、killされたテキストを1つのエントリーとしてまとめ、すべてのテキストを1単位として、あたかもそれがkillされたかのように、1回のC-yでyankできます。

つまりテキストを1つの単位としてyankしたいとき、そのテキストすべてを1回でkillする必要はありません。すべてがkillされるまで行から行、単語から単語へとkillを続け、それを一度に取得することができます。

ポイントから前方にkillするコマンドは、直前にkillされたテキストの最後に追加します。ポイントから後方にkillするコマンドは、テキストの先頭に追加します。この方法により前方と後方を併用した連続するkillコマンドは、すべてのkillされたテキストを再配置しなくてもよいように、1つのエントリーにまとめます。数引数を指定してもkillの連続性は途切れません。たとえば以下のようなテキストを含むバッファーがあるとしましょう:

This is a line ∗of sample text.

ポイントの位置は∗で示された場所です。M-d M-DEL M-d M-DELとタイプして、前方と後方へのkillを交互に行うと、最後にkillリングには‘a line of sample’という1つのエントリー、バッファーには‘This is  text.’が残ります(‘is’と‘text’の間には2つのスペースがあることに注意してください。これはM-SPCまたはM-qで取り除くことができます)。

同じテキストをkillする別の方法は、M-b M-bで単語2つ後方に移動してから、C-u M-dで前方の単語4つをkillする方法です。これはバッファーとkillリングに、正確に同じ結果をもたらします。M-f M-f C-u M-DELで後方にkillしても結果は同じです。killリングのエントリーは、常にバッファーからkillされる前と同じ順番になります。

killコマンドと最後のキルコマンドの間に、(単なる数引数ではない)他のコマンドが入ると、killリングには新たなエントリーが作られます。しかし、あらかじめC-M-w (append-next-kill)とタイプすることにより、最後にkillされたテキストに追加するように強制できます。C-M-wは、後に続くコマンドがkillコマンドであれば、killしたテキストを前にkillしたテキストに付け加えるよう指示します。この方法でも、前方にkillするコマンドの場合は、前にkillされたテキストの最後に追加され、後方にkillするコマンドの場合は、先頭に追加されます。この方法により、1ヶ所にyankするために離れた場所にあるいくつかのテキスト断片を、killして集めることができます。

M-w (kill-ring-save)の後のkillコマンドは、M-wでkillリングにコピーされたテキストへの追加はしません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.3 グラフィカルなディスプレーでのカットアンドペースト

ほとんどのグラフィカルなデスクトップ環境では、異なるアプリケーション間のデータ転送(通常はテキスト)に、クリップボード(clipboard)と呼ばれるシステム機能を使います。Xでは他にプライマリー選択(primary selection)とセカンダリー選択(secondary selection)という、同様の機能が利用可能です。Emacsをグラフィカルなディスプレーで実行している場合、killとyankコマンドはこれらの機能に統合されているので、Emacsと他のグラフィカルアプリケーション間で、簡単にテキストを転送できます。

デフォルトでは、Emacsはプログラム間テキスト転送のコーディングシステムとして、UTF-8を使います。もしコピーしたテキストが期待したものでない場合、C-x RET xまたはC-x RET Xとタイプして、他のコーディングシステムを指定できます。x-select-request-typeをカスタマイズして、異なるデータタイプを要求することもできます。プロセス間通信にたいするコーディングシステムを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.3.1 クリップボードを使う

クリップボード(clipboard)とは、ほとんどのグラフィカルなアプリケーションが、“カットアンドペースト”のために使う機能です。もしクリップボードが存在する場合、Emacsのkillおよびyankコマンドもそれを使います。

何らかのテキストを、C-w (kill-region)のようなコマンドでkillしたり、M-w (kill-ring-save)のようなコマンドでkillリングにコピーしたとき、そのテキストはクリップボードにも転送されます。

Emacsのkillコマンドがテキストをクリップボードに転送すると、通常クリップボードの既存の内容は失われます。オプションとして、save-interprogram-paste-before-killtに変更できます。これにより、Emacsは古いクリップボードのデータが失われることを防ぐために、最初にクリップボードのデータをkillリングに保存します。これにはデータが大きくなると、メモリー消費が増えるというリスクがあります。

C-y (yank)のようなyankコマンドもクリップボードを使います。他のアプリケーションがクリップボードを“所有”する場合(たとえばEmacsで最後にkillコマンドを実行した後に、他のアプリケーションでテキストをカットまたはコピーした場合)、Emacsはkillリングではなくクリップボードからyankします。

通常killリングをM-y (yank-pop)で巡回することでは、クリップボードは変更されません。しかしyank-pop-change-selectiontに変更すると、M-yは新しいyankをクリップボードに保存します。

killおよびyankコマンドがクリップボードにアクセスしないようにするには、変数x-select-enable-clipboardnilに変更してください。

多くのXデスクトップ環境は、クリップボードマネージャー(clipboard manager)と呼ばれる機能をサポートします。もしEmacsがクリップボードのデータの現在の“持ち主”のときにEmacsを終了し、そのときクリップボードマネージャーが実行されていると、Emacsはクリップボードのデータをクリップボードマネージャーに転送するのでデータは失われません。ある状況において、これはEmacsが終了するが遅くなる原因となります。Emacsがクリップボードマネージャーにデータをを転送しないようにするには、変数x-select-enable-clipboard-managernilに変更してください。

Emacs 24以前は、killおよびyankコマンドは、クリップボードではなくプライマリー選択(他のウィンドウアプリケーションにたいするカットアンドペーストを参照してください)を使っていました。もしこのほうがよいなら、x-select-enable-clipboardnilx-select-enable-primarytmouse-drag-copy-regiontに変更してください。この場合は、次のコマンドを使って、クリップボードに明示的にアクセスできます。リージョンをkillしてクリップボードに保存するにはclipboard-kill-region、リージョンをkillリングにコピーするとともにクリップボードに保存するにはclipboard-kill-ring-save、クリップボードの内容をポイント位置にyankするにはclipboard-yankです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.3.2 他のウィンドウアプリケーションにたいするカットアンドペースト

Xウィンドウシステム下では、プライマリー選択(primary selection)に、Xアプリケーションで最後に選択されたテキスト(通常はマウスのドラッグで選択される)が存在します。一般的に、このテキストは他のXアプリケーションにmouse-2をクリックして挿入することができます。プライマリー選択はクリップボードとは別のものです。プライマリー選択の内容は、より“脆弱”です。なぜなら、クリップボードは明示的な“カット”または“コピー”だけにより上書きされるのにくらべ、プライマリー選択はマウスでテキストが選択される度に上書きされるからです。

Xの下では、リージョンがアクティブ(マークとリージョンを参照してください)になればいつでも、リージョンのテキストはプライマリー選択に保存されます。これは、そのリージョンの選択がマウスでドラッグやクリック(編集のためのマウスコマンドを参照してください)されたのか、キーボードコマンド(たとえばC-SPCをタイプしてからポイントを移動したなど。マークのセットを参照してください)なのかによらず適用されます。

変数select-active-regionsonlyに変更すると、Emacsは一時的にアクティブになったリージョン(たとえばマウスやシフト選択など。シフト選択を参照してください)だけをプライマリー選択に保存します。select-active-regionsnilに変更すると、Emacsはアクティブなリージョンをプライマリー選択に保存しません。

プライマリー選択をEmacsのバッファーに挿入するには、挿入したい場所でmouse-2 (mouse-yank-primary)をクリックします。編集のためのマウスコマンドを参照してください。

MS-Windowsはプライマリー選択を提供しませんが、Emacsは単一のEmacsセッション内で選択されたテキストを内部に格納することにより、これをエミュレートします。したがってWindowsでも、プライマリー選択に関するすべての機能とコマンドは、Xと同様に機能します。しかしこれは同一セッションにおけるカットやペーストなどの場合で、Emacsセッションと他のアプリケーション間では機能しません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.3.3 セカンダリー選択

プライマリー選択に加えて、Xウィンドウシステムはセカンダリー選択(secondary selection)として知られる、同様な第2の機能を提供します。最近ではセカンダリー選択を使うXアプリケーションの数は多くありませんが、以下のEmacsコマンドによりアクセスできます:

M-Drag-Mouse-1

ボタンを押した場所からボタンを話した場所までを、セカンダリー選択としてセットします(mouse-set-secondary)。ドラッグして選択されたテキストは、フェイスsecondary-selectionを使ってハイライトされます。ウィンドウの上端または下端を越えてマウスをドラッグすると、mouse-set-regionと同様にウィンドウは自動的にスクロールします(編集のためのマウスコマンドを参照してください)。

このコマンドはkillリングを変更しません。

M-Mouse-1

セカンダリー選択の始点をセットします(mouse-start-secondary)。

M-Mouse-3

M-Mouse-1で指定された位置から、クリックされた点を終点とするセカンダリー選択をセットします(mouse-secondary-save-then-kill)。これは選択されたテキストをkillリングにも保存します。同じ場所での2回目のM-Mouse-3は、作成されたセカンダリー選択をkillします。

M-Mouse-2

クリックした場所にセカンダリー選択を挿入し、ポイントをyankしたテキストの最後に配します(mouse-yank-secondary)。

Mouse-1と同様、M-Mouse-1のダブルクリックで単語、トリプルクリックで行を処理します。

mouse-yank-at-pointが非nilの場合、M-Mouse-2はポイント位置にyankします。どこをクリックしたか、さらにはフレームのどのウィンドウをクリックしたかは関係ありません。編集のためのマウスコマンドを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.4 テキストの追加

テキストのコピーや移動は、それをkillしてyankすることにより通常行います。しかし多くの箇所にあるテキストブロックをコピーしたり、たくさんのテキストの断片を1ヶ所にコピーする便利な方法があります。ここではテキストの断片を、バッファーやファイルに追加するコマンドを説明します。

M-x append-to-buffer

リージョンを指定したバッファーの内容の後に追加(append)します。

M-x prepend-to-buffer

リージョンを指定したバッファーの内容の前に追加(prepend)します。

M-x copy-to-buffer

リージョンを指定したバッファーにコピーして、バッファーの古い内容は削除されます。

M-x insert-buffer

指定したバッファーの内容を、現在のバッファーのポイント位置に挿入します。

M-x append-to-file

リージョンを指定したファイルの内容の最後に追加します。

テキストをバッファーに追加するには、M-x append-to-bufferを使います。これはバッファー名を読み取り、リージョンのコピーを指定したバッファーに挿入します。存在しないバッファーを指定すると、append-to-bufferはそのバッファーを作成します。テキストは、そのバッファーのポイント位置に挿入されます。バッファーを編集用に使っていると、コピーされたテキストはその時ポイントがあった位置に挿入されます。

バッファーのポイントは、コピーされたテキストの最後に残ります。連続してappend-to-bufferを使うと、テキストは指定したバッファーにコピーした順番で追加されていきます。厳密に言うとappend-to-bufferは既存のバッファーのテキストにたいして、常に追加をする訳ではありません。これはポイントがバッファーの最後にあるときに追加をします。しかしバッファーを変更するのにappend-to-bufferしか使わない場合、ポイントは常にバッファーの最後に位置することになります。

M-x prepend-to-bufferappend-to-bufferと同様ですが、他のバッファーのポイントはコピーされたテキストの前に置かれるので、連続してテキストを追加すると結果は逆の順番にコピーされます。M-x copy-to-bufferも同様ですが、他のバッファーの既存の内容は削除されるので、バッファーの内容は新しくコピーされたテキストだけになります。

コマンドM-x insert-bufferは、追加するテキストを他のバッファーから取得するために使われます。これはバッファー名の入力を求め、そのバッファーのすべてのテキストのコピーを、現在のバッファーのポイント位置に挿入します。ポイントは挿入されたテキストの先頭になります。挿入されたテキストの最後の位置もマークリングに追加されます。マークは非アクティブになります。バッファーに関する背景情報は、複数バッファーの使用を参照してください。

バッファーのテキストを追加するかわりに、M-x append-to-fileでテキストを直接ファイルに追加できます。これはファイル名の入力を求め、リージョンのテキストを指定されたファイルの最後に追加します。ディスク上のファイルはすぐに変更されます。

append-to-fileは、Emacsがvisitしていないファイルだけに使うべきです。Emacsで編集中のファイルにたいして使用すると、それはEmacsの背後でファイルが変更されることになるため、編集内容が失われる可能性があります。

テキストの移動に関する他の方法はレジスターに格納する方法です。レジスターを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.5 矩形領域(Rectangles)

矩形領域(rectangle)コマンドは、テキストの矩形領域を操作します。矩形領域のテキストとは、特定の行範囲内にある、特定の2つの列の間にある文字すべての文字です。Emacsには矩形領域にたいしてkill、yank、クリアー、スペースやテキストでフィル、削除を行うコマンドがあります。矩形領域コマンドは、複数列のテキストを操作したり、テキストをそのように変更したり戻したりする場合に便利です。

コマンドで操作する矩形領域を指定するには、一方の角にマークを設定し、その対角にポイントを置きます。このように設定した矩形領域を矩形リージョン(region-rectangle)と呼びます。ポイントとマークが同じ列の場合、矩形リージョンは空になります。ポイントとマークが同じ行の場合、矩形リージョンの高さは1行になります。

矩形リージョンは、リージョンの制御と大体同じ方法で制御できます。しかし、ポイントとマークの組がリージョンとして解釈されるのか、あるいは矩形領域として解釈されるかは、それらを使うコマンドに依存することに注意してください。

C-x r k

矩形リージョンをkillして、内容を“最後にkillされた矩形領域”として保存します(kill-rectangle)。

C-x r M-w

矩形リージョンのテキストを“最後にkillされた矩形領域”として保存します(copy-rectangle-as-kill)。

C-x r d

矩形リージョンのテキストを削除します(delete-rectangle)。

C-x r y

最後にkillされた矩形領域の左上隅がポイント位置になるようにyankします(yank-rectangle)。

C-x r o

矩形領域にスペースを挿入します(open-rectangle)。これにより矩形リージョンの以前の内容は右にずれます。

C-x r N

矩形リージョンの左端に行番号を挿入します(rectangle-number-lines)。これにより矩形リージョンの以前の内容は右にずれます。

C-x r c

矩形リージョンの内容をスペースに置き換えてクリアーします(clear-rectangle)。

M-x delete-whitespace-rectangle

指定された矩形領域の各行で、矩形領域の左端の列から空白文字を削除します。

C-x r t string RET

矩形領域の各行にたいして、内容をstringに置き換えます(string-rectangle)。

M-x string-insert-rectangle RET string RET

矩形領域の各行にたいして、stringを挿入します。

C-x SPC

Rectangle Markモードを切り替えます(rectangle-mark-mode)。このモードがアクティブのとき矩形領域はハイライトされ、拡大・縮小が可能になります。標準のkillおよびyankコマンドは、それにたいして操作を行います。

矩形領域の操作は2種類に分類できます。それは矩形領域を消去または挿入するものと、空の矩形領域を作るものです。

矩形領域のテキストを消去するには2つの方法があります。C-x r d (delete-rectangle)はテキストを無条件に削除します。C-x r k (kill-rectangle)はテキストを取り除いて、それを最後にkillされた矩形領域として保存します。両方とも矩形領域の各行の指定したテキストを消去するように、矩形リージョンを消去します。その行の後に続くテキストがある場合、削除による隙間を生めるために後方に移動されます。

矩形領域の“kill”は普通のkillとは異なります。矩形領域はkillリングには保存されず、一番最後にkillされた矩形領域だけを記録する、特別な場所に保存されます。矩形領域のyankは線形テキストのyankとは大きく異なるので、異なるyankコマンドが使われるからです。矩形領域にたいしてyankのpopは定義されていません。

C-x r M-w (copy-rectangle-as-kill)は矩形領域用のM-wに相当します。これはバッファーからテキストを削除することなく、矩形領域を“最後にkillされた矩形領域”として記録します。

killされた矩形領域をyankするには、C-x r y (yank-rectangle)とタイプします。矩形領域の最初の行はポイント位置に挿入されます。矩形領域の2行目はポイントの1行下の位置に挿入され、以下同様に挿入されていきます。影響を受ける行数は、保存された矩形領域の高さにより決定されます。

たとえば1列のリスト2つを2列のリストに変換できます。一方の1列リストを矩形領域としてkillしてもう一方の1列リストの隣にyankすればよいのです。

C-x r r rC-x r i rで、矩形領域をレジスターにコピーしたり取り出したりできます。レジスターに矩形領域を保存するを参照してください。

空の矩形領域を作るために使うことのできるコマンドが2つあります。C-x r c (clear-rectangle)は、矩形リージョンの既存のテキストを空白に置き換えます。C-x r o (open-rectangle)は空白の矩形領域を挿入します。

M-x delete-whitespace-rectangleは、指定した列を起点に水平方向の空白文字を削除します。これは矩形領域の各行に適用され、開始列は矩形領域の左端です。矩形領域の右端はこのコマンドに影響を及ぼしません。

コマンドC-x r N (rectangle-number-lines)は、矩形領域の左端に行番号を挿入します。通常は矩形領域の最初の行を1として番号が開始されます。プレフィクス引数を指定すると、このコマンドは開始番号と、番号を出力する際の書式文字列(Formatting Strings in The Emacs Lisp Reference Manualを参照してください)の入力を求めます。

コマンドC-x r t (string-rectangle)は、矩形リージョンの各行を文字列で置き換えます。文字列の幅は矩形領域と同じ幅である必要はありません。矩形領域の後ろのテキストは、文字列の幅が少ないときは左に、文字列の幅が大きいときは右にシフトされます。

コマンドM-x string-insert-rectangleは、string-rectangleと同様ですが、各行に文字列を挿入し、元の文字列は右にシフトされます。

コマンドC-x SPC (rectangle-mark-mode)は、矩形リージョンをハイライトするか、標準のリージョンをハイライトするかを切り替えます(最初にリージョンをアクティブにする必要があります)。このモードが有効な場合、C-fC-nなどのコマンドは矩形領域に合ったやり方でリージョンのサイズを変更し、kill、yankは矩形領域を処理します。テキストのkillと移動を参照してください。このモードはリージョンがアクティブな間だけ持続します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.6 CUAバインド

コマンドM-x cua-modeは、多くのアプリケーションで使われている、CUA(Common User Access)互換のキーバンドをセットアップします。

CUAモードが有効な場合、C-xC-cC-vC-zなどのキーは、カット(kill)、コピー、ペースト(yank)、アンドウのコマンドを呼び出します。C-xC-cによるカットとコピーは、リージョンがアクティブなときだけ処理されます。リージョンが非アクティブのときはプレフィクスキーとして動作するので、C-x C-cのような標準のEmacsコマンドは正常に機能します。変数mark-even-if-inactiveC-xC-cに影響を及ぼさないことに注意してください(リージョンを操作するを参照してください)。

マークがアクティブのときにC-x C-fのようなEmacsコマンドを入力するには、Shiftを押しながらプレフィクスキーを押す(例 S-C-x C-f)か、プレフィクスキーを素早く2回タイプ(例 C-x C-x C-f)します。

CUAモードがEmacs標準のキーバインドをオーバーライドするのを無効にしつつ、以下で説明するそれ以外のCUAモードの機能は使う場合は、変数cua-enable-cua-keysnilをセットしてください。

CUA モードはデフォルトでDelete-Selectionモード(編集のためのマウスコマンドを参照してください)を有効にするので、アクティブなリージョンがあるときテキストをタイプすると、そのテキストで置き換えられます。CUAモードでこれを無効にするには、変数cua-delete-selectionnilにセットしてください。

CUAモードは矩形領域を明白にハイライトする、強化された矩形領域サポートを提供します。C-RETを使うことにより矩形領域の選択が開始され、移動コマンドを使って拡張したり、C-xC-cで切り取りとコピーができます。RETにより、矩形領域の四隅に時計方向へカーソルを移動させるので、任意の方向に簡単に領域を拡張できます。タイプされた通常のテキストは、矩形領域の各行の左か右(カーソルのある側)に挿入されます。

この矩形領域サポートは、cua-rectangle-mark-modeコマンドを呼び出すことにより、CUAモードを有効にせずに使うこともできます。しかし標準のrectangle-mark-modeも参照してください。See section 矩形領域(Rectangles).を参照してください。

CUAモードでは、テキストや矩形領域を簡単にレジスターに保存したり、取り出すことができます。これは1桁の数引数をkill、copy、yankコマンドに指定します。たとえばC-1 C-cはリージョンをレジスター1にコピーし、C-2 C-vはレジスター2の内容をyankします。

CUAモードは、バッファー間での簡単にテキストを移動したりコピーするためのグローバルマーク機能も提供します。C-S-SPCを使って、グローバルマークのオンとオフが切り替えられます。グローバルマークがオンのときは、killまたはコピーされたすべてのテキストは自動的にグローバルマークの位置に挿入され、タイプしたテキストも現在のカーソル位置ではなくグローバルマークに挿入されます。

たとえば複数のバッファーから単語をコピーして単語リストを作るには、単語リストを作るバッファーにグローバルマークをセットします。次にリストにしたい単語をマーク(S-M-fなど)してから、C-cM-wでリストにコピーします。そしてRETでリストにコピーされた単語の後ろに改行を挿入すればよいのです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13 レジスター

Emacsのレジスター(registers)は、テキストや矩形領域、位置、その他、後で使うものを保存するための小部屋です。一度テキストや矩形領域をレジスターに保存すれば、それをバッファーに何度もコピーできます。一度場所をレジスターに保存すれば、何度でもその場所にジャンプして戻ることができます。

各レジスターは1文字からなる名前があり、ここではrと表記することにします。rには、英字(‘a’など)または数字(‘1’など)を使用できます。大文字小文字は区別されるので、レジスター‘a’とレジスター‘A’は同じではありません。

レジスターには位置、テキスト、矩形領域、数字、ウィンドウの設定、ファイル名が保存できますが、一度に保存できるのは1つです。レジスターに何か保存すると、他の何かをそのレジスターに保存するまで残ります。レジスターrに何が含まれているのか見るには。M-x view-registerを使います:

M-x view-register RET r

レジスターrに何が含まれるかの説明を表示します。

レジスター名の入力を求めるコマンドはすべて、既存のレジスターを一覧する“プレビュー(preview)”ウィンドウを遅延表示します。遅延の長さはregister-preview-delayでカスタマイズできます。遅延を無効にするには、nilをセットしてください。この場合、C-hF1で、明示的にプレビューウィンドウを要求できます。

ブックマーク(Bookmarks)はファイルと位置を記録するので、ファイルを再び見るときは記録された位置から閲覧できます。ブックマークも本質的にレジスター同じなので、このチャプターに記載します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.1 レジスターに位置を保存する

C-x r SPC r

現在のバッファーのポイント位置をレジスターrに記録します(point-to-register)。

C-x r j r

レジスターrに記録されたバッファーの位置にジャンプします(jump-to-register)。

C-x r SPC (point-to-register)と、それに続けて文字rをタイプすると、ポイント位置と現在のバッファーの両方をレジスターrも保存します。レジスターは他の何かが保存されるまでこの情報を保持します。

コマンドC-x r j rは、rに記録されたバッファーに切り替えて、記録された位置にポイントを移動します。レジスターの内容は変わらないので、保存した位置に何度でもジャンプできます。

C-x r jを使って保存した位置に移動するとき、保存されたバッファがkillされていた場合、C-x r jは同じファイルをvisitしてバッファーを生成しようと試みます。もちろんこれはファイルをvisitしたバッファーだけの動作です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.2 レジスターにテキストを保存する

同じテキストのコピーを何回も挿入したいとき、killリングからyankするのは不便です。なぜなら何かkillするたびに、そのエントリーはリングの下の方へ移動してしまうからです。代替として、テキストをレジスターに保存して、後で取り出す方法があります。

C-x r s r

リージョンをレジスターrにコピーします(copy-to-register)。

C-x r i r

レジスターrからテキストを挿入します(insert-register)。

M-x append-to-register RET r

リージョンをレジスターrのテキストに追加します。

レジスターrの内容がテキストの場合、そのレジスターに追加するのにC-x r + (increment-register)も使用できます。レジスターrに数値が含まれている場合、コマンドC-x r +は違う動作をすることに注意してください。レジスターに数字を保存するを参照してください。

M-x prepend-to-register RET r

リージョンをレジスターrの先頭に追加します。

C-x r s rは、リージョンのテキストのコピーを、rという名前のレジスターに保存します。マークが非アクティブのとき、Emacsはまず最後にセットされたマークをアクティブにします。マークはこのコマンドの最後に非アクティブになります。マークとリージョンを参照してください。同じコマンドにプレフィクス引数を指定したC-u C-x r s rは、テキストのコピーをレジスターrに保存してから、バッファーのテキストを削除します。これはリージョンのテキストを、レジスターに“移動”したと考えることができます。

M-x append-to-register RET rは、リージョンのテキストのコピーを、rという名前のレジスターにすでに保存されているテキストに追加します。プレフィクス引数を指定した場合、レジスターに追加した後にリージョンを削除します。コマンドprepend-to-registerも同様ですが、これはリージョンのテキストをレジスターのテキストの最後ではなく先頭に追加します。

append-to-registerprepend-to-registerを使ってテキストを集める場合、セパレーターを使って個々に集めたテキストを分割したい場合があります。そのようなときはregister-separatorを構成して、セパレーター文字列をそのレジスターに保存します。たとえばテキストを収集する過程で、個々のテキストを2つの改行で分けたい場合、以下の設定を使うことができます。

(setq register-separator ?+)
(set-register register-separator "\n\n")

C-x r i rは、レジスターrのテキストをバッファーに挿入します。通常はポイントをテキストの前に置き、非アクティブのマークをテキストの後ろにセットします。数引数を指定したときは、ポイントをテキストの後ろ、マークをテキストの前にセットします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.3 レジスターに矩形領域を保存する

レジスターには線形のテキストだけでなく、矩形領域も保存できます。バッファーで矩形領域を指定する方法は、矩形領域(Rectangles)を参照してください。

C-x r r r

矩形リージョンをレジスターrにコピーします(copy-rectangle-to-register)。数引数を指定するとコピー後に矩形リージョンを削除します。

C-x r i r

レジスターrに矩形リージョンが保存されている場合、それを挿入します(insert-register)。

前にレジスターにテキストを保存するでも説明したC-x r i r (insert-register)コマンドは、レジスターに矩形領域が保存されているときはテキストではなく矩形領域を挿入します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.4 レジスターにウィンドウ設定を保存する

選択されたフレームのウィンドウの設定や、すべてのフレームのすべてのウィンドウの設定もレジスターに保存して、後で設定を復元することができます。ウィンドウの設定については、複数ウィンドウを参照してください。

C-x r w r

選択されたフレームのウィンドウの設定を、レジスターrに保存します(window-configuration-to-register)。

C-x r f r

すべてのフレームおよびフレームに含まれるすべてのウィンドウの状態を、レジスターrに保存します(frameset-to-register)。

C-x r j rを使うと、ウィンドウまたはフレームの設定を復元できます。これはカーソル位置を復元するコマンドと同じです。フレームの設定を復元するとき、設定に含まれていないフレームは非表示になります。もしこれらのフレームを削除したいときは、かわりにC-u C-x r j rを使います。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5 レジスターに数字を保存する

数字をレジスターに保存して、その数字(10進)をバッファーに挿入したり、増加させるコマンドがあります。これらのコマンドはキーボードマクロで使うと便利です(キーボードマクロを参照してください)。

C-u number C-x r n r

numberをレジスターrに保存します(number-to-register)。

C-u number C-x r + r

rに数字が保存しているときは、レジスターの数字をnumberだけ増加させます。コマンドC-x r + (increment-register)は、rにテキストが保存されているときは異なる動作をすることに注意してください。レジスターにテキストを保存するを参照してください。

C-x r i r

レジスターrの数字をバッファーに挿入します。

C-x r iは、他のレジスターの内容をバッファーに挿入するコマンドと同じです。C-x r +に数字の引数を与えない場合、レジスターの値は1増加します。C-x r nに数字の引数を与えない場合、レジスターには0が保存されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.6 レジスターにファイル名を保存する

特定の名前のファイルを頻繁にvisitする場合、その名前をレジスターにセットしておけば、より便利にファイルをvisitすることができます。以下はnameというファイルをレジスターrにセットするLispコードです:

(set-register r '(file . name))

たとえば

(set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))

はレジスター‘z’にファイル名をセットします。

レジスターrに名前がセットされているファイルをvisitするには、C-x r j rとタイプします。これはある位置にジャンプしたり、フレームの設定を復元するのと同じコマンドです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.7 キーボードマクロのレジスター

あるキーボードマクロ(キーボードマクロを参照してください)を頻繁に実行する必要がある場合、それをレジスターにセットしたり保存することができればより便利でしょう(キーボードマクロの命名と保存を参照してください)。C-x C-k x r (kmacro-to-register)は、最後のキーボードマクロをレジスターrに保存します。

レジスターrのキーボードマクロを実行するには、C-x r j rとタイプします(これはある位置にジャンプしたりフレームを復元するのと同じコマンドです)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.8 ブックマーク

ブックマーク(Bookmarks)とは、ジャンプしたい位置を記録するレジスターのようなものです。レジスターとの違いは、長い名前をもつことができ、次のEmacsセッションに自動的に引き継がれることです。ブックマークの典型的な使い方は、さまざまなファイルの“どこを読んでいたか”を記録することです。

C-x r m RET

visitしているファイルのポイント位置に、ブックマークをセットします。

C-x r m bookmark RET

ポイント位置に、bookmarkという名前のブックマークをセットします(bookmark-set)。

C-x r b bookmark RET

bookmarkという名前のブックマークにジャンプします(bookmark-jump)。

C-x r l

すべてのブックマークを一覧します(list-bookmarks)。

M-x bookmark-save

現在のすべてのブックマークの値を、デフォルトのブックマークファイルに保存します。

ブックマークの典型的な使い方は、各ファイルごとに現在の位置を保存することです。そのためブックマークをセットするコマンドC-x r mは、ブックマーク名のデフォルトとしてファイル名を使います。ブックマークが指すファイルをもとにブックマークの名前を付ければ、C-x r bで任意のファイルを再びvisitして、同時にブックマーク位置に移動するという操作を楽に行えます。

すべてのブックマークのリストを別のバッファーに表示するには、C-x r l (list-bookmarks)とタイプします。そのバッファーに切り替えて、ブックマークの定義の編集やブックマークに注釈をつけることができます。ブックマークバッファーでC-h mとタイプすれば、特別な編集コマンドに関する情報を見ることができます。

Emacsを終了するとき、もしブックマークの値を変更していたら、Emacsはブックマークを保存します。M-x bookmark-saveコマンドで、いつでもブックマークを保存できます。ブックマークは~/.emacs.d/bookmarksというファイルに保存されます(古いバージョンのEmacsとの互換性を保つため、もし~/.emacs.bmkというファイルがあればそのファイルに保存します)。ブックマークコマンドは、デフォルトのブックマークファイルを自動的にロードします。この保存とロードにより、ブックマークの内容を次のEmacsセッションに引き継ぐことができるのです。

bookmark-save-flagに1をセットすると、ブックマークをセットするコマンドはブックマークの保存も行ないます。こうすることにより、Emacsがクラッシュしてもブックマークを失わずにすみます。この変数の値が数字の場合、それはブックマークを何回変更したら保存するという意味です。この変数にnilをセットすると、Emacsは明示的にM-x bookmark-saveを使ったときだけブックマークを保存します。

変数bookmark-default-fileには、ブックマークを保存するデフォルトのファイルを指定します。

ブックマークの位置は、周囲のコンテキストとともに保存されるので、ファイルが少し変更されていても、bookmark-jumpは正確な位置を見つけることができます。変数bookmark-search-sizeは、ブックマーク位置のコンテキストの前後何文字を記録するかを指定します。

以下はブックマークを処理する追加のコマンドです:

M-x bookmark-load RET filename RET

ブックマークのリストを含む、filenameという名前のファイルをロードします。このコマンドはbookmark-writeと同様に、デフォルトのブックマークファイルに加えて、他のファイルのブックマークを使うことができます。

M-x bookmark-write RET filename RET

現在のすべてのブックマークをファイルfilenameに保存します。

M-x bookmark-delete RET bookmark RET

bookmarkという名前のブックマークを削除します。

M-x bookmark-insert-location RET bookmark RET

ブックマークbookmarkが指すファイル名をバッファーに挿入します。

M-x bookmark-insert RET bookmark RET

ブックマークbookmarkが指すファイルの内容をバッファーに挿入します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14 ディスプレーの制御

ウィンドウに入りきらない大きなバッファーでは、Emacsはその一部しか表示できません。このチャプターでは、見たい部分のテキストを指定するコマンドや変数と、どのようにしてテキストが表示されるかを説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.1 スクロール

ウィンドウがバッファーのすべてのテキストを表示するには小さい場合、その一部だけが表示されます。スクロールコマンドは、バッファーで表示される部分を変更します。

“前方(forward)”または“上(up)”へのスクロールは、ウィンドウに表示される部分を先に進めます。これはウィンドウに表示されるバッファーのテキストを、上に移動させるのと同じです。“後方(backward)”または“下(down)”へのスクロールは、ウィンドウに表示される部分を前に戻します。これはウィンドウに表示されるバッファーのテキストを下に移動させます。

Emacsでの“up”と“down”は、ウィンドウでテキストが移動する方向に基づいており、テキストにたいしてウィンドウが移動する方向ではありません。この用語は現在の“scrolling up”や“scrolling down”が広まる前に、Emacsで採用されました。そのためPageDownは、Emacs的には“上(up)”にスクロールするという、奇妙な結果となりました。

ウィンドウに表示されているバッファー部分には、常にポイントが含まれています。もしウィンドウの下端か上端を越えてポイントを移動させると、ポイントを画面に表示させるために自動的にスクロールが発生します(自動スクロールを参照してください)。以下のコマンドで明示的にスクロールができます:

C-v
next
PageDown

ウィンドウのほぼ全画面分、前方にスクロールします(scroll-up-command)。

M-v
prior
PageUp

後方にスクロールします(scroll-down-command)。

C-v (scroll-up-command)は、ウィンドウ全体の高さに近い量、前方にスクロールします。これにより下端の2行が上端になるようスクロールして、それに続く表示されていなかった行を表示します。ポイントが上端より上になってしまう場合、ウィンドウの新たな上端の行に移動します。The next(またはPageDown)は、C-vと同じです。

M-v (scroll-down-command)は、同様の方法で後方にスクロールします。prior(またはPageUp)は、M-vと同じです。

スクロールコマンドでオーバーラップして表示される行数は、変数next-screen-context-linesで制御され、デフォルトは2です。数引数nを与えたときは、n行スクロールします。Emacsはポイントを変更しないよう試みるので、テキストとポイントは一緒に上または下に動きます。C-vに負の引数を与えると、M-vのように反対方向へスクロールします。

デフォルトでは、ウィンドウがバッファーの先頭または最後に到達していて、これ以上スクロールできない場合、これらのコマンドは(beep音をならしたり画面をフラッシュして)エラーをシグナルします。変数scroll-error-top-bottomtに変更すると、コマンドは可能な限り、つまりバッファーの先頭の文字または最後の文字にポイントを移動します。ポイントがすでにそこにあるときは、エラーをシグナルします。

スクロールしたとき、ポイントが同じスクリーン位置に留まることを好むユーザーもいます。そうすれば同じスクリーンにスクロールして戻ったとき、ポイントが元の位置にあると便利だからです。この動作は変数scroll-preserve-screen-positionを通じて利用可能です。変数の値がtのとき、スクロールコマンドによりポイントがウィンドウの外にでるような場合、Emacsはポイントを先頭行または最終行に移動させるのではなく、同じスクリーン位置にポイントを調整して、カーソルを維持します。その他の非nil値の場合、Emacsはスクロールコマンドによりポイントがウィンドウに残っている場合にも、この方法でポイントを調整します。この変数はこのセクションで説明するすべてのスクロールコマンド、同様にマウスホイールによるスクロール(編集のためのマウスコマンドを参照してください)に影響を与えます。一般的にいうと、この変数はscroll-commandプロパティが非nilのコマンドに影響を及ぼします。Property Lists in The Emacs Lisp Reference Manualを参照してください。

コマンドM-x scroll-upおよびM-x scroll-downは、scroll-up-commandおよびscroll-down-commandと同様に動作しますが、scroll-error-top-bottomを考慮しません。これらのコマンドは、Emacs 24以前ではスクロールアップおよびスクロールダウンのためのデフォルトでした。コマンドM-x scroll-up-lineおよびM-x scroll-down-lineは、現在のウィンドウを1行スクロールさせます。もしこれらのコマンドを使う場合は、それにキーバインドを割り当てたくなるでしょう(キーのリバインドを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.2 センタリング

C-l

選択されているウィンドウで、現在行が中央になるようスクロールします。連続して呼び出すと、次は現在行が上端になり、その次は現在行が下端に、という順番で循環します。画面の再描画が行われる可能性があります(recenter-top-bottom)。

M-x recenter

選択されているウィンドウで、現在行が中央になるようにスクロールします。画面の再描画が行われる可能性があります。

C-M-l

有用な情報が表示されるよう、発見的な手法でスクロールします(reposition-window)。

C-l (recenter-top-bottom)コマンドは、選択されたウィンドウにたいしてセンタリング(recenters)をします。これにより現在のスクリーン行がウィンドウの中央、または中央に一番近い行になります。

(C-l C-l)のようにC-lを2回タイプすると、ポイントのある行が上端になるようにスクロールします。C-lを3回タイプするとポイントのある行が下端になるようにスクロールします。連続してC-lをタイプすることにより、上記の3つの位置を循環してスクロールできます。

リスト変数recenter-positionsをカスタマイズすることにより、循環する順序を変更できます。リスト要素にはシンボルtopmiddlebottomまたは数値を指定します。数値に整数を指定すると、現在行が指定したスクリーン行になるようスクロールします。数値に0.0から1.0の浮動小数点数は、ウィンドウの上端から現在行までを割合で指定します。デフォルトは(middle top bottom)で、これは上述した循環順序です。さらに変数scroll-marginを、0以外の値nに変更すると、C-lは常にウィンドウの上端または下端からスクリーン行で、n行を残してスクロールします(自動スクロールを参照してください)。

C-lにプレフィクス引数を指定することもできます。C-u C-lのようにプレフィクス引数だけを指定すると、単にポイントのある行を中央にします。正の引数nは、ポイントのある行がウィンドウの上端からn行目になるようにスクロールします。0を指定すると、ポイントのある行が上端になるようにスクロールします。負の引数-nは、ポイントのある行がウィンドウの下端からn行目になるようにスクロールします。引数を与えたときは、C-lは画面をクリアーせず、異なるスクリーン位置への循環もしません。

変数recenter-redisplayが非nil値の場合、C-lはスクリーンのクリアーと再描画を行います。特別な値tty(デフォルト)は、これをテキスト端末上のフレームだけに限定します。再描画はスクリーンが何らかの理由により文字化けしてしまったときなどに便利です(スクリーン上のゴミを参照してください)。

より原始的なコマンドM-x recenterは、recenter-top-bottomと同じように振る舞いますが、スクリーン位置を循環しません。

C-M-l (reposition-window)は、有用な情報がスクリーンに表示されるように、現在のウィンドウを発見的な手法によりスクロールします。たとえばLispファイルの場合、このコマンドは可能な限り現在のdefun全体がスクリーン上に表示されるよう試みます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.3 自動スクロール

ポイントが表示されているテキスト部分から外に移動すると、Emacsは自動スクロール(automatic scrolling)の処理を行います。通常自動スクロールは、ウィンドウの垂直方向の中央にポイントをセンタリングしますが、この振る舞いを変えるいくつかの方法があります。

scroll-conservativelyに小さい数字nをセットすると、ポイントが少し(n行以下)スクリーンの外に出たら、Emacsはポイントがスクリーンに表示されるのに充分なだけスクロールします。これでもしポイントの表示に失敗した場合、Emacsはそのウィンドウの中央にポイント行が表示されるのに充分なだけのスクロールをします。scroll-conservativelyに大きな数字(100より大)も数字をセットすると、どれだけポイントを移動させようと、自動スクロールはポイント行を中央にセンタリングしなくなります。Emacsはポイントが表示されるように常にテキストをスクロールします。ウィンドウの上端または下端かはスクロールの方向に依存します。デフォルトではscroll-conservativelyは 0で、これは常にポイント行がウィンドウの中央にセンタリングされることを意味します。

自動スクロールを制御する他の方法は、変数scroll-stepをカスタマイズすることです。この変数の値はポイントがスクリーンから外れたとき、何行を自動スクロールさせるかを決定します。その行数スクロールしてもポイントが表示されない場合、かわりにポイント行が中央にきます。デフォルト値は0で、スクロール後は常にポイント行が中央にきます。

自動コントロールを制御する3番目の方法は、変数scroll-up-aggressivelyscroll-down-aggressivelyをカスタマイズすることで、これは直接スクロール後のポイントの垂直位置を指定します。scroll-up-aggressivelyの値には、nil(デフォルト)、または0から1までの浮動小数点数fを指定します。ポイントがウィンドウの下端を越えたとき(たとえば前方にスクロールしたとき)、Emacsはウィンドウの高さとウィンドウの下端からポイント行までの割合が、fになるようスクロールします。つまりfを大きくするとより積極的(aggressive)、つまり新しいテキストがより多く表示されることを意味します。デフォルト値nilは0.5と同じです。

同様にscroll-down-aggressivelyは、ポイントがウィンドウの上端を越えたとき(たとえば後方にスクロールしたとき)の振る舞いを設定します。値にはスクロール後のウィンドウの上端からポイント行までのマージンを指定します。つまりscroll-up-aggressivelyを大きくすると、より積極的になります。

変数scroll-conservativelyscroll-step、およびscroll-up-aggressivelyscroll-down-aggressivelyは、互いに矛盾する方法で自動スクロールを制御します。したがって自動スクロールをカスタマイズする場合は、2つ以上の手法を選ぶべきではありません。もし2つ以上の変数をカスタマイズする場合は、scroll-conservatively、次にscroll-step、そして最後にscroll-up-aggressivelyscroll-down-aggressivelyという優先順でカスタマイズしてください。

変数scroll-marginは(たとえscroll-up-aggressivelyやscroll-down-aggressivelyに、上端または下端からのマージンがウィンドウにたいして占める割合より大きくなるようなfを指定していても)、ポイントがウィンドウの上端または下端にどれだけ近づけるかを制限します。変数の値にはスクリーン行の行数です。もしポイントがウィンドウの上端または下端から指定した行数の位置にくると、Emacsは自動的にスクロールします。デフォルトではscroll-marginは0です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4 水平スクロール

水平スクロール(Horizontal scrolling)は、ウィンドウの行を右方向に移動させます。そのため左端の近くのテキストは表示されなくなります。ウィンドウのテキストが水平スクロールされると、テキスト行は折り返されるのではなく、切り詰め(truncated)られます。ウィンドウが切り詰められた行を表示しているとき、ポイントがスクリーンの左端か右端を越えて移動すると、Emacsは自動的に水平スクロールを行います。自動的な水平スクロールを無効にするには、変数auto-hscroll-modenilをセットしてください。また自動的な水平スクロールがオフになっている場合、ポイントがスクリーンの端を越えると、それを知らせるためにカーソルが表示されなくなることに注意してください(テキスト端末の場合カーソルは端に残されます)。

変数hscroll-marginは、自動的なスクロールが起こる前に、ポイントがウィンドウの左端または右端に、どれだけ近づけるかを制御します。変数の値は列数で指定します。たとえば変数の値が5のときは、端から5列目にポイントが移動すると、水平スクロールが発生します。

変数hscroll-stepはmポイントが端に近づきすぎたときに、何列スクロールするかを決定します。デフォルト値の0は、ポイントがウィンドウの中央になるようにスクロールされることを意味します。正の整数はスクロールされる列数を指定します。浮動小数点数は、スクロールされる量を、ウィンドウの幅にたいする割合で指定します。

以下のコマンドで明示的に水平スクロールすることもできます:

C-x <

現在のウィンドウのテキストを左にスクロールします(scroll-left)。

C-x >

右にスクロールします(scroll-right)。

C-x < (scroll-left)は選択された、ウィンドウをウィンドウ幅から2列少ない列数、左にスクロール(いいかえればウィンドウのテキストは左に移動)します。数引数nを指定すると、n列スクロールします。

テキストが左にスクロールされて、ポイントがウィンドウの左端を越えると、ポイントが表示されているテキストに戻るまで、カーソルはフリーズします。これはauto-hscroll-modeの設定とは独立しています(これはテキストを左にスクロールするときのウィンドウの右端での振る舞いだけに影響します)。

C-x > (scroll-right)は、同様に右にスクロールします。ウィンドウが通常の表示(行の先頭がウィンドウの左端に表示されている状態)のときは、それ以上スクロールできないので何も起こりません。これはC-x >の引数を正確に計算する必要がないことを意味します。充分に大きな引数を与えれば、通常の表示が復元されます。

これらのコマンドでウィンドウを水平方向にスクロールすると、自動水平スクロールの下限値がセットされます。自動スクロールはウィンドウのスクロールを続けますが、前にscroll-leftにセットされた値を越えて右にスクロールできなくなります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.5 ナローイング

ナローイング(Narrowing)とはバッファーのある範囲にフォーカスを置き、他の部分を一時的にアクセス不能にすることを意味します。扱うことのできる範囲のことを、アクセス可能範囲(accessible portion)と呼びます。ナローイングを取り消すと、バッファー全体に再びアクセスできるようになります。これをワイドニング(widening)と呼びます。バッファーにたいして、ナローイングにより境界を設けることを、バッファーの制限(restriction)と呼びます。

ナローイングにより、他の部分に気を取られずに、1つのサブルーチンやパラグラフに集中することが容易になります。ナローイングは、置換コマンドやキーボードマクロの繰り返しにより操作される範囲を制限するためにも使われます。

C-x n n

ポイントとマークの間にナローイングします(narrow-to-region)。

C-x n w

バッファー全体をワイドニングして、再びアクセス可能にします(widen)。

C-x n p

現在のページにナローイングします(narrow-to-page)。

C-x n d

現在のdefunにナローイングします(narrow-to-defun)。

バッファーをナローイングしているときは、表示されている範囲がすべてです。残りの部分を見ることはできず、移動もできず(移動コマンドによりアクセス可能範囲の外に移動することはできません)、変更もできません。しかし残りの部分がなくなったわけではないので、ファイルを保存するとアクセス不能範囲のテキストもすべて保存されます。ナローイングが有効なときは、モードラインに‘Narrow’という単語が表示されます。

主要なナローイングコマンドは、C-x n n (narrow-to-region)です。これは現在のバッファーを制限するので、現在のリージョンだけがアクセス可能になり、リージョンの前後のすべてのテキストはアクセス不能になります。ポイントとマークは変化しません。

かわりにC-x n p (narrow-to-page)を使うと、現在のページにナローイングされます。ページの定義については、ページを参照してください。C-x n d (narrow-to-defun)は、ポイントを含むdefunにナローイングします(トップレベルの定義、またはdefunを参照してください)。

ナローイングを取り消す方法は、C-x n w (widen)です。これにより再びバッファーのテキストすべてにアクセス可能になります。

バッファーのどの範囲にナローイングされているかは、C-x =コマンドを使って情報を得ることができます。カーソル位置の情報を参照してください。

ナローイングは、それを理解していないユーザーを容易に混乱させるので、通常narrow-to-regionコマンドは無効になっています。このコマンドを使おうとすると、Emacsは確認を求め、有効にするオプションを提供します。このコマンドを有効にすると、それ以降は確認を求められなくなります。コマンドの無効化を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.6 Viewモード

Viewモードは、バッファーをスクリーン上でスキャンするためのマイナーモードです。このモードは、バッファーを変更せずにスクロールする、便利なコマンドを提供します。Emacsのカーソル移動コマンドとは別に、SPCで前方にスクロール、S-SPCまたはDELで後方にスクロール、sでインクリメンタルサーチができます。

q (View-quit)とタイプするとViewモードが無効になり、Viewモードが有効になる前のパッファーの位置に戻ります。e (View-exit)とタイプするとViewモードが無効になり、現在のバッファーと位置は維持されます。

M-x view-bufferは、既存のEmacsバッファー名を入力として求め、そのバッファーに切り替えてViewモードを有効にします。M-x view-fileはファイル名を入力として求め、そのファイルをvisitしてViewモードを有効にします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.7 Followモード

Followモードは、同じバッファーを表示する2つのウィンドウを、1つの“仮想ウィンドウ”としてスクロールするマイナーモードです。Followモードを使うには、ウィンドウが1つだけのフレームを選択して、それをC-x 3を使って縦に並べて2分割してから、M-x follow-modeとタイプします。それ以降はバッファーをどちらのウィンドウでも編集でき、どちらかのウィンドウをスクロールすると、他方のウィンドウも追従してスクロールします。

Followモードでは、一方のウィンドウで表示されている部分の外にポイントを移動して、もう一方のウィンドウで表示されている部分にポイントを移動させると、そのウィンドウが選択されます。つまり2つのウィンドウを1つの大きなウィンドウとして扱えるのです。

Followモードをオフにするには、もう一度M-x follow-modeとタイプしてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.8 テキストのフェイス

Emacsはフェイス(faces)と呼ばれる仕組みを通じて、テキストをいくつかの異なるスタイルで表示できます。フェイスにはfont(フォント)、height(高さ)、weight(太さ)、slant(傾き)、foreground(前景)およびbackground(背景)、underline(アンダーライン)、overline(オーバーライン)などの様々なフェイス属性(face attributes)を指定できます。ほとんどのメジャーモードはFont Lockモードを通じて、テキストに自動的にフェイスを割り当てます。これらのフェイスを割り当てる方法については、Font Lockモードを参照してください。

現在定義されているフェイスと、それがどのような外観なのかを見るには、M-x list-faces-displayとタイプします。プレフィクス引数を指定すると、このコマンドは正規表現の入力を求め、その正規表現にマッチするフェイスだけを表示します(正規表現の構文を参照してください)。

あるフェイスが、フレームが異なると違って見えるのことがあり得ます。たとえばいくつかのテキスト端末ではすべてのフェース属性、特に特にfont、height、widthはサポートされておらず、指定できるcolorも限られているものがあります。加えて、ほとんどのEmacsフェースは視認性をよくするために、フレームのバックグラウンドが明るい(light)か暗い(dark)かで属性が異なります。デフォルトでは、Emacsはフレームの現在のバックグラウンドカラーに基づいて、表示するフェイスの属性を自動的に選択します。しかし変数frame-background-modeに非nil値を与えると、これをオーバーライドできます。値darkではすべてのフレームの背景色が暗い色であるかのように処理し、値lightではすべてのフレームの背景色が明るい色であるかのように処理させることができます。

フェイスの属性を変えてフェイスをカスタマイズして、将来のEmacsセッション用にカスタマイズ結果を保存することができます。詳細については、フェイスのカスタマイズを参照してください。

defaultフェイスはテキストを表示するデフォルトのフェイスで、そのすべての属性は指定されています。バックグラウンドカラーは、フレームのバックグラウンドカラーとしても使用されます。フェイスのカラーを参照してください。

他の特別なフェイスとしては、cursorフェイスがあります。グラフィカルなディスプレーでは、このフェイスのバックグラウンドカラーは、テキストカーソルを描画するのに使用されます。このフェイスで効果があるのはこの属性だけです。カーソルの下のテキストのフォアグラウンドカラーには、そのテキストのバックグラウンドカラーが使われます。テキスト端末でのテキストカーソルの外観は、cursorフェイスではなく端末により決定されます。

特定のフェイスの属性を指定するのにXのリソースを使うこともできます。Xリソースを参照してください。

Emacsは可変幅フォント(variable-width fonts)を表示できますが、いくつかのコマンド、特にインデントを行うコマンドは、可変幅の文字幅の表示をうまく処理できません。そのため、ほとんどのフェイスにたいして可変幅フォントを使わないこと、特にそれがFont Lockモードに割り当てられている場合は、使わないことを推奨します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.9 フェイスのカラー

フェイスには、さまざまなフォアグラウンドカラーとバックグラウンドカラーをもたせることができます。フェイスにカラーを指定するとき、たとえばフェイスをカスタマイズ(フェイスのカスタマイズを参照してください)するときは、カラーネーム(color name)か、RGBトリプレット(RGB triplet)で指定することができます。

カラーネームとは、‘dark orange’や‘medium sea green’のような、事前に定義された名前です。カラーネームの一覧を見るには、M-x list-colors-displayとタイプします。表示されるカラーの順番を制御するには、list-colors-sortをカスタマイズします。このコマンドをグラフィカルなディスプレーで実行すると、Emacsで既知のカラーネームのすべてが表示されます(これらは標準のX11のカラーネームで、Xのrgb.txtで定義されています)。コマンドをテキスト端末で実行すると、端末で安全に表示することができる一部のカラーだけが表示されます。フェイスには、さまざまなフォアグラウンドカラーとバックグラウンドカラーを持たせることができます。しかしEmacsは、テキスト端末でもX11のカラーネームを理解できます。もしフェイスにX11のカラーネームが指定されている場合、最も近い端末の色で表示されます。

RGBトリプレットは、‘#RRGGBB’という形式の文字列で指定します。R、G、Bの各コンポーネントは、そのそのコンポーネントに関連する色の強度を、1桁から4桁(通常は2桁)の16進数で指定します。各コンポーネントは同じ桁数でなければなりません。16進数のAからFは、大文字小文字を区別しません。

M-x list-colors-displayは、カラーネームと、それに相当するRGBトリプレットを表示します。たとえば‘medium sea green’は‘#3CB371’と同じです。

M-x set-face-foregroundM-x set-face-backgroundで、フェイスのフォアグラウンドとバックグラウンドのカラーを変更できます。これらのコマンドは、ミニバッファーでフェイス名とカラーの入力を求め(補完機能あり)、指定したカラーをフェイスにセットします。フェイスのカラーは全フレームに影響しますが、カスタマイズバッファーやXリソースを使うのとは異なり、将来のEmacsセッションには引き継がれません。フレームパラメーターを使って、特定のフレームのフォアグラウンドとバックグラウンドのカラーをセットすることもできます。フレームパラメーターを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.10 標準フェイス

以下はテキストの外見を指定する標準フェイスです。これらのフェイスの効果が欲しい場合は、特定のテキストに適用することができます。

default

このフェイスは特定のフェイスをもたない普通のテキストに使われます。フェイスのバックグラウンドカラーは、フレームのバックグラウンドカラーとして使用されます。

bold

このフェイスは、デフォルトフォントのbold(太字)バージョンです。

italic

このフェイスはデフォルトフォントのitalic(斜体)バージョンです。

bold-italic

このフェイスはデフォルトフォントのbold italic(太字斜体)バージョンです。

underline

このフェイスはunderline(下線)のテキストです。

fixed-pitch

このフェイスはfixed-width font(固定幅フォント)の使用を強制します。もし望むなら、このフェイスから他の固定幅フォントにカスタマイズするのは妥当ですが、可変幅フォントにするべきではありません。

variable-pitch

このフェイスはvariable-width font(可変幅フォント)の使用を強制します。

shadow

このフェースはまわりのテキストに比べて、そのテキストを目立たなくします。通常これはデフォルトの黒または白のフォアグラウンドカラーではなく、グレーが使われます。

以下は特別な目的のために、一時的にテキストの一部をハイライトするのに使われるフェイスの、不完全なリストです(他にも多くのモードが、そのモードの目的のために、独自のフェイスを定義しています)。

highlight

このフェイスはさまざまなコンテキスト、たとえばハイパーリンク上をマウスカーソルが通過したときなどに、テキストをハイライトするのに使われます。

isearch

このフェイスは、現在のIsearch(インクリメンタル検索)のマッチをハイライトするのに使われます(インクリメンタル検索を参照してください)。

query-replace

このフェイスは、現在の問い合わせ置換(Query Replace)のマッチをハイライトするのに使われます(置換コマンドを参照してください)。

lazy-highlight

このフェイスは、Isearchおよび問い合わせ置換で、“カレントのマッチ(現在カーソルがあるマッチ)以外のマッチ(lazy matches)”をハイライトするのに使われます。

region

このフェイスは、アクティブなリージョンを表示するのに使われます(マークとリージョンを参照してください)。EmacsをGTKサポートつきでビルドした場合、カラーは現在のGTKのテーマから提供されます。

secondary-selection

このフェイスは、Xのセカンダリー選択(secondary X selection)を表示するのに使われます(セカンダリー選択を参照してください)。

trailing-whitespace

このフェイスは、show-trailing-whitespaceは非nilのとき、行末の余分なスペースやタブをハイライトするためのものです(不要なスペースを参照してください)。

escape-glyph

このフェイスは、制御文字やエスケープシーケンスを表示するためのものです(テキストが表示される方法を参照してください)。

nobreak-space

このフェイスは、“no-break”スペース文字を表示するためのものです(テキストが表示される方法を参照してください)。

以下のフェイスは、Emacsフレームの一部の外見を制御します:

mode-line

このフェイスは、現在選択されているウィンドウのモードラインと、ツールキットメニューが使われていないときのメニューバーに使われます。デフォルトでは、グラフィカルなウィンドウでは“raised”効果をだすため影つきで描画され、非ウィンドウの端末ではデフォルトのフェイスを反転して描画されます。

mode-line-inactive

mode-lineと似ていますが、選択されていないウィンドウのモードラインに使われます(mode-line-in-non-selected-windowsが非nilのとき)。このフェイスはmode-lineを継承するので、フェイスを変更するとすべてのウィンドウのモードラインが影響を受けます。

mode-line-highlight

highlightと似ていますが、モードライン上でマウスセンシティブ(マウスに感応する)なテキスト範囲に使われます。通常このようなテキスト範囲は上にマウスポインターがくると、ツールチップ(ツールチップを参照してください)をポップアップします。

mode-line-buffer-id

このフェイスは、モードライン上でバッファーを識別する部分に使われます。

header-line

mode-lineと似ていますが、ウィンドウのヘッダーラインのためのものです。モードラインがウィンドウの一番下に表示されるように、ヘッダーラインはウィンドウの一番上に表示されます。ほとんどのウィンドウはヘッダーラインを持ちません。Infoモードのような特別なモードだけがヘッダーラインを持ちます。

vertical-border

このフェイスは、テキスト端末上でウィンドウを縦に分割するとき使われます。

minibuffer-prompt

このフェイスは、ミニバッファーで入力を求めるプロンプトのテキストに使われます。デフォルトでは、Emacsは自動的にプロンプトのテキストの、テキストプロパティのリストminibuffer-prompt-propertiesに、このフェイスを追加します(この変数はミニバッファーに入ったときに効果をあらわします)。

fringe

グラフィカルなウィンドウでの、左右のフリンジのためのフェイスです(フリンジはEmacsフレームで、テキストエリアとウィンドウの左右の境界線の間にある、狭い領域です)。ウィンドウのフリンジを参照してください。

cursor

このフェイスの:background属性は、テキストカーソルのカラーを指定します。カーソルの表示を参照してください。

tooltip

このフェイスは、ツールチップのテキストに使われます。デフォルトでは、EmacsがGTKサポートつきでビルドされた場合、ツールチップはGTKを通じて描画されるので、このフェイスは効果がありません。ツールチップを参照してください。

mouse

このファイスは、マウスポインターのカラーを決定します。

以下のフェイスは、Emacsフレームの一部の外見を制御するときと同様ですが、テキスト端末またはEmacsをXサポートつき(ただしツールキットサポートなし)でビルドしたときだけ使われます(それ以外の場合、フレームの対応する各要素は広義なシステム設定により決定されます)。

scroll-bar

このフェイスは、スクロールバーの外見を決定します。スクロールバーを参照してください。

tool-bar

このフェイスは、ツールバーのアイコンのカラーを決定します。ツールバーを参照してください。

menu

このフェイスはEmacsメニューのカラーとフォントを決定します。メニューバーを参照してください。

tty-menu-enabled-face

このフェイスは、テキスト端末で利用可能なメニューアイテムを表示するのに使われます。

tty-menu-disabled-face

このフェイスは、テキスト端末で利用不可なメニューアイテムを表示するのに使われます。

tty-menu-selected-face

このフェイスは、テキスト端末でマウスをクリックするか、RETを押せば選択できるメニューアイテムを表示するのに使われます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.11 テキストのスケール

現在のバッファーのデフォルトフェイスを大きくするには、C-x C-+またはC-x C-=をタイプします。小さくするには、C-x C--をタイプします。デフォルトのフェースの大きさ(グローバル)に復元するには、C-x C-0とタイプします。これらのキーは、すべて同じコマンドtext-scale-adjustにバインドされており、このコマンドは最後のキーを判断して動作を決定します。

これらのコマンドの最後のキーは、C-xを前置せずに繰り返すことができます。たとえばC-x C-= C-= C-=は、フェイスの大きさを3段階に大きくします。各ステップで大きくなる倍率は1.2です。この倍率を変更するには、変数text-scale-mode-stepをカスタマイズします。text-scale-adjustコマンドに数引数0を指定すると、C-x C-0とタイプしたのと同様に、デフォルトの大きさに復元します。

コマンドtext-scale-increaseおよびtext-scale-decreaseは、C-x C-+およびC-x C--と同様、デフォルトフェイスを大きくまたは小さくします。キーをバインドする場合、これらのコマンドは、text-scale-adjustより便利でしょう。

コマンドtext-scale-setは、数引数で現在のバッファーのデフォルトフェイスの大きさを、絶対倍率で指定します。

上記のコマンドは、現在のフォント倍率が1以外のときは、自動的にマイナーモードtext-scale-modeを有効にし、そうでない場合は無効にします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.12 Font Lockモード

Font Lockモードはマイナーモードで、常に特定のバッファーにローカルで、バッファーのテキストにフェイスを割り当てます(またはフォント表示化(fontifies)します)。各バッファーのメジャーモードは、Font Lockモードにどのテキストをフォント表示可するか指示します。たとえばプログラム言語のモードは、コメントや文字列、関数名のような、構文に関連する構成をフォント表示化します。

Font Lockモードはデフォルトで有効です。現在のバッファーでこれを切り替えるには、M-x font-lock-modeとタイプします。正の数引数は無条件にFont Lockモードを有効にし、負または0の数引数を指定すると無効になります。

M-x global-font-lock-modeとタイプすると、すべてのバッファーでFont Lockモードを切り替えます。このセッティングを将来のEmacsセッションに引き継ぐには、変数global-font-lock-modeをカスタマイズ(Easy Customizationインターフェースを参照してください)するか、以下の行をinitファイルに追加します。

(global-font-lock-mode 0)

Global Font Lockモードを無効にしていたとしても、モードフック(mode hooks)に関数を追加することにより、特定のメジャーモードでFont Lockモードを有効にできます。たとえばCファイルの編集でFont Lockモードを有効にするには、以下のように記述します:

(add-hook 'c-mode-hook 'font-lock-mode)

Font Lockモードは、font-lock-string-facefont-lock-comment-faceのような、いくつかの特別な名前のフェイスを使って処理を行います。これらすべてを簡単に探す方法には、M-x customize-group RET font-lock-faces RETを使います。それからカスタマイズバッファーでそれらのフェイスの外見をカスタマイズできます。フェイスのカスタマイズを参照してください。

変数font-lock-maximum-decorationをカスタマイズして、Font Lockモードで適用されるフォント表示化のレベルを変更できます。値には数字を指定します(1は最小限のフォント表示化で、3という高いレベルのモードもあります)。tは“可能な限り高く”という意味です(デフォルト)。特定のモードに異なる数字を指定することもできます。たとえばC/C++モードにはレベル1を指定して、他のモードにはデフォルトのレベルを適用するには、以下の値を使います:

'((c-mode . 1) (c++-mode . 1)))

コメントと文字列のフォント表示化(または“構文的”なフォント表示化)は、バッファーのテキストの構文構造の解析に依存します。速度向上のため、Lispモードを含めたいくつかのモードでは、特別な慣習に依存しています。たとえば一番左の列の開きカッコ(open-parenthesis)または開き大カッコ(open-brace)は常にdefunの開始であり、すなわち常に文字列またはコメントの外部にあるとみなす、というように解析します。したがって文字列やコメントの中で、一番左の列に開きカッコや開き大カッコを記述するのは避けるべきです。詳細については、左端の慣習を参照してください。

常にバッファーローカルな変数font-lock-beginning-of-syntax-functionは、Font Lockモードがコメント、もしくは文字列の外であることが保証される位置を探す方法を指定します。それが最左列がカッコであるという慣習をもつモードでは、変数のデフォルト値はbeginning-of-defunで、Font Lockモードがその慣習にしたがうよう指定します。この変数にnilをセットすると、Font Lockモードはもはや慣習には依存しなくなります。これでまちがった結果を避けられますが、その代償は時として、変更したテキストをフォント表示化するのに、バッファのテキストをバッファの先頭から再走査しなければならない場合もあります。これはスクロールに相当な速度低下を招きかねず、大きなバッファーの最後に近い位置では、それが特に顕著になります。

Font Lockは、ほとんどのモードで既存のパターンをハイライトしますが、追加のパターンをフォント表示化したいときもあるでしょう。特定のモードでハイライトするパターンを追加するには、関数font-lock-add-keywordsを使うことができます。たとえばCコメント中の‘FIXME:’という単語をハイライトするには、以下を使います:

(add-hook 'c-mode-hook
          (lambda ()
           (font-lock-add-keywords nil
            '(("\\<\\(FIXME\\):" 1
               font-lock-warning-face t)))))

font-lockのハイライトパターンからキーワードを削除するには、関数font-lock-remove-keywordsを使います。Search-based Fontification in The Emacs Lisp Reference Manualを参照してください。

大きなバッファーのフォント表示化には、長い時間を要することもあります。ファイルをvisitしたとき大きな遅延を避けるには、Emacsが最初はバッファーの表示された部分だけをフォント表示化するようにします。バッファーをスクロールすると、新たに表示される部分がフォント表示化されます。このタイプのFont Lockは、Just-In-Time(またはJIT) Lockと呼ばれます。カスタマイズグループ‘jit-lock’の値をカスタマイズすることにより、アイドル状態のときにフォント表示可を行うことも含めて、JIT Lockがどのように振る舞うか制御できます。特定のアイテムのカスタマイズを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.13 インタラクティブなハイライト

Highlight Changesモードは、最近変更されたバッファー部分のテキストに、異なるフェイスを与えることによりハイライトするマイナーモードです。Highlight Changesモードを有効または無効にするには、M-x highlight-changes-modeを使います。

Hi Lockモードは、指定した正規表現にマッチするテキストをハイライトする、マイナーモードです。たとえば、プログラムのソースファイルで、特定の変数へのすべての参照をハイライトしたり、何らかのプログラムの大量の出力の一部をハイライトしたり、記事中の特定の名前をハイライトするために使用できます。Hi Lockモードを有効または無効にするには、コマンドM-x hi-lock-modeを使います。すべてのバッファーでHi Lockモードを有効にするには、M-x global-hi-lock-modeを使うか、.emacsファイルに(global-hi-lock-mode 1)と記述してください。

Hi LockモードはFont Lockモード(Font Lockモードを参照してください)と同じように動作しますが、ハイライトするパターンを明示的に正規表現で指定します。これらは以下のコマンドで制御できます:

M-s h r regexp RET face RET
C-x w h regexp RET face RET

regexpにマッチするテキストを、フェイスfaceを使ってハイライトします(highlight-regexp)。ハイライトはバッファーがロードされている限り残ります。たとえば単語“whim”をデフォルトのフェイス(黄色いバックグラウンドカラー)でハイライトするには、M-s h r whim RET RETとタイプします。ハイライトには任意のフェイスを使うことができますが、Hi Lockモードはモード自身でいくつかのフェイスを提供しており、それらはデフォルト値のリストに事前ロードされています。フェイスの入力プロンプトでM-nM-pを使うことにより、それらを巡回することができます。

オプションhi-lock-auto-select-faceに非nil値をセットすることにより、このコマンド(およびその他のフェイスを読みとるHi Lockコマンド)は、入力を求めることなく、デフォルト値のリストから次のフェイスを自動的に選択します。

このコマンドを複数回使用して、さまざまな正規表現を指定し、それぞれを異なる方法でハイライトできます。

M-s h u regexp RET
C-x w r regexp RET

regexpのハイライトを解除します(unhighlight-regexp)。

メニューから呼び出した場合、ハイライト解除する正規表現をリストから選択します。キーボードから呼び出した場合は、ミニバッファーを使います。一番最近追加された正規表現を表示し、M-nを使って次に古い正規表現、M-pで次に新しい正規表現を表示できます(手入力もでき、その場合は補完機能つきです)。ハイライト解除したい正規表現がミニバッファーに表示されたら、RETを押してミニバッファーを抜けだし、ハイライトを解除できます。

M-s h l regexp RET face RET
C-x w l regexp RET face RET

regexpとのマッチを含む行全体を、フェイスfaceを使ってハイライトします(highlight-lines-matching-regexp)。

M-s h p phrase RET face RET
C-x w p phrase RET face RET

phraseにマッチするフレーズを、フェイスfaceでハイライトします(highlight-phrase)。phraseには正規表現を指定できますが、スペースは空白文字にマッチする正規表現に置き換えられます。また、先頭に小文字を使用することにより、大文字小文字を区別しなくなります。

M-s h .
C-x w .

ポイントの近くで見つかったシンボルを、次に利用可能なフェイスでハイライトします(highlight-symbol-at-point)。

M-s h w
C-x w b

現在ハイライトを行っている正規表現/フェイスのペアを、バッファーのポイント位置に挿入します。挿入はプログラムを変更してしまわないように、コメント文字列でコメント化されます(このキーバインドはhi-lock-write-interactive-patternsコマンドを実行します)。

これらのパターンは、コメントからも逆抽出されます。それは、コメントに記述されたテキストが適正で、M-x hi-lock-find-patternsを呼び出した、あるいはHi Lockモードが有効なときファイルをvisit(これはhi-lock-find-patternsを実行します)したときです。

M-s h f
C-x w i

正規表現/フェイスのペアを、現在のバッファーのコメントから抽出します(hi-lock-find-patterns)。これらのコマンドを使えば、highlight-regexpでパターンを対話的に入力、hi-lock-write-interactive-patternsでそれをファイルに保存、それらを編集(あるマッチのフェイスを別のフェイスにしたり)、そして最後にこのコマンド(hi-lock-find-patterns)で編集済みのパターンを、Hi Lockのハイライトに適用することができます。

変数hi-lock-file-patterns-policyはファイルをvisitしたとき、Hi Lockモードがパターンを探して、それを自動的に抽出するべきかを制御します。値にはnil(ハイライトしない)、ask(ユーザーに尋ねる)、または関数を指定します。関数の場合、hi-lock-find-patternsはパターンを引数としてその関数を呼び出します。関数が非nilを返した場合、パターンを使用します。デフォルトはaskです。直接hi-lock-find-patternsを呼び出した場合、この変数の値に関係なく、常にパターンはハイライトされることに注意してください。

現在のメジャーモードのシンボルが、リストhi-lock-exclude-modesのメンバーの場合、hi-lock-find-patternsは何もしません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.14 ウィンドウのフリンジ

グラフィカルなディスプレーでは、通常Emacsの各ウィンドウの左右の端に、狭いフリンジ(fringes: 縁、へり)があります。フリンジは、ウィンドウのテキストに関する情報を提供するシンボルの表示に使用されます。M-x fringe-modeとタイプしてフリンジを無効にしたり、幅を変更できます。このコマンドは全フレームのフリンジに影響します。選択されたフレームのフリンジだけを変更するには、M-x set-fringe-styleを使います。変数fringe-modeをカスタマイズして、フリンジへの変更を永続化できます。

フリンジのもっとも一般的な使われかたは、継続行の表示です(継続行を参照してください)。テキストの1行が複数のスクリーン行に分割されるとき、最初の行を除いた各行の左フリンジには曲矢印が表示され、その行の先頭が“実際の行頭ではない”ことを示します。そして、最後の行を除いた各行の右フリンジにも曲矢印が表示され、その行の最後が“実際の行末ではない”ことを示します。行の方向が右から左(双方向の編集を参照してください)の場合、フリンジの曲矢印の意味は逆になります。

行が切り詰められているときは水平方向の直矢印を表示して、“この行には水平スクロールしなければ見ることのできないテキストがある”ことを示します。矢印の上でマウスをクリックすれば、矢印の指す方向に水平スクロールします。

フリンジはバッファーの境界(バウンダリーの表示を参照してください)や、デバッグ(Emacs下でのデバッガーの実行を参照してください)しているプログラムが実行中であることを示すためにも使われます。

現在の行がウィンドウの幅と正確に一致して、ポイントがその行の行末にある場合、フリンジにはカーソルが描画されます。これを無効にするには、変数overflow-newline-into-fringenilに変更します。これによりEmacsはウィンドウ幅と同じ長さの行にたいしても、継続または切り詰めを行います。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.15 バウンダリーの表示

グラフィカルなディスプレーでは、Emacsはバッファーのバウンダリー(boundary: 境界)を、フリンジに表示することもできます。この機能を有効にすると、最初の行と最後の行ではフリンジに、かぎカッコが表示されます。上矢印または下矢印の場合、それはウィンドウをその方向に、もっとスクロールできることを示します。

バッファーローカルな変数indicate-buffer-boundariesは、バッファーのバウンダリーととウィンドウのスクロールが、フリンジでどのように表示されるかを制御します。値がleft(またはright)の場合、かぎカッコと矢印のビットマップは、左フリンジ(または右フリンジ)に表示されます。

値がalist(association list: 連想リスト)の場合、各要素の(indicator . position)で、標識(indicator)の位置(position)を指定します。indicatorにはtopbottomupdown、またはt(指定されていない標識のデフォルト位置)を指定します。positionにはleftright、またはnil(標識を表示しない)を指定します。

たとえば((top . left) (t . right))は、最上行の左フリンジにかぎカッコを表示し、右フリンジには最下行のかぎカッコとスクロール矢印を表示します。左フリンジにかぎカッコだけを表示させる場合は、((top . left) (bottom . left))を使います。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.16 不要なスペース

意識せずに不必要なスペースを行末に残してしまったり、バッファーの最後に空行を残してしまうことはよくあります。ほとんどの場合、そのような行末の空白文字(trailing whitespace)は何の影響も及ぼしませんが、厄介物になる場合もあります。

バッファーローカルな変数show-trailing-whitespacetにセットすることにより、行末の空白文字を可視化できます。これによりEmacsはフェイスtrailing-whitespaceで、行末の空白文字を表示します。

この機能は行末に空白文字を含む行の、行末にポイントがあるときは適用されません。厳密にいえば、これも“行末の空白文字”なのですが、それを特別に表示してしまうと、新しいテキストをタイプするとき面倒です。このような特別なケースでは、ポイントの位置に表示されるカーソルより、空白文字があることが自明だからです。

M-x delete-trailing-whitespaceとタイプすると、すべての行末の空白文字を削除します。このコマンドは、バッファー内の各行の行末にあるすべての余分なスペースと、バッファーの最後にある空行を削除します。バッファー内の空行を削除しない場合は、変数delete-trailing-linesnilに変更してください。リージョンがアクティブのときは、リージョン内の各行の行末の余分なスペースを削除します。

グラフィカルなディスプレーでは、Emacsはウィンドウの最後の使われていない行の左フリンジに小さなイメージを表示して、それを示すことができます。このイメージはバッファーのテキストが何も含まれていないスクリーン行に表示されるので、バッファーの最後にある空行は、このイメージが表示されないことで見分けることができます。この機能を有効にするにはバッファーローカルな変数indicate-empty-linesに非nil値をセットします。すべての新しいバッファーでこの機能を有効または無効にするには、この変数のデフォルト値をセットします(例 (setq-default indicate-empty-lines t))

Whitespaceモードはバッファーローカルなマイナーモードで、バッファー内にある多くの種類の空白文字を“視覚化”します。これは空白文字を特別なフェイスで描画するか、特別なグリフで表示することにより行われます。このモードを切り替えるには、M-x whitespace-modeとタイプします。視覚化される空白文字の種類は、リスト変数whitespace-styleにより決定されます。以下はリストに指定できる要素の一部です(完全なリストは変数のドキュメントを参照してください)。

face

特別なフェイスを使った視覚化をすべて有効にします。この要素には特別な意味があります。もしこれがリストに含まれていない場合、space-marktab-marknewline-markを除く他の視覚化は効果がなくなります。

trailing

行末の空白文字をハイライトします。

tabs

タブ文字をハイライトします。

spaces

スペースおよびnon-breaking space文字をハイライトします。

lines

80列以上の行をハイライトします。列の上限を変更するには、変数whitespace-line-columnをカスタマイズします。

newline

改行をハイライトします。

empty

空行をハイライトします。

space-mark

スペースとnon-breaking文字を特別なグリフで描画します。

tab-mark

タブ文字を特別なグリフで描画します。

newline-mark

改行文字を特別なグリフで描画します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.17 選択的な表示

Emacsには、与えられたレベルより多くインデントされた行を隠す機能があります。これをプログラムの概要を理解するのに使うことができます。

現在のバッファーの行を隠すには、数引数nを指定してC-x $ (set-selective-display)をタイプします。すると少なくともn列のインデントをもつ行は、スクリーンに表示されなくなります。隠された行の存在を示すのは、表示されている行末に表示された3つのドット(‘’)だけで、これは1行以上の行が後に隠されていることを意味します。

コマンドC-nおよびC-pは、隠された行が存在しないかのように、隠された行をスキップして移動します。

隠された行は依然としてバッファーに存在し、ほとんどの編集コマンドはそれらを見ることができるので、隠されな行にポイントを移動することもありえます。これが起こるとカーソルは前の行の最後、つまり3つのドットの後ろに表示されます。ポイントが表示されている行の行末、つまり改行の前にある場合、カーソルは3つのドットの前に表示されます。

隠された行のすべてを再び表示するには、引数を指定せずにC-x $とタイプしてください。

変数selective-display-ellipsesnilをセットすると、隠された行があることを示す3つのドットは表示されなくなり、隠された行があることを示す視覚的な表示はなくなります。変数がセットされると、それは自動的にローカルになります。

バッファーのテキストの一部を隠す他の方法については、Outlineモードを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.18 モードラインのオプション

バッファーのパーセント表示posは、ウィンドウの上端がバッファーのどの場所にあるかを100分率で示します。M-x size-indication-modeとタイプしてSize Indicationモードをオンにすることにより、バッファーのサイズを追加で表示できます。サイズは以下のようにパーセント表示のすぐ後に表示されます:

pos of size

sizeは、バッファーの文字数を人間が理解しやすい形式(‘k’は10^3、‘M’は10^6、‘G’は10^9などの短縮形が使用されます)で表示します。

Line Numberモードが有効なとき、ポイント位置の現在の行番号はモードラインに表示されます。M-x line-number-modeコマンドを使って、Line Numberモードのオンとオフを切り替えることができます(通常はオンです)。行番号はそれが何であるかを示す文字‘L’とともに、バッファーのパーセント表示posの後ろに表示されます。

同様に、M-x column-number-modeでColumn numberモードをオンにすることにより、現在の列番号を表示できます。列番号は文字‘C’で示されます。しかし両方のモードが有効になっているときは、行番号と列番号は‘L’や‘C’ではなく、‘(561,2)’のようにカッコつきで表示されます。マイナーモードとこれらのコマンドの使い方については、マイナーモードを参照してください。

ナローイング(ナローイングを参照してください)によりバッファーを制限している場合、アクセスできる部分にもとづいた行番号が表示されます。そのため、これはgoto-lineの引数として使用するには適しません(ファイル全体にたいする行番号を見るには、what-lineコマンドを使います)。

バッファーが非常に大きい場合(line-number-display-limitの値より大)、速度が遅くなるのでEmacsは行番号を計算しません。そのためモードラインに行番号は表示されません。この制限を取り除くには、line-number-display-limitnilをセットします。

バッファーの行が長いときも、行番号の計算が遅くなります。この理由により、Emacsはポイントの近くの行の幅の平均文字数が、line-number-display-limit-widthより大きいときは、行番号を表示しません。デフォルト値は200文字です。

Emacsはオプションで、時刻とシステムロードを、すべてのモードラインで表示できます。この機能を有効にするには、M-x display-timeとタイプするか、オプションdisplay-time-modeをカスタマイズします。モードラインに追加される情報は以下のような形式です:

hh:mmpm l.ll

ここでhhmmは時間と分で、後ろに‘am’と‘pm’がつきます。l.llは、過去数分間における、システム全体で実行中または実行準備ができている(例: 利用可能なプロセッサー待ち)プロセスの平均数です(オペレーティングシステムがサポートしないフィールドは表示されません)。時刻を24時間表示にしたいときは、変数display-time-24hr-formattをセットしてください。

もし未読メールがある場合、ロードレベルの後ろに‘Mail’という単語が表示されます。グラフィカルなディスプレーでは、display-time-use-mail-iconをカスタマイズすることにより、‘Mail’のかわりにアイコンを使うことができます。これによりモードラインのスペースが多少節約できます。display-time-mail-faceをカスタマイズして、メールの表示を目立たせることができます。display-time-mail-fileを使ってチェックするメールファイルを指定したり、display-time-mail-directoryで受信メールのディレクトリーを指定できます(ディレクトリー内の空でない普通のファイルは、“新しい受信メール”と判断されます)。

Emacsをラップトップコンピューターで実行している場合、コマンドdisplay-battery-modeを使うか、変数display-battery-modeをカスタマイズすることにより、モードラインにバッテリー充電状況を表示できます。変数battery-mode-line-formatは、バッテリーの充電状況の表示方法を決定します。モードラインに表示されるメッセージの正確さはオペレーティングシステムに依存しており、通常はバッテリーの充電トータルにたいする現在のバッテリー充電率が表示されます。

グラフィカルなディスプレーでは、モードラインは立体的に描画されます。この効果が気に入らない場合は、mode-lineフェイスをカスタマイズして、box属性にnilをセットすることにより無効にできます。フェイスのカスタマイズを参照してください。

デフォルトでは、選択されていないウィンドウのモードラインは、mode-line-inactiveと呼ばれる、別のフェイスで表示されます。選択されたウィンドウのモードラインだけが、mode-lineフェイスで表示されます。これにより、どのウィンドウが選択されているかがわかりやすくなります。モードラインがないミニバッファーが選択されているときは、ミニバッファーをアクティブにしたウィンドウのモードラインが、mode-lineで表示されます。結果として通常のミニバッファーの使用では、モードラインは変化しません。

変数mode-line-in-non-selected-windowsnilにセットすることにより、mode-line-inactiveの使用を無効にできます。これによりすべてのモードラインが、mode-lineフェイスで表示されます。

モードラインに表示される改行フォーマットは、変数eol-mnemonic-unixeol-mnemonic-doseol-mnemonic-mac、およびeol-mnemonic-undecidedをセットすることにより、カスタマイズできます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.19 テキストが表示される方法

ほとんどの文字は、印字文字(printing characters)です。これらの文字がバッファーに存在すると、スクリーンにそのまま表示されます。印字文字にはASCIIの数字、文字、区切り文字、同様に多くの非ASCII文字が含まれます。

ASCII文字セットには、印字されない制御文字(control characters)が含まれます。その中でも特別に表示されるものが2つあります。1つ目は改行文字(UnicodeのコードポイントU+000A)で、新しい行を開始するのに表示されます。2つ目はタブ文字(U+0009)で、次のタブストップ(通常は8文字ごと)までをスペースで表示します。タブを何文字のスペースで表示するかは、バッファーローカルな変数tab-widthで制御され、1から1000の整数で指定しなければなりません。バッファーのタブ文字がどのように表示されるかは、コマンドとしてのTABの定義には関係ないことに注意してください。

他のASCII制御文字としては、U+0020(8進の40、10進の32)より下のコードがあり、それらはカレット(‘^’)と、その後ろに非制御文字バージョンの文字を続けて、escape-glyphフェイスで表示されます。たとえば文字‘control-A’(U+0001)は、‘^A’と表示されます。

コードU+0080(8進の200)からU+009F(8進の237)までのrawバイトは、escape-glyphフェイスにより、8進エスケープシーケンス(octal escape sequences)で表示されます。たとえば文字コードU+0098(8進の230)は、‘\230’と表示されます。バッファーローカルな変数ctl-arrownilに変更すると、ASCII制御文字も、カレットエスケープシーケンスではなく、8進エスケープシーケンスで表示されます。

ASCII文字の中には、ASCIIのスペースやハイフン(マイナス記号)と同じ外観を持つものがあります。そのような文字は、意識せずにバッファーに入力されたとき(たとえばyankなどで)、問題となることがあります。たとえばソースコードコンパイラーは通常、非ASCIIのスペースを、空白文字として扱いません。この問題に対処するため、Emacsはそのような文字を特別な方法(U+00A0(no-break space)はnobreak-spaceフェイス、U+00AD(soft hyphen)、U+2010(hyphen)、U+2011 (non-breaking hyphen)はescape-glyphフェイス)で表示します。これを無効にするには、変数nobreak-char-displaynilに変更します。この変数に非nilかつ非tの値を与えると、Emacsはハイライトされたバックスラッシュの後に、スペースまたはハイフンを表示します。

特定の文字コードの表示のカスタマイズは、ディスプレーテーブル(display table)によって行われます。Display Tables in The Emacs Lisp Reference Manualを参照してください。

グラフィカルなディスプレーでは、Emacsが利用可能なフォントにグリフがない文字がいくつかあります。これらのグリフがない文字(glyphless characters)は、通常16進文字を含むボックスで表示されます。テキスト端末では、端末エンコーディング(端末入出力にたいするコーディングシステムを参照してください)で表示できない文字は、通常クエスチョン記号で表示されます。表示方法は、変数glyphless-char-display-controlで制御できます。詳細は、Glyphless Character Display in The Emacs Lisp Reference Manualを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.20 カーソルの表示

テキスト端末では、カーソルの外見は端末により制御され、大部分はEmacsの制御が及びません。いくつかの端末は、“普通の”固定的なカーソルと、“目立つ”点滅カーソルの2種類を提供します。デフォルトではEmacsは目立つカーソルを使い、Emacsを開始または再開したときは、そのカーソルに切り替えます。変数visible-cursornilの場合、Emacsを開始または再開したとき、普通のカーソルを使います。

グラフィカルなディスプレーでは、より多くのテキストカーソルのプロパティを変更できます。カラーを変えるには、フェイスcursorの、属性:backgroundを変更します(このフェイスの他の属性には、何を指定しても効果はありません。カーソルの下にあるテキストはフレームのバックグラウンドカラーを使って描画されます)。外見を変更するには、バッファーローカルな変数cursor-typeをカスタマイズします。有効な値は、box(デフォルト)、hollow(中抜きのボックス)、bar(垂直のバー)、(bar . n)(幅がnピクセルの垂直バー), hbar(水平バー)、(hbar . n)(高さがnピクセルの水平バー)、またはnil(カーソルなし)です。

デフォルトでは、カーソルは10回点滅する間にEmacsに何も入力がないと、点滅をストップします。そして何らかの入力イベントがあると、また0からカウントを再開します。変数blink-cursor-blinksをカスタマイズして、これを制御できます。変数の値には、何の入力もないとき点滅をストップする点滅回数を指定します。変数に0または負の値をセットすると、カーソルはずっと点滅したままになります。カーソルの点滅を無効にするには、変数blink-cursor-modenilに変更するか(Easy Customizationインターフェースを参照してください)、initファイルに以下の行を追加します:

  (blink-cursor-mode 0)

リスト変数blink-cursor-alistをカスタマイズして、カーソルが"点滅をストップしたとき"、どのように見えるかを変更できます。リストの各要素は、(on-type . off-type)という形式を指定します。on-typeには、点滅しているときのカーソルを指定します(on-typeには、上で説明したカーソルタイプを指定します)。そしてoff-typeには、点滅していないときのカーソルを指定します。

タブ文字のように“特別に幅が広い”文字もあります。そのような文字上にカーソルがあるとき、通常はデフォルトの文字幅で描画されます。カーソルを文字幅に伸ばすには、変数x-stretch-cursorを非nil値に変更してください。

選択されていないウィンドウのカーソルは、通常点滅していない中抜きのボックスで表示されます(カーソルにバーを使っている場合、より細いバーで表示されます)。選択されていないウィンドウでカーソルを非表示にするには、変数cursor-in-non-selected-windowsnilに変更してください。

カーソルをよりはっきりと表示させるために、HL Lineモードを使用できます。このモードでは、ポイントを含む行がハイライトされます。現在のバッファーで有効または無効にするには、M-x hl-line-modeを使います。このモードをグローバルに有効または無効にするには、M-x global-hl-line-modeを使用してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.21 行の切り詰め

Emacsは行を継続(継続行を参照してください)するかわりに、長い行を切り詰めて表示できます。これは、スクリーンやウィンドウの幅より長い行は、全体が表示されないことを意味します。グラフィカルなディスプレーでは、行が切り詰められている場合、フリンジに小さな直矢印が表示されます。テキスト端末では、左端または右端の列に‘$’が表示されます。

水平スクロールは、自動的に行の切り詰めを引き起こします(水平スクロールを参照してください)。特定のバッファーにたいして行の切り詰めを明示的に有効にするには、コマンドM-x toggle-truncate-linesを使います。これは変数truncate-linesをローカルに変更することで機能します。値が非nilのときは、長い行は切り詰められ、nilのときは複数のスクリーン行に分けられます。変数truncate-linesをセットすると、現在のバッファーにローカルに適用されます。値を変更するまでは、デフォルト値(nil)が使われます。

ウィンドウを分割して狭くなりすぎたとき、Emacsは自動的に行の切り詰めを有効にします。これを制御する変数truncate-partial-width-windowsについては、ウィンドウの分割を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.22 Visual Lineモード

このモードでは、通常の行継続の代わりに、単語での折り返しが使われます。通常の行継続のように、長い論理行は2行以上のスクリーン行に分割されます。しかしEmacsはウィンドウの右端の近くの、単語の境界で折り返すよう試みます。これは単語の途中で折り返さないことにより、可読性を高めるためです。

単語での折り返しは、オプションのマイナーモードである、Visual Lineモードで有効になります。現在のバッファーでVisual Lineモードの有効と無効を切り替えるには、M-x visual-line-modeとタイプします。メニューバーからVisual Lineモードを有効にすることもできます(Optionsメニューから、サブメニュー‘Line Wrapping in this Buffer’の、メニューアイテム‘Word Wrap (Visual Line Mode)’を選択します)。Visual Lineモードが有効なときは、モードラインのモード表示に‘wrap’という文字が表示されます。コマンドM-x global-visual-line-modeは、全バッファーのVisual Lineモードを切り替えます。

Visual Lineモードでは、いくつかのコマンドは論理行ではなくスクリーン行に作用します。C-a (beginning-of-visual-line)はスクリーン行の先頭に移動し、C-e (end-of-visual-line)はスクリーン行の最後に移動、C-k (kill-visual-line)はテキストをスクリーン行の最後までkillします。

論理行単位で移動するには、コマンドM-x next-logical-lineまたはM-x previous-logical-lineを使います。これらのコマンドはVisual Lineモードが有効であるかにかかわらず、次または前の論理行に移動します。これらのコマンドを頻繁に使う場合は、キーを割り当てると便利でしょう。キーのリバインドを参照してください。

デフォルトでは、単語の折り返し表示はフリンジに表示されません。Visual Lineモードは、長い論理行を含むファイルを編集するときに使われる場合があり、折り返し行すべてにフリンジの表示をすると見にくくなるためです。これを変更するには、変数visual-line-fringe-indicatorsをカスタマイズしてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.23 ディスプレーのカスタマイズ

このセクションでは、Emacsスクリーンの外観を制御するさまざまな変数を説明します。初心者はスキップして構いません。

変数visible-bellが非nilの場合、Emacsは通常ベルサウンドを鳴らす場面で、スクリーン全体を点滅するよう試みます。端末がスクリーンを点滅させる方法を持たないとき、この変数は効果がありません。

変数echo-keystrokesは、複数文字キーのエコー表示を制御します。値にはエコーが開始されるまでの秒数を指定します。0の場合、エコーされません。何かエコーされるべきものがあるときは、この変数の値が効果をもちます。エコーエリアを参照してください。

グラフィカルなディスプレーでは、Emacsはビジーのときにマウスポインターを砂時計で表示します。この機能を無効にするには、変数display-hourglassnilをセットします。変数hourglass-delayは砂時計が表示されるまでの“busy time”を、秒数で指定します。デフォルトは1です。

マウスポインターがEmacsのフレーム内にある場合、文字をタイプしてテキストを挿入するまでの間、テキストを隠さないよう、Emacsはマウスポインターを非表示にします(正確に言うとマウスポインターの非表示は、“自己挿入的な(self-inserting)”文字をタイプしたときです。テキストの挿入を参照してください)。マウスポインターを動かすと、再び表示されます。この機能を無効にするには、変数make-pointer-invisiblenilをセットしてください。

グラフィカルなディスプレーでは、変数underline-minimum-offsetは、アンダーラインされたテキストの、アンダーラインから文字の基底線までの最小距離を、ピクセルで決定します。デフォルトでは値は1です。この変数を増加させると、特定のフォントにおいて、アンダーラインされたテキストの可読性が向上します(しかしEmacsは、カレント行にはアンダーラインを描画しません)。変数x-underline-at-descent-lineは、テキストにアンダーラインを引く方法を決定します。デフォルトはnilで、これはフォントの基底線と同じレベルに描画されることを意味します。非nilに変更すると、Emacsはフォントが同じ大きさになるよう、アンダーラインを少し下に描画します。

変数overline-marginは、テキストの上のオーバーラインの垂直位置を、オーバーライン自身の高さも含めて、ピクセルで指定します。デフォルトは2です。

テキスト端末には、bold(太字)かつ反転されたテキストが読みにくいものがあります。関数tty-suppress-bold-inverse-default-colorsに、引数非nilを与えて呼び出すと、このような場合のbold-faceの効果を抑制します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15 検索と置換

他のエディターと同様、Emacsには文字列を検索(search)するコマンドがあります。Emacsには、文字列を違う文字列で置き換える(replace)コマンドもあります。また、同じことを行いますが、固定文字列ではなくパターンを検索するコマンドもあります。

tagsテーブルの制御下にある複数ファイルにたいして検索したり(タグテーブルの検索と置換を参照してください)、DiredのAコマンドを通じて検索したり(ファイルにたいする操作を参照してください)、grepコマンドを使った検索(Emacs下でのGrepによる検索を参照してください)も可能です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1 インクリメンタル検索

Emacsにおける重要な検索コマンドは、インクリメンタル検索(isearch: incremental search)です。これは検索する文字列の最初の文字をタイプすると、すぐに検索が開始されます。検索文字列をタイプしていくにつれて、Emacsはその文字列(それまでに入力した文字列)がどこにあるかを表示します。望む場所を特定するのに充分な文字列をタイプしたところで、検索をストップできます。次に何をするかによって、明示的なRETにより検索を終えたり、続けることができます。

C-s

前方にインクリメンタル検索します(isearch-forward)。

C-r

後方にインクリメンタル検索します(isearch-backward)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1.1 インクリメンタル検索の基本

C-s

インクリメンタル検索を開始します(isearch-forward)。

C-r

逆向きのインクリメンタル検索を開始します(isearch-backward)。

C-s (isearch-forward)は、前方へのインクリメンタル検索を開始します。これはキーボードから文字を読み取り、タイプした文字が最初に出現するバッファーの位置に、ポイントを移動します。

たとえばC-sとタイプした後にFをタイプすると、検索を開始したバッファーのポイント位置より前方にある、最初のFにカーソルを移動します。つぎにOをタイプすると、前方にある最初の‘FO’にカーソルが移動します。この場合、‘FO’の‘F’は、前に見つかった‘F’と同じ位置である必要はありません。もう一度Oをタイプすると、カーソルは最初の‘FOO’に移動します。

各ステップでEmacsはカレントマッチ(current match: 現在のマッチ)(検索文字列にマッチしたバッファーのテキスト)を、isearchフェイスでハイライトします(テキストのフェイスを参照してください)。その時点での検索文字列はエコーエリアにも表示されます。

検索文字列を間違ってタイプしたときは、DELをタイプします。DELをタイプするごとに、検索文字列の最後の文字が取り消されます。

検索により到達した位置に満足したら、RETをタイプします。これは検索をストップして、検索により移動した位置にカーソルを残します。検索とは関係ないコマンドも、検索をストップして、そのコマンドが実行されます。つまりC-aは検索を中止して、行の先頭に移動します。RETで検索を終える必要があるのは、次のコマンドが印字文字をタイプするコマンドのときだけです。DELRETおよび他のいくつかの文字(C-qC-wC-rC-sC-yM-yM-rM-cM-e、および以下で説明する文字)は、検索で特別な意味を持っています。

特別な例外として、検索文字列が空のときにRETを入力すると、非インクリメンタル検索を開始します(非インクリメンタル検索を参照してください)。

インクリメンタル検索を終了するとき、ポイントの元の位置をマークをアクティブにせず(ただしマークがすでにアクティブではなかったときだけ)に、マークリングに追加します。これにより、C-u C-SPCを使って、検索を開始する前の位置に戻ることができます。マークリングを参照してください。これはマークがすでにアクティブでないときだけ行なわれます。

後方に検索するには、C-sで検索を開始するかわりに、C-r (isearch-backward)を使います。前方検索が検索を開始した位置より前方にある最初のマッチを探すように、後方検索は検索を開始した位置より後方にある最後のマッチを探します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1.2 インクリメンタル検索の繰り返し

前方に‘FOO’を検索してマッチしたが、それは探しているマッチではなく、探しているのはバッファーのもっと前方に出現する‘FOO’だとしましょう。ここでもう1度C-sをタイプすることにより、検索文字列が次に出現する場所に移動します。これは何回でも繰り返すことができます。もしタイプしすぎたときは、C-sDELで取り消すことができます。同様に後方へのインクリメンタル検索では、C-rにより後方検索が繰り返されます。

インクリメンタル検索中に手を止めて眺めてみると、検索文字列にたいするカレントマッチ以外に、スクリーンに表示されている他のマッチもハイライトされていることがわかります。これは検索するために、何回C-sまたはC-rを繰り返せばよいのか予測しやすくするためです。その他のマッチは、カスタマイズ可能なフェイスlazy-highlight (テキストのフェイスを参照してください)を使って、現在のマッチとは異なってハイライトされます。この機能を無効にするには、isearch-lazy-highlightnilをセットしてください。

検索を終了した後、同じ文字列を再度検索するには、C-s C-sとタイプします。最初のC-sはインクリメンタル検索を呼び出し、2回目のC-sは“再検索”を意味します。同様に、C-r C-rは最後に検索した文字列を後方に検索します。最後に検索された文字列の決定では、文字列がC-sで検索されたのか、C-rで検索されたのかは問題ではありません。

前方に検索していて、検索している対象が検索開始点より後方にあるのに気付いたときは、検索文字列を変更すること無く、C-rで後方検索に切り替えることができます。同様に後方検索でC-sをタイプすると、前方検索に切り替わります。

検索が失敗したとき、バッファーの先頭から検索を再開するには、もう一度C-sをタイプします。逆向きの繰り返し検索が失敗したときは、C-rでバッファーの最後から検索を再開します。これはwrapping around(巻き直し)と呼ばれ、これが発生すると、‘Wrapped’という単語が検索プロンプトに表示されます。検索を続けて元の検索開始ポイントを通過すると、‘Overwrapped’に変化します。これはすでに見たマッチを再訪していることを意味します。

以前に検索した文字列を再利用するには、サーチリング(search ring)を使います。コマンドM-pまたはM-nで、リングを移動して再使用したい文字列を取り出します。これらのコマンドは、選択されたリング要素の文字列をミニバッファーに残すので、それを編集することができます。

ミニバッファーの現在の検索文字列を、サーチリングのアイテムで置き換えずに編集するときは、M-eをタイプします。RETC-sC-rをタイプすれば編集を終了して、それを検索できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1.3 インクリメンタル検索でのエラー

文字列が見つからなかった場合、エコーエリアに‘Failing I-Search’と表示されて、文字列とできるかぎりマッチした位置に、カーソルが移動します。つまり‘FOOT’を検索して‘FOOT’がない場合、カーソルは‘FOOL’という文字列の‘FOO’の後ろに移動します。エコーエリアではマッチに失敗した検索文字列の一部が、フェイスisearch-failを使ってハイライトされます。

その時に行うことができる、いくつかの選択肢があります。もし文字列が間違っている場合は、文字列を訂正するためDELでテキストを削除できます。もし見つかった位置が望む位置なら、RETをタイプしてその位置に留まることができます。またはC-gをタイプして、検索文字列から検索できなかった文字(‘FOOT’の中の‘T’)を取り除き、検索された部分の文字列(‘FOOT’の中の‘FOO’)を残します。その位置でもう1回C-gをタイプすると、検索全体を取り消し、ポイントは検索を開始した位置に戻ります。

終了コマンドのC-gは、検索において特別な処理を行います。このコマンドの動作は、検索の状況に依存します。もし指定した文字列の検索が成功して、さらに検索文字の入力を待っているとき、C-gは検索全体を取り消して、カーソルを検索を開始したときの位置に移動します。検索文字列に検索に失敗した文字が含まれているときに、C-gがタイプされたときは、検索文字列から検索に失敗した文字が取り除かれます。後に残るのは検索に成功した文字列で、さらに検索文字の入力を待っているので、先のケースと同様、2回目のC-gで検索全体が取り消されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1.4 インクリメンタル検索の特別な入力

インクリメンタル検索のときタイプする文字列の中には、特別な効果をもつものがあります。

デフォルトでは、インクリメンタル検索は緩いスペースマッチング(lax space matching)を行います。これはスペースおよび一連のスペースは、テキスト中の1つまたはそれ以上のスペースにマッチします。したがって‘foo bar’は‘foo bar’、‘foo  bar’、‘foo   bar’、...にマッチします(‘foobar’にはマッチしません)。正確にいうと、Emacsは検索文字列中の一連のスペースを、変数search-whitespace-regexpで指定された正規表現にマッチさせます。たとえばスペースを一連の改行とスペースにマッチさせるには、変数に‘"[[:space:]\n]+"’をセットします。

緩いスペースマッチングを切り替えるには、M-s SPC (isearch-toggle-lax-whitespace)をタイプします。この機能全体を無効にするには、search-whitespace-regexpnilに変更します。これにより検索文字列中のスペースは、正確に1つのスペースにマッチします。

検索文字列に小文字しか含まれていないとき、検索は大文字小文字を区別しません。検索文字列に大文字が含まれているとき、検索は大文字小文字を区別します。検索文字列から大文字を削除すると、この効果はなくなります。検索と大文字小文字を参照してください。

非表示のテキストを検索するかしないかは、M-s i (isearch-toggle-invisible)とタイプして切り替えることができます。Outline Searchを参照してください。

改行文字を検索するにはC-jとタイプします。

ASCII文字を検索するには、以下の方法の1つを使います:

インクリメンタル検索でM-%をタイプすると、query-replaceまたはquery-replace-regexpが呼び出され(検索モードに依存します)、現在の検索文字が置換対象になります。負のプレフィクス引数は、後方への置換を意味します。問い合わせつき置換を参照してください。

インクリメンタル検索でM-TABをタイプすると、isearch-completeが呼び出され、サーチリングを補完リストとして使って、検索文字列の補完を試みます。補完を参照してください。多くのオペレーティングシステムでは、キーシーケンスM-TABはウィンドウマネージャーに捕えられます。その場合、これを使うにはisearch-completeを、他のキーシーケンスに再バインドする必要があります(対話的なキーバインディングの変更を参照してください)。

インクリメンタル検索がアクティブのとき、C-h C-hとタイプすると、特別なキーバインドのリストを含む、対話的なヘルプにアクセスできます。これらのキーバインドは、キーマップisearch-mode-mapの一部です(キーマップを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1.5 インクリメンタル検索でのyank

インクリメンタル検索でのC-y (isearch-yank-kill)は、カレントkillを検索文字列に追加します。C-yの後にM-y (isearch-yank-pop)が呼び出されると、追加するテキストを、もっと前にkillされたものに置き換えます。これは通常のM-y (yank-pop)コマンドと似ています(yankを参照してください)。Mouse-2はカレントのX選択を追加します(他のウィンドウアプリケーションにたいするカットアンドペーストを参照してください)。

C-w (isearch-yank-word-or-char)は、検索された文字列のポイントの次の文字または単語を、検索文字列に追加します。これはポイント位置にあるテキストを検索する、簡単な方法です(コピーする対象を文字または単語のどちらにするかの決定は、発見的に行われます)。

同様にM-s C-e (isearch-yank-line)は、検索文字列にカレント行の残りの部分を追加します。ポイントが既に行末にある場合、次の行が追加されます。プレフィクス引数nを指定すると、次のn行を追加します。

もし大文字小文字を区別せずに検索している場合、C-wM-s C-eはテキストを小文字に変換してからコピーするので、それ以降も検索は大文字小文字を区別せずに行われます。

C-M-w (isearch-del-char)は検索文字列の最後の文字を削除し、C-M-y (isearch-yank-char)は検索されたポイントの後ろの文字を追加します。ポイントの後ろの文字を追加する他の方法は、M-e(インクリメンタル検索の繰り返しを参照してください)でミニバッファーに移動してから、検索文字列の最後でC-fをタイプします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1.6 インクリメンタル検索を終了させない

このサブセクションでは、2つのカテゴリーに属するコマンドを説明します。これらのコマンドはインクリメンタル検索の一部ではありませんが、現在のインクリメンタル検索を終了させずにタイプできます。

プレフィクス引数

インクリメンタル検索でプレフィクス引数を入力すると、デフォルトではその引数は次の検索アクションに適用されるか、検索を終了させるコマンドに渡されます。

以前のバージョンのEmacsでは、プレフィクス引数の入力は常に検索を終了させていました。この振る舞いに戻すには、変数isearch-allow-prefixnilをセットしてください。

isearch-allow-scrollが非nilのとき(以下を参照)、プレフィクス引数は上で説明したようなデフォルト動作をします。

スクロールコマンド

通常スクロールコマンドは、インクリメンタル検索を終了させます。変数isearch-allow-scrollを非nil値に変更すると、スクロールバーやC-vM-vC-lのようなスクロールコマンド(スクロールを参照してください)が利用可能になります。これは、これらのコマンドをバウンドされたキーシーケンスで呼び出したときだけ適用されます。つまりM-xは依然として検索を終了させます。これらのコマンドには、通常の方法でプレフィクス引数を与えることができます。この機能ではカレントマッチが表示されない位置にスクロールすることはできません。

isearch-allow-scrollの機能は、正確にはスクロールではないが、テキストが表示されるスクリーン位置に影響する、C-x 2 (split-window-below)やC-x ^ (enlarge-window)のような、コマンドにも効果を及ぼします。これはコマンド名のisearch-scrollプロパティが非nilのコマンドに適用されます。そのため、どのコマンドが影響を受けるかは、それらのプロパティを変更して制御できます。

たとえば将来のEmacsセッションも含めて、インクリメンタル検索中にC-h lを使えれば便利だと思ったら、まずC-h cで何のコマンドが実行されるか調べて(キーのドキュメントを参照してください)、それがview-lossageだとわかります。その後はinitファイルに以下を追加します(Emacs初期化ファイルを参照してください)。

(put 'view-lossage 'isearch-scroll t)

この機能はポイント、バッファー内容、マッチデータ、カレントバッファーや選択されているウィンドウ・フレームを変更しない任意のコマンドに適用できます。そして、そのコマンド自体がインクリメンタル検索を行ってはなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1.7 ミニバッファーの検索

ミニバッファーがアクティブのときインクリメンタル検索を開始すると、Emacsはミニバッファーの内容を検索します。通常のバッファーにたいする検索とは異なり、エコーエリアはミニバッファーの表示に使われているので、検索文字列はエコーエリアには表示されません。

ミニバッファーでのインクリメンタル検索が失敗すると、ミニバッファーヒストリーを検索します。ミニバッファーヒストリーを参照してください。ミニバッファーとミニバッファーのヒストリーは、一番古いヒストリー要素が最初で、カレントのミニバッファーが最後にある、一連の“ページ”として視覚化することができます。前方検索のC-sは前方、つまり新しいページを検索し、後方検索のC-rは後方、つまり古いページを検索します。普通のバッファーの検索と同様、検索が失敗すると、最後から最初のページ、またはその逆に巻き直して検索します。

カレントマッチがヒストリーの要素にあった場合、ヒストリーの要素はミニバッファーに取り出されます。インクリメンタル検索を正常に終了(たとえばRETをタイプ)すれば、それはミニバッファーに残ります。検索を取り消すのはC-gで、これによりミニバッファーの内容は検索を開始したときのものに復元されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.2 非インクリメンタル検索

Emacsには、従来式の非インクリメンタル検索もあります。これは検索を開始する前に、検索文字列全体を入力する必要があります。

C-s RET string RET

stringを検索します。

C-r RET string RET

後方にstringを検索します。

非インクリメンタル検索を開始するには、最初にC-s RETをタイプします。これにより、検索文字列を読みとるために、ミニバッファーに移動します。検索文字列の入力を終了して検索を開始するには、RETをタイプします。文字列が見つからなかったとき、検索コマンドはエラーをシグナルします。

C-s RETとタイプすると、C-sは通常どおりインクリメンタル検索を呼び出します。しかし、このコマンドは指定した文字列が空のとき、非インクリメンタル検索を行うコマンドsearch-forwardを呼び出すよう、プログラムされています(そのような用途以外に空の引数は無意味です)。C-r RETも同様に、コマンドsearch-backwardを呼び出します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.3 単語検索

単語検索(word search)は、単語の並びを、その間にある区切り文字の種類とは無関係に検索します。たとえば検索文字列に、1つのスペースで区切られた2つの単語を入力すると、2つの単語を区切るのが、1つまたはそれ以上のスペース、改行文字、およびそれ以外の区切り文字の場合にもマッチします。これはテキスト文書を検索するとき特に有用です。なぜなら検索する単語が改行で区切られているのか、スペースで区切られているのか考慮しなくてもよいからです。

M-s w

インクリメンタル検索がアクティブのとき、単語検索モードに切り替えます(isearch-toggle-word)。非アクティブのときは、前方へのインクリメンタルな単語検索を開始します(isearch-forward-word)。

M-s w RET words RET

非インクリメンタルな単語検索を使って、wordsを前方検索します。

M-s w C-r RET words RET

非インクリメンタルな単語検索を使って、wordsを後方検索します。

前方へのインクリメンタルな単語検索を開始するには、M-s wとタイプします。インクリメンタル検索が非アクティブの場合、これはコマンドisearch-forward-wordを実行します。インクリメンタル検索がすでにアクティブの場合(前方か後方かにかかわらず)、M-s wは検索の方向と現在の検索文字列は変更せずに、単語検索に切り替えます。単語検索をオフに切り替えるには、再度M-s wをタイプしてください。

非インクリメンタルな単語検索を開始する場合、前方検索はM-s w RET、後方検索はM-s w C-r RETをタイプします。これらはコマンドword-search-forward、またはword-search-backwardを実行します。

インクリメンタルな単語検索と、非インクリメンタルな単語検索では、マッチを見つける方法に若干の違いがあります。非インクリメンタルな単語検索では、検索文字列の各単語は、単語全体に厳密に一致しなければなりません。インクリメンタルな単語検索では、マッチの規則は緩くなります。検索文字列をタイプするとき、最初と最後の単語は、単語全体にマッチする必要はありません。これはタイプする度にマッチを処理するためです。これは(カーソルがある)カレントマッチ以外のマッチ(lazy matches)には適用されません。それらは単語全体がマッチしなければハイライトされません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.4 シンボル検索

シンボル検索(symbol search)は、通常の検索と似ていますが、検索の境界がシンボルの境界にマッチしていなければなりません。シンボルの意味は、メジャーモードのコンテキストに依存しており、Emacs LispモードでのLispシンボルのように、通常はソースコードのトークンを参照します。たとえばLispシンボルforward-wordをインクリメンタルなシンボル検索すると、これはisearch-forward-wordにはマッチしません。そのため、この機能は主にソースコードの検索に有用です。

M-s _

インクリメンタル検索がアクティブのとき、シンボル検索モードに切り替えます(isearch-toggle-symbol)。非アクティブのときは、前方へのインクリメンタルなシンボル検索を開始します(isearch-forward-symbol)。

M-s .

ポイントの近くにあるシンボルを、検索文字列の初期値に追加して、前方へのインクリメンタルなシンボル検索を開始します。

M-s _ RET symbol RET

symbolにたいして、前方への非インクリメンタルな検索をします。

M-s _ C-r RET symbol RET

symbolにたいして、後方への非インクリメンタルな検索をします。

前方へのインクリメンタルなシンボル検索を開始するには、M-s _(ポイントの近くにシンボルがあるときはM-s .)をタイプします。インクリメンタル検索が非アクティブのときは、コマンドisearch-forward-symbolが実行されます。すでにインクリメンタル検索がアクティブのとき、M-s _は検索方向と現在の検索文字列を維持した状態で、シンボル検索に切り替えます(もう一度M-s _をタイプすると、シンボル検索を無効にできます)。インクリメンタルなシンボル検索では、検索文字列の先頭がシンボルの先頭にマッチする必要があります。

非インクリメンタルなシンボル検索は、前方への検索はM-s _ RET、後方への検索はM-s _ C-r RETをタイプします。非インクリメンタル検索では、文字列の先頭と最後が、シンボルの先頭と最後にマッチする必要があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.5 正規表現検索

正規表現(regular expression: regexpと略します)とは、文字列にマッチさせるための代替の文字列クラスを示すパターンです。Emacsはregexpにマッチする検索を、インクリメンタル、非インクリメンタルの両方で提供します。正規表現の構文は、次のセクションで説明します。

C-M-s

インクリメンタルなregexp検索を開始します(isearch-forward-regexp)。

C-M-r

逆方向のインクリメンタルなregexp検索を開始します(isearch-backward-regexp)。

regexpにたいするインクリメンタル検索は、C-M-s (isearch-forward-regexpをタイプするか、プレフィクス引数(引数の値は何でもよい)を指定して、C-sを呼び出します。前方へのインクリメンタル検索中は、M-rをタイプします。このコマンドはC-sと同様に、検索文字列をインクリメンタルに読みとりますが、検索文字列に正確に一致するバッファーのテキストを検索するのではなく、検索文字列をregexpとして扱います。検索文字列にテキストを追加する度に、regexpは長くなり、新しいregexpを検索します。後方へのregexp検索には、C-M-r(isearch-backward-regexp)またはプレフィクス引数を指定したC-rを使います。後方へのインクリメンタル検索中はM-rを使います。

通常のインクリメンタル検索の特別なキーシーケンスは、インクリメンタルなregexp検索でも同じようなことを行います。たとえば検索開始直後にC-sをタイプすると、最後に行ったインクリメンタル検索で使ったregexpで、前方検索を行います。インクリメンタルなregexpと非regexp検索は、独立したデフォルトを持ちます。これらは別のサーチリングも持っており、これにはM-pM-nでアクセスできます。

通常のインクリメンタル検索とは異なり、インクリメンタルregexp検索は、デフォルトでは緩いスペースマッチング(lax space matching)を使いません。この機能を切り替えるには、M-s SPC (isearch-toggle-lax-whitespace)を使います。そうするとインクリメンタルregexp検索でのSPCは、1つ以上の空白文字の並びにマッチするようになります。変数search-whitespace-regexpは、緩いスペースマッチングにたいするregexpを指定します。インクリメンタル検索の特別な入力を参照してください。

インクリメンタルregexp検索では、検索文字列の追加によりカーソルが前に戻され、最初から検索しなおされることがありえます。たとえば検索文字列‘foo’に‘\|bar’を追加すると、カーソルは‘foo’から、それより前にある最初の‘bar’に戻ります。正規表現の構文を参照してください。

前方および後方へのregexp検索は、対照的ではありません。なぜならEmacsでのregexpに対するマッチは常に前方へ処理され、regexpの先頭から開始されるからです。したがって前方へのregexp検索は前方にスキャンし、可能性のある開始位置から前方へとマッチを試みます。後方へのregexp検索は後方へスキャンし、可能性のある開始位置から前方へとマッチを試みます。これらの検索手法はミラーイメージではありません。

regexpにたいする非インクリメンタルな検索は、コマンドre-search-forwardおよびre-search-backwardで行われます。これらのコマンドはM-xから呼び出すか、インクリメンタルregexp検索からのC-M-s RETおよびC-M-r RETで呼び出します。

プレフィクス引数を指定したインクリメンタルregexp検索は、isearch-forwardisearch-backwardのような、通常の文字列を検索します。インクリメンタル検索を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.6 正規表現の構文

このマニュアルでは、ユーザーが通常使う正規表現の機能を説明します。主にLispプログラムで使用される追加の機能については、Regular Expressions in The Emacs Lisp Reference Manualを参照してください。

正規表現は、いくつかの特殊文字と、それ以外の普通の文字からなる構文を持ちます。通常の文字はそれと同じ文字にマッチし、それ以外の文字にはマッチしません。特殊文字は、‘$^.*+?[\’です。文字‘]’は、文字候補を終了させる場合は特殊文字です(以下参照)。文字‘-’は、文字候補の中では特殊文字です。正規表現の中に現れるその他の文字は、前に‘\’がついてない限り普通の文字です(Lispプログラム内で正規表現を使う場合、‘\’は2つ記述しなければなりません。このセクションの最後にある例を参照してください)。

たとえば‘f’は特殊文字ではなく普通の文字なので、正規表現中の‘f’は文字列‘f’にマッチし、他の文字列にはマッチしません(文字列‘ff’にはマッチしません)。同様に正規表現中の‘o’は、‘o’だけにマッチします(大文字小文字を区別しない場合、これらのregexpは‘F’や‘O’にもマッチしますが、これを例外としてではなく、“同じ文字列”を一般化したものと考えます)。

2つの正規表現abを結合できます。結合した結果は、aが先頭の適当な部分に一致して、bが残りの部分に一致する正規表現となります。たとえば‘f’と‘o’という正規表現を結合すると、正規表現‘fo’となり、これは文字列‘fo’だけにマッチします。ここまでは普通です。普通でないことを行うには、特殊文字を使う必要があります。以下にリストを示します。

. (ピリオド)

これは改行文字以外の任意の1文字にマッチする特殊文字です。たとえば正規表現‘a.b’は、最初が‘a’で最後が‘b’の3文字の文字列にマッチします。

*

単独では使用されません。これは接尾演算子で、前の正規表現の任意の回数、可能な限り多くの回数を含めた繰り返しを意味します。したがって‘o*’は任意の個数の‘o’にマッチし、‘o’がない場合(0個の場合)も含めてマッチします。

*’は常に可能な限り小さな、前置表現に適用されます。したがって‘fo*’は‘fo’の繰り返しではなく‘o’の繰り返しです。この正規表現は‘f’、‘fo’、‘foo’、...にマッチします。

マッチングにより構成される‘*’は、見つけられるだけの反復回数へと、直ちに処理されます。その後でパターンの残りの部分の処理を続けます。これが失敗すると、バックトラッキングが発生します。‘*’の反復回数をいくつか捨てて、パターンの残りの部分がマッチするように構成を変更します。たとえば文字列‘caaar’にたいして‘ca*ar’をマッチさせる場合、まず最初に‘a*’を、3つすべての‘a’にマッチさせます。しかしパターンの残りの部分は‘ar’ですが、マッチさせるために残っているのは‘r’だけなので、このマッチは失敗します。かわりに‘a*’を2つの‘a*’だけにマッチさせます。この選択により、regexpの残りの部分のマッチが成功します。

+

これは‘*’と同様に接尾演算子ですが、前置表現に最低1回マッチしなければならない点が異なります。したがって‘ca+r’は‘car’、‘caaaar’にマッチしますが、‘cr’にはマッチしません。一方‘ca*r’は、これら3つすべての文字列にマッチします。

?

これは‘*’と同様に接尾演算子ですが、前置表現が1回出現するか、出現しないかいずれかという点が異なります。したがって‘ca?r’は、‘car’または‘cr’のいずれかになります。

*?, +?, ??

これらは上述した演算子の、非貪欲(greedy)なタイプの演算子です。通常の演算子‘*’、‘+’、‘?’は、regexpがマッチする、できる限り長いマッチを行います。しかしこれらの演算子に‘?’を後置すると、できる限り短いマッチを行います。

したがって‘ab*’と‘ab*?’は、両方とも文字列‘a’と文字列‘abbbb’にマッチしますが、文字列‘abbb’にマッチさせたとき、‘ab*’は文字列全体(有効な最長マッチ)にマッチしますが、‘ab*?’は‘a’(有効な最短マッチ)だけにマッチします。

非貪欲な演算子は、与えられた開始位置から開始される、できるだけ短い文字列にマッチします。前方検索では、利用できる一番最初の開始位置は、常にカーソルの位置となります。したがって末尾が改行のテキスト‘abbab’にたいして‘a.*?$’を検索すると、文字列全体にマッチします。これはマッチが最初の‘a’から開始されので、マッチさせることができるのです。

\{n\}

これはn回の繰り返しを指定する接尾演算子です。つまり前置される正規表現に、正確にn回連続でマッチしなければなりません。たとえば‘x\{4\}’は、文字列‘xxxx’だけにマッチします。

\{n,m\}

これはn回からm回の繰り返しを指定する接尾演算子です。つまり前置される正規表現が、最低n回、最大m回マッチしなければなりません。mが省略されたときは、マッチ回数の上限はありませんが、前置される正規表現は少なくともn回マッチしなければなりません。
\{0,1\}’は、‘?’と同じです。
\{0,\}’は、‘*’と同じです.
\{1,\}’は、‘+’と同じです。

[ … ]

これは‘[’で始まり‘]’で終わる、文字集合(character set)です。

もっとも簡単なケースでは、2つのカッコの間に指定された文字が、マッチできる文字集合となります。したがって‘[ad]’は1つの‘a’か1つの‘d’にマッチし、‘[ad]*’は‘a’と‘d’からなる任意の文字列にマッチします(空の文字列を含む)。結果として‘c[ad]*r’は、‘cr’、‘car’、‘cdr’、‘caddaar’、...にマッチします。

文字集合には、開始文字と終了文字の間に‘-’を記述することにより、文字の範囲を含めることもできます。したがって‘[a-z]’は、ASCII小文字となります。文字の範囲と特定の文字の指定を混ぜることもできます。‘[a-z$%.]’は任意のASCII小文字と‘$’、‘%’、‘.’にマッチします。

いくつかの特別な文字クラス(character classes)を、文字集合に含めることもできます。文字の候補を含む文字クラスを‘[:’と‘:]’で囲んで指定します。たとえば‘[[:alnum:]]’は、任意のアルファベットと数字にマッチします。文字クラスのリストは、Char Classes in The Emacs Lisp Reference Manualを参照してください。

文字集合に‘]’を含めるには、それを最初に記述しなければなりません。たとえば‘[]a]’は、‘]’または‘a’にマッチします。文字集合に‘-’を含めるには、‘-’を、文字集合の最初または最後に記述するか、文字範囲の外に記述します。したがって‘[]-]’は、‘]’と‘-’の両方にマッチします。

文字集合に‘^’を含めるには、集合の最初以外に記述します(最初に記述した場合、補集合を指定したことになります。以下を参照してください)。

大文字小文字を区別しない検索で文字の範囲を使う場合、範囲の先頭と最後を、大文字だけ、または小文字だけで記述するか、先頭と最後をアルファベット以外で記述するべきです。‘A-z’のような大文字小文字を混成した範囲指定は不正な定義で、Emacsの将来のバージョンで変更されるかもしれません。

[^ … ]

[^’は文字の補集合complemented character setを開始します。つまり指定された文字以外がマッチします。したがって‘[^a-z0-9A-Z]’は、ASCII文字と数字以外にマッチします。

^’は文字集合で最初以外で使用された場合、特別な意味をもちません。‘^’に続く文字は、先頭にあるものとして扱われます(いいかえると‘-’と‘]’は、ここでは特別な意味をもちません)。

もしマッチしない文字として改行が記述されていなければ、文字の補集合を改行にマッチさせることができます。これはgrepのようなプログラムにおける、regexpにたいする処理とは対照的です。

^

これは空文字列、ただしテキストの行頭だけにマッチする特殊文字です。それ以外ではマッチに失敗します。したがって‘^foo’は行の先頭にある‘foo’にマッチします。

歴史的な互換性により、この意味での‘^’の使用は、正規表現の先頭か、‘\(’または‘\|’の後に記述された場合に限ります。

$

^’と似ていますが、行末だけにマッチします。したがって‘x+$’は、行末にある1つ以上の‘x’にマッチします。

歴史的な互換性により、この意味での‘$’の使用は、正規表現の最後か、‘\)’または‘\|’の後に記述された場合に限ります。

\

これには2つの機能があります。まず特殊文字(‘\’を含む)をクォートすることと、追加の特別な構成を導入することです。

\’は特殊文字をクォートするので、正規表現中の‘\$’は‘$’だけにマッチし、‘\[’は‘[’だけにマッチします。

\’で始まる特別な構成については、以下のセクションを参照してください。

注意: 歴史的な互換性から、特殊文字はそれが特殊な意味をもたないようなコンテキストで使用された場合は、通常の文字として扱われます。たとえば‘*foo’は、‘*’が特殊文字として動作するための前置された表現がないので、普通の文字として扱われます。このような振る舞いに依存することは、よい習慣ではありません。特殊文字を記述する場合、それがどこに記述されようとクォートするべきです。

文字集合の候補中では‘\’は特別ではなく、‘-’と‘]’のもつ特別な意味を除去することはありません。したがって、これらの文字が特別な意味をもたないような場所にあるときは、これらの文字をクォートすべきではありません。これでは明確ではないかもしれません。これらの特殊文字が特別な意味をもつ場所にあるとき、バックスラッシュを前置することによりクォートされるのです。たとえば‘[^\]’(Lispの文字記法では"[^\\]")は、バックスラッシュ以外の任意の一文字にマッチします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.7 正規表現でのバックスラッシュ

多くの場合、任意の文字を伴う‘\’はその文字だけに一致します。しかしいくつか例外があって、‘\’で始まる2文字のシーケンスが、特別な意味を持つ場合があります。シーケンス内の2文字目にくる文字は、単独で使った場合には普通の文字として扱われるものです。以下は‘\’の構成の表です。

\|

選択肢を指定します。2つの正規表現abの間に‘\|’を記述すると、それはaまたはbのいずれかにマッチする表現を形成します。これはまずaとのマッチを試み、失敗した場合にbとのマッチを試みます。

したがって‘foo\|bar’は、‘foo’または‘bar’のいずれかにマッチし、それ以外の文字列にはマッチしません。

\|’は、周囲の一番大きな表現に適用されます。‘\|’のグループ化の能力に制限をかけることができるのは、周囲の‘\( … \)’によるグループ化だけです。

複数の‘\|’使用を処理するための、完全なバックトラッキング能力が存在します。

\( … \)

3つの目的のためのグループ化構成です:

  1. 他の操作に使うために、一連の選択肢‘\|’を括ります。したがって‘\(foo\|bar\)x’は、‘foox’または‘barx’のいずれかにマッチします。
  2. 接尾演算子‘*’、‘+’、‘?’を適用できるように、複雑な正規表現を括ります。したがって‘ba\(na\)*’は、‘bananana’のように、(0個以上の)文字列‘na’にマッチします。
  3. あとで参照できるように、マッチした部分文字列を記録します。

この最後の使い方は、カッコでグループ化することが重要なのではありません。これは‘\( … \)’構成の、2番目の意味とは異なる機能です。実際には、これら2つの機能が衝突することは、通常はありません。もし衝突するようなら、“内気(shy)”なグループ化を使うことができます。

\(?: … \)

マッチした部分文字列を記録しない、“内気(shy)”なグループ化を指定します。マッチした部分文字列は、‘\d’により後方参照できません。この機能は正規表現を機械的にまとめるときに役立ちます。これにより後方参照するためのグループにたいする番号づけに影響することなく、文法的な目的によるグループ化を行うことができます。

\d

d番目に‘\( … \)’構成にマッチしたテキストと同じテキストにマッチします。これは後方参照(back reference)と呼ばれます。

最後の‘\( … \)’構成の後で、マッチ処理はこの構成にマッチしたテキストの最初と最後を記録します。そして正規表現の後の部分で‘\’の後に数字dを使うことにより、d番目の‘\( … \)’構成にマッチしたテキストと同じテキストにマッチさせることができます。

正規表現に記述された最初の9つの‘\( … \)’にマッチしたテキストは、正規表現で開きカッコが出現した順に、1から9までの数字が割り当てられます。そのため‘\1’から‘\9’を使うことにより、‘\( … \)’構成にマッチした、対応するテキストを参照することができます。

たとえば‘\(.*\)\1’は改行を含まない、前半と後半が同一の文字列にマッチします。‘\(.*\)’は、そのテキストが何であろうと前半にマッチしますが、‘\1’は前半と正確に同じテキストにマッチしなければなりません。

もし特定の‘\( … \)’構成が1回以上マッチする場合(これは‘*’が後置されているとき簡単に発生します)、最後のマッチだけが記録されます。

\`

空の文字列にマッチしますが、文字列またはバッファー(またはアクセスできる部分)の先頭に限定されます。

\'

空の文字列にマッチしますが、文字列またはバッファー(またはアクセスできる部分)の最後に限定されます。

\=

空の文字列にマッチしますが、ポイント位置に限定されます。

\b

空の文字列にマッチしますが単語の先頭または最後に限定されます。したがって‘\bfoo\b’は、区切られた単語‘foo’にマッチします。‘\bballs?\b’は、別々の単語‘ball’または‘balls’にマッチします。

\b’は、そこにどんなテキストが出現しようと、バッファーの先頭または最後にもマッチします。

\B

空の文字列にマッチしますが、単語の最初と最後以外にマッチします。

\<

空の文字列にマッチしますが、単語の先頭に限定されます。‘\<’は単語の構成文字が続く場合に限り、バッファーの先頭にマッチします。

\>

空の文字列にマッチしますが、単語の最後に限定されます。‘\<’は内容が単語の構成文字で終わる場合に限りバッファーの最後にマッチします。

\w

任意の単語構成文字にマッチします。どの文字が該当するかは、構文テーブル(syntax table)により決定されます。Syntax Tables in The Emacs Lisp Reference Manualを参照してください。

\W

単語構成文字以外の任意の文字にマッチします。

\_<

空の文字列にマッチしますが、シンボルの先頭に限られます。シンボルは1文字以上のシンボル構成文字からなります。シンボル構成文字は、‘w’と‘_’の構文をもつ文字です。‘\_<’はシンボル構成文字が続く場合に限り、バッファーの先頭にもマッチします。

\_>

空の文字列にマッチしますが、シンボルの最後に限定されます。‘\_>’は内容がシンボル構成文字で終わる場合に限り、バッファーの最後にマッチします。

\sc

構文がcである、任意の文字にマッチします。ここでcとは、特定の構文クラスを表す文字です。したがって‘w’は単語構成文字、‘-’または‘ ’は空白文字、‘.’は通常の区切り文字、などとなります。Syntax Tables in The Emacs Lisp Reference Manualを参照してください。

\Sc

構文がc以外の、任意の文字にマッチします。

\cc

カテゴリーcに属する、任意の文字にマッチします。たとえば‘\cc’は中国文字、‘\cg’はギリシャ文字にマッチします。既知のカテゴリーについての説明は、M-x describe-categories RETをタイプしてください。

\Cc

カテゴリーc属さない、任意の文字にマッチします。

単語と構文に関係する構成は構文テーブルのセッティングにより制御されます。See Syntax Tables in The Emacs Lisp Reference Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.8 正規表現の例

以下にregexpの例を示します。これはEmacsがセンテンスの最後(末尾の空白は含まない)を認識するために、デフォルトで使用するregexp(たとえば変数sentence-end-base)と似ています。

[.?!][]\"')}]*

これには2つの連続する部分があります。1つは‘.’、‘?’、‘!’にマッチする文字です。もう1つは閉じカッコ、クォート、カッコの0回以上の繰り返しです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.9 検索と大文字小文字

Emacsでの検索では、テキストを小文字で指定した場合、通常は検索するテキストの大文字小文字は区別されません。したがって‘foo’を検索すると、‘Foo’や‘foo’もマッチします。regexp、特に文字集合でも同様に振る舞います。つまり‘[ab]’は、‘a’、‘A’、‘b’、‘B’もマッチします。

インクリメンタル検索する文字列のどこかに大文字があると、検索は大文字小文字を区別するようになります。したがって‘Foo’を検索すると、‘foo’や‘FOO’は検索されません。これは正規表現検索でも文字列検索と同様に適用されます。検索文字列から大文字を削除すると、効果はなくなります。

変数case-fold-searchnilをセットすると、すべての文字は大文字小文字を含めて、完全にマッチしなければなりません。これはバッファーごとの変数で、変数の変更はデフォルト値を変えない限り、通常はカレントバッファーだけが影響を受けます。ローカル変数を参照してください。これは置換コマンド(置換コマンドを参照してください)や、ミニバッファーのヒストリー検索(ミニバッファーヒストリーを参照してください)を処理する、非インクリメンタル検索にも適用されます。

インクリメンタル検索でM-cをタイプすると、検索が大文字小文字を区別するかが、切り替わります。この効果は、現在の検索を超えて次の検索には引き継がれませんが、現在の検索にたいして大文字を追加・削除したときの効果をオーバーライドします.

特定のコマンドや操作にたいする検索やマッチングにおいて、大文字小文字の区別を制御する変数がいくつかあります。たとえばtags-case-fold-searchは、find-tagでの大文字小文字の区別を制御します。これらの変数を探すには、M-x apropos-variable RET case-fold-search RETとタイプしてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.10 置換コマンド

Emacsは検索と置換を行うコマンドをいくつか提供します。単純なM-x replace-stringコマンドに加えて、出現するパターンごとに置換するかを問い合わせるM-% (query-replace)も提供します。

通常、置換コマンドはポイント位置から、バッファーの最後までのテキストにたいして、処理を行います。リージョンがアクティブのときは、リージョンにたいして処理を行います(マークとリージョンを参照してください)。基本的な置換コマンドは1つの検索文字列(またはregexp)を、1つの置換文字列で置き換えます。コマンドexpand-region-abbrevsを使用して、複数の置換を並行して処理することが可能です(abbrev展開の制御を参照してください)。

インクリメンタル検索とは異なり、置換コマンドはデフォルトでは緩いスペースマッチング(lax space matching)を行いません(インクリメンタル検索の特別な入力を参照してください)。置換で緩いスペースマッチングを有効にするには、変数replace-lax-whitespacetに変更してください(これはEmacsが置換文字列ではなく、置換するテキストを検索する方法だけに影響を与えます)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.10.1 無条件の置換

M-x replace-string RET string RET newstring RET

すべてのstringnewstringで置換します。

ポイントの後にある‘foo’のすべてのインスタンスを‘bar’に置換するには、コマンドM-x replace-stringに2つの引数‘foo’と‘bar’を指定します。置換はポイントの後だけで発生するので、バッファー全体を置換したい場合は、最初にバッファーの先頭に移動しなければなりません。バッファーの最後までのすべてが置換されます。置換をバッファーの一部に制限したいときは、そのリージョン部分をアクティブにします。リージョンがアクティブのときは、置換はそのリージョンに制限されます(マークとリージョンを参照してください)。

replace-stringが終了したとき、ポイントは最後に置換された位置に留まります。以前のポイント位置(replace-stringコマンドを実行した場所)はマークリングに追加されるので(マークは非アクティブ)、C-u C-SPCで戻ることができます。マークリングを参照してください。

プレフィクス引数を指定すると、置換対象は単語単位に制限されます。

置換コマンドでの大文字小文字の区別については、置換コマンドと大文字小文字を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.10.2 正規表現の置換

M-x replace-stringコマンドは、正確にマッチする単一の文字列を置換します。コマンドM-x replace-regexpは指定したパターンにマッチするすべてを置換します。

M-x replace-regexp RET regexp RET newstring RET

regexpにマッチするすべてをnewstringで置換します。

replace-regexpでは、newstringが定数である必要はありません。regexpにマッチした全体、または部分を参照することができます。newstringでの‘\&’は、置換されるマッチ全体を表します。newstringでの‘\d’(dは数字)は、regexp内でカッコでグループ化されたものの、d番目にマッチします(これは“後方参照(back reference)と呼ばれます”)。‘\#’は、このコマンドですでに置換された件数を10進数で参照します。最初の置換では‘\#’は‘0’で、2番目の置換では‘1’、...のようになります。たとえば、

M-x replace-regexp RET c[ad]+r RET \&-safe RET

これは‘cadr’を‘cadr-safe’に、‘cddr’を‘cddr-safe’に置き換えます。

M-x replace-regexp RET \(c[ad]+r\)-safe RET \1 RET

これは逆向きの置換をします。置換するテキストに‘\’を含めるときは、‘\\’と入力しなければなりません。

置換する文字列の一部を毎回手入力したいときは、置換文字列で‘\?’を使用します。すると置換ごとにミニバッファーで置換文字列を編集できます(ポイント位置は‘\?’を記述した場所です。)

このサブセクションの残りの部分は、Lispの知識が必要となる特別な処理を念頭に書かれています。大半の読者はスキップしても構いません。

置換文字列の一部を計算するために、Lisp式を使うことができます。これを行うには、置換文字列の中で、‘\,’に続けてLisp式を記述します。各置換において式の値が計算され、それをクォートされていない文字列に変換します(もし文字列の場合は、その文字列の内容が使われることを意味します)。そしてそれを置換文字列内で、式が記述された場所に使用します。もし式がシンボルのときは、シンボル名と、置換文字列中のシンボル名の後にあるの間に1つスペースは、両方シンボルの値に置換されます。

このような式の中では、いくつかの特別なシーケンスを使うことができます。式の中での‘\&’や‘\n’は、通常のようにマッチした文字列全体と、部分マッチした文字列を参照します。nには複数桁の数字を記述でき、n番目の正規表現がマッチしなかったとき、‘\n’はnilになります。‘\#&’と‘\#n’を使って、それらのマッチを数字で参照することもできます(これはマッチまたは部分マッチが数字書式の場合に有効です)。ここでの‘\#’も、すでに置換された数を意味します。

x’と‘y’の入れ替えは、以下の方法で行うことができます:

M-x replace-regexp RET \(x\)\|y RET
\,(if \1 "y" "x") RET

\,’により置換する文字列を計算するには、format関数が便利なときがあります(Formatting Strings in The Emacs Lisp Reference Manualを参照してください)。たとえば73列目から80列目(もしそこに何もなければ)に、‘ABC00042’のような連番を振りたいときは、以下を使うことができます。

M-x replace-regexp RET ^.\{0,72\}$ RET
\,(format "%-72sABC%05d" \& \#) RET

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.10.3 置換コマンドと大文字小文字

置換コマンドの最初の引数がすべて小文字の場合、置換のための検索において大文字小文字の違いを無視します。これはcase-fold-searchが非nilの場合です。case-fold-searchnilにセットすると、すべての検索において常に大文字小文字の違いが有効になります。

さらにnewstringのすべて、または一部が小文字の場合、置換コマンドは大文字小文字が出現するパターンを維持しようと試みます。したがって以下のコマンド、

M-x replace-string RET foo RET bar RET

は小文字の‘foo’を小文字の‘bar’で置換し、すべて大文字の‘FOO’を‘BAR’、そして最初が大文字の‘Foo’を‘Bar’に置換します。(これら3つの候補、すなわち小文字、すべて大文字、先頭が大文字は、replace-stringが認識できる唯一のパターンです)。

置換文字列に大文字が使われている場合、テキストが挿入されるときは、常に大文字のままとなります。大文字が最初の引数で使用されている場合、大文字小文字の変換なしで、2番目の引数に与えられたとおりに置換されます。同様にcase-replacecase-fold-searchの両方がnilにセットされている場合、大文字小文字の変換なしで置換されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.10.4 問い合わせつき置換

M-% string RET newstring RET

任意のstringnewstringで置換します。

C-M-% regexp RET newstring RET

regexpにたいする任意のマッチをnewstringで置換します。

foo’を‘bar’に置換するとき、すべてではなく、そのうちのいくつかだけを置換したいときは、M-% (query-replace)を使います。このコマンドは‘foo’を1つずつ検索して、それを置換するかを毎回尋ねます。この問い合わせを別とすれば、query-replacereplace-stringと同様に機能します(無条件の置換を参照してください)。通常のように、case-replaceが非nilのときは、大文字小文字を区別します(置換コマンドと大文字小文字を参照してください)。数引数を指定すると、単語区切り文字で区切られた単語だけを考慮します。負のプレフィクス引数は後方に置換します。

C-M-% (query-replace-regexp)は、regexpの検索と置換を行います。これはquery-replaceのように問い合わせを行う以外は、replace-regexpと同様に機能します。

これらのコマンドは、カレントのマッチを、フェイスquery-replaceを使ってハイライトします。他のマッチのハイライトにはインクリメンタル検索と同様に、フェイスlazy-highlightが使われます(インクリメンタル検索を参照してください)。デフォルトではquery-replace-regexpは、カレントマッチを置換する展開後の文字列を、ミニバッファーに表示します。特別なシーケンス‘\&’および‘\n’を展開せずに維持するには、query-replace-show-replacement変数をカスタマイズしてください。

以下は文字列またはregexpにたいするマッチが表示されているときにタイプできる文字です:

SPC

マッチをnewstringで置き換えます。

DEL

カレントマッチを置換せずに次のマッチへスキップします。

, (カンマ)

カレントマッチを置換して、結果を表示します。そして次に何をするかを文字入力するよう促します。置換がすでに行われているので、この状況ではDELSPCは等価で、どちらも次のマッチへ移動します。

ここでC-r(以下を参照)をタイプして、置換されたテキストを編集できます。C-x uをタイプして、置換を取り消すこともできます。これはquery-replaceを終了させるので、さらに置換を行う場合は、C-x ESC ESC RETで置換を再開しなければなりません(ミニバッファーでのコマンドの繰り返しを参照してください)。

RET

これ以上の置換を行わずに終了します。

. (ピリオド)

カレントマッチを置換してから、これ以上の検索を行わずに終了します。

!

これ以上の問い合わせをせずに、残りのマッチをすべて置換します。

Y (大文字)

複数バッファーの置換で、残りのバッファーの、残りのマッチをすべて置換します(これは選択したファイルにたいして問い合わせつきの置換を行う、DiredのQコマンドと似ています)。これはすべての一連の問い合わせにたいして、これ以上のユーザーとの対話なしに"yes"を答えます。

N (大文字)

複数バッファーの置換で、カレントバッファーの残りのマッチを置換せずに、次のバッファーへスキップします。これはカレントバッファーのマッチにたいする問い合わせに"no"を答えて、次のバッファーへと処理を続けます。

^

前のマッチの位置に戻ります。これは間違えて変更したときや、再検証したい場合に使います。

C-r

再帰編集レベル(recursive editing level)に入ります。これはマッチをnewstringで置換するだけでなく、編集したい場合に使用します。編集を終えたらC-M-cで再帰編集レベルを抜けて、次のマッチを処理します。再帰編集レベルを参照してください。

C-w

マッチを削除してから、C-rと同様に再帰編集レベルに入ります。これはstringを削除してから、テキストを挿入することにより置換を行う場合に使用します。編集を終えたらC-M-cで再帰編集レベルを抜けて、次のマッチを処理します。

e

置換文字列をミニバッファーで編集します。RETでミニバッファーを抜けると、カレントマッチをミニバッファーの内容で置換します。この新しい置換文字列は、残りのマッチにたいしても適用されます。

C-l

スクリーンを再描画します。その後でカレントマッチにたいして何を行うか、別の文字をタイプして指定しなければなりません。

C-h

上述したオプションの要約を表示します。その後でカレントマッチにたいして何を行うか、別の文字をタイプして指定しなければなりません。

上述した文字以外は、上述の文字リストのエイリアスです。たとえばynqは、SPCDELRETと等価です。

これらのエイリアス文字以外の文字は、query-replaceを終了してから、キーシーケンスの残りの部分を読みとります。したがってC-kとタイプすると、query-replaceを終了してから、行末までをkillします。

一度終了したquery-replaceを再開するには、C-x ESC ESCを使います。query-replaceは引数の読み取りにミニバッファーを使っているので、このキーシーケンスで再開させることができます。C-x ESC ESCを参照してください。

オプションsearch-invisibleは、query-replaceが非表示のテキストを扱う方法を決定します。Outline Searchを参照してください。

選択されたファイルにたいして問い合わせつきの置換を行う、DiredのQコマンドについては、ファイルにたいする操作を参照してください。regexpにマッチするファイル名にたいして、ファイル名の変更、ファイルのコピー、ファイルのリンクを行うDiredのコマンドについては、Diredでのファイル名の変更を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.11 その他の検索およびループコマンド

ここでは正規表現にたいするマッチを検索する、その他のコマンドを説明します。これらのコマンドは、パターンに大文字が含まれていないカ、case-fold-searchが非nilのときは、マッチングで大文字小文字を区別しません。occurとその変種をのぞき、これらはすべて、ポイント位置からバッファーの最後まで、リージョンがアクティブなときはリージョンにたいして処理を行います。

M-x multi-isearch-buffers

1つ以上のバッファー名の入力を求め(RETで終了)、それらのバッファーにたいして複数バッファーのインクリメンタル検索を開始します(あるバッファーでの検索に失敗すると、次のC-sにより、指定された次のバッファーへと検索を試みます)。プレフィクス引数を指定すると、regexpの入力を求め、regexpにマッチするバッファーにたいして、複数バッファーでのインクリメンタル検索を開始します。

M-x multi-isearch-buffers-regexp

このコマンドはmulti-isearch-buffersと同様ですが、インクリメンタルなregexp検索を行います。

M-x occur

regexpの入力を求め、それへのマッチを含むバッファー内の各行を一覧表示します。検索をバッファーの一部に制限するには、その部分にナローイングします(ナローイングを参照してください)。数引数nを指定すると、そのコンテキストでマッチした各行の、前後n行を表示します。

*Occur*バッファーでは、エントリーをクリックするか、ポイントをそこに移動してRETをタイプすることにより、検索されたバッファーの対応する位置をvisitします。oC-oはマッチを他のウィンドウに表示します(C-oはそのウィンドウを選択しません)。かわりにC-x ` (next-error)コマンドを使うことにより、マッチした場所を1つ1つvisitできます(Compilationモードを参照してください)。

*Occur*バッファーでeをタイプすることにより、Occur Editモードに切り替えます。このモードではエントリーにたいする編集結果が、元のバッファーのテキストに適用されます。C-c C-cとタイプすることにより、Occurモードに戻ります。

コマンドM-x list-matching-linesは、M-x occurの別名です。

M-s o

最後にインクリメンタル検索で使った文字列を検索文字列として、occurを実行します。インクリメンタル検索がアクティブのときはM-s oを実行して、カレントのサーチリングを使うこともできます。

M-x multi-occur

このコマンドはoccurと同じですが、複数のバッファーを検索する点が異なります。このコマンドは、1つずつバッファー名の入力を求めます。

M-x multi-occur-in-matching-buffers

このコマンドはmulti-occurと似ていますが、visitしているファイル名にマッチする正規表現を指定することにより、検索するバッファーを指定する点が異なります。プレフィクス引数を指定すると、正規表現にマッチするバッファー名となります。

M-x how-many

regexpの入力を求め、バッファーのポイント位置以降に、何個のマッチがあるか表示します。リージョンがアクティブのときは、リージョンにたいして操作を行います。

M-x flush-lines

regexpの入力を求め、ポイント以降にあるテキストにたいして、マッチが含まれている行を削除します。カレント行のポイント以降にマッチする文字列が含まれているときは、カレント行を削除します。リージョンがアクティブのときは、リージョンにたいして操作を行います。行の一部ににリージョンが含まれていて、さらにマッチの全体がリージョンに含まれているとき、その行は削除されます。

マッチが行をまたいでいる場合、flush-linesはそれらの行すべてを削除します。このコマンドは行を削除してから、次のマッチを検索します。したがって、1行にマッチ全体と、次の行にまたがるマッチが両方含まれるとき、次の行にまたがるマッチは無視されます。

M-x keep-lines

regexpの入力を求め、ポイント以降にあるテキストにたいして、マッチを含まない行を削除します。ポイントが行の先頭でない場合、このコマンドは常にカレント行を維持します。リージョンがアクティブのときは、リージョンにたいして操作を行います。このコマンドは一部がリージョンに含まれるだけの行は削除しません(行を終端する改行は、その行の一部と判断します)。

マッチが行をまたぐ場合、このコマンドはそれらすべての行を維持します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16 タイプミスを訂正するコマンド

このチャプターでは、編集中に間違いに気付いたときに便利なコマンドを説明します。これらのコマンドの中でもっとも基本的なのは、undoコマンドC-/です(これはC-x uC-_にもバインドされています)。これは1つのコマンドやコマンドの一部(query-replaceの場合など)、または連続するいくつかの文字の挿入を取り消します。連続してC-/を繰り返すと、前へ前へと変更を取り消し、undo情報が利用できる限界までさかのぼって、変更を取り消します。

ここで説明するコマンドとは別に、DEL (delete-backward-char)のような削除コマンドでもテキストを消去できます。これらのコマンドは、このマニュアルの前のチャプターで説明しています。テキストの消去を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.1 Undo(取り消し)

undo(取り消し)コマンドは、バッファーのテキストにたいする最後の変更を無効にします。バッファーはそれぞれ変更を個別に記録しており、undoコマンドは常にカレントバッファーに適用されます。バッファーのレコードにより、バッファーにたいするすべての変更をundoできます。通常、個々の変種コマンドは、undoレコードに個別のエントリーを作成しますが、query-replaceのようないくつかのコマンドは、undo操作に柔軟性をもたせるために、コマンドによる変更を複数のエントリーに分割します。連続した文字の挿入コマンドは、undo操作の冗長性をなくすために、通常1つのundoレコードにまとめられます。

C-/
C-x u
C-_

カレントバッファーのundoレコードの、1エントリーでundoします(undo)。

undoを開始するには、C-/(またはエイリアスのC-_C-x u)をタイプします6。これは一番最近のバッファーにたいする変更を取り消して、バッファーが変更される前の位置にポイントを戻します。連続してC-/(またはそれのエイリアス)を繰り返すと、現在のバッファーにたいする変更を、前へ前へとさかのぼって取り消します。すでに記録されている変更がすべて取り消されているとき、undoコマンドはエラーをシグナルします。

undo以外のコマンドは、undoコマンドの順序性を損ないます。undo以外のコマンドを開始した時点から、undoしてきた一連のundoコマンド全体が、1つの変更としてundoレコードとして記録されます。したがってundoした変更を再適用するには、undoの順序性を損なわないようなC-fのようなコマンドをタイプしてから、C-/でundoコマンドをundoします。

以前のundoコマンドを再実行せずにundoを再開したいときは、かわりにM-x undo-onlyを使います。これはundoと同様ですが、すでにundoした変更を再実行しません。

バッファーをうっかり変更してしまったのに気付いたら、モードラインのアスタリスクが表示されなくなるまでC-/を繰り返しタイプするのが、もっとも簡単な復旧方法です。undoコマンドによりモードラインのアスタリスクが消えたとき、それはバッファーの内容がファイルを最後に読み込んだとき、または保存したときと同じ内容だということを意味します。バッファーを意図して変更したか覚えていないときは、C-/を1回タイプします。最後の変更がundoされたのを確認して、それが意図した変更なのか確かめます。もしそれが意図しない変更だったならundoしたままにします。意図した変更だった場合、上で説明した方法で変更を再実行します。

アクティブなリージョンがあるとき、undo選択的なundo(selective undo)を行います。これはバッファー全体ではなく、リージョンにたいして一番最近の変更をundoします。しかしTransient Markモードがオフのとき(Transient Markモードを無効にするを参照してください)、C-/は、リージョンではなく、常にバッファー全体を操作します。この場合undoコマンドにプレフィクス引数を指定(C-u C-/)することにより、選択的なundoができます。同じリージョンにたいしてさらに変更をundoしたいときは、undoコマンドを繰り返します(プレフィクス引数は必要ありません)。

undoレコードを作らない、特別なバッファーがいくつかあります。それは名前がスペースで始まるバッファーです。これらのバッファーはEmacsにより内部的に使用されており、通常ユーザーが閲覧したり編集しないテキストを保持します。

バッファーにたいするundo情報が大きくなりすぎたとき、Emacsは一番古いレコードを、時々(ガベージコレクション(garbage collection)の間)廃棄します。変数undo-limitundo-strong-limitundo-outer-limitをセットすることにより、どれだけのundo情報を保持するか指定することができます。これらの値はバイト数で指定します。

変数undo-limitは、ソフトリミットをセットします。Emacsはこのサイズに達するまでのコマンドのundoデータを保持します。制限を超えることもあり得ますが、これを超える古いデータは保持しません。デフォルト値は80000です。変数undo-strong-limitは、厳密なリミット(stricter limit)をセットします。この制限を超えるような以前のコマンド(一番最近のコマンドではない)は記憶されません。undo-strong-limitのデフォルト値は120000です。

これらの変数の値にかかわらず、一番最近の変更はundo情報がundo-outer-limit(通常は12,000,000)より大きくならない限り、廃棄されることはありません。もしこれを超えるような場合、Emacsはundoデータを廃棄して、それにたいする警告を発します。これは一番最近のコマンドをundoできない唯一の状況です。これが発生した場合、将来同じことが起こらないようにundo-outer-limitの値を増やすことができます。しかしコマンドがそのような大きなundoデータを作るとは考えられない場合、それは多分バグなので、それを報告すべきです。Reporting Bugsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.2 テキストの入れ替え

C-t

2つの文字を入れ替えます(transpose-chars)。

M-t

2つの単語を入れ替えます(transpose-words)。

C-M-t

バランスのとれた2つの式を入れ替えます(transpose-sexps)。

C-x C-t

2つの行を入れ替えます(transpose-lines)。

2つの文字を入れ違いに入力してしまう間違いはよくありますが、それらが隣接しているときはC-t(transpose-chars)コマンドで訂正できます。通常C-tはポイントの左右にある文字を入れ替えます。行末でこのコマンドを使う場合、最後の文字と改行を入れ替えるのはおそらく無意味なので、C-tは行末の2文字を入れ替えます。このような入れ違いミスにすぐ気付いたときは、C-tだけで訂正できます。すぐに間違いに気付かなかった場合、C-tをタイプする前に、入れ替えて入力してしまった文字の間にカーソルを移動しなければなりません。単語の最後の文字とスペースを入れ替えて入力してしまった場合、そこに戻るには単語移動コマンドが良い方法です。それ以外では、逆向きの検索(C-r)が最善な方法の場合があります。検索と置換を参照してください。

M-tは、ポイントの前にある単語と、後にある単語を入れ替えます(transpose-words)。このコマンドはポイントより後方、またはポイントがある単語を前方に移動して、ポイントをその後に移動します。文字の間にある区切り文字は移動しません。たとえば‘FOO, BARは、‘BAR FOO,’ではなく、‘BAR, FOOに入れ替わります。

C-M-t (transpose-sexps)も似ていますが、これは2つの式(対応が取れたカッコの式を参照してください)を入れ替えます。そしてC-x C-t (transpose-lines)は、行を入れ替えます。これらはM-tと同様に動作しますが、入れ替えを行うテキスト単位が異なります。

入れ替えコマンドに数引数を指定すると、反復回数になります。これは入れ替えコマンドに、ポイントより前(またはポイントがある)の移動させる文字(または単語、式、行)を、何文字(または単語、式、行)後に移動させるか指示します。たとえばC-u 3 C-tは、ポイントの前にある文字を3文字後ろに移動します。つまり‘f∗oobar’は‘oobf∗ar’に変更されます。これはC-tを3回繰り返したのと同じですC-u - 4 M-tはポイントの前にある単語を、後方に単語4つ分移動します。C-u - C-M-tは、引数を指定しないC-M-tの効果を取り消します。

数引数0には特別な意味が割り当てられています(繰り返し回数としては、0に意味がありません)。これはポイントの後ろで終わる文字(または単語、式、行)を、マーク位置で終わる文字(または単語、式、行)と入れ替えます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.3 大文字小文字の変換

M-- M-l

最後に入力した単語を小文字に変換します。Meta--はメタとマイナスであることに注意して下さい。

M-- M-u

最後に入力した単語をすべて大文字に変換します。

M-- M-c

最後に入力した単語の先頭を大文字、それ以外を小文字に変換します。

単語の大文字小文字を間違えてタイプするのは、とても一般的な間違えです。そのため、単語の大文字小文字の変換コマンドM-lM-uM-cに負の数引数を指定すると、カーソルを移動しないという特性があります。最後に入力した単語のタイプミスに気付いたら、単に大文字小文字を変換して、タイプを続けることができます。大文字小文字変換コマンドを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.4 スペルのチェックと訂正

このセクションでは、1つの単語、またはバッファーの一部のスペルをチェックするコマンドを説明します。これらのコマンドはAspell、Ispell、Hunspellのようなスペルチェッカープログラムがインストールされている場合だけ機能します。これらのプログラムはEmacsの一部ではありませんが、GNU/Linuxまたは他のフリーなオペレーティングシステムには、通常1つはインストールされています。 Aspell in The Aspell Manualを参照してください。

M-$

ポイントがある単語スペルの、チェックと訂正をします(ispell-word)。リージョンがアクティブのときは、リージョンに含まれるすべての単語にたいして行います。

M-x ispell

バッファーにある単語スペルの、チェックと訂正をします。リージョンがアクティブのときは、リージョンに含まれるすべての単語にたいして行います。

M-x ispell-buffer

バッファーにある単語スペルの、チェックと訂正をします。

M-x ispell-region

リージョンにある単語スペルの、チェックと訂正をします。

M-x ispell-message

メールメッセージのドラフト(引用部分を除く)にたいして、単語スペルのチェックと訂正をします。

M-x ispell-change-dictionary RET dict RET

Aspell/Ispell/Hunspellのプロセスを再起動して、dictを辞書として使用させます。

M-x ispell-kill-ispell

Aspell/Ispell/Hunspellのサブプロセスをkillします。

M-TAB
ESC TAB

ポイントの前にある単語を、スペル辞書をもとに補完します(ispell-complete-word)。

M-x flyspell-mode

スペルミスした単語をハイライトする、Flyspellモードを有効にします。

M-x flyspell-prog-mode

コメントと文字列にたいして、Flyspellモードを有効にします。

ポイントの前または周囲にある単語スペルをチェックしたり訂正するには、M-$ (ispell-word)をタイプします。リージョンがアクティブのときは、リージョン内のすべての単語スペルをチェックします。マークとリージョンを参照してください(Transient Markモードがオフのとき、M-$はリージョンを無視して、常にポイントの前または周囲の単語にたいして動作します。Transient Markモードを無効にするを参照してください)。

同様に、コマンドM-x ispellはリージョンがアクティブのときはリージョン、それ以外のときはバッファー全体にたいして、スペルチェックを行います。コマンドM-x ispell-bufferおよびM-x ispell-regionは、スペルチェックをバッファー全体にたいして行うのか、リージョンにたいして行うかを明示します。このコマンドはバッファー全体をチェックしますが、インデントされているテキストと、以前のメッセージの引用と思われるテキストはチェックしません。メールの送信を参照してください。

これらのコマンドは、正しくないと思われる単語に出会うと、それをどうするかを尋ねます。通常は番号が振られた“近い単語(near-misses)”(正しくないと思われる単語に似た単語)のリストを表示します。これにたいして1文字をタイプして応答しなければなりません。以下は有効な応答文字です。

数字

今回だけは近い単語の一覧で単語を置き換えます。近い単語には番号が振られており、選択するにはその番号をタイプします。

SPC

その単語を間違いと判断することは変更しませんが、その単語をここでは変更せずスキップします。

r new RET

今回は単語をnewで置き換えます(置換文字列にスペルエラーがないか再スキャンされます)。

R new RET

単語をnewで置き換え、query-replaceを実行します。これによりバッファーの他の箇所の間違えを置換できます(置換にスペルエラーがないか再スキャンされます)。

a

正しくないと思われる単語を正しいものとして受け入れますが、それは今回の編集セッションに限られます。

A

正しくないと思われる単語を正しいものとして受け入れますが、それは今回の編集セッションとそのバッファーに限られます。

i

この単語をプライベートな辞書ファイルに挿入するので、今後(将来のセッションを含めて)Aspell/Ispell/Hunspellはその単語を正しく認識します。

m

iと同様ですが、辞書の補完情報も指定できます。

u

この単語の小文字バージョンを、プライベートな辞書ファイルに挿入します。

l word RET

wordにマッチする単語を辞書から探します。これらの単語は“近い単語”の新しいリストになるので、置換で数字をタイプして選択できるようになります。wordにはワイルドカードとして‘*’を使うことができます。

C-g
X

対話的なスペルチェックを終了します(ポイントはチェックされた単語の位置に残されます)。C-u M-$でチェックを再開できます。

x

対話的なスペルチェックを終了します(ポイントはチェックを開始したときの位置に戻ります)。

q

対話的なスペルチェックを終了して、スペルチェッカーのサブプロセスをkillします。

?

オプションの一覧を表示します。

Textモードおよびそれに関連するモードでは、M-TAB (ispell-complete-word)で、スペル訂正にもとづくバッファー内補完を行います。単語の最初の部分を入力してからM-TABをタイプすると、補完一覧が表示されます(ウィンドウマネージャーがM-TABを横取りしてしまう場合は、ESC TABまたはC-M-iをタイプします)。補完対象には番号か文字が振られているので、その番号か文字をタイプして選択します。

1度プロセスが開始されれば、Aspell/Ispell/Hunspellのサブプロセスは待機状態で実行を続けるので、一連のスペルチェックコマンドは素早く完了します。プロセスを終了させたいときはM-x ispell-kill-ispellを使います。スペルの訂正を行うとき以外プロセスがCPU時間を使うことはないので、これは通常必要ありません。

Ispell/Aspell/Hunspellは、スペルを2つの辞書から探します。それは標準辞書と個人用辞書です。標準辞書は変数ispell-local-dictionaryで指定されます。これがnilのときは、変数ispell-dictionaryで指定されます。両方がnilのとき、スペルプログラムは既定の辞書を使います。コマンドM-x ispell-change-dictionaryは、バッファーにたいする標準辞書をセットしてからサブプロセスを再起動することにより、これにより異なる標準辞書を使うことができます。個人用の辞書は、変数ispell-personal-dictionaryで指定します。これがnilのとき、スペルプログラムは個人辞書を既定の場所から探します。

単語の補完には別の辞書が使われます。変数ispell-complete-word-dictは、この辞書のファイル名を指定します。補完辞書はメインの辞書として使うことができず、追加の情報ももたないので、別のものでなければなりません。補完辞書のないスペルチェック辞書をもつ言語もいくつかあります。

Flyspellモードは、タイプした単語のスペルを自動的にチェックするマイナーモードです。認識できない単語を見つけると、その単語をハイライトします。M-x flyspell-modeとタイプすると、カレントバッファーのFlyspellモードを切り替えます。すべてのTextバッファーでFlyspellモードを有効にするには、text-mode-hookに、flyspell-modeを追加します。フックを参照してください。

Flyspellモードでスペルミスした単語がハイライトされているときは、それをMouse-2でクリックすることにより、利用可能な訂正とアクションのメニューを表示できます。手入力により、自分の好きな方法で単語を訂正することもできます。

Flyspell Progモードは通常のFlyspellモードと同じように機能しますが、コメントと文字列に含まれた単語だけをチェックします。この機能はプログラムを編集する場合に便利です。M-x flyspell-prog-modeをタイプして、現在のバッファーにたいするこのモードの有効と無効を切り替えます。すべてのプログラミングに関連したモードでこのモードを有効にするには、prog-mode-hookflyspell-prog-modeを追加します(フックを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17 キーボードマクロ

このチャプターでは一連の編集コマンドを記録して、後で簡単に繰り返す方法を説明します。

キーボードマクロ(keyboard macro)とは、Emacsのユーザーにより定義される、一連のキー入力からなるコマンドです。たとえばC-n M-d C-dを40回繰り返しタイプしていることに気付いたとしましょう。C-n M-d C-dを行うキーボードマクロを定義して、それを39回以上繰り返すことにより、作業スピードをあげることができます。

キーボードマクロは、コマンドを実行・記録することにより定義します。違う言い方をすると、キーボードマクロの定義では、初回はマクロの定義が実行されるということです。この方法により、頭だけで考えるのではなく、コマンドの影響を目で見ることができます。コマンド列の入力を終了して定義を終了するときは、キーボードマクロが定義されるとともに、入力したコマンド列の影響としてマクロが1回実行されたことになります。その後はマクロを呼び出すことにより、コマンド列全体を実行することができます。

キーボードマクロは、LispではなくEmacsコマンド言語(Emacs command language)で記述されている点が、通常のEmacsコマンドと異なります。しかしEmacsコマンド言語は、高度なことや一般的なことを記述するプログラム言語として、充分にパワフルとはいえません。そのような事項には、Lispを使わなければなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1 基本的な使い方

F3

キーボードマクロの定義を開始します(kmacro-start-macro-or-insert-counter)。

F4

キーボードマクロを定義しているときは定義を終了します。それ以外の場合は一番最近のキーボードマクロを実行します(kmacro-end-or-call-macro)。

C-u F3

最後のキーボードマクロを再実行してから、キーをマクロ定義に追加します。

C-u C-u F3

最後のキーボードマクロを再実行せずに、キーをマクロ定義に追加します。

C-x C-k r

リージョンの中の各行の行頭にたいして、最後のキーボードマクロを実行します(apply-macro-to-region-lines)。

キーボードマクロの定義を開始するには、F3をタイプします。それからはキーを入力して実行を続けますが、それは同時にマクロ定義の一部になります。その間は、モードラインに‘Def’が表示されて、マクロの定義中であることを示します。終了するときはF4 (kmacro-end-or-call-macro)をタイプして、定義を終了します。たとえば、

F3 M-f foo F4

これは1単語前方に移動してから、‘foo’を挿入するマクロを定義します。F3F4は、マクロの一部とはならないことに注意してください。

マクロを定義した後は、F4でそれを呼び出すことができます。上記の例では、それはM-f foo againをタイプしたのと同じ効果をもちます(F4コマンドの2つの役割に注意してください。これはマクロを定義しているときはマクロの定義を終了し、そうでないときは最後のマクロを呼び出します)。F4に数引数‘n’を与えることもできます。これはマクロを‘n’回呼び出すことを意味します。引数に0を与えると、エラーになるか、C-g(MS-DOSではC-BREAK)をタイプするまで、マクロを永久に繰り返します。

上記の例は、キーボードマクロを使った便利なトリックをデモンストレイトする例です。テキストの一定間隔の位置にたいして繰り返し操作を行いたいときは、マクロの一部に移動コマンドを含めます。この例ではマクロの繰り返しにより、連続する単語の後ろに文字列‘foo’を挿入していきます。

キーボードマクロの定義を終了した後でも、C-u F3をタイプすることにより、マクロの定義にキーストロークを追加できます。これはF3に続けてマクロの定義を再タイプするのと同じです。結果として、そのマクロの以前の定義が再実行されることになります。変数kmacro-execute-before-appendnilに変更すると、既存のマクロにキーストロークが追加されるまでは実行されません(デフォルトはt)。最後に実行したキーボードマクロを再実行することなく、定義の最後にキーストロークを追加するには、C-u C-u F3をタイプしてください。

コマンドがミニバッファーから引数を読みとる場合、ミニバッファーにたいする入力は、コマンドと一緒にマクロの一部となります。したがってマクロを再生すると、そのコマンドの引数は入力されたのと同じになります。たとえば、

F3 C-a C-k C-x b foo RET C-y C-x b RET F4

これはカレント行をkillして、バッファー‘foo’にそれをyankした後、元のバッファーに戻ります。

ほとんどのキーボードコマンドは、キーボードマクロの定義で普通に機能しますが、いくつか例外があります。C-g (keyboard-quit)をタイプすると、キーボードマクロの定義が終了します。C-M-c (exit-recursive-edit)は信頼できません。これはマクロの中で再帰編集(recursive edit)を開始したときは期待通りに再帰編集から抜け出しますが、キーボードマクロの呼び出し前に開始された再帰編集を抜け出すには、キーボードマクロからも抜け出す必要があります。同様に、マウスイベントもキーボードマクロで使用できますが。信頼はできません。マクロによりマウスイベントが再生されるときは、マクロを定義したときのマウス位置が使用されます。この効果は予測が困難です。

コマンドC-x C-k r (apply-macro-to-region-lines)は、リージョン内の各行のにたいして、最後に定義されたキーボードマクロを繰り返します。これは1行ずつポイントをリージョン内の行頭に移動してからマクロを実行します。

上記で説明したF3F4に加えて、Emacsはキーボードマクロを定義したり実行するための、古いキーバインドもサポートします。F3と同様ににマクロ定義を開始するには、C-x ( (kmacro-start-macro)とタイプします。プレフィクス引数を指定すると、最後のキーボードマクロの定義に追加します。マクロ定義を終了するにはC-x ) (kmacro-end-macro)とタイプします。一番最近のマクロを実行するには、C-x e (kmacro-end-and-call-macro)とタイプします。マクロ定義中にC-x eを入力すると、マクロ定義を終了してからすぐに実行されます。C-x eをタイプした後すぐにeをタイプすることにより、そのマクロを1回以上繰り返すことができます。F4と同様、C-x eには繰り返し回数を引数指定できます。

C-x )に、繰り返し回数を引数として与えることができます。これはマクロを定義した後、すぐにマクロが繰り返されることを意味します。マクロの定義は、定義することによりマクロが実行されるので、最初の1回として数えられます。したがってC-u 4 C-x )は、マクロを3回すぐに追加実行します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2 キーボードマクロリング

すべての定義されたキーボードマクロは、キーボードマクロリング(keyboard macro ring)に記録されます。キーボードマクロリングはすべてのバッファーで共有され、1つだけしかありません。

C-x C-k C-k

リングの先頭にあるキーボードマクロを実行します(kmacro-end-or-call-macro-repeat)。

C-x C-k C-n

キーボードマクロリングを、次のマクロ(古く定義されたもの)にローテートします(kmacro-cycle-ring-next)。

C-x C-k C-p

キーボードマクロリングを前のマクロ(新しく定義されたもの)にローテートします(kmacro-cycle-ring-previous)。

キーボードマクロリングを操作するすべてのコマンドは、同じC-x C-kを使います。これらのコマンドでは、すぐ後にコマンドを実行して繰り返す場合には、互いにC-x C-kプレフィクスを必要としません。たとえば、

C-x C-k C-p C-p C-k C-k C-k C-n C-n C-k C-p C-k C-d

これは、キーボードマクロリングを“2つ前”のマクロが先頭にくるようにローテートして、3回実行します。次にキーボードマクロリングをローテートして、元は先頭だったマクロを先頭に戻して1回実行します。次にキーボードマクロリングを“1つ前”のマクロが先頭にくるようにローテートして、それを実行します。そして最後にそれを削除しています。

コマンドC-x C-k C-k (kmacro-end-or-call-macro-repeat)は、マクロリングの先頭にあるキーボードマクロを実行します。もう一度すぐにC-kをタイプすると、マクロを繰り返すことができます。すぐにC-nC-pをタイプすれば、マクロリングをローテートすることができます。

キーボードマクロを定義しているとき、C-x C-k C-kF4と同様に振る舞いますが、すぐ後にタイプされた場合は異なります。このセクションで説明するほとんどのキーバインドは、C-x C-kプレフィクスが必要ない場合があります。たとえば、すぐにC-kをタイプした場合は、マクロを再実行します。

コマンドC-x C-k C-n (kmacro-cycle-ring-next)およびC-x C-k C-p (kmacro-cycle-ring-previous)は、マクロリングをローテートして、次または前のキーボードマクロをリングの先頭に移動させます。新しく先頭となったマクロの定義は、エコーエリアに表示されます。お望みのマクロが先頭にくるまで、すぐにC-nまたはC-pを繰り返しタイプすれば、マクロリングのローテートを続けることができます。新しくマクロリングの先頭にきたマクロを実行するには、単にC-kをタイプします。

Emacsはマクロリングの先頭を、“最後に定義されたキーボードマクロ”として扱います。たとえば、そのマクロはF4で実行でき、C-x C-k nで名前をつけることができます。

キーボードマクロリングに格納できるマクロの最大数は、カスタマイズ可能な変数kmacro-ring-maxにより決定されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3 キーボードマクロカウンター

キーボードマクロには、それぞれカウンターが割り当てられています。これはマクロの定義を開始したとき0に初期化されます。カウンターの数値をバッファーに挿入することもできます。カウンターの数値は、マクロが呼び出された回数にもとづきます。バッファーにカウンターの値が挿入される度に、カウンターは増加します。

F3

キーボードマクロの定義では、キーボードマクロカウンターの値をバッファーに挿入します(kmacro-start-macro-or-insert-counter)。

C-x C-k C-i

キーボードマクロカウンターの値をバッファーに挿入します(kmacro-insert-counter)。

C-x C-k C-c

キーボードマクロカウンターをセットします(kmacro-set-counter)。

C-x C-k C-a

プレフィクス引数をキーボードマクロカウンターに加えます(kmacro-add-counter)。

C-x C-k C-f

挿入するキーボードマクロカウンターの書式を指定します(kmacro-set-format)。

キーボードマクロを定義しているとき、コマンドF3 (kmacro-start-macro-or-insert-counter)は、キーボードマクロカウンターの現在の値をバッファーに挿入して、カウンターを1増加させます(マクロを定義していないとき、F3はマクロの定義を開始します。基本的な使い方を参照してください)。異なる増分の指定には、数引数を使うことができます。単にプレフィクスC-uを指定すると、それは0増加させるのと同じです。つまり現在のカウンターの値を挿入しますが、カウンターの値は変化しません。

例として数字が振られたリストを構築するために、キーボードマクロカウンターを使う方法を見てみましょう。以下のキーシーケンスを考えてください:

F3 C-a F3 . SPC F4

マクロ定義の一部として、現在の行の先頭に文字列‘0. ’が挿入されます。バッファーの他の箇所でF4でマクロを呼び出すと、その行の先頭に文字列‘1. ’が挿入されます。その後に呼び出すと‘2. ’、‘3. ’、...が挿入されます。

コマンドC-x C-k C-i (kmacro-insert-counter)は、F3と同様のことを行いますが、これはキーボードマクロの定義外でも使用できます。キーボードマクロが定義中でなく実行もされていない場合、これはキーボードマクロリングの先頭にあるマクロのカウンター値を挿入および増加します。

コマンドC-x C-k C-c (kmacro-set-counter)は現在のマクロカウンターを、数引数の値にセットします。マクロ内で使用した場合、マクロ実行ごとに処理します。プレフィクス引数に単にC-uを指定した場合、マクロの現在の繰り返し実行おいて、カウンターが最初にもっていた値に、カウンターをリセットします(この繰り返しにおける増加を取り消します)。

コマンドC-x C-k C-a (kmacro-add-counter)は、プレフィクス引数を現在のマクロカウンターに加えます。単にC-uを引数に指定すると、任意のキーボードマクロにより最後に挿入された値に、カウンターをリセットします(通常これを使うときは、最後の挿入は同じマクロによる同じカウンターです)。

コマンドC-x C-k C-f (kmacro-set-format)は、マクロカウンターを挿入するときに使われる書式の入力を求めます。デフォルトの書式は‘%d’で、これはパディングなしの10進数字が挿入されることを意味します。ミニバッファーに何も入力せずにexitすることにより、このデフォルト書式にリセットできます。format関数(この関数はさらに1つの整数の引数をとります)が受け入れる書式文字列を指定できます(Formatting Strings in The Emacs Lisp Reference Manualを参照してください)。ミニバッファーに書式文字列を入力するときは、書式文字列をダブルクォーテーションで括らないでください。

キーボードマクロの定義および実行がされていないときにこのコマンドを使うと、新しい書式はそれ以降のマクロ定義すべてに影響を及ぼします。既存のマクロは、それが定義されたときの書式を使いつづけます。キーボードマクロ定義中に書式をセットすると、そのマクロが定義されている箇所に影響を及ぼしますが、それ以降のマクロには影響を与えません。マクロの実行においては、そのマクロ定義の時点の書式が使われます。マクロの実行中にマクロ書式を変更すると、これは定義中における書式の変更と同様、それ以降のマクロに影響を与えません。

C-x C-k C-fによりセットされた書式は、レジスターに格納された数字の挿入には影響しません。

マクロの繰り返しにおいてレジスターを増加してカウンターとして使う場合、これはキーボードマクロカウンターと同じことです。レジスターに数字を保存するを参照してください。大抵の用途では、キーボードマクロカウンターを使う方が単純です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.4 変化のあるマクロの実行

キーボードマクロで、query-replaceのように変更を行うか応答を求める効果を作ることができます。

C-x q

マクロ実行中にこの箇所に到達すると確認を求めます(kbd-macro-query)。

マクロ定義中に問い合わせを行いたい箇所でC-x qをタイプします。マクロ定義中はC-x qは何も行いませんが、後でマクロを実行するとC-x qは実行を続けるか対話的に確認を求めます。

以下はC-x qにたいする有効な応答です:

SPC (またはy)

キーボードマクロの実行を続けます。

DEL (またはn)

マクロのこの繰り返しでの残りの部分をスキップして、次の繰り返しを開始します。

RET (またはq)

マクロのこの繰り返しでの残りの部分をスキップして、これ以上の繰り返しを取り消します。

C-r

マクロの一部ではない編集を行うことができる、再帰編集レベル(recursive editing level)に入ります。C-M-cを使って再帰編集を抜けると、キーボードマクロを続行するか再び確認を求められます。ここでSPCをタイプすると、マクロ定義の残りの部分が実行されます。マクロの残りの部分が期待したように動作するためにポイントとテキストを残すのは、ユーザーの責任です。

C-x qに数引数を指定したC-u C-x qは、完全に異なる関数を実行します。これはマクロ定義中およびマクロ実行中の両方で、キーボード入力を読みとる再帰編集に入ります。定義中のときは、再帰編集の中で行った編集はマクロの一部とはなりません。マクロ実行中は、再帰編集により各繰り返しにおいて特別な編集を行う機会が与えられます。再帰編集レベルを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.5 キーボードマクロの命名と保存

C-x C-k n

一番最近定義したキーボードマクロに、名前(持続期間はEmacsセッション中)を与えます(kmacro-name-last-macro)。

C-x C-k b

一番最近定義したキーボードマクロを、キーにバインド(持続期間はEmacsセッション中)します(kmacro-bind-to-key)。

M-x insert-kbd-macro

キーボードマクロの定義を、Lispコードとしてバッファーに挿入します。

キーボードマクロを後で使うために保存するには、C-x C-k n (kmacro-name-last-macro)を使って、それに名前を与えることができます。これはミニバッファーを使って名前を引数として読み取り、最後のキーボードマクロの現在の定義を実行するための、名前を定義します(後でこのマクロの定義を追加した場合、その名前のマクロ定義は変更されません)。マクロ名はLispシンボルで、M-xで呼び出せ、global-set-keyでキーにバインドできる有効な名前をつけます。キーボードマクロ以外に定義されている名前を指定すると、エラーメッセージが表示され何も変更はされません。

C-x C-k b (kmacro-bind-to-key)の後に、バインドしたいキーシーケンスを続けることにより、最後のキーボードマクロ(の現在の定義)をキーにバインドすることもできます。グローバルキーマップ(global keymap)の任意のキーシーケンスにバインドできますが、大部分のキーシーケンスはすでに他のバインドをもっているので、キーシーケンスの選択は慎重に行う必要があります。任意のキーマップで既存のバインドをもつキーシーケンスにバインドしようとすると、既存のバインドを置き換える前に確認を求めます。

既存のバインドの上書きに起因する問題を避けるには、キーシーケンスC-x C-k 0からC-x C-k 9と、C-x C-k AからC-x C-k Zを使います。これらのキーシーケンスは、キーボードマクロのバインド用に予約されています。これらのキーシーケンスにバインドするには、キーシーケンス全体ではなく数字か文字だけをタイプすればバインドできます。たとえば、

C-x C-k b 4

これは最後のキーボードマクロをキーシーケンスC-x C-k 4にバインドします。

1度マクロにコマンド名をつければ、その定義をファイルに保存できます。それは他の編集セッションでも使用できます。最初に定義を保存したいファイルをvisitします。次に以下のコマンドを使います:

M-x insert-kbd-macro RET macroname RET

これは後で実行するとき、今と同じ定義のマクロとなるLispコードをバッファーに挿入します(これを行うためにLispコードを理解する必要はありません。なぜならあなたのかわりにinsert-kbd-macroがLispコードを記述するからです)。それからファイルを保存します。後でそのファイルをload-file (EmacsのためのLispコードによるライブラリーを参照してください)でロードできます。initファイル~/.emacs (Emacs初期化ファイルを参照してください)に保存すれば、そのマクロはEmacsを実行する度に定義されます。

insert-kbd-macroに数引数を与えると、(もしあれば)macronameにバインドしたキーを記録するためのLispコードが追加されるので、ファイルをロードしたとき同じキーにマクロが割り当てられます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.6 キーボードマクロの編集

C-x C-k C-e

最後に定義されたキーボードマクロを編集します(kmacro-edit-macro)。

C-x C-k e name RET

以前に定義されたキーボードマクロnameを編集します(edit-kbd-macro)。

C-x C-k l

過去300回分のキーストロークを、キーボードマクロとして編集します(kmacro-edit-lossage)。

C-x C-k C-eまたはC-x C-k RET (kmacro-edit-macro)をとタイプして、最後のキーボードマクロを編集できます。これはマクロ定義をバッファーに整形出力して、それを編集するために特化したモードに入ります。そのバッファーでC-h mをタイプすると、マクロを編集する方法の詳細が表示されます。編集を終了するにはC-c C-cをタイプしてください。

名前をつけたキーボードマクロ、またはキーにバインドしたマクロは、C-x C-k e (edit-kbd-macro)とタイプして編集できます。このコマンドに続けてそのマクロを呼び出すときのキー入力(C-x eM-x name、またはその他のキーシーケンス)を入力します。

C-x C-k l (kmacro-edit-lossage)とタイプして、最近300回のキーストロークをマクロとして編集できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.7 キーボードマクロのステップ編集

C-x C-k SPC (kmacro-step-edit-macro)とタイプして、最後のキーボードマクロをインタラクティブに1コマンドずつ再生および編集できます。マクロをqまたはC-gで終了しなければ、編集されたマクロでマクロリングの最後のマクロを置き換えます。

このマクロ編集機能は、最初(または次)に実行されるコマンドと、それにたいする操作を尋ねるプロンプトをミニバッファーに表示します。?を入力すれば、オプションの要約を表示できます。以下のオプションが利用可能です:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18 ファイルの処理

オペレーティングシステムはファイルにデータを永続化するので、Emacsで編集するテキストの大部分はファイルから読み込んで、最終的にファイルに格納します。

ファイルを編集するには、Emacsにファイルを読み込み、ファイルのテキストを含むバッファーを準備するよう、指示しなければなりません。これを、ファイルのvisit(訪問)と呼びます。編集コマンドは直接バッファーのテキスト、つまりEmacs内部のコピーに適用されます。変更がファイルに反映されるのは、バッファーをファイルに保存(save)したときだけです。

ファイルのvisitや保存に加え、Emacsはファイルの削除、コピー、名前の変更、ファイルへの追加、ファイルの複数バージョンの保持、ディレクトリーの操作を行うことができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.1 ファイルの名前

ファイルを操作するEmacsコマンドの多くは、ミニバッファー(ミニバッファーでのファイル名を)を使って、ファイル名の指定を求めます。

ミニバッファーでは、通常の補完およびヒストリーコマンドを使うことができます(ミニバッファーを参照してください)。ファイル名の補完では、ファイル名の拡張子が変数completion-ignored-extensionsに含まれているファイルは無視されます(補完オプションを参照してください)。またほとんどのコマンドは、ファイルの読み込みにおいて、“確認をともなう寛大な補完(permissive completion with confirmation)”を使います。この補完では、存在しないファイル名が許されますが、存在しないファイル名の入力を完了するためにRETをタイプすると、Emacsは‘[Confirm]’を表示し、この確認に同意するために2番目のRETをタイプしなければなりません。詳細については、補完の終了を参照してください。

それぞれのバッファーは、バッファーローカルな変数default-directoryに、デフォルトのディレクトリーを格納しています。ミニバッファーを使ってファイル名を読み取るとき、通常Emacsはミニバッファーの初期内容として、デフォルトディレクトリーを挿入します。変数insert-default-directorynilに変更することにより、この挿入を抑制できます。常にEmacsは任意の相対パスで指定されたファイル名を、デフォルトディレクトリーにたいする相対パスとみなします。たとえばディレクトリーを指定しないファイル名は、デフォルトディレクトリーのファイルを指定します。

ファイルをvisitするとき、Emacsはvisitしているバッファーのdefault-directoryに、そのファイルのディレクトリーをセットします。C-x bのようなコマンドを通じて、ファイルをvisitしていないバッファーを新たに作成すると、通常そのバッファーのデフォルトディレクトリーは、現在のバッファーのデフォルトディレクトリーをコピーします。現在のバッファーのdefault-directoryの値を見るために、M-x pwdコマンドを使用できます。M-x cdコマンドはディレクトリー名の入力を求め、バッファーのdefault-directoryもそのディレクトリーをセットします(これを行うことによりバッファーのファイル名は変更されません)。

例として、ファイル/u/rms/gnu/gnu.tasksをvisitしているとします。このときデフォルトディレクトリーは/u/rms/gnu/にセットされます。ファイル名を読み取るコマンドを呼び出して、ミニバッファーでディレクトリー名を省略して単に‘foo’と入力すると、これはファイル/u/rms/gnu/fooを指定したことになります。‘../.login’と入力すると/u/rms/.login、‘new/foo’と入力すると/u/rms/gnu/new/fooを指定したことになります。

ミニバッファーにファイル名をタイプするとき、2つのショートカットを使うことができます。2つのスラッシュは、“2番目のスラッシュの前にあるすべてを無視する”と解釈されます。そして‘~/’は、ユーザーのホームディレクトリーと解釈されます。ミニバッファーでのファイル名を参照してください。

文字‘$’は、ファイル名を置き換える環境変数の代用として使われます。環境変数の名前は、‘$’の後ろのすべての英数字から構成されます。‘$’の後ろの、大カッコ(braces)に囲まれた変数名も使用できます。たとえばシェルコマンドexport FOO=rms/hacksは、名前がFOOの環境変数をセットするために使われます。すると/u/$FOO/test.c/u/${FOO}/test.cはどちらも、/u/rms/hacks/test.cの省略形となります。環境変数が定義されていないときは、何の置き換えも発生せず、文字‘$’はそれ自身を意味します。環境変数は、それがEmacsの開始前に適用されたときだけ、Emacsに影響を与えることに注意してください。

$’により環境変数が展開されるようなとき、名前に‘$’を含むファイルにアクセスする場合は、‘$$’とタイプします。1つの‘$’が環境変数を展開するのと同時に、2つのペアは1つの‘$’に変換されます。かわりにファイル名を‘/:’でクォートすることもできます(ファイル名のクォートを参照してください)。名前が文字‘~’で始まるファイル名も、‘/:’でクォートするべきです。

ファイル名に非ASCII文字を含めることができます。ファイル名にたいするコーディングシステムを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.2 ファイルのvisit(訪問)

C-x C-f

ファイルをvisitします(find-file)。

C-x C-r

変更を許さない閲覧用として、ファイルをvisitします(find-file-read-only)。

C-x C-v

最後にvisitしたファイルとは異なるファイルを、かわりにvisitします(find-alternate-file)。

C-x 4 f

別のウィンドウでファイルをvisitします(find-file-other-window)。選択されたウィンドウに表示されているものは変更しません。

C-x 5 f

新しいフレームでファイルをvisitします(find-file-other-frame)。選択されたフレームに表示されているものは変更しません。

M-x find-file-literally

内容を変換せずにファイルをvisitします。

ファイルをVisiting(訪問)するとは、そのファイル内容をEmacsのバッファーに読み込むことを意味するので、それを編集することができます。Emacsはvisitするファイルごとに、新しいバッファーを作成します。

ファイルをvisitするには、C-x C-f (find-file)とタイプして、visitしたいファイルの名前をミニバッファーで入力します。ミニバッファーでは、C-gをタイプして、コマンドを中止することができます。ミニバッファーでのファイル名の入力についての詳細は、ファイルの名前を参照してください。

ファイルは存在するが、システムが読み込みを許さない場合、エコーエリアにエラーメッセージが表示されます。それ以外の場合、スクリーンに新しいテキストが表示され、モードラインバッファー名が表示されることで、C-x C-fが成功したことを知ることができます。通常Emacsは、ファイル名からディレクトリー名を省いて、バッファー名を作ります。たとえば/usr/rms/emacs.texという名前のファイルは、バッファー名‘emacs.tex’となります。その名前のバッファーがすでにある場合、Emacsは一意な名前を作ります。通常の方法はディレクトリー名にもとづく接尾辞の追加です(たとえば‘<rms>’、‘<tmp>’など)が、違う方法を選択することもできます。バッファー名を一意にするを参照してください。

新しいファイルを作成するには、同じコマンドC-x C-fを使ってvisitするだけです。Emacsはエコーエリアに‘(New file)’と表示しますが、他の点では既存の空のファイルをvisitしたのと同じく振る舞います。

ファイルをvisitした後で編集コマンドにより行われた変更は、Emacsのバッファーに反映されます。バッファーを保存(save)するまでは、visitしているファイルに影響はありません。バッファーが保存されていない変更を含むとき、そのバッファーが変更されている(modified)といいます。これはバッファーを保存しなければ、その変更が失われることを意味します。モードラインの左余白の近くに2つのアスタリスクが表示され、バッファーが変更されていることを示します。

すでにEmacsがvisitしているファイルをvisitした場合、C-x C-fは他のコピーを作らず既存のバッファーに切り替えます。切り替えを行う前に、最後にvisitまたは保存した後にファイルが変更されているか確認します。もしファイルが変更されているとき、Emacsはそれの再読み込みを提案します。

large-file-warning-threshold (デフォルトは10000000で、これは約10MB)より大きなファイルのvisitを試みると、Emacsは最初に確認を求めます。yを応えることにより、ファイルのvisitを続けます。しかしEmacsは、Emacsバッファーの最大サイズ(Emacsが割り当てられるメモリー量の制限と、Emacsが扱える整数により制限されます)を超えるバッファーは、visitできないことに注意してください。この場合、Emacsは最大バッファーサイズを超えた旨を知らせるエラーメッセージを表示します。

ファイル名にシェル形式のワイルドカード文字が含まれている場合、Emacsはそれにマッチするすべてのファイルをvisitします。(大文字小文字を区別しないファイルシステムでは、Emacsは大文字小文字に関係なくワイルドカードをマッチします)。ワイルドカードには‘?’、‘*’および‘[…]’シーケンスが含まれます。ミニバッファーでワイルドカード‘?’をファイル名に入力するには、C-q ?とタイプする必要があります。ワイルドカード文字を実際に名前に含むファイルをvisitする方法についての情報は、ファイル名のクォートを参照してください。find-file-wildcardsをカスタマイズして、ワイルドカード機能を無効にすることができます。

無意識に間違ったファイル名をタイプして違うファイルをvisitした場合、C-x C-v (find-alternate-file)で実際に望むファイルをvisitできます。C-x C-vC-x C-fと似ていますが、これは現在のバッファーをkillします(変更されている場合は最初に保存するか確認を求めます)。C-x C-vがvisitするファイルの名前を読み取るときは、ミニバッファーにデフォルトのファイル名全体を挿入して、ポイントをディレクトリー名の後に置きます。これは名前を少し間違えた場合などに便利です。

実際はディレクトリーであるファイルを“visit”したとき、EmacsはEmacsのディレクトリーブラウザーのDiredを呼び出します。Dired (ディレクトリーエディター)を参照してください。この振る舞いは、変数find-file-run-dirednilにセットすることにより無効にできます。この場合、ディレクトリーをvisitするとエラーになります。

実際には他のファイルの集まりであるようなアーカイブファイル(file archives)の場合、アーカイブされたメンバーを操作できる、Diredに似た環境を呼び出す特別なモードでvisitします。これらの機能については、ファイルアーカイブを参照してください。

オペレーティングシステムが変更を許していない、または読み取り専用にしているファイルをvisitした場合、Emacsもバッファーを読み取り専用にするので、保存すると問題を起こすような変更を防ぐことができます。C-x C-q (read-only-mode)で、バッファーを書き込み可能にできます。その他のバッファー操作を参照してください。

予期せぬ入力による変更を防ぐために、読み込み専用でファイルをvisitしたい場合は、C-x C-fのかわりにコマンドC-x C-r (find-file-read-only)でvisitします。

C-x 4 f (find-file-other-window)はC-x C-fと同様ですが、指定したファイルを含むバッファーは、別のウィンドウで選択されます。C-x 4 fの前に選択されていたウィンドウは、すでに表示していたのと同じバッファーの表示を続けます。1つのウィンドウしか表示されていないときにこのコマンドを使うと、これはウィンドウを2つに分割し、1つのウィンドウには前に表示されていたのと同じバッファー、別の1つには新しい要求されたファイルを表示します。複数ウィンドウを参照してください。

C-x 5 f (find-file-other-frame)も同様ですが、新しいフレームををオープンするか、指定したファイルをすでに表示している既存のフレームを選択します。フレームとグラフィカルなディスプレーを参照してください。

グラフィカルなディスプレーでは、ファイルをvisitする追加の方法が2つあります。1つ目は、Emacsが適したGUIツールキットによりビルドされているとき、マウスによるコマンドの呼び出し(メニューバーやツールバーのクリックによる)は、ミニバッファーでファイル名の入力を求める代わりに、そのツールキット標準の“ファイル選択(File Selection)”ダイアログを表示します。GNU/LinuxおよびUnixプラットフォームでは、GTK、LessTif、Motifツールキットとともに構築されていると、Emacsはこれを行います。MS-WindowsとMacでは、GUIバージョンのデフォルトにより行われます。これをカスタマイズする情報については、ダイアログボックスの使用を参照してください。

2つ目は、Emacsはの“ドラッグアンドドロップ(drag and drop)”サポートで、通常のEmacsウィンドウにファイルをドロップすることにより、そのウィンドウでファイルをvisitします。例外としてDiredバッファーを表示しているウィンドウにファイルをドロップすると、表示されているディレクトリーにファイルを移動またはコピーします。詳細についてはドラッグアンドドロップその他のDiredの機能を参照してください。

テキスト端末、およびGUIツールキットなしでビルドされているグラフィカルなディスプレーでは、メニューバーの“File”メニューから、“Visit New File”アイテムを選択することにより、ファイルをvisitできます。

文字エンコーディングと使用されている改行規則を検知するために、Emacsは自動的に内容をスキャンします。そして、それらをEmacsの内部エンコーディングとバッファーの改行規則に変換します。バッファーを保存するとき、Emacsは逆の変換を行い、元のエンコーディングと改行規則でファイルをディスクに書き込みます。コーディングシステムを参照してください。

ファイルにたいして特別なエンコーディングや変換を行わずに、非ASCII文字のシーケンスとして編集したいときは、M-x find-file-literallyコマンドを使います。これはC-x C-fと同様ですが、フォーマット変換(Format Conversion in the Emacs Lisp Reference Manualを参照してください)、文字コード変換(コーディングシステムを参照してください)、自動解凍(圧縮ファイルへのアクセスを参照してください)を行わず、require-final-newlineによる最後の改行も追加しません(ファイル保存のカスタマイズを参照してください)。同じファイルをすでに通常(非リテラル)の方法でvisitしている場合、このコマンドはそれをリテラル(そのままの文字の列)としてvisitするかを尋ねます。

2つの特別なフック変数により、ファイルをvisitする操作を変更して拡張することができます。存在しないファイルをvisitすることにより、find-file-not-found-functionsの関数が実行されます。この変数は関数のリストを保有し、それらはどれか1つが非nilを返すまで、(引数を指定せずに)1つずつ呼び出されます。これはノーマルフックではないため、その事実を示すために名前の最後が‘-hook’ではなく、‘-functions’で終わっています。

ファイルが存在するしないにかかわらず、ファイルをvisitするのに成功すると、引数なしで関数find-file-hookを呼び出します。この変数はノーマルフックです。ファイルが存在しない場合、最初にfind-file-not-found-functionsを実行します。フックを参照してください。

ファイルを編集するために自動的にメジャーモードを指定し(ファイルのモードを選択するを参照してください)、そのファイルのために特別なローカル変数を定義する方法がいくつかあります(ファイル内のローカル変数を参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3 ファイルの保存

Emacsでのバッファーの保存(Saving)は、バッファーの内容を、そのバッファーによりvisitされているファイルに書き戻すことを意味します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.1 ファイルを保存するコマンド

ファイルの保存と書き込みに関するコマンドが、いくつかあります。

C-x C-s

現在のバッファーを、そのファイルに保存します(save-buffer)。

C-x s

任意、またはすべてのバッファーを、それらのファイルに保存します(save-some-buffers)。

M-~

現在のバッファーが変更されたことを忘れます(not-modified)。プレフィクス引数(C-u)を指定すると、現在のバッファーを変更済みとマークします。

C-x C-w

現在のバッファーを、指定したファイル名で保存します(write-file)。

M-x set-visited-file-name

現在のバッファーが保存される場所で、ファイル名を変更します。

ファイルを保存して変更を永続化させたいときは、C-x C-s (save-buffer)とタイプします。保存が完了すると、C-x C-sは以下のようなメッセージを表示します:

Wrote /u/rms/gnu/gnu.tasks

現在のバッファーが変更されていない(新規作成されたとき、または最後に変更されたときから変更していない)場合、保存しても意味がないので実際の保存は行われません。かわりにC-x C-sは、エコーエリアに以下のようなメッセージを表示します:

(No changes need to be saved)

C-u C-x C-sのようにプレフィクス引数を指定すると、Emacsはそのバッファーを次回の保存が行われるときバックアップするようマークします。バックアップファイルを参照してください。

コマンドC-x s (save-some-buffers)は、任意、またはすべての変更されたバッファーの保存を提案します。これはバッファーごとに何を行うか尋ねます。使用できる応答は、query-replaceと同様です。

y

このバッファーを保存し、残りのバッファーについて尋ねます。

n

このバッファーは保存せずに、残りのバッファーについて尋ねます。

!

このバッファーを保存し、残りのバッファーを尋ねることなくすべて保存します。

RET

これ以上の保存をせずに、save-some-buffersを終了します。

.

このバッファーを保存したら、他のバッファーをどうするか尋ねることなく、save-some-buffersを終了します。

C-r

現在尋ねられているバッファーを閲覧します。Viewモードから抜けると、再びsave-some-buffersはどうするか尋ねます。

d

そのバッファーに対応するファイルとDiffをとり、どのような変更を保存するのか確認できます。これはコマンドdiff-buffer-with-file (ファイルの比較を参照してください)を呼び出します。

C-h

これらのオプションについての、ヘルプメッセージを表示します。

Emacsを終了するキーシーケンスC-x C-cは、save-some-buffersを呼び出すので、同じ質問をします。

バッファーを変更したが変更を保存したくないとき、保存されるのを防ぐためにできることがいくつかあります(それ以外のC-x sまたはC-x C-cで間違って保存してしまうのはあなたの責任です)。まずできることは、M-~ (not-modified)とタイプすることで、これはバッファーが変更されているというマークをクリアーします。これを行うと、保存コマンドに、バッファーが保存を必要しないと信じこませることができます(‘~’は数学のシンボルで、‘not(否定)’として使われることがあります。したがってM-~はメタと‘not’になります。)。かわりにファイルからテキストを読み込むことにより、ファイルをvisitまたは保存された後に行った、すべての変更を取り消すことができます。これはリバート(reverting: 復元)と呼ばれます。バッファーのリバートを参照してください(undoコマンドC-x uを繰り返すことにより、変更がすべての変更を取り消すこともできますが、リバートの方が簡単です)。

M-x set-visited-file-nameは、現在のバッファーがvisitしているファイルの名前を変更します。このコマンドはミニバッファーを使って、新しいファイル名を読み取ります。その後に、そのバッファーがそのファイル名のファイルをvisitしているとマークし、バッファー名も合わせて変更します。set-visited-file-nameは、新しくvisitするファイルへの保存はしません。これは後で保存するときのために、Emacs内のレコードを変更するだけです。これはバッファーを“変更されている(modified)”とマークするので、そのバッファーでの将来C-x C-sで、保存が行われます。

バッファーにたいして、違うファイルをvisitしているとマークしてすぐに保存したい場合は、C-x C-w (write-file)を使います。このコマンドは、set-visited-file-nameの後すぐにC-x C-sをするのと同じですが、C-x C-wはファイルが存在するとき確認を求める点が異なります。ファイルをvisitしていないバッファーでのC-x C-sは、C-x C-wと同じ効果をもちます。したがってファイル名を読み取り、バッファーがそのファイルをvisitしているとマークした後、バッファー内容をそのファイルに保存します。ファイルをvisitしていないバッファーのデフォルトファイル名は、バッファー名と、バッファーのデフォルトディレクトリーから合成されます(ファイルの名前を参照してください)。

新しいファイル名が何らかのメジャーモードに関連する場合、大抵はC-x C-wによりそのメジャーモードへの切り替えが行われます。コマンドset-visited-file-nameもこれを行います。ファイルのモードを選択するを参照してください。

Emacsがファイルを保存する際、ディスクの最新バージョンのファイル日付を確認して、それがEmacsが最後に読み込み、または書き込みしたときと異なる場合、Emacsはその事実をユーザーに知らせます。なぜならそれはおそらく同時編集による問題を示しており、それをすぐにユーザーに知らせる必要があるからです。Simultaneous Editingを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.2 バックアップファイル

ほとんどのオペレーティングシステムでは、ファイルを書き換えるとファイルに入っていたそれまでの記録は、自動的に破棄されます。したがって、Emacsでファイルを保存すると、ファイルの古い内容は捨てられます。しかし実際に保存する前に、Emacsが慎重に古い内容をバックアップ(backup)ファイルと呼ばれる別のファイルにコピーすれば、古い内容は失われません。

Emacsは最初にバッファーからファイルに保存されたときだけ、バックアップファイルを作成します。その後ファイルを何回保存しようと、バックアップは変更されません。しかしバッファーをkillしてから、そのファイルを再びvisitすると、新しいバックアップファイルが作成されます。

ほとんどのファイルにたいして、変数make-backup-filesはバックアップファイルを作るかを決定します。ほとんどのオペレーティングシステムでは、デフォルト値はtなので、Emacsはバックアップファイルを書き込みます。

バージョンコントロールシステム(version control system: バージョンコントロールを参照してください)で管理されているファイルにたいして、バックアップファイルを作るかは、変数vc-make-backup-filesにより決定されます。バージョンコントロールシステムに以前のバージョンがある場合、バックアップファイルを作るのは不必要なので、デフォルト値はnilです。 See section 一般的なオプション.を参照してください。

選択できるオプションは、Emacsにファイルごとに1つのバックアップを作らせる方法と、編集するファイルごとに番号がついた、一連のファイルを作る方法があります。単一または番号つきバックアップを参照してください。

変数backup-enable-predicateのデフォルト値は、一時的なファイルのために使われるディレクトリー(変数temporary-file-directoryまたはsmall-temporary-file-directoryで指定されます)のファイルは、バックアップしないような値になっています。

前に保存されたバッファーにたいしても、バッファーから他のバックアップファイルを作るよう、Emacsに明示的に指示することができます。バッファーをC-u C-x C-sで保存すると、この保存したバージョンが、次にバックアップするときのバックアップになります。C-u C-u C-x C-sはバッファーを保存しますが、最初に元のファイル内容を新しいバックアップファイルとします。C-u C-u C-u C-x C-sは両方を行います。まず前の内容でバックアップを作成し、次回に保存したときは、今回保存したものをバックアップにします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.2.1 単一または番号つきバックアップ

Emacsのバックアップファイル作成では、バックアップの名前は通常、編集されるファイル名の後ろに‘~’をつけて作成されます。したがってeval.cのバックアップファイルは、eval.c~になります。

アクセスコントロールによりEmacsが通常の名前でバックアップファイルを書き込めない場合、~/.emacs.d/%backup%~というバックアップファイルに書き込みます。この1つのファイルしか存在しないので、一番最近作られたバックアップだけが利用可能です。

Emacsは番号つきバックアップファイル(numbered backup files)を作ることもできます。番号つきバックアップファイルの名前は、元のファイル名の後ろに‘.~’と番号と‘~’をつけたものです。したがってeval.cのバックアップファイルは、eval.c.~1~eval.c.~2~、...、eval.c.~259~、...となります。

変数version-controlは、単一のバックアップファイルを作るか、複数の番号つきバックアップファイルを作るかを決定します。有効な値は以下のとおりです:

nil

すでに番号つきバックアップのあるファイルにたいしては、番号つきバックアップを作ります。それ以外は単独のバックアップをつくります。これがデフォルトです。

t

番号つきバックアップを作ります。

never

番号つきバックアップをつくらず、常に単一のバックアップを作ります。

この変数をセットする通常の方法は、initファイルやcustomizationバッファーを通じて、グローバルにセットする方法です。しかし特定のバッファーにローカルにversion-controlをセットして、そのバッファーのバックアップ作成を制御することができます(ローカル変数を参照してください)。特定のファイルをvisitするとき、常にEmacsにversion-controlをローカルにセットさせることができます(ファイル内のローカル変数を参照してください)。Rmailモードのようないくつかのモードは、この変数をセットします。

さまざまなGNUユーティリティーにたいして、何をすべきか指示する環境変数VERSION_CONTROLをセットすると、Emacsも開始時にこの環境変数にしたがって、Lisp変数version-controlをセットします。環境変数の値が‘t’または‘numbered’のときは、version-controltになります。値が‘nil’または‘existing’のときは、version-controlnilになります。もし‘never’または‘simple’のときは、version-controlneverになります。

変数backup-directory-alistをカスタマイズして、指定したパターンにマッチする特定のファイルにたいして、指定したディレクトリーにバックアップを作成させることができます。この変数は単独、または複数の番号つきバックアップの両方に適用されます。典型的な使い方は、要素("." . dir)を追加することにより、すべてのバックアップを絶対パスdirに作る方法です。異なるディレクトリーにある同じ名前のファイルによる、バックアップファイルの名前の衝突を避けるため、Emacsはバックアップファイルの名前を変更します。("." . ".~")を追加すると、これは元のファイルがあるディレクトリーに、非表示の.~というディレクトリーを作って、そこにバックアップを作成します。Emacsはバックアップを作るため、必要ならディレクトリーを作成します。

変数make-backup-file-name-functionに適切なLisp関数をセットすることにより、Emacsがバックアップファイル名を作る通常の方法をオーバーライドできます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.2.2 バックアップの自動削除

ディスク容量の過度な消費を防ぐため、Emacsは自動的に番号つきバックアップを削除することができます。一般的にEmacsは一番古いバックアップと、一番新しいバックアップをいくつか保持し、その間にあるバックアップを削除します。これは新しいバックアップが作られる度に行なわれます。

2つの変数kept-old-versionsおよびkept-new-versionsが、この削除を制御します。これらの変数の値は順に、削除せずに残す一番古い番号(小さい番号)のバックアップと、一番新しい番号(大きい番号)で、新しいバックアップが作られる度に評価されます。中間のバックアップ(一番古いものと一番新しいものを除いたもの)は、余分なバージョンで、これらのバックアップは削除されます。これらの変数の値は余分なバージョンを削除するとき、つまり新しいバックアップが作られた直後に使われます。新しく作られたバックアップは、kept-new-versionsのカウントに含まれます。デフォルトでは、両方の変数の値は2です。

delete-old-versionstのとき、Emacsは何も尋ねずに余分なバックアップファイルを削除します。nil(デフォルト)のとき、Emacsは余分なバージョンのバックアップを削除するか尋ねます。他の値の場合、Emacsはバックアップの自動削除をしません。

Diredの.(ピリオド)コマンドでも、古いバージョンを削除できます。Diredでのファイルの削除についてを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.2.3 コピー vs. リネーム

バックアップファイルは、古いファイルをコピーまたはリネームすることで作ることができます。コピーとリネームは、古いファイルが複数の名前をもつ場合(ハードリンクされている場合)に、異なる効果をもちます。古いファイルがバックアップファイルにリネームされた場合、ハードリンクされた別の名前で参照されるファイルは、バックアップファイルとなります。かわりに古いファイルをコピーすると、ハードリンクされた別の名前で参照されるファイルは、編集中のファイルのままで、それらの名前でアクセスする内容は新しい内容となります。

バックアップファイルを作る方法は、編集中のファイルの所有者とグループにも影響します。コピーが使われた場合、それらは変化しません。リネームが使われた場合、そのユーザーがファイルの所有者となり、ファイルのグループはデフォルト(オペレーティングシステムごとにグループのデフォルトは異なります)のグループになります。

リネームとコピーの選択は、以下の変数により行われます:

ファイルがバージョンコントロールシステムで管理されている場合(バージョンコントロールを参照してください)、通常、Emacsは普通の方法でそのファイルのバックアップを作りません。しかしチェックインとチェックアウトは、バックアップを作るのと似たところがあります。これらの操作は通常ハードリンクをこわし、同じファイルにたいする別のファイル名でのvisitを切断します。Emacsにできることはありません。バージョンコントロールシステムがこれを行うのです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.3 ファイル保存のカスタマイズ

変数require-final-newlineの値がtのとき、ファイルの保存または書き込みにより、ファイルの終端に改行がないときは、何も尋ねずに改行を追加します。値がvisitの場合、Emacsはファイルをvisitした直後に、終端に改行がないファイルの改行を追加します(これによりバッファーは変更されたとマークされます。undoはできません)。値がvisit-saveの場合、Emacsはそのような改行をvisitと保存のときに追加します。値がnilの場合、Emacsはファイルの終端を変更しません。それ以外の非nil値は、改行を追加するか尋ねることを意味します。デフォルトはnilです。

ファイルの終端に常に改行があると想定する、特定の種類のファイルのためにデザインされたメジャーモードがいくつかあります。そのようなメジャーモードは、変数require-final-newlineに、変数mode-require-final-newlineの値(デフォルトはt)をセットします。後者の変数の値をセットすることにより、これらのモードが終端の改行を取り扱う方法を制御できます。

通常プログラムがファイルに書き込むとき、オペレーティングシステムはデータをディスクにコミットする前に、ファイルのデータをメインメモリーにキャッシュします。これにより大幅にパフォーマンスを向上できます。たとえばラップトップを使っている場合、ファイルを書き込む度にディスクをスピンアップ(spin-up)しなくて済みます。しかし、キャッシュをディスクにコミットする前にオペレーティングシステムがクラッシュすることにより、データを失うリスクもあります。

このリスクを減少させるため、Emacsはファイルを保存した後にfsyncシステムコールを呼び出すことができます。fsyncにより、データを失うリスクを皆無にすることはできません。その理由の一部は、多くのシステムはfsyncを正しく実装していないことであり、他の理由の一部はEmacsのファイル保存手段は通常ディレクトリー更新に頼っており、これはfsyncが正しく実装されていても、クラッシュを生き延びることはできないでしょう。

write-region-inhibit-fsync変数は、ファイルを保存した後にEmacsがfsyncを呼び出すかを制御します。この変数のデフォルト値は、Emacsを対話的に使用しているときはnil、バッチモードの時はtです。

Emacsは自動保存ファイルの書き込みにfsyncを使うことはありません。なぜなら、それらのファイルのデータは、いずれにせよ失われるものだからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.4 同時編集からの保護

同時編集(Simultaneous editing)は、2人のユーザーが同じファイルをvisitして、両者が変更と保存を行ったときに発生します。これが発生していることを誰も知らせなければ、最初に保存したユーザーは、後で自分の変更が失われていることに気付くでしょう。

いくつかのシステムでは、Emacsは2番目のユーザーがファイルの変更を開始すると、すぐに警告を発します。また、すべてのシステムにおいて、Emacsはファイルを保存するときにチェックして、他のユーザーの変更を上書きすることを警告します。ファイルを保存するかわりに適切な訂正アクションをとることにより、他のユーザーの変更を失わなわずに済みます。

ファイルをvisitしているEmacsバッファーで最初の変更を行うとき、Emacsはファイルがロック(locked)されていることを記録します(これは同じディレクトリーにある、特別な内容の、特別な名前のシンボリックリンク7を作ることにより行われます)。変更を保存したとき、Emacsはロックを解除します。このアイデアは、ファイルをvisitしているEmacsバッファーに保存されていない変更があるとき、ファイルはロックされているとするものです。

変数create-lockfilesnilにセットすることにより、ロックファイルの作成を抑制することができます。警告:これにより、この機能が提供する利点を失うことになります。

他のユーザーによりロックされているファイルをvisitしているバッファーの変更を開始すると、衝突(collision)が起こります。Emacsが衝突を検知すると、Lisp関数ask-user-about-lockを呼び出して、何を行うか尋ねます。カスタマイズのためにこの関数を再定義できます。この関数の標準定義は、ユーザーに質問をして、3つの有効な応えを受け取ります。

s

ロックを横取りします。すでにファイルを変更したユーザーはロックを失い、あなたがロックを取得します。

p

続行します。他のユーザーがロックしている如何にかかわらずファイルの編集を続けます。

q

終了します。これはエラー(file-locked)を引き起こし、バッファーの内容は変更されません。あなたが試みた修正は実際には行われません。

Emacsまたはオペレーティングシステムがクラッシュすると、偽のロックファイルが残ることがあり、このような偽のロックファイルによる警告を受けることがあります。偽の衝突だと確信できるときは、Emacsにとにかく実行させるpを使います。

ロックはファイル名にもとづいて機能するので、ファイルが複数の名前を持っていて、2人のユーザーがそれぞれ別のファイル名で同時編集を行うことを、Emacsが防ぐことはできないことに注意してください。

ロックファイルに書き込みできない状況がいくつかあります。たとえばシステム権限不足や他の理由により、Emacsがロックファイルが作成できない場合です。このような場合でも保存を試みたときに、ファイルの最終変更日時をチェックすることにより、Emacsは衝突を検知できます。最後にEmacsがvisitまたは保存したときからファイルが変更されているとき、それは他の何らかの手段によりファイルが変更されたことを示し、Emacsが保存を行うことによりそれらが失われることを意味します。そのようなときEmacsは警告メッセージを表示して、保存する前に確認を求めます。保存するときはyes、保存を取り消すときはnoまたはC-gと応えてください。

すでに同時編集が発生しているとき、バッファーとファイルを比較する方法の1つは、M-x diff-buffer-with-fileコマンドです。ファイルの比較を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.5 ファイルのシャドーイング

M-x shadow-initialize

ファイルのシャドーイング(shadowing)をセットアップします。

M-x shadow-define-literal-group

サイト間で共有される単一のファイルを定義します。

M-x shadow-define-regexp-group

ファイルのグループがマッチするすべてのファイルを、ホスト間で共有するようにします。

M-x shadow-define-cluster RET name RET

shadowファイルのクラスターnameを定義します。

M-x shadow-copy-files

すべての保留中のshadowファイルをコピーします。

M-x shadow-cancel

ファイルにたいするshadow指示を取り消します。

特定のファイルと等しいshadowコピーを1つ以上の場所、ことによると異なるマシン間で保持するように計画できます。これを行うにはまず、shadowファイルグループをセットアップしなければなりません。これはリストにあるサイト間で共有される同じ名前のファイルのセットです。ファイルグループは永続的で、将来のEmacsセッションでも、現在のセッションと同様に適用されます。一度グループをセットアップすると、Emacsを終了する度に、編集したファイルをグループの他のファイルにコピーします。M-x shadow-copy-filesをタイプすることにより、Emacsを終了せずにコピーすることもできます。

shadowファイルグループをセットアップするには、M-x shadow-define-literal-groupまたはM-x shadow-define-regexp-groupを使います。詳細な情報は、これらの関数のドキュメント文字列を参照してください。

ファイルをshadowにコピーする前に、Emacsは確認を求めます。“no”を応えることにより、その時だけはコピーを回避できます。特定のファイルにたいして今後もshadowingを取り消したい場合、M-x shadow-cancelを使うことにより、shadowファイルグループを削除または変更します。

shadowクラスターは、ディレクトリーを共有するホストのグループなので、それらのコピーは、そのディレクトリーにあるすべてのファイルを更新するのに充分です。shadowクラスターはそれぞれ名前を持ち、プライマリーホスト(コピーを行うホスト)のネットワークアドレスと、プライマリーホスト以外でクラスターに含めるホストを選択するための正規表現を指定します。M-x shadow-define-clusterによりshadowクラスターを定義できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3.6 タイムスタンプの自動更新

ファイルにタイムスタンプを書き込むことができます。これによりファイルを編集・保存する度に、タイムスタンプが自動的に更新されます。タイムスタンプは、ファイルの最初の8行になければならず、以下のような形式、

Time-stamp: <>

または以下のような形式です:

Time-stamp: " "

その後、フックbefore-save-hookに関数time-stampを追加します(フックを参照してください)。ファイルを保存するとき、この関数は現在の日時で自動的にタイムスタンプを更新します。コマンドM-x time-stampを使って、手動でタイムスタンプを更新することもできます。その他のカスタマイズとしては、Custom groupのtime-stampを参照してください。タイムスタンプの書式は、localeのセッティングに従うことに注意して下さい(環境変数を参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.4 バッファーのリバート

ファイルをvisitしているバッファーにたいして、広範な変更をした後に気が変わったときは、リバート(revert: 復元)することにより。変更をファイルの保存されたバージョンに戻すことができます。間違えてリバートしてしまうことにより、大量の作業結果を失うこともあり得るので、Emacsは最初に確認を求めます。

revert-bufferコマンドは、ファイルが少ししか変更されていないときは、前にポイントがあったテキスト部分とだいたい同じ位置にポイントを置くよう試みます。しかし広範な変更を行っていた場合、ポイントは大きく異なる場所に置かれることになります。

リバートはバッファーを“not modified(変更されていない)”とマークします。また、バッファーのundoヒストリーもクリアーされます(Undo(取り消し)を参照してください)。したがってリバートはundoできません。再び気を変えても、undoコマンドを使ってリバートした変更を元にもどすことはできません。

ファイルに関連付けられていない、Diredバッファーのようなバッファーでも、リバートすることができます。それらの場合、リバートはその内容を再計算することを意味します。C-x bで明示的に作成したバッファーは、リバートできません。リバートを試みるとrevert-bufferはエラーを報告します。

自動的かつ頻繁に変更されるファイル、たとえば実行を続けるプロセスのログ出力などを編集しているとき、Emacsが確認なしにリバートできたら便利でしょう。このような振る舞いをさせるには、変数revert-without-queryに正規表現のリストをセットします。ファイル名がそれらの正規表現の1つにマッチしたとき、find-fileおよびrevert-bufferは、バッファーが変更されていないときは、ファイルが変更される度に自動的にリバートします(もしテキストを編集していた場合、変更を放棄するのはおそらく正しくありません)。

Emacsにバッファーを定期的にリバートするよう、指示することもできます。特定のバッファーにたいしてこれを行うには、M-x auto-revert-modeとタイプして、マイナーモードのAuto-Revertモードを有効にします。これは現在のバッファーを5秒ごとに自動的にリバートします。リバートの間隔はauto-revert-intervalで変更できます。すべてのバッファーにたいして同じことを行うには、M-x global-auto-revert-modeとタイプして、Global Auto-Revertモードを有効にします。これらのマイナーモードはリモートのファイルにたいするチェックやリバートはしません。なぜならそれは通常とても遅いからです。

Auto-Revertモードの1つの使い方は、システムログのようなファイルを“tail”することです。これにより、それらのファイルにたいする、他のプログラムによる変更を、継続的に表示できます。これを行うには、ポイントをバッファーの最後に移動します。そうすればファイル内容が変更されても、ポイントはその位置に留まります。しかし、ファイルがファイルの終端方向に向かって変更されるだけだと確信できるときは、かわりにAuto-Revert Tailモード(auto-revert-tail-mode)を使います。このモードは、これをより効果的に行います。Auto-Revert Tailモードは、リモートのファイルにたいしても機能します。

バージョンコントロールシステムの下にあるファイルを、以前のバージョンにリバーとするコマンドについては、バージョンコントロール操作のアンドゥを参照してください。バージョンコントロールシステムの下にあるファイルをvisitしているときの自動リバートの特性については、バージョンコントロールとモードラインを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.5 非ファイルバッファーの自動リバート