Node:Top, Up:(dir)
Untitled

Top


Node:Distrib, Next:, Previous:Top, Up:Top

配布

GNU Emacsはフリーソフトウェアです。 誰でも自由に利用でき、条件付きで自由に再配布できることを意味します。 GNU Emacsはパブリックドメイン(public domain)ではありません。 著作権が設定してあり、その配布には制限が課せられています。 しかし、これらの制限は、善良な協調的な市民が行うであろうことを すべて許すように意図したものです。 許されないのは、 配布先に対して任意のバージョンのGNU Emacsの再配布を禁止する行為です。 正確な条件は、GNU Emacsと一緒に配布されていて 以下の節にも掲載したGNU一般公有使用許諾書 1にあります。

Gnu Emacsを入手する1つの方法は、持っている人から貰うことです。 我々から許可を得る必要はないですし、誰かに連絡する必要もありません。 単にコピーすればよいのです。 Internetを利用できる場合には、 匿名(anonymous)FTPでGNU Emacsの最新配布版を入手できます。 詳しくは、Emacsの配布の中のファイルetc/FTPを見てください。

コンピュータを買うとGNU Emacsが付いてくるかもしれません。 コンピュータ製造業者も、他の人に適用されているのと同じ条項で、 自由にコピーを配布できます。 これらの条項によれば、 製造業者は業者独自の変更も含めて完全なソースを提供するように求められており、 しかも、GNU一般公有使用許諾書の条項に基づくそのGNU Emacsの再配布を 購入者に許可するように求められています。 いいかえれば、製造業者がプログラムを自由にできるだけでなく、 購入者も買ったプログラムを自由にできる必要があるのです。

Free Software FoundationにGNU EmacsのCD-ROMを注文してもかまいません。 これは便利で確実な入手方法ですし、我々の仕事の資金援助にもなります。 (Foundationの資金のほとんどは、この方法に頼っている。) Emacsの配布の中のファイルetc/ORDERSや、 Webサイト<http://www.gnu.org/order/order.html>に注文票があります。 さらなる情報を得るには、下記へお願いします。

Free Software Foundation
59 Temple Place, Suite 330
Boston, MA  02111-1307 USA
USA

配布代金から得た収入は、我々の目的、 すなわち、新たなフリーソフトウェアの開発とGNU Emacsを含めた 既存プログラムの改良のために使われます。

GNU Emacsが有用だとわかったならば、我々の仕事を支援するために Free Software Foundationにぜひ寄付を送ってください。 合衆国では、Free Software Foundationへの寄付は税控除の対象になります。 GNU Emacsを職場で利用しているならば、寄付するように会社に提案してください。 会社の方針が慈善活動への寄付に冷淡であるならば、 そのかわりとして、Free Software Foundationに適宜CD-ROMを注文したり、 定期購読するように提案してください。


Node:Copying, Next:, Previous:Distrib, Up:Top

GNU一般公有使用許諾書

1991年6月 バージョン2.0

Copyright © 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA 2

何人も、以下の内容を変更しないでそのまま複写する場合に限り、
本使用許諾書を複製したり頒布することができます。

はじめに

ほとんどのソフトウェアの使用許諾は、ソフトウェアを共有し、 変更するユーザの自由を奪うことを意図しています。 それに対して、我々のGNU一般公有使用許諾は、 フリー・ソフトウェアを共有したり変更する自由をユーザに保証するためのもの、 即ちフリー・ソフトウェアがそのユーザ全てにとって フリーであることを保証するためのものです。 本使用許諾は、Free Software Foundationのほとんど全てのソフトウェアに 適用されるだけでなく、 プログラムの作成者が本使用許諾に依るとした場合のそのプログラムにも 適用することができます。 (その他の Free Software Foundation のソフトウェアのいくつかは、 本許諾書ではなく、GNUライブラリ一般公有使用許諾で保護されます。) あなたは自分のプログラムにもこれを適用できます。

我々がフリー・ソフトウェアについて言う場合は 自由のことに言及しているのであって、価格のことではありません。 我々の一般公有使用許諾の各条項は、次の事柄を確実に実現することを 目的として立案されています。

このようなユーザの権利を守るために、我々は、 何人もこれらの権利を否定したり、あるいは放棄するように ユーザに求めることはできないという制限条項を設ける必要があります。 これらの制限条項は、ユーザが、フリー・ソフトウェアの複製物を 頒布したり変更しようとする場合には、そのユーザ自身が守るべき義務ともなります。

例えば、あなたがフリー・ソフトウェアの複製物を頒布する場合、 有償か無償かにかかわらず、 あなたは自分の持っている権利を全て相手に与えなければなりません。 あなたは、相手もまたソース・コードを受け取ったり入手できるということを 認めなければなりません。 さらにあなたは、彼らが自分たちの権利を知るように、 これらの条項を知らしめなければなりません。

 我々は次の2つの方法でユーザの権利を守ります。 (1)ソフトウェアに著作権を主張し、 (2)本使用許諾の条項の下で ソフトウェアを複製・頒布・変更する権利をユーザに与えます。

また、各作成者や我々自身を守るために、 本フリー・ソフトウェアが無保証であることを 全ての人々が了解している必要があります。 さらに、他の誰かによって変更されたソフトウェアが頒布された場合、 受領者はそのソフトウェアがオリジナル・バージョンではないということを 知らされる必要があります。 それは、他人の関与によって原開発者に対する評価が 影響されないようにするためです。

最後に、どのフリー・プログラムもソフトウェア特許に絶えず脅かされています。 我々は、フリー・プログラムの再頒布者が個人的に特許権を取得し、 事実上そのプログラムを自分の財産にしてしまうという危険を 避けたいと願っています。 これを防ぐために我々は、いずれの特許も、 誰でも自由に使用できるように使用許諾されるべきか、 あるいは何人に対しても全く使用させないかの、 いずれかにすべきであることを明らかにしてきました。

複写・頒布・変更に対する正確な条項と条件を次に示します。

  1. 本使用許諾は、本一般公有使用許諾の各条項に従って頒布されるという 著作権者からの告知文が表示されているプログラムやその他の作成物に適用されます。 以下において「プログラム」とは、そのようなプログラムや作成物を指すものとし、 また、「プログラム生成物」とは、上述した「プログラム」自身、または、 著作権法下における全ての派生物;すなわち、その「プログラム」の全部又は一部を、 そのまま又は変更して、且つ/又は他の言語に変換して、 内部に組み込んだ作成物を意味します。 (以下、言語変換は「変更」という用語の中に無条件に含まれるものとします。) 本使用許諾によって許諾を受ける者を「あなた」と呼びます。 

    複製、頒布、変更以外の行為は本使用許諾の対象としません。 それらは本使用許諾の範囲外です。 「プログラム」を実行させる行為に関して制約はありません。 「プログラム」の出力は、 (「プログラム」を実行させて作成させたかどうかとは無関係に) その内容が「プログラム生成物」である場合に限り本使用許諾の対象となります。 これが当てはまるかどうかは、「プログラム」が何をするものかに依ります。

  2. あなたは、どのような媒体上へ複製しようとする場合であっても、 入手した「プログラム」のソース・コードを そのままの内容で複写した上で適正な著作権表示と保証の放棄を明確、 且つ適正に付記する場合に限り、複製又は頒布することができます。 その場合、本使用許諾及び無保証に関する記載部分は、 全て元のままの形で表示してください。 また、「プログラム」の頒布先に対しては、 「プログラム」と共に本使用許諾書の写しを渡してください。

    複製物の引き渡しに要する実費は請求することができます。 また、あなた独自の保証を行なう場合はそれを有償とすることができます。

  3. 次の各条件を全て満たしている限り、あなたは、 「プログラム」又はその一部分を変更して「プログラム生成物」とすることができ、 さらに、変更版や右作成物を上記第2項に従って複製又は頒布することもできます。
    1. ファイルを変更した旨とその変更日とを、変更したファイル上に明確に表示すること。
    2. 変更したか否かを問わず、凡そ「プログラム」 又はその一部分を内部に組み込んでいるか 又はそれから派生した生成物を頒布する場合には、 その全体を本使用許諾の条項に従って第三者へ無償で使用許諾すること。
    3. 変更したプログラムが実行時に通常の対話的な方法で コマンドを読むようになっているとすれば、 最も普通の方法で対話的にそのプログラムを実行する時に、 次の内容を示す文言がプリンタへ印字されるか、或いは画面に表示されること。
      • 適切な著作権表示。
      • 無保証であること(あなたが独自に保証する場合は、その旨)。
      • 頒布を受ける者も、 本使用許諾と同一の条項に従って「プログラム」を再頒布できること。
      • 頒布を受ける者が本使用許諾書の写しを参照する方法。 (例外として、「プログラム」自体は対話的であっても起動時の文言を 通常は印字しないのならば、 あなたの「プログラム生成物」はこのような文言を印字する必要はありません。)

    これらの要件は変更された作成物にも全て適用されます。 その変更版の或る部分が「プログラム」の派生物ではなく、 しかもそれ自体独立で異なる作成物だと合理的に考えられる場合、 あなたがそれらを別の作成物として頒布した時は、 本使用許諾とその条項はそれらの部分には適用されません。 しかし、それらを「プログラム生成物」の一部として頒布する場合は、 全体が本使用許諾の条項に従って頒布されなければならず、 使用許諾を受ける他の全ての者に対する許諾も プログラム全体にわたって与えられなければならず、 結果として、誰が書いたかにかかわらず、 全ての部分に本使用許諾が適用されなければなりません。

    このように、本条項の意図するところは、 完全にあなたによって書かれた作成物について、権利を要求したり、 あなたと権利関係を争うことではありません。 むしろその目的は、作成物が「プログラム生成物」 である場合にその派生物や集合物の頒布を規制することにあります。

    さらに、「プログラム」(又は「プログラム生成物」)と 「プログラム生成物」とはならない他のプログラムとを、 単に保管や頒布のために同一の媒体上にまとめて記録したとしても、 本使用許諾は他のプログラムには適用されません。

  4. あなたは、以下のうちいずれか1つを満たす限り、 上記第2項及び第3項に従って「プログラム」 (又は、上記第3項で言及している「プログラム生成物」)を オブジェクト・コード又は実行可能な形式で複製及び頒布することができます。
    1. 対応する機械読み取り可能なソース・コード一式を一緒に引き渡すこと。 その場合、そのソース・コードの引き渡しは上記第2項及び第3項に従って、 通常ソフトウェアの交換に用いられる媒体で行なわれること。
    2. 少なくとも3年間の有効期間を定め、 且つその期間内であれば対応する機械読み取り可能なソース・コード一式の複製を、 ソース頒布に関わる実費以上の対価を要求せずに提供する旨、 及びその場合には上記第2項及び第3項に従って、 通常ソフトウェアの交換に用いられる媒体で提供される旨を記載した書面を、 第三者に一緒に引き渡すこと。
    3. 対応するソース・コード頒布の申し出に際して、 あなたが得た情報を一緒に引き渡すこと。 (この選択肢は、営利を目的としない頒布であって、 且つあなたが上記の(b)項に基づいて、 オブジェクト・コード或いは実行可能形式の プログラムしか入手していない場合に限り適用される選択項目です。)

    なお、ソース・コードとは、変更作業に適した記述形式を指します。 また、実行可能形式のファイルに対応するソース・コード一式とは、 それに含まれる全モジュールに対応する全てのソース・コード、 及びあらゆる関連のインタフェース定義ファイル、 及び実行を可能にするコンパイルとインストールの制御に関する記述を指します。 特別な例外として、実行可能なファイルが動作するオペレーティング・システムの 主要な構成要素(コンパイラ、カーネルなど)と共に (ソース・コード又はバイナリのどちらかで)頒布されているものについては、 その構成要素自体が実行形式に付随していない場合に限り、 頒布されるソース・コードに含める必要はありません。

    実行可能形式またはオブジェクト・コードの頒布が、 指示された場所からの複製のためのアクセス権の賦与である場合、 同じ場所からのソース・コードの複製のための同等なアクセス権を賦与すれば、 たとえ第三者にオブジェクト・コードと共にソースの複製を強いなくとも、 ソース・コードを頒布したものとみなします。

  5. 本使用許諾が明示的に許諾している場合を除き、あなたは、 「プログラム」を複製、変更、サブライセンス、頒布することができません。 本使用許諾に従わずに「プログラム」を複製、変更、サブライセンス、 頒布しようとする行為は、それ自体が無効であり、且つ、 本使用許諾があなたに許諾している「プログラム」の権利を自動的に消滅させます。 その場合、本使用許諾に従ってあなたから複製物やその権利を得ている第三者は、 本使用許諾に完全に従っている場合に限り、 引続き有効な使用権限を持つものとします。
  6. あなたはまだ同意の印として署名していないので、 本使用許諾を受け入れる必要はありません。 しかし、あなたに「プログラム」又はその派生物を変更又は再頒布する許可を 与えるものは本使用許諾以外にはありません。 これらの行為は、あなたがもし本使用許諾を受け入れないのであれば、 法律によって禁じられます。 従って、あなたが「プログラム」(又は「プログラム生成物」)の変更又は頒布を 行えば、それ自体であなたは本使用許諾を受け入れ、且つ、 「プログラム」又はその「プログラム生成物」の複製、頒布、変更に 関するこれらの条項と条件の全てを受け入れたことを示します。
  7. あなたが「プログラム」(又はその「プログラム生成物」)を再頒布すると自動的に、 その受領者は、元の使用許諾者から、本使用許諾の条項に従って「プログラム」を 複製、頒布、変更することを内容とする使用許諾を受けたものとします。 あなたは、受領者に許諾された権利の行使について、 さらに制約を加えることはできません。 あなたには、第三者に本使用許諾の受け入れを強いる責任はありません。
  8. 裁判所の判決、又は特許侵害の申し立て、又は(特許問題に限らない) 何らかの理由の結果として、あなたに課せられた条件が本使用許諾と 相入れないものであったとしても(裁判所の命令、契約、その他によるものであれ)、 本使用許諾の条件が免除されるものではありません。 本使用許諾による責務と、その他の何らかの関連責務を同時に満たす態様で 頒布することができないならば、 あなたは「プログラム」を全く頒布してはいけません。 例えば、特許権の内容が、あなたから直接又は間接に複製を受け取った全ての人に 使用料のないプログラムの再頒布を許さないものであれば、 あなたがかかる特許上の要請と本使用許諾の両方を満足させる方法は、 「プログラム」の頒布を完全に断念することだけです。

    本条項の或る部分が何らかの特別な状況下で無効または適用不可能になった場合、 本条項のその他の残りの部分が適用されるように意図されており、また、 本条項は全体としてその他の状況に当てはまるように意図されています。

    本条項の目的は、特許やその他の財産権を侵害したり、 そのような権利に基づく主張の妥当性を争うようにあなたに 勧めることではありません。 本条項の唯一の目的は、フリー・ソフトウェアの頒布システムの完全性を守ることで、 それは公有使用許諾の実践によって履行されます。 多くの人々が、このシステムの一貫した適用を信頼して、 このシステムを通じて頒布されている幅広い範囲のソフトウェアに惜しみない貢献を してくれました。 作成者や寄贈者が他の何らかのシステムを通じてソフトウェアを 頒布したいと決めることは彼らの自由意志であり、 使用許諾を受ける者はその選択を強いることはできません。

    本条項は、本使用許諾の他の条項の意味内容が何であるかを 完全に明らかにすることを意図しています。

  9. 「プログラム」の頒布・使用が、ある国において特許又は著作権で 保護されたインタフェースのどちらかで制限される場合、 「プログラム」を本使用許諾下においた原著作権保持者は、 その国を除外する旨の明示的な頒布地域制限を加え、 それ以外の(除外されない)国に限定して頒布が 許されるようにすることができます。 そのような場合、その制限を本使用許諾の本文に あたかも書かれているかのように本使用許諾の中に組み入れられるものとします。
  10. Free Software Foundation は随時、本一般公有使用許諾の改訂版、 又は新版を公表することがあります。 そのような新しいバージョンは、 現行のバージョンと基本的に変わるところはありませんが、 新しい問題や懸案事項に対応するために細部では異なるかもしれません。

    各バージョンは、バージョン番号によって区別します。 「プログラム」中に本使用許諾のバージョン番号の指定がある場合は、 その指定されたバージョンか、又はその後にFree Software Foundationから 公表されているいずれかのバージョンから1つを選択して、 その条項と条件に従ってください。 「プログラム」中に本使用許諾のバージョン番号の指定がない場合は、 Free Software Foundation が公表したどのバージョンでも選択することができます。

  11. 「プログラム」の一部を頒布条件の異なる他のフリー・プログラムに 組み込みたい場合は、その開発者に書面で許可を求めてください。 Free Software Foundation が著作権を持っているソフトウェアについては、 Free Software Foundation へ書面を提出してください。 このような場合に対応するために我々は例外的処理をすることもありますが、 その判断基準となるのは、次の2つの目標の実現に合致するか否かという点です。 即ち、1つは我々のフリー・ソフトウェアの全ての派生物を フリーな状態に保つことであり、もう1つはソフトウェアの共有と再利用とを 広く促進させることです。
  12. 「プログラム」は無償で使用許諾されますので、適用法令の範囲内で、 「プログラム」の保証は一切ありません。 著作権者やその他の第三者は全く無保証で「そのまま」の状態で、且つ、 明示か暗黙であるかを問わず一切の保証をつけないで提供するものとします。 ここでいう保証とは、市場性や特定目的適合性についての暗黙の保証も含まれますが、 それに限定されるものではありません。 「プログラム」の品質や性能に関する全てのリスクはあなたが負うものとします。 「プログラム」に欠陥があるとわかった場合、 それに伴う一切の派生費用や修理・訂正に要する費用は全てあなたの負担とします。
  13. 適用法令の定め、又は書面による合意がある場合を除き、 著作権者や上記許諾を受けて「プログラム」の変更・再頒布を為し得る第三者は、 「プログラム」を使用したこと、 または使用できないことに起因する一切の損害について何らの責任も負いません。 著作権者や前記の第三者が、そのような損害の発生する可能性について 知らされていた場合でも同様です。 なお、ここでいう損害には通常損害、特別損害、偶発損害、間接損害が含まれます (データの消失、又はその正確さの喪失、あなたや第三者が被った損失、 他のプログラムとのインタフェースの不適合化、等も含まれますが、 これに限定されるものではありません)。

注意

英文文書(GNU General Public License)を正式文書とする。 この和文文書は弁護士の意見を採り入れて、 できるだけ正確に英文文書を翻訳したものであるが、 法律的に有効な契約書ではない。

和文文書自体の再配布に関して

いかなる媒体でも次の条件がすべて満たされている場合に限り、 本和文文書をそのまま複写し配布することを許可する。 また、あなたは第三者に対して本許可告知と同一の許可を与える場合に限り、 再配布することが許可されています。

あなたの新しいプログラムにこれらの条項を適用する方法

あなたが新しくプログラムを作成し、それを公用に供したい場合は、 プログラムをフリー・ソフトウェアにして、 全ての人々が以上の各条項に従ってこれを再頒布や変更をすることが できるようにするのが最良の方法です。

そうするためには、プログラムに以下の表示をしてください。 その場合、無保証であるということを最も効果的に伝えるために、 ソース・ファイルの冒頭にその全文を表示すれば最も安全ですが、 その他の方法で表示する場合でも、「著作権表示」と全文を読み出す為の アドレスへのポインタだけはファイル上に表示しておいてください。

プログラム名とどんな動作をするものかについての簡単な説明の行
Copyright(C) 19○○年、著作権者名

本プログラムはフリー・ソフトウェアです。
あなたは、Free Software Foundationが公表したGNU 一般公有使用許諾の
「バージョン2」或いはそれ以降の各バージョンの中からいずれかを選択し、
そのバージョンが定める条項に従って本プログラムを
再頒布または変更することができます。

本プログラムは有用とは思いますが、頒布にあたっては、
市場性及び特定目的適合性についての暗黙の保証を含めて、
いかなる保証も行ないません。
詳細についてはGNU 一般公有使用許諾書をお読みください。

あなたは、本プログラムと一緒にGNU一般公有使用許諾の写しを
受け取っているはずです。
そうでない場合は、
 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA 3 へ手紙を書いてください。

また、ユーザが電子メイルや書信であなたと連絡をとる方法についての情報も 書き添えてください。

プログラムが対話的に動作する場合は、 対話モードで起動した時に次のような短い告知文が表示されるようにしてください。

Gnomovision バージョン69、Copyright(C)19○○年 著作権者名
Gnomovision は完全に無保証です。詳細は show w とタイプしてください。
これはフリー・ソフトウェアなので、特定の条件の下でこれを再頒布する
ことができます。詳細は show c とタイプしてください。

上記のshow wshow cは各々、 本一般公有使用許諾の関連する部分を表示するコマンドを指します。 もちろん、あなたが使うこれらのコマンドはshow wshow cといった 呼び名でなくても構いません。 さらに、それらのコマンドはあなたのプログラムに合わせる為に、 マウスでクリックしたりメニュー形式にすることもできます。

また、必要と認めた場合には、あなたの雇い主 (あなたがプログラマとして働いている場合)や在籍する学校から、 そのプログラムに対する「著作権放棄」を認めた署名入りの書面を入手してください。 ここにその文例を載せます。名前は変えてください。

Yoyodyne, Inc. は、James Hacker が開発したプログラム`Gnomovision'
(コンパイラにつなげるプログラム)についての著作権法上の全ての権利を放棄する。

Ty Coon の署名, 1 April 1989
Ty Coon, 副社長

本一般公有使用許諾は、あなたのプログラムを財産権の対象となっている 他のプログラムに組み込むことは認めていません。 あなたのプログラムがサブルーチン・ライブラリであって、 あなたがそのライブラリを財産権の対象となっている他のアプリケーションと リンクさせることによって、さらに有用なものにしようとする場合には、 本使用許諾書の代わりに、GNUライブラリ一般公有使用許諾書に従ってください。


Node:Intro, Next:, Previous:Copying, Up:Top

はじめに

あなたは、先進的で、セルフドキュメント方式で、カスタマイズ可能で、 拡張可能な、GNU版の権化であるリアルタイム画面エディタ Emacsについて読んでいるところです。 (「GNU」の「G」は発音します。)

Emacsは画面エディタであるというのは、 編集中のテキストを画面上で見ることができ、 コマンドを入力すると自動的に画面が更新されるということです。 See Display

リアルタイムエディタと呼ぶのは、 頻繁に画面更新が行われ、通常、1文字か2文字打つと更新されるからです。 編集にともなって覚えておくべきことを最小限に抑えられます。 See Real-time

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

セルフドキュメント方式とは、 特別な文字Control-hを打てば、 何ができるかいつでも知ることができるということです。 それによって、任意のコマンドが何をするものなのか調べたり、 ある話題に関連するすべてのコマンドを調べることができます。 See Help

カスタマイズ可能とは、 Emacsコマンドの定義を若干変更できるということです。 たとえば、<**で始まり**>で終わるようなコメントの プログラム言語を使っている場合には、 Emacsのコメント操作コマンドにこれらの文字列を使うように指示できます (see Comments)。 別の種類のカスタマイズとしては、コマンドセットの再編成があげられます。 たとえば、キーボード上で菱形を形作る位置にあるキーを (上下左右の)4つの基本的なカーソル移動コマンドとして使いたければ、 そのようにキーを再定義できます。 See Customization

拡張可能とは、単純なカスタマイズではなく、 Emacs自身のLisp処理系で動作するLisp言語でプログラムを書ける、 つまり、まったく新しいコマンドを書けるということです。 Emacsは『オンラインで拡張可能』なシステムです。 つまり、Emacsは互いに呼び合う数多くの関数に分割でき、 編集している最中でさえ、それらの関数のどれでも再定義できます。 Emacs全体を1つ1つコピーしたりせずに、 Emacsの任意の部分だけを置き換えることが可能です。 Emacsのほとんどの編集コマンドはすでにLispで書いてあります。 少数の例外もLispで書くことも可能ですが、効率のためにCで書いてあります。 拡張機能を書けるのはプログラマだけですが、 書き上げてしまえば誰でもそれを利用できます。 Emacs Lispのプログラミングを学ぶには、 Free Software Foundationが出版した Robert J. ChassellのProgramming in Emacs Lisp, An Introduction 4 を勧めます。

Xウィンドウシステムで動作するEmacsでは、 独自のメニューとマウスボタンによる便利な操作を提供します。 しかし、たとえ文字端末であっても、 Emacsはウィンドウシステムの恩恵を与えてくれます。 たとえば、複数のファイルを同時に眺めたり編集したり、 ファイル間でテキストを移動したり、 シェルコマンドを実行している最中でもファイルを編集できます。


Node:Screen, Next:, Previous:Acknowledgments, Up:Top

画面構成

文字端末の場合、Emacsは画面全体をその表示領域として使います。 Xウィンドウシステム上では、Emacsは専用のXのウィンドウを作ります。 以降、本書では、Emacsが使う文字画面全体やXのウィンドウ全体を指して、 フレーム(frame)という用語を用います。 Emacsが編集状況を表示するときのフレームの使い方は、 どちらのフレームでも同じです。 通常、1個のフレームだけで始まりますが、必要ならば新たにフレームを作れます。 See Frames

Emacsを起動すると、最初と最後の行を除いたフレーム全体は、 編集しているテキストにあてられます。 この領域をウィンドウ(window)と呼びます。 フレームの最初の行はメニューバー(menu bar)です。 最後の行は、特別なエコー領域(echo area)や ミニバッファウィンドウ(minibuffer window)です。 ミニバッファウィンドウでは、プロンプトが表示され、応答を入力できます。 これらの特別な行の詳細については、以下で説明します。

大きなテキストウィンドウは、 左右や上下に複数のテキストウィンドウに細分割できます。 各ウィンドウは、それぞれ別のファイルに使えます(see Windows)。 本書では、『ウィンドウ』という単語は、 Emacsのフレームを細分割したものをつねに指すこととします。

カーソルが表示されているウィンドウは、選択されたウィンドウ (selected window)であり、その中で編集が行われます。 ほとんどのEmacsコマンドは、選択されたウィンドウ内の テキストに暗黙に作用します(ただし、マウスコマンドでは、 マウスをクリックしたウィンドウが選択されているかどうかに関わらず、 クリックしたウィンドウに作用する)。 選択されていない他のウィンドウには、それが選択されるまで、 単に参照のためだけにテキストが表示されます。 また、Xウィンドウシステム上で複数のフレームを使う場合、 特定のフレームに入力フォーカスを与えると、 そのフレーム内のウィンドウを選択します。

各ウィンドウの最後の行はモード行(mode line)です。 このモード行は、そのウィンドウで何が行われているかを表示します。 端末が反転表示を扱えれば、モード行は反転表示され、 起動時の表示内容は--:--  *scratch*で始まります。 モード行は、ウィンドウ内でその上にどのバッファを表示しているのか、 どのメジャーモードやマイナモードを使っているのか、 バッファには未保存の変更があるかどうかなどの情報を示します。


Node:Point, Next:, Up:Screen

ポイント

Emacsでは、端末のカーソルが編集コマンドの作用する位置を示します。 この位置のことをポイント(point)と呼びます。 多くのEmacsコマンドはポイントをテキスト中で移動し、 テキスト中のさまざまな箇所で編集できるようにします。 マウスのボタン1をクリックしても、ポイントを置けます。

カーソルはある文字に重なって表示されますが、 ポイントは2つの文字のあいだにあると考えなければいけません。 つまり、ポイントは、カーソルが重なっている文字のまえにあります。 たとえば、frobというテキストで、bにカーソルがある場合、 ポイントはobのあいだにあります。 その位置に!という文字を挿入すると、fro!bという結果になり、 ポイントは!bのあいだにあります。 つまり、カーソルはbに重なったままで、実行前と同じです。

『ポイント』を意味して『カーソル』といったり、 ポイントを移動するコマンドのことを『カーソル移動』コマンドと いうこともあります。

端末にはカーソルは1つしかなく、 出力中は出力されている場所にカーソルが表示される必要があります。 これはポイントが移動したということではありません。 端末がアイドルでないと、Emacsにはポイント位置を示す方法がないだけです。

Emacsでいくつかのファイルを編集して、 各ファイルをそれ専用のバッファに入れているとき、 各バッファには独自のポイント位置があります。 バッファが表示されていなくても、 あとで表示されるときに備えてポイント位置を記録しています。

1つのフレームに複数のウィンドウがある場合、 各ウィンドウには独自のポイント位置があります。 カーソルは選択されたウィンドウのポイント位置を示します。 これにより、どのウィンドウが選択されているかもわかります。 複数のウィンドウに同じバッファが表示されている場合には、 そのバッファのポイント位置は各ウィンドウごとに独立にあります。

複数のフレームがある場合、各フレームでは1つのカーソルを表示できます。 選択されているフレームの中のカーソルは塗り潰されます。 他のフレームのカーソルは中抜きの箱で、フレームに 入力フォーカスが与えられると選択されるウィンドウに表示されます。

『ポイント』という用語は、文字.に由来します。 この文字は、現在『ポイント』と呼んでいる値を参照するための (オリジナルのEmacsを記述していた言語)TECOのコマンドです。


Node:Echo Area, Next:, Previous:Point, Up:Screen

エコー領域

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

エコーとは、あなたが打った文字を表示することを意味します。 Emacsの外部、オペレーティングシステムでは、 ユーザーからのすべての入力を普通はエコーします。 Emacsは、エコーをそれとは違ったように扱います。

Emacsでは、1文字コマンドをエコーすることはありません。 また、複数文字のコマンドでも、打つ途中に間を置かなければエコーしません。 コマンドの途中で1秒以上間を置くとすぐに、 それまでに入力したコマンドの文字をすべてエコーします。 これは、コマンドの残りの部分を促すためです。 いったんエコーが始まると、コマンドの残りは、 打つと同時にただちにエコーされます。 これは、打鍵に自信のあるユーザーには速い応答を提供し、 一方で、自信のないユーザーには最大限のフィードバックを与えるための機能です。 変数を設定すれば、このふるまいを変更できます(see Display Vars)。

コマンドを実行できなければ、エコー領域にエラーメッセージを表示します。 エラーメッセージに伴って、ビープ音が鳴ったり、画面が点滅したりします。 また、エラーが起きると、先打ちした入力は破棄されます。

エコー領域に有益なメッセージを表示するコマンドもあります。 これらのメッセージはエラーメッセージによく似ていますが、 ビープ音を伴わず、入力も破棄しません。 編集中のテキストを見てもコマンドが何をしたか自明でない場合に、 メッセージがそれを教えてくれることもあります。 特定の情報を与えるメッセージを表示するだけのコマンドもあります。 たとえば、コマンドC-x =は、テキスト中でのポイントの文字位置と、 ウィンドウでの現在の桁位置を示すメッセージを表示します。 処理に時間のかかるコマンドでは、 実行中には...で終わるメッセージをエコー領域に表示し、 完了時にはdoneを最後に付け加えることもよくあります。

エコー領域に表示される有益なメッセージは、 *Messages*と呼ばれるエディタバッファに保存されます。 (まだバッファを説明していないが、詳細はBuffersを参照。) 画面上に短時間しか表示されないメッセージを見逃してしまった場合には、 *Messages*バッファに切り替えて、 もう一度そのメッセージを見ることができます。 (連続した同じメッセージは、しばしば、 1つにまとめられてこのバッファに納められる。)

*Messages*のサイズは、ある行数に制限されています。 変数message-log-maxは、その行数を指定します。 いったんバッファがこの行数を超えると、最後に1行を付け加えるごとに 先頭の1行を削除します。 message-log-maxのような変数の設定方法については、See Variables

エコー領域はミニバッファ(minibuffer)の表示にも使われます。 これは、編集しようとするファイル名のような、 コマンドへの引数を読むのに使われるウィンドウです。 ミニバッファが使われているときには、 エコー領域は通常コロンで終わるプロンプトで始まります。 また、エコー領域が選択されているウィンドウなので、 カーソルもその行に表示されます。 C-gを打つと、いつでもミニバッファから抜けられます。 See Minibuffer


Node:Mode Line, Next:, Previous:Echo Area, Up:Screen

モード行

テキストウィンドウの最後の行はモード行(mode line)で、 そのウィンドウで何が進行しているか表示します。 テキストウィンドウが1つしかない場合、 モード行はエコー領域のすぐ上に表示されます。 フレーム上では最後から2番目の行になります。 端末に反転表示機能があれば、モード行は反転表示されます。 モード行の表示内容は、ダッシュで始まりダッシュで終ります。

通常、モード行はつぎのように表示されます。

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

これから、ウィンドウに表示中のバッファに関する情報を得られます。 バッファの名前、どのメジャーモードやマイナモードを使っているか、 バッファのテキストが変更されたかどうか、 バッファ全体のどのあたりを現在表示しているかです。

chは、バッファのテキストが編集されている (つまりバッファが『変更』されている)場合には星印2個**になり、 バッファが編集されていない場合には--になります。 読み出し専用のバッファの場合には、 バッファが編集されている場合には%*になり、 バッファが編集されていない場合には%%となります。

bufは、ウィンドウに表示されているバッファの名前です。 ほとんどの場合、編集中のファイル名と同じです。 See Buffers

(カーソルがある)選択されたウィンドウに表示されたバッファは、 Emacsの選択されたバッファでもあり、編集はこのバッファで行われます。 コマンドが『バッファ』に何かを行うといったとき、 現在選択されているバッファを指しています。

lineは、Lのあとに現在ポイントがある行の番号が続いたものです。 これは、行番号(line-number)モードがオンである (通常はオン)場合に表示されます。 なお、桁番号(column-number)モードをオンにすると、 現在の桁番号も表示できます (多少時間がかかるので、このモードはデフォルトではオフ)。 See Optional Mode Line

posは、ウィンドウの最上部より上や最下部より下に さらにテキストがあるかどうかを示します。 バッファが小さくて、すべてがウィンドウに収まっている場合には、 posAllとなります。 そうでない場合、バッファの先頭が表示されていればTop、 バッファの末尾が表示されていればBot、 あるいは、nn%となります。 ここで、nnはウィンドウの最上部より上にあるバッファの 割合を百分率で示します。

majorは、そのバッファのメジャーモード(major mode)の名前です。 各バッファはつねに必ず1つのメジャーモードになっています。 使用可能なメジャーモードには、 基本(fundamental)モード(もっとも特殊化されていないモード)、 テキスト(text)モード、Lisp モード、Cモード、 texinfoモード、その他にも数多くあります。 各モードの相違や選択方法についての詳細は、See Major Modes

メジャーモードには、 メジャーモード名のあとに付加的な情報を表示するものもあります。 たとえば、rmailバッファでは、現在のメッセージ番号とメッセージ総数を表示します。 コンパイルバッファやシェルバッファでは、サブプロセスの状態を表示します。

minorは、ウィンドウの選択されたバッファにおいて、 その時点でオンになっているマイナモード (minor mode)の一覧の一部を示します。 たとえば、Fillは、 自動詰め込み(auto-fill)モードがオンであることを意味します。 Abbrevは、略語(abbrev)モードがオンであることを意味します。 Ovwrtは 、上書き(overwrite)モードがオンであることを意味します。 詳しくは、See Minor ModesNarrowは、表示中のバッファが、 そのテキストの一部のみを編集するように制限されていることを示します。 これは、実際にはマイナモードではありませんが、そのようなものです。 See NarrowingDefは、キーボードマクロを定義中であることを示します。 See Keyboard Macros

さらに、Emacsが、現在、再帰編集レベルにあるときには、 モードを囲んでいる括弧の周りに角括弧([...])が現れます。 再帰編集レベルの中で別の再帰編集レベルに入っていると、 角括弧は2重になるというふうになります。 再帰編集レベルは、特定のバッファにだけ関係するものではなく、 Emacs全体に影響するので、角括弧はすべてのウィンドウのモード行に表示される、 あるいは、まったく表示されないのどちらかです。 See Recursive Edit

ウィンドウを表示できない端末では、一度には、 単一のEmacsフレームしか表示できません (see Frames)。 そのような端末では、モード行のchのあとに、 選択しているフレームの名前が表示されます。 初期フレームの名前は、F1です。

csは、編集中のファイルで使用しているコーディングシステムを表します。 ダッシュ(-)はデフォルトの状態、つまり、 ファイルの内容に応じて行末変換は行うが、 コード変換は行わないことを示します。 =の場合、コード変換をまったく行わないことを意味します。 単純ではないコード変換をさまざま文字で示します。 たとえば、1は、ISO Latin-1を表します。 詳しくは、See Coding Systems。 入力方式を使っている場合には、 csの先頭にi>の形式の文字列が付加されます。 ここで、iは入力方式を表します。 (>のかわりに、+@を表示する入力方式もある。) See Input Methods

(ウィンドウシステムではなくて)文字端末を使っている場合、 csは3文字になり、それぞれ、 キーボード入力のコーディングシステム、 画面出力のコーディングシステム、 編集中のファイルのコーディングシステムです。

マルチバイト文字が使用不可の場合、csはまったく表示されません。 See Enabling Multibyte

csのあとのコロンは、特定の場面では別の文字列に変わることがあります。 Emacsは、バッファ内の行区切りとして改行を使います。 ファイルによっては、行区切りとして別の慣習を用いるものもあります。 復帰改行(MS-DOSの慣習)、あるいは、復帰のみ(Macintoshの慣習)です。 バッファのファイルが復帰改行を使っている場合には、 オペレーティングシステムに依存して、 コロンはバックスラッシュ(\)か(DOS)に変わります。 ファイルが復帰のみを使っている場合には、 コロンはスラッシュ(/)か(Mac)に変わります。 システムによっては、行区切りとして改行を使っているファイルであっても、 Emacsはコロンのかわりに(Unix)を表示します。

各種行末形式のモード行への表示は、 各変数、eol-mnemonic-unixeol-mnemonic-doseol-mnemonic-maceol-mnemonic-undecidedに ユーザーにとって適切な任意の文字列を 設定することでカスタマイズできます。 変数の設定方法については、See Variables

ポイント位置の桁番号、現在時刻、新着メイルの有無などの お手ごろ情報をモード行へ追加する機能については、 See Optional Mode Line


Node:Menu Bar, Previous:Mode Line, Up:Screen

メニューバー

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

ウィンドウシステムを使っているのであれば、 マウスを使ってメニューバーからコマンドを選べます。 メニュー項目のあとにある右向き矢印は、 その項目にサブメニューがあることを示します。 項目の最後に...がある場合は、コマンドを実際に実行するまえに、 コマンドがキーボードから引数を読み取ることを意味します。

メニュー項目の完全なコマンド名や説明文を見るには、 C-h kと打ってから、通常どおりにマウスでメニューバーを選択します (see Key Help)。

マウスのない文字端末でも、 M-`や<F10>(これらはtmm-menubarを起動する)を打てば、 メニューバーを利用できます。 このコマンドは、キーボードからメニュー項目を選択するモードに入ります。 エコー領域には、仮の選択項目が表示されます。 左矢印キーや右矢印キーでメニューの中を移動して別の項目を選べます。 選択を確定するには<RET>キーを打ちます。

各メニュー項目には、その項目を指定する1個の文字や数字も割り当てられています。 通常、それらは項目名の単語の頭文字です。 これらの文字や数字は、項目名と=>で分離されています。 項目の文字や数字を打てばその項目を選べます。

メニューバーにあるコマンドの中には、 キーバインディングを持つものもあります。 その場合、項目自身のあとの括弧の中に等価なキーバインドを表示します。


Node:User Input, Next:, Previous:Screen, Up:Top

ユーザー入力の種類

GNU Emacsは、キーボード入力に対しては拡張ASCII文字集合を使います。 また、ファンクションキーやマウスボタン操作のような文字以外の 入力イベントも受け付けます。

ASCIIは、128の文字コードから成ります。 これらのコードの中には、a=のような 図形記号に割り当てられているものもあります。 それ以外は、Control-aのようなコントロール文字です (通常、C-aと略記)。 C-aの名前は、<CTRL>キーを押し下げたままaを 押すことからきています。

ASCIIコントロール文字の中には、特別な名前が付いたものもあります。 多くの端末では、コントロール文字を打つための特別なキーを備えています。 たとえば、<RET>、<TAB>、<DEL>、<ESC>がそうです。 空白文字は、以下では普通<SPC>と表記します。 厳密にいえば、表示した図形が空白である図形文字です。 C-jに対する別名である『linefeed』(ラインフィード) 5という ラベルが付いたキーを備えたキーボードもあります。

Emacsでは、数千の印字文字(see International)、 追加のコントロール文字、任意の文字と組み合わせ可能な修飾子を導入して、 ASCII文字集合を拡張しています。

ASCII端末では、利用可能なコントロール文字は32個しかありません。 これらは、英字と@[]\^_のコントロール変種です。 さらに、コントロール文字では、シフトキーは意味を持ちません。 つまり、C-aC-Aは同じ文字であり、Emacsは区別できません。

しかし、Emacsの文字集合自体には、 すべての印字文字にコントロール変種を用意する余地があり、 C-aC-Aを区別できます。 Xウィンドウシステムでは、これらすべての文字を入力できます。 たとえば、C--(コントロールマイナス)とC-5は、 Xウィンドウシステム上では意味を持つEmacsコマンドです。

Emacsの文字集合に対するもう1つの拡張は、修飾ビットの追加です。 通常は1ビットの修飾ビットだけを使い、 このビットをメタ(Meta)と呼びます。 すべての文字にはメタ変種があります。 たとえば、Meta-a(通常はM-aと略記)や M-AM-aとは異なる文字だが、Emacsでは通常、同じ意味)、 M-<RET>M-C-aです。 伝統的な理由で、通常、M-C-aよりむしろC-M-aと書きます。 論理的には、2つの修飾キー<CTRL>と<META>の順序は関係ありません。

端末の中には<META>キーを備えたものもあり、 このキーを押し下げることでメタ文字を打てます。 たとえば、Meta-aは、<META>を押し下げたまま aを押して入力します。 <META>キーは<SHIFT>キーと同じように働きます。 しかし、このようなキーのラベルがつねに<META>であるとは限りません。 というのは、この機能は、別の主目的を持つキーとするための 特別なオプションであることがままあるからです。

<META>キーがなくても、<ESC>で始まる2文字列を使って メタ文字を入力できます。 つまり、M-aを入力するには、 <ESC> aと打ちます。 C-M-aを入力するには、<ESC> C-aと打ちます。 この方法に慣れているのであれば、 <META>がある端末でも、<ESC>を使ってかまいません。

Xウィンドウシステムには、他にもいくつかの修飾キーがあり、 すべての入力文字に適用できます。 これらは、<SUPER>、<HYPER>、<ALT>と呼ばれます。 文字にこれらの修飾子が付いていることを示す意味で、 s-H-A-と書きます。 つまり、s-H-C-xは、Super-Hyper-Control-xを省略したものです。 すべてのX端末に、実際にこれらの修飾子用のキーがあるわけではありません。 実際、<ALT>とラベルされているにも関わらず、 実は<META>として機能するキーを持つ端末が多くあります。 Emacsの標準キーバインディングには、 これらの修飾子が付いた文字はありません。 しかし、Emacsをカスタマイズして、それらに独自の意味を割り当てることができます。

キーボード入力には、 ファンクションキーや矢印キーのような文字以外のキーも含まれます。 マウスボタンも文字の範囲には入りません。 これらのイベントも、修飾キー<CTRL>、<META>、 <SUPER>、<HYPER>、<ALT>を使って、 キーボード文字と同じように修飾できます。

文字入力と非文字入力の両者を合わせて、 入力イベント(input events)と呼びます。 より詳しくは、 See Input Events。 Lispのプログラミング抜きに、 文字イベントや非文字イベントの意味を再定義したい場合には、 Customizationを参照してください。

ASCII端末では、ASCII文字だけしかコンピュータに送れません。 これらの端末では、文字の並びを使って各ファンクションキーを表現します。 ただし、キーボード入力ルーチンがこれらの特別な文字の並びを認識して、 Emacsの他の部分に渡すまえにファンクションキーイベントに変換してしまうので、 これらの文字の並びがEmacsユーザーの目にふれることはありません。


Node:Keys, Next:, Previous:User Input, Up:Top

キー

キー列(key sequence)(キーと略記)は、 一塊で『1つのコマンド』としての意味を持つ入力イベントの列です。 Emacsのコマンド列の中には、1文字のみ、つまり、 1イベントのみであるものもあります。 たとえば、C-fはポイントを1文字先へ進めます。 しかし、なかには、起動に2つ以上のイベントを必要とするコマンドもあります。

あるイベント列が1つのコマンドを起動するのに十分である場合、 それらを完結キー(complete key)と呼びます。 完結キーの例としては、C-aX、<RET>、 <NEXT>(ファンクションキーの1つ)、<DOWN>(矢印キー)、C-x C-fC-x 4 C-fがあります。 完結するほど十分に長くないイベント列を、 プレフィックスキー(prefix key)と呼びます。 上の例では、C-xC-x 4が、プレフィックスキーです。 すべてのキー入力列は、完結キーかプレフィックスキーのどちらかです。

Emacs標準のコマンド割り当てでは、ほとんどの1文字は完結キーです。 残りの少数はプレフィックスキーです。 プレフィックスキーは、後続の入力イベントと結び付いて、 それ自体が完結キーやプレフィックスキーとなる、 さらに長いキーの列を作ります。 たとえば、C-xはプレフィックスキーなので、 C-xに続く入力イベントと結び付いて2文字のキー列を作ります。 C-x C-fC-x bを含めて、 これらのキー列のほとんどは完結キーになります。 C-x 4C-x rのように、 いくつかのキー列はそれ自体がプレフィックスキーとなり、 3文字のキー列を作ります。 キー列の長さに制限はありませんが、 実用上は4文字を超える長さのキー列を使うことはめったにありません。

これに対して、完結キーには入力イベントを付け加えることができません。 たとえば、2文字の列C-f C-kはキーではありません。 というのは、C-fがそれ自体で完結キーだからです。 C-f C-kにコマンドとしての独立した意味付けをすることは不可能です。 C-f C-kは、2つのキー列であって、1つのキー列ではありません。

Emacsのプレフィックスキーは、C-cC-hC-xC-x <RET>C-x @C-x aC-x nC-x rC-x vC-x 4C-x 5C-x 6、<ESC>、M-gM-jです。 しかし、これらは固定されているわけではなく、 Emacsのキー割り当ての標準設定となっているだけです。 Emacsをカスタマイズすれば、新しいプレフィックスキーを設定したり、 これらを解除したりできます。 See Key Bindings

プレフィックスキーを設定したり解除したりすると、 可能なキー列の集合を変えることになります。 たとえば、C-fをプレフィックスキーとして再定義すると、 C-f C-kは自動的に (これをさらにプレフィックスとして定義しない限り完結した)キーになります。 逆に、C-x 4をプレフィックスでなくすると、C-x 4 f (またはC-x 4 anything)は、もはやキーではなくなります。

プレフィックスキーのあとにヘルプ文字(C-hや<F1>)を打つと、 そのプレフィックスで始まるコマンド一覧を表示できます。 歴史的な背景から、C-hが機能しないプレフィックス文字も存在します。 これらの文字では、C-hが別の意味に割り当てられていて、 容易には変更できないのです。 しかし、<F1>はすべてのプレフィックスに対して使えるはずです。


Node:Commands, Next:, Previous:Keys, Up:Top

キーとコマンド

本書は、特定のキーの機能を詳しく説明したページばかりです。 しかし、Emacsは直接キーに意味を与えてはいません。 そのかわりに、Emacsは名前を付けたコマンド(commands)に意味を持たせ、 キーとコマンドをバインディング(binding、結び付ける) することによって、キーに意味を与えています。

すべてのコマンドには、プログラマが選んだ名前が付いています。 その名前は、たいていダッシュで区切った数語の英単語です。 たとえば、next-lineforward-wordがそうです。 コマンドは、Lispプログラムである関数定義 (function definition、defun)を持ちます。 これが、コマンドが行うべきことを行えるようにしています。 Emacs Lispでは、コマンドは実際には特別な種類の関数です。 つまり、引数の読み取り方や対話的な呼び出し方が規定されたLisp関数です。 コマンドと関数に関してより詳しくは、 What Is a Functionを 参照してください。(本書での定義は少々簡易化してある。)

キーとコマンドのバインディングは、 キーマップ(keymaps)という表に記録されています。 See Keymaps

C-nは垂直方向に1行下がる』という表現では、 Emacsのカスタマイズ方法を理解するうえでは非常に重要であっても、 普段の使い方では意味のない「区別」をあえて無視しています。 下がるようにプログラムされているのはnext-lineというコマンドです。 C-nがそのコマンドにバインドされているので、 そのような効果を発揮するのです。 C-nをコマンドforward-wordにバインドし直すと、 C-nは、かわりに1単語ずつ先へ進むようになります。 キーの再バインディングは、カスタマイズの一般的な方法です。

本書では、今後、話を単純にするために、 普段はこの違いを無視することにします。 カスタマイズに必要な情報を示す場合、 コマンドを実行するキーを記したあとに、 実際にその動作を行うコマンドの名前を括弧に括って示します。 たとえば、『コマンドC-nnext-line)は、 ポイントを下向きに移動する』という表現では、 下向きに移動するコマンドはnext-lineであり、 標準ではキーC-nにバインドされていることを意味します。

これまでカスタマイズに関して述べてきましたので、 変数についてふれておく時期でしょう。 コマンドの説明では、 『これを変更するには、変数mumble-fooを設定する』と 記述することがあります。 変数とは、値を記憶しておくために使う名前のことです。 本書に記載された変数の大部分は、カスタマイズのために使われます。 いくつかのコマンドやEmacsの他の部分では、 変数を調べて設定された値に従ってそのふるまいを変えていきます。 カスタマイズに興味が出てくるまでは、 変数に関する記述は無視してかまいません。 カスタマイズしてみたいと思ったら、 変数に関する基礎を読んでください。 そうすれば、個々の変数に関する情報を理解できるでしょう。 See Variables


Node:Text Characters, Next:, Previous:Commands, Up:Top

テキスト用の文字集合

Emacsバッファ内のテキストは、1バイト8ビットのバイトの列です。 各バイトで、1つのASCII文字を表現できます。 ASCIIコントロール文字(8進数000〜037、0177)と ASCII印字文字(8進数040〜0176)の両方を使えます。 しかし、非ASCIIコントロール文字はバッファには現れません。 メタのようなキーボード入力で用いられるその他の修飾フラグも バッファ内では許されません。

いくつかのASCIIコントロール文字は、 テキスト中では特別な目的のために用いられていて、特別な名前が付いています。 たとえば、改行文字(8進数012)は、バッファ内の1行の終りに使われます。 また、タブ文字(8進数011)は、つぎのタブストップ位置(通常8桁ごと)まで テキストを字下げするために使われます。 See Text Display

非ASCII印字文字もバッファ内に存在できます。 マルチバイト文字を使用可にしてあれば、 Emacsが扱える任意の非ASCII印字文字を使えます。 それらの文字の文字コードは256(8進で0400)から始まり、 各文字は2バイト、あるいはそれ以上のバイト列として表現されます。 See International

マルチバイト文字を使用不可にしている場合、 非ASCII文字のうちの1種類のアルファベットだけを使えますが、 それらはすべて1バイトに収まるものです。 文字コードは0200から0377を使います。 See Single-Byte European Support


Node:Entering Emacs, Next:, Previous:Text Characters, Up:Top

Emacsの起動と終了

Emacsを起動する普通の方法は、シェルコマンドのemacsです。 Emacsは、画面をクリアし、初期ヘルプメッセージとコピーライトを表示します。 オペレーティングシステムによっては、Emacsが起動するまでに 先打ちした入力をすべて破棄してしまうことがあります。 Emacs側ではこれを防ぐことはできません。 したがって、編集コマンドを打ち始めるまえに、 Emacsが画面をクリアするまで待つように推奨します。

Xウィンドウシステム上のシェルウィンドウからEmacsを起動するのであれば、 emacs&のようにバックグラウンドで実行するようにしましょう。 こうすれば、Emacsがシェルウィンドウを拘束することがないので、 Emacsが専用のXのウィンドウで動作中でも、 別のシェルコマンドを実行できます。 キーボード入力をEmacsのフレームに向ければ、 ただちにEmacsコマンドを打ち始められます。

Emacsが動き始めると、*scratch*という名前のバッファを作ります。 ユーザーはこのバッファから始めます。 バッファ*scratch*は、Lisp対話(lisp-interaction)モードですから、 Lisp式を打ち込んでそれを評価できますし、あるいは、 この機能を無視して単なる落書用として使ってもかまいません。 (個人の初期化ファイル中で変数initial-major-modeを設定すれば、 このバッファに別のメジャーモードを指定できる。 see Init File。)

シェルのコマンド行でEmacsに引数を与えて、 訪問するファイル、ロードするLispファイル、呼び出す関数を指定できます。 See Command Arguments。 ただし、これはお勧めしません。 この機能は、主に、他のエディタとの互換性のためにあるのです。

他のエディタの多くは、編集を行うたびに新たに起動するように設計されています。 1つのファイルを編集し終えると、エディタを終了します。 つぎに別のファイルや同じファイルを編集したければ、 再度、エディタを起動する必要があります。 これらのエディタでは、 コマンド行の引数で編集するファイルを指定する意味があります。

しかし、別のファイルを編集するたびに新たにEmacsを起動するのはナンセンスです。 1つには、起動はじれったいほど遅いでしょう。 また、このようにすると、1つの編集セッションで複数のファイルを 扱えるEmacsの利点を活かせません。 さらに、レジスタやアンドゥ履歴、マークリングといった、 それまでに蓄積した内容も失ってしまいます。

GNU Emacsの推奨される使い方は、ログイン後に1度だけEmacsを起動して、 すべての編集を同じEmacsセッションで行うことです。 別のファイルを編集するには、既存のEmacsでそのファイルを訪問します。 そうすると、ついには、多くのファイルをすぐに編集できる状態で 保持することになります。 通常、ログアウトするまで、Emacsを終了する必要はありません。 複数のファイルを訪問することに関して詳しくは、See Files


Node:Exiting, Next:, Previous:Entering Emacs, Up:Top

Emacsの終了

Emacsの抜け方には、休止(suspending)する、 終了(killing)するの2種類があるので、 Emacsを抜けるコマンドも2つあります。

休止(suspending)は、一時的にEmacsを止めて、 親プロセス(通常はシェル)に制御を戻します。 こうすると、同じバッファ、同じキルリング、同じアンドゥ履歴を保持したままの 同じEmacsジョブをあとで再開できます。 これが通常の抜け方 6です。

終了(killing)は、Emacsジョブの破壊を意味します。 あとでまたEmacsを起動できますが、新たなEmacs環境です。 終了したあとでは、同じ編集セッションを再開する方法はありません。

C-z
Emacsを休止する、あるいは、フレームをアイコン化する (iconify-or-deiconify-frame)。
C-x C-c
Emacsを終了する(save-buffers-kill-emacs)。

Emacsを休止するには、C-zsuspend-emacs)と打ちます。 すると、Emacsを起動したシェルに戻ります。 ほとんどの一般的なシェルでは、 シェルコマンド%emacsでEmacsを再開できます。

プログラムを休止できないシステムでは、 C-zは、端末と直接やりとりする下位シェルを起動します。 Emacsは、ユーザーがこのサブシェルから抜け出るまで待ちます。 (普通、C-dexitでサブシェルを終了するはずだが、 使っているシェルに依存する。) このようなシステムでは、 Emacsを起動したシェルに(たとえばログアウトのために)戻るには、 Emacsを終了する以外に方法はありません。

プログラムを休止できるシステムであっても、 プログラムを休止できないシェル上で実行しているEmacsは休止できません。 このような場合、変数cannot-suspendnil以外の値を設定して、 C-zに下位シェルの実行を強制できます。 (適切なジョブ制御をできないEmacsの親シェルを 『下位』と呼ぶこともできるが、これは好みの問題。)

EmacsがXサーバーと直接通信して専用のXのウィンドウを作っている場合には、 C-zは別の意味になります。 専用のXのウィンドウを持つアプリケーションを休止しても、 あまり意味がありませんし、便利なわけでもありません。 そのかわり、C-zは、選択されているEmacsフレーム(see Frames)を 一時的に閉じるコマンドiconify-or-deiconify-frameを実行します。 シェルウィンドウに戻るには、ウィンドウマネージャの機能を使います。

Emacsを終了するには、C-x C-csave-buffers-kill-emacs)と打ちます。 これを2文字のキーにしてあるのは、少々打ちづらく7するためです。 このコマンドは、まず、変更したバッファを保存するかどうか聞いてきます。 未保存のものがあるとそれらを永久に失うことになるので、 Emacsを終了するまえにyesでの再確認を求めてきます。 Emacsを終了するとサブプロセスもただちに終了されられてしまうため、 サブプロセスが走っている場合にも、それらに関して確認を求めてきます。

一度Emacsを終了してしまうと、Emacsセッションを再開する方法はありません。 しかしながら、終了時に訪問していたファイルなどの 特定のセッション情報を記録するようにEmacsに指示しておけば、 つぎにEmacsを起動し直したときに、 同じファイルを訪問するなどを試みるようになります。 See Saving Emacs Sessions

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


Node:Basic, Next:, Previous:Exiting, Up:Top

基本編集コマンド

テキストの入力、修正、ファイルへの保存といった基本操作について説明します。 これらに接するのが初めてという読者は、 手を動かしながら学ぶチュートリアルを実行したほうが、 もっと簡単に習得できる思います。 チュートリアルを利用するには、 Emacsを起動してControl-h tと打ちます。 9

画面をクリアして再表示するには、C-lrecenter)と打ちます。


Node:Inserting Text, Next:, Up:Basic

テキストを挿入する

編集中のテキストに印字文字を挿入するには、 単にその文字を打ちます。 こうすると、打鍵した文字がバッファのカーソル位置 (すなわちポイント位置。see Point)に挿入されます。 カーソルは右(前向き)に移動して、 それにあわせてカーソル以降のすべてのテキストも右(前向き)に移動します。 バッファ内のテキストがFOOBARであって、 カーソルがBに重なっているとすると、 XXと打つとカーソルはBに重なったままで、 FOOXXBARとなります。

挿入したばかりのテキストを削除(delete)するには、 <DEL>キーを使います。 <DEL>キーはカーソルのまえの文字を削除します (カーソルが重なっている文字ではない。 その文字はカーソルのうしろにある)。 カーソルとカーソル以降のすべてのテキストは左(後向き)に移動します。 つまり、図形文字を1つ打った直後に<DEL>を打つと、 挿入を取り消したことになります。

行を終えて新たな行を打ち始めるには、<RET>を打ちます。 これにより、バッファに改行文字が挿入されます。 ポイントが行の途中にある場合、<RET>は行を分割します。 カーソルが行頭にあるときに<DEL>を打つと、 直前の改行文字が削除されて直前の行と連結されます。

自動詰め込み(auto-fill)モードと呼ばれる特別なマイナモードを オンにしておくと、行が長くなりすぎたときにEmacsが自動的に行を分割します。 自動詰め込み(auto-fill)モードの使い方は、See Filling

既存のテキストを右に押しやるのではなく、 テキストを順次置き換える(上書きする)のが好みならば、 マイナモードの1つである上書き(overwrite)モードをオンにします。 See Minor Modes

印字文字と<SPC>は直接挿入できますが、 それ以外の文字は編集コマンドとして機能して、それ自体を挿入しません。 コントロール文字や8進で0200を超える文字コードの文字を挿入したい場合には、 まずControl-qquoted-insert)と打って、 それらの文字をクォート(quote) 10 する必要があります。 (Control-qは、通常、C-qと略す。) C-qの使い方には、つぎの2つがあります。

マルチバイト文字が使用可ならば、 8進コード0200から0377までは正しい文字ではありません。 この範囲のコードを指定すると、 C-qはISO Latin-n文字集合の利用を意図しているとみなして、 指定したコードを対応するEmacs文字コードに変換します。 See Enabling Multibyte。 言語環境の選択(see Language Environments)を介して、 ISO Latin文字集合を1つ選びます。

8進数のかわりに10進数や16進数を使うには、 変数read-quoted-char-radixに10や16を設定します。 基数が10を超える場合には、aから始まるいくつかの英字は 文字コードの一部として数字の桁と同じように扱われます。

C-qに数引数を指定すると、 クォートした文字を何個挿入するかを指定します(see Arguments)。

カスタマイズ情報: ほとんどのモードでは、 <DEL>はコマンドdelete-backward-charを実行します。 <RET>はコマンドnewlineを実行します。 自己挿入の図形文字はコマンドself-insertを実行します。 self-insertは、これを起動した文字が何であってもその文字を挿入します。 いくつかのメジャーモードでは、 <DEL>を別のコマンドにバインドし直しています。


Node:Moving Point, Next:, Previous:Inserting Text, Up:Basic

ポイント位置を移動する

文字の挿入以外のことを行うには、ポイント(see Point) の移動方法を知っておく必要があります。 もっとも簡単な方法は、矢印キーを使うか、 移動先の箇所でマウスの左ボタンをクリックします。

カーソル移動のためのコントロール文字やメタ文字もあります。 一部は矢印キーと同等です (これらは、矢印キーを備えた端末が現れるまえからあった。 矢印キーがない端末では便利)。 他のものは、こったことをします。

C-a
行頭に移動する(beginning-of-line)。
C-e
行末に移動する(end-of-line)。
C-f
前向き(右)に1文字移動する(forward-char)。
C-b
後向き(左)に1文字移動する(backward-char)。
M-f
前向きに1語移動する(forward-word)。
M-b
後向きに1語移動する(backward-word)。
C-n
垂直に1行下へ移動する(next-line)。 このコマンドは行内での横方向の位置を保とうとする。 したがって、行の途中で使うと、つぎの行の途中に移動する。 テキストの最終行である場合には、 C-nは新たな行を作り、その行へ移動する。
C-p
垂直に1行上へ移動する(previous-line)。
M-r
ポイントをウィンドウの縦方向の中央位置で左端に移動する (move-to-window-line)。 テキストは画面上を移動しない。

数引数は、画面上の何行目にポイントを移動するかを指定する。 行数は、ウィンドウ上端(0行目)から下向きに数える。 負の引数では、ウィンドウの下端(-1行)から数える。

M-<
バッファの先頭に移動する(beginning-of-buffer)。 数引数nを指定すると、先頭から全体のn/10の行にポイントを移動する。 数引数の詳細については、see Arguments
M->
バッファの末尾に移動する(end-of-buffer)。
M-x goto-char
数値nを読み取り、バッファのn番目の文字にポイントを移動する。 バッファの先頭が位置1。
M-x goto-line
数値nを読み取り、n行目にポイントを移動する。 バッファの先頭が第1行。
C-x C-n
現在ポイントがある桁をC-nC-p半恒久的な目標桁として設定する。 このあと、これらのコマンドは、移動先の各行でこの桁位置に、あるいは、 行の内容によっては可能な限りこの桁に近い位置にポイントを移動する。 この目標桁は取り消すまで有効。
C-u C-x C-n
目標桁を取り消す。 これ以後、C-nC-p は、通常のように 横方向の位置を保とうとする。

変数track-eolnil以外を設定すると、 行末にポイントがある場合のC-nC-pは、 移動先の行でも行末にポイントを移動します。 通常、track-eolnilです。 track-eolのような変数の設定方法については、See Variables

通常、バッファの最終行でのC-nは、新しい行を追加します。 変数next-line-add-newlinesnilである場合、 C-nは新規の行を追加せずに (先頭行でのC-pと同様に)エラーになります。


Node:Erasing, Next:, Previous:Moving Point, Up:Basic

テキストの消去

<DEL>
ポイントの直前の文字を削除する(delete-backward-char)。
C-d
ポイントの直後の文字を削除する(delete-char)。
C-k
行末までをキルする(kill-line)。
M-d
つぎの語の末尾までを前向きにキルする(kill-word)。
M-<DEL>
まえの語の先頭までを後向きにキルする(backward-kill-word)。

ポイントの直前(つまり、カーソルの直前)の文字を削除する <DEL>キーについてはすでに知っていますね。 Control-dC-dと略記)は、ポイントの直後の文字 (つまり、カーソルが重なっている文字)を削除します。 すると、残りのテキストは左に移動します。 行末でC-dを打つと、その行とつぎの行が連結されます。

大量のテキストを消去するには、C-kを使います。 C-kは1行を一度にキルします。 行頭や行の途中でC-kを打つと、 行末までのすべてのテキストをキルします。 行末でC-kを打つと、その行とつぎの行を連結します。

より柔軟なテキストのキルについての詳細は、See Killing


Node:Undo, Next:, Previous:Erasing, Up:Basic

変更をアンドゥする(もとに戻す)

バッファのテキストに対する変更は、ある時点まで遡って、 すべてアンドゥ(もとに戻すことが)できます。 各バッファでは個々の変更をそれぞれ記録していて、 アンドゥコマンドは、つねにカレントバッファに作用します。 通常、各編集コマンドはアンドゥ記録に別々の項目を作成しますが、 query-replaceのようなコマンドは一度に多くの項目を作りますし、 自己挿入文字のように非常に単純なコマンドは、 もとに戻すのを単純にするために、まとめられます。

C-x u
一塊の変更をもとに戻す。 普通、1つのコマンドに相当する(undo)。
C-_
同じ。
C-u C-x u
リージョン内で、一塊の変更をもとに戻す。

変更をもとに戻すには、コマンド、C-x uC-_を使います。 始めにこのコマンドを実行すると、直前の変更をもとに戻します。 ポイントは、もとに戻されたコマンドを実行するまえの位置に戻ります。

C-_C-x uを連続して実行すると、 アンドゥ情報の限界に達するまで、 次々に以前の変更をもとに戻していきます。 記録されているすべての変更をもとに戻してしまうと、 アンドゥコマンドはその旨エラーメッセージを表示します。

アンドゥコマンド以外の他のコマンドを実行すると、 アンドゥコマンドの連続実行系列が断ち切られます。 これ以後、これよりまえのアンドゥコマンドの実行自体が、 もとに戻すことが可能な一般の変更として扱われます。 したがって、もとに戻してしまった変更をやはりそのとおりに 変更しておきたい場合には、 C-fと打つか、あるいは、無害なコマンドを実行して アンドゥの連続実行系列を断ち切ってから、さらにアンドゥコマンドを打ちます。

普通のアンドゥは、カレントバッファにおけるすべての変更に作用します。 カレントリージョン内に制限した選択的なアンドゥ(selective undo)を 行うこともできます。 これには、リージョンを設定してから、数引数(値は関係ない)を指定して undoコマンドを、つまり、C-u C-x uC-u C-_を実行します。 これにより、リージョン内のもっとも最近の変更がもとに戻ります。 同じリージョン内の変更をさらにもとに戻すには、 undoコマンドを繰り返します(これには数引数は必要ない)。 暫定マーク(transient-mark)モードでは、 リージョンが活性のときにundoを使うと選択的なアンドゥを行います。 つまり、数引数は必要ありません。

バッファを誤って変更してしまった場合、 もとに戻すもっとも簡単な方法は、モード行の先頭部分から星印が 消えるまでC-_を繰り返し打つことです。 そうすれば、すべての修正を取り消したことになります。 アンドゥコマンドによりモード行から星印が消えた場合はつねに、 バッファの内容がファイルを訪問したときと同じであるか、 最後に保存したときと同じであることを意味します。

意図してバッファを変更したかどうかあやふやなときは、 一度だけC-_を打ちます。 もとに戻すことで最後の変更箇所がわかりますから、 それが意図した変更かどうか判断できるでしょう。 意図した変更でなければ、もとに戻したままにしておきます。 意図した変更であったなら、上記の方法で変更し直します。

すべてのバッファでアンドゥ情報を記録するわけではありません。 空白で始まる名前のバッファでは記録しません。 これらのバッファは、 Emacsやその拡張部分が内部的に使用するもので、 ユーザーが通常見たり編集したりしないテキストを保持しています。

単なるカーソル移動はアンドゥできません。 バッファの内容を変更したときだけアンドゥ情報が保存されます。 ただし、いくつかのカーソル移動コマンドはマークを設定しますから、 これらのコマンドをときどき使えば、 マークリング(see Mark Ring)から取り出しながら、 通ってきたそれぞれの箇所へ戻ることができます。

バッファに関するアンドゥ情報が大きくなると、 Emacsはもっとも古いアンドゥ情報から順に(ガベッジコレクション中に) 破棄していきます。 保持すべきアンドゥ情報の量を指定するには、 2つの変数undo-limitundo-strong-limitを設定します。 これらの変数の値は、保存領域のバイト数です。

変数undo-limitは緩い限界(soft limit)を設定します。 Emacsは、このサイズに達するまでのコマンド分のアンドゥデータを保持します。 データ量がこのサイズを超える場合もありますが、 このデータ量を超えるような古いコマンド分のデータは保持しません。 デフォルトは、20000です。 変数undo-strong-limitは、厳密な限界(stricter limit)を設定します。 この量を超えるデータに対応するコマンドのデータは破棄します。 初期値は30000です。

これらの変数の値に関わらず、最新の変更を破棄することはありませんので、 意図しない大きな変更を加えてしまった直後に ガベッジコレクションが発生しても、 その変更をアンドゥできないというようなことはありません。

アンドゥコマンドを実行するキーがC-x uC-_と2つある理由は、 1文字キーにするほど重要なのですが、どうやってC-_を打つか自明でない キーボードもあるからです。 C-x uは、どの端末でも素直に打てる代替手段なのです。


Node:Basic Files, Next:, Previous:Undo, Up:Basic

ファイル

Emacsバッファ内でテキストを作成したり変更したりするには、 これまでに説明したコマンドで十分なはずです。 より高度なEmacsコマンドといっても、 これらの操作を容易にするだけです。 しかし、テキストを恒久的なものとするには、 ファイル(file)に保存する必要があります。 ファイルとは、 オペレーティングシステムが保存するために名前を付けたテキストの一塊であり、 あとでその名前で取り出せます。 Emacsでファイルを編集する場合を含めて、 ファイルの内容を眺めたり利用したりするには、 ファイル名を指定する必要があります。

/usr/rms/foo.cという名前のファイルがあるとしましょう。 このファイルを編集し始めるには、Emacsではつぎのように打ちます。

C-x C-f /usr/rms/foo.c <RET>

ここで、ファイル名は、コマンドC-x C-ffind-file)に対する 引数(argument)として与えます。 このコマンドは引数を読むためにミニバッファを使います。 引数の入力を終えるには、<RET>を打ちます(see Minibuffer)。

Emacsはコマンドに従い、ファイルを訪問(visiting)します。 つまり、バッファを作成し、ファイルの内容をそのバッファにコピーし、 ユーザーが編集できるようにそのバッファを表示します。 テキストを変更したら、C-x C-ssave-buffer)と打てば、 新しいテキストをファイルに保存(save)できます。 これにより、バッファの変更した内容を ファイル/usr/rms/foo.cにコピーし戻したので、 変更は恒久的になります。 ユーザーが保存するまでは、変更はEmacs内部のみに存在するだけで、 ファイルfoo.c自体は未変更のままです。

ファイルを作成するには、そのファイルが既存であるかのように、 C-x C-fでファイルを訪問するだけです。 これにより、空のバッファが作られ、 ファイルに収めたいテキストを挿入できるようになります。 C-x C-sでバッファを保存したときに、 ファイルが実際に作成されます。

もちろん、ファイルについてはもっと知っておく必要があります。 See Files


Node:Basic Help, Next:, Previous:Basic Files, Up:Basic

ヘルプ

キーの機能を忘れてしまった場合には、 ヘルプ文字C-h(あるいはC-hの別名である<F1>)を使って、 調べられます。 C-h kと打ってから、調べたいキーを続けて打ちます。 たとえば、C-h k C-nは、C-nが何をするか教えてくれます。 C-hはプレフィックスキーです。 C-h kは、C-hの1つのサブコマンド (コマンドdescribe-key)です。 C-hには他にもサブコマンドがあり、 それぞれ異なる種類のヘルプを表示します。 C-hを2回打てば、ヘルプ機能自体の説明を見ることができます。 See Help


Node:Blank Lines, Next:, Previous:Basic Help, Up:Basic

空行

空行の挿入と削除に関する特別なコマンドや技法を紹介します。

C-o
カーソルの直後に1行以上の空行を挿入する(open-line)。
C-x C-o
連続する空行を1行だけ残してすべて削除する(delete-blank-lines)。

既存の行のまえに新たに1行を挿入するには、 新しい行のテキストを打ってから<RET>を打つこともできます。 しかし、まず空行を作ってから、 そこに希望のテキストを挿入するほうが何をしているのかがわかりやすいでしょう。 キーC-oopen-line)を使えば簡単です。 これはポイントの直後に改行を挿入して、 ポイントは改行の直前に置かれたままとなります。 C-oに続けて、新しい行のテキストを打ちます。 C-o F O Oは、ポイントの最終的な位置を除けば、 F O O <RET>と同じ効果を持ちます。

複数の空行を作るには、C-oを数回打つか、 作りたい空行の個数を指定する数引数を指定します。 数引数の指定方法は、See Arguments。 詰め込み接頭辞を設定してある場合、 行の先頭でC-oコマンドを使うと、 このコマンドは新しい行に詰め込み接頭辞を挿入します。 See Fill Prefix

余分な空行を削除するには、 コマンドC-x C-odelete-blank-lines)を使います。 連続する複数の空行の中でC-x C-oを実行すると、 1行を残してすべての空行を削除します。 空行が1行だけの場合、その空行自体を削除します。 空行でない行にポイントがある場合、 その行に続くすべての空行を削除します。


Node:Continuation Lines, Next:, Previous:Blank Lines, Up:Basic

継続行

<RET>で分割せずに1行に文字を加え続けると、 その行は画面上で2行以上を占めるようになります。 このとき、そのような行の最後の行を除くすべての行の右端には、 \が表示されます。 この\は、画面上の後続の行はテキスト内の独立した行ではなく、 画面に収まりきらない長い行が継続(continuation) していることを意味します。 この継続を、折り返し(wrapping)とも呼びます。

行が長くなりすぎたときにEmacsが自動的に改行を挿入すると便利なことがあります。 画面上での継続は、このようには機能しません。 自動的に改行するようにするには、 自動詰め込み(auto-fill)モード(see Filling)を使います。

継続のかわりの方法として、Emacsは長い行を切り捨て(truncation)て 表示することもできます。 つまり、画面やウィンドウの幅に収まりきらない文字は表示しません。 もちろん、一時的に見えないだけで、バッファ内には存在しています。 切り捨てていることを示すために、 \ではなく$を右端に用います。

水平スクロールを使っていたり、ウィンドウを左右に並べていると、 継続のかわりに切り捨て表示します(see Windows)。 特定のバッファの変数truncate-linesnil以外を設定すると、 そのバッファを切り捨て表示にできます(see Variables)。 変数truncate-linesの値を変更すると、 この変数はカレントバッファにローカルになります。 そうするまでは、デフォルト値が使われます。 デフォルトの初期値はnilです。 See Locals

テキストの表示方法に影響する変数については、See Display Vars


Node:Position Info, Next:, Previous:Continuation Lines, Up:Basic

カーソル位置の情報

バッファのある部分の大きさや位置に関する情報を得るコマンドや 行を数えるコマンドを紹介します。

M-x what-page
ポイントがあるページの番号とそのページ内での行番号を表示する。
M-x what-line
ポイントがある行のバッファ内での行番号を表示する。
M-x line-number-mode
現在行の自動行番号表示をオン/オフする。
M-=
カレントリージョンの行数を表示する(count-lines-region)。 リージョンに関しては、see Mark
C-x =
ポイントの直後にある印字文字の文字コード、ポイントの文字位置、 ポイントの桁位置を表示する(what-cursor-position)。

行番号に関するコマンドは2つあります。 M-x what-lineは現在行の行番号を計算して、エコー領域に表示します。 指定した行番号の行へ移動するには、M-x goto-lineを使います。 このコマンドは、行番号を聞いてきます。 これらの行番号は、バッファの先頭を1行目と数えます。

モード行で現在行の行番号を知ることもできます。 See Mode Line。 バッファをナロイングしてある場合、 モード行中の行番号は参照可能な範囲内での相対的なものになります (see Narrowing)。 対照的に、what-lineは、 ナロイングされた範囲内での行番号と、 バッファ全体での行番号の両方を表示します。

これに対し、M-x what-pageは、ファイルの先頭からページを数え、 さらにページ内での行番号も数えて、両方を表示します。 See Pages

この話題に関連して、 M-=count-lines-region)も説明しておきましょう。 これは、リージョンの行数を数えて表示します(see Mark)。 カレントページの行数を数えるコマンドC-x lについては、See Pages

コマンドC-x =what-cursor-position)は、 カーソルがある箇所の桁位置を求めたり、 ポイントに関するその他の種々の情報を得るために使います。 エコー領域につぎのように表示します。

Char: c (0143, 99, 0x63)  point=21044 of 26883(78%)  column 53

(これは、例の中のcolumnのまえにポイントがあるときの実際の出力。)

Char:のあとの4つの値は、ポイントの直後の文字を表していて、 文字そのもの、続いて、文字コードの8進表示、10進表示、16進表示です。 非ASCIIのマルチバイト文字に対しては、 バッファのコーディングシステムにおいて当該文字をまちがいなく、かつ、 単一バイトで符号化できる場合には、 extとバッファのコーディングシステムで表した文字コードの16進表示が 続きます(see Coding Systems)。 文字の符号が1バイトより長い場合には、 Emacsはext ...を表示します。

point=のあとは、ポイント位置を文字単位に数えたものです。 バッファの先頭を位置1、つぎの1文字を2、というように数えます。 つぎの大きな数字はバッファ内の総文字数です。 続く括弧の中は、ポイント位置の全サイズに対する百分率です。

columnに続くものは、ウィンドウの左端からの桁数で表した ポイントの水平位置です。

バッファをナロイングしていて、バッファの先頭と末尾のテキストの一部が 表示されていない場合、C-x =は、 現在参照可能な範囲に関する情報も表示します。 たとえばつぎのようになります。

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

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

ポイントがバッファの末尾(あるいは参照可能な部分の末尾)にある場合、 C-x =は、ポイントの直後の文字に関する情報は表示しません。 出力はつぎのようになります。

point=26957 of 26956(100%)  column 0

C-u C-x =は、バッファ内の位置と桁位置のかわりに、 文字に関する追加情報、つまり、 文字集合名とその文字集合内でその文字を識別するコードを表示します。 ASCII文字は、文字集合ASCIIに属するものと識別します。 さらに、文字を完全に符号化するのに単一バイトより多く必要な場合であっても、 extのあとに文字コードを表示します。 コーディングシステムがiso-2022-7bitであるバッファ内にある Latin-1のアクサングレーブ付きの文字Aの例を示します。 11

Char: À (04300, 2240, 0x8c0, ext ESC , A @) (latin-iso8859-1 64)


Node:Arguments, Next:, Previous:Position Info, Up:Basic

数引数

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

端末のキーボードに<META>キーがある場合、 数引数を入力するもっとも簡単な方法は、 <META>キーを押し下げたままで、数字やマイナス記号を打ちます。 たとえば、

M-5 C-n

は、カーソルを5行下に移動します。 Meta-1Meta-2Meta--などの文字がこのように動作するのは、 これらのキーが、後続のコマンドに引数を与えるように定義されたコマンド (digit-argumentnegative-argument)に バインドされているからです。 コントロールやコントロールとメタで修飾した数字と-も、 同様に数引数を指定します。

引数を指定する別の方法は、 C-uuniversal-argument)コマンドに続けて 引数の数字を入力することです。 C-uでは、修飾キーを押し下げ続けることなく引数の数字を打てます。 C-uはすべての端末で使えます。 負の引数を指定するには、C-uのあとにまずマイナス記号を打ちます。 マイナス記号だけだと-1を意味します。

C-uのあとに数字でもマイナス記号でもない文字を打つと、 『4倍する』という特別な意味になります。 つまり、後続のコマンドに渡す引数を4倍します。 C-uを2回打つと、引数を16倍します。 したがって、C-u C-u C-fは、カーソルを前向きに16文字分移動します。 16文字は通常の画面で約1/5行に相当するので、 カーソルを『速く』移動させたい場合に便利な方法です。 便利な他の組み合せは、 C-u C-nC-u C-u C-n(画面の下方への移動に便利)、 C-u C-u C-o(『数多く』の空行を作る)、 C-u C-k(4行キルする)です。

コマンドによっては、引数の値ではなく、引数の有無だけを問題にします。 たとえば、コマンドM-qfill-paragraph)に引数を指定しないと テキストの詰め込みのみを行います。 引数を指定すると、さらに幅揃えも行います。 (M-qに関する詳細は、see Filling。) C-uだけを使えば、このようなコマンドに簡単に引数を指定できます。

引数の値を反復回数として使うにも関わらず、 引数がないと特別な動作をするコマンドもあります。 たとえば、C-kkill-line)に引数nを指定すると、 行区切りの改行も含めてn行をキルします。 これに対し、引数を指定しない場合は特別な動作となります。 つまり、つぎの改行文字までのテキストをキルするか、 行末にポイントがある場合は改行そのものをキルします。 したがって、引数を指定せずにC-kを2回実行すると、 引数1を指定したC-kと同様に、空行でない1行をキルします。 (C-kの詳細については、see Killing。)

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

数引数を使って、文字のコピーを複数個挿入することもできます。 この操作は、数字以外の文字ならば簡単です。 たとえば、C-u 6 4 aで、文字aを64個挿入できます。 しかし、数字では機能しません。 C-u 6 4 1は、引数が641であることを意味し、何も挿入しません。 引数と挿入したい数字を区切るには、もう1つC-uを打ちます。 たとえば、C-u 6 4 C-u 1で、数字1を64個挿入できます。

コマンドのまえに引数を打つということを強調するために、また、 コマンドのあとのミニバッファ引数と区別するために、 『数引数』と同様に用語『前置引数』を使います。


Node:Repeating, Previous:Arguments, Up:Basic

コマンドを繰り返す

コマンドC-x zrepeat)は、 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回ずつ繰り返します。


Node:Minibuffer, Next:, Previous:Basic, Up:Top

ミニバッファ

ミニバッファは、単純な数よりも複雑な引数をEmacsコマンドが 読み取るために用いる機構です。 ミニバッファ引数は、ファイル名、バッファ名、Lisp関数名、Emacsコマンド名、 Lisp式など、引数を読み取るコマンドに応じて多種多様です。 ミニバッファでは、通常のバッファと同様の編集機能を用いて 引数のテキストを編集できます。

ミニバッファが使われているときには、ミニバッファはエコー領域に表示されて、 端末のカーソルもエコー領域に移動します。 ミニバッファの行の先頭にはプロンプト(prompt)が表示されます。 プロンプトにより、何を入力しそれがどのように使われるかを 知ることができます。 プロンプトは、引数を要求しているコマンドの名前から導かれることが多いです。 プロンプトは通常コロンで終ります。

コロンのあとの括弧の中にデフォルト引数(default argument)が 表示されることもあります。 これもプロンプトの一部です。 (たとえば、<RET>だけを打って)空の引数を入力したときには、 デフォルトが引数として使われます。 たとえば、バッファ名を読み取るコマンドは、つねに、デフォルトを表示しますが、 それは<RET>だけを打ったときに使われるバッファ名です。

ミニバッファ引数を入力するもっとも簡単な方法は、 目的のテキストを入力してから、 ミニバッファから抜ける<RET>で終えることです。 C-gを打てば、引数を必要とするコマンドを取り消して、 ミニバッファを抜けることができます。

ミニバッファは画面のエコー領域を使うため、 習慣的にエコー領域を使用するEmacsの機能と衝突する可能性があります。 Emacsは、そのような衝突を以下のように扱います。


Node:Minibuffer File, Next:, Up:Minibuffer

ファイル名入力用のミニバッファ

最初からテキストを伴って始まるミニバッファもあります。 たとえば、ファイル名を指定しなければならない場合、 ミニバッファはスラッシュで終るデフォルトディレクトリ (default directory)を含んでいます。 これにより、ディレクトリを指定しなくても、 どのディレクトリからファイルを探すかわかります。

たとえば、ミニバッファがつぎのような内容で始まったとしましょう。

Find File: /u2/emacs/src/

ここで、Find File: がプロンプトです。 buffer.cと打てば、 ファイル/u2/emacs/src/buffer.cを指定したことになります。 付近のディレクトリのファイルを指定するには、..を使います。 したがって、../lisp/simple.elと打てば、 /u2/emacs/lisp/simple.elという名前のファイルになります。 あるいは、不要なディレクトリ名であれば、 M-<DEL>でキルできます(see Words)。

デフォルトディレクトリをまったく使いたくない場合は、 C-a C-kと打ってキルできます。 しかし、デフォルトをキルする必要はありません。 単に無視すればよいのです。 スラッシュやティルダで始まる絶対ファイル名を挿入します。 たとえば、ファイル/etc/termcapを指定するには、 そのファイル名を挿入して、ミニバッファがつぎの内容になるようにします。

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

GNU Emacsでは、(普通は意味のある書き方ではない) 連続した2個のスラッシュに特別な意味を与えています。 『2番目のスラッシュよりまえの文字はすべて無視する』という意味になります。 したがって、先の例では、/u2/emacs/src/は無視され、 /etc/termcapというファイル名になります。

insert-default-directorynilを設定すると、 ミニバッファにはデフォルトディレクトリを挿入しません。 つまり、ミニバッファは空で始まります。 しかし、入力したファイル名が相対的なものであれば、 同じデフォルトディレクトリ相対に解釈されます。


Node:Minibuffer Edit, Next:, Previous:Minibuffer File, Up:Minibuffer

ミニバッファでの編集

ミニバッファは(少々特殊だが)普通のEmacsバッファなので、 通常のEmacsコマンドを使って、入力中の引数のテキストを編集できます。

ミニバッファでは、<RET>はミニバッファから抜けるように定義されているので、 ミニバッファで改行を挿入するために<RET>を使うことはできません。 改行を挿入するには、C-oC-q C-jとします。 (改行とは実は文字「コントロールJ」。)

ミニバッファには独自のウィンドウがあり、 そのウィンドウは画面上の場所を占有しています。 しかし、ミニバッファが使われていないときには、 あたかも何もないかのようにふるまいます。 ミニバッファが使われているときは、 そのウィンドウは他のウィンドウと同様になります。 ミニバッファで引数を入力し終えるまでは、 C-x oで他のウィンドウに切り替えて、 そこでテキストを編集したり他のファイルを訪問したりもできます。 他のウィンドウでテキストをキルしてから、 ミニバッファウィンドウに戻ってそのテキストを ヤンクして引数として使うこともできます。 See Windows

しかし、ミニバッファウィンドウの使用にはいくつかの制限があります。 ミニバッファウィンドウではバッファを切り替えられません。 ミニバッファとそのウィンドウは恒久的に結び付いています。 また、ミニバッファウィンドウを分割したり消去したりすることもできません。 しかし、C-x ^を使う通常の方法で、 ウィンドウの高さを大きくすることは可能です。 ミニバッファリサイズ(resize-minibuffer)モードをオンにしておくと、 ミニバッファに入力したテキストを表示するのに必要なだけ、 ミニバッファウィンドウは縦に広がります。 M-x resize-minibuffer-modeを使って、 このマイナモードをオン/オフします(see Minor Modes)。

ミニバッファウィンドウではスクロールは特殊な動きをします。 ミニバッファがちょうど1行分の高さで、 画面に収まらないほど長い1行のテキストが入っているときには、 スクロールするときに継続行のあいだでは何文字かを自動的に重複して表示します。 変数minibuffer-scroll-overlapで、重複させる文字数を指定します。 デフォルトは20です。

ミニバッファの中で別のウィンドウにある種のヘルプテキストを 表示するようなコマンドを実行したときには、 C-M-vを使って ミニバッファの中からヘルプテキストをスクロールできます。 これは、ミニバッファを抜けるまで有効です。 この機能は、補完をしているミニバッファが、 補完候補を別のウィンドウに表示するような場合に特に便利です。 See Other Window

Emacsでは、通常、ミニバッファを使っている最中には、 ミニバッファを用いるコマンドの多くを実行できないようにしています。 これは、再帰的なミニバッファの使用で初心者が混乱するのを避けるためです。 このようなコマンドをミニバッファから利用できるようにするには、 変数enable-recursive-minibuffersnil以外を設定します。


Node:Completion, Next:, Previous:Minibuffer Edit, Up:Minibuffer

補完

ある種の引数では、引数の値の入力に補完(completion)を利用できます。 補完とは、引数の一部分を打つと、Emacsがその残りの部分をすべて、 あるいは既存の入力部分から決定可能な限り残りの部分を補う機能です。

補完を使えるときには、<TAB>、<RET>、<SPC>の各キーは、 ミニバッファ内の既存のテキストをそれを含むより長い文字列に 補完するように再定義してあります。 補完は、引数を読み取るコマンドが用意した 補完候補群(completion alternatives)に対して 入力されたテキストとの一致をとることで行われます。 ?キーは、入力から補完可能な候補一覧を表示するように定義してあります。

たとえば、M-xがコマンド名を読み取るためにミニバッファを使っている場合、 M-xは、補完に備えて、 使用可能なすべてのEmacsコマンド名の一覧を用意します。 補完キーは、ミニバッファ内のテキストをすべてのコマンド名に照らし合わせて、 ミニバッファの既存の名前から導かれる名前の追加文字列を探し出して、 その文字列をそれまでに入力してあるテキストに付け加えます。 これにより、M-x insert-buffer <RET>と打つかわりに、 M-x ins <SPC> b <RET>と打つことが可能になるのです。

補完では、大文字小文字を区別します。 というのは、補完対象となる名前(バッファ名、ファイル名、コマンド名)の ほとんどでは、大文字小文字を区別しているからです。 したがって、foを、Fooとは補完しません。 大文字小文字を区別しない引数に対しては、補完も両者を区別しません。


Node:Completion Example, Next:, Up:Completion

補完の例

具体的な例で考えてみましょう。 M-x au <TAB>と打つと、 <TAB>はauで始まる候補(この場合はコマンド名)を探します。 auで始まるものには、auto-fill-modeauto-save-modeを 含めていくつかありますが、どれも少なくともauto-までは同じです。 そこで、ミニバッファ内のauauto-に変わります。

ここでただちに<TAB>をもう一度打っても、 つぎにくる文字の候補が複数、つまり、cfilrsのどれかなので、 さらに文字が追加されることはありません。 そのかわり、<TAB>は補完候補の一覧を別のウィンドウに表示します。

続けてf <TAB>と打つと、 今度の<TAB>は文字列auto-fを探します。 auto-fから始まるコマンド名はauto-fill-modeだけなので、 補完は残りの部分を補います。 これで、au <TAB> f <TAB>と打つだけで、 ミニバッファにはauto-fill-modeが入ります。 <TAB>キーがこのような効果を持つのは、 このキーがミニバッファ内ではコマンドminibuffer-completeに バインドしてあるからだということに注意してください。


Node:Completion Commands, Next:, Previous:Completion Example, Up:Completion

補完コマンド

補完を使えるミニバッファでは、 つぎのような補完コマンドを定義してあります。

<TAB>
ミニバッファのテキストを可能な限り補完する(minibuffer-complete)。
<SPC>
ミニバッファのテキストを1語だけ補完する(minibuffer-complete-word)。
<RET>
可能な限り補完したあと、ミニバッファのテキストを引数として渡す (minibuffer-complete-and-exit)。
?
ミニバッファのテキストから補完可能な候補の一覧を表示する (minibuffer-list-completions)。

<SPC>は<TAB>とほぼ同じように補完しますが、 つぎのハイフンや空白を超えて補完することはありません。 ミニバッファの文字がauto-fであるとしましょう。 ここで<SPC>を打つと、<SPC>はauto-fill-modeに補完できることを 探しだしますが、fill-までで補完を止めます。 その結果、auto-fill-となります。 ここでもう一度<SPC>を打つと、 今度はauto-fill-modeまで完全に補完します。 補完を行えるミニバッファ内では、<SPC>は コマンドminibuffer-complete-wordを実行します。

補完候補一覧を表示しているウィンドウから補完を選ぶには、 つぎのコマンドを使えます。

Mouse-2
補完候補一覧の候補上でマウスボタン2をクリックすると、 その補完を選択する(mouse-choose-completion)。 通常は、ポイントがミニバッファ内にあるときにこのコマンドを使うだろうが、 ミニバッファではなく候補一覧でクリックする必要がある。
<PRIOR>
M-v
ミニバッファで、<PRIOR>、<PAGE-UP>、M-vのいずれかを打つと、 補完候補一覧のバッファを表示しているウィンドウを選択できる (switch-to-completions)。 この機能は、以下のコマンドの利用を簡単にする。 (通常の方法でもそのウィンドウを選択できるが、この方法のほうが便利であろう。)
<RET>
補完候補一覧のバッファで<RET>を打つと、 ポイント位置にある補完かポイントに続く補完を選択する (choose-completion)。 このコマンドを使う場合、 補完候補一覧を表示しているウィンドウにまず移動する必要がある。
<RIGHT>
補完候補一覧のバッファで右向き矢印キー<RIGHT>を打つと、 ポイントはつぎの補完候補に移動する(next-completion)。
<LEFT>
補完候補一覧のバッファで左向き矢印キー<LEFT>を打つと、 ポイントはまえの補完候補に移動する(previous-completion)。


Node:Strict Completion, Next:, Previous:Completion Commands, Up:Completion

強い補完

ミニバッファでの補完において、 <RET>は引数の使われ方に依存して3種類の異なる動作を示します。

補完コマンドは、つぎにくる文字として複数の可能性がある場合、 補完可能な全候補一覧をウィンドウに表示します。 また、?と打てば、このような一覧を表示できます。 補完候補一覧が長いときには、 C-M-vでスクロールできます(see Other Window)。


Node:Completion Options, Previous:Strict Completion, Up:Completion

補完のオプション

ファイル名の補完を行う場面では、ある種のファイル名を通常無視します。 変数completion-ignored-extensionsは、文字列のリストを保持します。 これらの文字列の1つで終る名前のファイルは、補完候補としては無視します。 この変数の標準値には、".o"".elc"".dvi""~"が含まれます。 この効果は、たとえば、fooは、foo.oが存在したとしても、 foo.cに補完されます。 ただし、補完候補のすべてが無視すべき文字列で終るものである場合には、 これらの候補を無視しません。 無視した拡張子を持つものが補完候補一覧に入ることはありません。 一覧にはつねに補完可能な候補のすべてを表示します。

通常、補完コマンドは、つぎにくる文字を自動的に決定できない場合には、 すべての補完候補一覧を表示します。 変数completion-auto-helpnilが設定されていると、 一覧を表示しません。 補完候補を表示するには、?を打つ必要があります。

completeライブラリは、 一度に複数の単語を補完できる、より強力な補完機能を提供します。 たとえば、p-bと省略されたコマンド名を print-bufferと補完できます。 というのは、頭文字がpbである2つの単語で 始まるコマンドが他にはないからです。 このライブラリを使うには、個人の~/.emacsファイルに (load "complete")を入れておきます(see Init File)。

補完示唆(icomplete)モードでは、 それまでに入力したテキストから補完できるものを常時更新して表示します。 このマイナモードをオン/オフするコマンドはM-x icomplete-modeです。


Node:Minibuffer History, Next:, Previous:Completion, Up:Minibuffer

ミニバッファ履歴

ミニバッファで入力した引数はすべてミニバッファ履歴リスト (minibuffer history list)に保存され、 あとで別の引数中で使うことができます。 特別のコマンドで、以前に使った引数のテキストをミニバッファに入れます。 これらは、ミニバッファの古い内容を破棄するので、 過去の引数の履歴の中を動き廻っていると考えることができます。

<UP>
M-p
ミニバッファ履歴中の1つまえ(古い)の引数文字列に移動する (previous-history-element)。
<DOWN>
M-n
ミニバッファ履歴中の1つつぎ(新しい)の引数文字列に移動する (next-history-element)。
M-r regexp <RET>
ミニバッファ履歴中の引数文字列を古いほうへ遡って regexpに一致するものに移動する (previous-matching-history-element)。
M-s regexp <RET>
ミニバッファ履歴中の引数文字列を新しいほうへ辿って regexpに一致するものに移動する (next-matching-history-element)。

履歴リストに保存されている引数を再利用するもっとも簡単な方法は、 履歴リストの中を1つ1つ移動していくことです。 ミニバッファの中では、1つまえ(古い)のミニバッファの入力内容に 『移動する』にはM-pprevious-history-element)を、 1つあと(新しい)の入力内容に移動するには M-nnext-history-element)を打ちます。

ミニバッファの内容は、履歴から持ってきた以前の入力内容で完全に 置き換えられます。 この内容を引数として使うには、 通常と同じように<RET>でミニバッファを抜けます。 引数として再使用するまえに、テキストを編集してもかまいません。 編集してもミニバッファに『持ってきた』履歴のもともとの要素は変更されません。 ただし、当然、新しい引数は履歴リストの最後に追加されます。

多くのミニバッファ引数には、デフォルト値があります。 ミニバッファ履歴操作コマンドが、 これらのデフォルト値を知っている場合もあります。 その場合、M-nで履歴中の『未来』へ移動する 12 ことで、このデフォルト値をテキストとしてミニバッファに挿入できます。 将来的には、ミニバッファにデフォルト値がある場合には、 つねにこの機能を利用できるようにしたいと考えています。

履歴の中を前向きや後向きに探索するコマンドもあります。 これらのコマンドは、ミニバッファで指定した正規表現に 一致する履歴要素を探索します。 M-rprevious-matching-history-element)は、 履歴のより古い要素を探します。 一方、M-snext-matching-history-element)は、 より新しい要素を探します。 特例なのですが、 これらのコマンドは、コマンドを呼び出す時点で すでにミニバッファに入っているにも関わらず、 ミニバッファから引数を読み取ります。 インクリメンタルサーチの場合と同様に、 正規表現に大文字を使うと、大文字小文字を区別して探索します (see Search Case)。

ミニバッファを使えば入力は必ず履歴リストに記録されますが、 引数の種類ごとに別々の履歴リストがあります。 たとえば、ファイル名に関する履歴リストは、 ファイル名を読み取るすべてのコマンドで使われます。 (特別な機能として、この履歴リストには、 絶対ファイル名を入力しなくても絶対ファイル名が記録される。)

特定目的用の履歴リストがいくつかあります。 M-xが読むコマンド名用、バッファ名用、 query-replaceのようなコマンドの引数用、 compileが読むコンパイルコマンド用などです。 さらに、ほとんどのミニバッファ引数が利用する 『その他』の履歴リストも1つあります。

変数history-lengthは、ミニバッファ履歴リストの最大長を指定します。 履歴リストが設定された長さに達すると、 そのあとは、新しい要素を追加するたびに最古の要素を削除します。 ただし、変数history-lengthの値がtであると、 長さの制限はなくなり要素を削除しません。


Node:Repetition, Previous:Minibuffer History, Up:Minibuffer

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

ミニバッファを少なくとも1回使ったコマンドは、 その引数の値とともにすべて特別な履歴リストに記録されますから、 コマンド全体を繰り返すことができます。 特に、M-xはコマンド名を読み取るためにミニバッファを使うので、 必ず履歴に記録されます。

C-x <ESC> <ESC>
最近のミニバッファコマンドを再実行する(repeat-complex-command)。
M-x list-command-history
C-x <ESC> <ESC>で繰り返せるすべてのコマンドを 新しいものから順に並べたコマンド履歴全体を表示する。

C-x <ESC> <ESC>は、 ミニバッファを利用した最近のコマンドを再度実行します。 引数を指定しなければ、そのような最後のコマンドを繰り返します。 数引数は、どのコマンドを繰り返すかを指定します。 1は最後のコマンドを指し、大きい数ほどより以前のコマンドを指します。

C-x <ESC> <ESC>は、過去のコマンドをLisp式に変換し、 その式のテキストで初期化したミニバッファに入ります。 <RET>だけを打てば、コマンドは以前とまったく同様に繰り返されます。 Lisp式を編集してコマンドを変更してもかまいません。 最終的な式が何であれ、その式を実行します。 繰り返したコマンドは、 履歴リスト内に既存の最後に実行したコマンドと同一でない限り、 コマンド履歴の先頭に追加されます。

Lisp構文が理解できないとしても、 繰り返しのためにどのコマンドが表示されたか、たぶんわかるでしょう。 テキストを変更しなければ、以前とまったく同じに繰り返されます。

C-x <ESC> <ESC>でいったんミニバッファに入ってしまえば、 ミニバッファ履歴リストコマンド (M-pM-nM-rM-s、see Minibuffer History) を使って、保存されたすべてのコマンドの履歴リストの中を動き廻れます。 目的のコマンドを捜しあてたら、通常の方法でその式を編集できますし、 これも通常と同じように<RET>を打てば実行できます。

ミニバッファを使った過去のコマンド一覧は、 Lispのリストとして変数command-historyに格納されます。 各要素はそれぞれ1つのコマンドとその引数を表すLisp式です。 Lispプログラムからは、 command-historyの要素を引数として evalを呼べばコマンドを再実行できます。


Node:M-x, Next:, Previous:Minibuffer, Up:Top

名前でコマンドを実行する方法

使用頻度の高いコマンドや素早い打鍵が必要なEmacsコマンドは、 使い勝手をよくするために、キー(文字の短い列)にバインドしてあります。 短縮する必要のないその他のEmacsコマンドはキーにバインドしてありません。 これらのコマンドを実行するには、コマンド名を使う必要があります。

慣習として、コマンド名は1単語かハイフンで区切った2語以上の単語です。 たとえば、auto-fill-modemanual-entryです。 たとえ打鍵文字数が多くなったとしても、 (意図が)不明瞭な文字数個をキーとして使うよりも、 英単語をコマンド名として使うほうが覚えやすいのです。

コマンドをその名前で実行するには、M-xで始めて、 コマンド名を打ち込み、<RET>で終えます。 M-xは、コマンド名を読むためにミニバッファを使います。 <RET>キーはミニバッファを抜けてコマンドを実行します。 このとき、プロンプトとして文字列M-xを ミニバッファの先頭に表示して、 実行するコマンド名を入力しなければならないことをユーザーに示します。 ミニバッファの詳細については、See Minibuffer

コマンド名の入力には、補完を使えます。 たとえば、つぎのように打って、 コマンドforward-charを起動できます。

M-x forward-char <RET>

あるいは、

M-x forw <TAB> c <RET>

とします。 ここで、forward-charは、 C-fキーで起動されるコマンドと同じです。 コマンドがキーにバインドしてあるかどうかに関わらず、 M-xですべてのEmacsコマンドを名前で起動できます。

コマンド名を入力中にC-gを打つと、 M-xコマンドを取り消してミニバッファから抜け出し、 最終的にはトップレベルに戻ります。

M-xで起動するコマンドに数引数を渡すには、 M-xを打つまえに、数引数を指定します。 M-xは、実行する関数に引数を渡します。 引数の値は、コマンド名を読み込んでいるあいだ、プロンプトに表示されます。

入力したコマンドに専用のキーバインドがある場合には、 Emacsはその旨エコー領域に表示します。 この表示は、コマンドの実行が終了したあと、2秒間表示されます (すぐに何かを打てば、この限りではない)。 たとえば、コマンドM-x forward-wordを入力した場合、 M-fと打ったほうが簡単に同じコマンドを実行できるという意味の メッセージが表示されます。 suggest-key-bindingsnilを設定すれば、 これらのメッセージ表示をオフにできます。

本書では、名前で実行するコマンドの説明において、 名前を終えるために必要な<RET>を省略します。 つまり、M-x auto-fill-mode <RET>ではなく、 M-x auto-fill-modeとします。 コマンド名に続く引数も示す場合のように、 <RET>が必要なことを強調する場合にのみ、 <RET>を書きます。

M-xは、execute-extended-commandを実行することで動作します。 execute-extended-commandは、 他のコマンドの名前を読み取って、それを実行する役割を担うコマンドです。


Node:Help, Next:, Previous:M-x, Up:Top

ヘルプ機能

Emacsには、C-hのたった1文字で呼び出せる 高度なヘルプ機能があります。 C-hは、説明文表示コマンドのためだけに使われるプレフィックスキーです。 C-hのあとに打つ文字(列)を ヘルプオプション(help options)と呼びます。 C-hもヘルプオプションの1つであって、 C-hの使い方を調べることができます。 途中で取り消すには、C-gを打ちます。 ファンクションキー<F1>は、C-hと等価です。

C-h C-hhelp-for-help)は、 利用可能なヘルプオプションの一覧を簡素な説明とともに表示します。 ヘルプオプションを打つまでは、 <SPC>や<DEL>で一覧をスクロールできます。

C-hや<F1>は、他のさまざまな状況でも『ヘルプ』を意味します。 たとえば、query-replaceの実行中には、 今一致している文字列に対して適用可能な操作を説明します。 プレフィックスキーに続けてC-hや<F1>を打つと、 そのプレフィックスキーに続けることができるキーの一覧を表示します。 (C-hに独自の意味を定義しているプレフィックスキーもあり、 そのような場合にはC-hを使えない。 しかし、<F1>はすべてのプレフィックスキーで使える。)

ほとんどのヘルプバッファでは、特別なメジャーモードである ヘルプ(help)モードを使います。 ヘルプ(help)モードでは、 <SPC>と<DEL>で画面を簡単にスクロールできます。

定義されているヘルプコマンドを以下にまとめておきます。

C-h a regexp <RET>
正規表現regexpに一致する名前を持つコマンドの一覧を表示する (apropos-command)。
C-h b
現在有効なすべてのキーバインドの一覧を、 マイナモードのバインディング、 メジャーモードのバインディング、 グローバルバインディングの順に表示する (describe-bindings)。
C-h c key
keyが実行するコマンドの名前を表示する(describe-key-briefly)。 ここで、cは『character』(文字)のcのこと。 keyのさらに詳しい情報を得るには、C-h kを使う。
C-h f function <RET>
Lisp関数functionの説明文を表示する (describe-function)。 コマンドはLisp関数なので、コマンド名も使える。
C-h h
さまざまな文字集合の例文を例示するhelloファイルを表示する。
C-h i
ドキュメントファイルを閲覧するプログラム、 infoを起動する(info)。 infoでは、完全なEmacsマニュアルをオンラインで見ることができる。
C-h k key
keyが実行するコマンドの名前と説明文を表示する (describe-key)。
C-h l
これまでに打鍵した最後の100文字を表示する(view-lossage)。
C-h m
現在のメジャーモードの説明文を表示する (describe-mode)。
C-h n
Emacsの変更点に関する説明を最新のものから順に表示する (view-emacs-news)。
C-h p
トピックのキーワードで、一致するパッケージを探す (finder-by-keyword)。
C-h s
現在の構文テーブルとその意味の説明を表示する (describe-syntax)。 see Syntax
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 I method <RET>
入力方式を説明する(describe-input-method)。
C-h L language-env <RET>
言語環境language-envにおいて使われる、 文字集合、コーディングシステム、入力方式を説明する (describe-language-environment)。
C-h C-c
GNU Emacsのコピーライトを表示する。
C-h C-d
GNU Emacsの新版の入手方法に関する情報を表示する。
C-h C-f function <RET>
infoに入って、Emacsの関数functionを説明しているノードに移動する (Info-goto-emacs-command-node)。
C-h C-k key
infoに入って、キー列keyを説明しているノードに移動する (Info-goto-emacs-key-command-node)。
C-h C-p
GNUプロジェクトに関する情報を表示する。
C-h <TAB> symbol <RET>
編集中のプログラム言語に応じて、 シンボルsymbolに関するinfoドキュメントを表示する (info-lookup-symbol)。


Node:Key Help, Next:, Previous:Help Summary, Up:Help

キーに関する説明

C-hのもっとも基本的なオプションは、 C-h cdescribe-key-briefly)と C-h kdescribe-key)です。 C-h c keyは、 keyにバインドしてあるコマンド名をエコー領域に表示します。 たとえば、C-h c C-fと打てばforward-charと表示されます。 コマンド名はそのコマンドが何をするかを表すように選んでありますから、 キーkeyが何をするかをちょっと調べたい場合に、よい方法です。

C-h k keyも同様ですが、より多くの情報を表示します。 つまり、コマンドの名前だけでなく、説明文も表示します。 その内容はエコー領域に表示するには多すぎるため、 ウィンドウに表示します。

C-h cC-h kは、ファンクションキーやマウスイベントも含めた、 あらゆるキー列に適用できます。


Node:Name Help, Next:, Previous:Key Help, Up:Help

コマンド名や変数名によるヘルプ表示

C-h fdescribe-function)は、 ミニバッファでLisp関数の名前を読み取り、 その関数の説明文字列をウィンドウに表示します。 コマンドはLisp関数ですから、 名前を知っているコマンドであれば、 その説明文を得ることができます。 たとえば、

C-h f auto-fill-mode <RET>

とすると、auto-fill-modeの説明文字列を表示できます。 どのキーにもバインドしていない (つまり、通常M-xで起動する)コマンドの説明文字列を見るには、 この方法しかありません。

C-h fはまた、 Lispプログラムの中で使おうと考えているLisp関数に対しても有益です。 たとえば、式(make-vector len)を書いたとしましょう。 make-vectorを正しく使っているかどうか調べたいときには、 C-h f make-vector <RET>と打ちます。 C-h fは、コマンド名だけでなく、すべての関数名に適用できるので、 普段M-xで使えている省略形がC-h fでは使えないかもしれません。 ある省略形がコマンド名としては一意であったとしても、 他の関数名を含めてみると一意ではない場合もあります。

ミニバッファで<RET>だけを打ってミニバッファが空の場合、 C-h fに与えられる関数名にはデフォルト値があります。 デフォルト値は、バッファ内のポイント周辺でもっとも内側のLisp式で 呼び出される関数ですが、それが定義された正しいLisp関数の名前で ある場合に限ります。 たとえば、(make-vector (car x)というテキストの直後にポイントがあると、 ポイントを含むもっとも内側のリストは(make-vectorから始まる部分なので、 デフォルトは関数make-vectorです。

C-h fは、関数名の綴りが正しことを 単に確認するためだけにも役立ちます。 C-h fがバッファ内の名前をデフォルトとして表示すれば、 その名前はLisp関数として定義されているはずです。 これだけを確認したいのであれば、 C-gを打ってC-h fコマンドを取り消して、編集を続けます。

C-h w command <RET>は、 どのキーをcommandにバインドしてあるかを表示します。 キーの一覧をエコー領域に表示します。 どのキーにも割り当てられていないと表示された場合は、 そのコマンドはM-xで起動する必要があります。 C-h wはコマンドwhere-isを実行します。

C-h vdescribe-variable)はC-h fに似ていますが、 Lisp関数ではなくLisp変数を説明する点が異なります。 デフォルトはポイント周辺またはポイントの直前のLispシンボルですが、 既知のLisp変数に限ります。 See Variables


Node:Apropos, Next:, Previous:Name Help, Up:Help

アプロポス

より洗練された質問方法としては、『ファイルを扱うコマンドは?』と いうのがあります。 このように質問するには、C-h a file <RET>と打ちます。 すると、copy-filefind-fileといった、 fileを名前に含むすべてのコマンドの一覧が表示されます。 各コマンドには、使い方の簡単な説明や そのコマンドを起動するキーが表示されます。 たとえば、find-fileを起動するにはC-x C-fと打つ、 といった具合です。 C-h aaは「Apropos」(「適切な」の意味)を表していて、 C-h aはコマンドapropos-commandを実行します。 このコマンドは、通常、コマンド(対話的な関数)のみを調べます。 前置引数を指定すれば、非対話的な関数も調べます。

C-h aは指定した文字列を名前に含む関数しか調べませんので、 文字列の指定には工夫が必要です。 後向きに文字をキルするコマンドを探そうとして、 C-h a kill-backwards <RET>で 何も表示されなくてもあきらめないでください。 killのみ、あるいはbackwardsのみ、 もしくはbackのみを試して、続けてください。 柔軟性を増すために、引数として正規表現も使えます (see Regexps)。

以下に、C-h aに指定する引数のうち、 Emacsコマンドの多くの種類を網羅するものをあげておきます。 というのは、Emacsコマンドの標準の命名法には強い慣行があるからです。 命名法の慣行を理解してもらえば、 適切な(apropos)文字列を拾い出す技法の向上の手助けにもなるでしょう。

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。

正規表現に一致するすべてのユーザー変数を表示するには、 コマンドM-x apropos-variableを使います。 このコマンドは、デフォルトでは、ユーザー変数とカスタマイズオプションだけを 表示します。 すべての変数を調べるには、前置引数を指定します。

コマンドとして定義されているものだけでなく、 正規表現に一致するすべてのLispシンボルを表示するには、 C-h aのかわりにM-x aproposを使います。 このコマンドは、デフォルトでは、キーバインドを調べません。 キーバインドを調べるには、前置引数を指定します。

apropos-documentationコマンドはaproposに似ていますが、 指定した正規表現に一致するシンボル名だけでなく、 説明文字列も探索する点が異なります。

apropos-valueコマンドはaproposに似ていますが、 指定した正規表現に一致するシンボルの値を探す点が異なります。 このコマンドは、デフォルトでは、関数定義や属性リストを調べません。 それらも調べるには、前置引数を指定します。

変数apropos-do-allnil以外ならば、 上に述べたコマンドはすべて、前置引数を指定したものとして動作します。

アプロポス(apropos)バッファに表示された関数定義、 変数、属性リストについて詳しく知りたいときには、 Mouse-2ボタンでクリックするか、 その箇所へ移動して<RET>を打ちます。


Node:Library Keywords, Next:, Previous:Apropos, Up:Help

Lispライブラリに対するキーワード探索

C-h pコマンドで、 標準Emacs Lispライブラリをトピックのキーワードで検索できます。 利用可能なキーワードの一部を以下に示します。

abbrev --- 略語操作、短縮入力、マクロ。
bib --- 参考、参照プロセッサ支援bib。
c --- C言語あるいはC++支援。
calendar --- 日付および時間管理支援。
comm --- 通信、ネットワーク、ファイルのリモートアクセス。
data --- データファイルの編集支援。
docs --- Emacsドキュメントに関する支援。
emulations --- 他のエディタのエミュレーション。
extensions --- Emacs Lisp言語の拡張。
faces --- フェイス(フォントや表示色、see Faces)に関する支援。
frames --- Emacsフレームやウィンドウシステムに対する支援。
games --- ゲーム、ジョーク、娯楽。
hardware --- 外部ハードウェアとのインターフェイス支援。
help --- オンラインヘルプシステム支援。
hypermedia --- テキストあるいは他メディア内でのリンク支援。
i18n --- 国際化、代替文字集合支援。
internal --- Emacs内部コード、構築手順、デフォルト。
languages --- プログラム言語編集用の特殊モード。
lisp --- Lisp利用支援(Emacs Lispも含む)。
local --- サイトにローカルなライブラリ。
maint --- Emacs開発グループ向けの管理用。
mail --- 電子メイル操作用のモード。
matching --- 探索、一致。
news --- ネットニュースの購読、投稿支援。
non-text --- 非テキストファイル編集支援。
oop --- オブジェクト指向プログラミング支援。
outlines --- 階層アウトライン。
processes --- プロセス、サブシェル、コンパイル、ジョブ制御支援。
terminals --- 端末タイプ支援。
tex --- TeXによる文書整形支援。
tools --- プログラミングツール。
unix --- UNIX機能のフロントエンド/アシスタントあるいはエミュレーション。
vms --- VMS支援コード。
wp --- ワープロ。


Node:Language Help, Next:, Previous:Library Keywords, Up:Help

多言語支援に関するヘルプ

コマンドC-h Ldescribe-language-environment)を使うと、 特定の言語環境向けに、どのような支援があるかを把握できます。 See Language Environments。 このコマンドは、今の言語環境がどの言語向けなのかを示し、 一緒に使われる文字集合、コーディングシステム、入力方式も表示します。 また、字体を例示するためのサンプルテキストもいくつか表示します。

コマンドC-h hview-hello-file)は、 ファイルetc/HELLOを表示します。 このファイルには、いろいろな国の言葉で書いた『hello』を収めてあります。

コマンドC-h Idescribe-input-method)は、 指定した入力方式、あるいは、デフォルトとして 今使っている入力方式についての情報を表示します。 See Input Methods

コマンドC-h Cdescribe-coding-system)は、 指定したコーディングシステム、あるいは、デフォルトとして 今使っているコーディングシステムについての情報を表示します。 See Coding Systems


Node:Help Mode, Next:, Previous:Language Help, Up:Help

ヘルプモードのコマンド

ヘルプバッファには、閲覧(view)モード(see Misc File Ops)の コマンドに加えて、独自の特別なコマンドもいくつかあります。

<SPC>
前向きにスクロールする。
<DEL>
後向きにスクロールする。
<RET>
ポイント位置の相互参照を辿る。
<TAB>
つぎの相互参照へ進む。
S-<TAB>
まえの相互参照へ戻る。
Mouse-2
クリックした相互参照を辿る。

説明文に現れるコマンド名(see M-x)や変数名(see Variables)は 通常、引用符(')で囲まれています。 その名前をMouse-2でクリックしたり、あるいは、 そこへポイントを移動して<RET>を打つと、 そのコマンドや変数の説明文字列を表示できます。 もとの場所に戻るにはC-c C-bを使います。

ヘルプテキスト内の相互参照にポイントを移動する便利なコマンドがあります。 <TAB>(help-next-ref)は、 ポイントをつぎの相互参照箇所へ進めます。 ポイントをまえの相互参照箇所へ戻すには S-<TAB>help-previous-ref)を使います。


Node:Misc Help, Previous:Help Mode, Up:Help

その他のヘルプコマンド

C-h iinfo)はinfoプログラムを実行します。 infoは構造化されたドキュメントファイルを閲覧するプログラムです。 Emacsの完全なマニュアルもinfoで読むことができます。 将来的には、GNUシステムのすべてのドキュメントが読めるようになるでしょう。 infoの使い方についてのチュートリアルを起動するには、 infoに入ってからhと打ちます。

数引数を指定すると、C-h iはドキュメントファイルの名前を聞いてきます。 こうすれば、トップレベルのinfoメニューに記載されていない ファイルでも閲覧できます。

infoを介してEmacsドキュメントを参照するための 特別なヘルプコマンドが2つあります。 C-h C-f function <RET>は、 infoに入ってただちにEmacsの関数functionのドキュメントに移動します。 C-h C-k keyは、 infoに入ってただちにキーkeyのドキュメントに移動します。 これら2つのキーは、それぞれ、 Info-goto-emacs-command-nodeInfo-goto-emacs-key-command-nodeを実行します。

プログラム言語のinfo版のマニュアルがあれば、 プログラムの編集中にコマンドC-h C-iを使って、 マニュアルドキュメントの シンボル(キーワード、関数、変数)に関する箇所を参照できます。 コマンドの細かい動作は、メジャーモードに依存します。

予期しなかったことが起きたり、 入力したコマンドがわからなくなってしまったときは、 C-h lview-lossage)を使ってください。 C-h lは、それまでに打鍵した最後の100個のコマンド文字を表示します。 知らないコマンドが表示されたら、C-h cでその機能を知ることができます。

Emacsには数多くのメジャーモードがあり、各メジャーモードでは、 いくつかのキーを再定義し、編集動作も少々変更しています。 C-h mdescribe-mode)は、 使用中のメジャーモードについての説明文を表示します。 これには、通常、モード内で変更してある すべてのコマンドについての記述があります。

C-h bdescribe-bindings)と C-h sdescribe-syntax)は、 Emacsの現在のモードに関するその他の情報を与えてくれます。 C-h bは、現在有効なすべてのキーバインドの一覧を表示します。 マイナモードで定義されているローカルバインディングから始めて、 現在のメジャーモードで定義されているローカルバインディング、 最後にグローバルバインディングを表示します (see Key Bindings)。 C-h sは、各文字の構文の説明を付けて 構文テーブルの内容を表示します(see Syntax)。

プレフィックスキーに続けてC-hを打てば、 特定のプレフィックスキーについて同様な一覧を表示できます。 (この方法では表示できないプレフィックスキーも存在する。 それらのキーでは、C-hに対しては独自のバインディングがある。 <ESC>は、そのようなものの1つ。 <ESC> C-hは、実際にはC-M-hであり、 関数定義(defun)をマークする。)

C-hの他のオプションは、 有益な情報を収めたさまざまなファイルを表示します。 C-h C-wは、 GNU Emacsがまったく無保証であることに関する全詳細を表示します。 C-h nview-emacs-news)は、 ファイルemacs/etc/NEWSを表示します。 このファイルには、Emacsの変更に関する記述を時間順に収めてあります。 C-h Fview-emacs-FAQ)は、 Emacsの「よくある質問集」を表示します。 C-h thelp-with-tutorial)は、 「操作しながらEmacsを学ぶ」チュートリアルを表示します。 C-h C-cdescribe-copying)は、 ファイルemacs/etc/COPYINGを表示します。 このファイルには、Emacsを配布する場合に従うべき条件を記述してあります。 C-h C-ddescribe-distribution)は、 ファイルemacs/etc/DISTRIBを表示します。 このファイルには、Emacsの最新版の注文方法を述べてあります。 C-h C-pdescribe-project)は、 GNUプロジェクトに関する一般情報を表示します。


Node:Mark, Next:, Previous:Help, Up:Top

マークとリージョン

Emacsの数多くのコマンドは、カレントバッファの任意の連続領域を操作します。 このようなコマンドに操作対象となるテキストを指定するには、 その一方の端にマーク(mark)を置き、 もう一方の端にポイントを移動します。 ポイントとマークに挟まれたテキストをリージョン(region)と呼びます。 暫定マーク(transient-mark)モードをオンにすると、 リージョンが存在すれば Emacsはつねにそのリージョンを強調表示します (see Transient Mark)。

リージョンの境界を調整するには、ポイントやマークを移動します。 時間的にどちらを先に設定したとか、 テキスト内でどちらが先にあるかとかは関係ありません。 いったんマークを設定すると、他の箇所に再設定するまで、 その位置情報はそのまま変わりません。 各Emacsバッファには個別にマークがありますから、 以前に選択したバッファへ戻ったときには、 以前と同じままのマークが残っています。

C-yyank)やM-x insert-bufferなどのテキストを 挿入するコマンドの多くは、挿入したテキストの両端にポイントとマークを置いて、 挿入したテキストがリージョンに含まれるようにします。

リージョンの境界を定めること以外に、 あとで戻る可能性のある箇所を覚えておくためにもマークを使えます。 この機能をより使いやすくするために、 各バッファでは、それまでに設定した16個のマーク位置を マークリング(mark ring)に記録しています。


Node:Setting Mark, Next:, Up:Mark

マークを設定する

マークを設定するコマンドはつぎのとおりです。

C-<SPC>
ポイント位置にマークを置く(set-mark-command)。
C-@
上と同様。
C-x C-x
マークとポイントを入れ換える(exchange-point-and-mark)。
Drag-Mouse-1
ドラッグしたテキストの周囲にポイントとマークを設定する。
Mouse-3
ポイント位置にマークを設定し、クリックした箇所にポイントを移動する (mouse-save-then-kill)。

たとえば、コマンドC-x C-uupcase-region)を使って、 バッファのある部分をすべて大文字に変換したいとしましょう。 このコマンドは、リージョン中のテキストに作用します。 まず、大文字に変換したいテキストの先頭に移動し、 C-<SPC>と打ってマークを設定します。 続いてテキストの終端に移動してC-x C-uと打ちます。 あるいは、先にテキストの終端にマークを設定して、 テキストの始点に移動してからC-x C-uと打ちます。

マークを設定するもっとも一般的な方法は、 C-<SPC>コマンド(set-mark-command)を使うことです。 このコマンドは、ポイント位置にマークを設定します。 そうすれば、マークを置いたままで、ポイントを移動できます。

マウスを使ったマークの設定方法は2つあります。 テキストのある範囲でマウスボタン1をドラッグします。 マウスボタンを離した位置にポイントが置かれ、 ドラッグを開始した箇所にマークが設定されます。 あるいは、マウスボタン3をクリックします。 これは(C-<SPC>と同様に)ポイント位置にマークを設定してから、 ポイントを(Mouse-1のように)移動します。 両者は、マークを設定するだけでなく、リージョンをキルリングにコピーします。 これは、他のウィンドウアプリケーションの動作と一貫性を持たせるためです。 キルリングを変更したくなければ、 キーボードコマンドを使ってマークを設定する必要があります。 See Mouse Commands

普通の端末にはカーソルは1つしかありませんから、 Emacsにはマークを置いた位置を表示する術はありません。 ユーザーがその位置を覚えておく必要があります。 この問題に対する通常の解決方法は、マークを設定したら、 忘れてしまうまえにただちにそれを利用することです。 あるいは、C-x C-xexchange-point-and-mark)コマンドを使って、 マーク位置を確認します。 このコマンドは、ポイント位置にマークを置き、 マークのあった位置にポイントを置きます。 リージョンの範囲は変わらずに、 カーソルとポイントは以前マークのあった箇所に移動します。 暫定マーク(transient-mark)モードでは、 このコマンドはマークを再度活性にします。

ポイント位置を変えずに、 リージョンのもう一方の端(マークの位置)を移動させたい場合にも、 C-x C-xは便利な方法です。 まず、C-x C-xでポイントをリージョンの一方の端に移して、 その端を移動します。 必要ならば、もう1度C-x C-xを使って新しい位置にマークを置き、 ポイントをもとの位置に戻します。

ASCIIには、C-<SPC>という文字は存在しません。 <CTRL>を押し下げながら<SPC>を打つと、 ほとんどの普通の端末では文字C-@になります。 このキーは、実際にset-mark-commandにバインドしてあります。 ただし、幸運にもC-<SPC>C-@を送出する端末を 使っているのであれば、 C-@C-<SPC>とみなしてかまいません。 Xウィンドウシステムでは、C-<SPC>は実際には 別の文字として認識されますが、 そのバインドはやはりset-mark-commandです。


Node:Transient Mark, Next:, Previous:Setting Mark, Up:Mark

暫定マークモード(transient-markモード)

Xウィンドウシステムを使っているのであれば、 Emacsはカレントリージョンを強調表示できます。 ただし、通常はリージョンを強調表示しません。 なぜでしょうか?

実は、もともとのEmacsではリージョンの強調表示をうまくできないのです。 いったんマークを設定してしまうと、 そのバッファ内にはつねにリージョンが存在することになるからです。 リージョンを強調表示し続けても迷惑なだけでしょう。

暫定マーク(transient-mark)モードをオンにすると、 リージョンの強調表示機能をオンにできます。 暫定マーク(transient-mark)モードは、 リージョンが一時的にしか『存続』しない、 通常よりきびしい操作モードです。 ユーザーは、リージョンを使うコマンドごとにリージョンを設定する必要があります。 暫定マーク(transient-mark)モードでは、 ほとんどの期間、リージョンは存在しません。 それゆえ、リージョンが存在するときにリージョンを強調表示しても 邪魔になりません。

暫定マーク(transient-mark)モードをオンにするには、 M-x transient-mark-modeと打ちます。 このコマンドはモードのオン/オフを切り替えますから、 モードをオフにしたいときにはコマンドをもう1度繰り返します。

暫定マーク(transient-mark)モードの詳細を以下に示します。

リージョンの強調表示には、regionフェイスを使います。 このフェイスを変更すれば、リージョンの強調表示方法をカスタマイズできます。

複数のウィンドウで同じバッファを表示しているときには、 それぞれのウィンドウで別の部分を表示できます。 というのは、(マーク位置は共有されるが) 各ウィンドウごとに別々にポイントの値があるからです。 通常、選択されたウィンドウでのみ、 リージョンを強調表示します(see Windows)。 しかし、変数highlight-nonselected-windowsnil以外を設定すると、 (暫定マーク(transient-mark)モードがオンであり、かつ、 ウィンドウのバッファのマークが活性である場合に限り) 各ウィンドウでそれぞれのリージョンを強調表示します。

暫定マーク(transient-mark)モードがオフであると、 マークを設定するすべてのコマンドはマークを活性にし、 マークを不活性にするものは何もありません。

暫定マーク(transient-mark)モードにおいて、 変数mark-even-if-inactivenil以外であると、 マークが不活性であってもコマンドはマークやリージョンを利用できます。 通常の暫定マーク(transient-mark)モードと同様に、 リージョンが強調表示されたりされなかったりしますが、 強調表示されていなくてもマークが本当になくなることはありません。

暫定マーク(transient-mark)モードは『zmacsモード』としても知られています。 というのも、MITのLispマシン上で動作していたZmacsエディタが 同じようにマークを扱っていたからです。


Node:Using Region, Next:, Previous:Transient Mark, Up:Mark

リージョンに対する操作

いったんリージョンを設定しマークを活性にすれば、 以下のようにリージョンを操作できます。

リージョン内のテキストを操作するコマンドの多くは、 その名前にregionという単語を含みます。


Node:Marking Objects, Next:, Previous:Using Region, Up:Mark

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

単語、リスト、段落、ページといったテキストのまとまりに ポイントやマークを置くコマンドがあります。

M-@
つぎの語の末尾にマークを設定する(mark-word)。 このコマンドとつぎのコマンドはポイントを移動しない。
C-M-@
つぎのLisp式の末尾にマークを設定する(mark-sexp)。
M-h
現在の段落を囲むリージョンを設定する(mark-paragraph)。
C-M-h
現在のLisp関数定義(defun)を囲むリージョンを設定する(mark-defun)。
C-x h
バッファ全体をリージョンとする(mark-whole-buffer)。
C-x C-p
現在のページを囲むリージョンを設定する(mark-page)。

M-@mark-word)がつぎの語の末尾にマークを設定するのに対し、 C-M-@mark-sexp)はつぎのLisp式の末尾にマークを設定します。 これらのコマンドは、M-fC-M-fと同様に引数を扱います。

その他のコマンドは、ポイントとマークの両方を設定して、 バッファ内で対象物を区切ります。 たとえば、M-hmark-paragraph)は、 ポイントを囲むあるいはポイントに続く段落の先頭にポイントを移動し、 その段落の末尾にマークを置きます(see Paragraphs)。 このようにリージョンを設定するので、 段落全体を字下げしたり、大文字小文字を変換したり、キルしたりできます。

C-M-hmark-defun)も同様に、 現在の関数定義や後続の関数定義の先頭にポイントを置き、 その末尾にマークを置きます(see Defuns)。 C-x C-pmark-page)は、 現在のページの先頭にポイントを置き、 その末尾にマークを置きます(mark-page)。 マークはページ区切りの直後に設定され(リージョンに含まれる)、 一方、ポイントはページ区切りの直後に置かれます(リージョンに含まれない)。 数引数で、現在のページのかわりに(正ならば)後続のページや、 (負ならば)先行するページを指定できます。

最後に紹介するC-x hmark-whole-buffer)は、 バッファ全体にリージョンを設定します。 つまり、ポイントをバッファの先頭に置き、 マークをバッファの末尾に置きます。

暫定マーク(transient-mark)モードでは、 これらのコマンドはすべて、マークを活性にします。


Node:Mark Ring, Next:, Previous:Marking Objects, Up:Mark

マークリング

マークには、リージョンを区切る以外にも、 あとで戻る可能性のある箇所を記録するという便利な使い方があります。 この機能をより便利にするために、 各バッファでは以前の16箇所のマーク位置を マークリング(mark ring)に記録しています。 マークを設定するコマンドは、古いマークをこのマークリングに入れます。 マークを設定していた箇所に戻るには、 C-u C-<SPC>(またはC-u C-@)を使います。 これは、set-mark-commandコマンドに数引数を指定したものです。 このコマンドは、マークがあった箇所にポイントを移動し、 それ以前のマークを収めたマークリングからマークを復元します。 したがって、このコマンドを繰り返すと、 マークリング上にある過去のマークのすべてを1つ1つ遡って移動できます。 このように辿ったマーク位置は、マークリングのうしろに付け加えられるので、 なくなってしまうことはありません。

各バッファには独自のマークリングがあります。 すべての編集コマンドは、カレントバッファのマークリングを使います。 特に、C-u C-<SPC>は、つねに同じバッファに留まります。

M-<beginning-of-buffer)のような長距離を 移動するコマンドの多くは、まずマークを設定して、 古いマークをマークリングに保存してから動作を開始します。 このようにして、あとで簡単に戻れるようにしておきます。 探索コマンドは、ポイントを移動するときにはマークを設定します。 コマンドがマークを設定したかどうかは、 エコー領域にMark Setと表示されるのでわかります。

何度も同じ場所に戻りたい場合には、マークリングでは不十分でしょう。 このような場合には、あとで使うために位置情報をレジスタに記録できます (see RegPos)。

変数mark-ring-maxは、マークリングに保存する最大項目数を指定します。 すでに多くの項目が存在していて、さらにもう1つ押し込むときには、 リスト内の最古の項目を捨てます。 C-u C-<SPC>を繰り返し実行すると、 いまマークリングに入っている位置を巡回することになります。

変数mark-ringは、最新のマーカオブジェクトを先頭にして、 マーカオブジェクトのリストとしてマークリングを保持します。 この変数は各バッファにローカルです。


Node:Global Mark Ring, Previous:Mark Ring, Up:Mark

グローバルマークリング

個々のバッファごとの普通のマークリングに加えて、 Emacsにはグローバルマークリング(global mark ring)が1つあります。 グローバルマークリングは、最近マークを設定したバッファの系列を記録しますから、 それらのバッファに戻ることができます。

マークを設定すると、つねにカレントバッファのマークリングに項目を作ります。 マークを設定した以降にバッファを切り替えていると、 新しくマークを設定するとグローバルマークリングにも項目を作成します。 その結果、グローバルマークリングには訪れていたバッファの系列が記録され、 各バッファではマークを設定した箇所が記録されます。

コマンドC-x C-<SPC>pop-global-mark)は、 グローバルマークリングの最新の項目が示すバッファの位置に移動します。 グローバルマークリングも巡回されるので、 C-x C-<SPC>を繰り返し使用すると、 1つずつまえのバッファに移動できます。


Node:Killing, Next:, Previous:Mark, Up:Top

削除とキル

バッファからテキストを消しさるコマンドのほとんどは、 そのテキストをキルリングにコピーしておくので、 バッファの他の部分にそのテキストを移動したりコピーしたりできます。 これらのコマンドを、キル(kill)コマンドと呼びます。 それ以外の『テキストを消すコマンド』は、 テキストをキルリングに保存しません。 これらを削除(delete)コマンドと呼びます。 (両者を区別するのは、バッファ内のテキストを消す場合だけ。) キルコマンドや削除コマンドを誤って実行してしまった場合には、 C-x uundo)コマンドを使って、もとに戻すことができます。

削除コマンドには、一度に1つの文字だけを削除する C-ddelete-char)や<DEL>(delete-backward-char)、 空白や改行だけを削除するコマンドがあります。 単純ではないデータをかなりの分量で破壊する可能性のあるコマンドは、 一般にキルを行います。 コマンド名や個々の説明では、そのコマンドがどちらの働きをするかによって、 キル(kill)と削除(delete)を使い分けています。


Node:Deletion, Next:, Up:Killing

削除

C-d
つぎの文字を削除する(delete-char)。
<DEL>
まえの文字を削除する(delete-backward-char)。
M-\
ポイントの周りの空白とタブを削除する(delete-horizontal-space)。
M-<SPC>
ポイントの周りの空白とタブを削除し、空白を1個だけ残す (just-one-space)。
C-x C-o
現在行の周りの空行を削除する(delete-blank-lines)。
M-^
行間の改行とそれに続く字下げを削除して2行を繋げる (delete-indentation)。

もっとも基本的な削除コマンドは、C-ddelete-char)と <DEL>(delete-backward-char)です。 C-dはポイントの直後の文字、 つまり、カーソルが重なっている文字を削除します。 このコマンドでは、ポイントは動きません。 <DEL>はカーソルの直前の文字を削除して、 ポイントを1つまえに移動します。 バッファ内の他の文字と同様に、改行も削除できます。 改行を削除すると、2つの行が繋がります。 実際には、C-dと<DEL>がつねに削除コマンドであるわけではありません。 引数を指定するとキルコマンドとなり、 同じ方法で2文字以上を消すことができます。

他の削除コマンドは、空白、タブ、改行といった白文字だけを削除します。 M-\delete-horizontal-space)は、 ポイントの前後にあるすべての空白とタブ文字を削除します。 M-<SPC>just-one-space)も同様に削除しますが、 今ある空白の個数に関係なく(たとえ0個でも)、 ポイントの直後に空白を1個だけ残します。

C-x C-odelete-blank-lines)は、 現在行に続くすべての空行を削除します。 現在行が空行である場合には、(空行である現在行だけを残して) 先行する空行も同様にすべて削除します。

M-^delete-indentation)は、 改行とその周りの空白を削除して、 通常は空白を1個残して現在行と先行する行を繋げます。 See M-^


Node:Killing by Lines, Next:, Previous:Deletion, Up:Killing

行単位のキル

C-k
行の残りの部分、あるいは、行全体を1行以上キルする(kill-line)。

もっとも単純なキルコマンドはC-kです。 行の先頭で使うと、その行のすべてのテキストをキルして、空行にします。 空行で使うと、改行を含めてその行を完全にキルします。 空行でない行を完全にキルするには、行頭でC-kを2回打ちます。

一般に、C-kは、行末でなければ、 ポイントからその行の末尾までをキルします。 行末では、ポイントのうしろの改行をキルするので、 現在行と後続の行が繋がります。 どちらの動作をするか決めるときには、 行末にあって見にくい空白やタブを無視しますから、 ポイントが行末にあるように見えていれば、 C-kで改行がキルされると考えてください。

C-kに正の引数を指定すると、 その個数の行とそれらに続く改行をキルします (ただし、現在行のポイントよりまえのテキストは残す)。 負の引数-nを指定すると、 C-kは現在行に先行するn行 (と現在行のポイント位置よりまえのテキストを含めて)を削除します。 つまり、ポイントが行頭にある状態でC-u - 2 C-kとすれば、 先行する2行をキルします。

C-kに引数0を指定すると、 現在行のポイントよりまえのテキストをキルします。

変数kill-whole-linenil以外の場合、 行頭でC-kを使うと、行末の改行も含めて行全体をキルします。 この変数は、通常、nilです。


Node:Other Kill Commands, Previous:Killing by Lines, Up:Killing

他のキルコマンド

C-w
リージョン(ポイントからマークまで)をキルする(kill-region)。
M-d
単語をキルする(kill-word)。 see Words
M-<DEL>
単語を後向きにキルする(backward-kill-word)。
C-x <DEL>
文の先頭までを後向きにキルする(backward-kill-sentence)。 see Sentences
M-k
文の末尾までをキルする(kill-sentence)。
C-M-k
S式をキルする(kill-sexp)。 see Lists
M-z char
つぎにcharが現れる箇所までをキルする(zap-to-char)。

汎用的なキルコマンドといえばC-wkill-region)です。 このコマンドは、あらかじめ連続領域をポイントとマークで囲んでおけば、 どんな連続領域でもキルできます。

探索と組み合わせた便利なキルの仕方もあります。 M-zzap-to-char)は1文字を読み取り、 ポイントからバッファ内でその文字がつぎに現れる箇所までを (その文字も含めて)キルします。 数引数を指定した場合は、反復回数を意味します。 負の引数の場合は、ポイント位置から逆方向に探索し、 ポイントの直前までをキルします。

他の構文単位でもキルできます。 M-<DEL>M-d(see Words)で単語を、 C-M-k(see Lists)でS式を、 C-x <DEL>M-k(see Sentences)で文をキルできます。

読み出し専用のバッファでもキルできます。 実際にはバッファに変更を加えることはありませんし、 ベルを鳴らしてその旨警告を発しますが、 キルしようとしたテキストはキルリングにコピーされます。 ですから、別のバッファにそのテキストをヤンクできます。 ほとんどのキルコマンドは、 このようにコピーするテキストを越えてポイントを進めますから、 連続してキルコマンドを実行しても キルリングに入る項目は通常どおり1個だけです。


Node:Yanking, Next:, Previous:Killing, Up:Top

ヤンク

ヤンク(yank)とは、 以前にキルしたテキストをバッファにふたたび挿入することです。 他のシステムでは『ペースト』と呼ぶこともあります。 テキストを移動したりコピーしたりする普通の方法は、 そのテキストをいったんキルしてから、別の場所に(1回以上)ヤンクすることです。

C-y
最後にキルしたテキストをヤンクする(yank)。
M-y
たった今ヤンクしたテキストをそれより以前にキルした一塊のテキストで置き換える (yank-pop)。
M-w
リージョンを実際にはキルせずに、最後にキルしたテキストとして保存する (kill-ring-save)。
C-M-w
つぎのキルを、最後にキルした一塊のテキストに付け加える (append-next-kill)。


Node:Kill Ring, Next:, Up:Yanking

キルリング

すべてのキルされたテキストは、キルされたテキストの塊をリストとする キルリング(kill ring)に記録されています。 キルリングはたった1つしかなくて、すべてのバッファで共有しています。 ですから、あるバッファでキルしたテキストは、 別のバッファでヤンクできます。 普通、このようにして、あるファイルから別のファイルへテキストを移動します。 (別の方法については、see Accumulating Text。)

コマンドC-yyank)は、 最後にキルしたテキストをふたたび挿入します。 カーソルは挿入したテキストの末尾に置かれます。 マークは挿入したテキストの先頭に置かれます。 See Mark

C-u C-yは、テキストのまえにカーソルを置き、うしろにマークを置きます。 引数としてC-uだけを指定した場合に限り、こうなります。 C-uと数字を含めた他の引数を指定すると、 いくつまえのキル内容をヤンクするかを意味します(see Earlier Kills)。

一塊のテキストをコピーする場合は、 M-wkill-ring-save)を使うとよいでしょう。 このコマンドは、バッファからリージョンをキルせずに、 リージョンをキルリングにコピーします。 このコマンドは、C-wに続けてC-x uを実行するのとほぼ同等ですが、 M-wはアンドゥ履歴を変更しませんし、一時的にせよ画面表示も変わりません。


Node:Appending Kills, Next:, Previous:Kill Ring, Up:Yanking

キルしたテキストの追加

通常、各キルコマンドは、キルリングに新たな項目を押し込みます。 しかし、連続したキルコマンドでは、 それぞれでキルしたテキストを1つの項目にまとめます。 そのため、1回のC-yで、キルするまえの状態に、 それらのテキストをひとまとめにヤンクできます。

したがって、テキストを一塊でヤンクしたい場合でも、 1つのコマンドでそれらをキルする必要はありません。 すべてをキルするまで、1行ずつ、あるいは、1単語ずつキルしていっても、 一括してもとに戻すことができます。

ポイント位置から前向きにキルするコマンドでは、 直前にキルしたテキストの末尾に付け加えます。 ポイント位置から後向きにキルするコマンドでは、 テキストの先頭に付け加えます。 このように、前向き/後向きの両方のキルコマンドをどのように混ぜて実行しても、 キルしたテキストの順番を崩すことなく 1つの項目としてキルリングに記録されます。 数引数を指定しても、このような追加系列が途切れることはありません。 たとえば、バッファにつぎのテキストが入っていて、 -!-の位置にポイントがあるとしましょう。

This is a line -!-of sample text.

M-d M-<DEL> M-d M-<DEL>と打って、 前向き/後向きと交互にキルしても、 キルリングには1つの項目としてa line of sampleが入り、 バッファにはThis is text.が残ります。 (空白が2個残っていることに注意。 これらはM-<SPC>M-qで一掃できる。)

同じようにテキストをキルするもう1つの方法は、 M-b M-bで後向きに2語移動してから、 C-u M-dで前向きに4語キルします。 こうしても、バッファとキルリングの中身は、 先の例とまったく同じ結果になります。 M-f M-f C-u M-<DEL>としても、 後向きに同じテキストをキルします。 これでもやはり同じ結果が得られます。 キルリングの項目内のテキストの順序は、 キルするまえのバッファ内での順序と同じです。

キルコマンドと最後のキルコマンドのあいだに (単なる数引数ではない)他のコマンドが入ると、 キルリングには新たな項目が作られます。 しかし、キルコマンドを打つ直前に コマンドC-M-wappend-next-kill)を打っておけば、 既存の項目へ追加するように強制できます。 C-M-wは、つぎがキルコマンドであれば、 新たな項目を作成するかわりにキルしたテキストを 以前にキルしたテキストに付け加えるよう指示します。 C-M-wを使うことで、 まとめて1か所にヤンクできるように、 離れた場所にあるいくつかのテキスト断片をキルして集めておけます。

M-wに続くキルコマンドでは、 M-wがキルリングにコピーしたテキストには付け加えません。


Node:Earlier Kills, Previous:Appending Kills, Up:Yanking

以前にキルしたテキストのヤンク

直前にキルしたものではないテキストを取り出すには、 M-yコマンド(yank-pop)を使います。 M-yは、直前にヤンクしたテキストを それ以前にキルしたテキストで置き換えます。 たとえば、最後から2つめのキルテキストを取り出すには、 まずC-yで最後にキルしたテキストをヤンクしてから、 M-yで1つまえのものに置き換えます。 M-yC-yや他のM-yの直後でしか使えません。

キルリング内の項目を指す『最終ヤンク』ポインタを考えると、 M-yの動作を理解しやすいでしょう。 キルするたびに、『最終ヤンク』ポインタは、 リングの先頭に新たに作られた項目を指します。 C-yは、『最終ヤンク』ポインタが指す項目をヤンクします。 M-yは、『最終ヤンク』ポインタを別の項目へ移動し、 それに合わせてバッファのテキストを変更します。 M-yコマンドを繰り返せばリング内のどの項目へもポインタを移動できるので、 どの項目でもバッファに取り込めます。 ポインタがリングの最後に達すると、 つぎのM-yはポインタをふたたびリングの先頭の項目に移動します。

M-yは、リング内で『最終ヤンク』ポインタを移動しますが、 リング内の項目の順番を変えることはありません。 つねに、最後にキルしたものが先頭にあり、 記録に残っている最古のものが最後尾にあります。

M-yには数引数を指定できて、 『最終ヤンク』ポインタをいくつ進めるかを指定します。 負の引数では、ポインタをリングの先頭に向けて移動します。 リングの先頭からは最後の項目へ移動し、そこから先頭に向けて移動します。

目的のテキストがバッファに入ったならば、 M-yコマンドの繰り返しを止めれば、みつけたテキストが残ります。 そのテキストはキルリングの項目のコピーなので、 バッファ内で編集してもリング内の項目は変わりません。 新たにキルしない限り、『最終ヤンク』ポインタは キルリング内の同じ場所を指していますから、 C-yを繰り返すと、 直前に取り込んだものと同じキル内容のコピーをヤンクできます。

目的のテキストを引き出すのに M-yコマンドを何回使えばよいのかわかっている場合には、 数引数を指定してC-yを使えば、 一発で目的のテキストをヤンクできます。 C-yに数引数を指定すると、 キルリング内でその個数分だけ遡った項目のテキストを取り込みます。 たとえば、C-u 2 C-yは最後から2番目にキルしたテキストを取り込みます。 つまり、C-y M-yとするのと等価です。 数引数を指定したC-yは、『最終ヤンク』ポインタの場所から 数え始め、ヤンクする項目にポイントを移動します。

キルリングの長さは、変数kill-ring-maxで制御します。 この個数以上のキルテキストは保存しません。

キルリングの実際の内容は、kill-ringという名前の変数に入っています。 キルリングの全内容は、コマンドC-h v kill-ringで見ることができます。


Node:Accumulating Text, Next:, Previous:Yanking, Up:Top

テキストの蓄積

通常、テキストをコピーしたり移動したりするにはキルとヤンクで行います。 しかし、一塊のテキストを何か所にもコピーしたり、 多くの箇所に分散したテキストを1か所にコピーしたりするのに 便利な方法が他にもあります。 一塊のテキストを何か所にもコピーするには、 そのテキストをレジスタに保存します(see Registers)。 ここでは、何か所かに分散したテキストをバッファやファイルに 蓄積するためのコマンドを説明します。

M-x append-to-buffer
リージョンを指定したバッファの内容の末尾に付加する。
M-x prepend-to-buffer
リージョンを指定したバッファの内容の先頭に付加する。
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を使います。 このコマンドも引数としてbuffernameを必要とします。 バッファbuffername内のテキストのコピーを 選択しているバッファに挿入します。 あるいは、そのバッファを選択して編集し、 場合によってはキルしてそのバッファからテキストを移動することもできます。 バッファに関する背景情報は、See Buffers

テキストをEmacsのバッファに蓄積するかわりに、 M-x append-to-fileを使って、テキストを直接ファイルに追加できます。 このコマンドは引数としてfilenameを必要とします。 リージョンのテキストを指定したファイルの末尾に追加します。 ファイルはディスク上でただちに更新されます。

このコマンドに指定するファイルは、 Emacsで訪問していないファイルだけに限るべきです。 Emacsで編集中のファイルを指定すると、 Emacsに隠れてファイルを変更することになり、 編集内容の一部を失うことにもなりかねません。


Node:Rectangles, Next:, Previous:Accumulating Text, Up:Top

矩形領域

矩形領域コマンドはテキストの矩形領域を操作します。 矩形領域のテキストとは、 2つの行の範囲内にある2つの桁位置のあいだにある文字すべてを指します。 矩形領域をキルする、キルした矩形領域をヤンクする、 矩形領域をクリアする、矩形領域を空白やテキストで充填する、 矩形領域を削除する、といったコマンドがあります。 矩形領域コマンドは、複数段に組んだテキストを操作したり、 テキストをそのように組んだり戻したりする場合に便利です。

コマンドで操作する矩形領域を指定するには、 一方の隅にマークを設定し、その対角にポイントを置きます。 このように設定した矩形領域を矩形リージョン (region-rectangle)と呼びます。 というのも、リージョンの制御と似た方法で矩形領域を制御できるからです。 しかし、ポイントとマークの組は、それを使うコマンドに依存して、 リージョンとして解釈される、あるいは、 矩形領域として解釈されることに注意してください。

ポイントとマークが同じ桁位置にある場合、 それらが切り分ける矩形領域は空です。 同じ行上にある場合は、矩形領域の高さは1行です。 桁と行の扱い方が非対称であるのは、 ポイント(同様にマーク)は2つの桁のあいだにあるのに対し、 行ではその中にあるからです。

C-x r k
矩形リージョンのテキストをキルし、 その内容を『最後にキルした矩形領域』として保存する(kill-rectangle)。
C-x r d
矩形リージョンのテキストを削除する(delete-rectangle)。
C-x r y
最後にキルした矩形領域をポイント位置を左上隅としてヤンクする (yank-rectangle)。
C-x r o
空白で埋めた矩形リージョンを挿入する(open-rectangle)。 矩形リージョンの直前の内容は右に押しやられる。
M-x clear-rectangle
矩形リージョンのすべてのテキストを空白で置き換えて、 内容をクリアする。
M-x delete-whitespace-rectangle
指定した矩形領域の各行において、 矩形領域の左端から白文字を削除する。
C-x r t string <RET>
指定した矩形領域の各行にstringを挿入する (string-rectangle)。

矩形操作は2種類に分類できます。 矩形領域を削除したり挿入したりするコマンドと、 空白の矩形領域を扱うコマンドです。

矩形領域内のテキストを消すには、2つの方法があります。 テキストを捨てる(削除する)か、 『最後にキルした』矩形領域として保存するかです。 これらの機能を実現するコマンドは、C-x r ddelete-rectangle)と C-x r kkill-rectangle)です。 どちらも、矩形領域の内側にある各行の部分を削除し、 それより右側にテキストがあれば、 隙間を埋めるようにそれらを左へ移動します。

矩形領域の『キル』は普通の意味でのキルではない、 ということに注意してください。 矩形領域はキルリングには保存されませんが、 最後にキルした矩形領域を1つだけ記録できる特別な場所に保存されます。 というのは、矩形領域をヤンクすることは、 線形のテキストのヤンクとは大きく異なり、 特別なヤンクコマンドが必要だったり、 ヤンクしたテキストの入れ換え操作が意味をなさなかったりするからです。

最後にキルした矩形領域をヤンクするには、 C-x r yyank-rectangle)と打ちます。 矩形領域のヤンクは矩形領域のキルの逆です。 ポイントは矩形領域の左上隅の位置を指定します。 その場所には矩形領域の1行目が挿入され、 矩形領域の2行目はそのつぎの行にというように挿入されます。 影響される行数は、保存されている矩形領域の高さで決まります。

矩形領域のキルとヤンクを使うと、1段組みの一覧表を2段組の一覧表に変換できます。 一覧表の後半を矩形領域としてキルして、 一覧表の第1行の隣にヤンクすればよいのです。

また、C-x r r rC-x r i rを使えば、 矩形領域をレジスタにコピーしたり、レジスタから矩形領域をコピーしたりできます。 See Rectangle Registers

空白の矩形領域を作るコマンドは2つあります。 M-x clear-rectangleは既存のテキストを空白で置き換え、 C-x r oopen-rectangle)は空白の矩形領域を挿入します。 矩形領域をクリアすることは、 矩形領域を削除してから同じ大きさの空白の矩形領域を挿入するのと同じことです。

コマンドM-x delete-whitespace-rectangleは、 特定の桁位置から始まる横に並んだ白文字を削除します。 矩形領域内の各行に作用し、桁位置は矩形領域の左端です。 矩形領域の右端はこのコマンドには関係ありません。

コマンドC-x r tM-x string-rectangle)は、 矩形領域を指定した文字列で置き換えます。 文字列の幅は、矩形領域の幅と同じである必要はありません。 文字列の幅が足りなければ、矩形領域の右側にあるテキストは左へ移動します。 文字列の幅が広ければ、矩形領域の右側にあるテキストは右へ移動します。


Node:Registers, Next:, Previous:Rectangles, Up:Top

レジスタ

Emacsのレジスタ(registers)は、 あとで使うためにテキストやポイント位置を保存するための場所です。 テキストや矩形領域をレジスタにいったん保存すれば、 何度でもバッファにコピーできます。 また、レジスタに保存した位置には何度でもポイントを移動できます。

各レジスタには1文字の名前が付いています。 レジスタには、テキストの一部、矩形領域、位置、 ウィンドウの構成情報、ファイル名を保存できますが、 1度にはそのうちの1つしか保存できません。 レジスタに保存した内容は、そのレジスタに他のものを保存するまでは 保持され続けます。 レジスタrに何が入っているか調べるには、 M-x view-registerを使います。

M-x view-register <RET> r
レジスタrの内容を表示する。


Node:RegPos, Next:, Up:Registers

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

位置を保存するとは、 あとで戻ってこられるようにバッファ中の位置を記録することです。 保存した位置に移動すると、そのバッファに切り替えてから ポイントをその位置に移動します。

C-x r <SPC> r
ポイント位置をレジスタrに保存する(point-to-register)。
C-x r j r
レジスタrに保存した位置に移動する(jump-to-register)。

ポイントの現在位置をレジスタに保存するには、名前rを選んでから、 C-x r <SPC> rと打ちます。 他のものを保存するまで、 レジスタrはこうして保存した位置を保持し続けます。

コマンドC-x r j rは、 レジスタrに記録した位置にポイントを移動します。 レジスタは変わらず、同じ位置を記録し続けます。 何度でも保存した位置に移動できます。

C-x r jを使って保存位置に移動しようとしたとき、 その対象となるバッファがすでに消去されていた場合には、 C-x r jは同じファイルを訪問するバッファを作成し直そうとします。 もちろん、これはファイルを訪問したバッファに対してのみ働きます。


Node:RegText, Next:, Previous:RegPos, Up:Registers

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

テキストの同じ部分のコピーを頻繁に挿入する場合、 キルリングからヤンクするのは便利ではないでしょう。 というのは、キルするごとに、必要な部分がリングの下方に徐々に 移動してしまうからです。 別の手段としては、レジスタにテキストを保存しておき、 レジスタから取り込むという方法があります。

C-x r s r
レジスタrにリージョンをコピーする(copy-to-register)。
C-x r i r
レジスタrからテキストを挿入する(insert-register)。

C-x r s rは、リージョンのテキストのコピーを rという名前のレジスタに保存します。 C-x r s rに数引数を指定すると、 保存すると同時にバッファからテキストを削除します。

C-x r i rはレジスタrからテキストをバッファに挿入します。 通常、テキストの直前にポイントを置き、直後にマークを置きます。 しかし、数引数(C-u)を指定すると、 テキストの直後にポイントを置き、直前にマークを置きます。


Node:RegRect, Next:, Previous:RegText, Up:Registers

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

レジスタには、連続したテキスト以外にも、矩形領域を保持できます。 矩形領域は、文字列のリストとして表されます。 バッファ内での矩形領域の指定方法に関する基礎情報については、 See Rectangles

C-x r r r
矩形領域をレジスタrにコピーする (copy-rectangle-to-register)。 数引数を指定すると、コピー後に矩形領域を削除する。
C-x r i r
レジスタrに保存した矩形領域(が存在すればそれ)を挿入する (insert-register)。

C-x r i rコマンドは、レジスタにテキストが入っていれば、 そのテキストの文字列を挿入しますし、 矩形領域があれば矩形領域を挿入します。

コマンドsort-columnsも参照してください。 このコマンドは矩形領域をソートすると考えられます。 See Sorting


Node:RegConfig, Next:, Previous:RegRect, Up:Registers

レジスタにウィンドウ構成を保存する

選択したフレームのウィンドウ構成をレジスタに保存したり、 すべてのフレームのすべてのウィンドウ構成を保存したりできて、 しかも、あとでその構成に戻せます。

C-x r w r
選択したフレームのウィンドウの状態をレジスタrに保存する (window-configuration-to-register)。
C-x r f r
全フレームの状態を、各フレームのすべてのウィンドウを含めて、 レジスタrに保存する (frame-configuration-to-register)。

ウィンドウやフレームの構成をもとに戻すには、 C-x r j rを使います。 これは、カーソル位置を復元するコマンドと同じです。 フレームの構成を復元すると、 構成情報に含まれていない既存のフレームは隠れた状態になります。 これらのフレームを削除したければ、C-u C-x r j rを使います。


Node:RegNumbers, Next:, Previous:RegFiles, Up:Registers

レジスタに数値を保持する

レジスタに数値を保存しておき、数値を10進数でバッファに挿入してから 数値を増やすコマンドがあります。 これらのコマンドは、キーボードマクロで役立ちます (see Keyboard Macros)。

C-u number C-x r n reg
数値numberをレジスタregに保存する (number-to-register)。
C-u number C-x r + reg
レジスタreg内の数値をnumberだけ増やす (increment-register)。
C-x r g reg
レジスタregの数値をバッファに挿入する。

C-x r gは、レジスタの数値以外の内容をバッファに挿入するために 使うコマンドと同じです。


Node:RegFiles, Next:, Previous:RegConfig, Up:Registers

レジスタにファイル名を保持する

特定のファイル名を頻繁に訪問する場合には、 これらの名前をレジスタに置いておくと、 より簡単にファイルを訪問できます。 ファイル名をレジスタに置くLispコードをつぎに示します。

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

たとえば、

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

とすると、上に示したファイル名をレジスタzに保存します。

レジスタrに入れた名前のファイルを訪問するには、 C-x r j rと打ちます。 (このコマンドは、保存位置に移動したり フレーム構成を復元するために使うコマンドと同じ。)


Node:Bookmarks, Previous:RegNumbers, Up:Registers

ブックマーク

ブックマーク(bookmarks)とは、 移動先の位置を記録しておくためのレジスタのようなものです。 レジスタと違って、長い名前を付けることができて、 自動的につぎのEmacsセッションに引き継がれます。 ブックマークの典型的な使い方は、 各ファイルの『どこを読んでいるか』を記録しておくことです。

C-x r m <RET>
訪問先のファイルのポイント位置にブックマークを設定する。
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で任意のファイルを再訪問して、 同時にブックマーク位置に移動するという操作を楽に行えます。

設定したすべてのブックマークの一覧を別のバッファに表示するには、 C-x r llist-bookmarks)と打ちます。 そのバッファに切り替えれば、ブックマークの定義を編集したり、 ブックマークに注記を付けたりできます。 このバッファで使える特別な編集コマンドについての情報を得るには、 このバッファでC-h mと打ちます。

内容を変更したブックマークがある場合、Emacsを終了する時点で、 Emacsはブックマークの値をデフォルトの ブックマークファイル~/.emacs.bmkに保存するかどうか聞いてきます。 M-x bookmark-saveコマンドを使っても、 変更したブックマークをいつでも保存できます。 ブックマークコマンドは、個人のデフォルトのブックマークファイルを 自動的に読み込みます。 これらの保存と読み込みによって、 ブックマークの内容をつぎのEmacsセッションに引き継げるのです。

変数bookmark-save-flagに1を設定しておくと、 ブックマークを設定する各コマンドは、ブックマークの保存も行います。 こうしておけば、Emacsがクラッシュした場合でも、 ブックマークデータを失わなくてすみます。 (この変数の値が数値であれば、 ブックマークを何回変更したら保存するという意味。)

ブックマークの位置情報は、その周辺の文脈情報と一緒に保存されるので、 ファイルが少し変更されていたとしても、 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が指すファイルの内容を バッファに挿入する。


Node:Display, Next:, Previous:Registers, Up:Top

画面の制御

大きなバッファの一部しかウィンドウには収まりませんから、 Emacsは必要そうな部分を表示しようとします。 画面制御コマンドを使って、 テキストのどの部分を表示したいのか、また、 どのように表示するか指定できます。


Node:Scrolling, Next:, Up:Display

スクロール

バッファを表示しているウィンドウに全部を表示するには 大きすぎるテキストが入っているバッファでは、 Emacsはテキストの連続する一部分を表示します。 表示する部分にはつねにポイントが入っています。

スクロール(scroll)とは、 ウィンドウ内でテキストを上下に動かして、 テキストの異なる部分を表示することです。 前向きのスクロールでは、テキストを上へ移動して、 新たなテキストがウィンドウの最下端から現れます。 後向きのスクロールでは、テキストを下に移動して、 新たなテキストがウィンドウの最上端から現れます。

ポイントをウィンドウの下端や上端を超えて移動すると、 自動的にスクロールします。 本節で紹介するコマンドを使って、明示的にスクロールすることもできます。

C-l
画面をクリアして再表示し、選択されたウィンドウではポイントが 縦方向の中央に位置するようにスクロールする (recenter
C-v
(ウィンドウ1面分か指定した行数だけ)前向きにスクロールする (scroll-up)。
<NEXT>
同様に前向きにスクロールする。
M-v
後向きにスクロールする(scroll-down)。
<PRIOR>
同じく後向きにスクロールする。
arg C-l
ポイントがarg行目にくるようにスクロールする(recenter)。
C-M-l
有益な情報が画面上にくるように発見的方法でスクロールする (reposition-window)。

もっとも基本的なスクロールコマンドは、 引数を指定しないC-lrecenter)です。 このコマンドは、画面全体をクリアして、すべてのウィンドウを再表示します。 さらに、ポイントがウィンドウの中央の行に位置するように、 選択されているウィンドウをスクロールします。

スクロールコマンドC-vM-vは、 ウィンドウ内の全テキストを上下に何行か移動します。 C-vscroll-up)に引数を指定すると、 C-lと同じようにテキストとポイントを一緒に上へ移動して、 追加分(引数分)の行をウィンドウの下部に表示します。 C-vに負の引数を指定した場合は、 ウィンドウの上端に追加分の行を表示します。 M-vscroll-down)はC-vに似ていますが、 スクロール方向が逆です。 ファンクションキーの<NEXT>と<PRIOR>は、 C-vM-vに等価です。

スクロールコマンドの名前は、 ウィンドウ内でテキストを動かす向きに基づいています。 したがって、前向きにスクロールするコマンドは、 画面上ではテキストを上へ移動するため、 scroll-upと呼ばれます。

一度にウィンドウ1面分のバッファを読んでいくには、 引数を指定せずにC-vを使います。 ウィンドウの下端2行を上端に持っていき、 それに続けてこれまで表示されていなかったほぼ ウィンドウ1面分の行を表示します。 ポイントがウィンドウの上端より上に出てしまう場合には、 ポイントはウィンドウの新たな上端の行に移動します。 引数を指定しないM-vも同様に、 テキストを重複させながら、後向きに移動します。 C-vM-vで重複させる行数は、 変数next-screen-context-linesで制御します。 デフォルトでは2です。

画面上でのポイント位置を保ったまま 1画面分のスクロールを行うコマンドを好むユーザーもいます。 このようにするには、変数scroll-preserve-screen-positionnil以外を設定します。 このモードは、 1画面分ずつスクロールしながらファイルを閲覧するような場合に便利です。 スクロールを始めた画面に戻ると、ポイントは開始時の行位置に戻ります。 しかし、つぎの画面に移動して、 そこに表示されているテキストにポイントを 移動するような使い方にはむいていません。

スクロールのもう1つの方法は、数引数を指定したC-lを使うことです。 引数を指定すると、C-lは画面をクリアしません。 選択されているウィンドウだけをスクロールします。 正の引数nを指定すると、 ポイント位置が上端からn行目にくるように、 テキストの位置を変更します。 引数として0を指定すると、ポイント位置は最上端の行になります。 ポイントがテキストに対して動くわけではなくて、 テキストとポイントは一緒に画面上を動きます。 C-lに負の引数を指定すると、 ポイントはウィンドウの下端から指定行数にきます。 たとえば、C-u - 1 C-lとするとポイントは最下行になり、 C-u - 5 C-lとすれば下から5行目にポイントがきます。 C-u C-lのようにC-uだけを引数に指定すると、 ポイントが画面中央にくるようにスクロールします。

C-M-lコマンド(reposition-window)は、 有益な情報を画面上に持ってくるようにように設計された発見的手法で、 カレントウィンドウをスクロールします。 たとえば、Lispファイルでは、このコマンドは、 可能であれば現在の関数定義(defun)全体を画面上にもってこようとします。

表示の際、ポイントがテキストの表示部分から飛び出してしまうと、 自動的にスクロールします。 通常、この自動スクロールでは、 ポイントがウィンドウ縦方向の中央に位置するように画面を移動します。 しかし、scroll-conservativelyに小さな数nを設定しておくと、 ポイントが画面から少しだけ(n行未満)はみだすと、 Emacsはポイントを画面内に戻すのに必要な分だけスクロールします。 デフォルトでは、scroll-conservativelyは0です。

変数scroll-marginは、 ポイントをウィンドウの上端や下端にどれだけ近づけられるかを制限します。 その値は画面上での行数です。 ポイントがウィンドウの上端や下端からその行数以内にくると、 Emacsはウィンドウを中央に位置付けし直します。 デフォルトでは、scroll-marginは0です。


Node:Horizontal Scrolling, Next:, Previous:Scrolling, Up:Display

水平スクロール

水平スクロール(horizontal scrolling)とは、 すべての行をウィンドウ内で横方向に動かすことです。 これにより、左端近くのテキストは表示されなくなります。

C-x <
カレントウィンドウのテキストを左にスクロールする(scroll-left)。
C-x >
右にスクロールする(scroll-right)。

ウィンドウが水平方向にスクロールされているときには、 テキスト行を継続(see Continuation Lines)しないで切り捨てます。 テキストの左側を切り捨てているときは最初の桁に$を表示し、 右側を切り捨てているときには最後の桁に$を表示します。

コマンドC-x <scroll-left)は、 選択されたウィンドウを引数nの桁数だけ左にスクロールします。 各行の最初の部分はウィンドウの左端から出てしまいます。 引数を指定しないと、ほぼウィンドウ幅(正確には2桁少ない桁数) だけスクロールします。

C-x >scroll-right)は、同様に右にスクロールします。 ウィンドウが(各行がウィンドウの左端から始まっている)通常の表示をしていると、 それ以上はスクロールできません。 スクロールさせようとしても何も起こりません。 つまり、C-x >に与える引数を正確に計算する必要はないのです。 十分に大きな引数を指定すれば、通常の表示に戻せます。

水平スクロール(hscroll)モードをオンにすると、 自動的に水平スクロールを行います。 このモードがオンであると、 ポイントが左右端から離れすぎない場所に見えるように Emacsが水平方向にウィンドウをスクロールします。 このモードのオン/オフを切り替えるコマンドは、M-x hscroll-modeです。


Node:Follow Mode, Next:, Previous:Horizontal Scrolling, Up:Display

追従モード

追従(follow)モードは、 同じバッファを表示している2つのウィンドウを、 1つの『仮想ウィンドウ』としてスクロールするマイナモードです。 追従(follow)モードを使うには、 ウィンドウが1つだけのフレームに移動して、 C-x 3を使って左右に並んだ2つのウィンドウに分割してから、 M-x follow-modeと打ちます。 これ以後、いずれのウィンドウのバッファでも編集できますし、 どちらをスクロールしてもかまいません。 もう一方のウィンドウは他方に追従します。

追従(follow)モードをオフにするには、もう一度M-x follow-modeを打ちます。


Node:Selective Display, Next:, Previous:Follow Mode, Up:Display

選択的な表示

Emacsには、(指定した)桁数以上字下げしてある行を隠す機能があります。 プログラムの一部を概観するのにこの機能を使えます。

行を隠すには、数引数nを指定してC-x $set-selective-display)と打ちます。 これにより、n桁以上字下げしてある行は画面から消えます。 1行以上の不可視行に先行する可視行の末尾には、 3つのドット(...)を表示します。 この印が不可視行の存在を示す唯一のものです。

コマンドC-nC-pは、 不可視行が存在しないかのように不可視行を飛び越えて移動します。

不可視行は依然としてバッファ内に存在しています。 たいていの編集コマンドはそれらを通常と同じように扱うので、 隠蔽されたテキスト内にポイントを移動してしまうことも起こりえます。 このような場合、カーソルは先行する行の末尾の3つのドットの直後に 表示されます。 ポイントが可視行の行末の改行文字の直前にあるときには、 3つのドットの直前にカーソルが現れます。

すべての行をふたたび表示するには、引数を指定せずにC-x $を打ちます。

変数selective-display-ellipsesnilを設定すると、 不可視行に先行する可視行の末尾には3つのドットを表示しなくなります。 すると、不可視行の存在を示すものは何もありません。 この変数を設定すると、自動的にローカルになります。


Node:Optional Mode Line, Next:, Previous:Selective Display, Up:Display

モード行の付加機能

行番号(line-number)モードがオンであると、 ポイントの現在の行番号をモード行に表示します。 このモードのオン/オフを切り替えるには、 コマンドM-x line-number-modeを使います。 通常はオンです。 行番号は、バッファの百分率を示すposのまえに、 行番号であること示す文字Lとともに表示されます。 マイナモードやこのコマンドの使用方法について詳しくは、 See Minor Modes

バッファが非常に大きい(line-number-display-limitの値以上に大きい) 場合には、この行番号を表示しません。 計算が非常に遅くなるので、 バッファが大きい場合にはEmacsは行番号を計算しません。 バッファをナロイング(see Narrowing)してある場合、 表示される行番号はバッファの参照可能な部分に対するものです。

桁番号(column-number)モードをオンにすると、現在の桁番号も表示できます。 このモードでは、Cに続けて現在の桁番号を表示します。 このモードのオン/オフを切り替えるには、 M-x column-number-modeと打ちます。

Emcasでは、すべてのモード行に、時刻とシステムの負荷状況を表示できます。 この機能をオンにするには、M-x display-timeと打ちます。 このときモード行に追加される情報は、 通常は、バッファ名のあと、括弧で囲まれたモード名のまえに表示されます。 その表示はつぎのようになります。

hh:mmpm l.ll

ここで、hhmmは、時分を表し、 つねにampmが続きます。 l.llは、システム全体で実行中のプロセスの個数の最近の平均数です。 (オペレーティングシステムが情報を提供しなければ、 いくつかの内容が消えていることもある。) 時刻を24時間表示したければ、 変数display-time-24hr-formattを設定します。

負荷レベル表示に続く語Mailは、 未読のメイルがある場合に表示されます。


Node:Text Display, Next:, Previous:Optional Mode Line, Up:Display

テキストの表示方法

Emacsバッファ内のASCII印字文字(8進コードで040から0176)は、 それぞれの図形で表示されます。 非ASCIIのマルチバイトの印字文字(8進コード0400以上)も同様です。

ASCIIコントロール文字の中には、特別な方法で表示されるものもあります。 改行文字(8進コード012)は、新たな行を始めるという形で表示されます。 タブ文字(8進コード011)は、つぎのタブストップ位置 (通常は8桁ごと)まで移動するという形で表示されます。

その他のASCIIコントロール文字は、通常、 カレット(^)に続けてコントロール変種でない文字で表示されます。 つまり、control-Aは^Aのように表示されます。

0200から0377までの非ASCII文字は、8進のエスケープシーケンスで表示されます。 たとえば、文字コード0243(8進)は、\243と表示されます。 しかし、ヨーロッパ向けの表示をオンにしていると、 これらのたいていの文字は非ASCII印字文字として扱われ、 (端末がこれらの文字を表示できると仮定して)それぞれの図形で表示されます。 See Single-Byte European Support


Node:Display Vars, Previous:Text Display, Up:Display

表示を制御する変数

本節は、カスタマイズに関する情報のみです。 初心者の方は読み飛ばしてください。

変数mode-line-inverse-videoは、 (端末が反転表示を扱えると仮定して) モード行を反転表示するかどうかを制御します。 nilは反転表示しないことを意味します。 See Mode Linemodelineフェイスに前景色を指定していて、しかも、 mode-line-inverse-videonil以外であれば、 modelineフェイスのデフォルトの背景色は通常の前景色です。 See Faces

変数inverse-videonil以外である場合、 Emacsは画面上のすべての行を通常の状態から反転表示します。

変数visible-bellnil以外の場合、 Emacsは、通常は端末のベルを鳴らす場面では、画面全体を点滅します。 端末に画面を点滅する機能がなければ、この変数は何の効果もありません。

Emacsを休止したあとで再開した場合、通常Emacsは画面をクリアし、 画面全体を再表示します。 ページメモリを複数個備えた端末では、termcapの定義を変更して、 (それぞれ、Emacsを起動するときと抜けるときに端末に出力される) 文字列titeでページメモリを切り替えて、 1ページをEmacs用に使い、もう1ページを他の出力用に使うようにできます。 そして、変数no-redraw-on-reenternil以外を設定します。 こうすると、Emacsは、再開時には 最後に出力した内容が画面ページに入っているものと仮定します。

変数echo-keystrokesは、複数個の文字キーのエコーを制御します。 設定する値は、エコーを開始するまでの待機時間の秒数です。 ゼロを指定するとエコーしません。 See Echo Area

変数ctl-arrownilを設定すると、 改行とタブを除いて、バッファ内のコントロール文字を 8進のエスケープシーケンスで表示します。 変数ctl-arrowの値を変更すると、 この変数はカレントバッファにローカルになります。 それまでは、デフォルトの値が使われます。 デフォルトの初期値はtです。 See Display Tables

通常、バッファ内のタブ文字は、つぎのタブストップ位置までの 空白として表示され、タブストップは8個分の空白と同じ間隔です。 タブ1個あたりの空白の文字数は、変数tab-widthで制御します。 この変数もctl-arrowと同様に、変更するとバッファにローカルになります。 バッファ内のタブ文字をどのように表示するかと、 コマンドとしての<TAB>の定義とは無関係であることに注意してください。 変数tab-widthの値は1以上1000以下の整数である必要があります。

変数truncate-linesnil以外を設定すると、 テキストの各行は表示上は画面の1行を占有します。 テキスト行が長すぎる場合は、画面に収まる範囲だけを表示します。 一方、truncate-linesnilを設定すると、 長いテキスト行は、画面上では2行以上にわたってテキスト行の表示に必要なだけの 行数で表示されます。 See Continuation Lines。 変数truncate-linesの値を変更すると、 カレントバッファにローカルになります。 それまでは、デフォルトが使われます。 デフォルトの初期値はnilです。

変数truncate-partial-width-windowsnil以外を設定すると、 画面やフレームの幅に満たないウィンドウでは、 テキストの表示方法はtruncate-linesの値とは無関係に、 継続行ではなく切り捨てて表示します。 左右に並べたウィンドウに関しては、See Split WindowDisplayも 参照してください。

変数baud-rateは、Emacsにとっての端末の出力速度を保持します。 この変数の値を設定したとしても、 実際のデータ転送速度を変更できるわけではなく、 この値はパディングの計算などに用いられます。 さらに、ウィンドウシステムを使用している場合であっても、 画面の一部をスクロールするのか、再表示するのかの決定にも影響します。 (ウィンドウシステムには正しい『出力速度』がないにしても、 スクロール/再表示を調整できるようにこのように設計してある。)

どんな文字コードの表示方法も、表示テーブルを用いてカスタマイズできます。 See Display Tables


Node:Search, Next:, Previous:Display, Up:Top

探索と置換

他のエディタと同様に、Emacsにも文字列を探索するコマンドがあります。 主な探索コマンドがインクリメンタル(incremental)であるという点で、 普通とは違います。 探索したい文字列全体を入力し終えなくても、探索を始めます。 他のエディタの探索コマンドのように、 インクリメンタルでない探索コマンドもあります。

指定した文字列の出現すべてを探し出して別の文字列に置換する、 普通の置換コマンドreplace-stringに加えて、 Emacsにはより高級な、 出現箇所をみつけるたびに置換するかどうか対話的に尋ねる 問い合わせ型置換コマンドquery-replaceもあります。


Node:Incremental Search, Next:, Previous:Search, Up:Search

インクリメンタルサーチ

インクリメンタルサーチでは、 探索文字列の最初の文字を打つとただちに探索を開始します。 探索文字列を入力するたびに、 Emacsは(それまでに入力した)文字列がどこでみつかるか表示します。 目的の箇所を特定するのに十分なだけの文字を打ってしまえば、 そこで終りにできます。 つぎに何をするかにもよりますが、 <RET>で探索を陽に終了する必要がある場合もあります。

C-s
前向きにインクリメンタルサーチする(isearch-forward)。
C-r
後向きにインクリメンタルサーチする(isearch-backward)。

C-sはインクリメンタルサーチを始めます。 C-sはキーボードから文字を読み取り、 打った文字が最初に現れる位置までカーソルを移動します。 たとえば、C-sに続けてFを打つと、 カーソルは最初に現れるFの直後に移動します。 さらにOを打つと、カーソルは最初に現れるFOの直後に移動します。 さらにOを打つと、探索を開始した場所以降で最初に現れる FOOの直後にカーソルが移動します。 各段階において、反転表示できる端末では、 探索文字列に一致するバッファ内のテキストを強調表示します。 また、各段階において、エコー領域に表示した現在の探索文字列も更新します。

探索する文字列を打ちまちがえたときには、<DEL>で取り消せます。 <DEL>を1回押すごとに、探索文字列の最後の文字を取り消していきます。 ただし、Emacsがつぎの入力文字を受け付け可能になるまで、 この取り消し操作は実行できません。 つまり、取り消そうと思っている文字をみつけるか、 もしくはみつけられなかったことが確定する必要があります。 それまで待てないなら、以下に説明するようにC-gを使ってください。

目的の箇所まで移動できたら、<RET>を打ちます。 すると、探索を終了しカーソルはその箇所に留まります。 また、探索に関係ないコマンドを打っても、 探索を終了し、そのコマンドを実行します。 したがって、C-aと打てば、探索を終了し、カーソルを行頭に移動します。 <RET>が必要な場面は、 つぎに入力したいコマンドが、印字文字、<DEL>、<RET>、および、 探索で特別な意味を持つその他の各種コントロール文字 (C-qC-wC-rC-sC-yM-yM-rM-s)である場合だけです。

FOOを探してそれがみつかった場合でも、 予期していたFOOではないこともあるでしょう。 最初のFOO以降に、2つめのFOOがあることを 忘れていたような場合です。 このようなときには、さらにC-sを打てば、 探索文字列のつぎの出現箇所に移動できます。 この操作は何度でも繰り返せます。 行き過ぎてしまったときには、<DEL>でC-sの操作を取り消せます。

探索を終了したあとでも、単にC-s C-sと打てば、 ふたたび同じ文字列を探索できます。 つまり、最初のC-sがインクリメンタルサーチを起動して、 つぎのC-sが『再探索』を意味します。

以前に探索した文字列を再利用するには、 探索リング(search ring)を使います。 コマンドM-pM-nでリング内を移動して、 再利用する文字列を取り出します。 これらのコマンドは、探索リング内の選択した要素をミニバッファに置きますから、 編集することも可能です。 C-sC-rを打てば、 文字列の編集を終了して探索を開始できます。

探している文字列がまったくみつからなかった場合には、 エコー領域にFailing I-Searchと表示されます。 カーソルは、指定した文字列に可能な限り一致する箇所の直後にあります。 たとえば、FOOTを探索しようとしたのにFOOTがなければ、 カーソルはFOOLFOOの直後にあります。 この時点でできることはいくつかあります。 文字列を打ちまちがえたのならば、それを消去して訂正します。 その箇所でよいのなら、『探索したものを受理する』ために、 <RET>か他のEmacsコマンドを打ちます。 あるいは、C-gを打てば、 探索文字列からみつけられなかった文字(FOOT中のT)を取り除き、 みつけた文字列(FOOT中のFOO)は そのままにしておくこともできます。 ここで、さらにC-gを打つと、 探索全体を取り止めて、探索を開始した位置に戻ります。

探索文字列に大文字を指定すると、 大文字小文字を区別(case-sensitive)して探索します。 探索文字列から大文字を削除すると、この効果は消えます。 See Search Case

探索に失敗したときに、さらにC-sを打って探索の続行を指示すると、 バッファの先頭からもう一度探索し始めます。 後向きの探索に失敗したときに再度C-rを打つと、 バッファの末尾から探索を再開します。 これらの操作は巻き直し(wrapping around)と呼ばれます。 巻き直しが起こると、探索のプロンプトにはWrappedが表示されます。 もともとの探索開始位置を通過してなお探索を続けると、 表示がOverwrappedに変わります。 これは、探索文字列にすでに一度一致した箇所を 再度探索していることを意味します。

『中断』文字C-gは、探索中には特別な意味があり、 その機能は探索の状態に依存します。 指定したものがみつかり入力待ちの状態にあると、 C-gは探索全体を取り消します。 カーソルは探索開始位置に戻ります。 Emacsが探索中であったり探索に失敗したために、 探索文字列内に未発見の文字がある場合にC-gを打つと、 探索文字列から未発見の文字を消去します。 そうすると、これで探索が成功したことになるので、 入力待ちになります。 続けてC-gを打つと、探索全体を取り消します。

改行を探索するには、C-jを打ちます。 コントロールSや改行などのコントロール文字を探索するには、 まずC-qを打ってクォートする必要があります。 C-qのこの機能は、挿入時の利用法に似ています (see Inserting Text)。 このコマンドは、あとに続く文字を、 同じ文脈における『普通の』文字と同様に扱うようにします。 文字を8進コードで指定することもできて、 C-qに続けて8進数字列を入力します。

C-rを使えば、後向き探索に変更できます。 ファイルのうしろのほうで探索し始めたために探索に失敗したのであれば、 これを試してください。 C-rを繰り返し打つと、後向きにさらに探索を続けます。 C-sは、ふたたび前向き探索を再開します。 探索中のC-rは<DEL>で取り消せます。

始めから後向きで探索するのであれば、 C-sのかわりにC-rを使って探索を始めます。 C-rは、後向きに探索するコマンドisearch-backwardを起動します。 前向き探索が開始位置よりうしろにある一致箇所をみつけるのと同様に、 後向き探索は開始位置よりまえにある一致箇所をみつけだします。

インクリメンタルサーチ中には、文字C-yC-wを使って、 バッファから探索文字列へテキストを取り込むことができます。 この機能は、ポイント位置にあるテキストの出現箇所を探すときに便利です。 C-wは、ポイント以降の単語を探索文字列の一部としてコピーし、 ポイントをその単語の末尾に進めます。 探索を繰り返す意味でC-sを打つと、 その単語を含んだ文字列を探索します。 C-yC-wに似ていますが、 現在行の残りの部分をすべて探索文字列にコピーします。 大文字小文字を区別しない探索では、 C-yC-wはともに、 コピーするテキストを小文字だけに変換します。

文字M-yは、キルリングから探索文字列にテキストをコピーします。 これには、ヤンクコマンドC-yがヤンクするのと 同じテキストを用います。 See Yanking

インクリメンタルサーチを終了すると、 探索開始前にポイントがあった位置にマークを置きます。 これにより容易にその位置に戻れます。 暫定マーク(transient-mark)モードでは、 マークが不活性のときに限って、 インクリメンタルサーチが設定するマークも不活性です。

インクリメンタルサーチ中に用いる特別な文字をカスタマイズするには、 キーマップisearch-mode-map中のバインディングを変更します。 バインディング一覧は、C-h f isearch-mode <RET>を使って isearch-modeに関する説明文を参照してください。

低速端末でのインクリメンタルサーチ

速度の遅い端末でのインクリメンタルサーチでは、 表示時間が少なくてすむように設計された表示形式を使います。 みつけた箇所でバッファを再表示するかわりに、 新たに1行分のウィンドウを作ってそこにみつけた行を表示します。 この1行分のウィンドウは、 探索することでポイントが画面に表示中のテキストから 飛び出た時点で使われます。

探索を終了すると、この1行分のウィンドウは消えます。 そして、Emacsは探索を完了したウィンドウを再表示して、 新たなポイント位置を示します。

低速向けの表示形式を使うのは、 端末のボーレートが変数search-slow-speedの値以下である場合で、 その初期値は1200です。

低速向けの表示形式に使う表示用ウィンドウの行数は、 変数search-slow-window-linesで制御します。 通常の値は1です。


Node:Nonincremental Search, Next:, Previous:Incremental Search, Up:Search

一括型探索

Emacsでは、従来方式の一括型探索コマンドもあります。 探索を開始するまえに探索文字列全体を打っておく必要があります。

C-s <RET> string <RET>
stringを探索する。
C-r <RET> string <RET>
stringを後向きに探索する。

一括型探索を実行するには、まずC-s <RET>と打ちます。 すると、探索文字列を読み取るためにミニバッファに移動します。 文字列を<RET>で終えると、探索を開始します。 文字列がみつからなければ、探索コマンドはエラーになります。

C-s <RET>はつぎのように動作します。 まず、C-sがインクリメンタルサーチを起動します。 インクリメンタルサーチは、特別な場合として、 引数が空であったときには一括型探索を起動するようにプログラムしてあります。 (さもなければ、そのような空の引数に意味はない。) C-r <RET>もこのように動作します。

しかし、C-s <RET>で実行される一括型探索は、 search-forwardをただちに呼び出すわけではありません。 まず、つぎの文字が単語探索を指示するC-wであるかどうか調べます。

前向き/後向きの一括型探索は、 コマンドsearch-forwardsearch-backwardで実装されています。 これらのコマンドは通常と同じようにキーにバインドできます。 インクリメンタルサーチコマンドから呼び出せるようになっているのは、 歴史的な理由、および、 これらの機能にふさわしいキー列を選ぶ労力を削減できるという理由からです。


Node:Word Search, Next:, Previous:Nonincremental Search, Up:Search

単語探索

単語探索は、単語の区切られ方を無視して、単語の列を探索します。 より正確には、空白1個で区切った数個の単語を打ち込むと、 単語と単語のあいだに複数個の空白/改行/句読点があったとしても、 それらの文字列をみつけだすことができます。

単語探索は、テキスト清書系で整形済みの文書を編集する場合に便利です。 整形した印刷出力を見ながら編集する場合、 ソースファイルのどこで行が区切られているのかわかりません。 単語探索を使えば、単語の区切られ方を知らなくても探索できます。

C-s <RET> C-w words <RET>
句読点などの詳細は無視して、wordsを探索する。
C-r <RET> C-w words <RET>
句読点などの詳細は無視して、後向きにwordsを探索する。

単語探索は、一括型探索の特別な場合であって、 C-s <RET> C-wで起動します。 この入力に続いて、探索文字列を入力し、 文字列はつねに<RET>で終えます。 一括型であるため、単語探索も引数を入力し終えるまで探索を開始しません。 単語探索は、正規表現を構築し、その正規表現で探索を行うことで 動作します。 See Regexp Search

後向きの単語探索にはC-r <RET> C-wを使います。

前向き/後向きの単語探索は、それぞれ、 コマンドword-search-forwardword-search-backwardで 実装されています。 これらのコマンドは通常どおりキーに割り当てることができます。 インクリメンタルサーチコマンドから呼び出せるようになっているのは、 歴史的な理由、および、 これらの機能にふさわしいキー列を選ぶ労力を削減できるという理由からです。


Node:Regexp Search, Next:, Previous:Word Search, Up:Search

正規表現探索

正規表現(regular expression、regexpと略す)とは、 一致する可能性がある一連の(無限個でもよい)文字列を表現するパターンです。 GNU Emacsでは、インクリメンタルサーチでも一括型探索でも、 正規表現を用いてつぎの一致箇所を探索できます。

正規表現によるインクリメンタルサーチを実行するには、 C-M-sisearch-forward-regexp)と打ちます。 このコマンドは、C-sと同様に、探索文字列を逐次読み取ります。 ただし、探索文字列をバッファのテキストに対して正確に照合するため のものとみなすのではなく、正規表現として扱います。 探索文字列にテキストを追加するごとに、 正規表現は長くなり、新たな正規表現を探索します。 (値は関係ない)前置引数を指定してC-sを起動しても、 前向きに正規表現の探索を始められます。 後向きに正規表現を探索するには、 C-M-risearch-backward-regexp)を使うか、 前置引数を指定してC-rを使います。

通常のインクリメンタルサーチにおいて特別な機能を持つコントロール文字は、 正規表現のインクリメンタルサーチでも同じ機能を持ちます。 探索の開始直後にC-sC-rを打つと、 最後のインクリメンタルサーチに用いた正規表現を再度使います。 つまり、正規表現を用いる探索とそうでない探索とには、 それぞれ独立のデフォルトがあるのです。 M-pM-nで参照できる探索リングも それぞれ別々です。

正規表現のインクリメンタルサーチで<SPC>を打つと、 改行を含めた任意個の白文字に一致します。 ちょうど1個の空白に一致させたいのであれば、 C-q <SPC>と打ちます。

正規表現のインクリメンタルサーチ中に正規表現に文字を加えると、 カーソルをもとに戻して探索し直すことがあります。 たとえば、fooを探索し終えたときに\|barを追加したとします。 最初のbarが最初のfooに先行する場合には、 カーソルはまえに戻ります。

正規表現の一括型探索は、関数re-search-forwardre-search-backwardで行われます。 これらは、M-xで呼び出したり、キーに割り当てたり、あるいは、 C-M-s <RET>C-M-r <RET>として 正規表現のインクリメンタルサーチの方法で起動したりできます。

正規表現のインクリメンタルサーチコマンドに前置引数を指定すると、 isearch-forwardisearch-backwardのように、 普通の文字列探索を行います。 See Incremental Search


Node:Regexps, Next:, Previous:Regexp Search, Up:Search

正規表現の構文

正規表現には、特別な使い方をする少数の文字と その他の普通の文字から成る構文があります。 普通の文字は、 同じ文字だけに一致してそれ以外には一致しない単純な正規表現です。 特別な文字は、$^.*+?[]、および、\です。 \が先行する場合を除いて、 正規表現に現れるこれら以外の文字は普通の文字です。

たとえば、fは特別な文字ではなく、通常の文字ですから、 文字列fに一致してそれ以外の文字列には一致しない正規表現です。 (これは、文字列ffには一致しない。) 同様に、oは、oだけに一致する正規表現です。 (大文字小文字を区別しない場合、 これらの正規表現はFOにも一致するが、 これらは例外というよりは、『同じ文字列』の一般化として捉える。)

任意の2つの正規表現abを連結できます。 その結果は、aが文字列の始めの適当な部分に一致して、かつ、 bが文字列の残りの部分に一致する場合に、 文字列に一致するような正規表現です。

簡単な例として、正規表現foを連結すると、 正規表現foを得ますが、 これは文字列foだけに一致します。 簡単ですね。 多少とも複雑なことを行うには、特別な文字を使う必要があります。 以下にその一覧をあげます。

. (ピリオド)
特別な文字であり、改行以外の任意の1文字に一致する。 連結を使ってa.bのような正規表現を作れる。 これは、aで始まりbで終る任意の3文字の文字列に一致する。
*
単独では構成要素ではない。 直前の正規表現を可能な限り反復することを意味する後置演算子である。 すなわち、(oが存在しない場合も含めて) o*は任意個のoに一致する。

*はつねに先行する最小の正規表現に適用される。 したがって、fo*foを繰り返すのではなく、 oを繰り返す。 この正規表現はffofooなどに一致する。

*を用いた構成は、一致を処理するときには、 ただちに得られる限りの反復回数に展開される。 そうしてから、残りのパターンを処理する。 一致に失敗すると、バックトラック(後戻り)が発生して、 *を用いた構成の反復回数を減らして、 パターンの残りの部分が一致するようにする。 たとえば、文字列caaarに対して ca*arを一致させることを考えてみる。 始めに、a*を3つのaすべてに一致させようとする。 しかし、残りのパターンがarなのにrしか残っていないため、 この試みは失敗する。 そこで、つぎはa*a2つだけに一致させる。 こうすると、残りの正規表現も正しく一致する。

+
*に似た後置演算子だが、 直前の正規表現に1回以上一致する必要がある。 たとえば、ca+rは、文字列carcaaaarには一致するが、 文字列crには一致ない。 ca*rの場合は、上記の3つすべてに一致する。
?
*に似た後置演算子だが、 直前の正規表現に1回だけ一致するか、あるいは、1回も一致しない。 たとえば、ca?rは、carcrに一致するが、 他のものには一致しない。
[ ... ]
[で始まり]で終る文字集合を表す。 もっとも単純な場合は、 この2つの中括弧のあいだにある文字の1つ1つがこの文字集合に一致する。

したがって、[ad]は、a1文字かd1文字のどちらにも一致する。 [ad]*は、adだけから成る (空の文字列を含む)任意の文字列に一致する。 このことから、c[ad]*rは、 crcarcdrcaddaarなどに一致することがわかる。

文字集合には、文字範囲の指定を含めることもでき、 始めの文字と終りの文字のあいだに-を書く。 つまり、[a-z]はすべてのASCII小文字に一致する。 範囲指定と個々の文字を自由に織り混ぜてよく、 [a-z$%.]のように書ける。 これは、任意のASCII小文字、$%、ピリオドに一致する。

文字集合の内側では、正規表現の通常の特別な文字を 特別扱いしないことに注意。 文字集合の内側では、まったく別の特別な文字、 ]-、および、^が存在する。

文字集合に]を含めるには、 ]を最初の文字として指定する必要がある。 たとえば、[]a]は、]aに一致する。 -を含めるのであれば、-を文字集合の最初の文字か 最後の文字として指定して、範囲指定のあとに置く。 したがって、[]-]は、]-の両方に一致する。

文字集合に^を含めるには、^を文字集合の2番目以降に置く。

大文字小文字を区別する探索で文字範囲を指定するときは、 範囲の両端を、大文字だけ、小文字だけ、あるいは、 英字以外だけで書くべきである。 A-zのような大文字小文字を混ぜた文字範囲の動作は、 定義が明確ではなく、将来のEmacsでは変更するかもしれない。

[^ ... ]
[^文字の補集合の始まりを意味し、 指定した文字を除く任意の文字に一致する。 すなわち、[^a-z0-9A-Z]は、 英文字と数字を除くすべての文字に一致する。

^は先頭になければ文字集合では特別な意味を持たない。 ^に続く文字は先頭にあるものとして扱われる (いいかえれば、ここでは-]は特別な意味を持たない)。

文字の補集合は、一致しない文字として改行を指定しない限り、改行にも一致する。 この点は、grepのようなプログラムでの正規表現の扱い方と対照的。

^
空の文字列に一致する特別な文字で、テキスト行の先頭のみに一致する。 それ以外では、一致に失敗する。 したがって、^fooは、行頭にあるfooに一致する。
$
^と似ていて、行末のみに一致する。 したがって、x+$は、 行末にある1文字以上のxから成る文字列に一致する。
\
2つの機能がある。 (\を含む)特別な文字をクォートする(意味を抑える)ことと、 特別な構成を導入すること。

\は特別な文字をクォートするので、 \$は文字$だけに一致する正規表現、 \[は文字[だけに一致する正規表現、 というようになる。

注意: 従来との互換性のために、特別な文字が、 それらの特別な意味をなしえない文脈で使われた場合には、 普通の文字として扱われます。 たとえば、*fooでは、*の対象となる正規表現が直前にないため、 *は普通の文字として扱われます。 このようなふるまいに依存することはよい習慣ではありません。 特別な文字を書く位置に関係なく特別な文字はクォートするべきです。

多くの場合、任意の文字を伴う\はその文字だけに一致します。 しかし、いくつか例外があって、 \で始まる2文字列が特別な意味を持つ場合があります。 2文字目にくる文字は、 単独で使った場合には普通の文字として扱われるものです。 以下に\の構成を列挙します。

\|
選択肢を指定する。 \|をあいだに伴った2つの正規表現abは、 abのいずれかに一致する文字列に一致する正規表現となる。

したがって、foo\|barは、foobarに一致するが、 それ以外の文字列には一致しない。

\|は、周囲にある適用しうる正規表現の中でも最大のものに適用される。 \|によるグループ化を制限するのは、 これを囲む\( ... \)によるグループ化だけ。

何度\|を使っても処理できるだけの十分なバックトラック能力がある。

\( ... \)
以下の3つの目的を果たすグループ化のための構成。

  1. 他の操作に使うために一連の選択肢\|を括る。 したがって、\(foo\|bar\)xは、 fooxbarxのいずれかに一致する。
  2. 後置演算子、*+?を適用できるように、 複雑な正規表現を括る。 したがって、ba\(na\)*は、 banananaのように、(0個以上の)任意個の 文字列naに一致する。
  3. あとで参照できるように、一致した部分文字列を記録する。

最後の使い方は、括弧によるグループ化という考え方から 派生したものではない。 同一の\( ... \)構成に与えた2つめの別の機能である。 実用上、これら2つの意味が混同されることはない。

\d
d番目に現れた\( ... \)に一致したテキストと 同じテキストに一致する。

一致を処理するときには、\( ... \)構成の末尾に達すると、 この構成に一致したテキストの始めと終りを記録する。 そして、正規表現のそれよりうしろでは、 『d番目に現れた\( ... \)に一致したテキスト』という意味で \に続けて数字dを使える。

1つの正規表現内に現れる最初の9個の\( ... \)に一致する文字列には、 正規表現中で開き括弧が現れた順に、1から9までの番号を割りふる。 そのため、\1から\9で、 対応する\( ... \)に一致したテキストを参照できる。

たとえば、\(.*\)\1は、改行を含まない文字列で、かつ、 前半と後半が同一である文字列に一致する。 \(.*\)は前半部分に一致し、それはどのようなものでもかまわない。 一方、それに続く\1は、 前半部分とまったく同じテキストに一致しなければならない。

ある\( ... \)が、 (直後に*がある場合などに簡単に起こりえる) 複数回一致する場合には、最後に一致したものだけを記録する。

\`
空の文字列に一致するが、 一致対象であるバッファや文字列の先頭に限る。
\'
空の文字列に一致するが、 一致対象であるバッファや文字列の末尾に限る。
\=
空の文字列に一致するが、ポイント位置に限る。
\b
同じく空の文字列に一致するが、単語の先頭や末尾に限る。 したがって、\bfoo\bは、単語として独立して現れるfooに一致する。 \bballs?\bは、単語として独立して現れる ballballsに一致する。

\bは、 バッファの先頭や末尾にあるテキストとは無関係に、 バッファの先頭や末尾にも一致する。

\B
空の文字列に一致するが、単語の先頭や末尾以外に限る。
\<
空の文字列に一致するが、単語の先頭に限る。 \<は、単語構成文字が続く場合に限って、 バッファの先頭にも一致する。
\>
空の文字列に一致するが、単語の末尾に限る。 \>は、単語構成文字で終了している場合に限って、 バッファの末尾にも一致する。
\w
任意の単語構成文字に一致する。 エディタの構文テーブルによってこの文字が決まる。 see Syntax
\W
単語構成文字以外の文字に一致する。
\sc
構文がcである文字だけに一致する。 ここで、cは構文コードを表す文字。 たとえば、wは単語構成要素を、 -は白文字を、(は開き括弧を表すといった具合。 (改行を含む)白文字は、-や空白で表す。
\Sc
構文がcでない任意の文字に一致する。

単語や構文に関連する構成要素は、 構文テーブル(see Syntax)の設定で制御されます。

複雑な正規表現を以下に示します。 これは、任意個の白文字がうしろに続く文末を認識するためにEmacsが使うものです。 空白とタブ文字を区別できるように、Lispの構文で示してあります。 Lisp構文では、文字列定数はダブルクォートで始まり、 ダブルクォートで終ります。 \"は正規表現の一部としてのダブルクォートを表し、 \\は正規表現の一部としてのバックスラッシュを表します。 \tはタブ文字、\nは改行文字を表します。

"[.?!][]\"')]*\\($\\|\t\\|  \\)[ \t\n]*"

この正規表現は4つの部分が繋がってできています。 ピリオド、?!のいずれかに一致する文字集合。 閉じ中括、2種類の引用符、括弧に一致する文字集合の任意回数の繰り返し。 バックスラッシュ付きの括弧で括った、 行末、タブ、空白2つのいずれかに一致する選択肢。 白文字に一致する文字集合の任意回数の繰り返し。

これと同じ正規表現を対話的に入力するときには、 タブを入力するには<TAB>を打ち、 改行を入力するにはC-jを打ちます。 また、Lisp構文上ではバックスラッシュを2つ続けてますが、 対話的に入力するには、1つのバックスラッシュだけを打ちます。


Node:Search Case, Next:, Previous:Regexps, Up:Search

探索と大文字小文字の区別

Emacsのインクリメンタルサーチでは、小文字だけで探索文字列を指定すると、 探索対象のテキストの大文字小文字の違いを通常無視します。 したがって、fooを探索するように指定すると、 Fooにもfooにも一致します。 正規表現、特に文字集合の場合でも同様です。 [ab]は、aAbBのいずれにも一致します。

インクリメンタルサーチする探索文字列のどこかに大文字があると、 大文字小文字を区別して探索します。 したがって、Fooの探索では、 fooFOOをみつけだせません。 このことは、文字列の探索だけでなく正規表現の探索にもあてはまります。 探索文字列から大文字を消去すれば、この効果はなくなります。

変数case-fold-searchnilを設定すれば、 大文字小文字の違いを含めて、すべての文字はそのとおりに一致するようになります。 これは、バッファごとの変数です。 変数を変更してもカレントバッファだけに影響しますが、 変更可能なデフォルトの値があります。 See Locals。 この変数は、置換コマンド(see Replace)や ミニバッファの履歴探索コマンド(see Minibuffer History)が 行う探索を含む、一括型探索にも適用されます。


Node:Replace, Next:, Previous:Search Case, Up:Search

置換コマンド

大域的な探索置換操作は、他のエディタ 13 で必要なほどEmacsでは必要はありませんが、Emacsでも使えます。 多くのエディタにあるような単純なコマンドM-x replace-stringの他にも、 パターンの各出現ごとに置換するかどうか尋ねてくる M-x query-replaceコマンドがあります。

置換コマンドは、通常、ポイントからバッファの末尾までのテキストを操作します。 しかし、暫定マーク(transient-mark)モードでは、 マークが活性である場合にはリージョンを操作します。 置換コマンドはどれも、 1つの文字列(や正規表現)を1つの置換文字列に置き換えます。 コマンドexpand-region-abbrevs(see Expanding Abbrevs)を使って、 いくつかの置き換えを並行に行うことができます。


Node:Unconditional Replace, Next:, Previous:Replace, Up:Replace

無条件置換

M-x replace-string <RET> string <RET> newstring <RET>
stringのすべての出現をnewstringで置換する。
M-x replace-regexp <RET> regexp <RET> newstring <RET>
正規表現regexpに一致するものすべてをnewstringで置換する。

ポイント以降にあるfooのすべての出現を barで置き換えるには、2つの引数foobarを指定した コマンドM-x replace-stringを使います。 置換はポイント以降でのみ実施されますから、 バッファ全体に対して置換を行いたいときには、 まずバッファの先頭に移動しておく必要があります。 バッファの末尾までに現れるすべての出現を置換します。 バッファの一部に置換を限定したいときには、 置換を実行するまえに、バッファの当該部分にナロイングしておきます (see Narrowing)。 暫定マーク(transient-mark)モードにおいては、 リージョンが活性のときには、置換はリージョン内に限定されます。

replace-stringを終了すると、 ポイントは最後に置換した出現箇所に置かれます。 マークは(replace-stringコマンドを起動したとき) 以前のポイント位置に設定されます。 その位置に戻るにはC-u C-<SPC>を使います。

数引数を指定すると、 単語区切りで囲まれた出現だけを置換対象とします。 引数の値は関係ありません。


Node:Regexp Replace, Next:, Previous:Unconditional Replace, Up:Replace

正規表現による置換

M-x replace-stringコマンドは、 1つの文字列に正確に一致するものだけを置き換えます。 これに類似したコマンドM-x replace-regexpは、 指定したパターンに一致する任意のものを置き換えます。

replace-regexpでは、 newstringが定数である必要はありません。 regexpに一致したものの全体あるいはその一部を参照できます。 newstringの中の\&は、 置換対象の文字列全体(つまり、regexpに一致したものの全体)を 表します。 newstringの中の\ddは数字)は、 regexpの中のd番目の括弧のグループ化部分に 一致した部分を表します。 置き換えるテキスト内に\を含めるには、 \\と入力する必要があります。

M-x replace-regexp <RET> c[ad]+r <RET> \&-safe <RET>

たとえばこの例は、cadrcadr-safeで、 cddrcddr-safeで置換します。

M-x replace-regexp <RET> \(c[ad]+r\)-safe <RET> \1 <RET>

この例は、逆の置換を行います。


Node:Replacement and Case, Next:, Previous:Regexp Replace, Up:Replace

置換コマンドと大文字小文字の区別

置換コマンドの第1引数がすべて小文字である場合、 case-fold-searchnil以外であるときには、 大文字小文字を区別せずに置換対象を探索します。 case-fold-searchnilであるときには、 すべての探索において大文字小文字を区別します。

さらに、引数newstringが、すべて小文字、あるいは、 一部が小文字のときには、置換コマンドは、 各置換対象の大文字小文字のパターンを保存しようとします。 つまり、コマンド

M-x replace-string <RET> foo <RET> bar <RET>

は、小文字のfooを小文字のbarに、 すべて大文字のFOOBARに、 大文字で始まるFooBarに置換します。 (replace-stringが区別できるのは、これら3つの選択肢、 つまり、小文字のみ、すべて大文字、大文字で始まるだけ。)

置換文字列に大文字を使ったときには、 これを挿入するときは大文字は大文字のままです。 第1引数に大文字を使ったときには、 第2引数では大文字小文字を変換せずにつねに指定どおりに置き換えます。 同様に、case-replacecase-fold-searchnilを設定すると、 大文字小文字を変換せずに置換します。


Node:Query Replace, Previous:Replacement and Case, Up:Replace

問い合わせ型置換

M-% string <RET> newstring <RET>
M-x query-replace <RET> string <RET> newstring <RET>
stringのいくつかの出現をnewstringで置換する。
C-M-% regexp <RET> newstring <RET>
M-x query-replace-regexp <RET> regexp <RET> newstring <RET>
正規表現regexpに一致するもののいくつかをnewstringで置換する。

fooのすべての出現ではなく、 そのうちのいくつかだけをbarに変更したいときには、 通常のreplace-stringを使うことはできません。 かわりに、M-%query-replace)を使います。 このコマンドはfooの出現をみつけるたびに、 その出現を表示し、置換するかどうか聞いてきます。 query-replaceに数引数を指定すると、 単語区切り文字で区切られた出現だけを対象とします。 通常どおりcase-replacenil以外であれば、 replace-stringと同じく、 このコマンドも大文字小文字の違いを保存します。

問い合わせることを除けば、 query-replacereplace-stringと同様に動作し、 query-replace-regexpreplace-regexpと同様に動作します。 このコマンドは、C-M-%で実行できます。

stringの出現やregexpに一致したものが表示されたときに 打てる文字はつぎのとおりです。

<SPC>
出現をnewstringで置換する。
<DEL>
この出現を置換せずにつぎの出現箇所に進む。
, (カンマ)
この出現を置換し、結果を表示する。 そして、つぎに何をするか指示する文字を聞いてくる。 置換自体はすでに完了しているので、 この状況では<DEL>と<SPC>は等価であり、 つぎの出現箇所へ移動するという意味。

この時点では、C-r(下記参照)を打って、置換したテキストを変更できる。 また、C-x uと打って、置換をアンドゥする(もとに戻す)こともできるが、 そうすると、query-replaceを終了してしまう。 さらに先の置換を行いたいときには、 C-x <ESC> <ESC> <RET>を使って再開する必要がある (see Repetition)。

<RET>
これ以上何も置換しないで終了する。
. (ピリオド)
この出現を置換してから、これ以上探索せずに終了する。
!
これ以降、問い合わせずに残りの出現すべてを置換する。
^
誤って変更してしまった場合などに、 1つまえの出現箇所(あるいは置換してしまった出現箇所)に戻る。 これは、マークリングから位置を取り出して動作する。 query-replaceは直前の1つの置換位置だけを記録するため、 ^を続けて入力しても意味はない。
C-r
単にnewstringで置換するだけでなく、 この出現を編集する必要がある場合などに、再帰編集レベルに入る。 編集し終えてC-M-cで再帰編集を抜けると、つぎの出現箇所に移動する。 see Recursive Edit
C-w
出現を削除してから、C-rと同様に再帰編集レベルに入る。 再帰編集を使って、削除したstringの出現を置き換えるテキストを挿入する。 編集し終えてC-M-cで再帰編集を抜けると、つぎの出現箇所に移動する。
C-l
画面を再表示する。 そうしたら、この出現に対して何を行うかを指示する別の文字を打つ必要がある。
C-h
これらのオプションの要約メッセージを表示する。 そうしたら、この出現に対して何を行うかを指示する別の文字を打つ必要がある。

上記のコマンドの別名である文字が他にもいくつかあります。 ynqは、それぞれ、 <SPC>、<DEL>、<RET>に等価です。

これ以外の文字はquery-replaceを終了し、 その文字はキー列の一部になります。 したがって、C-kと打つと、 query-replaceを終了してから、行末までをキルします。

一度抜けたquery-replaceを再開するには、 C-x <ESC> <ESC>を使います。 このコマンドはquery-replaceを繰り返します。 というのは、query-replaceはミニバッファで引数を読み取るからです。 See C-x ESC ESC

ファイル名に対して正規表現に一致する部分を置換することで、 ファイルの改名、コピー、リンクを行うdiredコマンドについては、 Transforming File Namesも参照してください。


Node:Other Repeating Search, Previous:Replace, Up:Search

他の探索繰り返しコマンド

正規表現に一致するものをみつけるコマンドは、他にもいくつかあります。 それらは、ポイント位置からバッファの末尾までを操作対象とします。 さらに、パターンに大文字が含まれていないときや、 case-fold-searchnil以外であるときには、 大文字小文字の違いを無視して一致を探します。

M-x occur <RET> regexp <RET>
regexpに一致するものを含むバッファ内の各行の一覧を表示する。 数引数で、一致した各行の前後何行を表示するか指定する。 デフォルトは0行。 バッファの一部に探索を制限するには、 その部分にナロイングする(see Narrowing)。

出力を表示したバッファ*Occur*は、 もとの文脈での出現位置を探すためのメニューとして機能する。 *Occur*に表示された出現をMouse-2でクリックするか、あるいは、 ポイントをそこに置いて<RET>を打つ。 この操作により、探索を行ったバッファに切り替え、 選択した出現のもとの位置にポイントを移動する。

M-x list-matching-lines
M-x occurと同じ。
M-x count-matches <RET> regexp <RET>
ポイント以降でregexpに一致するものの個数を表示する。
M-x flush-lines <RET> regexp <RET>
ポイント以降にあってregexpに一致するものを含む各行を削除する。
M-x keep-lines <RET> regexp <RET>
ポイント以降にあってregexpに一致するものを 含まない各行を削除する。

さらに、Emacsからgrepを使って、 一連のファイルに対して正規表現に一致するものを探して、 一致するものを含むファイルを順番に、あるいは、 任意の順に訪問できます。 See Grep Searching


Node:Fixit, Next:, Previous:Search, Up:Top

打ちまちがい訂正用コマンド

本章では、入力直後にテキストのまちがいに気づいたとき、 あるいは、テキストを作成中に気が変わったときに 特に便利なコマンドを説明します。

まちがった編集を訂正するもっとも基本的なコマンドは、アンドゥコマンド、 C-x uC-_です。 このコマンドは、(通常)1つのコマンド、 コマンドの一部分(query-replaceの場合)、 いくつかの連続した自己挿入文字をアンドゥします。 C-_C-x uを連続して繰り返すと、 アンドゥ情報がある限り、次々と以前の変更をアンドゥします。 より詳しくは、See Undo


Node:Kill Errors, Next:, Up:Fixit

誤りの訂正

<DEL>
ポイントの直前の文字を削除する(delete-backward-char)。
M-<DEL>
ポイントの直前の単語をキルする(backward-kill-word)。
C-x <DEL>
ポイントから文の先頭までをキルする(backward-kill-sentence)。

<DEL>文字(delete-backward-char)は もっとも重要な訂正コマンドです。 ポイントの直前にある文字を削除します。 自己挿入文字のコマンドに続けて<DEL>を打つと、 そのコマンドを取り消すと考えることができます。 しかし、コマンドを取り消す一般的な方法は<DEL>であるなどと 誤解しないでください。

まちがいが数文字よりも長いときには、 M-<DEL>C-x <DEL>を使うほうが便利でしょう。 M-<DEL>は直前の単語の先頭までをキルし、 C-x <DEL>は直前の文の先頭までをキルします。 文を書いている途中で気が変わったときには、 C-x <DEL>が特に便利です。 M-<DEL>C-x <DEL>は、 キルしたテキストをC-yM-yで戻せるように保存します。 See Yanking

何を打とうとしているのか混乱したりわからなくなったりしたときには、 打ちまちがいがたとえ数文字であってもM-<DEL>はとても便利です。 このような場合、画面を見ながらでないと<DEL>では訂正できません。 M-<DEL>ならば、ほとんど何も考えずに単語全体をキルして、 入力を再開できます。


Node:Transpose, Next:, Previous:Kill Errors, Up:Fixit

テキストの入れ替え

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だけで訂正できます。 まちがいにすぐに気づかなかったときには、 2つの入れ替わっている文字のあいだにカーソルを移動する必要があります。 空白とそのまえの単語の最後の文字とを入れ替えてしまったときには、 単語移動コマンドでその場所へ戻るのがよいでしょう。 それ以外の場合には、後向き探索(C-r)が最良であることがままあります。 See Search

M-ttranspose-words)は、 ポイントの直前の単語とポイントの直後の単語を入れ替えます。 ポイントは単語を1つ前向きに横断し、 ポイントの直前の単語かポイントを含む単語を前向きに引きずっていきます。 単語のあいだにある句読点文字は動きません。 たとえば、FOO, BARBAR FOO,ではなくて、 BAR, FOOと入れ替わります。

C-M-ttranspose-sexps)は、2つの式(see Lists)を 入れ替えるコマンドです。 また、C-x C-ttranspose-lines)は、行を入れ替えます。 これらのコマンドはM-tに似た動作をしますが、 テキストを構文単位に分ける点が異なります。

入れ替えコマンドに数引数を指定すると、反復回数になります。 ポイントの直前やポイントを含む文字(単語、S式、行)を いくつ先の文字(単語、S式、行)へ移動するか指定します。 たとえば、C-u 3 C-tは、ポイントの直前の文字を3文字先の文字へ移動します。 つまり、f-!-oobaroobf-!-arにします。 これは C-tを3回繰り返したのと同じことです。 C-u - 4 M-tは、ポイントの直前の単語を4つまえの単語へ移動します。 C-u - C-M-tは、引数を指定しないC-M-tの効果を打ち消します。

数引数0には特別な意味があります (さもないと、コマンドを0回繰り返しても何もしない)。 ポイントの直後の文字(単語、S式、行)と マークの直後の文字(単語、S式、行)を入れ替えます。


Node:Fixing Case, Next:, Previous:Transpose, Up:Fixit

大文字小文字変換

M-- M-l
ポイントの直前の単語を小文字に変換する。 Meta--はメタ・マイナス。
M-- M-u
ポイントの直前の単語をすべて大文字に変換する。
M-- M-c
ポイントの直前の単語を最初の文字だけ大文字にして残りを小文字にする。

とてもよくあるまちがいは、単語を打つときに大文字小文字をまちがうことです。 このため、単語の大文字小文字を変換するコマンド、 M-lM-uM-cに負の引数を指定すると、 カーソル(ポイント)を移動しないという特別な機能があります。 単語を打ちまちがえたとすぐに気づいたときには、 単に大文字小文字を変換して、入力を続けられます。 See Case


Node:Spelling, Previous:Fixing Case, Up:Fixit

綴りの検査と訂正

本節では、1つの単語やバッファのある部分の綴りを検査するコマンドを説明します。 これらのコマンドは、Emacsの一部ではない綴り検査プログラム (スペルチェッカ)ispellを 使って動作します。

M-x flyspell-mode
フライスペル(flyspell)モードをオンにする。 綴り誤りのあるすべての単語を強調表示する。
M-$
ポイント位置にある単語の綴りを検査し訂正する (ispell-word)。
M-<TAB>
綴り辞書に基づいてポイントの直前の単語を補完する (ispell-complete-word)。
M-x ispell-buffer
バッファ内の各単語の綴りを検査し訂正する。
M-x ispell-region
リージョン内の各単語の綴りを検査し訂正する。
M-x ispell-message
引用部分を除いて、メイルメッセージの草稿の各単語の綴りを検査し訂正する。
M-x ispell-change-dictionary <RET> dict <RET>
辞書としてdictを使ってispellプロセスを再起動する。
M-x ispell-kill-ispell
ispellプロセスを終了させる。

フライスペル(flyspell)モードは、 Emacsで編集しているときに全自動で綴り検査をする方法です。 単語を変更したり挿入したりするたびにその単語を検査します。 認識できない単語をみつけると、その単語を強調表示します。 これはユーザーの編集には干渉しませんが、 ある単語が強調表示されたら、その単語へ移動して訂正できます。 カレントバッファでこのモードをオン/オフするには、 M-x flyspell-modeと打ちます。

フライスペル(flyspell)モードが ある単語を綴りまちがいであると強調表示したときには、 その単語をMouse-2でクリックできます。 すると、訂正候補やどんな操作を行えるか表示されます。 単語を手動で編集して好きなように訂正してもかまいません。

Emacsの他の綴り検査機能は、明示的にコマンドを実行したときに 単語の検査を行います。 バッファ全体やその一部分の綴りを検査する機能は、 Emacsセッション以外で作成した綴り誤りを含むかもしれないテキストには有益です。

ポイントの周りかポイントのつぎにある単語の綴りを検査し、 場合によっては訂正するには、 M-$ispell-word)コマンドを使います。 単語が正しくないときには、 その単語についてどうするかのさまざまな選択肢を提示します。

カレントバッファ全体を検査するには、M-x ispell-bufferを使います。 カレントリージョンだけを検査するには、M-x ispell-regionを使います。 書きかけの電子メイルメッセージの綴りを検査するには、 M-x ispell-messageを使います。 これは、バッファ全体を検査しますが、 字下げしてある部分や他のメッセージからの引用と思われる部分は検査しません。

これらのコマンドは、正しくない単語に出会うたびに、どうするか聞いてきます。 通常、検査した単語に似ている『近い』単語をいくつか含めた 選択肢一覧を表示します。 そうしたら、文字を打たなくてはなりません。 以下に有効な返答をあげます。

<SPC>
この単語をスキップする。 この単語は正しくないとしておくが、ここでは変更しない。
r new <RET>
(今回だけは)newで置き換える。
R new <RET>
単語をnewで置き換える。 さらに、バッファの他の箇所でも置き換えられるように query-replaceを実行する。
digit
(今回だけは)この単語を『近い』単語の1つで置き換える。 『近い』単語にはそれぞれ数字が付いているので、その数字を打つ。
a
正しくない単語を容認する。 この編集セッションに限って、正しいかのように扱う。
A
正しくない単語を容認する。 この編集セッションのこのバッファに限って、正しいかのように扱う。
i
この単語を個人辞書ファイルに入れ、 ispellは今後のセッションを含めてこれ以降この単語を正しいものとして扱う。
u
この単語を小文字に変換して個人辞書ファイルに入れる。
m
iと同様だが、辞書の補完情報も記録できる。
l word <RET>
wordに一致する単語を辞書から探す。 みつかった単語は、新たな『近い』単語一覧となり、 数字を打って置き換える単語を選べる。 wordには、ワイルドカード*を使うこともできる。
C-g
対話的な綴り検査を終了する。 C-u M-$で、あとで再開できる。
X
C-gと同じ。
x
対話的な綴り検査を終了し、綴り検査を始めた箇所へポイントを戻す。
q
対話的な綴り検査を終了し、ispellプロセスを終了させる。
C-l
画面を再描画する。
C-z
このキーは普通のコマンドの意味 (Emacsを休止する、あるいは、このフレームをアイコン化する)。

テキスト(text)モードやその関連したモードでは M-<TAB>キーにバインドしてあるコマンド ispell-complete-wordは、 綴り訂正に基づいた補完一覧を提示します。 単語の始めの部分を挿入してからM-<TAB>と打つと、 補完一覧ウィンドウを表示します。 補完一覧から1つを選ぶには、 候補のうえでMouse-2をクリックするか、 カーソルを補完ウィンドウの単語の箇所に移動してから <RET>と打ちます。 See Text Mode

一度綴り検査を行うと、ispellプロセスは(何かすることを待って) 動き続けます。 ですから、つぎに綴り検査コマンドを使うと、 より早く実行を完了します。 ispellプロセスを取り除きたいときには、 M-x ispell-kill-ispellを使います。 ispellプロセスは綴り訂正をしているとき以外には何もしないので、 通常はこのコマンドを使う必要はありません。

ispellは2つの辞書を使います。 標準辞書と個人辞書です。 変数ispell-dictionaryは、使用すべき標準辞書のファイル名を指定します。 この値がnilならば、デフォルトの辞書を使います。 M-x ispell-change-dictionaryコマンドはこの変数を設定して、 設定した辞書を使うようにispellサブプロセスを再起動します。


Node:Files, Next:, Previous:Fixit, Up:Top

ファイルの扱い方

オペレーティングシステムは、 データを指定したファイル(file)に恒久的に保存します。 ですから、Emacsで編集するテキストの多くはファイルから取り込み、 最終的にはファイルに格納されます。

ファイルを編集するには、 Emacsに対してファイルを読むように指示して、 ファイルの内容のコピーを入れたバッファを用意させる必要があります。 これを、ファイルを訪問する/訪れる(visiting)といいます。 編集コマンドはバッファ内のテキストに直接作用します。 つまり、Emacs内にあるコピーを操作します。 バッファをファイルに保存(save)した場合に限り、 変更はファイルそのものに反映されます。

ファイルを訪問したり保存したりすることに加えて、 Emacsは、ファイルを、削除したり、コピーしたり、名前を変更したり、 別のファイルへ追加したり、複数の版を保持したり、 ファイルディレクトリを操作したりできます。


Node:File Names, Next:, Up:Files

ファイル名

ファイルを操作するほとんどのEmacsコマンドには、 ファイル名を指定する必要があります。 (保存と復元の操作を除く。 バッファはこれらの操作に対して使うファイル名を記録している。) ファイル名は、ミニバッファを使って入力します(see Minibuffer)。 長いファイル名の指定を簡単にする補完も使えます。 See Completion

多くの操作には、デフォルトファイル名があり、 <RET>だけを打って空の引数を指定した場合に使われます。 通常、デフォルトファイル名は、 カレントバッファで訪問したファイルの名前です。 こうすることで、 Emacsのファイルコマンドで当該ファイルを操作するのが簡単になります。

各バッファにはデフォルトディレクトリがあります。 通常は、そのバッファの訪問先のファイルのディレクトリと同じです。 ディレクトリを指定しないでファイル名を入力すると、 デフォルトディレクトリを使います。 スラッシュ(/)で始まらない相対的なディレクトリを指定すると、 デフォルトディレクトリ相対に解釈します。 デフォルトディレクトリは変数default-directoryに保持されていて、 バッファごとに別々の値を持ちます。

たとえば、デフォルトファイル名が/u/rms/gnu/gnu.tasksならば、 デフォルトディレクトリは/u/rms/gnu/です。 ディレクトリを指定しないでfooとだけ打つと、 /u/rms/gnu/fooを意味します。 ../.loginは、/u/rms/.loginを意味します。 new/fooは、ファイル名/u/rms/gnu/new/fooを意味します。

コマンドM-x pwdは、カレントバッファのデフォルトディレクトリを表示し、 コマンドM-x cdは、それを(ミニバッファで読んだ値に)設定します。 バッファのデフォルトディレクトリは、 cdコマンドを使ったときだけ変更されます。 ファイルを訪問しているバッファのデフォルトディレクトリは、 訪問したファイルのディレクトリに初期化されます。 C-x bで作ったバッファのデフォルトディレクトリは、 その時点のカレントバッファのデフォルトディレクトリと同じです。

デフォルトディレクトリは、ミニバッファでファイル名を読むときに、 実際にミニバッファに表示されます。 これには2つの目的があります。 デフォルトが何であるかを示すことで、 相対ファイル名を打ち込めるようにし、しかも、 その意味を確実に知ることができるようにします。 もう1つは、デフォルトディレクトリを編集して、 別のディレクトリを指定できるようにします。 変数insert-default-directorynilに設定すると、 デフォルトディレクトリを挿入しません。

ミニバッファで入力するとき、 テキストの一部として入っているデフォルトディレクトリを無視して、 絶対ファイル名を打っても何の問題もありません。 最終的なミニバッファの内容は不正なように見えても、 そうではありません。 たとえば、ミニバッファには/usr/tmp/が入っていて /x1/rms/fooを追加すると、/usr/tmp//x1/rms/fooとなります。 Emacsは連続した2個のスラッシュの始めのスラッシュまでをすべて無視するので、 結果として/x1/rms/fooとなります。 See Minibuffer File

ファイル名の中の$は環境変数で置き換えられます。 たとえば、シェルコマンドexport FOO=rms/hacksで、 環境変数FOOを設定してあるとします。 そうすると、/u/rms/hacks/test.cの略称として /u/$FOO/test.c/u/${FOO}/test.cを使えます。 環境変数の名前は、$のうしろにある英数字全部です。 あるいは、$のうしろにある括弧で囲まれたものです。 シェルコマンドで設定した環境変数がEmacsに影響を及ぼすのは、 Emacsを起動するまえに設定したものに限ります。

名前の中に$があるファイルを参照するには、 $$と打ちます。 1個の$に対して変数の置き換えを行うときに、 この2個の$は1個の$に変換されます。 あるいは、ファイル名全体を/:でクォートします (see Quoted File Names)。

(変数の)置き換えを行うLisp関数はsubstitute-in-file-nameです。 置き換えは、ミニバッファで読んだファイル名だけに適用されます。

変数file-name-coding-systemnil以外を設定すると、 ファイル名に非ASCIIを含めることができます。 See Specify Coding


Node:Visiting, Next:, Previous:File Names, Up:Files

ファイルを訪問する

C-x C-f
ファイルを訪問する(find-file)。
C-x C-r
ファイルを眺めるために訪問し、変更を許さない (find-file-read-only)。
C-x C-v
最後に訪問したファイルのかわりに、別のファイルを訪問する (find-alternate-file)。
C-x 4 f
別のウィンドウでファイルを訪問する (find-file-other-window)。 選択されているウィンドウに表示されている内容は変化しない。
C-x 5 f
新たなフレームでファイルを訪問する (find-file-other-frame)。 選択されているフレームに表示されている内容は変化しない。
M-x find-file-literally
ファイルの内容をいっさい変換せずに訪問する。

ファイルを訪問する/訪れるとは、 ファイルの内容のコピーを編集できるようにEmacsバッファに入れることです。 Emacsは、訪問する各ファイルごとに新たにバッファを作ります。 バッファ名は、ディレクトリ部分を取りさったファイル名から作ります。 たとえば、ファイル名/usr/rms/emacs.texの バッファ名はemacs.texとなります。 その名前のバッファがすでに存在するならば、 まだ使われていない名前になるようなもっとも小さい数を使って、 <2>, <3>などを付加して唯一の名前を作ります。

各ウィンドウのモード行にはウィンドウ内に表示している バッファ名が示されているので、 編集しているバッファが何かいつでもわかります。

編集コマンドによる変更は、Emacsバッファに対して行われます。 バッファを保存するまでは、 変更は、訪問先のファイルや他のどんな恒久的なものにも影響しません。 バッファを保存するとは、 バッファの現在の内容をそのバッファの訪問先のファイルに書き出すことです。 See Saving

バッファに未保存の変更がある場合、 バッファは変更されているといいます。 バッファを保存しないと変更内容が失われてしまうので、 これは重要なことです。 モード行の左端近くに2個の星印を表示して、 バッファが変更されていることを示します。

ファイルを訪問するには、コマンドC-x C-ffind-file)を使います。 このコマンドに、訪問したいファイル名を続けて<RET>で終えます。

ファイル名はミニバッファ(see Minibuffer)で読まれ、 このときデフォルトや標準的な方法の補完を使えます(see File Names)。 ミニバッファ内でC-gと打てば、C-x C-fをアボートできます。

C-x C-fが正しく完了したことは、画面上に新たに現れるテキストと モード行に現れる新たなバッファ名で確認できます。 指定したファイルが存在せず作成もできない場合や読めない場合には、 エコー領域にエラーメッセージが表示されます。

すでに訪問しているファイルを再度訪問すると、 C-x C-fは別のコピーを作らずに、 そのファイルを入れた既存のバッファを選択します。 しかし、そうするまえに、訪問してから、あるいは、保存してから以降に ファイルが変更されたかどうか検査します。 ファイルが変更されていると警告メッセージを表示します。 See Interlocking

新たにファイルを作りたいときにはどうするのでしょう? 単に訪問すればよいのです。 Emacsはエコー領域に(New File)と表示しますが、 それ以外に関しては、あたかも空のファイルが存在するかのようにふるまいます。 変更してから保存すれば、ファイルを作成できます。

Emacsはファイルの内容から、行区切りの方法、 すなわち、(GNU/LinuxやUNIXで使われる)改行、 (Microsoftシステムで使われる)復帰改行、 (Machintoshで使われる)復帰のみを認識します。 さらに、Emacsの通常の方法、つまり、改行文字で行を区切るように 内容を自動的に変換します。 これは、コーディングシステム変換(see Coding Systems)の 一般的な機能の一部であり、 さまざまの異なるオペレーティングシステムから持ってきた ファイルを同一の方法で編集できるようにします。 テキストを変更してファイルに保存すると、 Emacsは逆変換を行い、必要ならば、改行を 復帰改行や復帰のみに戻します。

指定したファイルが実際にはディレクトリならば、 C-x C-fはEmacsのディレクトリブラウザであるdiredを起動するので、 ディレクトリの内容を『編集』できます(see Dired)。 diredは、ディレクトリ内のファイルを、消去したり、眺めたり、 操作するのに便利です。 しかし、変数 find-file-run-dirednilならば、 ディレクトリを訪問しようとするとエラーになります。

指定したファイル名にワイルドカード文字が含まれていると、 Emacsは一致するすべてのファイルを訪問します。 ワイルドカード文字そのものを含む名前のファイルを訪問するには、 See Quoted File Names

オペレーティングシステムが変更を許さないファイルを訪問すると、 Emacsはバッファを読み出し専用に設定するので、 修正できなかったり、修正できてもあとで保存に手間取ります。 C-x C-qvc-toggle-read-only)で、 バッファを書き込み可能にできます。 See Misc Buffer

ときには、自分でまちがって変更しないように、 ファイルを読み出し専用で訪問したい場合があります。 そういう場合には、コマンドC-x C-rfind-file-read-only)で ファイルを訪問します。

(ファイル名をまちがって打ったりして) 存在しないファイルを意図せずに訪問してしまったときには、 C-x C-vコマンド(find-alternate-file)を使って 本当の目的のファイルを訪問します。 C-x C-vC-x C-fと同様ですが、 (バッファが変更されていればまず保存するかどうか聞いてから) カレントバッファを消去します。 訪問するファイル名を読むときには、 ミニバッファにデフォルトファイル名全体を挿入し、 ディレクトリ部分の直後にポイントを置きます。 これは、ファイル名をほんの少しまちがって入力したときに便利です。

存在するのに読めないファイルを訪問すると、 C-x C-fはエラーを通知します。

C-x 4 ffind-file-other-window)は、 別のウィンドウで、指定したファイルを入れたバッファを選択することを除けば、 C-x C-fと同じです。 C-x 4 fを実行するまえに選択されていたウィンドウは、 同じバッファを表示したままです。 ウィンドウを1つだけ表示しているときにこのコマンドを使うと、 そのウィンドウを2つに分けて、一方のウィンドウにはまえと同様に同じバッファを 表示しますが、もう一方には新たに指示したファイルを表示します。 See Windows

C-x 5 ffind-file-other-frame)も同様ですが、 新たなフレームを開くか、 捜しているファイルを表示している既存のフレームを見えるようにします。 ウィンドウシステムを使っているときだけ、 この機能を利用できます。 See Frames

特別な符号化や変換をせずにファイルを文字の列として編集したいときには、 M-x find-file-literallyコマンドを使います。 このコマンドは、C-x C-fのようにファイルを訪問しますが、 形式変換(see Formatted Text)、文字コード変換(see Coding Systems)、 (圧縮を)自動展開(see Compressed Files)といったことをしません。 (そのままの文字の列としてではなく)普通の方法で同じファイルを すでに訪問している場合には、このコマンドは、 そのままの文字の列として訪問するかどうか聞いてきます。

2つの特別なフック変数で、ファイルを訪問する操作を修正して拡張できます。 存在しないファイルを訪問すると、 find-file-not-found-hooksのリスト内の関数群を実行します。 この変数は関数のリストを保持していて、 呼び出した関数の中のどれかがnil以外を返すまで1つ1つ順に呼び出します。 ファイルが存在するかどうかに関わらず、 どんなファイルを訪問するときでも find-file-hooksには関数のリストが入っていると仮定され、 それらの1つ1つを順にすべて呼び出します。 いずれの場合でも、関数は引数を受け取りません。 2つの変数のうち、先にfind-file-not-found-hooksを使います。 これらの変数はノーマルフックではありません。 これらの名前が-hookではなくて-hooksで終っていることで、 その事実を表しています。 See Hooks

編集するファイルに対して自動的にメジャーモード(see Choosing Modes)を 設定し、そのファイルに対して特別なローカル変数(see File Variables)を 定義する方法がいくつかあります。


Node:Saving, Next:, Previous:Visiting, Up:Files

ファイルを保存する

Emacsにおいてバッファを保存するとは、 バッファの内容をそのバッファの訪問先のファイルへ書き戻すことです。

C-x C-s
カレントバッファを訪問先のファイルに保存する(save-buffer)。
C-x s
任意のバッファかすべてのバッファをそれぞれの訪問先のファイルに保存する (save-some-buffers)。
M-~
カレントバッファを変更していないことにする(not-modified)。
C-x C-w
カレントバッファを指定したファイルに保存する(write-file)。
M-x set-visited-file-name
カレントバッファを保存するファイルの名前を変更する。

ファイルを保存して変更を恒久的なものとするには、 C-x C-ssave-buffer)と打ちます。 保存を完了するとC-x C-sはつぎのようなメッセージを表示します。

Wrote /u/rms/gnu/gnu.tasks

選択されているバッファが変更されていなければ (バッファを作って以降、あるいは、最後に保存して以降に、変更されていない)、 保存しても何もならないので実際には保存しません。 かわりに、C-x C-sはつぎのようなメッセージをエコー領域に表示します。

(No changes need to be saved)

コマンドC-x ssave-some-buffers)は、 変更された任意のバッファやすべてのバッファを保存できるようにします。 各バッファについて、何をするか聞いてきます。 このとき選べる返答は、query-replaceに対するものに似ています。

y
このバッファを保存し、残りのバッファについても質問する。
n
このバッファを保存しないが、残りのバッファについては質問する。
!
このバッファを保存し、 残りのすべてのバッファについても質問せずに保存する。
<RET>
何も保存せずにsave-some-buffersを終了する。
.
このバッファを保存し、他のバッファについては何も聞かずに save-some-buffersを終える。
C-r
質問対象のバッファを閲覧する。 閲覧(view)モードから抜けると、save-some-buffersに戻りふたたび質問する。
C-h
これらのオプションについてのヘルプメッセージを表示する。

Emacsから抜けるキー列C-x C-cは、 save-some-buffersを起動するので、同じ質問をしてきます。

バッファを変更したけれども変更を保存したくないならば、 それを避けるための処置をすべきでしょう。 そうしないと、C-x sC-x C-cを使うたびに、 まちがってバッファを保存してしまいがちです。 1つの方法は、M-~not-modified)と打つことです。 これは、バッファが変更されていることを示すフラグを消します。 こうしておくと、保存コマンドはバッファを保存する必要がないと結論します。 (~は「否定」(not)を意味する数学記号としてしばしば使われる。 よってM-~は、メタ付き「否定」。) set-visited-file-name(下記参照)を使って、 別のファイルを訪問しているバッファである旨の印を付けることもできます。 このときファイル名には、重要でない使っていないものを指定します。 あるいは、ファイルからテキストを再度読み直して、 ファイルを訪問したり保存したりした以降のすべての変更を取り消します。 これを復元(reverting)といいます。 See Reverting。 すべての変更がもとに戻るまでアンドゥコマンドC-x uを繰り返し使って、 変更しなかったことにもできます。 しかし、復元のほうが簡単です。

M-x set-visited-file-nameは、 カレントバッファで訪問しているファイルの名前を変更します。 このコマンドは、ミニバッファで新たなファイル名を読み取ります。 そして、訪問先ファイル名を設定し直し、 それに従って(新しい名前が使われていなければ) バッファ名も変更します。 set-visited-file-nameは、 新たに指定した訪問先のファイルへはバッファを保存しません。 あとで保存する場合に備えて、Emacs内部の記録を変更するだけです。 また、バッファには『変更された』旨の印を付け、 C-x C-sがそのバッファを保存しようとするようにします。

別のファイルを訪問しているという旨の印をバッファに付けて、 ただちに保存したい場合には、C-x C-wwrite-file)を使います。 このコマンドは、set-visited-file-nameに続けてC-x C-sを 実行するのと等価です。 ファイルを訪問していないバッファに対してC-x C-sを使うことは、 C-x C-wと同じ効果があります。 つまり、ファイル名を読み取り、 バッファにはそのファイルを訪問しているという印を付け、 バッファをそのファイルに保存します。 ファイルを訪問していないバッファのデフォルトのファイル名は、 バッファのデフォルトディレクトリとバッファ名を組み合わせて作ります。

新しいファイル名がメジャーモードを示唆するものであれば、 C-x C-wは、多くの場合、そのメジャーモードに切り替えます。 コマンドset-visited-file-nameもそのようにします。 See Choosing Modes

Emacsがファイルを保存しようとするときに、 ディスク上の最新版の日付がEmacsが最後に読み書きしたものと合わなかったら、 Emacsはそのことを通知します。 というのは、同時に編集したために引き起こされた問題である可能性があるので、 ユーザーにただちに知らせる必要があるからです。 See Interlocking

変数require-final-newlinenil以外だと、 Emacsはファイルを保存するたびに、 ファイルの末尾に改行がなければ改行を挿入します。 デフォルトはnilです。


Node:Backup, Next:, Up:Saving

バックアップファイル

多くのオペレーティングシステムでは、 ファイルを書き換えるとファイルに入っていたそれまでの記録は 自動的に破棄されます。 したがって、Emacsでファイルを保存すると、ファイルの古い内容は捨てられます。 しかし、実際に保存するまえに、古い内容をバックアップファイル と呼ばれる別のファイルにEmacsが注意深くコピーすれば、 古い内容は破棄されません。

ほとんどのファイルでは、 バックアップファイルを作るかどうかは 変数make-backup-filesで決まります。 多くのオペレーティングシステムでは、この変数のデフォルト値はtであり、 Emacsはバックアップファイルを作ります。

版管理システム(see Version Control)が管理するファイルに対しては、 バックアップファイルを作るかどうかは 変数vc-make-backup-filesで決まります。 デフォルトはnilです。 というのは、すべての古い版を版管理システムに保管してあるので、 バックアップファイルは冗長だからです。 See VC Workfile Handling

変数backup-enable-predicateのデフォルト値は、 /tmpにあるファイルのバックアップファイルを 作らないようにします。

Emacsでは、単一のバックアップファイルを保持することも、 編集した各ファイルごとに一連の番号付きバックアップファイルを 保持することもできます。

Emacsがファイルのバックアップファイルを作るのは、 バッファからそのファイルへ最初に保存したときだけです。 たとえ何度ファイルを保存したとしても、 そのバックアップファイルは、ファイルを訪問する以前の内容を保持し続けます。 通常これは、今の編集セッションを始める以前の内容を バックアップファイルが保持していることを意味します。 しかしながら、バッファを消去してから再度ファイルを訪問すると、 それ以降に保存するときには新たにバックアップファイルを作ります。

少なくとも一度は保存したとしても、 バッファからもう1つバックアップファイルを作るように明示的に 指示することもできます。 C-u C-x C-sでバッファを保存すると、 このとき保存した版は、バッファを再度保存するときには バックアップファイルになります。 C-u C-u C-x C-sもバッファを保存しますが、 まずファイルの古い内容をバックアップファイルにします。 C-u C-u C-u C-x C-s はその両方を行います。 ファイルの以前の内容からバックアップファイルを作り、 さらに、バッファを再度保存するとこのとき保存した版から もう1つバックアップファイルを作るように準備します。


Node:Backup Names, Next:, Up:Backup

単一バックアップファイルと番号付きバックアップファイル

単一バックアップファイルを作ることを選択すると(デフォルト)、 バックアップファイルの名前は、 編集しているファイルの名前に~を付加したものになります。 したがって、eval.cのバックアップファイルはeval.c~となります。

番号付きの一連のバックアップファイルを作ることを選択すると、 バックアップファイルの名前は、もとのファイル名に .~と数字ともう1つ~を付加したものになります。 したがって、eval.cのバックアップファイルは、 eval.c.~1~eval.c.~2~、…、eval.c.~259~というように どこまでも続きます。

保護機構のために 普通の名前でバックアップファイルを書けなくなると、 ユーザーのホームディレクトリの%backup%~に バックアップファイルを書きます。 そのファイルはたった1つしか存在できないので、 最新のバックアップにしか利用できません。

単一バックアップか番号付きバックアップかの選択は、 変数version-controlで制御されます。 この変数に設定できる値はつぎのとおりです。

t
番号付きバックアップを作る。
nil
ファイルに対して番号付きバックアップファイルがすでにあるならば 番号付きバックアップを作る。 さもなければ、単一バックアップを作る。
never
どんな場合にも番号付きバックアップを作らない。 つねに単一バックアップを作る。

各バッファではローカルにversion-controlを設定できるので、 そのバッファのファイルに対するバックアップの作成方法を制御できます。 たとえば、rmailモードでは、 rmailファイルのバックアップを1個だけに限定するために、 version-controlにはローカルにneverを設定します。 See Locals

環境変数VERSION_CONTROLを設定すると、 さまざまなGNUユーティリティに どのようにバックアップファイルを扱うか指示できます。 Emacsも環境変数に従って動作し、 開始時にそれに一致するようにLisp変数version-controlを設定します。 環境変数の値がtnumberedなら、 version-controltになります。 環境変数の値がnilexistingなら、 version-controlnilになります。 環境変数の値がneversimpleなら、 version-controlneverになります。


Node:Backup Deletion, Next:, Previous:Backup Names, Up:Backup

バックアップの自動削除

ディスク容量を無限に浪費することを避けるために、 Emacsは番号付きバックアップの版を自動的に削除できます。 一般には、Emacsは始めの数個と最新の数個のバックアップを残して、 そのあいだのものをすべて削除します。 これは、新たにバックアップを作るごとに行われます。

2つの変数kept-old-versionskept-new-versionsは、 このような削除を制御します。 それらの値は、それぞれ、新たにバックアップを作るときに、 保持すべき最古(番号が最小)のバックアップの個数、 保持すべき最新(番号が最大)のバックアップの個数です。 それらの値は、バックアップの新版を作った直後に使われることに 注意してください。 新たに作ったバックアップも、kept-new-versionsの数に含まれます。 デフォルトでは、どちらの変数も2です。

delete-old-versionsnil以外ならば、 何もいわずに余分な中間の版を削除します。 デフォルト値であるnilならば、 余分な中間の版を削除するかどうかを聞いてきます。

diredの.(ピリオド)コマンドも古い版を削除するために使えます。 See Dired Deletion


Node:Backup Copying, Previous:Backup Deletion, Up:Backup

コピーと改名

バックアップファイルは、古いファイルをコピーする、あるいは、 それを改名することで作ります。 古いファイルに複数の名前があると、これには違いが出てきます。 古いファイルを改名してバックアップファイルにすると、 (古いファイルの)別の名前もバックアップファイルを指します。 古いファイルをコピーした場合には、 (古いファイルの)別の名前は編集しているファイルを指し続け、 その名前で参照される内容も新しい内容になります。

バックアップファイルを作る方法は、 元ファイルの所有者とグループにも影響します。 コピーするならば、何も変更されません。 改名すると、ファイルの所有者はあなたになり、 ファイルのグループはデフォルトになります (オペレーティングシステムごとにグループのデフォルトは異なる)。

所有者を変更することは、多くの場合、よいことです。 というのは、所有者がつねに最後にファイルを編集した人を表すからです。 同様に、バックアップの所有者はその版を作った人を表します。 ときには、ファイルの所有者を変更すべきでないファイルがあります。 そのようなファイルについては、 backup-by-copying-when-mismatchをローカルに設定する ローカル変数リストをファイルに入れておくのがよいです。

改名するかコピーするかは、3つの変数で制御されます。 デフォルトは、改名です。 変数backup-by-copyingnil以外ならばコピーします。 nilのときには、 変数backup-by-copying-when-linkednil以外ならば、 複数の名前を持つファイルではコピーし、 編集中のファイルには名前が1つだけなら改名します。 変数backup-by-copying-when-mismatchnil以外のときには、 改名するとファイルの所有者やグループが変更されるときにはコピーします。 スーパーユーザーでEmacsを起動すると、 backup-by-copying-when-mismatchのデフォルトはtです。

ファイルを版管理システム(see Version Control)で管理している場合には、 通常Emacsはそのファイルのバックアップを通常の方法では作りません。 チェックインとチェックアウトは、 ある意味でバックアップを作ることに似ています。 残念なことに、 これらの操作は典型的にはハードリンクを切るという 類似性があります。 つまり、あるファイルの別の名前を使っていたとすると そのファイル名がなくなるのです。 Emacsにできることはありません。 版管理システムが処理します。


Node:Interlocking, Previous:Backup, Up:Saving

同時編集に対する保護

2人のユーザーが同じファイルを訪問し、両者がそれを編集し、 両者がそれを保存すると、同時編集が発生します。 こういったことが起きていることを誰も知らせなければ、 最初に保存したユーザーは、あとになって自分の変更が失われていることを知るでしょう。

ある種のシステムでは、2人目のユーザーがファイルを変更し始めたことを Emacsがただちに検知して警告を発します。 すべてのシステムでは、ファイルを保存するときにEmacsが検査して、 他人の変更を上書きしようとしているならば警告します。 ファイルを保存するかわりに適切な修正操作を行えば、 他人の作業結果を失うことを避けられます。

ファイルを訪問しているEmacsバッファで初めて修正を行うと、 Emacsはそのユーザーがファイルをロックしたと記録します。 (同じディレクトリ内に異なる名前のシンボリックリンクを作ることで実現する。) 変更を保存するとEmacsはロックを消します。 つまり、ファイルを訪問しているEmacsバッファに未保存の変更があるときには ファイルをロックしておくのです。

他人がロックしているファイルを訪問先とするバッファを 修正し始めると衝突が起こります。 Emacsが衝突を検知すると、Lisp関数ask-user-about-lockを呼び出して、 どうするかを聞いてきます。 この関数をカスタマイズのために再定義することもできます。 この関数の標準の定義では、ユーザーに質問をし、3つの返答を受理します。

s
ロックを横取りする。 ファイルをすでに変更していた人はロックを失い、 あなたがロックを得る。
p
続行する。 誰かがファイルをロックしたままであるにもかかわらず、 ファイルを編集する。
q
放棄する。 これはエラー(file-locked)を引き起こし、 バッファ内で修正しようとしたことは、実際には行われない。

ロックはファイル名に基づいて動作することに注意してください。 ファイルに複数の名前があると、Emacsには2つの名前が同じファイルで あることはわからないので、 2人のユーザーが異なる名前で同じファイルを編集することは防げません。 しかし、名前に基づいたロックなので、 保存しない限り実在しない新規ファイルの編集をEmacsはインターロック 14 できます。

Emacsがロックを作れる構成になっていないシステムもあります。 また、ロックファイルを書けない場合もあります。 こういった状況では、 Emacsがあらかじめトラブルを検知することはできませんが、 他人の変更を上書きしてファイルを保存しようとしたときには、 衝突を検知できます。

Emacsやオペレーティングシステムがクラッシュすると、 古いロックファイルが残っていることあります。 そのため、ときどき偽の衝突についての警告を受けとることがあるかもしれません。 偽の衝突であると確信できれば、 Emacsにとにかく続行するように指示するpを使います。

Emacsは、バッファを保存するたびに、 ディスク上のファイルの最終変更日時が最後に訪問/保存したときから 更新されていないことをまず検査します。 変更日時が不一致ならば、なんらかの方法でそのファイルが変更されたことを示し、 Emacsが本当に保存するとそれらの変更が失われてしまいます。 これを避けるために、Emacsは警告のメッセージを表示し、 保存するまえに確認を求めます。 ファイルが変更された理由を承知していて、 それが問題でないことを知っていることもあるでしょう。 そうならば、yesと答えて続行できます。 さもなければ、C-gで保存を中断して、その事態を調査するべきです。

同時編集が発生したことを知らされたときにまず行うべきことは、 C-u C-x C-d(see Directories)でディレクトリ一覧を見ることです。 このコマンドは、ファイルの現在の所有者を表示します。 その人に連絡して、編集を続けないように警告しましょう。 そのつぎの段階は、別の名前でEmacsバッファを保存して、 diffで2つのファイルを比較することでしょう。


Node:Reverting, Next:, Previous:Saving, Up:Files

バッファを復元する

広範囲にファイルを変更したあとで気が変わったときには、 そのような変更を捨てるためにファイルのまえの版を読み込みます。 これには、カレントバッファに作用する M-x revert-bufferを使います。 意図せずにバッファを復元することは、 たくさんの作業結果を失うことになるので、 このコマンドにはyesで確認を与える必要があります。

revert-bufferは、ファイルの先頭から同じ距離(文字数)に ポイントを保ちます。 少し編集しただけなら、復元前後のポイント位置はだいたい同じ部分にあります。 徹底的に変更してしまったときには、 古いファイルでのポイント位置では まったく異なるテキスト部分に位置付けるでしょう。

復元すると、改めて変更するまでは、 そのバッファには『変更なし』の印が付きます。

diredバッファのように、ファイル以外のデータを反映するバッファでも 復元できる場合があります。 その場合、復元とは、適切なデータに基づいて内容を計算し直すことを意味します。 C-x bで明示的に作ったバッファを復元することはできません。 そういった指示をすると、revert-bufferはエラーを報告します。

自動的にかつ頻繁に変更されるファイル、 たとえば、実行中のプロセスから出力されるログ、 を編集するときには、C-x C-fでファイルを再訪問すると 何も聞かずにファイルを復元できると便利です。

こういったふるまいを指示するには、 変数revert-without-queryに正規表現のリストを設定します。 これらの正規表現の1つにファイル名が一致すると、 find-filerevert-bufferは、 バッファが変更されていない限り、 そのファイルが変更されていても復元します。 (テキストを編集してしまったときには、 変更を捨てさるのはまちがっている。)


Node:Auto Save, Next:, Previous:Reverting, Up:Files

自動保存、不慮の事故に対する備え

Emacsは(打鍵数に基づいて)定期的に、 訪問しているすべてのファイルを何も聞かずに保存します。 これを自動保存(auot-saving)と呼びます。 これは、システムがクラッシュしたときに 失ってしまう作業結果をある程度以下に制限します。

自動保存を実施する時間になるとEmacsは各バッファを調べて、 そのバッファに自動保存が指定されていて、かつ、 最後に自動保存した以後に変更されている場合は、 そのバッファを自動保存します。 実際にファイルを自動保存すると、 エコー領域にメッセージAuto-saving...を表示します。 自動保存の最中に発生したエラーは捕獲されるので、 打ち込んだコマンドの実行に干渉することはありません。


Node:Auto Save Files, Next:, Up:Auto Save

自動保存ファイル

自動保存は、通常、訪問先のファイルそのものへは保存しません。 というのは、予定の半分を変更しただけでプログラムにまだ一貫性がないのに 保存してしまうのは望ましくないからです。 そのかわりに自動保存ファイルと呼ばれる別のファイルに自動保存し、 (C-x C-sなどで)明示的に保存するよう指示されたときだけ、 訪問先のファイルに保存します。

通常、自動保存ファイルの名前は、訪問先のファイルの名前の前後に #を付加したものです。 したがって、ファイルfoo.cを訪問したバッファは、 ファイル#foo.c#に自動保存されます。 ファイルを訪問していないほとんどのバッファは、 明示的に指定したときだけ自動保存されます。 それらのバッファの自動保存ファイルの名前は、 バッファ名のまえに#%、あとに#を付けたものになります。 たとえば、送信するメッセージを作成するバッファ*mail*は、 #%*mail*#というファイルに自動保存されます。 自動保存ファイルの名前は、Emacsの一部(関数make-auto-save-file-nameauto-save-file-name-p)をプログラムし直さない限り、 この方法で作られます。 バッファの自動保存に使うファイル名は、 そのバッファで自動保存をオンにしたときに計算されます。

大きなバッファで相当量のテキストを削除したときには、 そのバッファの自動保存を一時的にやめます。 意図せずにテキストを削除してしまった場合には、 自動保存ファイルに削除してしまったテキストが残っているほうが、 自動保存ファイルとしてより役に立つからです。 こうなったあとで自動保存をふたたびオンにするには、 C-x C-sでバッファを保存するか、 C-u 1 M-x auto-saveを使います。

訪問先のファイルそのものに自動保存を行いたい場合には、 変数auto-save-visited-file-namenil以外の値を設定します。 こうすると、自動保存と明示的な保存には、何の違いもありません。

訪問先のファイルにバッファを保存すると、 バッファの自動保存ファイルは削除されます。 これを禁止するには、 変数delete-auto-save-filesnilを設定します。 C-x C-wset-visited-file-nameで 訪問先ファイル名を変更すると、 新たな訪問先ファイル名に合わせて自動保存ファイルも改名されます。


Node:Auto Save Control, Next:, Previous:Auto Save Files, Up:Auto Save

自動保存の制御

変数auto-save-defaultnil以外ならば、 ファイルを訪問するたびにそのファイルのバッファの自動保存をオンにします (ただしバッチモードを除く。see Entering Emacs)。 この変数のデフォルトはtなので、 通常、ファイルを訪問したバッファは自動保存されます。 コマンドM-x auto-save-modeで、 既存バッファの自動保存をオン/オフできます。 他のマイナモードのコマンドと同じように、 正の引数を指定するとM-x auto-save-modeは自動保存をオンにし、 0か負の引数を指定すると自動保存をオフにし、 引数を指定しないと自動保存のオン/オフを切り替えます。

Emacsは、最後に自動保存してから何文字打鍵したかに基づいて 定期的に自動保存します。 変数auto-save-intervalには、自動保存の間隔を表す文字数を指定します。 デフォルトは300です。

しばらく打鍵しないでいるときにも自動保存は行われます。 変数auto-save-timeoutは、自動保存(およびガベッジコレクション)を 行うまでにEmacsが待つべき秒数を表します。 (カレントバッファが大きいと、実際の時間間隔も長くなる。 これは、大きなバッファの自動保存には時間がかかるので、 その編集中は邪魔にならないようにするため。) アイドルのときには、自動保存はつぎの2つのことを達成します。 1つは、端末からしばらく離れているときに、 すべての作業結果が保存されることを保証すること。 もう1つは、実際に打鍵しているときの自動保存を いくぶんでも避けるようにすることです。

重大なエラーを受け取ったときにも、Emacsは自動保存を行います。 これには、kill %emacsのようなシェルコマンドで Emacsジョブを強制終了した場合や、 電話回線やネットワーク接続が途切れた場合を含みます。

コマンドM-x do-auto-saveで、自動保存の実施を明示的に指示できます。


Node:Recover, Previous:Auto Save Control, Up:Auto Save

自動保存ファイルからのデータ回復

コマンドM-x recover-file <RET> file <RET>で、 自動保存ファイルの内容から紛失データを復旧できます。 このコマンドは、fileを訪問してから、 (確認したあとで)その自動保存ファイル#file# から内容を回復します。 そのあとに、C-x C-sfileそのものに復旧したテキストを保存します。 たとえば、foo.cの自動保存のファイル#foo.c#から foo.cを復旧するにはつぎのようにします。

M-x recover-file <RET> foo.c <RET>
yes <RET>
C-x C-s

M-x recover-fileは確認するまえに、 指定したファイルと自動保存ファイルが置かれたディレクトリの一覧を表示するので、 それらのサイズや日付を比較できます。 自動保存ファイルのほうが古いと、 M-x recover-fileはそのファイルを読み込むようには 聞いてきません。

Emacsやコンピュータがクラッシュしても、 コマンドM-x recover-sessionを使えば、 編集中だったすべてのファイルを自動保存ファイルから復旧できます。 このコマンドは、まず、記録されている中断されたセッション一覧を表示します。 希望する箇所へポイントを移動し、C-c C-cと打ちます。

つぎに、 recover-sessionはそのセッションで編集中だった 各ファイルについてそのファイルを復旧するか聞いてきます。 yを答えると、recover-fileを呼び出し、 普通のとおりに動作します。 もとのファイルとその自動保存ファイルの日付を表示し、 ファイルを復旧するかどうかをもう一度聞いてきます。

recover-sessionが終了すると、 復旧を選んだファイルはEmacsバッファに入っています。 これらのバッファを保存してください。 こうすることで初めてファイルに保存できます。

中断されたセッションは、あとで復旧するために ~/.saves-pid-hostnameというファイルに記録されています。 これらの名前の~/.savesの部分は、 auto-save-list-file-prefixの値です。 この変数を個人の.emacsファイルで設定すれば、 別の場所にセッション記録を置くことができます。 しかし、同様にrecover-sessionも再定義して、 変更した新しい場所を探すようにする必要があります。 個人の.emacsファイルでauto-save-list-file-prefixnilを設定すると、復旧のためのセッションを記録しません。


Node:File Aliases, Next:, Previous:Auto Save, Up:Files

ファイル名の別名

シンボリックリンクやハードリンクを使うことで、 同じファイルをいくつかの異なるファイル名で指すことができます。 ハードリンクは、ファイルを直接に指している別の名前です。 すべての名前は等しく有効で、それらに優劣はありません。 対照的に、シンボリックリンクは定義された別名の一種です。 foobarへのシンボリックリンクであるとき、 どちらの名前でもファイルを指せますが、 barが本当の名前であり、fooは別名にすぎません。 シンボリックリンクがディレクトリを指しているときには、 より複雑な状況になります。

同一のファイルに対して2つの名前で訪問すると、 Emacsは通常2つの別々のバッファを作成しますが、 その状況を警告します。

同一のファイルを異なる名前で別々のバッファに訪問することを避けたいならば、 変数find-file-existing-other-namenil以外の値を設定します。 そうすれば、どのファイル名を指定しようとも、 find-fileはファイルを訪問している既存のバッファを使います。

変数find-file-visit-truenamenil以外であれば、 バッファに記録するファイル名は、ユーザーが指定した名前ではなくて、 ファイルの(すべてのシンボリックリンクをその先の名前に置き換えて得られる) 実名になります。 find-file-visit-truenameを設定すると、 find-file-existing-other-nameも暗に設定されます。


Node:Version Control, Next:, Previous:File Aliases, Up:Files

VC(版管理、バージョンコントロール)

版管理システムは、 ファイルの変更されていない部分を通常は一度だけ格納して、 ソースファイルの複数の版を記録できるパッケージです。 版管理システムは、各版の作成時刻、作成者、 その版の変更部分に関する記述などの履歴情報も記録します。

Emacsの版管理パッケージはVCと呼ばれます。 このコマンドは、3つの版管理システム、RCS、CVS、SCCSで動作します。 GNUプロジェクトでは、フリーソフトウェアでありFree Software Foundationから 入手できるRCSとCVSを推奨します。


Node:Introduction to VC, Next:, Up:Version Control

VC入門

VCはEmacsから版管理システムを使えるようにして、 編集作業を版管理操作に滑らかに統合します。 VCは統一された版管理インターフェイスを提供するので、 どの版管理システムを使っているかに関わらず、 同じ使い方ができます。

本節では、版管理を概観するとともに、 VCが扱う版管理システムの概要を説明します。 使用する版管理システムにすでに慣れているならば、本節は読み飛ばしてください。


Node:Version Systems, Next:, Up:Introduction to VC

利用可能な版管理システム

VCでは、現在3つの版管理システム、 つまり、バックエンドで動作します。 RCS、CVS、SCCSの3つです。

RCSはフリーの版管理システムでFree Software Foundationから入手ができます。 RCSは、扱えるバックエンドの中では、たぶん、もっとも成熟したものです。 VCコマンド群は、RCSに概念的にもっとも近いものです。 RCSでできるほとんどのことはVCからもできます。

CVSは、RCSの上に作られてRCSの機能を拡張していて、 より洗練されたリリース管理、複数ユーザーの並行開発を許しています。 CVSの下では、VCの基本的な編集操作を使えますが、 あまり一般的でない操作に関しては、 コマンド行からCVSを呼ぶ必要があります。 CVSを使うには保管庫(リポジトリ、repository)を設定しなければなりませんが、 ここで扱うには複雑すぎる話題です。

SCCSはフリーではありませんが、版管理システムとしては広く使われています。 能力の観点からすれば、VCが扱える3つのうちでもっとも弱いです。 SCCSに欠けている機能(たとえばスナップショット)はVC自身で 実現して補っていますが、 複数の枝分かれのようなVCの他のいくつかの機能はSCCSでは利用できません。 RCSを使えない理由があるときに限ってSCCSを使うべきです。


Node:VC Concepts, Previous:Version Systems, Up:Introduction to VC

VCの概念

ファイルが版管理の管理下にあるとき、 そのファイルは版管理システムに登録されているといいます。 各登録されたファイルには、 ファイルの現状とその変更履歴を記述した対応する マスタファイルが存在します。 この情報は、現在の版や以前の版を再構成するのに十分です。 通常、マスタファイルには、それぞれの版について、 その版の変更点を言葉で記述した記録項目も記録されています。

版管理の下で管理されているファイルを、 そのマスタファイルに対応する作業ファイルと呼ぶこともあります。 普通のファイルと同様に、作業ファイルを編集して変更します。 (SCCSやRCSでは、ファイルを編集するまえにファイルをロック 15 する必要がある。) 一連の変更を終えたら、ファイルをチェックイン、つまり、 記録項目とともに変更をマスタファイルに記録します。

CVSでは、1つのマスタファイルに対応する作業ファイルを複数個持てます。 しばしば、各ユーザーが1個ずつ作業ファイルを持てます。 RCSでもこのようにできますが、RCSの通常の使い方ではありません。

典型的な版管理システムには、複数のユーザーが同じファイルを使う際の 調停を行うためのなんらかの機構が必要です。 1つの方法は(Emacsが同時編集の検出に使うロックに類似だが、それとは別の) ロックを使うことです。 別の方法は、ファイルをチェックインする時点で、 他人の変更分を併合することです。

ロックを使う版管理の場合、作業ファイルは変更できないように 通常は読み出し専用です。 版管理システムに対して、 書き込み可能な作業ファイルを作り、それをロックするように要求します。 一度には1人のユーザーだけがこれをできます。 自分の変更分をチェックインすると、 ファイルのロックを外し、作業ファイルをふたたび読み出し専用にします。 これにより、他のユーザーがさらに変更するために ファイルをロックできるようになります。 SCCSはつねにロックを使いますし、RCSも通常はロックを使います。

RCSでは別の方法もあって、各ユーザーがいつでも作業ファイルを変更できます。 このモードではロックは必要ありませんが、使うこともできます。 新版を記録する方法は、やはりチェックインです。

CVSでは、通常、各ユーザーはいつでも各自の作業ファイルを変更できますが、 チェックイン時に他のユーザーの変更分を併合する必要があります。 しかし、CVSでもロックを使うようにもできます (see Backend Options)。


Node:VC Mode Line, Next:, Previous:Introduction to VC, Up:Version Control

VCとモード行

版管理の下にあるファイルを訪問すると、 Emacsはそのことをモード行に示します。 たとえば、RCS-1.3は、そのファイルにはRCSが使われていて、 現在の版が1.3であることを表します。

バックエンドの名前と版番号のあいだの文字は、ファイルの版管理状態を示します。 -は、(ロックを使っているのであれば) 作業ファイルがロックされていないこと、あるいは、 (ロックを使っていないのであれば)ファイルが変更されていないことを表します。 :は他のユーザー(たとえば、jim)がロックしていることを表し、 RCS:jim:1.3のように表示されます。


Node:Basic VC Editing, Next:, Previous:VC Mode Line, Up:Version Control

VC下の基本的な編集

主要なVCコマンドは、状況に応じてロックかチェックインを行う 汎用コマンドです。

C-x C-q
C-x v v
このファイルに対して論理的なつぎの版管理操作を実施する。

正確にいえば、この操作を行うコマンドはvc-next-actionであって、 C-x v vにバインドしてあります。 しかし、C-x C-qの通常の意味は、 読み出し専用バッファを書き込み可能にするか、あるいは、その逆を行います。 この操作を、適切な版管理操作を実施することで 版管理下で管理されているファイルに対しても同じことを 正しく行うように拡張したのです。 登録されたファイルに対してC-x C-qを打つと、 C-x v vのように動作します。

このコマンドの正確な動作は、ファイルの状態と版管理システム(バックエンド) がロックを使うかどうかに依存します。 SCCSとRCSは通常はロックを使いますが、CVSは通常はロックを使いません。


Node:VC with Locking, Next:, Up:Basic VC Editing

ロック使用時の基本的な編集

(SCCSの場合とRCSのデフォルトの場合)ファイルに対してロックを使う場合、 C-x C-qは、ファイルをロックする、あるいは、 ファイルをチェックインするのいずれかを行います。

以上の規則は、CVSでロックを使用している場合にも適用できますが、 『ロックを横取りする』ことはありません。


Node:Without Locking, Next:, Previous:VC with Locking, Up:Basic VC Editing

ロック非使用時の基本的な編集

CVSのデフォルトのように、ロックを使わないときには、 作業ファイルはいつでも書き込み可能です。 ファイルを編集するまえにすべきことは何もありません。 モード行の状態表示は、ファイルが変更されていなければ-です。 作業ファイルに変更を保存するとただちに:に変わります。

以下は、CVSを使っているときのC-x C-qの動作です。

以上の規則は、RCSのロックを使わないモードにも適用できますが、 マスタファイルから自動的に変更を併合する機能は実装してありません。 残念なことに、あなたが編集を始めたあとに、他のユーザーが同じファイルに変更を チェックインしても何も警告されないのです。 しかも、このような事態が発生すると、あなたが自分の版をチェックインしたときに、 そのユーザーの変更は実質的には取り除かれてしまいます (とはいえ、マスタファイルの中には残っているので、 完全になくなるわけではない)。 したがって、自分の変更をチェックインするまえには、 現在の版が変更されていないことを確認する必要があります。 Emacsの将来の版では、このような危険性を取り除き、 RCSでも自動併合を行えるように考えています。

また、このモードでもRCSのロックを使えますが、必須ではありません。 ファイルを変更していないときにC-x C-qを使うと、 RCSの通常の(ロックを使う)モードのように、 ファイルをロックします。


Node:Log Buffer, Previous:Without Locking, Up:Basic VC Editing

記録項目用バッファの機能

変更をチェックインすると、C-x C-qは記録項目をまず読みます。 記録項目を入力するように、*VC-Log*というバッファを立ち上げます。 入力し終えたら、*VC-Log*C-c C-cと打ちます。 実際にチェックインを行うと、このように行われます。

チェックインをアボートするには、そのバッファではC-c C-cを 打たないでください。 別のバッファに切り替えて、別の編集をします。 別のファイルをチェックインしようとしない限り、 入力していた記録項目は*VC-Log*バッファに残っていますから、 チェックインを完了するため、いつでもそのバッファに戻れます。

複数のソースファイルを同じ理由で変更したときには、 多くのファイルに同じ記録項目を指定できると便利です。 こうするには、まえの記録項目の履歴を使います。 コマンド、M-nM-pM-sM-rは、 ミニバッファの履歴コマンドのように働きます (ただし、これらのコマンドはミニバッファの外部で使う)。

ファイルにチェックインするたびに、 記録項目用バッファはVC記録(vc-log)モードになります。 このモードは2つのフック、text-mode-hookvc-log-mode-hookを 起動します。 See Hooks


Node:Old Versions, Next:, Previous:Basic VC Editing, Up:Version Control

旧版の調査と比較

版管理の便利な機能の1つは、ファイルの任意の版を調べたり、 2つの版を比較できることです。

C-x v ~ version <RET>
訪問しているファイルの版versionを それ専用のバッファで調べる。
C-x v =
カレントバッファの内容とファイルのチェックインした最新版とを比較する。
C-u C-x v = file <RET> oldvers <RET> newvers <RET>
fileの指定した2つの版を比較する。
C-x v g
表示色を変えてCVSの注記コマンドの結果を表示する。

1つの旧版を調べるには、ファイルを訪問してC-x v ~ version <RET>vc-version-other-window)と打ちます。 これにより、ファイルの版versionのテキストを filename.~version~という名前のファイルに収め、 別のウィンドウのそれ専用のバッファでそのファイルを訪問します。 (RCSでは、旧版を選択して、それから枝分かれを作成できる。 see Branches。)

しかし通常は、コマンドC-x v =vc-diff)で ファイルの2つの版を比較したほうが、もっと便利です。 引数を指定しないC-x v =では、カレントファイルの内容 (必要があればファイルに保存する)とファイルのチェックインしてある 最新版とを比較します。 数引数を指定したC-u C-x v =では、 ファイル名と2つの版番号を読み取ってから、 指定したファイルの2つの版を比較します。

登録したファイルのかわりにディレクトリ名を指定すると、 このコマンドは、そのディレクトリとその下にあるサブディレクトリに 置かれているすべての登録されたファイルの指定した2つの版を比較します。

チェックインしてある版は、その番号で指定します。 入力が空だと、(チェックインしてある版とは異なるかもしれない)作業ファイルの 現在の内容を指定します。 版番号のかわりに、スナップショット名(see Snapshots)を指定することも できます。

このコマンドは、変数diff-switchesで指定されるオプションを用いて、 diffプログラムを実行して動作します。 その出力は別のウィンドウの特別なバッファに表示されます。 M-x diffコマンドと違って、C-x v =では新版と旧版の 相違箇所には移動できません。 というのは、通常、一方の版、あるいは、両方の版は、 比較するときにはファイルとしては存在していないからです。 それらは、マスタファイルの記録の中に存在するだけです。 M-x diffについてより詳しくは、See Comparing Files

CVSで管理しているファイルに関しては、 一目でわかるように複数の表示色を使って、CVS注記コマンドの結果を表示できます。 これには、M-x vc-annotateを使います。 赤は新版、青は旧版、それらの中間色は中間の版を表します。 数引数nは、時間尺度を伸ばします。 つまり、ある表示色で表す期間をn倍します。


Node:Secondary VC Commands, Next:, Previous:Old Versions, Up:Version Control

VCの副次的なコマンド

本節では、VCの副次的なコマンドを説明します。 1日に一度くらい使うようなコマンドです。


Node:Registering, Next:, Up:Secondary VC Commands

VCへのファイル登録

ファイルを訪問してからC-x v ivc-register)と打つだけで、 ファイルを版管理の管理下に置けます。

C-x v i
訪問したファイルを版管理に登録する。

ファイルを登録するには、Emacsはそのファイルに対してどの版管理システムを 使うか選ぶ必要があります。 vc-default-back-endに、RCSCVSSCCSの いずれかを設定すれば、明示的に指定できます。 あるいは、RCSSCCSCVSという名前の サブディレクトリがあるなら、Emacsは対応する版管理システムを使います。 指定がまったくなければ、デフォルトでは、 RCSがインストールされていればRCS、さもなければSCCSを選びます。

ロックを使用している場合には、C-x v iは、 ファイルのロックを解除し読み出し専用にします。 ファイルの編集を始めたい場合には、C-x C-qと打ちます。 CVSにファイルを登録したあとでは、 C-x C-qと打って最初の版を記録する必要があります。

新しく登録されたファイルの最初の版番号は、デフォルトでは1.1です。 異なるデフォルトを指定するには、 変数vc-default-init-versionに設定します。 あるいは、C-x v iに数引数を指定すると、 そのファイルだけに使う最初の版番号をミニバッファで読みます。

vc-initial-commentnil以外ならば、 C-x v iはこのソースファイルの目的を記した初期コメントを読みます。 これは記録項目(see Log Buffer)を読むのと同じように動作します。


Node:VC Status, Next:, Previous:Registering, Up:Secondary VC Commands

VC状態表示コマンド

C-x v l
版管理の状態と変更履歴を表示する。

ファイルの詳しい版管理状態や履歴を見るには、 C-x v lvc-print-log)と打ちます。 記録項目を含めてカレントファイルの変更履歴を表示します。 出力は別のウィンドウに表示されます。


Node:VC Undo, Next:, Previous:VC Status, Up:Secondary VC Commands

版管理操作のアンドゥ

C-x v u
バッファとファイルを最新のチェックインしてある版に復元する。
C-x v c
訪問先ファイルのマスタファイルに最後に入れた変更を取り除く。 つまり、最後のチェックインをアンドゥする。

これまでの一連の変更を破棄してチェックインしてある最新版へ復元したいときは、 C-x v uvc-revert-buffer)を使います。 ロックを使用しているときには、ファイルのロックを解除するので、 変更を始めるまえにまずファイルをロックし直す必要があります。 チェックインした最新版から変更していないと判断できない限り、 C-x v uは確認を求めてきます。

C-x v uは、 ファイルをロックしたけれどもやはりファイルを変更しないと決めたときに、 ロックを解除するコマンドでもあります。

すでにチェックインしてしまった変更を取り消すには、 C-x v cvc-cancel-version)を使います。 このコマンドは、チェックインした最新版のすべての記録を捨てさります。 さらに、C-x v cは、作業ファイルとバッファを 以前の版(捨てた最新版の1つまえの版)に復元するかどうか 聞いてきます。

noと答えると、VCはバッファでの変更を保持して ファイルもロックしたままにします。 チェックインした変更に明らかなまちがいがあるとわかったときに、 この「復元しない」という選択肢は便利です。 誤りを含んだチェックインを取り消し、誤りを訂正してから、 改めてファイルをチェックインできます。

C-x v cがバッファを復元しないときには、 そのかわりに、バッファ内のすべての版管理ヘッダの展開形をもとの形に戻します (see Version Headers)。 なぜなら、バッファはもはや既存のどの版にも対応しないからです。 ふたたびチェックインすると、チェックインの過程で、 新たな版番号として正しくヘッダを展開します。

しかしながら、RCSの$Log$ヘッダを 自動的にもとの形に戻すことは不可能です。 このヘッダの機能を使うなら、取り消した版に対応する項目を削除することで、 もとの形に手で戻す必要があります。

多くの作業結果を簡単に失ってしまうので、 C-x v cを起動するときには十分注意してください。


Node:VC Dired Mode, Next:, Previous:VC Undo, Up:Secondary VC Commands

VC下のdired

大きなプログラムを扱っているときは、ディレクトリの木構造全体の中で どのファイルが変更されたのかを調べたり、 版管理の下に置かれているすべてのファイルの状態を一度に見られると便利です。 コマンドC-x v dvc-directory)を使えば、 版管理に関連したファイルだけを含んだディレクトリ一覧を作れます。

C-x v dは、VC diredモードを使うバッファを作ります。 これは、普通のdiredバッファ(see Dired)にそっくりですが、 (ロックされていたり、未更新の)注意を払うべきファイルだけを 通常は表示します。 これを簡素な表示と呼びます。 変数vc-dired-terse-displaynilを設定すると、 VC diredは、関連するすべてのファイル、つまり、 版管理の下に置かれたファイルとすべてのサブディレクトリを表示します (完全な表示)。 VC diredバッファのコマンドv tは、 簡素な表示と完全な表示を切り替えます。 (see VC Dired Commands。)

デフォルトでは、VC diredは、指定したディレクトリやそれより下に置かれた 注意を払うべきファイルや関連するファイルの再帰的な一覧を作ります。 この動作を変えるには、 変数vc-dired-recursenilを設定します。 すると、VC diredは、指定したディレクトリにあるファイルだけを表示します。

各ファイルを表す行には、ハードリンク数、所有者、グループ、ファイルサイズの かわりに版管理状態があります。 ファイルが変更されていなければ、つまり、 マスタファイルの内容に同期しているならば、版管理状態は空です。 そうでなければ、括弧で括ったテキストになります。 RCSとSCCSでは、ファイルをロックしているユーザーの名前が示されます。 CVSでは、cvs状態(cvs status)を簡略化したものが示されます。 つぎは、RCSを使っている場合の例です。

  /home/jim/project:

  -rw-r--r-- (jim)      Apr  2 23:39 file1
  -r--r--r--            Apr  5 20:21 file2

ファイル、file1file2が、版管理の下に置かれていて、 file1はユーザーjimがロックしていて、 file2はロックされていません。

つぎは、CVSを使っている場合の例です。

  /home/joe/develop:

  -rw-r--r-- (modified) Aug  2  1997 file1.c
  -rw-r--r--            Apr  4 20:09 file2.c
  -rw-r--r-- (merge)    Sep 13  1996 file3.c

保管庫のものに比べて、file1.cは変更されていますが、 file2.cは変更されていません。 file3.cも変更されていますが、 保管庫には他の変更がチェックインされています。 file3.cをチェックインするまえに、 それらの変更を併合する必要があります。

VC diredで(『完全な表示』のときに)サブディレクトリを表示するときには、 版管理の下には絶対に置かれないものは省略します。 デフォルトでは、RCSCVSなどのVCのサブディレクトリが含まれます。 これは、変数vc-directory-exclusion-listを設定して カスタマイズできます。

普通のdiredのように、C-u C-x v dと打てば、 lsプログラムに渡す追加オプションを指定して、 VC diredの出力書式を微調整できます。


Node:VC Dired Commands, Previous:VC Dired Mode, Up:Secondary VC Commands

VC diredコマンド

VC diredモードでも、通常のdiredコマンドはすべて普通に動作しますが、 vは例外で、版管理プレフィックスとして再定義してあります。 vc-diffvc-print-logのようなVCコマンドは、 v =v lいうように打てば起動できます。 これらのコマンドの多くは、現在行のファイルに作用します。

コマンドv vvc-next-action)は、 印を付けたすべてのファイルに作用するので、 複数のファイルを一度にロックしたりチェックインしたりできます。 複数のファイルに作用する場合、各ファイルの現状に応じて個別に扱います。 つまり、あるファイルはロックしたり、別のファイルはチェックインしたりします。 これは混乱の原因かもしれません。 同じ状態の一連のファイルに印を付けて、 混乱を防止するのはユーザーの責任です。

ファイルをチェックインするときには、 v vは1つの記録項目を読んで、それをチェックインするすべての ファイルに使います。 これは、同じ変更に属する一連のファイルを一度にチェックインする場合に 便利です。

v tvc-dired-toggle-terse-mode)と打てばいつでも、 (ロックされていたり、内容が未更新のものだけを表示する) 簡素な表示と完全な表示とを切り替えられます。 特別なコマンド* lvc-dired-mark-locked)もあります。 これは現在ロックされている(CVSの場合には、内容が未更新である) すべてのファイルに印を付けます。 つまり、現在ロックされいるもの以外のすべてのファイルをバッファから 削除する別の方法は、* l t kと打つことです。


Node:Branches, Next:, Previous:Secondary VC Commands, Up:Version Control

ファイルの複数の枝分かれ

版管理の用途の1つは、ファイルの複数の『現在』版を維持することです。 たとえば、さまざまな完了していない新しい機能を徐々に付け加えている プログラムの異なる版を持つかもしれません。 そういった開発の独立した流れを(branch)と呼びます。 VCでは、枝を作ったり、別の枝へ切り替えたり、2つの枝を併合したりできます。 しかし、今のところ、RCSだけで枝を使えることに注意してください。

ファイルの開発の主要な流れを(trunk)と呼びます。 幹にある版は、普通、1.1、1.2、1.3、…と番号が付けられます。 そのような版のどれからでも、独立した枝を始めることができます。 版1.2から始まる枝の版番号は1.2.1.1となり、 同じ枝の後続の版番号は1.2.1.2、1.2.1.3、1.2.1.4、…となります。 版1.2から始まる別の枝があれば、それらの版番号は、 1.2.2.1、1.2.2.2、1.2.2.3、…となります。

版番号の最後の要素を省略したものを枝番号と呼びます。 これは、その枝にある版の中でもっとも大きい番号の版、先頭版を指します。 まえの例の枝は、枝番号1.2.1と1.2.2です。


Node:Switching Branches, Next:, Up:Branches

枝の切り替え

枝を切り替えるには、C-u C-x C-qと打ってから、 選択したい版番号を指定します。 その版をロックしない(書き込み不可)で訪問するので、 ロックするまえに調べることができます。 このような枝の切り替えが可能なのは、 ファイルがロックされていない場合に限ります。

枝の中での版番号を省略して枝番号だけを指定できます。 すると、その枝の先頭版を選ぶことになります。 <RET>だけを打つと、Emacsは幹の上のもっとも大きい版を選びます。

(幹を含む)どれかの枝へ切り替えたあとでは、 明示的に他の枝を選択するまで、それ以降のVCコマンドはその枝を使います。


Node:Creating Branches, Next:, Previous:Switching Branches, Up:Branches

新しい枝の作成

先頭版(枝の中にある最新版)から新たな枝を作るには、 必要ならまずその版を選択してから、C-x C-qでそれをロックし、 必要な変更を施します。 そして、変更をチェックインするときに、C-u C-x C-qを使います。 このコマンドでは、新版に対する版番号を指定できます。 現在の版から始まる枝として適切な番号を指定する必要があります。 たとえば、現在の版が2.5ならば、その時点で存在する枝の数に依存しますが、 枝番号は、2.5.1、2.5.2、…です。

旧版(先頭版ではないもの)から新しい枝を作るには、 その版をまず選択してから(see Switching Branches)、 それをC-x C-qでロックします。 旧版をロックすると、本当に新しい枝を作るのかどうか確認してきます。 noで答えると、かわりに、最新版をロックするかどうか聞いてきます。

変更してから、ふたたびC-x C-qと打って新版にチェックインします。 こうすると選択した版から始まる新しい枝を自動的に作ります。 新しい枝を特に指定する必要はありません。 なぜなら、枝の先頭版でないところに新版を付け加える唯一の方法だからです。

枝を作ったあとでは、その枝に『留まり』ます。 つまり、それ以降にチェックインすると、その枝に新版が作られます。 枝を去るには、C-u C-x C-qで明示的に別の版を選ぶ必要があります。 ある枝から別の枝へ変更を移すには、次節で説明する併合コマンドを使ってください。


Node:Merging, Next:, Previous:Creating Branches, Up:Branches

枝の併合

ある枝で変更を完了したときには、それらの変更をファイルの開発の主流(幹)に 取り込みたいことがしばしばあるでしょう。 これは簡単な操作ではありません。 というのは、幹でも開発は進行しているので、 別の向きに変更されているファイルに変更を併合する必要があるからです。 VCでは、vc-mergeコマンドで併合(とそれ以外のことも)できます。

C-x v m (vc-merge)
作業ファイルに変更を併合する。

C-x v mvc-merge)は、 一連の変更を作業ファイルの現在の版に併合します。 このコマンドはまず、ミニバッファで枝番号か2つの版番号を読み取ります。 そして、その枝での変更、あるいは、指定した2つの版のあいだの変更を調べ、 それらをファイルの現在の版に併合します。

例として、枝1.3.1である機能を実装し終えたとしましょう。 この間、幹でも開発が進んでいて版1.5になっています。 枝での変更を幹に併合するには、 まず、C-u C-x C-q <RET>と打って、幹の先頭版へ行きます。 版1.5が現在の版になります。 ファイルのロックを使っている場合には、C-x C-qと打って、 版1.5をロックして変更できるようにします。 続いてC-x v m 1.3.1 <RET>と打ちます。 すると、枝1.3.1での(枝の開始点である版1.3から枝の中にある最新版までの) 一連の変更を取り出して、それらを作業ファイルの現在の版に併合します。 ここで、変更された作業ファイルをチェックインできます。 つまり、枝での変更を取り込んだ版1.6を作れるのです。

チェックインするまえに、枝から併合したあとにさらに編集することも可能です。 しかし、併合した版をチェックインしたあとで、 ロックしてさらに編集するのが、普通は賢いやり方です。 こうすれば、変更履歴をよりよく記録に残せます。

すでに修正されているファイルに変更を併合するときには、 変更が重複する場合があります。 この状況を矛盾と呼びます。 矛盾した変更の辻褄を合わせることを矛盾の解消と呼びます。

併合中に矛盾が起こると、VCはこれらを検出し、 それらをエコー領域に表示してユーザーに伝え、 併合を補佐してほしいかどうか聞いてきます。 yesで答えると、ediffセッションを開始します (see Top)。

noで答えると、矛盾する変更はどちらも矛盾印で囲ってファイルに挿入します。 矛盾する部分は、下の例のようになります。 作業ファイルの名前はnameであり、 ユーザーBの変更を収めたマスタファイルの版は1.11です。

<<<<<<< name
  User A's version
=======
  User B's version
>>>>>>> 1.11

この矛盾を解消するようにファイルを手で編集できます。 あるいは、ファイルを訪問してからM-x vc-resolve-conflictsと打ちます。 すると上に述べたediffセッションを開始します。


Node:Multi-User Branching, Previous:Merging, Up:Branches

複数ユーザーの枝

ファイルの異なる枝上で同時に複数の開発者が作業すると有益なことが しばしばあります。 CVSでは、デフォルトで、これができます。 RCSでは、複数のソースディレクトリを作れば可能です。 RCSのマスタファイルを置いた共通のディレクトリを指すRCSという名前の リンクを各ソースディレクトリに置きます。 こうすれば、各ソースディレクトリでは、それぞれ独自に版を選択できます。 しかし、同じ共通のRCSレコードをすべてで共有します。

ソースファイルにRCSの版管理ヘッダ(see Version Headers)が入っていれば、 この技法は信頼性があり自動的に動作します。 ヘッダにより、Emacsはいつでも作業ファイルに入っている版番号がわかります。

ファイルに版管理ヘッダが入っていないときには、 各セッションごとにどの枝で作業しているかをEmacsに明示する必要があります。 こうするには、ファイルを訪問してから、 C-u C-x C-qと打ち、正しい枝番号を指定します。 これにより、編集セッションではどの枝を操作しているかを Emacsが知っていることを保証します。


Node:Snapshots, Next:, Previous:Branches, Up:Version Control

スナップショット

スナップショットとは、 ファイルの版(登録されたファイルそれぞれに1つずつ) の集合に名前を付けたもので、一塊として扱うことができます。 スナップショットの重要な種類の1つは、リリースです。 これは、ユーザーへ配布する準備が整ったシステムの(理論的には) 安定した版のことです。


Node:Making Snapshots, Next:, Up:Snapshots

スナップショットの作成と使用

スナップショットに対しては、基本的なコマンドが2つあります。 1つは名前を指定してスナップショットを作り、 もう1つは指名したスナップショットを取り出すことです。

C-x v s name <RET>
カレントディレクトリやその下に置いてある登録されたファイルの それぞれの保存された最新版をnameという名前の スナップショットとして定義する (vc-create-snapshot)。
C-x v r name <RET>
カレントディレクトリやその下に置いてある登録されたファイルすべてについて、 スナップショットnameに対応する版を選択する。

カレントディレクトリやその下に置いてある登録されたファイルのいずれかが ロックされていると、このコマンドは何も変更せずにエラーを報告する。 これは、進行中の作業結果を上書きしてしまうことを避けるため。

スナップショットはとても少量の資源しか使いません。 ファイル名一覧とスナップショットに属する版番号を 記録するに十分な量だけでいいのです。 したがって、使いものになるものをスナップショットにすることを 躇うことはありません。

C-x v =C-x v ~(see Old Versions)の引数として、 スナップショットの名前を指定できます。 したがって、スナップショットと現在のファイル、あるいは、 2つのスナップショット同士、あるいは、 指定した名前の版とスナップショット同士を比較できます。


Node:Snapshot Caveats, Previous:Making Snapshots, Up:Snapshots

スナップショットの弱点

VCのスナップショット機能は、RCSの名前付きコンフィギュレーションサポート (named-configuration support)をモデルにしています。 RCS固有の機能を使っているため、RCSを使って作ったVCのスナップショット は、VCを使わなくても見えます。

SCCSでは、VC自身でスナップショット機能を実装しています。 VCが使うファイルには、名前/ファイル/版番号の3つ組みが含まれます。 これらのスナップショットは、VCを使ったときだけ見えます。

スナップショットはチェックインした版の集合です。 ですから、スナップショットを作るときには、 すべてのファイルをチェックインしてあり、 しかもロックしていないことを確認してください。

ファイルを改名したり削除すると、スナップショットに問題を生じます。 これはVCに固有の問題ではなく、版管理システムに一般的な設計上の問題で、 まだ誰も満足ゆく解決をできていません。

登録されたファイルを改名するなら、 そのマスタファイルも一緒に改名する必要があります (コマンドvc-rename-fileは自動的にこれを行う)。 SCCSを使っているならば、ファイル名を新しい名前にして スナップショットの記録も更新する必要があります (vc-rename-fileはこれも行う)。 記録された名前ではもはや存在しないマスタファイルを参照する 古いスナップショットは無効です。 VCは(古い名前では)取り出せません。 スナップショットを手で更新する方法を説明するために RCSやSCCSを詳しく説明することは、本書の範囲を越えています。

vc-rename-fileを使えば、 取り出し操作に使える程度にはスナップショットを保てますが、 すべての問題を解決できるわけではありません。 たとえば、プログラムのいくつかのファイルでは、 名前で他のファイルを参照しているでしょう。 少なくとも、makefileでは、改名したファイルを指しているでしょう。 古いスナップショットを取り出すと、 改名したファイルは新しい名前で取り出しますが、 makefileで使っている名前ではありません。 ですから、取り出しただけではプログラムは動かないでしょう。


Node:Miscellaneous VC, Next:, Previous:Snapshots, Up:Version Control

VCのその他のコマンドと機能

本節では、使用頻度の少ないVCの機能を説明します。


Node:Change Logs and VC, Next:, Up:Miscellaneous VC

変更記録とVC

プログラムに対してRCSやCVSを使い、しかも、それらに変更記録ファイル (see Change Log)を保持しているならば、 版管理の記録項目から変更記録項目を自動的に生成できます。

C-x v a
カレントディレクトリにある変更記録ファイルを訪れる。 そして、そのディレクトリに置いてある登録された各ファイルについて、 変更記録ファイルにある最新の項目以降にチェックインされた版に関する 新たな項目を作成する。 (vc-update-change-log)。

このコマンドはRCSやCVSだけで動作し、SCCSでは動作しない。

C-u C-x v a
上と同様であるが、カレントバッファのファイルに関する項目だけを探す。
M-1 C-x v a
上と同様だが、現在訪問しているファイルのうち版管理の下に置かれているファイル すべてに関する項目を探す。 このコマンドはRCSでのみ動作する。 しかも、デフォルトディレクトリに関する すべての項目を変更記録に追加するが、これは適切でないこともある。

たとえば、ChangeLogの最初の行の日付が1999年4月10日であり、 それ以降のチェックインは Nathaniel Bowditchが1999年5月22日に Ignore log messages that start with `#'.という記録で rcs2logにチェックインしたものだけだとしましょう。 そうすると、C-x v aChangeLogを訪問して、 つぎのようなテキストを挿入します。

1999-05-22  Nathaniel Bowditch  <nat@apn.org>

        * rcs2log: Ignore log messages that start with `#'.

このあと、変更記録の新しい項目を好きなように編集できます。

残念ながら、ChangeLogファイルには日付しか記録していないので、 新たな変更記録項目がChangeLogファイルの既存の項目と重複することがあります。 そのような日付の重複は、手作業で削除する必要があります。

通常、ファイルfooに関する記録項目は、 * foo: text of log entryのように表示されます。 記録項目のテキストが(functionname):で始まると、 fooのうしろの:は省かれます。 たとえば、vc.elに関する記録項目が (vc-do-command): Check call-process status.であれば、 ChangeLogの中のテキストはつぎのようになります。

1999-05-06  Nathaniel Bowditch  <nat@apn.org>

        * vc.el (vc-do-command): Check call-process status.

C-x v aが複数の変更記録項目を一度に追加するときには、 同じ作者がほぼ同じ日時にチェックインしたものならば、 関連する記録項目をまとめます。 そのようないくつかのファイルに対する記録項目がすべて同じテキストならば、 1つの項目にまとめます。 たとえば、最後にチェックインしたものに、以下の記録があったとします。

vc.texinfoの記録項目: Fix expansion typos.vc.elの記録項目: Don't call expand-file-name.vc-hooks.elの記録項目: Don't call expand-file-name.

これらはChangeLogの中ではつぎのようになります。

1999-04-01  Nathaniel Bowditch  <nat@apn.org>

        * vc.texinfo: Fix expansion typos.

        * vc.el, vc-hooks.el: Don't call expand-file-name.

通常、C-x v aは記録項目を空行で区切りますが、 関連する記録項目のテキストを{clumpnameのような ラベルで始めれば、関連する複数の記録項目を1つの塊にする (区切りの空行を入れない)ように印を付けられます。 ラベル自体はChangeLogにはコピーされません。 たとえば、記録項目がつぎのようであるとします。

vc.texinfoの記録項目: {expand} Fix expansion typos.vc.elの記録項目: {expand} Don't call expand-file-name.vc-hooks.elの記録項目: {expand} Don't call expand-file-name.

すると、ChangeLogのテキストはつぎのようになります。

1999-04-01  Nathaniel Bowditch  <nat@apn.org>

        * vc.texinfo: Fix expansion typos.
        * vc.el, vc-hooks.el: Don't call expand-file-name.

記録項目のテキストが#で始まると、 その記録項目はChangeLogにはコピーされません。 たとえば、コメントの綴りまちがいだけを変更したときには、 記録項目を#で始めれば、このような自明なものをChangeLogに 入れないですみます。


Node:Renaming and VC, Next:, Previous:Change Logs and VC, Up:Miscellaneous VC

VC作業ファイルとマスタファイルの改名

登録したファイルを改名するときには、そのマスタファイルも同様に改名して 正しい結果を得られるようにする必要があります。 指定どおりにソースファイルを改名し、それに従って マスタファイルも改名するには、vc-rename-fileを使います。 このコマンドは、当該ファイルを指名しているどんなスナップショット (see Snapshots)も更新するので、スナップショットでも 新しい名前を使うようになります。 それにも関わらず、修正したスナップショットは動作しないかもしれません (see Snapshot Caveats)。

誰かがロックしているファイルに対しては、 vc-rename-fileを使えません。


Node:Version Headers, Previous:Renaming and VC, Up:Miscellaneous VC

版管理ヘッダの挿入

版を識別する文字列を作業ファイルへ直接入れておくと便利なこともあります。 版管理ヘッダと呼ばれる特別な文字列は、 各版ごとにその版番号で置き換えられます。

RCSを使っていて、かつ、作業ファイルに版管理ヘッダが入っていれば、 Emacsは、版管理ヘッダを使って現在の版とファイルのロック状態を決定できます。 これは、版管理ヘッダがないときにマスタファイルを参照するより、 信頼できます。 複数の枝を使う環境では、 VCが正しくふるまうためには版管理ヘッダが必要です (see Multi-User Branching)。

版管理ヘッダの探索は、変数vc-consult-headersで制御されます。 nil以外ならば、編集中の版番号を決定するためにEmacsはヘッダを探します。 nilを設定すると、この機能はオフになります。

適切なヘッダ文字列を入れるには、コマンドC-x v hvc-insert-headers)を使います。

C-x v h
版管理システムで使うヘッダをファイルに挿入する。

デフォルトのヘッダ文字列は、 RCSでは$Id$、SCCSでは%W%です。 変数vc-header-alistに設定すれば、他のヘッダを指定できます。 この値は、(program . string)の形式の 要素から成るリストです。 ここで、programRCSまたはSCCSであり、 stringは使用する文字列です。

1つの文字列のかわりに、文字列のリストを指定することもできます。 そうすると、リストの各文字列は、別々の行に別のヘッダとして挿入されます。

この変数に入れる文字列を書くときには、『余分な』バックスラッシュを 使う必要がよくあります。 この文字列を含むEmacs Lispファイルが版管理の下に置かれているときに、 定数中の文字列がヘッダと解釈されることを防ぐためです。

各ヘッダは、ポイント位置の新しい行に、 コメント区切りの内側にタブで囲んで挿入されます。 通常、現在のモードのコメント開始文字列とコメント終了文字列を使いますが、 特定のモードでは、この目的のための特別なコメント区切りがあります。 変数vc-comment-alistがそれらを指定します。 このリストの各要素は (mode starter ender)という形式です。

変数vc-static-header-alistは、 バッファ名に基づいた追加の文字列を指定します。 この値は、(regexp . format)の形式の 要素から成るリストでなくてはいけません。 regexpがバッファ名に一致するたびに、 formatをヘッダの一部として挿入します。 バッファ名に一致する各要素とvc-header-alistに指定された各文字列ごとに ヘッダ行を挿入します。 vc-header-alistの文字列を要素の書式formatで処理して ヘッダ行を作ります。 vc-static-header-alistのデフォルト値はつぎのとおりです。

(("\\.c$" .
  "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n\
#endif /* lint */\n"))

これは、つぎのようなテキストを挿入します。

#ifndef lint
static char vcid[] = "string";
#endif /* lint */

上のテキストは空行で始まっていることに注意してください。

複数の版管理ヘッダをファイルに入れる場合には、 ファイル内ではそれらを一緒にまとめて入れておきます。 revert-bufferのマーカを保存する機構は、 2つの版管理ヘッダのあいだに置かれたマーカを扱えないこともあります。


Node:Customizing VC, Previous:Miscellaneous VC, Up:Version Control

VCのカスタマイズ

VCをカスタマイズする方法はたくさんあります。 設定可能なオプションは、次節に述べる4つに分類できます。


Node:Backend Options, Next:, Up:Customizing VC

VCのバックエンドに対するオプション

RCSとCVSには、ファイルのロックを使うかどうかを指定できます (ロックに関してはsee VC Concepts)。 VCはどちらを選んだかを識別し、そのようにふるまいます。

RCSでは、デフォルトはロックを使います。 しかし、ファイルをロックしていなくても変更をチェックインできる、 弱いロックと呼ばれるモードがあります。 特定のファイルに対して弱いロックを使うように切り替えるには、 rcs -Uを使います。 詳しくは、rcsのマニュアルページを参照してください。

CVSでは、デフォルトはロックを使いません。 いつでも誰もが作業ファイルを変更できます。 しかし、これを制限する方法があり、ロックに似たふるまいをします。

1つの方法は、環境変数CVSREADに何か値を設定することです。 この変数が定義されていると、 CVSはデフォルトでは作業ファイルを読み出し専用にします。 Emacs内では、C-x C-qと打ってファイルを書き込み可能にする必要があります。 そうすると、事実上ロックを使っているかのように編集できます。 しかしながら、実際にロックされているわけではないので、 複数のユーザーが各自のファイルを同時に書き込み可能にできてしまいます。 CVSREADを初めて設定するときには、 ファイルの保護が正しく設定されるように、 あなたのモジュールすべてを新たにチェックアウトしたことを確認してください。

ロックに似たふるまいを達成する別の方法は、CVSの監視機能を使うことです。 ファイルを監視するようにしておくと、 CVSはデフォルトでそのファイルを読み出し専用にします。 そのため、Emacs内ではC-x C-qを使って書き込み可能にする必要があります。 VCは、cvs editを実行してファイルを書き込み可能にします。 すると、CVSは、あなたがファイルを変更しようとしていることを 他の開発者に通知します。 監視機能の詳しい使い方については、CVSの解説を参照してください。

変数vc-handle-cvsnilを設定すれば、 CVSの管理下に置いたファイルに対してVCを使わないようにできます。 こうすると、Emacsは、これらのファイルを あたかも登録されていないかのように扱い、 それらに対してVCコマンドは使えません。 すべてのCVS操作を手動で行う必要があります。


Node:VC Workfile Handling, Next:, Previous:Backend Options, Up:Customizing VC

VC作業ファイルの扱い方

Emacsは、版管理の下に置かれたソースファイルに対しては、 通常バックアップファイルを作りません。 版管理を使っているファイルに対してもバックアップファイルを作りたいなら、 変数vc-make-backup-filesnil以外の値を設定します。

ロックの状態に関わらず、 普通、作業ファイルはつねに存在します。 vc-keep-workfilesnilを設定すると、 C-x C-qで新版をチェックインすると、作業ファイルを削除します。 しかし、Emacsでファイルを訪問しようとすると、作業ファイルをふたたび作ります。 (CVSでは、作業ファイルはつねに存在する。)

版管理されているファイルをシンボリックリンクを介して編集することは、 危険なことになりえます。 版管理システムを迂回してしまいます。 つまり、ロックせずにファイルを編集できてしまい、 変更のチェックインには失敗します。 また、他のユーザーがあなたの変更を上書きしてしまうかもしれません。 こういったことを防ぐために、 VCは、訪問する各シンボリックリンクを検査して、 それが版管理の下に置かれたファイルを指しているかどうか調べます。

変数vc-follow-symlinksは、 シンボリックリンクが版管理されているファイルを指しているときに どうするかを制御します。 その値がnilならば、VCは警告メッセージを表示するだけです。 tならば、VCは自動的にリンクを辿って、かわりに本当のファイルを訪問し、 エコー領域にこのことを表示します。 値がask(デフォルト)ならば、 VCはリンクを辿るかどうかを毎回聞いてきます。


Node:VC Status Retrieval, Next:, Previous:VC Workfile Handling, Up:Customizing VC

VC状態検索

ファイルのロック状態を推測するとき、 VCはまずファイルのRCSの版管理ヘッダ文字列を探します (see Version Headers)。 ヘッダ文字列がなかったり、SCCSを使っているときは、 VCは通常、作業ファイルのパーミッションを調べます。 ここまでは、すぐにできます。 しかし、ファイルのパーミッションを信頼できない場合もあります。 この場合、やや手間がかかりますが、マスタファイルを調べる必要があります。 さらに、マスタファイルは、ファイルがロックされているかどうかは 教えてくれますが、 作業ファイルがロックされた版を本当に含んでいるかどうかは教えてくれません。

ロック状態を調べるために版管理ヘッダを使わないようにVCに指示するには、 変数vc-consult-headersnilを設定します。 すると、VCは(信頼できるなら)ファイルパーミッションを使うか、 マスタファイルを調べます。

変数vc-mistrust-permissionsを設定することで、 ファイルパーミッションを信頼するかどうかの基準を指定できます。 その値は、t(つねにファイルパーミッションを疑い、 マスタファイルを調べる)、 nil(つねにファイルパーミッションを信頼する)、あるいは、 可否を決定する1引数の関数です。 その引数は、サブディレクトリ、RCSCVSSCCSの いずれかの名前です。 関数の戻り値がnil以外ならば、ファイルパーミッションを疑います。 作業ファイルのパーミッションがまちがって変更されていると思うなら、 vc-mistrust-permissionstを設定します。 すると、VCはつねにファイルの状態を決定するためにマスタファイルを調べます。


Node:VC Command Execution, Previous:VC Status Retrieval, Up:Customizing VC

VCコマンドの実行

vc-suppress-confirmnil以外ならば、 C-x C-qC-x v iは確認せずにカレントバッファを保存し、 C-x v uも確認せずに作用します。 (この変数はC-x v cには影響しない。 その操作は思い切ったものなので、つねに確認するべき。)

VCモードは、RCS、CVS、SCCSのシェルコマンドを実行することで、 その作業の多くを行います。 vc-command-messagesnil以外ならば、 VCはどのシェルコマンドを実行しているか表示し、 コマンドが終了したときに追加メッセージを表示します。

変数vc-pathを設定すれば、 版管理プログラムを探すための追加のディレクトリを指定できます。 これらのディレクトリは、通常の探索パスを探すまえに探されます。 しかし、通常は適切なファイルを自動的にみつけられます。


Node:Directories, Next:, Previous:Version Control, Up:Files

ファイルディレクトリ

ファイルシステムは、ファイル群をディレクトリにまとめます。 ディレクトリ一覧は、ディレクトリの中にある、 すべてのファイルの一覧表です。 Emacsには、ディレクトリを作成したり削除したりするコマンド、 短形式(ファイル名のみ)や長形式(サイズ、日付、作者を含む)の ディレクトリ一覧を作成するコマンドがあります。 diredと呼ばれるディレクトリブラウザもあります。 See Dired

C-x C-d dir-or-pattern <RET>
短形式でディレクトリ一覧を表示する(list-directory)。
C-u C-x C-d dir-or-pattern <RET>
長形式でディレクトリ一覧を表示する。
M-x make-directory <RET> dirname <RET>
dirnameという名前の新しいディレクトリを作る。
M-x delete-directory <RET> dirname <RET>
dirnameという名前のディレクトリを削除する。 ディレクトリは空である必要があり、さもないとエラー。

ディレクトリ一覧を表示するコマンドは C-x C-dlist-directory)です。 表示するディレクトリや一覧に含めるファイルを指定するワイルドカードを含む パターンをミニバッファから読み取ります。 たとえば、

C-x C-d /u2/emacs/etc <RET>

とすると、 ディレクトリ/u2/emacs/etcの中のすべてのファイルを表示します。 ファイル名のパターンを指定した例はつぎのとおりです。

C-x C-d /u2/emacs/src/*.c <RET>

通常、C-x C-dはファイル名だけを含んだ短形式のディレクトリ一覧を 表示します。 (値は無関係な)数引数を指定すると、 (ls -lのように)サイズ、日付、作者を含む長形式の一覧を作ります。

ディレクトリ一覧のテキストは、下位プロセスでlsを実行して取得します。 Emacsの2つの変数で、lsへ渡すオプションを制御します。 list-directory-brief-switchesは、短形式一覧のときに使う オプションを与える文字列です(デフォルトは"-CF")。 list-directory-verbose-switchesは、長形式一覧のときに使う オプションを与える文字列です(デフォルトは"-l")。


Node:Comparing Files, Next:, Previous:Directories, Up:Files

ファイルの比較

コマンドM-x diffは、2つのファイルを比較し、 *Diff*という名前のEmacsバッファにその違いを表示します。 このコマンドは、値が文字列である変数diff-switchesで指定された オプションを使ってdiffプログラムを実行します。

バッファ*Diff*のメジャーモードはコンパイル(compilation)モードです。 ですから、C-x `を使って、 2つのソースファイルで変更されている箇所を次々に訪れることができます。 特定の変更箇所にポイントを移動してから、 <RET>やC-c C-cを打つか、そこでMouse-2をクリックすると、 そこに対応するソースの場所へ移動できます。 コンパイル(compilation)モードの他の特別なコマンドを使うこともできます。 <SPC>と<DEL>でスクロール、 M-pM-nでカーソル移動できます。 See Compilation

コマンドM-x diff-backupは、 指定されたファイルとその最新のバックアップとを比較します。 バックアップファイルの名前を指定すると、 diff-backupはそのもとのファイルとバックアップファイルとを比較します。

コマンドM-x compare-windowsは、 カレントウィンドウの中のテキストと、 つぎのウィンドウの中のテキストを比較します。 それぞれのウィンドウのポイント位置から比較を始めます。 それぞれの開始位置は、各バッファのマークリングに積まれます。 そして、各ウィンドウでそれぞれのポイントを1文字ずつ進めることを、 両者のウィンドウで一致しないものに出会うまで行います。 そして、コマンドは終了します。 Emacsのウィンドウについてより詳しくは、See Windows

数引数を指定すると、compare-windowsは 白文字の違いを無視します。 変数compare-ignore-casenil以外ならば、 大文字小文字の違いも同様に無視します。

2つの似たファイルの併合に便利な機能に関しては、See Emerge


Node:Misc File Ops, Next:, Previous:Comparing Files, Up:Files

その他のファイル操作

Emacsには、ファイルをさまざまに操作するコマンドがあります。 それらすべては1つのファイルを操作します。 これらのコマンドは、ワイルドカードを含むファイル名を受け付けません。

M-x view-fileでは、ファイルを1画面分ずつ順番に眺めることができます。 このコマンドは、ミニバッファでファイル名を読み取ります。 Emacsバッファにファイルを読み込んだあと、view-fileは先頭を表示します。 そうしたら、1ウィンドウ分先へスクロールするには<SPC>、 逆向きにスクロールするには<DEL>を打ちます。 ファイル内を動き廻るための他のいろいろなコマンドもありますが、 変更するためのコマンドはありません。 コマンド一覧を見るには、このモードで?と打ちます。 コマンド群は、Emacsの普通のカーソル移動コマンドとほとんど同じです。 ファイル閲覧を終了するには、qを打ちます。 閲覧用のコマンドは、閲覧(view)モードと呼ばれる 特別なメジャーモードで定義されています。

関連したコマンド、M-x view-bufferは、 Emacsの既存のバッファを閲覧します。 See Misc Buffer

M-x insert-fileは、指定したファイルの内容を カレントバッファのポイント位置に挿入します。 ポイントの位置はそのままですが、挿入された部分の直後にマークを設定します。

M-x write-regionは、M-x insert-fileの逆です。 指定したファイルにリージョンの内容をコピーします。 M-x append-to-fileは、 指定したファイルの末尾にリージョンのテキストを付け加えます。 See Accumulating Text

M-x delete-fileは、シェルのrmコマンドのように、 指定したファイルを削除します。 1つのディレクトリ内のたくさんのファイルを削除するのなら、 diredを使うほうが便利です(see Dired)。

M-x rename-fileは、ミニバッファで2つのファイル名、 oldnewを読み取り、ファイルoldnewに改名します。 newという名前のファイルが既存のときには、 確認にyesで応答する必要があります。 そうしないと、改名しません。 これは、改名により名前newの古い意味が失われるからです。 oldnewが異なるファイルシステムの上にあるときには、 ファイルoldを(newに)コピーしてから削除します。

似たコマンドM-x add-name-to-fileは、 既存ファイルの名前を消さずに別の名前を追加するために使います。 新しい名前は、既存ファイルが置かれている同じファイルシステムに 属している必要があります。

M-x copy-fileは、ファイルoldを読んで、 新しいファイルnewに同じ内容を書き出します。 newという名前のファイルが既存なら、確認を求めてきます。 というのは、コピーするとファイルnewの古い内容を上書きしてしまうからです。

M-x make-symbolic-linkは、2つのファイル名、 targetlinknameを読み取って、 targetを指すlinknameという名前のシンボリックリンクを作ります。 この結果、将来linknameをオープンしようとすると、 その時点でtargetという名前のファイルを参照します。 その時点で名前targetが使われていなければ、エラーになります。 このコマンドは引数targetを展開しないので、 リンク先に相対名を書くことができます。

linknameが使われていると、 リンクを作るときに確認を求めます。 すべてのシステムでシンボリックリンクを使えるわけではないことに 注意してください。


Node:Compressed Files, Next:, Previous:Misc File Ops, Up:Files

圧縮されたファイルの参照

Emacsには、 圧縮されたファイルを訪問すると自動的に展開し、 それを変更して保存すると自動的に再度圧縮するライブラリがあります。 この機能を利用するには、コマンドM-x auto-compression-modeを打ちます。

(自動展開を含む)自動圧縮がオンのときには、 Emacsはファイル名で圧縮されたファイルを認識します。 ファイル名の語尾が.gzのものは、 gzipで圧縮されたファイルであることを表します。 他の語尾の場合には、他の圧縮プログラムであることを表します。

自動展開と自動圧縮は、Emacsがファイルの内容を使うすべての操作に適用されます。 ファイルを訪問する、ファイルに保存する、ファイルの内容をバッファに挿入する、 ファイルをロードする、ファイルをバイトコンパイルすることを含みます。


Node:Remote Files, Next:, Previous:Compressed Files, Up:Files

リモートファイル

特別なファイル名の構文を使って、他のマシン上のファイルを参照できます。

/host:filename
/user@host:filename

このようにすると、Emacsは、 指定したホスト上のファイルを読み書きするためにFTPプログラムを使います。 あなたのユーザー名かuserを使ってFTPでログインします。 毎回パスワードを聞かれることもありますが、 これはhostへのログインに使われます。

普通、リモートファイル名にユーザー名を指定しないと、 あなたのユーザー名を使うことを意味します。 しかし、変数ange-ftp-default-userに文字列を設定しておけば、 その文字列をかわりに使います。 (FTPによるファイル参照を実装するEmacsのパッケージは、 ange-ftpと呼ばれる。)

変数file-name-handler-alistnilを設定すると、 FTPファイル名機能を完全にオフにできます 16


Node:Quoted File Names, Previous:Remote Files, Up:Files

クォートしたファイル名

特殊文字や特別な構文の特別な効果を抑えるために、 絶対ファイル名をクォートできます。 そうするには、先頭に/:を加えます。

たとえば、リモートにあるように見えるローカルなファイル名をクォートして、 リモートファイル名として扱われるのを防ぎます。 したがって、ディレクトリが/foo:という名前であり、 その中にbarという名前のファイルがあるとき、 Emacsでは、そのファイルを/:/foo:/barで参照できます。

/:は、~をユーザーのホームディレクトリを表す 特殊文字として扱わないようにもします。 たとえば、/:/tmp/~hackは、 ディレクトリ/tmpの中にある~hackというファイル名を指します。

同様に、/:$を含むファイル名を ミニバッファで入力する方法の1つです。 しかし、$をクォートするには、 /:は(ミニ)バッファの先頭に置く必要があります。

ワイルドカード文字を/:でクォートすることもできます。 たとえば、/:/tmp/foo*barでファイル/tmp/foo*barを訪問します。 しかしながら、多くの場合、単にワイルドカード文字そのものを入力できます。 たとえば、/tmpにあるfooで始まりbarで終る名前の ファイルがfoo*barであるときには、 /tmp/foo*barと指定すると、単に/tmp/foo*barを訪問します。


Node:Buffers, Next:, Previous:Files, Up:Top

複数のバッファの使い方

Emacs内で編集しているテキストはバッファ(buffer)と 呼ばれるオブジェクトの中に存在します。 ファイルを訪問するたびに、 ファイルのテキストを保持するバッファを作ります。 diredを起動するたびに、ディレクトリ一覧を保持するバッファを作ります。 C-x mでメッセージを送信するときには、 メッセージのテキストを保持するためにバッファ*mail*が使われます。 コマンドの説明文を求めると、*Help*と呼ばれるバッファに説明文が現れます。

どんなときでも、1つのバッファだけが選択されています。 このバッファをカレントバッファとも呼びます。 バッファが1つしかないかのように、 コマンドが『バッファ』に作用するといういい方をよくします。 しかし、実際には、コマンドが選択されたバッファに作用するということです (多くのコマンドはそうする)。

複数のウィンドウがあるとき、 各ウィンドウはそこに表示しているバッファを選んでいますが、 いつでもそれらのウィンドウのうち1つだけが選択されていて、 そのウィンドウに表示されているバッファが選択されているバッファです。 各ウィンドウのモード行は、 そのウィンドウに表示しているバッファの名前を表示します(see Windows)。

各バッファにはどんな長さでもよい名前があり、 バッファ名を指定してバッファを選択できます。 多くのバッファはファイルを訪問することで作成され、 それらの名前はファイル名から導き出します。 好きな名前で空のバッファを作ることもできます。 Emacsを新たに始めると、Emacs内でLisp式の評価に使える *scratch*という名前のバッファができます。 バッファ名では大文字小文字を区別します。

各バッファは独立に、どのファイルを訪問しているか、 変更されているか、どのメジャーモードとマイナモードを使っているか を記録しています。(see Major Modes)。 どのEmacs変数も各バッファにローカルにすることができます。 つまり、あるバッファでの変数の値を 他のバッファでのその変数の値とは違う値にできます。 See Locals


Node:Select Buffer, Next:, Up:Buffers

バッファの作成と選択

C-x b buffer <RET>
bufferという名前のバッファを選択または作成する (switch-to-buffer)。
C-x 4 b buffer <RET>
同様だが、別のウィンドウでbufferを選択する (switch-to-buffer-other-window)。
C-x 5 b buffer <RET>
同様だが、別のフレームでbufferバッファを選択する (switch-to-buffer-other-frame)。

bufnameという名前のバッファを選択するには、 C-x b bufname <RET>と打ちます。 これは、引数bufnameでコマンドswitch-to-bufferを実行します。 バッファ名の略称形を補完することができます(see Completion)。 C-x bに空の引数を指定すると、 どのウィンドウにも表示されていない最近選択したバッファを意味します。

ほとんどのバッファは、ファイルを訪問することで作られるか、 テキストを表示するようなEmacsコマンドによって作られますが、 C-x b bufname <RET>と打って、 明示的にバッファを作ることもできます。 こうすると、ファイルを訪問していない新しい空のバッファを作り、 編集できるようにそのバッファを選択します。 このようなバッファは、自分用のメモを作るのに使います。 これらのバッファを保存しようとすると、 使用するファイル名を聞かれます。 新しいバッファのメジャーモードは、 default-major-modeの値で決まります(see Major Modes)。

C-x C-fやファイルを訪問する他のコマンドは、 ファイルを訪問している既存のバッファへの切り替えにも使えることに 注意してください。 See Visiting

Emacsは、内部目的用のバッファには、空白で始まるバッファ名を使います。 Emacsは、これらのバッファを少々特別に扱います。 たとえば、デフォルトでは、アンドゥ情報を記録しません。 このようなバッファ名は避けるのが最良です。


Node:List Buffers, Next:, Previous:Select Buffer, Up:Buffers

既存バッファの一覧

C-x C-b
既存バッファを一覧表示する(list-buffers)。

既存のすべてのバッファを一覧表示するには、 C-x C-bと打ちます。 各行は、バッファ名、メジャーモード、訪問しているファイルを示します。 バッファは選択された順に表示されます。 もっとも最近に選択されたバッファが始めにきます。

行頭の*は、バッファが『修正され』ていることを示します。 いくつかのバッファが修正されているなら、 C-x sでいくつかのバッファを保存する時期かもしれません (see Saving)。 %は、読み出し専用バッファを示します。 .は選択されているバッファに付けられます。 つぎは、バッファ一覧の例です。

 MR Buffer         Size  Mode           File
 -- ------         ----  ----           ----
.*  emacs.tex      383402 Texinfo       /u2/emacs/man/emacs.tex
    *Help*         1287  Fundamental
    files.el       23076 Emacs-Lisp     /u2/emacs/lisp/files.el
  % RMAIL          64042 RMAIL          /u/rms/RMAIL
 *% man            747   Dired          /u2/emacs/man/
    net.emacs      343885 Fundamental   /u/rms/net.emacs
    fileio.c       27691 C              /u2/emacs/src/fileio.c
    NEWS           67340 Text           /u2/emacs/etc/NEWS
    *scratch*	   0	 Lisp Interaction

バッファ*Help*は、ヘルプ要求で作られたものです。 このバッファはファイルを訪問していません。 バッファmanは、 ディレクトリ/u2/emacs/man/に対してdiredが作ったものです。


Node:Misc Buffer, Next:, Previous:List Buffers, Up:Buffers

その他のバッファ操作

C-x C-q
バッファの読み出し専用状態を切り替える (vc-toggle-read-only)。
M-x rename-buffer <RET> name <RET>
カレントバッファの名前を変更する。
M-x rename-uniquely
名前の最後に<number>を付加して カレントバッファ名を変更する。
M-x view-buffer <RET> buffer <RET>
バッファbufferをスクロールする。

バッファは、読み出し専用にもなります。 そうすると、その内容を変更するコマンドは許されません。 モード行では、左端付近に%%%*を表示して、 読み出し専用バッファであることを示します。 通常、読み出し専用バッファは、テキストを操作する特別なコマンドを持つ diredやrmailなどのサブシステムが作ります。 書き込みを禁止されたファイルを訪問しても 読み出し専用バッファが作られます。

読み出し専用バッファで変更したいときには、 コマンドC-x C-qを使います(vc-toggle-read-only)。 これは、読み出し専用バッファは書き込み可能にし、 書き込み可能バッファは読み出し専用にします。 多くの場合、これは変数buffer-read-onlyを設定することで動作します。 この変数は各バッファでローカルな値を持ち、 値がnil以外だとバッファは読み出し専用になります。 ファイルが版管理の下に置かれている場合には、 C-x C-qは版管理システムを介して バッファだけでなくファイルの読み出し専用の状態も変更します。 See Version Control

M-x rename-bufferは、カレントバッファの名前を変更します。 ミニバッファ引数として新しい名前を指定します。 デフォルトはありません。 すでに他のバッファに使っている名前を指定すると、 エラーになり、名前は変更されません。

M-x rename-uniquelyは、 他のどれとも違う唯一の名前にするために、 カレントバッファ名に数字の接尾辞を付け加えて似た名前に変更します。 このコマンドは引数を必要としません。 このコマンドは複数のシェルバッファを作るのに便利です。 バッファ*Shell*を改名すれば、 M-x shellをふたたび実行して バッファ名*Shell*の新しいシェルバッファを作れます。 一方、古いシェルバッファは、新しい名前で存在し続けます。 この方法は、メイルバッファ、コンパイルバッファ、 特定の名前のバッファを作るEmacsの多くの機能にも有効です。

M-x view-bufferは、既存のEmacsバッファを調べることを除けば、 M-x view-file(see Misc File Ops)によく似ています。 閲覧(view)モードには、バッファを簡単にスクロールするための コマンドがありますが、変更するコマンドはありません。 qで閲覧(view)モードから抜けると、 ウィンドウにまえに表示していたバッファ(とその中での箇所)に切り替わります。 あるいは、eで閲覧(view)モードから抜けると、 閲覧していたバッファとそのポイント位置はそのまま残ります。

コマンド、M-x append-to-bufferM-x insert-bufferは、 1つのバッファから別のバッファへテキストをコピーするのに使います。 See Accumulating Text


Node:Kill Buffer, Next:, Previous:Misc Buffer, Up:Buffers

バッファの消去

Emacsのセッションをしばらく続けると、 たくさんの数のバッファが溜っているでしょう。 もう必要としないバッファを消去したほうがよいと思うかもしれません。 多くのオペレーティングシステムでは、 バッファを消去するとそのメモリ領域を解放して オペレーティングシステムに返すので、 他のプログラムが使えるようになります。 バッファを消去するコマンドをいくつかあげます。

C-x k bufname <RET>
バッファbufnameを消去する(kill-buffer)。
M-x kill-some-buffers
1つ1つ各バッファを消去するかどうか聞いてくる。

C-x kkill-buffer)は、 ミニバッファで指定した名前のバッファを消去します。 ミニバッファで<RET>だけ打ったときに使われるデフォルトは、 カレントバッファを消去することです。 カレントバッファを消去すると、別のバッファが選択されます。 どのウィンドウにも表示されていない、 もっとも最近に選択されたバッファです。 ファイルを訪問して修正してある(編集後に保存していない)バッファを 消去しようとすると、バッファを消去するまえにyesでの確認を求めます。

コマンドM-x kill-some-buffersは、 1つ1つ各バッファについて消去するか聞いてきます。 yと答えると、そのバッファを消去します。 カレントバッファや未保存の変更を含むバッファを消去しようとすると、 新しいバッファを選択するかkill-bufferのように確認を求めてきます。

バッファメニュー機能(see Several Buffers)も、 さまざまなバッファを削除するのに便利です。

バッファを削除するときに、毎回何か特別なことをしたいならば、 フックkill-buffer-hookにフック関数を追加します(see Hooks)。

多くの人々がやるように、何日にもわたってたった1つのEmacsセッションを 実行する場合、数日前に使ったバッファで一杯になることがあります。 コマンドM-x clean-buffer-listは、 それらのバッファを消去する便利な方法です。 長い期間にわたって使っていない未修正のバッファすべてを消去します。 3日間表示していない普通のバッファは消去されます。 しかし、特定のバッファを自動的には消去しないようにしたり、 ほんの数時間使用しないだけで消去するようにも指定できます。

真夜中(midnight)モードをオンにすれば、 このようなバッファの消去を毎日真夜中に行わせることもできます。 真夜中(midnight)モードは、毎日真夜中に動作します。 真夜中に、clean-buffer-list、あるいは、 ノーマルフックmidnight-hookに指定した関数を実行します。

真夜中(midnight)モードをオンにするには、 カスタマイズ(customization)バッファを使って、 変数midnight-modetを設定します。 See Easy Customization


Node:Several Buffers, Next:, Previous:Kill Buffer, Up:Buffers

複数バッファの操作

バッファメニュー(buffer-menu)機能は 『バッファに対するdired』に似ています。 このコマンドは、バッファ一覧を収めたEmacsバッファを編集することで、 さまざまなEmacsバッファを操作できます。 バッファの保存、消去(ここではdiredとの一貫性のために削除と呼ぶ)、 表示を行うことができます。

M-x buffer-menu
すべてのEmacsバッファの一覧を収めたバッファを編集し始める。

コマンドbuffer-menuは、 すべてのEmacsバッファの一覧をバッファ*Buffer List*に書き、 そのバッファをバッファメニュー(buffer-menu)モードにして 選択します。 そのバッファは読み出し専用で、本節で述べる特別なコマンドでのみ変更できます。 普通のEmacsカーソル移動コマンドは、*Buffer List*バッファでも使えます。 つぎにあげるコマンドは、現在行に書かれているバッファに作用します。

d
バッファを削除(消去)するように指示し、1行下へ移動する。 この指示は、その行のバッファ名のまえにDを表示する。 指示した削除は、xコマンドを打ったときに実行される。
C-d
dに似ているが、1行下へ移動するかわりに上へ移動する。
s
バッファを保存するように指示する。 この指示により、行にはSが表示される。 指示した保存は、xコマンドを打ったときに実行される。 同じバッファに対して、保存と削除の両方を指示できる。
x
まえに指示した削除と保存を実行する。
u
現在行に対する指示を消し、1行下へ移動する。
<DEL>
1つまえの行に移動し、その行に対するどんな指示も消す。

dC-dsuコマンドは、 フラグを追加または削除して、1行下へ(あるいは上へ)移動します。 これらのコマンドは、反復回数として数引数を取ります。

つぎにあげるコマンドは、現在行に書かれているバッファにただちに作用します。

~
バッファに『変更なし』と印を付ける。 コマンド~を打つと、ただちに実行する。
%
バッファの読み出し専用フラグをトグルする。 コマンド%を打つと、ただちに実行する。
t
タグテーブルとしてバッファを訪問する。 see Select Tags Table

他のバッファや複数のバッファを選択するコマンドもあります。

q
バッファメニューをやめる。 このウィンドウには、ここに表示していたもっとも最近のバッファを表示する。
<RET>
f
*Buffer List*のかわりに、この行のバッファをただちに選択する。
o
C-x 4 bのように、別のウィンドウでこの行のバッファをただちに選択する。 *Buffer List*はそのまま。
C-o
別のウィンドウにこの行のバッファをただちに表示するが、 そのウィンドウを選択しない。
1
この行のバッファを画面一杯のウィンドウにただちに選択する。
2
ただちに2つのウィンドウにして、 この行のバッファをその1つに、 (*Buffer List*バッファを除いて)まえに選択していたバッファを もう1つに表示する。
b
この行のバッファを一覧の最後に移す。
m
vコマンドでバッファメニューをやめたときに、 この行のバッファを別のウィンドウに表示するように印を付ける。 この指示は、行頭に> を表示する。 (1つのバッファに、削除指示と表示指示の両方を付けることはできない。)
v
ただちにこの行のバッファを選択し、 別のウィンドウ群にはmコマンドで印を付けたバッファ群を表示する。 印を付けたバッファがなければ、このコマンドは1コマンドと同じ。

buffer-menuが直接行うことは、 適切なバッファを作成してそれに切り替えてから、 バッファメニュー(buffer-menu)モードにすることです。 それ以外の上に述べたことはすべて、 バッファメニュー(buffer-menu)モードが用意した特別なコマンドで 実装されています。 その結果、*Buffer List*バッファから別のEmacsバッファへ切り替えて、 そこで編集できます。 あとで*Buffer List*バッファをふたたび選択してすでに指示した操作を実行したり、 このバッファを削除したり、無視したりもできます。

buffer-menulist-buffersの唯一の違いは、 buffer-menuは選択されたウィンドウで *Buffer List*バッファに切り替えることです。 list-buffersは別のウィンドウにこのバッファを表示するだけです。 list-buffersを実行し(つまり、C-x C-bと打つ)、 *Buffer List*バッファを手動で選択すると、 ここに述べたすべてのコマンドを使えます。

バッファを作成したり削除したりしても、 バッファ*Buffer List*は自動的に更新されません。 その内容はただのテキストにすぎません。 バッファを作成/削除/改名したら、 現在のバッファの状態を見るために*Buffer List*を更新する方法は、 grevert-buffer)を打つか、 buffer-menuコマンドを再度実行することです。


Node:Indirect Buffers, Previous:Several Buffers, Up:Buffers

間接バッファ

間接バッファは、他のバッファとテキストを共有します。 そのような他のバッファを間接バッファの基底バッファと呼びます。 ある意味で、ファイルのあいだのシンボリックリンクに似ています。

M-x make-indirect-buffer base-buffer <RET> indirect-name <RET>
base-bufferを基底バッファとする間接バッファindirect-nameを作る。

間接バッファのテキストはつねに基底バッファのテキストと同じです。 どちらか片方を編集して変更すると、他方のバッファでもすぐにそれが見えます。 しかし、それ以外のすべての点では、 間接バッファとその基底バッファは完全に別のものです。 これらは、異なる名前、異なるポイントの値、異なるナロイング、 異なるマーカ、異なるメジャーモード、異なるローカル変数を持ちます。

間接バッファではファイルを訪問できませんが、 基底バッファではできます。 間接バッファを保存しようとすると、実際には基底バッファを保存します。 基底バッファを消去すると間接バッファも消去されますが、 間接バッファを消去しても基底バッファには影響しません。

間接バッファの使い方の1つは、アウトラインを複数の視点で表示することです。 See Outline Views


Node:Windows, Next:, Previous:Buffers, Up:Top

複数のウィンドウ

Emacsは、フレームを2つ以上のウィンドウに分割できます。 複数のウィンドウは、異なるバッファの一部分、あるいは、 1つのバッファの異なる部分を表示することができます。 複数フレームはつねに複数ウィンドウを意味します。 というのは、各フレームはそれ独自のウィンドウの集合を持つからです。 各ウィンドウはたった1つのフレームだけに属します。


Node:Basic Window, Next:, Up:Windows

Emacsウィンドウの概念

各Emacsウィンドウは、いつでも1つのEmacsバッファを表示します。 1つのバッファは複数のウィンドウに表示できます。 その場合、そのテキストの変更は、そのバッファを表示している すべてのウィンドウで表示されます。 しかし、同じバッファを表示している各ウィンドウでは バッファの異なる部分を表示することができます。 なぜなら、各ウィンドウはそれ自身のポイント値を持つからです。

どんなときでも、1つのウィンドウだけが選択されたウィンドウです。 そのウィンドウに表示されているバッファがカレントバッファです。 端末のカーソルは、そのウィンドウのポイント位置を示します。 別の各ウィンドウにもそれぞれ同じようにポイント位置がありますが、 端末にはカーソルは1つしかないので、 それらの位置を示す方法がありません。 Xウィンドウシステムで複数フレームを表示しているときには、 各フレームには、そのフレームで選択されたウィンドウにカーソルがあります。 選択されているフレームのカーソルは塗り潰されている矩形で、 それ以外のフレームのカーソルは中空の矩形です。

ポイントを移動するコマンドは、選択されているEmacsウィンドウのポイント 値に対してだけ影響します。 たとえ同じバッファを表示しているとしても、 他のEmacsウィンドウのポイント値は変更しません。 選択しているウィンドウで選択しているバッファを変更する C-x bといったコマンドでも同様です。 他のウィンドウには少しも影響しません。 しかし、別のウィンドウを選択してそのバッファを切り替える C-x 4 bのようなコマンドもあります。 さらに、(たとえば)C-h fdescribe-function)や C-x C-blist-buffers)などを含む ウィンドウに情報を表示するコマンドは、 選択されているウィンドウに影響することなく、 選択されていないウィンドウのバッファを切り替えます。

複数のウィンドウが同じバッファを表示するとき、 異なるリージョンを持つことができます。 というのは、各ウィンドウは、それぞれ異なるポイント値を持てるからです。 しかしながら、各バッファにはたった1つのマーク位置しかないため、 マークの値はすべて同じになります。

各ウィンドウにはそれ専用のモード行があり、 そこにはウィンドウに表示しているバッファの名前、修正状態、 バッファのメジャーモード、バッファのマイナモードを表示します。 モード行に関して詳しくは、See Mode Line


Node:Split Window, Next:, Previous:Basic Window, Up:Windows

ウィンドウの分割

C-x 2
選択されているウィンドウを上下2つに分割する。 (split-window-vertically)。
C-x 3
選択されているウィンドウを左右2つに分割する (split-window-horizontally)。
C-Mouse-2
ウィンドウのモード行やスクロールバー上の位置で、 そのウィンドウを分割する。

コマンドC-x 2split-window-vertically)は、 選択されているウィンドウを上下2つのウィンドウに分割します。 どちらのウィンドウも同じポイント値、同じバッファを表示するところから 始まります。 デフォルトでは2つのウィンドウは、 それぞれ、分割されるウィンドウの半分の高さになります。 数引数は上のウィンドウの行数を指定します。

C-x 3split-window-horizontally)は、 選択されているウィンドウを左右2つのウィンドウに分割します。 数引数は左側のウィンドウの桁数を指定します。 2つのウィンドウはスクロールバーで分けられます。 画面幅に満たないウィンドウのモード行は、切り詰められます。 Emacsが強調表示を扱えない端末では、 切り詰めたモード行が反転表示されない場合があります。

モード行やスクロールバーでC-Mouse-2をクリックすることで、 ウィンドウを左右や上下に分割できます。 分割する線はクリックした位置を通ります。 モード行でクリックすると、新しいスクロールバーはクリックした点上を通ります。 スクロールバーでクリックすると、 分割したウィンドウのモード行はクリックした位置に並びます。

ウィンドウの幅が十分でないと、長すぎて行に入りきらないテキスト行が 多くなります。 これらの行すべてを継続すると混乱してしまうかもしれません。 変数truncate-partial-width-windowsnil以外を設定すると、 画面幅に満たないすべてのウィンドウで切り詰めを強制できます。 これは、表示されているバッファやtruncate-linesの値とは独立しています。 See Continuation Lines

水平スクロールは左右に並べたウィンドウでよく使われます。 See Display

split-window-keep-pointの値がnil以外(デフォルト)ならば、 C-x 2で分割した2つのウィンドウは、 分割前のウィンドウのポイント値を継承します。 つまり、スクロールを避けられません。 この変数がnilならば、 C-x 2は、画面上のテキストが移動しないように、 各ウィンドウで見えている部分にポイントを移動しようと試みます。 また、分割前にカーソルがあった行を表示しているウィンドウを選択します。 遅い端末では後者の動作を好むユーザーもいます。


Node:Other Window, Next:, Previous:Split Window, Up:Windows

別のウィンドウの使い方

C-x o
別のウィンドウを選択する(other-window)。 (小文字の)oであってゼロではない。
C-M-v
つぎのウィンドウをスクロールする(scroll-other-window)。
M-x compare-windows
選択されているウィンドウのテキストとつぎのウィンドウのテキストで 一致していないつぎの箇所を探す。
Mouse-1
ウィンドウのモード行でMouse-1をクリックすると、 そのウィンドウを選択するがポイントは移動しない(mouse-select-window)。

別のウィンドウを選択するには、そのモード行でMouse-1をクリックします。 キーボードからは、C-x oother-window)で ウィンドウを切り替えられます。 これは「other」のoであってゼロではありません。 2つ以上のウィンドウがあるときは、このコマンドはすべてのウィンドウを、 一般的には、上から下へ、左から右へ巡回します。 もっとも右下のウィンドウのつぎは、左上隅にあるウィンドウに戻ります。 数引数は、ウィンドウを巡回する回数を意味します。 負の引数では逆順に巡回します。 ミニバッファを使っているときには、 ミニバッファが巡回の最後のウィンドウになります。 ミニバッファウィンドウから別のウィンドウに切り替えて、 あとで戻ってきて、ミニバッファ引数が要求しているものを与えてから終了できます。 See Minibuffer Edit

通常のスクロールコマンド(see Display)は、 選択されているウィンドウのみに作用しますが、 つぎのウィンドウをスクロールするコマンドが1つあります。 C-M-vscroll-other-window)は、 C-x oが選択するウィンドウをスクロールします。 C-vのように正負の引数を取ります。 (ミニバッファでは、ミニバッファヘルプがあると、 標準の巡回順でつぎのウィンドウではなくて、 ミニバッファヘルプを表示しているウィンドウをスクロールする。)

コマンドM-x compare-windowsは、 2つのウィンドウで見えている2つのファイル、つまり、バッファを比較して、 一致しないつぎの箇所へ移動します。 詳細は、See Comparing Files


Node:Pop Up Window, Next:, Previous:Other Window, Up:Windows

別のウィンドウに表示する

C-x 4は、(ウィンドウが1つだけならば分割して) 別のウィンドウを選択して、そのウィンドウでバッファを選択するコマンドの プレフィックスキーです。 異なるC-x 4コマンドは、異なる方法で選択するバッファを探します。

C-x 4 b bufname <RET>
別のウィンドウでバッファbufnameを選択する。 このコマンドは、switch-to-buffer-other-windowを実行する。
C-x 4 C-o bufname <RET>
別のウィンドウでバッファbufnameを表示するが、 そのウィンドウもそのバッファも選択しない。 このコマンドは、display-bufferを実行する。
C-x 4 f filename <RET>
ファイルfilenameを訪問して、 別のウィンドウでそのバッファを選択する。 このコマンドは、find-file-other-windowを実行する。 see Visiting
C-x 4 d directory <RET>
別のウィンドウでディレクトリdirectoryに対する diredバッファを選択する。 このコマンドは、dired-other-windowを実行する。 see Dired
C-x 4 m
別のウィンドウでメイルメッセージを作成し始める。 このコマンドは、mail-other-windowを実行する。 これは、同じウィンドウを使うC-x mに類似したもの。 (see Sending Mail)。
C-x 4 .
別のウィンドウで現在のタグテーブルのタグを探す。 このコマンドは、find-tag-other-windowを実行するが、 M-.の複数ウィンドウ向けの変種 (see Tags)。
C-x 4 r filename <RET>
ファイルfilenameを読み出し専用で訪問し、 別のウィンドウでそのバッファを選択する。 このコマンドは find-file-read-only-other-windowを実行する。 see Visiting


Node:Force Same Window, Next:, Previous:Pop Up Window, Up:Windows

同じウィンドウへの強制表示

ある種のEmacsコマンドは、特別な内容を持つ特有のバッファに切り替えます。 たとえば、 M-x shellは、*Shell*という名前のバッファに切り替えます。 慣習では、これらのすべてのコマンドは、 別のウィンドウにバッファを立ち上げるようにプログラムされています。 しかし、これらのバッファのいくつかを選択されている ウィンドウに表示するように指定できます。

バッファ名をリストsame-window-buffer-namesに追加すると、 そういったコマンドは、選択されているウィンドウで特定のバッファに切り替えます。 たとえば、そのリストに要素"*grep*"を追加すれば、 grepコマンドは、選択されているウィンドウにその出力バッファを表示します。

same-window-buffer-namesのデフォルト値はnilではありません。 (古いEmacsパッケージが使うものも含めて) バッファ名、*info**mail**shell*を指定してあります。 このため、M-x shellが通常は選択されているウィンドウで *shell*バッファに切り替えるのです。 もしこの要素をsame-window-buffer-namesから削除すると、 M-x shellのふるまいは変わります。 かわりに別のウィンドウでバッファを立ち上げます。

これらのバッファを、より一般的に変数same-window-regexpsで指定できます。 この変数には、正規表現のリストを設定します。 そうすると、正規表現の1つに一致するバッファはどれも、 選択されているウィンドウでバッファを切り替えて表示します。 (繰り返すが、これは、普通は別のウィンドウに 表示されるバッファのみにあてはまる。) この変数のデフォルト値には、telnetバッファとrloginバッファが指定されています。

類似の機能で、独立したフレームに表示させるバッファを指定することができます。 See Special Buffer Frames


Node:Change Window, Previous:Force Same Window, Up:Windows

ウィンドウの削除と再配置

C-x 0
選択されているウィンドウを削除する(delete-window)。 このキー列の最後の文字はゼロ。
C-x 1
選択されているウィンドウを除いて、 選択されているフレームのウィンドウすべてを削除する (delete-other-windows)。
C-x 4 0
選択されているウィンドウを削除し、 その中に表示されているバッファを削除する (kill-buffer-and-window)。 このキー列の最後の文字はゼロ。
C-x ^
選択されているウィンドウの高さを大きくする(enlarge-window)。
C-x }
選択されているウィンドウの幅を広くする(enlarge-window-horizontally)。
C-x {
選択されているウィンドウの幅を狭くする(shrink-window-horizontally)。
C-x -
バッファがそんなに多くの行を必要としないならウィンドウを縮める (shrink-window-if-larger-than-buffer)。
C-x +
すべてのウィンドウを同じ高さにする(balance-windows)。
Drag-Mouse-1
ウィンドウのモード行をMouse-1で上下にドラッグして、 ウィンドウの高さを変更する。
Mouse-2
ウィンドウのモード行でMouse-2をクリックすると、 フレーム内のそのウィンドウ以外のすべてのウィンドウを削除する (mouse-delete-other-windows)。
Mouse-3
ウィンドウのモード行でMouse-3をクリックすると、 そのウィンドウを削除する (mouse-delete-window)。

ウィンドウを削除するには、C-x 0delete-window)と打ちます (これはゼロ)。 削除されたウィンドウが占めていた場所は、隣接のウィンドウに与えられます。 (ただし、ミニバッファのウィンドウを使っている場合でも、 ミニバッファのウィンドウには与えない。) ウィンドウを一度削除すると、その属性は失われます。 ウィンドウの構成情報を回復する以外にウィンドウをもとに戻す方法はありません。 ウィンドウを削除しても、そこに表示していたバッファには何の影響もありません。 バッファは存在し続け、どのウィンドウへでもC-x bで選択できます。

C-x 4 0kill-buffer-and-window)は、 C-x 0よりも強いコマンドです。 これは、カレントバッファを削除し、そこで選択されていたウィンドウを削除します。

C-x 1delete-other-windows)は、 別の意味でさらに強力です。 選択されているウィンドウ(とミニバッファ)を除いて、 すべてのウィンドウを削除します。 選択されているウィンドウは、エコー領域を除いたフレーム全体を 使うように広がります。

モード行でMouse-2をクリックしても、そのウィンドウを削除できます。 モード行でMouse-3をクリックすると、そのウィンドウを除いて、 フレーム内のすべてのウィンドウを削除します。

ウィンドウの高さを調節するもっとも簡単な方法は、マウスを使うことです。 モード行でMouse-1を押し下げてモード行を上下にドラッグすると、 ウィンドウの高さを変更できます。

上下に接しているウィンドウの分割を再調整するには、 C-x ^enlarge-window)を使います。 このコマンドは、現在選択されているウィンドウを1行だけ、あるいは、 数引数分の行数だけ大きくします。 負の引数を指定すると、選択されているウィンドウは小さくなります。 C-x }enlarge-window-horizontally)は、 選択されているウィンドウを指定された桁数分だけ広くします。 C-x {shrink-window-horizontally)は、 選択されているウィンドウを指定された桁数分だけ狭くします。

ウィンドウを大きくするとき、その場所は隣のウィンドウから取ります。 その結果、ウィンドウが小さくなりすぎるとそのウィンドウは削除され、 その場所を隣接するウィンドウに与えます。 最小の大きさは変数window-min-heightwindow-min-widthで指定します。

コマンドC-x -shrink-window-if-larger-than-buffer)は、 選択されているウィンドウの高さが、表示しているバッファのテキスト全体を 表示するために必要な高さよりも大きい場合には、 その高さを縮めます。 余った行はフレーム内の他のウィンドウに与えられます。

選択されているフレーム内のすべてのウィンドウの高さをすべて同じにするには、 C-x +balance-windows)を使えます。

ミニバッファのテキストにちょうど合うように ミニバッファウィンドウの大きさを自動的に変更する ミニバッファリサイズ(resize-minibuffer)モードについては、 See Minibuffer Edit


Node:Frames, Next:, Previous:Windows, Up:Top

フレームとXウィンドウシステム

Xウィンドウシステムで使っているときには、 1つのEmacsセッションでXのレベルで複数のウィンドウを作ることができます。 Emacsに属するXの各ウィンドウは、 Emacsのウィンドウを1つ以上含めことができるフレーム(frame)を表示します。 フレームは、最初は汎用のEmacsのウィンドウを1つ含みますが、 上下左右に小さなウィンドウに分割できます。 フレームは通常、専用のエコー領域とミニバッファを含みますが、 それらを含まないものを作ることもできます。 その場合は、別のフレームのエコー領域やミニバッファを使います。

あるフレームでの編集は、別のフレームにも影響します。 たとえば、あるフレームでキルリングにテキストを入れると、 別のフレームでヤンクできます。 あるフレームでC-x C-cでEmacsを終ると、 すべてのフレームを終了します。 1つのフレームだけを削除するなら、C-x 5 0を使います。

混乱を避けるために、Emacsが実装している細分化できるものを 『ウィンドウ』と呼び、フレームを意味するときにはこの単語を使いません。

MS-DOS用にコンパイルしたEmacsは、 ウィンドウシステムのある種の特徴をエミュレートするので、 本章で説明する機能の多くを使うことができます。 詳しくは、See MS-DOS Input


Node:Mouse Commands, Next:, Up:Frames

編集用マウスコマンド

リージョンを選択したりコピーしたりするマウスコマンドは、 xtermプログラムとほぼ互換です。 Emacsと他のXクライアントプログラムとのあいだでコピーするには、 Xのマウスコマンドと同じものを使えます。

これらのマウスコマンドでリージョンを選択して、 そのあとすぐにファンクションキー<DELETE>を打つと、 選択したリージョンを削除します。 ファンクションキー<BACKSPACE>やASCII文字<DEL>は、 これを行いません。 マウスコマンドと<DELETE>のあいだに別のキーを打ったときも、 これを行いません。

Mouse-1
クリックした位置にポイントを移動する(mouse-set-point)。 通常、左ボタン。
Drag-Mouse-1
ドラッグにより選択したテキストにリージョンを設定し、 キルリングにそれをコピーする(mouse-set-region)。 リージョンの始めと終りの両方をこのコマンド1つで指定できる。

ドラッグ中に、ウィンドウの上下からマウスが出ると、 マウスがウィンドウ内に戻ってくるまで、 ウィンドウを一定の割合でスクロールする。 こうして、画面全体に入りきらないリージョンでも選択できる。 一度にスクロールする行数は、 マウスがウィンドウの縁からどの程度離れているかに依存する。 変数mouse-scroll-min-linesには最小の行数を指定する。

Mouse-2
クリックした場所に、もっとも最近にキルしたテキストをヤンクする (mouse-yank-at-click)。 通常、中ボタン。
Mouse-3
このコマンドmouse-save-then-killは、 クリックした場所とリージョンの状態に依存して、 いくつかの機能がある。

もっとも基本的な場合は、ある場所でMouse-1をクリックしてから、 別の場所でMouse-3をクリックしたとき。 こうすると、これらの2点のあいだにあるテキストをリージョンとして選択する。 さらに、新しいリージョンをキルリングへもコピーするので、 別の場所へそれをコピーできる。

テキスト上でMouse-1をクリックしてから、 スクロールバーでスクロールしたあとでMouse-3をクリックすると、 スクロールする以前の(Mouse-1でクリックした)場所を覚えていて、 そこをリージョンの片方の端点として使う。 こうすると、画面に入りきらないリージョンでも選択できる。

より一般的には、強調表示されたリージョンがないならば、 Mouse-3は、ポイントとクリックした位置のあいだのテキストを リージョンとして選択する。 これは、ポイントがあった位置にマークを設定し、 クリックした位置にポイントを移動することで行う。

強調表示されたリージョンがある場合、あるいは、 ボタン1をドラッグしてリージョンを設定してある場合、 Mouse-3はクリックした場所に近い側のリージョンの端を クリック位置に移動して調整する。 また、調整したリージョンのテキストは、 キルリング内の古いリージョンのテキストを置き換える。

もともとMouse-1をダブルクリックあるいはトリプルクリックして、 リージョンを単語や行単位で設定した場合には、 Mouse-3によるリージョンの調整も単語や行単位で行われる。

連続して2度同じ場所でMouse-3を使うと、 すでに選択してあるリージョンをキルする。

Double-Mouse-1
このキーは、クリックした単語全体にリージョンを設定する。 『シンボル』の構文(Cの下線のような)の文字をクリックすると、 その文字を囲むシンボル全体にリージョンを設定する。

開き括弧や閉じ括弧の構文の文字をクリックすると、 その文字で始まり/終る括弧で囲まれた塊(sexp)にリージョンを設定する。 文字列区切りの構文(Cのシングルクォートやダブルクォート)の文字をクリック すると、(その文字が文字列の始まりか終りかを発見的方法を使って決めて) 文字列定数を囲むリージョンを設定する。

Double-Drag-Mouse-1
このキーは、 ドラッグした範囲内にある単語を囲むリージョンを設定する。
Triple-Mouse-1
このキーは、クリックした行全体を囲むリージョンを設定する。
Triple-Drag-Mouse-1
このキーは、ドラッグした範囲内にある行すべてを囲むリージョンを設定する。

マウスを使ったもっとも単純なテキストのキル方法は、 片方の端でMouse-1を押し、もう一方の端でMouse-3を2回押すことです。 See Killing。 バッファから削除しないでキルリングにテキストをコピーするには、 Mouse-3を一度だけ押します。 あるいは、Mouse-1でテキストを横断してドラッグするだけです。 そうすると、どこででも、それをヤンクすることでコピーできます。

キルしたりコピーしたりしたテキストをどこか別の場所にヤンクするには、 マウスをその場所に移動してMouse-2を押します。 See Yanking。 しかし、mouse-yank-at-pointnil以外ならば、 Mouse-2はポイント位置にヤンクします。 つまり、ウィンドウのどこをクリックしたのか、あるいは、 フレームのどのウィンドウをクリックしたのかは問題ではありません。 デフォルトの値はnilです。 この変数は二次セレクションのヤンクにも影響します。

別のXのウィンドウへテキストをコピーするには、 その部分をキルするかキルリングに保存します。 Xの管理下では、一次セレクションも設定します。 そのあとで、別のXのウィンドウで動いているプログラムの『ペースト』や 『ヤンク』コマンドを使って、セレクションからテキストを挿入します。

別のXのウィンドウからテキストをコピーするには、 そのウィンドウで動いているプログラムの『カット』や『コピー』コマンドを 使って目的のテキストをセレクションにします。 そのあとで、C-yMouse-2を使ってEmacsにヤンクします。

これらのカット/ペーストコマンドはMS-Windows上でも動作します。

Emacsがテキストをキルリングに入れたり、 キルリングのテキストを先頭へ巡回するとき、 EmacsはXサーバーの一次セレクションに設定します。 このために、別のXクライアントがテキストを参照できるのです。 テキストが十分に短い場合にのみ (x-cut-buffer-maxは最大文字数を指定する)、 Emacsはカットバッファにもテキストを収めます。 長い文字列をカットバッファへ置くには時間がかかります。

キルリングの始めのテキストをヤンクするコマンドは、 実際には、別のプログラムの一次セレクションをまず調べ、 そのあとで、カットバッファのテキストを調べます。 どちらにもヤンクするテキストがなれば、キルリングの内容を使います。


Node:Secondary Selection, Next:, Previous:Mouse Commands, Up:Frames

二次セレクション

二次セレクションは、Xにおいてテキストを選択する別の方法です。 これは、ポイントやマークを使わないので、 ポイントやマークを設定せずにテキストを削除するのに使えます。

M-Drag-Mouse-1
ボタンを押した場所を片方の端、ボタンを離した場所をもう一方の端として、 二次セレクションを設定する(mouse-set-secondary)。 強調表示されドラッグするにつれて変化する。

ドラッグ中にウィンドウの上下からマウスが出ると、 ウィンドウへマウスが戻ってくるまで、 ウィンドウを一定の割合でスクロールする。 こうして、画面全体に入りきらないリージョンも選択できる。

M-Mouse-1
二次セレクションの一方の端を設定する (mouse-start-secondary)。
M-Mouse-3
M-Mouse-1で指定した場所を一方の端として使い、 二次セレクションを設定する。 (mouse-secondary-save-then-kill)。 同じ位置での2回目のクリックは、 ちょうど作成した二次セレクションをキルする。
M-Mouse-2
クリックした位置に二次セレクションを挿入する (mouse-yank-secondary)。 ヤンクしたテキストの最後にポイントを置く。

M-Mouse-1のダブルクリックやトリプルクリックは、 Mouse-1のように単語や行単位に作用します。

mouse-yank-at-pointnil以外ならば、 M-Mouse-2はポイント位置にヤンクします。 そのときには、どこをクリックしたかは関係なく、 どのウィンドウをクリックしたかだけが関係します。 See Mouse Commands


Node:Mouse References, Next:, Previous:Secondary Selection, Up:Frames

マウスで参照を辿る

いくつかのEmacsバッファでは、いろいろなものの一覧を表示します。 ファイル一覧、バッファ一覧、補完候補一覧、パターンに一致したものの一覧 などです。

これらのバッファにテキストをヤンクできても便利ということはないので、 これらの多くはMouse-2を特別に定義して、 クリックした項目を使ったり眺めたりするコマンドとしています。

たとえば、diredバッファのファイル名をMouse-2でクリックすると、 そのファイルを訪問します。 *Compilation*バッファのエラーメッセージをMouse-2で クリックすると、そのエラーメッセージに対応するソースコードへ行きます。 *Completions*バッファの補完候補をMouse-2でクリックすると、 その補完候補を選択します。

反応するテキストの上にマウスが移動するとテキストが強調表示されるので、 Mouse-2がいつ特別な意味を持つか普通はわかります。


Node:Menu Mouse Clicks, Next:, Previous:Mouse References, Up:Frames

メニューを出すマウスクリック

<CTRL>や<SHIFT>キーで修飾されたマウスクリックは、 メニューを立ち上げます。

C-Mouse-1
バッファを選択するためのメニュー。
C-Mouse-2
整形済みのテキストに使うフェイスやテキスト属性を指定するためのメニュー。 see Formatted Text
C-Mouse-3
モードに特有のメニュー。 ほとんどのモードでは、このメニューは、 すべてのモード特有のメニューバーメニューを一緒にしたのと同じ項目を持つ。 いくつかのモードでは、このボタン 17 に異なるメニューを指定しているかもしれない。
S-mouse-1
フレームの主要フォントの指定に関するメニュー。


Node:Mode Line Mouse, Next:, Previous:Menu Mouse Clicks, Up:Frames

モード行のマウスコマンド

ウィンドウを選択したり操作するために、 ウィンドウのモード行でマウスクリックを使えます。

Mouse-1
モード行でMouse-1をクリックするとその上のウィンドウを選択する。 モード行をMouse-1でドラッグするとモード行を移動することができ、 そのウィンドウの高さを変更できる。
Mouse-2
モード行でMouse-2をクリックすると、 そのフレーム一杯にウィンドウを広げる。
Mouse-3
モード行でMouse-3をクリックすると、 その上のウィンドウを削除する。
C-Mouse-2
モード行でC-Mouse-2をクリックすると、 モード行をクリックした場所でその上のウィンドウを左右に分割する。

スクロールバーでC-Mouse-2をクリックすると、 対応するウィンドウを上下に分割します。 See Split Window


Node:Creating Frames, Next:, Previous:Speedbar, Up:Frames

フレームの作成

プレフィックスキーC-x 5は、 C-x 4と同じようなサブコマンドがあるという点で似ています。 違いは、C-x 5コマンドは、 選択されているフレームで新たにウィンドウを作るのではなく、 新しいフレームを作ることです(see Pop Up Window)。 既存の見えているフレームやアイコン化されたフレームが、 要求された内容を表示しているなら、これらのコマンドは、 必要ならフレームをいちばん手前にもってきたりアイコンを開いてから、 既存のフレームを使います。

さまざまなC-x 5コマンドは、 選択するバッファの探し方や作成方法が異なります。

C-x 5 2
新しいフレームを作る(make-frame-command)。
C-x 5 b bufname <RET>
別のフレームでバッファbufnameを選択する。 これは、switch-to-buffer-other-frameを実行する。
C-x 5 f filename <RET>
ファイルfilenameを訪問して、別のフレームでそのバッファを選択する。 これは、find-file-other-frameを実行する。 see Visiting
C-x 5 d directory <RET>
別のフレームでディレクトリdirectoryに対するdiredバッファを選択する。 これは、dired-other-frameを実行する。 see Dired
C-x 5 m
別のフレームでメイルメッセージの作成を始める。 これは、mail-other-frameを実行する。 これは、C-x mの他のフレームを使う変形版。 see Sending Mail
C-x 5 .
別のフレームで現在のタグテーブルからタグを探す。 これは、find-tag-other-frameを実行し、 M-.の複数フレーム向けの変形版。 see Tags
C-x 5 r filename <RET>
ファイルfilenameを読み出し専用で訪問し、 別のフレームでそのバッファを選択する。 これは、find-file-read-only-other-frameを実行する。 see Visiting

default-frame-alistにフレームパラメータを設定することで、 新たに作成するフレームの見た目を制御できます。 初期フレームだけに影響するパラメータを指定するには、 変数initial-frame-alistを使います。 詳しくは、 See Initial Parameters

すべてのEmacsフレームに主要フォントを指定するもっとも簡単な方法は、 Xのリソース(see Font X)を使うことですが、 つぎに示すように、fontパラメータを指定するように default-frame-alistを変更してもできます。

(add-to-list 'default-frame-alist '(font . "10x20"))


Node:Speedbar, Next:, Previous:Mode Line Mouse, Up:Frames

スピードバーフレームの作成と使い方

Emacsのフレームは、スピードバーを持つことができます。 スピードバーは、縦長のウィンドウで、 訪問したりタグを探したりするためのスクロール可能な ファイルメニューとして働きます。 スピードバーを作るには、M-x speedbarと打ちます。 これは、選択されたフレームに対するスピードバーウィンドウを作ります。 そうすると、スピードバーのファイル名をクリックすると、 対応するEmacsフレームでそのファイルを訪問できます。 あるいは、タグの名前をクリックすると、 Emacsフレームでそのタグの箇所へ飛んで行きます。

最初、スピードバーには、カレントディレクトリの直下の内容を 1行につき1つのファイルで表示します。 各行には、[+]<+>の箱があって、 それをMouse-2でクリックするとその項目の内容を『開け』ます。 その行の名前がディレクトリならば、それを開くと、 そのディレクトリの内容をその行の下に追加してスピードバーに表示します。 その行が普通のファイルならば、それを開くと、 そのファイル内のタグ一覧をスピードバーに追加して表示します。 ファイルが開かれていると、[+][-]に変わります。 ファイルを『閉じる』(内容を隠す)ためにその箱をクリックできます。

rmailモード、infoモード、GUDモードを含むいくつかのメジャーモードには、 選択可能な有用な項目をスピードバーに追加する特別な方法があります。 たとえば、rmailモードでは、スピードバーにはrmailファイル一覧を表示します。 カレントメッセージを別のrmailファイルに移すには、 目的のrmailファイルの<M>の箱をクリックするだけです。

スピードバーは1つのEmacsフレームに属し、つねにそのフレームに作用します。 複数のフレームを使うときには、 一部のフレームやすべてのフレームにスピードバーを作れます。 フレームのスピードバーを作るには、そのフレームでM-x speedbarと打ちます。


Node:Multiple Displays, Next:, Previous:Creating Frames, Up:Frames

複数ディスプレイ

1つのEmacsは、複数のXディスプレイと通信できます。 最初は、Emacsは1つのディスプレイだけを使います。 環境変数DISPLAY--displayオプションに指定されたものです (see Initial Options)。 他のディスプレイに接続するには、 コマンドmake-frame-on-displayを使います。

M-x make-frame-on-display <RET> display <RET>
ディスプレイdisplay上に新しいフレームを作成する。

1つのXサーバーは複数のスクリーンを扱えます。 1つのサーバーに属する2つのスクリーンにフレームを開くとき、 Emacsは1つのキーボードを共有していることを知っていて、 これらのスクリーンから到着するすべてのコマンドを1つの 入力ストリームとして扱います。

異なるXサーバー上にフレームを開くとき、 Emacsはそれぞれのサーバーに対して別々の入力ストリームを作ります。 こうすることで、2つのディスプレイ上で2人のユーザーが同時に打鍵でき、 Emacsはそれらの入力をごっちゃにすることはありません。 各サーバーにはそれ自身が選択しているフレームがあります。 特定のXサーバーで入力したコマンドは、 そのサーバーが選択しているフレームに適用されます。

これらの機能にも関わらず、異なるディスプレイで同じEmacsジョブを 使っている人達は、注意を怠ると、互いに干渉し合ってしまいます。 たとえば、誰かがC-x C-cと打つと、 その人達が共有している(1つの)Emacsジョブは終了してしまいます!


Node:Special Buffer Frames, Next:, Previous:Multiple Displays, Up:Frames

特別なバッファフレーム

ウィンドウが1つのときにはEmacsが普通2つめのウィンドウを作るような 特定のバッファでは、それ専用の特別なフレームに表示することができます。 こうするには、変数special-display-buffer-namesに バッファ名のリストを設定します。 そのリストに名前があるどのバッファも、 Emacsコマンドが『別のウィンドウに』表示したいときには、 特別なフレームを自動的に取得します。

たとえば、つぎのように変数を設定したとすると、 補完一覧、grepの出力、TeXモードのシェルバッファは、 それぞれ個別のフレームを取得します。

(setq special-display-buffer-names
      '("*Completions*" "*grep*" "*tex-shell*"))

これらのフレームとその中のウィンドウは、 別のバッファのために自動的に分割されたり再利用されることはありません。 手動で変更するまで、そのために作成されたバッファを表示し続けます。 特別なバッファを消去すると、そのフレームも自動的に削除されます。

より一般的には、正規表現のリストをspecial-display-regexpsに 設定できます。 すると、バッファの名前がそれらの正規表現に一致すると、 バッファは専用のフレームを取得します。 (繰り返すが、これは通常、別のウィンドウに表示するバッファにのみ適用する。)

変数special-display-frame-alistは、 このようなフレームに対するフレームパラメータを指定します。 これにはデフォルト値があるので、特に設定する必要はありません。

Lispがわかる人のためにですが、 special-display-buffer-namesspecial-display-regexpsの要素は、 リストでもかまいません。 その場合、最初の要素はバッファ名か正規表現です。 リストの残りは、フレームの作成方法を指定します。 これは、フレームパラメータの値を指定する連想リストにすることもできます。 これらの値は、special-display-frame-alistに 指定されたパラメータの値より優先されます。 あるいは、リストはつぎのような形式にすることもできます。

(function args...)

ここで、functionはシンボルです。 こうすると、functionを呼んでフレームを作ります。 関数呼び出しの最初の引数はバッファで、残りの引数はargsです。

似たような機能で、バッファをどの選択されているウィンドウに表示するか 指定できます。 See Force Same Window。 同じウィンドウに表示する機能は、特別なフレームに表示する機能に優ります。 したがって、バッファ名をspecial-display-buffer-namesに追加しても 何の効果もなかったら、 その機能が同じバッファ名に対しても使われていないか調べてください。


Node:Frame Parameters, Next:, Previous:Special Buffer Frames, Up:Frames

フレームパラメータの設定

本節では、選択しているフレームの表示スタイルやウィンドウ管理のふるまいを 変更するコマンドを説明します。

M-x set-foreground-color <RET> color <RET>
選択しているフレームの前景色をcolorと指定する。
M-x set-background-color <RET> color <RET>
選択しているフレームの背景色をcolorと指定する。 これはmodelineフェイスの前景色も変更するので、 デフォルトと比較しても反転表示のままになる。
M-x set-cursor-color <RET> color <RET>
選択しているフレームのカーソルの表示色をcolorと指定する。
M-x set-mouse-color <RET> color <RET>
マウスカーソルが選択しているフレーム内にあるときの マウスカーソルの表示色をcolorと指定する。
M-x set-border-color <RET> color <RET>
選択しているフレームの境界色をcolorと指定する。
M-x list-colors-display
定義されている表示色の名称とそれがどう見えるか表示する。 このコマンドは少し遅い。
M-x auto-raise-mode
選択されているフレームをオートレイズするべきかどうか切り替える。 オートレイズとは、マウスカーソルがフレームに入るたびに、 そのフレームを手前にもってくること。

このオートレイズ機能はEmacs自身が実装していることに注意。 ウィンドウマネージャの中にも、オートレイズを実装しているものがある。 XのウィンドウマネージャでEmacsフレームのオートレイズを指定しているときには、 それが動作するはず。 しかし、それはEmacsの制御を超えているので、それに関しては auto-raise-modeは何の影響もない。

M-x auto-lower-mode
選択されているフレームをオートローワするべきかどうか切り替える。 オートローワとは、マウスカーソルがフレームから出るたびに、 そのフレームをXのウィンドウスタックの底に移すこと。

コマンドauto-lower-modeは、 Xのウィンドウマネージャが実装するオートローワには何の影響もない。 それを制御するには、適切なウィンドウマネージャの機能を使う必要がある。

M-x set-frame-font <RET> font <RET>
選択されたフレームに対する主要フォントとしてfontを指定する。 フェイス(see Faces)が別のフォントを使うことを指定しているときを 除いて、主要フォントは、フレームに表示するすべてのテキストに対して使われる。 あなたのシステムで使えるフォント一覧を表示する方法については、 see Font X

ポップアップメニューから、フレームの主要フォントを設定することもできる。 このメニューを立ち上げるにはS-Mouse-1を押す。

Xツールキットを使うEmacsの版では、表示色とフォントを設定する関数は メニューやメニューバーには影響しません。 というのは、メニューやメニューバーは、 それら自身のウィジェットクラスを使って表示されているからです。 メニューとメニューバーの見た目を変更するには、 Xのリソースを使う必要があります(see Resources X)。 表示色に関しては、See Colors X。 フォントの選択については、See Font X

フレームパラメータとそのカスタマイズについては、 See Frame Parameters


Node:Scroll Bars, Next:, Previous:Frame Parameters, Up:Frames

スクロールバー

Xを使っているときには、Emacsは通常、各Emacsウィンドウの左側に スクロールバー(scroll bar)を作ります。 スクロールバーは、ウィンドウの高さに延びていて、 内側に動く矩形の箱を表示します。 この箱は、現在表示されているバッファ内の部分を表しています。 スクロールバーの全体の高さは、バッファの全体の長さを表します。

Mouse-2(通常、中ボタン)を使って、 スクロールバーの内側の箱を上下に移動したりドラッグできます。 内側の箱をスクロールバーのいちばん上へ移動すると、 バッファの先頭を見ることができます。 スクロールバーのいちばん下に内側の箱を移動すると、バッファの末尾が見えます。

スクロールバーで左や右ボタンを使うと、制御された増分でスクロールできます。 Mouse-1(通常、左ボタン)は、 クリックした場所の高さの行をウィンドウの最上端の行へ移動します。 Mouse-3(通常、右ボタン)は、 ウィンドウの最上端の行をクリックした場所の高さの行へ移動します。 同じ位置で繰り返しクリックすると、 同じ分量のスクロールを繰り返します。

スクロール以外では、スクロールバーでC-Mouse-2をクリックすると、 ウィンドウを上下に分割できます。 クリックした場所の行で分割されます。

コマンドM-x scroll-bar-modeで、 スクロールバー(scroll-bar)モードをオン/オフできます。 引数を指定しなければ、スクロールバーの使用をトグルします。 引数を指定した場合、引数が正のときだけスクロールバーを使うようにします。 このコマンドは、これから作成されるフレームを含めてすべての フレームに作用します。 XのリソースverticalScrollBarsを使って、 スクロールバー(scroll-bar)モードの初期設定を制御できます。 See Resources X

選択されているフレームに対してのみスクロールバーをオン/オフするには、 M-x toggle-scroll-barコマンドを使います。


Node:Menu Bars, Next:, Previous:Scroll Bars, Up:Frames

メニューバー

M-x menu-bar-modeでメニューバーの表示をオン/オフできます。 引数を指定しないと、このコマンドはマイナモードである メニューバー(menu-bar)モードをトグルします。 引数を指定した場合、引数が正ならメニューバー(menu-bar)モードをオンにし、 引数が正でないならオフにします。 XのリソースmenuBarLinesを使って、 メニューバー(menu-bar)モードの初期設定を制御できます。 See Resources X。 熟練したユーザーは、メニューバーをしばしばオフにし、 特に文字端末上ではそうします。 というのは、テキスト表示に1行余分に使えるからです。

メニューバーでコマンドを起動する方法については、See Menu Bar


Node:Faces, Next:, Previous:Menu Bars, Up:Frames

複数タイプフェイスの利用

XでEmacsを使っているとき、文字表示に複数のスタイルを設定できます。 制御できるスタイルは、フォントの種類、前景色、背景色、下線を引くかどうかです。 MS-DOS用Emacsは、各フェイスの前景色と背景色を制御して、 フェイスの一部だけを扱えます(see MS-DOS)。

表示スタイルを制御する方法は、名前付きフェイスを定義することです。 各フェイスでは、フォントの種類、前景色、背景色、下線フラグを指定できます。 しかし、これらすべてを指定する必要はありません。 バッファ内のテキストの一部分に対して使用するフェイスを指定することで、 そのテキストの見た目を制御できます。

テキスト中のある文字に対して使う表示スタイルは、 いくつかのフェイスを組み合わせて決定されます。 重ね合わせやテキスト属性で指定されていない表示スタイルは、 フレームそのものから得ます。

整形済みテキストを編集するモードであるエンリッチ(enriched)モードには、 フェイスを指定するためのコマンドやメニューがあります。 バッファ内のテキストに対するフォントの指定方法については、See Format Faces。 前景色と背景色の指定方法については、See Format Colors

フェイスの見た目を変更するには、カスタマイズバッファを使います See Face Customization。 Xのリソースを使って、特定のフェイスの属性を指定できます (see Resources X)。

現在定義されているフェイスとその見た目を調べるには、 M-x list-faces-displayと打ちます。 あるフェイスを違うフレームでは違って見えるようにできます。 このコマンドは、コマンドを打ったフレーム上での見た目を表示します。 つぎは、標準的に定義されているフェイス一覧です。

default
このフェイスは、他のフェイスを指定していない普通のテキストに使われる。
modeline
このフェイスはモード行に対して使われる。 デフォルトでは、defaultフェイスの反転表示を設定。 see Display Vars
highlight
このフェイスは、さまざまモードでのテキストの強調表示部分に対して使われる。
region
このフェイスは、選択されているリージョン (暫定マーク(transient-mark)モードがオンのとき。下記参照) の表示に使われる。
secondary-selection
このフェイスは、二次セレクションの表示に使われる (see Secondary Selection)。
bold
このフェイスは、ボールド体(太字体)があるならば、 ボールド体を用いたデフォルトフォントの変種。
italic
このフェイスは、イタリック体(斜体)があるならば、 イタリック体を用いたデフォルトフォントの変種。
bold-italic
このフェイスは、ボールドイタリック体(太字斜体)があるならば、 ボールドイタリック体を用いたデフォルトフォントの変種。
underline
このフェイスは、テキストに下線を引く。

暫定マーク(transient-mark)モードがオンのときは、 マークが活性ならば、リージョンのテキストは強調表示されます。 これにはregionという名前のフェイスを使います。 このフェイスのスタイルを変更することで、 強調表示のスタイルを制御できます(see Face Customization)。 暫定マーク(transient-mark)とマークの活性/不活性について詳しくは、 See Transient Mark

フェイスを使う簡単な方法の1つは、 フォントロック(font-lock)モードを使うことです。 特定のバッファにつねにローカルであるこのマイナモードは、 編集するテキストの構文に従ってフェイスを選択します。 このモードは、ほとんどの言語のコメントと文字列を認識できます。 いくつかの言語では、それ以外のさまざまな重要な構造も認識して、 適切に強調表示します。 フォントロック(font-lock)モードと構文の強調表示について詳しくは、 See Font Lock

画面上で強調表示されたバッファは、 コマンドps-print-buffer-with-facesを使って印刷できます。 See Postscript


Node:Font Lock, Next:, Previous:Faces, Up:Frames

フォントロックモード

フォントロック(font-lock)モードはマイナモードです。 特定のバッファにつねにローカルであり、 編集しているテキストの構文に従ってさまざまなフェイスを 使って強調表示(または『フォント表示化』)します。 このモードは、ほとんどの言語のコメントや文字列を認識できます。 いくつかの言語では、他のさまざまな重要な構成要素も認識し、 正しく強調表示します。 たとえば、定義されている関数名や予約語です。

コマンドM-x font-lock-modeは、 引数に従ってフォントロック(font-lock)モードをオン/オフし、 引数がなければモードをトグルします。 関数turn-on-font-lockは、 フォントロック(font-lock)モードを無条件でオンにします。 このコマンドは、モードフック関数で使うと便利です。 たとえば、Cのファイルを編集しているときにはいつでも フォントロック(font-lock)モードをオンにするには、 つぎのようにします。

(add-hook 'c-mode-hook 'turn-on-font-lock)

フォントロック(font-lock)モードを扱える すべての(メジャー)モードで自動的にフォントロック(font-lock)モードを オンにするには、 関数global-font-lock-modeをつぎのように使います。

(global-font-lock-mode 1)

フォントロック(font-lock)モードでは、 テキストを編集していると、自動的に変更した行の強調表示を更新します。 ほとんどの変更は、後続行の強調表示には影響しませんが、 時折、影響することもあります。 ある範囲の行を強調表示し直すには、コマンドM-g M-gを使います (font-lock-fontify-block)。

ある種のメジャーモードでは、M-g M-gは、 現在の関数定義全体をフォント表示化し直します。 (変数font-lock-mark-block-functionは、 現在の関数定義の探し方を制御する。) 別のメジャーモードでは、 M-g M-gは、 ポイントのまえとあとの16行をフォント表示化し直します。

数引数nを指定すると、M-g M-gは、 モードに関係なく、 ポイントのまえとあとのn行をフォント表示化し直します。

フォントロック(font-lock)モードの利点を十分に活用するには、 ボールド体、イタリック体、ボールドイタリック体のデフォルトフォントを 選ぶ必要があります。 あるいは、カラーやグレースケールの画面が必要です。

変数font-lock-maximum-decorationは、 複数のレベルを提供するモードでのフォント表示化の好ましいレベルを指定します。 レベル1は最低限のフォント表示化です。 いくつかのモードでは、もっとも高い3のレベルまであります。 通常デフォルトは『可能な限り大きい数』です。 すべてのモードに適用する整数を指定できます。 あるいは、特定のメジャーモードに対して異なる数を指定できます。 たとえば、C/C++モードではレベル1を、 それ以外ではデフォルトのレベルを指定するには、つぎのようにします。

(setq font-lock-maximum-decoration
      '((c-mode . 1) (c++-mode . 1)))

フォント表示化は、大きなバッファに対してはとても遅くなりえますから、 抑制することもできます。 変数font-lock-maximum-sizeにバッファサイズを指定すると、 その値を越えるバッファについてはフォント表示化を抑制します。

コメントと文字列のフォント表示化(あるいは、『構文の』フォント表示化)は、 バッファのテキストの構文解析に頼っています。 速度向上のために、CモードやLispモードを含むいくつかのモードでは、 特別な習慣に頼っています。 最左桁にある開き括弧は、つねに関数定義の開始を表し、 そのため、つねに文字列やコメントの外側だということです。 (see Defuns。) この習慣に従わないと、フォントロック(font-lock)モードは、 文字列やコメントの内側にある最左桁の開き括弧のうしろでは、 違ったフォント表示化をすることもありえます。

変数font-lock-beginning-of-syntax-function (つねにバッファにローカル)は、フォントロック(font-lock)モードが、 コメントや文字列の外側であることが保証される位置を どのように探すかを指定します。 最左桁の括弧の習慣を使うモードでは、 変数のデフォルト値は、beginning-of-defunです。 つまり、フォントロック(font-lock)モードは 習慣を使うようにということです。 この変数にnilを設定すると、 フォントロック(font-lock)モードは、もはや習慣に頼りません。 これでまちがった結果を避けられますが、その代償は、 変更したテキストをフォント表示化するには、 バッファのテキストをバッファの先頭から再走査する必要がある場合もあります。

多くのモードに対するフォントロックの強調表示パターンはすでにありますが、 フォント表示化するパターンを追加したいこともあるでしょう。 関数font-lock-add-keywordsを使って、 特定のモードに対する個人用の強調表示パターンを追加できます。 たとえば、Cのコメントで単語FIXME:を強調表示するには、 つぎのように使います。

(font-lock-add-keywords
 'c-mode
 '(("\\<\\(FIXME\\):" 1 font-lock-warning-face t)))


Node:Support Modes, Next:, Previous:Font Lock, Up:Frames

フォントロックのモード

フォントロックには、大きなバッファに対して フォントロック(font-lock)モードを高速に動作させるモードがあります。 高速ロック(fast-lock)モードと遅延ロック(lazy-lock)モードです。 これらは、フォントロック(font-lock)モードの速度を向上するために 2つの異なる方法を使います。


Node:Fast Lock Mode, Next:, Up:Support Modes

高速ロックモード

大きなファイルを訪問したバッファに対して フォントロック(font-lock)モードを速くするには、 高速ロック(fast-lock)モードを使えます。 高速ロック(fast-lock)モードは、 各ファイルに対するフォント情報を 別のキャッシュファイル(cache file)に保存します。 ファイルを訪問するたびに、最初からテキストをフォント表示化し直すかわりに、 キャッシュファイルからフォント情報を読み直します。

コマンドM-x fast-lock-modeは、 引数に従って高速ロック(fast-lock)モードをオン/オフします (引数がないければトグル)。 フォントロック(font-lock)モードを使うときに、 いつでも高速ロック(fast-lock)モードをオンにするには、 つぎのようにします。

(setq font-lock-support-mode 'fast-lock-mode)

小さなバッファに対しては、キャッシュファイルを書く価値がありません。 それゆえ、変数fast-lock-minimum-sizeは、 フォント情報をキャッシュする最小のファイルサイズを指定します。

変数fast-lock-cache-directoriesは、 キャッシュファイルをどこに置くかを指定します。 その値は、ディレクトリ群のリストです。 "."は、編集しているファイルと同じディレクトリを表します。 デフォルト値は、("." "~/.emacs-flc")で、 可能ならば同じディレクトリを使い、 さもなければディレクトリ~/.emacs-flcを使うという意味です。

変数fast-lock-save-othersは、 あなたが所持していないファイルに対するキャッシュファイルを 高速ロック(fast-lock)モードが保存すべきかどうかを指定します。 値がnil以外ならば保存します(これがデフォルト)。


Node:Lazy Lock Mode, Next:, Previous:Fast Lock Mode, Up:Support Modes

遅延ロックモード

大きなバッファに対してフォントロック(font-lock)モードを速くするには、 フォント表示化するテキストの量を減らす 遅延ロック(lazy-lock)モードを使えます。 遅延ロック(lazy-lock)モードでは、バッファのフォント表示化は要求駆動型です。 表示されようとしているバッファの部分だけをフォント表示化します。 また、変更部分のフォント表示化は延期され、 Emacsがある短い時間アイドルであったときにのみフォント表示化します。

コマンドM-x lazy-lock-modeは、 遅延ロック(lazy-lock)モードを引数に従ってオン/オフします (引数がなければトグル)。 フォントロック(font-lock)モードを使うときに、 いつでも遅延ロック(lazy-lock)モードをオンにするには、 つぎのようにします。

(setq font-lock-support-mode 'lazy-lock-mode)

小さなバッファに対してバッファのフォント表示化を避ける価値はありません。 ですから、変数lazy-lock-minimum-sizeは、 要求駆動型でバッファのフォント表示化を行う最小のバッファサイズを指定します。 これより小さなバッファは、普通のフォントロック(font-lock)モードのように 一度にフォント表示化します。

バッファを変更したとき、遅延ロック(lazy-lock)モードは 変更したテキストのフォント表示化を延期します。 変数lazy-lock-defer-timeは、 変更部分のフォント表示化を始めるまでに Emacsがアイドルであるべき秒数です。 この値が0ならは、普通のフォントロック(font-lock)モードと同じように、 変更はすぐにフォント表示化されます。

遅延ロック(lazy-lock)モードは、通常、 新たに見えてくるバッファ部分が初めて表示されるまえに その部分をフォント表示化します。 しかし、lazy-lock-defer-on-scrollingの値がnil以外ならば、 新たに見えてくるテキストは、Emacsがlazy-lock-defer-time秒だけ アイドルしたときにのみフォント表示化されます。

CやEmacs Lispモードを含むいくつかのモードでは、 ある1行の内容を変更すると後続行の文脈が変わり、 そのため、後続行をどうフォント表示化するかも変わります。 通常は、後続行を再フォント表示化するためにM-g M-gを打つ必要があります。 しかし、変数lazy-lock-defer-contextuallynil以外を設定していると、遅延ロック(lazy-lock)モードでは、 lazy-lock-defer-time秒後にこれを自動的に行います。

Emacsが長時間アイドルだと、遅延ロックは、 バッファのまだ表示されていない部分を、 のちの表示に備えてフォント表示化します。 これを内密のフォント表示化(stealth fontification)と呼びます。

変数lazy-lock-stealth-timeは、内密のフォント表示化を開始するまでに、 Emacsが何秒間アイドルであるべきかを指定します。 値がnilだと、内密のフォント表示化をしません。 変数lazy-lock-stealth-lineslazy-lock-stealth-verboseは、 内密のフォント表示化の粒度と冗長性を指定します。


Node:Fast or Lazy, Previous:Lazy Lock Mode, Up:Support Modes

高速ロックか遅延ロックか?

フォントロックで使えるモードの1つを選択する目安となる簡単な指針をあげます。

変数font-lock-support-modeは、 これらのどちらのモードを使うかを指定します。 たとえば、C/C++モードでは高速ロック(fast-lock)モードを使い、 それ以外のモードでは遅延ロック(lazy-lock)モードを使うように指定するには、 変数をつぎのように設定します。

(setq font-lock-support-mode
      '((c-mode . fast-lock-mode) (c++-mode . fast-lock-mode)
        (t . lazy-lock-mode)))


Node:Highlight Changes, Next:, Previous:Support Modes, Up:Frames

変更部分強調表示モード

バッファ内の最近に変更された部分を示すためにフェイス(典型的には表示色)を 用いるマイナモードをオンにするには、 M-x highlight-changes-modeを使います。


Node:Misc X, Next:, Previous:Highlight Changes, Up:Frames

その他のXウィンドウシステムでの機能

つぎのコマンドは、フレームを作成したり削除したり操作したりします。

C-z
選択されているEmacsフレームをアイコン化する (iconify-or-deiconify-frame)。 Emacsを休止するというC-zの通常の意味は、 ウィンドウシステムでは有用ではない。 そのため、別のバインドになっている。

Emacsフレームのアイコンでこのコマンドを打つと、 アイコンをフレームに開く。

C-x 5 0
選択されているフレームを削除する(delete-frame)。 フレームがたった1つの場合には、このコマンドは許されない。
C-x 5 o
別のフレームを選択し、それをいちばん手前にもってきて、 そのフレームが選択されるようにマウスを飛び込ませる。 このコマンドを繰り返すと、端末上のすべてのフレームを巡回する。


Node:Non-Window Terminals, Previous:Misc X, Up:Frames

非ウィンドウ端末

Emacsが扱えるウィンドウシステムを使えない端末では、 一度に1つのフレームしか表示できません。 しかし、複数のEmacsフレームを作って、それらのフレーム間を切り替えられます。 このような端末でのフレームの切り替えは、 異なるウィンドウ構成の端末での切り替えとたいへんよく似ています。

新しいフレームを作りそれに切り替えるには、C-x 5 2を使います。 既存のフレーム間を巡回するには、C-x 5 oを使います。 カレントフレームを削除するには、C-x 5 0を使います。

各フレームにはそれを区別する番号があります。 一度には1つのフレームだけしか表示できない端末では、 選択されているフレームの番号nが、 モード行の先頭近くにFnという形式で現れます。

Fnは、実際にはフレームの名前です。 望むなら別の名前を指定でき、その名前でフレームを選択できます。 選択されたフレームに新しい名前を指定するには、 コマンドM-x set-frame-name <RET> name <RET>を使います。 その名前でフレームを選択するには、 M-x select-frame-by-name <RET> name <RET>を使います。 指定した名前は、フレームを選択するとモード行に表示されます。


Node:International, Next:, Previous:Frames, Up:Top

国際化文字集合の使い方

Emacsでは広範囲の国際化文字集合を使えます。 ラテンアルファベットの変種であるヨーロッパの言語はもちろん、中国語、 デバナーガリー(ヒンディー語とマラッタ語)、エチオピア語、ギリシア語、 IPA(International Phonetic Alphabet、万国表音文字)、日本語、韓国語、 ラオ語、ロシア語、タイ語、チベット語、ベトナム語の文字を含んでいます。 これらの機能は、MULE(『MULti-lingual Enhancement to GNU Emacs』)と して知られるEmacsの修正版から併合しました。


Node:International Intro, Next:, Up:International

国際化文字集合の紹介

これらの文字のユーザーは、ファイルに格納するために、 たくさんの標準的なコーディングシステムを確立してきました。 Emacsは内部的には単一のマルチバイト文字符号化を使用しているので、 1つのバッファや1つの文字列の中に、 これらのすべての文字を混ぜ合わせることができます。 この符号化では、非ASCII文字を0200から0377の範囲のバイトの 並びとして表現します。 Emacsは、ファイルを読み書きするとき、サブプロセスとデータを交換するとき、 (場合によっては)C-qコマンドを使うときに、 マルチバイト文字符号化と 他のさまざまなコーディングシステムのあいだで変換します (see Multibyte Conversion)。

コマンドC-h hview-hello-file)は、 多くの言語で『hello』と書いたファイルetc/HELLOを表示します。 これは、さまざまな字体を例示します。

これらの文字集合を使っている国々であっても、 一般にキーボードには、 それらすべての文字に対するキーはありません。 ですから、Emacsではさまざまな入力方式(input methods) 18を使って、 便利に文字を打ち込めるようにします。 典型的には、1つの字体や1つの言語について1つの入力方式があります。

プレフィックスキーC-x <RET>は、 マルチバイト文字、コーディングシステム、入力方式に関係するコマンドに使います。


Node:Enabling Multibyte, Next:, Previous:International Intro, Up:International

マルチバイト文字を使用可能にする

Emacs全体やバッファごとにマルチバイト文字の使用可/使用不可を設定できます。 バッファでマルチバイト文字を使用不可にすると、 そのバッファ内の各バイトは1つの文字を表します。 たとえコードが0200から0377のあいだであってもそうです。 ヨーロッパの文字集合であるISO Latin-1とISO Latin-2を扱う古い機能は、 Emacs 19で動作していたように動き、 他のISO 8859文字集合に対しても動作します。

しかし、ISO Latinを使うために、 マルチバイト文字を使用不可にする必要はありません。 Emacsのマルチバイト文字集合にはこれらの文字集合のすべての文字が含まれ、 EmacsはこれらのISOコードと相互に自動的に変換できます。

特定のファイルをユニバイト表現で編集するには、 find-file-literallyを使ってファイルを訪問します。 See Visiting。 マルチバイト表現のバッファを同じ文字の1バイト表現に変換するには、 もっとも簡単な方法は、内容をファイルに保存してから、バッファを削除し、 find-file-literallyでそのファイルを訪問し直します。 C-x <RET> cuniversal-coding-system-argument)を使って、 ファイルを探したり保存するときのコーディングシステムとして raw-textを指定することもできます。 See Specify Codingraw-textとしてファイルを探しても、 find-file-literallyのようには、 書式変換、圧縮の展開、モードの自動選択を禁止しません。

デフォルトでマルチバイト文字を使用不可にするには、 --unibyteオプション(see Initial Options)を 指定してEmacsを始めるか、あるいは、 環境変数EMACS_UNIBYTEを設定します。 --unibyteと同等な効果を得るには、 enable-multibyte-charactersをカスタマイズするか、 これと等価に、初期化ファイル内で、 変数default-enable-multibyte-charactersを直接設定します。

環境変数の値、/etc/passwdの内容などの非ASCII 8ビット文字からの 初期化中にはマルチバイト文字列は作られません。 しかし、--unibyteを指定したとしても、 一般のLispファイルのように、初期化ファイルは、通常、 マルチバイトとして読み込みます。 それらに含まれる非ASCII文字からマルチバイト文字列が生成されるのを防ぐには、 1行目の注釈に-*-unibyte: t;-*-を入れておきます。 gnusなどのパッケージの初期化ファイルでも同じことをします。

モード行には、カレントバッファでマルチバイト文字が使用可かどうか表示されます。 使用可ならば、モード行の先頭付近のコロンのまえに 2文字か数文字(ほとんどの場合ダッシュ2個)があります。 マルチバイト文字が使用不可ならば、コロンのまえにはダッシュが1個だけです。


Node:Language Environments, Next:, Previous:Enabling Multibyte, Up:International

言語環境

マルチバイト文字が使用可のときはいつでも、 すべての扱える文字集合をEmacsバッファの中で使えます。 ある言語の文字を表示するために、 Emacsバッファでその言語を選択する必要はありません。 しかし、さまざまなデフォルトを設定するために言語環境を 選択しておくことは重要です。 言語環境は、言語の選択というより、 (多かれ少なかれ)実際には好みの文字を表します。

言語環境は、テキストを読み込むときにどのコーディングシステムを認識するかを 制御します(see Recognize Coding)。 言語環境は、ファイル、到着メイル、ニュース、 Emacsへ読み込むその他のテキストに適用されます。 言語環境は、ファイルを作成したときに使うデフォルトの コーディングシステムを指定することもあります。 各言語環境は、デフォルトの入力方式も指定します。

言語環境を選択するには、 コマンドM-x set-language-environmentを使います。 このコマンドを使ったときにどのバッファが カレントバッファであるかは関係ありません。 というのは、その効力は、そのEmacsセッションに全体に適用されるからです。 以下の言語環境を使えます。

Chinese-BIG5、Chinese-CNS、Chinese-GB、Cyrillic-Alternativnyj、 Cyrillic-ISO、Cyrillic-KOI8、Devanagari、English、Ethiopic、Greek、 Hebrew、Japanese、Korean、Lao、Latin-1、Latin-2、Latin-3、Latin-4、 Latin-5、Thai、Tibetan、Vietnamese。

いくつかのオペレーティングシステムでは、 ローケル(locale)環境変数を設定することで言語を指定できます。 Emacsは、このよくある特別な場面を扱います。 文字種を表すローケル名が文字列8859-nを含むなら、 Emacsは自動的に対応する言語環境を選択します。

ある言語環境lang-envの効果についての情報を表示するには、 コマンドC-h L lang-env <RET>describe-language-environment)を使います。 このコマンドは、その言語環境がどの言語に役立つのか、 その言語で使われる文字集合、コーディングシステム、 入力方式の一覧を表示します。 また、その言語環境で使われる文字を例示する例文も表示します。 デフォルトでは、このコマンドは選択されている言語環境を記述します。

どの言語環境もノーマルフックset-language-environment-hookで カスタマイズできます。 コマンドset-language-environmentは、 新しい言語環境を設定したあとでこのフックを実行します。 フック関数では、変数current-language-environmentを検査すれば、 言語環境を知ることができます。

set-language-environmentは、新しい言語環境を設定し始めるまえに、 まずフックexit-language-environment-hookを実行します。 このフックは、(直前の言語環境を設定した) set-language-environmentで施したカスタマイズをもとに戻すのに便利です。 たとえば、set-language-environment-hookを使って設定した 特定の言語環境で特別なキーバインディングを定義したときには、 それをそのキーのもとのバインディングに戻すために exit-language-environment-hookを設定するべきです。


Node:Input Methods, Next:, Previous:Language Environments, Up:International

入力方式

入力方式(input method)は、 対話的に入力するために特別に設計された文字変換の一種です。 Emacsでは、典型的には、各言語向けに専用の入力方式があります。 ときには、同じ文字を使ういくつかの言語で入力方式を共有します。 複数の入力方式を使う言語も少しはあります。

入力方式のもっとも単純なものは、ASCII文字を別のアルファベットに 対応させることで動作します。 ギリシア語とロシア語の入力方式はこのように動作します。

より強力な方法は合成で、文字の列を1つの文字に変換します。 多くのヨーロッパの入力方式は、文字のうしろにアクセント文字が続く列 (あるいはその逆順)から、1つの非ASCII文字を生成する合成を使います。 たとえば、いくつかの入力方式では、 文字の列a'を1つのアクセント付き文字に変換します。 これらの入力方式には、その方式に固有の特別なコマンドはありません。 印字文字の列を合成するだけです。

音節文字用の入力方式では、典型的には、対応付けたあとで合成します。 タイ語と韓国語の入力方式は、この方法で動作します。 まず、文字を音声記号に対応付けます。 そして、1つの音節全体を構成するそれらの列を1つの音節記号に対応付けます。

中国語や日本語では、より複雑な方法が必要です。 中国語の入力方式では、まず、中国語の単語の発音表記を入力する (とりわけ入力方式chinese-py)か、 1文字の各部分部分の列(とりわけ入力方式chinese-4cornerchinese-sw)を入力します。 1つの発音表記は、普通、多くの異なる中国語の文字に対応しているので、 特別なEmacsコマンドを使って候補群から1つを選ぶ必要があります。 C-fC-bC-nC-pと数字キーは、 この状況で候補を選ぶために使われる特別な定義になっています。 <TAB>は、すべての候補をバッファに表示します。

日本語の入力方式19 では、まず、発音表記を使って1つの単語全体を入力します。 そして、単語がバッファに入ったあとで、 Emacsは大きな辞書を使って1つ以上の文字へ変換します。 1つの発音表記は、たくさんの異なる日本語の単語に対応しているので、 その中から選ぶ必要があります。 候補を巡回するには、C-nC-pを使います。

ときには、入力方式での処理を切り離したほうが便利なことがあります。 そうすれば、入力した文字は後続の入力文字と結合されません。 たとえば、入力方式latin-1-postfixでは、 キー列e 'は結合されてアクセント付きeになります。 これらを別々の文字として入力したいときはどうするのでしょう?

1つの方法は、アクセントを2回打つことです。 これは、アルファベットとアクセントを別々に入力する特別な機能です。 たとえば、e ' 'は、2つの文字e'になります。 別の方法は、eのあとに結合されない別の文字を打ってから、 すぐにそれを消すことです。 たとえば、 e'を入力するには、e e <DEL>'と打ちます。

別の方法はより一般的ですが、打つのは簡単ではありません。 2つの文字のあいだでC-\ C-\を打って、結合を止めます。 これは、コマンドC-\toggle-input-method)を2回使っています。

C-\ C-\は、インクリメンタルサーチの中では特に便利です。 というのは、結合する文字を待つことを止めて、 すでに入力したものを探索し始めるからです。

変数input-method-highlight-flaginput-method-verbose-flagは、 入力方式に何が進行中かをどのように表示させるかを制御します。 input-method-highlight-flagnil以外ならば、 バッファでは(入力途中の)部分列を強調表示します。 input-method-verbose-flagnil以外ならば、 (ミニバッファの中でなければ) つぎに打鍵できる文字の一覧をエコー領域に表示します。


Node:Select Input Method, Next:, Previous:Input Methods, Up:International

入力方式の選択

C-\
選択されている入力方式をオン/オフする。
C-x <RET> C-\ method <RET>
カレントバッファに対して新しい入力方式を選択する。
C-h I method <RET>
C-h C-\ method <RET>
入力方式methodについて説明する(describe-input-method)。 デフォルトでは、(あれば)現在の入力方式を説明する。 この説明で、ある入力方式の使い方の詳細がわかるはず。
M-x list-input-methods
使用可能なすべての入力方式の一覧を表示する。

カレントバッファに対する入力方式を選ぶには、 C-x <RET> C-\set-input-method)を使います。 このコマンドは、ミニバッファで入力方式名を読みます。 その名前は、通常、一緒に使うことを意図された言語環境で始まります。 変数current-input-methodは、どの入力方式を選択したかを記録します。

入力方式は、非ASCII文字を入力するために、さまざまなASCII文字の列を使います。 ときには、一時的に入力方式をオフにできると便利なこともあります。 そうするには、C-\toggle-input-method)と打ちます。 入力方式をふたたびオンにするには、C-\をもう一度打ちます。

C-\を打ったときに、入力方式をまだ選択していないと、 入力方式を指定するように聞いてきます。 これは、入力方式を指定するために C-x <RET> C-\を使うのと同じ効果があります。

言語環境を選択すると、さまざまなバッファで使う デフォルトの入力方式を指定します。 デフォルトの入力方式を指定してあれば、 C-\と打てばカレントバッファでそれを選択できます。 変数default-input-methodは、デフォルトの入力方式を指定します (nilは入力方式なしの意味)。

アルファベット文字に対するいくつかの入力方式は、 その文字向けに一般的に使用されるさまざまなキーボード配列を エミュレートするようにキーボードを (実質的に)マッピングし直すことで動作します。 マッピングし直す方法は、あなたの実際のキーボード配列に依存します。 使っているキーボード配列を指定するには、 コマンドM-x quail-set-keyboard-layoutを使います。

使用可能なすべての入力方式の一覧を表示するには、 M-x list-input-methodsと打ちます。 この一覧には、モード行に表示される入力方式を表す文字列を含めて、 各入力方式についての情報が示されます。


Node:Multibyte Conversion, Next:, Previous:Select Input Method, Up:International

ユニバイトとマルチバイトの非ASCII文字

マルチバイト文字が使用可のときには、 文字コード0240(8進数)から0377(8進数)の文字は、 実際にそのままではバッファ内に存在しません。 正しい非ASCII印字文字は、0400から始まるコードになります。

0240から0377の不正な範囲の自己挿入文字を打った場合、 Emacsは、ISO Latin-n文字集合の1つを使おうとしていると仮定して、 Latin-nの文字を表すEmacsのコードに変換します。 言語環境の選択を介して、どのISO Latin文字集合を使うのか指定できます 何も選んでないと、デフォルトはLatin-1です。

C-qでこの範囲の8進コードを入力すると、同じことが起こります。


Node:Coding Systems, Next:, Previous:Multibyte Conversion, Up:International

コーディングシステム

さまざまな言語を使うユーザーは、 それらを表現するための標準的な コーディングシステムを数多く確立してきました。 Emacsはこれらのコーディングシステムを内部的には使用しません。 そのかわり、データを読むときには、 さまざまなコーディングシステムからEmacs独自のコーディングシステムに変換し、 データを書くときには、 内部コーディングシステムから他のコーディングシステムに変換します。 ファイルの読み書き、端末とのやりとり、サブプロセスとのデータ交換において、 変換できます。

Emacsは各コーディングシステムに名前を付けています。 多くのコーディングシステムは、1つの言語で使用されるので、 コーディングシステムの名前は、言語の名前で始まります。 いくつかのコーディングシステムは、いくつもの言語で使用されます。 その場合、コーディングシステムの名前は、通常、isoで始まります。 印字文字をまったく変換しない特別なコーディングシステム、 no-conversionraw-textemacs-muleもあります。

非ASCII文字のさまざまな表現形の変換に加えて、 コーディングシステムは行末変換も行います。 Emacsは、ファイル内の行の区切り方として、 3つの異なる変換を扱えます。 つまり、改行、復帰改行、復帰です。

C-h C coding <RET>
コーディングシステムcodingを説明する。
C-h C <RET>
現在使用しているコーディングシステムを説明する。
M-x list-coding-systems
使用可能なすべてのコーディングシステムの一覧を表示する。

コマンドC-h Cdescribe-coding-system)は、 特定のコーディングシステムについての情報を表示します。 引数にコーディングシステム名を指定できます。 あるいは、引数が空のときには、 カレントバッファに対するものとデフォルトの両方について、 さまざまな目的のために選択されている現在のコーディングシステムと、 コーディングシステムを認識するための優先順位表を説明します。 (see Recognize Coding)。

利用可能なすべてのコーディングシステムの一覧を表示するには、 M-x list-coding-systemsと打ちます。 モード行に表示される文字を含めて、 各コーディングシステムについての情報の一覧を表示します(see Mode Line)。

いかなる種類の変換も行わないno-conversionを除いて、 この一覧に現れる各コーディングシステムは 印字文字をどのように変換する/しないを指定します。 しかし、行末変換は、各ファイルの内容に基づいて決定されます。 たとえば、ファイルが行区切りに復帰改行を使用しているように思われるときには、 その行末変換を使います。

一覧の各コーディングシステムには、 どのように行末変換するかを正確に指定する3つの変種があります。

...-unix
行末変換を行わない。 ファイルでは、行区切りに改行を使用していると仮定する。 (これは、UNIXとGNUシステムで普通に使用される変換。)
...-dos
ファイルでは、行区切りに復帰改行を使用していると仮定し、適当な変換を行う。 (これは、Microsoftシステムで普通に使用される変換。 20
...-mac
ファイルでは、行区切りに復帰を使用していると仮定し、適当な変換を行う。 (これは、Machintoshシステムで普通に使用される変換。)

これらのコーディングシステムの変種は、 完全に予想できるのでlist-coding-systemsの表示からは 簡潔にするために除かれています。 たとえば、コーディングシステムiso-latin-1には、 iso-latin-1-unixiso-latin-1-dosiso-latin-1-mac の変種があります。

コーディングシステムraw-textは、 主にASCIIテキストのファイルに適していますが、 ファイルには、非ASCII文字の符号を意味しない127を越えるバイト値が 含まれるかもしれません。 raw-textでは、 Emacsは、それらのバイトが適切に解釈されるように値を変更しないでコピーし、 カレントバッファの enable-multibyte-charactersnilを設定します。 raw-textは、出会ったデータに基づく普通の方法で行末変換を処理し、 使用する行末変換を指定する3つの変種を持ちます。

対照的に、コーディングシステムno-conversionは、 非ASCIIバイト値と行末に対して、いかなる文字コード変換も指定しません。 これは、バイナリファイル、tarファイル、 そのまま処理する必要があるその他のファイルを読み書きするのに便利です。 これも、enable-multibyte-charactersnilを設定します。

いかなる種類の変換もしないでファイルを編集するもっとも簡単な方法は、 M-x find-file-literallyコマンドを使うことです。 このコマンドは、no-conversionを使い、 あなたがファイルを見るまえにファイルの内容を 変換するかもしれないEmacsのその他の機能を抑制します。 See Visiting

コーディングシステムemacs-muleは、 Emacs内部の符号化のままで格納された非ASCII文字を 含むファイルであることを意味します。 これは、出会ったデータに基づいて行末変換を扱い、 行末変換の種類を指定する通常の3つの変種を持ちます。


Node:Recognize Coding, Next:, Previous:Coding Systems, Up:International

コーディングシステムの認識

一度自分の好みを指定しておけば、ほとんどの場合、Emacsは、 与えられたファイルに対してどのコーディングシステムを使うか認識できます。

いくつかのコーディングシステムは、 データ内にどのようなバイト列が現れたかで、認識したり区別できます。 しかし、区別できないコーディングシステムや その可能性もないコーディングシステムもあります。 たとえば、Latin-1とLatin-2を区別する方法はありません。 これらは同じバイト値を異なる意味で使用しています。

Emacsは、コーディングシステムの優先順位表を用いてこの事態を処理します。 使用するコーディングシステムを指定しなければ、 Emacsはファイルを読むときはいつでも、 優先順位のもっとも高いものから始めて順に下りながら、 データに合うコーディングシステムをみつけるまで 各コーディングシステムに対してデータを検査します。 そして、ファイルはそのコーディングシステムで表現されていると仮定して、 ファイルの内容を変換します。

コーディングシステムの優先順位表は、選択されている言語環境に依存します (see Language Environments)。 たとえば、フランス語を使うのなら、たぶん、 EmacsにはLatin-2よりLatin-1を選んでほしいでしょう。 チェコ語を使うなら、たぶん、Latin-2のほうがよいでしょう。 これが、言語環境を指定する理由の1つです。

しかし、コマンドM-x prefer-coding-systemを使って、 優先順位表の詳細を変更できます。 このコマンドはミニバッファからコーディングシステムの名前を読み、 それを優先順位表の先頭に追加して、他のすべてのものより優先するようにします。 このコマンドを数回使うと、 使用するごとに優先順位表の先頭に1つの要素が追加されます。

iso-8859-1-dosのような行末変換を指定したコーディングシステムを使うと、 iso-8859-1を優先して認識し、その場合にはDOSの行末変換を使うことを Emacsに指示することになります。

ときには、ファイルに対して使用するコーディングシステムを ファイル名が示していることがあります。 変数file-coding-system-alistは、この対応関係を指定します。 このリストに要素を追加する特別な関数 modify-coding-system-alistがあります。 たとえば、すべての.txtの読み書きに、 コーディングシステムchina-iso-8bitを使用したいなら、 つぎのLisp式を実行します。

(modify-coding-system-alist 'file "\\.txt\\'" 'china-iso-8bit)

始めの引数はfile、 第2引数はこれを適用するファイルを決定する正規表現、 第3引数はこれらのファイルに対して使用するコーディングシステムです。

Emacsは、ファイルの内容に基づいて、使用する行末変換の種類を認識します。 復帰のみ、あるいは、復帰改行の列のみであれば、 対応する行末変換を選択します。 変数inhibit-eol-conversionnil以外を設定すると、 行末変換の自動的な使用を禁止できます。

ファイルの先頭の-*-...-*-や、 ファイルの最後のローカル変数リストを使って、 個々のファイルに対してコーディングシステムを指定できます (see File Variables)。 これを行うには、codingという名前の『変数』に値を定義します。 Emacsには、変数codingは実際にはありません。 変数を設定するかわりに、 ファイルに対して指定されたコーディングシステムを使います。 たとえば、-*-mode: C; coding: latin-1;-*-は、 Cモードを指定するとともに、Latin-1のコーディングシステムの使用を指定します。 ファイルでコーディングシステムを明示的に指定した場合、 それはfile-coding-system-alistに優先します。

変数auto-coding-alistは、特定のパターンのファイル名に対して コーディングシステムを指定するもっとも強い方法です。 この変数は、ファイル自身の-*-coding:-*-にさえも優先します。 Emacsはtarファイルやアーカイブファイルに対してこの機能を使います。 アーカイブ内のファイルの中にある-*-coding:-*-で混乱して、 ファイル全体にコーディングシステムを適用してしまうことを防ぐのです。

Emacsがバッファに対するコーディングシステムを一度選択すると、 そのコーディングシステムをbuffer-file-coding-systemに入れておき、 このバッファからファイルに書く操作では、 デフォルトでこのコーディングシステムを使います。 これには、コマンドsave-bufferwrite-regionも含まれます。 異なるコーディングシステムを用いてこのバッファからファイルに書きたいときには、 set-buffer-file-coding-systemを使って、 そのバッファに対して異なるコーディングシステムを指定します (see Specify Coding)。

メイル(mail)モード(see Sending Mail)でメッセージを送るとき、 Emacsには、メッセージテキストの符号化に使うコーディングシステムを決定する 異なる方法が4つあります。 バッファのbuffer-file-coding-systemnil以外ならば、 その値を試します。 さもなければ、sendmail-coding-systemの値がnil以外ならば、 その値を使います。 3つめの方法は、新しいファイルに対するデフォルトの コーディングシステムがnil以外ならば、それを使います。 この値は、言語環境の選択で制御されます。 これらの3つの値がすべてnilならば、 Emacsは、Latin-1のコーディングシステムを使用して送出メイルを符号化します。

rmailで新しいメイルを受けとったとき、 各メッセージが別々のファイルであるかのように、 各メッセージは自動的にそのメイルが書かれたコーディングシステムで変換されます。 これには、指定したコーディングシステムの優先順位表を使います。 MIMEメッセージが文字集合を指定するときには、 rmail-decode-mime-charsetnilでない限り、 rmailはその指定に従います。

rmailファイル自身を読んだり保存したりするときには、 Emacsは、変数rmail-file-coding-systemで指定された コーディングシステムを使います。 そのデフォルト値は、nilです。 rmailファイルは変換しないという意味です (rmailファイルは、Emacsの内部文字コードで読み書きされる。)


Node:Specify Coding, Next:, Previous:Recognize Coding, Up:International

コーディングシステムの指定

Emacsが自動的に正しいコーディングシステムを選択しない場合には、 コーディングシステムを指定するつぎのコマンドを使用できます。

C-x <RET> f coding <RET>
カレントバッファに訪問したファイルに コーディングシステムcodingを使う。
C-x <RET> c coding <RET>
このコマンドの直後に続くコマンドに対して コーディングシステムcodingを指定する。
C-x <RET> k coding <RET>
キーボード入力に対してコーディングシステムcodingを使用する。
C-x <RET> t coding <RET>
端末出力に対してコーディングシステムcodingを使用する。
C-x <RET> p input-coding <RET> output-coding <RET>
カレントバッファでのサブプロセスの入力と出力に コーディングシステムinput-codingoutput-codingを使用する。
C-x <RET> x coding <RET>
ウィンドウシステムを介した他のプログラムとのセレクションの交換には、 コーディングシステムcodingを使用する。
C-x <RET> X coding <RET>
ウィンドウシステムで1つのセレクションの交換には、 コーディングシステムcodingを使用する。

コマンドC-x <RET> fset-buffer-file-coding-system)は カレントバッファに対してファイルコーディングシステムを指定します。 いいかえれば、訪問したファイルを保存したりふたたび読む込むときに 使うコーディングシステムです。 コーディングシステムはミニバッファを使って指定します。 このコマンドは、すでに訪問したファイルに作用するので、 ファイルを保存するときにしか影響しません。

ファイルに対するコーディングシステムを指定する別の方法は、 ファイルを訪問するときです。 まずコマンドC-x <RET> cuniversal-coding-system-argument)を使います。 このコマンドは、ミニバッファを使ってコーディングシステム名を読みます。 ミニバッファを出たあと、 直後のコマンドに対して指定したコーディングシステムが使用されます。

ですから、たとえば、その直後のコマンドがC-x C-fならば、 そのコーディングシステムを使ってファイルを読みます (そして、ファイルを保存するときのために そのコーディングシステムを記録します)。 あるいは、その直後のコマンドがC-x C-wならば、 そのコーディングシステムを使ってファイルに書きます。 コーディングシステムを指定することで、影響される他のファイルコマンドは、 C-x C-iC-x C-v、および、 別のウィンドウを使うC-x C-fの変形です。

C-x <RET> cは、M-x shell(see Shell)を含む サブプロセスを開始するコマンドにも影響します。

しかしながら、その直後のコマンドがコーディングシステムを使用しないなら、 C-x <RET> cは最終的には何の効果もありません。

ファイルを変換しないで訪問するもっとも簡単な方法は、 M-x find-file-literallyコマンドです。 See Visiting

変数default-buffer-file-coding-systemは、 新しいファイルを作成するときのコーディングシステムの選択を指定します。 この変数は、新規作成のファイルを訪問するとき、あるいは、 バッファを作成してそれをファイルに保存するときに適用されます。 言語環境を選択すると、典型的には、 言語環境に対して最適のデフォルトのコーディングシステムを この変数に設定します。

コマンドC-x <RET> tset-terminal-coding-system)は 端末出力に対するコーディングシステムを指定します。 端末出力のコーディングシステムを指定すると、 端末へのすべての文字出力はそのコーディングシステムに翻訳されます。

この機能は、特定の言語や文字集合向けに作られたある種の文字端末には便利です。 たとえば、ISO Latin 文字集合の1つを扱えるヨーロッパの端末です。 マルチバイトテキストを使っているときには、 Emacsが端末で実際に扱える文字を知るために、 端末コーディングシステムを指定する必要があります。

Emacsがあなたの端末の正しいコーディングシステムを推測できない限り、 デフォルトでは、端末出力はまったく変換しません。

コマンドC-x <RET> kset-keyboard-coding-system)は キーボード入力に対するコーディングシステムを指定します。 キーボードから入力した文字コードの変換は、 非ASCII図形文字を送出するキーを有する端末には便利です。 たとえば、いくつかの端末は、ISO Latin-1やその部分集合向けに設計されています。

デフォルトでは、キーボード入力はまったく変換しません。

コーディングシステムを使用してキーボード入力を変換することと、 入力方式の使用には似たところがあります。 どちらも、1つの文字に変換するキーボード入力列を定義しています。 しかしながら、入力方式は人が対話的に使用するのに便利なように設計されていて、 変換される列は典型的にはASCII印字文字の列です。 コーディングシステムは、典型的には非図形文字の列を変換します。

コマンドC-x <RET> xset-selection-coding-system)は、 選択されたテキストをウィンドウシステムへ送るとき、および、 他のアプリケーションで作られたセレクションのテキストを受け取るときの コーディングシステムを指定します。 このコマンドは、再設定しない限り、以降のすべてのセレクションに作用します。 コマンドC-x <RET> Xset-next-selection-coding-system)は、 Emacsが作る/読むつぎのセレクションのコーディングシステムを指定します。

コマンドC-x <RET> pset-buffer-process-coding-system)は、 サブプロセスの入出力に対するコーディングシステムを指定します。 このコマンドはカレントバッファに作用します。 通常、各サブプロセスはそれ自身のバッファを持ちます。 ですから、各サブプロセスの入出力の変換を指定するには、 対応するバッファでこのコマンドを使用します。

デフォルトでは、プロセスの入出力はまったく変換しません。

変数file-name-coding-systemは、 ファイル名を符号化するためのコーディングシステムを指定します。 この変数に(Lispシンボルや文字列で)コーディングシステム名を設定すると、 Emacsは、すべてのファイル操作に対してそのコーディングシステムを 使ってファイル名を符号化します。 これは、ファイル名に非ASCII文字を使うことを可能にしています。 あるいは、少なくとも、指定したコーディングシステムで符号化できる 非ASCII文字を使えるはずです。

file-name-coding-systemnilならば、 Emacsは、選択されている言語環境で決まるデフォルトのコーディングシステムを 使います。 デフォルトの言語環境では、 ファイル名の中の非ASCII文字は特別に符号化しません。 Emacsの内部表現でファイルシステム上に現れます。

警告: Emacsセッションの途中でfile-name-coding-system (や言語環境)を変更すると、問題となる場合があります。 つまり、それまでのコーディングシステムで符号化された名前のファイルを すでに訪問していて、新しいコーディングシステムではその名前を 符号化できない(あるいは異なって符号化される)ときです。 そのようなバッファを訪問先ファイル名で保存しようとすると、 まちがった名前のファイルに保存されるか、エラーになります。 そのような問題が発生した場合には、 C-x C-wを使って、 そのバッファに新しいファイル名を指定します。


Node:Fontsets, Next:, Previous:Specify Coding, Up:International

フォントセット

Xウィンドウシステムのフォントは、典型的には、 1つのアルファベットや文字集合の形を定義しています。 したがって、Emacsが扱える文字の範囲全体を表示するには、 たくさんのフォントを集めたものが必要です。 Emacsでは、そういったフォントを集めたものを フォントセット(fontset)と呼びます。 フォントセットは、ある文字コード範囲を扱うフォントのリストで定義されます。

各フォントセットには、フォントと同様に名前があります。 使用可能なXのフォントは、Xサーバーが定義します。 しかし、フォントセットはEmacsの中で定義されます。 いったんフォントセットを定義すれば、フォントを使える場面ではどこでも、 その名前を指定してEmacs内のフォントセットを使用できます。 もちろん、Emacsのフォントセットでは、Xサーバーで使えるフォントだけを使えます。 ある文字が画面で中抜きの箱で表示されたなら、 その文字に使用したフォントセットには、 その文字に対するフォントがないことを意味します。

Emacsは、標準フォントセットスタートアップフォントセットの 2つのフォントセットを自動的に作ります。 標準フォントセットは、非ASCII文字向けの広い範囲のフォントを もっとも持ちそうなものです。 しかし、これは、Emacsが使うデフォルトではありません。 (デフォルトでは、 Emacsはボールドとイタリックの変種のフォントをみつけようとする。) オプション-fnやXのリソースFont(see Font X)で 使用する標準フォントセットを指定できます。 たとえば、つぎのようにします。

emacs -fn fontset-standard

フォントセットが、すべての文字コードに対するフォントを 指定する必要はありません。 フォントセットが、ある文字に対してフォントを指定していない、あるいは、 システムに存在しないフォントを指定している場合には、 その文字を正しく表示できません。 そのかわりに、中抜きの箱を表示します。

フォントセットの高さと幅は、ASCII文字で決定されます (つまり、そのフォントセット内でASCII文字用に使われるフォント)。 フォントセットのあるフォントが異なる高さや幅を持つ場合には、 そのフォントを割り当てられた文字は、 フォントセットの大きさに切り詰められます。 highlight-wrong-size-fontnil以外ならば、 これらのまちがった大きさの文字は箱で囲まれて表示されます。


Node:Defining Fontsets, Next:, Previous:Fontsets, Up:International

フォントセットの定義方法

Emacsはstandard-fontset-specの値に従って、 自動的に標準フォントセットを作ります。 フォントセットの名前はつぎのとおりです。

-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard

または、省略してfontset-standardです。

標準フォントセットのボールド、イタリック、ボールドイタリックの変種も 自動的に作られます。 それらの名前は、mediumのかわりにboldrのかわりにi、あるいは、両方ともそのようになります。

リソースFontやオプション-fnで、 デフォルトのASCIIフォントを指定すると、 Emacsはそれから自動的にフォントセットを生成します。 これが、スタートアップフォントセットで、 その名前はfontset-startupです。 これは、フォント名のフィールド、foundryfamilyadd_styleaverage_width*で、 charset_registryfontsetで、 charset_encodingstartupで置き換えて得られた文字列を フォントセットの指定に使用します。

たとえば、Emacsをつぎのように起動します。

emacs -fn "*courier-medium-r-normal--14-140-*-iso8859-1"

Emacsがつぎのフォントセットを生成して、 Xウィンドウの初期フレームに使います。

-*-*-medium-r-normal-*-14-140-*-*-*-*-fontset-startup

XのリソースEmacs.Fontで、 フォントセット名を実際のフォント名のように指定できます。 しかし、Emacs*Fontのようなワイルドカードを使ったリソースに フォントセット名を指定しないように注意してください。 ワイルドカードを使った指定は、フォントセットを扱えないメニューのような、 他のさまざまな目的にも適用されます。

Fontset-nという名前のXのリソースを 使って追加フォントセットを指定できます。 ただし、nは0から始まる整数です。 リソースの値はつぎのような形式でなければなりません。

fontpattern, [charsetname:fontname]...

fontpatternは、最後の2つのフィールドを除いて、 標準のXフォント名の形式でなければなりません。 最後の2つのフィールドは、fontset-aliasの形式を持つべきです。

フォントセットには2つの名前、長い名前と短い名前があります。 長い名前はfontpatternです。 短い名前はfontset-aliasです。 どちらの名前でもフォントセットを参照できます。

charset:fontという構成は、 ある文字集合に対して(このフォントセットでは) どのフォントを使用するかを指定します。 ここでcharsetは、文字集合の名前で、 fontはその文字集合に使用するフォントです。 1つのフォントセットの定義の中では、この構成を何度でも使用できます。

他の文字集合に対しては、Emacsはfontpatternに基づいて選択します。 これには、文字集合を記述する値でfontset-aliasを置き換えます。 ASCII文字フォントに対しては、fontset-aliasISO8859-1で置き換えます

これに加えて、いくつか連続したフィールドがワイルドカードであるなら、 Emacsはそれらを1つのワイルドカードにまとめます。 これは、自動的に拡大縮小したフォントの使用を避けるためです。 大きめのフォントを縮小したフォントは編集には使えません。 また、小さめのフォントを拡大したフォントも便利ではありません。 というのは、Emacsがそうするように、 もともと小さなフォントを使うほうがよいからです。

したがって、fontpatternがつぎのようであると、

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

ASCII文字に対するフォント指定はつぎのようになります。

-*-fixed-medium-r-normal-*-24-*-ISO8859-1

また、Chinese GB2312文字に対するフォント指定はつぎのようになります。

-*-fixed-medium-r-normal-*-24-*-gb2312*-*

上のフォント指定に一致する中国語フォントがないかもしれません。 多くのXの配布には、familyフィールドが song tifangsong tiの中国語フォントだけが含まれています。 そういった場合、Fontset-nをつぎのように指定します。

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
        chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

そうすると、Chinese GB2312の文字を除くフォント指定では familyフィールドがfixedとなり、 Chinese GB2312の文字に対するフォント指定では familyフィールドが*となります。

フォントセットのリソース値を処理してフォントセットを作る関数は、 create-fontset-from-fontset-specです。 フォントセットを作るために、この関数を明示的に呼ぶこともできます。

Xにおけるフォントの命名法について詳しくは、See Font X


Node:Single-Byte European Support, Previous:Defining Fontsets, Up:International

1バイトヨーロッパ文字の使い方

ISO 8859 Latin-n文字集合は、 さまざまなヨーロッパの言語で必要とされるアクセント文字と句読点記号を 扱うために、160から250の範囲の文字コードを定義しています。 マルチバイト文字を使用不可にしても、 Emacsは、一度にはこれらの文字コードの1つを扱えます。 これらのコードのどれを使うかを指定するには、 M-x set-language-environmentを起動して、 Latin-nのような適切な言語環境を指定します。

ユニバイト操作についてより詳しくは、 Enabling Multibyteを参照してください。 非ASCII文字を含んだ初期化ファイルをユニバイトで読むことを保証したいときには 特に注意してください。

端末や使っているフォントでこれらの文字を扱えるならば、 Emacsはこれらの文字を表示できます。 これは自動的に行われます。 あるいは、ウィンドウシステムを使っている場合には、 現在の言語環境に従ってそれらに対応するマルチバイト文字を表示することで、 Emacsはフォントセットを介して1バイト文字を表示できます。 これを行うには、 変数unibyte-display-via-language-environmentnil以外の 値を設定します。

もし、端末でLatin-1文字集合を表示できなければ、 Emacsは、これらの文字をその文字が少なくとも何であるかを明確に理解できるような ASCII列として表示できます。 これを行うには、ライブラリiso-asciiをロードします。 他のLatin-n文字集合に対しても似たようなライブラリを実装できますが、 まだ行っていません。

(文字128から159の)非ISO 8859文字は、通常、8進表示されます。 ライブラリdisp-tableの関数standard-display-8bitを使えば、 この表示を非標準の「拡張」版のISO 8859文字集合に変更できます。

1バイト非ASCII文字を入力する異なる方法が3つあります。


Node:Major Modes, Next:, Previous:International, Up:Top

メジャーモード

Emacsには、多数の選択できるメジャーモード(major mode)があり、 各モードは特定の種類のテキストを編集するためにEmacsをカスタマイズします。 メジャーモードは相互に排他的で、 各バッファはいつでも1つのメジャーモードだけを持ちます。 モード行は、通常、現行のメジャーモードの名前を括弧の中に表示します (see Mode Line)。

もっとも特殊化されていないメジャーモードは、 基本(fundamental)モードと呼ばれます。 このモードには、モード独自の再定義や変数設定がなく、 各Emacsコマンドはもっとも一般的なふるまいをして、 各オプションはデフォルトの状態になっています。 Lispや英文のように、Emacsが知っている特定の種類のテキストを編集するには、 Lispモードや、テキスト(text)モードのような 適切なメジャーモードに切り替えるべきです。

メジャーモードを選択することは、 編集対象の言語により明確に適応するようにキーの意味を多少変更することです。 よく変更されるキーは<TAB>、<DEL>、C-jです。 プレフィックスキーC-cは、モード特有のコマンドを含みます。 さらに、コメントを扱うコマンドは、 モードを使ってコメントの区切り方を決定します。 多くのメジャーモードでは、 バッファ内に現れる文字の構文上の属性を再定義しています。 See Syntax

メジャーモードは3つのグループに分けられます。 (いくつかの変種を有する)Lispモード、Cモード、Fortranモード、 その他のプログラム言語特有のモードのグループがあります。 テキスト(text)モード、nroffモード、 TeXとアウトライン(outline)モードなど 英文を編集するためのものがあります。 残りのメジャーモードは、ユーザーのファイルに使うためのものではありません。 Emacsが特別の目的のために作るバッファで使われます。 dired(see Dired)が作るバッファ向けのdiredモード(see Dired)、 C-x mで作られるバッファ向けの メイル(mail)モード(see Sending Mail)、 下位のシェルプロセスとの通信用のバッファ向けのシェル(shell)モード (see Interactive Shell)などです。

ほとんどのプログラム言語用のメジャーモードでは、 段落の区切りは空行だけです。 これは、段落コマンドを役立つようにするためです。 (see Paragraphs。) また、これらのモードでは、 自動詰め込み(auto-fill)モードにおいて、 新たに作った行を字下げするように<TAB>を定義します。 というのは、プログラム中のほとんどの行は通常字下げされるからです。 (see Indentation。)


Node:Choosing Modes, Previous:Major Modes, Up:Major Modes

メジャーモードの選択方式

カレントバッファに対して明示的にメジャーモードを選択することもできます。 しかし、たいていは、ファイル名やファイル内の特別のテキストに基づいて Emacsはどのモードを使うかを決定します。

明示的に新しいメジャーモードを選択するには、M-xコマンドで行います。 メジャーモードの名前に-modeを付け加えると、 そのモードを選ぶコマンド名になります。 したがって、Lispモードに入るにはM-x lisp-modeを実行します。

ファイルを訪問すると、Emacsは通常ファイル名に基づいて 正しいメジャーモードを選択します。 たとえば、.cで終る名前のファイルは、Cモードで編集されます。 ファイル名とメジャーモードとの対応は、 変数auto-mode-alistで制御します。 その値は、要素がつぎのような形式のリストです。

(regexp . mode-function)

または、つぎの形式です。

(regexp mode-function flag)

たとえば、このリストに通常ある要素は、 ("\\.c\\'". c-mode)です。 これは、.cで終る名前のファイルにはCモードを選びます。 (Lispの構文では、\を含めるには\\が必要。 また、\は、正規表現の.の特別な意味を抑制するために必要。) リストの要素が (regexp mode-function flag)の形式で flagnil以外ならば、 functionを呼んだあとにregexpに一致する接尾辞を捨てて、 リストで他に一致するものをふたたび探します。

ファイルの空行でない最初の行の特別な種類のテキストによって、 そのファイルを編集するためにどのメジャーモードを使うかを指定できます。 モード名は、その行に-*-で囲まれて現れます。 他のテキストがその行にあってもかまいません。 たとえば、

;-*-Lisp-*-

は、EmacsにLispモードを使うように指示します。 このような明示的な指定は、 ファイル名に基づいたメジャーモードに優先します。 この行がLispのコメントになるように セミコロンを使っていることに注意してください。

モードを指定する別の書式は、つぎのとおりです。

-*- mode: modename;-*-

これは、同様にローカル変数も指定できて、つぎのように書きます。

-*- mode: modename; var: value; ... -*-

より詳しくは、See File Variables

ファイルの内容が#!で始まるときは、 ファイルの1行目で指定したコマンドインタープリタを実行することで、 実行可能なシェルコマンドとして働きます。 ファイルの残りの部分は、インタープリタへの入力として使われます。

Emacsでそのようなファイルを訪問したとき、 ファイルの名前がメジャーモードを指定しないときには、 Emacsはモードを選択するために1行目のインタープリタの名前を使います。 1行目が、perltclのような認識される インタープリタプログラムの名前ならば、 Emacsはインタープリタのプログラムにとって適切なモードを使用します。 変数interpreter-mode-alistは、 インタープリタプログラム名とメジャーモードとの対応を指定します。

1行目が#!で始まるときには、 インタープリタを実行するときにシステムが混乱するため、 1行目では-*-の機能を使えません。 そのため、そのようなファイルでは、Emacsは1行目に加えて2行目でも -*-を探します。

使用するメジャーモードを指定しないファイルを訪問したとき、 あるいは、C-x bで新たにバッファを作るときには、 変数default-major-modeが、使用するモードを指定します。 通常、その値は、基本(fundamental)モードを指定する シンボルfundamental-modeです。 default-major-modenilなら、 メジャーモードはまえに選択していたバッファのモードと同じものとなります。

バッファのメジャーモードを変更しても、 Emacsが自動的に選択するメジャーモードに戻れます。 それには、コマンドM-x normal-modeを使います。 このコマンドは、メジャーモードを選択するために find-fileが呼び出す関数と同じ関数です。 この関数は、ファイル中にローカル変数リストがあればそれも処理します。

コマンドC-x C-wset-visited-file-nameは、 新しいファイル名がモードを示すものであるなら、 新しいメジャーモードに変更します(see Saving)。 しかし、バッファの内容がメジャーモードを指定していて、かつ、 ある『特別な』メジャーモードがそのモードの変更を許さないなら、 メジャーモードは変更されません。 change-major-mode-with-file-namenilに設定すると、 このモード変更機能をオフにできます。


Node:Indentation, Next:, Previous:Major Modes, Up:Top

字下げ

本章では、字下げ(indentation)を 付加/削除/調整するEmacsコマンドについて説明します。

<TAB>
モードに固有の方法で、現在行を『適切に』字下げする。
C-j
<RET>に続けて<TAB>を実行する(newline-and-indent)。
M-^
2つの行を連結して1つにする(delete-indentation)。 C-jの効果を取り消す。
C-M-o
ポイント位置で行を分割する。 つまり、行内のポイント以降のテキストは新たな行になり、かつ、 ポイント位置まで字下げする(split-line)。
M-m
現在行の空白でない最初の文字までポイントを (行末か行頭へ向かって)移動する(back-to-indentation)。
C-M-\
複数の行を同じ桁に字下げする(indent-region)。
C-x <TAB>
複数の行の塊を(右か左に)同じ量だけきっちり移動する (indent-rigidly)。
M-i
ポイント位置からあらかじめ設定したつぎのタブストップ位置まで字下げする (tab-to-tab-stop)。
M-x indent-relative
ポイント位置からまえの行の字下げ位置まで字下げする。

ほとんどのプログラム言語には、字下げの慣習があります。 Lispコードでは、括弧の入れ子の深さに従って行を字下げします。 細部はかなり異なりますが、概念的にはCコードでも同様の考え方で字下げします。

どんな言語であっても、行を字下げするには<TAB>コマンドを使います。 各メジャーモードでは、特定の言語に適した字下げを行うように、 このコマンドを定義します。 Lispモードでは、<TAB>は括弧の深さに応じて行を整列します。 行のどこで<TAB>を打鍵しても、その行全体を整列します。 Cモードでは、<TAB>は、 Cの構文上のさまざまな側面を考慮した巧みで洗練された 字下げスタイルを実現しています。

テキスト(text)モードでは、 <TAB>はtab-to-tab-stopコマンドを実行します。 これは、つぎのタブストップ位置まで字下げを行います。 タブストップ位置はM-x edit-tab-stopsで設定できます。


Node:Indentation Commands, Next:, Previous:Indentation, Up:Indentation

字下げコマンドとその技巧

行の字下げを飛び越えるには、M-mback-to-indentation)を使います。 行のどこで実行しても、その行の空白でない最初の文字位置にポイントを移動します。

現在行のまえに字下げした行を挿入するには、 C-a C-o <TAB>を使います。 現在行のあとに字下げした行を挿入するには、C-e C-jを使います。

単にタブ文字を挿入するには、C-q <TAB>と打ちます。

C-M-osplit-line)は、 ポイントから行末までのテキストを垂直に下ろします。 その結果、現在行は2つの行に分割されます。 C-M-oは、まず、ポイントの直後に空白やタブがある限りポイントを進めます。 そして、ポイントの直後に、 改行とポイント位置の桁までに必要な字下げを挿入します。 ポイント自身は挿入した改行の直前に留まります。 この点では、C-M-oC-oに似ています。

2つの行を連結するには、 コマンドM-^delete-indentation)を使います。 このコマンドは、現在行の行頭の字下げと行区切り(改行文字)を 削除して空白1個に置き換えます。 ただし、この空白1個を省いてしまう(Lispコードには便利な)特別な場合があります。 2つの行を繋げた結果、開き括弧や閉じ括弧が連続する場合、 あるいは、さらに改行が続く場合です。 現在行の字下げだけを削除するには、 行頭に移動してからM-\delete-horizontal-space)を使います。 このコマンドは、カーソル(ポイント)の周りの空白とタブをすべて削除します。

詰め込み接頭辞がある場合、M-^は、 削除される改行の直後に現れる詰め込み接頭辞を削除します。 See Fill Prefix

一度に複数の行の字下げを変更するコマンドもあります。 C-M-\indent-region)は、 リージョン内で始まるすべての行に作用します。 このコマンドは、行頭で<TAB>を打鍵したかのように 『普通の』方法で各行を字下げします。 数引数は字下げする桁位置を指定します。 つまり、最初の空白でない文字がその桁位置にくるように 行全体を右か左に水平移動します。 C-x <TAB>indent-rigidly)は、 リージョン内のすべての行を、 引数で指定した分だけ右に移動します(引数が負であれば左に移動)。 複数の行全部をきちっと揃えて(rigidly)横に移動することから、 コマンドにはこのような名前が付いています。

M-x indent-relativeは、先行する行(実際には空行でないいちばん近くの行)に 基づいてポイント位置を字下げします。 ポイント位置に空白を挿入してポイントを進めて、 ポイントが先行する行の字下げ位置の真下にくるようにします。 字下げ位置とは連続した白文字の末尾か行末のことです。 ポイントが先行する行のどの字下げ位置よりも右にある場合には、 ポイントのまえの白文字を削除してから、 先行する行の適用可能な最初の字下げ位置まで字下げします。 適用可能な字下げ位置がない場合には、 indent-relativetab-to-tab-stopを実行します

字下げテキスト(indented text)モードでは、 <TAB>はindent-relativeと定義されます。 See Text

テキストの一部を字下げする別の方法についてはSee Format Indentation


Node:Tab Stops, Next:, Previous:Indentation Commands, Up:Indentation

タブストップ

表を入力するには、テキスト(textモード)における<TAB>の定義、 tab-to-tab-stopを利用できます。 このコマンドは、ポイントがつぎのタブストップ位置に達するまで ポイントのまえに字下げを挿入します。 テキスト(text)モードでなくても、M-iでこのコマンドを実行できます。

M-iが使用するタブストップは任意に設定できます。 この設定は、昇順に並べた桁番号のリストとして tab-stop-listと呼ばれる変数に格納されます。

タブストップを設定する便利な方法は、 M-x edit-tab-stopsを使うことです。 このコマンドは、タブストップの設定を記述したバッファを作成して選択します。 このバッファを編集して今までとは異なるタブストップを指定し、 C-c C-cと打ってその新たな設定を有効にします。 edit-tab-stopsは、呼ばれたときのカレントバッファをあらかじめ 記録しておくので、そのバッファに新たなタブストップを設定します。 通常、全バッファで同じタブストップを共有しているので、 1つのバッファでタブストップを変更すると、すべてのバッファに影響をします。 しかし、あるバッファでtab-stop-listをローカルにしておくと、 そのバッファでedit-tab-stopsを実行するとローカルな設定を編集します。

一般的に使われる8桁ごとに設定されたタブストップの場合、 設定用バッファの内容はつぎのようになります。

        :       :       :       :       :       :
0         1         2         3         4
0123456789012345678901234567890123456789012345678
To install changes, type C-c C-c

1行目は、各タブストップ位置をコロンで表します。 残りの行は、タブストップ位置を読み取りやすくためや使い方です。

tab-to-tab-stopを制御するタブストップと、 バッファ内でのタブ文字の表示とは、関係がないことに注意してください。 詳細についてはSee Display Vars


Node:Just Spaces, Previous:Tab Stops, Up:Indentation

タブと空白

Emacsでは、通常、行の字下げにはタブと空白の両方を使用します。 しかし、空白だけを用いて字下げを行うことも可能です。 そうするには、変数indent-tabs-modenilを設定します。 この変数はバッファごとの変数です。 変数を変更してもカレントバッファだけに影響しますが、 デフォルト値を変更することもできます。 See Locals

空白以外のテキストの桁を保存したまま、タブを空白(あるいはその逆)に 変換するコマンドもあります。 M-x tabifyは、リージョン内の連続する空白を探して、 字下げを変えることがなければ少なくとも連続する3個の空白をタブに変換します。 M-x untabifyは、リージョン内のすべてのタブを 適切な個数の空白に変換します。


Node:Text, Next:, Previous:Indentation, Up:Top

自然言語用のコマンド

コンピュータの分野では、テキスト(text)という用語には 2つの大きな意味があります。 1つは、文字の列から成るデータのことです。 この意味からすれば、Emacsで編集するどんなファイルもテキストです。 もう1つの意味はより限定されていて、人間が読む自然言語の (テキスト整形処理後の場合もあるが)文字の列のことで、 プログラムやプログラムに与えるコマンドと対比されます。

自然言語には、エディタコマンドで支援したり利用したりできる構文的/様式的な 約束事があります。 たとえば、単語、文、段落、大文字といったものです。 本章では、これらを扱うEmacsコマンドについて述べます。 また、詰め込み(filling)、つまり、 段落の各行がほぼ同じ長さになるように再配置し直すコマンドについてもふれます。 単語、文、段落を横断してポイントを移動したり、 それらをキルするコマンドは、 自然言語テキストの編集を意図したものですが、プログラムの編集にも役立ちます。

Emacsには、自然言語テキストの編集用のメジャーモードがいくつかあります。 扱うテキストが純粋にテキストだけで単純なものであれば、 テキスト(text)モードを使いましょう。 これは、自然言語テキストの構文上の約束事を扱えるように、 Emacsを少しだけカスタマイズしてあります。 アウトライン(outline)モードには、 アウトライン構造を持つテキストを操作する特別なコマンドがあります。

テキスト整形コマンドを埋め込んだテキストに対しては、 特定のテキスト清書系ごとに別のメジャーモードが用意してあります。 たとえば、TeX用にはTeX nroff用にはnroffモードがあります。

テキスト清書系を使うかわりにエンリッチ(enriched)モードを使用すれば、 WYSIWYG(what you see is what you get、『見たとおりを得る』)スタイルで 整形済みテキストを編集することもできます。 つまり、Emacsの画面上で整形結果を見ながら編集できるわけです。


Node:Words, Next:, Up:Text

単語

Emacsには、単語を横断してポイントを移動したり、 単語を操作対象とするコマンドがあります。 慣例として、これらのコマンドのキーはメタ文字です。

M-f
単語を横断してポイントを前向きに移動する(forward-word)。
M-b
単語を横断してポイントを後向きに移動する(backward-word)。
M-d
ポイント位置から単語の末尾までをキルする(kill-word)。
M-<DEL>
ポイント位置から単語の先頭までを後向きにキルする (backward-kill-word)。
M-@
つぎの単語の末尾にマークを設定する(mark-word)。
M-t
隣接した2つの単語を入れ替える。 あるいは、単語を複数の単語を飛び越して移す。 (transpose-words)。

これらのキーは、文字単位の操作コマンド、C-fC-bC-d、<DEL>、C-tに対応していることに注目してください。 M-@も、C-<SPC>の別名であるC-@に対応しています。

コマンドM-fforward-word)と M-bbackward-word)は、 単語を横断してポイントを前向きに(末尾に向かって) あるいは後向きに(先頭に向かって)移動します。 これらのメタ文字は、文字単位でポイントを前後に移動する コントロール文字C-fC-bに類似しています。 この類似性は、数引数を反復回数として扱うことにもおよびます。 負の引数を指定すると、M-fは後向きに移動し、 M-bは前向きに移動します。 前向き移動では単語の最後の文字の直後に、 後向き移動では最初の文字の直前に、ポイントを移動します。 21

M-dkill-word)はポイントの直後の単語をキルします。 正確にいえば、ポイント位置からM-fによる移動位置までの全文字をキルします。 ポイントが単語の途中にあれば、ポイントよりあとの部分だけをキルします。 また、ポイントとつぎの単語のあいだに句読点があれば、 単語と一緒にそれらもキルします。 (つぎの単語だけをキルしてそのまえにある句読点を残したければ、 M-fでつぎの単語の末尾に移動してから、 M-<DEL>でその単語を後向きにキルする。) M-dは、引数をM-fと同様に解釈します。

M-<DEL>backward-kill-word)は、 ポイントの直前の単語をキルします。 ポイント位置からM-bによる移動位置までの全文字をキルします。 ポイントがFOO, BARの空白の直後にあるとすれば、 FOO, をキルします。 (FOOだけをキルしてコンマと空白を残したければ、 M-<DEL>のかわりにM-b M-dを使う。)

M-ttranspose-words)は、 ポイントの直前にある単語あるいはポイントを含む単語と、 後続の単語とを入れ替えます。 単語のあいだにある区切り文字は動きせん。 たとえば、FOO, BARを入れ替えると、 BAR FOO,ではなくBAR, FOOとなります。 入れ替えや入れ替えコマンドの引数については、 See Transpose

ポイントとマークのあいだに適用される操作を後続のn個の単語に適用する方法は、 2つあります。 ポイント位置にマークを設定してから、単語を横断してポイントを移動します。 あるいは、コマンドM-@mark-word)を使います。 このコマンドは、ポイントを移動せずに、 M-fによる移動位置にマークを設定します。 M-@には、何単語先にマークを設定するかを数引数で指定できます。 暫定マーク(transient-mark)モードでは、このコマンドはマークを活性にします。

単語操作コマンドが理解する構文は、すべて構文テーブルで制御されます。 たとえば、任意の文字を単語の区切り文字として宣言できます。 See Syntax


Node:Sentences, Next:, Previous:Words, Up:Text

Emacsの文/段落操作コマンドは、単語操作コマンドと同じく、 ほとんどメタキーです。

M-a
文の先頭にポイントを後向きに移動する(backward-sentence)。
M-e
文の末尾にポイントを前向きに移動する(forward-sentence)。
M-k
ポイント位置から文末までを前向きにキルする (kill-sentence)。
C-x <DEL>
ポイント位置から文頭までを後向きにキルする (backward-kill-sentence)。

コマンドM-aM-ebackward-sentenceforward-sentence)は、 それぞれ、ポイントを含む文の先頭あるいは末尾にポイントを移動します。 これらは、行頭や行末にポイントを移動するコマンドC-aC-eに 類似するように選ばれました。 ただし、M-aM-eを反復して使ったり数引数を指定すると、 ポイントは連続した文を横断して移動する点が違います。

(文頭に向かって)後向きに移動するときは、 文の先頭の文字の直前にポイントを置きます。 (文末に向かって)前向きに移動するときは、 文を終える句読点の直後に置きます。 どちらのコマンドも、文と文の境界にある白文字に ポイントを移動することはありません。

C-aC-eには調和したキルコマンドC-kがあるように、 M-aM-eにもコマンドM-kkill-sentence)があります。 これはポイントから文末までをキルします。 引数に-1を指定すると、文頭までを後向きにキルします。 これより大きな引数は反復回数になります。 また、ポイント位置から文頭までを後向きにキルするコマンドとして C-x <DEL>backward-kill-sentence)もあります。 このコマンドは、文の作成途中で考えが変わったときに便利です。

文操作コマンドでは、文末に空白を2個打つという米国のタイピストの習慣を 踏襲しているものと仮定します。 つまり、.?!の直後が行末であるか空白が2個続けば、 その箇所を文末とみなします。 ただし、.?!の直後には、 )]'"がいくつあってもかまいません。 また、段落の先頭と末尾も、それぞれ、文の先頭と末尾になります。

変数sentence-endで、文末の識別方法を制御します。 この値は、文末の数個の文字とそれらに続く白文字に一致する正規表現です。 通常の値はつぎのとおりです。 22

"[.?!][]\"')]*\\($\\|\t\\|  \\)[ \t\n]*"

この例は、正規表現の節で説明しました。 See Regexps

文のあいだには空白を1個だけとしたければ、 sentence-endにはつぎの値を設定します。

"[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*"

同時に、変数sentence-end-double-spaceにはnilを設定して、 詰め込みコマンドにも、文末には空白が1個だけあり、また、 文末には空白を1個だけ追加することを指示します。 ただし、このように設定すると、 文末のピリオドと省略のピリオドとを区別できなくなることに注意してください。


Node:Paragraphs, Next:, Previous:Sentences, Up:Text

段落

段落を操作するEmacsコマンドもメタキーです。

M-{
まえの段落の先頭にポイントを後向きに移動する(backward-paragraph)。
M-}
つぎの段落の末尾にポイントを前向きに移動する(forward-paragraph)。
M-h
ポイントを含む段落かつぎの段落の周りにポイントとマークを置く (mark-paragraph)。

M-{は、ポイントを含む段落の先頭か、 まえの段落の先頭にポイントを移動します。 一方、M-}は、ポイントを含む段落の末尾か、 つぎの段落の末尾にポイントを移動します。 段落は、空行やテキスト整形コマンドの行で区切られますが、 それらの行自体は段落には属しません。 基本(fundamental)モードでは、 字下げした行も新たな段落の始まりとみなしますが、 テキスト(text)モードではそうしません。 (段落の直前に空行があれば、 これらのコマンドはそれらを段落の先頭として扱う。)

プログラム用のメジャーモードでは、段落は空行で始まり空行で終ります。 こうしておけば、本来段落を持たないプログラムでも 段落操作コマンドが役立ちます。

詰め込み接頭辞がある場合には、接頭辞で始まらない行が段落の区切りとなります。 See Filling

段落を対象に操作したいときには、 コマンドM-hmark-paragraph)を使って 段落を囲むようなリージョンを設定します。 したがって、たとえば、M-h C-wとすると、 ポイントを含むか直後の段落を削除します。 M-hコマンドは、ポイントを含む段落の先頭にポイントを置き、 末尾にマークを設定します。 暫定マーク(transient-mark)モードでは、このマークを活性にします。 ポイントが段落のあいだ(空行や境界)にある場合は、 ポイントの直後にある段落の周りにポイントとマークを設定します。 段落の1行目のまえに空行があれば、 直前の空行1行もM-hが設定するリージョンに含まれます。

正確な段落の境界は、変数paragraph-separateparagraph-startで定義されます。 paragraph-startの値は、 段落を始めたり区切ったりする行に一致する正規表現です。 paragraph-separateの値も別の正規表現ですが、 どの段落にも属さない段落を分割する行(たとえば空行)だけに一致するものです。 新たな段落を始めてその段落に属す行は、paragraph-startだけに一致して、 paragraph-separateに一致してはいけません。 たとえば、基本(fundamental)モードでは、 paragraph-start"[ \t\n\f]"であり、 paragraph-separate"[ \t\f]*$"です。

通常、ページ境界でも段落が区切られるのが望ましいです。 これらの変数のデフォルト値は、ページの一般的な区切り文字も認識します。


Node:Pages, Next:, Previous:Paragraphs, Up:Text

ページ

ファイルをページ送り文字(ASCIIコードのコントロールL、8進コードの014) で区切ったページの集まりとして捉えることがよくあります。 ファイルを印刷すると、この文字は改ページを行います。 そのため、ファイル内の各ページは別々の用紙に印刷されます。 ほとんどのEmacsコマンドは、ページを区切る文字を他の文字と同様に扱いますから、 C-q C-lでページ送り文字を挿入したり、<DEL>で削除できます。 つまり、ファイルをページに区切るのも区切らないのも自由です。 しかし、ページはファイルを分割する意味ある単位なので、 Emacsには、ページ間の移動やページを対象とするコマンドがあります。

C-x [
まえのページ境界にポイントを移動する(backward-page)。
C-x ]
つぎのページ境界にポイントを移動する(forward-page)。
C-x C-p
このページ(か別のページ)の周りに、ポイントとマークを置く (mark-page)。
C-x l
このページの行数を数える(count-lines-page)。

C-x [backward-page)コマンドは、 まえのページ区切り文字の直後にポイントを移動します。 ポイントがすでにページ区切りの直後にあれば、 さらにまえのページ区切り文字の直後に移動します。 数引数は反復回数として扱われます。 C-x ]forward-page)コマンドは、 つぎのページ区切り文字の直後にポイントを移動します。

C-x C-pコマンド(mark-page)は、 ページの先頭にポイントを置き、末尾にマークを設定します。 末尾にあるページ区切り文字は含まれます (マークはページ区切り文字の直後にある)。 先頭にあるページ区切り文字は除外されます (ポイントはページ区切り文字の直後にある)。 C-x C-p C-wは、ページ全体をキルして別の場所に 移動するのに便利な方法です。 C-x [C-x ]で別のページ区切り位置に移動してから キルしたページをヤンクすれば、 すべてのページが適切に区切られた状態が維持されます。 C-x C-pが末尾のページ区切り文字だけを含める理由は、 これを保証するためです。

C-x C-pへの数引数は、現在のページを基準にして ポイントの移動先のページを指定します。 0は現在のページを意味します。 1はつぎのページ、-1はまえのページを意味します。

C-x lコマンド(count-lines-page)は、 ページをどこで2つに分割するかを決めるのに便利です。 現在のページについて、総行数、現在行のまえにある行数とうしろにある行数を つぎのようにエコー領域に表示します。

Page has 96 lines (72+25)

この例で、総行数が1だけ少ないことに注意してください。 ポイントが行頭にないとつねにこうなります。

変数page-delimiterはページの始まりを制御します。 この変数の値は、ページを区切る行の先頭に一致する正規表現です。 この変数の通常の値は"^\f"で、 行頭のページ送り文字に一致します。


Node:Filling, Next:, Previous:Pages, Up:Text

テキストの詰め込み

テキストの詰め込み(filling)とは、 指定した幅に納まるようにテキストを行に分割することです。 Emacsには、詰め込む方法が2つあります。 自動詰め込み(auto-fill)モードでは、 自己挿入文字でテキストを挿入すると同時に詰め込みを行います。 あるいは、詰め込まずにテキストを編集しているときには、 陽に詰め込みコマンドを使います。 整形済みテキストを編集しているときは、 テキストの各部分ごとに詰め込みのスタイルを指定できます (see Formatted Text)。


Node:Auto Fill, Next:, Up:Filling

自動詰め込みモード(auto-fillモード)

自動詰め込み(auto-fill)モードはマイナモードで、 行が長くなりすぎると自動的に分割します。 <SPC>や<RET>を打鍵したときだけ、行を分割します。

M-x auto-fill-mode
自動詰め込み(auto-fill)モードをオンにしたりオフにする。
<SPC>
<RET>
自動詰め込み(auto-fill)モードでは、 適切な場合には行を分割する。

M-x auto-fill-modeは、 自動詰め込み(auto-fill)モードがオフならばオンにし、 オンならばオフにします。 正の数引数を指定すると自動詰め込み(auto-fill)モードをつねにオンにしますが、 負の引数を指定するとつねにオフにします。 モード行の括弧の中にFillと表示されていれば、 このモードはオンになっています。 自動詰め込み(auto-fill)モードは、 各バッファごとにオン/オフできるマイナモードです。 See Minor Modes

自動詰め込み(auto-fill)モードでは、 行が決められた幅より長くなると、自動的に空白の位置で行を分割します。 行の分割と再配置は、<SPC>か<RET>を打鍵したときだけ行われます。 行を分割せずに空白や改行を挿入するには、 C-q <SPC>C-q C-jと打鍵します (改行はまさにコントロールJであることを思い出してほしい)。 C-oも行を分割せずに改行を挿入します。

自動詰め込み(auto-fill)モードは、<TAB>で新たな行を字下げするので、 プログラム言語用のモードと組み合わせてもうまく動作します。 コメントで終わる行が長くなりすぎた場合には、 コメント内のテキストを2つのコメント行に分割します。 始めの行の末尾とつぎの行の行頭に新たにコメントの区切り文字列を挿入して、 2つの独立したコメント行にすることもできます。 この付加機能は、変数comment-multi-lineで制御します (see Comments)。

適応型詰め込み(後述)は、明示した詰め込みコマンドのみならず、 自動詰め込みに対しても有効に働きます。 これは、段落の先頭行あるいは第2行目から、 自動的に詰め込み接頭辞を切り出します。

自動詰め込み(auto-fill)モードは、段落全体を詰め直すことはしません。 行を分割できても、併合はできません。 そのため、段落の途中を編集すると、必ずしも段落を正しく詰め込めません。 段落をふたたび適切に詰め込まれた状態にするもっとも簡単な方法は、 明示的に詰め込みコマンドを使用することです。

多くのユーザーは自動詰め込み(auto-fill)モードを好み、 あらゆるテキストファイルの編集に使用しようとします。 初期化ファイルの節では、こうする方法を説明します。 See Init File


Node:Fill Commands, Next:, Previous:Auto Fill, Up:Filling

明示的な詰め込みコマンド

M-q
現在の段落を詰め込む(fill-paragraph)。
C-x f
詰め込み桁を設定する(set-fill-column)。
M-x fill-region
リージョン内の各段落を詰め込む(fill-region)。
M-x fill-region-as-paragraph
リージョン全体を1つの段落とみなして詰め込む。
M-s
行を中央に揃える。

段落を詰め直すには、コマンドM-qfill-paragraph)を使います。 ポイントを含む段落、あるいは、 ポイントが段落のあいだにある場合には直後の段落を操作します。 改行をすべて取り除いてから、必要な箇所に新たに改行を挿入することで 段落を詰め直します。

いくつもの段落を詰め直すには、M-x fill-regionを使います。 これは、リージョンを段落に分けてから、各段落を詰め込みます。

M-qfill-regionは、M-hと同じ基準で段落の境界を 探します(see Paragraphs)。 段落の大きさを制御するには、M-x fill-region-as-paragraphを使います。 これは、ポイントとマークのあいだにあるものすべてを詰め直します。 このコマンドはリージョン内の空行をすべて削除して、 分かれていたテキストの塊を1つの塊にまとめ上げます。

M-qに数引数を指定すると、テキストの詰め込みだけでなく、 テキストの幅揃え(justify)も行います。 つまり、余分に空白を挿入して、行の右端が詰め込み桁に一致するようにします。 余分な空白を取り除くには、引数を指定しないでM-qを使います。 (fill-regionも同様。) 幅揃えを制御して別の詰め込みスタイルを選択する別の方法は、 テキスト属性justificationを使うことです。 これに関しては、Format Justificationを参照してください。

コマンドM-scenter-line)は、 詰め込み桁までの範囲内で現在行を中央に揃えます。 引数nを指定すると、 現在行を含めn行をそれぞれ独立に中央に揃えてから、 揃えた行のつぎにポイントを移動します。

詰め込むときの行の最大幅は、変数fill-columnに入っています。 fill-columnの値を変更すると、 カレントバッファにローカルな変数になります。 それまではデフォルト値が有効です。 デフォルト値は始めは70です。 See Localsfill-columnを設定するもっとも簡単な方法は、 コマンドC-x fset-fill-column)を使うことです。 このコマンドに数引数を指定すると、 その値を新たな詰め込み桁として使います。 C-uだけを引数に指定すると、 ポイントの現在の水平位置をfill-columnに設定します。

Emacsコマンドは通常、 ピリオドの直後に空白が2個あるか改行があれば文末として扱います。 ピリオドの直後に空白が1個だけでは、文末ではなく省略とみなします。 ピリオドのこれら2つの用法の違いを保存するために、 ピリオドの直後に空白が1個だけの箇所では詰め込みコマンドは行を分割しません。

変数sentence-end-double-spacenilならば、 詰め込みコマンドは、文末には空白が1個だけあると仮定し、かつ、 文末には空白を1個だけ残します。 普通、この変数の値はtなので、 上述のように空白が2個ある場合だけを文末として扱います。 See Sentences

colon-double-spacenil以外ならば、 詰め込みコマンドはコロンのうしろに空白を2個置きます。


Node:Fill Prefix, Next:, Previous:Fill Commands, Up:Filling

詰め込み接頭辞

各行が(段落を字下げする数個の空白などの)特別の印で始まっている 段落を詰め込むには、詰め込み接頭辞(fill prefix)の機能を使えます。 詰め込み接頭辞は文字列であり、 Emacsはすべての行がその文字列で始まると仮定しますが、 詰め込み接頭辞自体は詰め込みの対象ではありません。 明示的に詰め込み接頭辞を指定できますが、 Emacsが詰め込み接頭辞を自動的に推測することもできます (see Adaptive Fill)。

C-x .
詰め込み接頭辞を設定する(set-fill-prefix)。
M-q
現在の詰め込み接頭辞を使って、段落を詰め込む(fill-paragraph)。
M-x fill-individual-paragraphs
字下げ幅の変化を新たな段落の始まりとみなして、リージョン内を詰め込む。
M-x fill-nonuniform-paragraphs
段落を分割する行だけを新たな段落の始まりとみなして、リージョン内を詰め込む。

詰め込み接頭辞を指定するには、 目的の接頭辞で始まっている行に移動して接頭辞の直後にポイントを置いてから、 コマンドC-x .set-fill-prefix)を実行します。 C-xのあとはピリオドです。 詰め込み接頭辞の使用をやめるには、空の接頭辞を設定します。 つまり、行頭にポイントを置いてからC-x .と打ちます。

詰め込み接頭辞が設定されている場合、 詰め込みコマンドは処理に先だって各行から詰め込み接頭辞を取り除き、 詰め込みを行ったあとに各行に挿入します。 自動詰め込み(auto-fill)モードでも、 新たに行を作成するときに自動的に詰め込み接頭辞を挿入します。 行頭でC-oコマンド(see Blank Lines)を使用すると、 新たに作成する行にも詰め込み接頭辞を挿入します。 逆に、コマンドM-^は、 削除する改行の直後に詰め込み接頭辞があると接頭辞も削除します (see Indentation)。

たとえば、fill-columnが40で詰め込み接頭辞が;; のときに、 つぎのテキストでM-qを実行します。

;; This is an
;; example of a paragraph
;; inside a Lisp-style comment.

結果はつぎのようになります。

;; This is an example of a paragraph
;; inside a Lisp-style comment.

M-qおよび段落コマンドは、 詰め込み接頭辞で始まらない行を段落の始まりとみなします。 これにより、ぶら下がり字下げ(先頭行を除いてすべての行が字下げ) された段落も正しく詰め込みます。 空行や接頭辞を取りさると字下げした行になる行も、 段落の区切りや始まりとみなします。 これによって、各行にコメント区切りがある複数段落のコメントを 書いているときにも、望みどおりの結果を得られます。

各段落に対して自動的に詰め込み接頭辞を設定するには、 M-x fill-individual-paragraphsを使います。 このコマンドは、字下げ幅の変化を新たな段落の始まりとみなして、 リージョンを段落に分割したあと、各段落を詰め込みます。 つまり、1つの『段落』内の行はどれも同じ字下げ幅です。 字下げ幅が、段落に対する詰め込み接頭辞として働きます。

M-x fill-nonuniform-paragraphsも同様なコマンドですが、 リージョンを段落に分割する方法が異なります。 このコマンドは、(変数paragraph-separateで定義される) 段落区切り行だけを新たな段落の始まりとみなします。 つまり、各段落の行はさまざまに字下げされているかもしれないので、 その中の最少の字下げを詰め込み接頭辞として使用するわけです。 段落の最初の行の字下げが残りの行に比べて多くても少なくても、 正しい詰め込み結果を得られます。

詰め込み接頭辞は変数fill-prefixに格納されます。 この値は文字列であるか、詰め込み接頭辞が設定されていなければnilです。 この変数を変更してもカレントバッファだけに影響しますが、 デフォルト値を変更することもできます。 See Locals

テキスト属性indentationは、 段落に与える字下げ幅を調整する別の方法です。 See Format Indentation


Node:Adaptive Fill, Previous:Fill Prefix, Up:Filling

適応型詰め込み

詰め込みコマンド自身が、 段落に対する適切な詰め込み接頭辞を推測できる状況もあります。 段落のすべての行の先頭に白文字やある種の句読点文字が使われている場合です。

段落が2行以上から成る場合、 段落の2行目から詰め込み接頭辞を切り出しますが、 1行目にもそれが現れるときに限ります。

段落が1行だけの場合には、その行から詰め込み接頭辞を切り出す かもしれません 23。 こういった状況では、つぎのような3つの合理的な挙動が考えられるので、 接頭辞の決定は複雑です。

これら3つの整形スタイルは、いずれも一般的に使用されます。 そこで、詰め込みコマンドは、現れた接頭辞とそのときのメジャーモードに基づいて、 ユーザーが望むスタイルを決定しようとします。 判断基準はつぎのとおりです。

1行目でみつけた接頭辞がadaptive-fill-first-line-regexpに一致するか、 (メジャーモードに依存する)コメント開始文字列のようであれば、 みつけた接頭辞を段落の詰め込みに用います。 ただし、その接頭辞が後続の行に対して段落の始まりにならない場合に限ります。

さもなければ、みつけた接頭辞を相当分の空白に変換して、 それらの空白を段落の2行目以降の詰め込み接頭辞として使います。 ただし、それらの空白が後続の行に対して段落の始まりにならない場合に限ります。

テキスト(text)モード、および、 空行やページ区切りだけが段落を区切るモードでは、 適応型詰め込みによって選ばれた接頭辞が 段落の始まりになることはけっしてありませんから、 その接頭辞を段落の詰め込みに使用することができます。

変数adaptive-fill-regexpで、 行頭のどんな文字列を詰め込み接頭辞として使えるかを決定します。 この変数の正規表現に一致する行頭の文字列を接頭辞とします。 変数adaptive-fill-modenilを設定すると、 詰め込み接頭辞を自動的には切り出しません。

変数adaptive-fill-functionに関数を設定すると、 詰め込み接頭辞を自動的に切り出すためのより複雑な方法を指定できます。 この関数は行の左端の直後にポイントを置いて呼び出されます。 その行から類推される適切な詰め込み接頭辞を返さなくてはいけません。 その行に詰め込み接頭辞がなさそうであればnilを返します。


Node:Case, Next:, Previous:Filling, Up:Text

大文字小文字変換コマンド

Emacsには、単語や任意の長さのテキストを 大文字あるいは小文字に変換するコマンドがあります。

M-l
後続の単語を小文字に変換する(downcase-word)。
M-u
後続の単語を大文字に変換する(upcase-word)。
M-c
後続の単語の1文字目だけを大文字にする(capitalize-word)。
C-x C-l
リージョン内のテキストを小文字に変換する(downcase-region)。
C-x C-u
リージョン内のテキストを大文字に変換する(upcase-region)。

単語変換コマンドはたいへん便利です。 M-ldowncase-word)は ポイントの直後の単語を小文字に変換し、 単語の末尾にポイントを移動します。 したがって、M-lを繰り返すと、連続した単語を変換できます。 M-uupcase-word)は単語を大文字に変換し、 M-ccapitalize-word)は単語の1文字目を 大文字して残りを小文字に変換します。 これらのコマンドに引数を指定すると、一度に数単語を変換できます。 これらのコマンドは、大文字だけの大量のテキストを 大文字小文字が混在するように変換するときに、特に威力を発揮します。 というのは、必要に応じてM-lM-uM-cを使い分けて移動したり、M-fで変換せずに単語を 飛び越えられるからです。

負の引数を指定すると、ポイントの直前にある数個の単語を変換しますが、 ポイントは移動しません。 これは、大文字小文字をまちがえて単語を入力した直後には便利です。 大文字小文字変換コマンドを打ってからすぐに入力を再開できます。

単語の途中で大文字小文字変換コマンドを実行すると、 ポイントのうしろにある部分だけを変換します。 これはM-dkill-word)のふるまいと同じです。 また、負の引数を指定すると、ポイントよりまえの部分を変換します。

他の大文字小文字変換コマンドは、 C-x C-uupcase-region)と C-x C-ldowncase-region)です。 これらは、リージョン内のテキストを指定どおりに変換します。 ポイントもマークも移動しません。

リージョンに対する大文字小文字変換コマンドである upcase-regiondowncase-regionは、 通常、使用禁止になっています。 つまり、これらのコマンドを使おうとすると、最初に確認を求めてきます。 確認するときにコマンドを使用可にしておけば、つぎからは確認を求めてきません。 See Disabling


Node:Text Mode, Next:, Previous:Case, Up:Text

テキストモード(textモード)

自然言語テキストのファイルを編集するときには、 基本(fundamental)モードではなく テキスト(text)モードを使ったほうが便利です。 テキスト(text)モードに入るにはM-x text-modeと打ちます。

テキスト(text)モードでは、空行とページ区切りだけが段落の区切りです。 その結果、段落を字下げできて、 適応型詰め込みでは段落の詰め込みに使用する字下げを決定できます。 See Adaptive Fill

テキスト(text)モードでは、<TAB>は indent-relative(see Indentation)を実行するように 定義してあるので、先行する行と同じように字下げするのに便利です。 先行する行が字下げされてなければ、 indent-relativetab-to-tab-stopを実行します。 これは、ユーザーが設定したEmacsのタブストップを使います(see Tab Stops)。

テキスト(text)モードでは、コメントに関する機能は、 陽に起動した場合を除いてオフです。 ピリオドは単語の一部ではなく、一方、 アポストロフ、バックスペース、下線は単語の一部である、 となるように構文テーブルを変更します。

段落の最初の行を字下げするのであれば、テキスト(text)モードではなく 段落字下げ型テキスト(paragraph-indent-text)モードを使うべきです。 このモードでは、段落のあいだに空行を設ける必要はありません。 というのは、最初の行の字下げで、段落の始まりがわかるからです。 ただし、すべての行が字下げされている段落は扱えません。 このモードに入るには、M-x paragraph-indent-text-modeを使います。

テキスト(text)モード、および、 テキスト(text)モードに基づくすべてのモードでは、 M-<TAB>をコマンドispell-complete-wordとして定義します。 このコマンドは、ポイントの直前の部分的な単語を綴り辞書を用いて補完します。 See Spelling

テキスト(text)モードに入ると、フックtext-mode-hookを実行します。 テキスト(text)モードに関連する他のモードも、このフックに続けて 各モード専用のフックを実行します。 つまり、段落字下げ型テキスト(paragraph-indent-text)モード、 nroffモード、TeXモード、アウトライン(outline)モード、 メイル(mail)モードがそうです。 text-mode-hookに登録されたフック関数では、 major-modeの値を調べれば実際にどのモードに入ったかわかります。 See Hooks


Node:Outline Mode, Next:, Previous:Text Mode, Up:Text

アウトラインモード(outlineモード)

アウトライン(outline)モードはテキスト(text)モードにたいへん よく似たメジャーモードですが、アウトライン構造を持つテキストの編集用です。 アウトライン構造を把握できるようにテキストの一部を一時的に不可視にできます。 カレントバッファのメジャーモードをアウトライン(outline)モードに 切り替えるには、M-x outline-modeと打ちます。

アウトライン(outline)モードで行を不可視にすると、 その行は画面上に表示されません。 画面上では、不可視にした行が削除されたかのように見えますが、 それに先行する可視な行の末尾に省略記号(ピリオドが3つ...)が表示されます (何行不可視にしていても、省略記号は1つだけ)。

C-nC-pのような行を対象とした編集コマンドは、 不可視にした行のテキストを、先行する可視な行の一部であるかのように扱います。 改行も含めて可視な行全体をキルすると、後続の不可視な行も一緒にキルします。

アウトラインマイナ(outline-minor)モードは、 メジャーモードであるアウトライン(outline)モードと 同じコマンドを提供しますが、他のメジャーモードと一緒に使用できます。 カレントバッファでアウトラインマイナ(outline-minor)モードをオンにするには、 M-x outline-minor-modeと打ちます。 mode: outline-minorといった形のファイルにローカルな変数で、 テキストファイルにアウトラインマイナ(outline-minor)モードを 指定することもできます(see File Variables)。

メジャーモードであるアウトライン(outline)モードでは、 プレフィックスC-cに特別なキーバインディングを設定しています。 アウトラインマイナ(outline-minor)モードでは、 C-c @をプレフィックスとして同様のバインディングがあります。 これは、一緒に用いるメジャーモードの特別なコマンドとの衝突を 減らすための措置です。 (変数outline-minor-mode-prefixで、 実際に使用するプレフィックスを制御する。)

アウトライン(outline)モードに入ると、 フックtext-mode-hookに続けてフックoutline-mode-hookを 実行します(see Hooks)。


Node:Outline Format, Next:, Up:Outline Mode

アウトラインの形式

アウトライン(outline)モードは、 バッファの中には2種類の行、つまり、 見出し行(heading lines)、本体行(body lines) があると仮定します。 見出し行は、アウトラインのトピックを表していて、 1つ以上の星印で始まります。 星印の個数は、アウトライン構造における見出しの深さを表します。 つまり、星印1つの見出し行は主要なトピックを表します。 この行とつぎの星印1個の行のあいだにある星印2個の見出し行は、 この行の下位トピックです。 星印がいくつであってもこのような関係が成り立ちます。 見出し行以外は本体行です。 これらは直前の見出し行に属します。 以下に例を示します。

* Food
This is the body,
which says something about the topic of food.

** Delicious Food
This is the body of the second-level header.

** Distasteful Food
This could have
a body too, with
several lines.

*** Dormitory Food

* Shelter
Another first-level topic with its header line.

見出し行とそれに続く本体行をまとめて項目(entry)と呼びます。 また、見出し行と、それに続くさらに深いレベルの見出し行とそれらの本体行を まとめて部分木(subtree)と呼びます。

変数outline-regexpに値を設定して、 見出し行を判定する基準をカスタマイズできます。 この正規表現に行頭が一致する行を見出し行とみなします。 (左端からではなく)行の途中で一致するものは、無視します。 一致したテキストの長さによって、見出しのレベルを決定します。 一致したテキストが長いほどレベルが深くなります。 したがって、たとえば、清書系に章や節を分ける @chapter@section@subsectionといった コマンドがある場合、これらの行を見出しとして扱えばよいのですが、それには outline-regexp"@chap\\|@\\(sub\\)*section"と設定します。 これには、ちょっとしたトリックがあります。 2つの単語、chaptersectionは同じ長さですが、 正規表現では、chapだけに一致するように定義することで、 章見出しに一致するテキストの長さのほうを短くできます。 これによって、アウトライン(outline)モードは、 章(chapter)の中に節(section)が含まれるとわかるのです。 他のコマンドが@chapで始まらない限り、この設定は有効です。

変数outline-levelを設定すると、見出し行のレベル計算方法を変更できます。 outline-levelの値は、引数を取らない、 現在の見出しのレベルを返す関数である必要があります。 Cモード、nroffモード、Emacs Lispモードといったメジャーモードのいくつかでは、 アウトラインマイナ(outline-minor)モードが有効に働くように、 この変数を設定します。


Node:Outline Motion, Next:, Previous:Outline Format, Up:Outline Mode

アウトライン上での移動コマンド

アウトライン(outline)モードには、 前後の見出し行に移動する特別なコマンドがあります。

C-c C-n
つぎの可視な見出し行にポイントを移動する (outline-next-visible-heading)。
C-c C-p
まえの可視な見出し行にポイントを移動する (outline-previous-visible-heading)。
C-c C-f
ポイント位置と同じレベルのつぎの可視な見出し行にポイントを移動する (outline-forward-same-level)。
C-c C-b
ポイント位置と同じレベルのまえの可視な見出し行にポイントを移動する (outline-backward-same-level)。
C-c C-u
より浅い(より多くの項目を含む)レベルで、 可視な見出し行にポイントを移動する(outline-up-heading)。

C-c C-noutline-next-visible-heading)は、 つぎの見出し行にポイントを移動します。 C-c C-poutline-previous-visible-heading)も同様ですが、 逆向きにポイントを移動します。 どちらのコマンドも、数引数を反復回数として受け取ります。 コマンドの名前は、不可視な見出し行を飛び越えることを強調していますが、 これは何も特別な機能ではありません。 行を探すようなすべての編集コマンドは、不可視な行を自動的に無視します。

もっと強力な移動コマンドは、見出しのレベル構造を把握して移動を行うものです。 C-c C-foutline-forward-same-level)と C-c C-boutline-backward-same-level)は、 アウトライン構造中で同じレベルにある別の見出し行にポイントを移動します。 C-c C-uoutline-up-heading)は、 より浅いレベルの見出し行へ戻るようにポイントを移動します。


Node:Outline Visibility, Next:, Previous:Outline Motion, Up:Outline Mode

アウトラインの可視/不可視制御コマンド

アウトライン(outline)モードの特別なコマンドとして、 行を可視/不可視にするものもあります。 これらのコマンドの名前は、すべてhideあるいはshowで始まります。 これらのほとんどは、逆の機能のコマンドと対になっています。 これらのコマンドはアンドゥ可能ではありませんが、 実行直後ならば戻すことはできます。 行を可視/不可視にするのは、アンドゥ機構に単純に記録するのではありません。

C-c C-t
バッファ中の本体行をすべて不可視にする(hide-body)。
C-c C-a
バッファ中のすべての行を可視にする(show-all)。
C-c C-d
ポイント位置の見出し行を除いて、 その下位レベルのすべてを不可視にする(hide-subtree)。
C-c C-s
ポイント位置の見出し行、本体、下位の見出し/本体、 すべてを可視にする(show-subtree)。
C-c C-l
ポイント位置の見出し行の本体と 下位の見出し行のすべての本体を不可視にする (hide-leaves)。
C-c C-k
ポイント位置の見出し行の下位の見出し行をすべて可視にする (show-branches)。
C-c C-i
ポイント位置の見出し行の直下(1レベル深い)の下位見出しを 可視にする(show-children)。
C-c C-c
ポイント位置の見出し行の本体を不可視にする(hide-entry)。
C-c C-e
ポイント位置の見出し行の本体を可視にする(show-entry)。
C-c C-q
最上位のnレベルまでを除き、すべてを不可視にする (hide-sublevels)。
C-c C-o
ポイント位置の見出し行や本体、および、 そこから最上位レベルに至るまでに通過する見出し行を除き、 すべて不可視にする(hide-other)。

C-c C-chide-entry)と C-c C-eshow-entry)の2つのコマンドは、 正反対の機能を持っています。 これらは、見出し行にポイントがある場合 24 に、その本体のみに作用します。 下位見出しとその本体は影響を受けません。

もっと強力で機能が正反対のコマンドは、 C-c C-dhide-subtree)と C-c C-sshow-subtree)です。 どちらも見出し行にポイントがあるとき 25 に使い、 見出しの部分木内のすべての行 つまり、本体、直接/間接に関わらずあらゆる下位の見出しとその本体、 に作用します。 つまり、部分木には、その見出し行に続く つぎの同レベルか上位レベルの見出し行の直前までが含まれます。

可視な部分木と、すべて不可視な部分木の中間的な状態には、 本体は不可視で下位の見出し行はすべて可視といったものも存在します。 この状態を作り出すコマンドは2つあり、 本体を不可視にするか、下位見出しを可視にするかです。 これらは、C-c C-lhide-leaves)と C-c C-kshow-branches)です。

C-c C-ishow-children)は、 show-branchesより少し弱いコマンドです。 これは、直下の、つまり1レベル深い見出し行だけを可視にします。 より深いレベルの見出しは不可視ならば不可視のままです。

ファイル全体に効果がおよぶ2つのコマンドがあります。 C-c C-thide-entry)は本体行をすべて不可視にするので、 アウトライン構造だけを眺めることができます。 C-c C-ashow-all)は、すべての行を可視にします。 C-c C-aは本体行以外にも作用しますが、 これらのコマンドは正反対の機能の対と考えることができます。

コマンドC-c C-qhide-sublevels)は、 最上位レベルの見出し以外をすべて不可視にします。 数引数nを指定すると、最上位からnレベルまでの見出し行を除いた すべてを不可視にします。

コマンドC-c C-ohide-other)は、 ポイント位置の見出しあるいは本体、その親( アウトライン構造においてポイント位置から最上位レベルまで至る見出し)を 除いたすべてを不可視にします。

変数selective-display-ellipsesnilを設定すると、 可視な行の末尾に現れる省略記号を消せます。 そうすると、不可視な行の存在を示すものは何もなくなります。

インクリメンタルサーチでアウトライン(outline)モードが 不可視にしているテキストを探しだすと、バッファのその部分は可視になります。 その箇所で探索から抜けると、テキストは可視のまま 26になります。


Node:Outline Views, Previous:Outline Visibility, Up:Outline Mode

複数の視点からアウトラインを眺める

1つのアウトライン構造を同時に2つの視点から別々のウィンドウに表示して 眺めることができます。 それには、M-x make-indirect-bufferを使って 間接バッファを作成する必要があります。 このコマンドの最初の引数は、既存のアウトライン用バッファの名前で、 2番目の引数は新たに作成する間接バッファの名前です。 See Indirect Buffers

間接バッファがあるならば、C-x 4 bや他のEmacsコマンドで普通に そのバッファをウィンドウに表示できます。 テキストの一部を可視/不可視にするアウトライン(outline)モードのコマンドは、 各バッファで独立に働きます。 その結果、各バッファごとに独自の視点を持たせることが可能です。 同じアウトラインに対して3つ以上の視点が必要ならば、 間接バッファをさらに作成してください。


Node:TeX Mode, Next:, Previous:Outline Mode, Up:Text

TeXモード

TeXは、Donald Knuthが作成した強力な清書系です。 しかも、GNU Emacsと同じくフリーです。 LaTeXは、TeXの入力形式を単純化したもので、 TeXのマクロで実現されています。 これもTeXに付属しています。 SliTeXはスライドを作成するためにLaTeXを特殊化したものです。

Emacsには、TeXの入力ファイルを編集するための特別なTeXモードがあります。 このモードには、区切りの対応を検査したり、 ファイル全体やその一部に対してTeXを起動したりする機能があります。

TeXモードには3つの変種があります。 それぞれ、プレインTeX(plain-tex)モード、 LaTeX(latex)モード、SliTeX(slitex)モードです (これら3つはメジャーモードですが、差異はわずか)。 これらのモードは、異なる3つの入力形式を編集するように設計されています。 コマンドM-x tex-modeは、バッファ内の内容を調べて、 LaTeXの入力なのかSliTeXの入力なのか判断します。 そのいずれかであれば、それに適したモードを選択します。 ファイルの中身がLaTeXでもSliTeXでもなさそうであれば、 プレインTeX(plain-tex)モードを選択します。 ファイルの内容が判断するに十分でなければ、 変数tex-default-modeで使用するモードを制御します。

M-x tex-modeが適切なモードを推測できなかった場合には、 コマンドM-x plain-tex-modeM-x latex-modeM-x slitex-modeで明示的にTeXの変種を選択できます。


Node:TeX Editing, Next:, Up:TeX Mode

TeX編集コマンド

ここでは、TeXの入力ファイルのテキストを編集するために TeXモードに用意してある特別なコマンドについて述べます。

"
文脈に応じて``"''を挿入する (tex-insert-quote)。
C-j
段落区切り(空行を2つ)を挿入し、 まえの段落の中括弧やドル記号の対応を検査する (tex-terminate-paragraph)。
M-x tex-validate-region
リージョン内の各段落に対して、 中括弧やドル記号の対応を検査する。
C-c {
{}を挿入して、そのあいだにポイントを移動する (tex-insert-braces)。
C-c }
対応が取れていないつぎの閉じ中括弧のあとに 前向きにポイントを移動する(up-list)。

TeXでは、文字"はまず使いません。 引用を始めるには``を、終るには''を使います。 こういったテキスト整形上の規則の下で編集作業を楽にするために、 TeXモードでは`'を対で挿入する (tex-insert-quote)ようにキー"の意味を変えています。 より正確にいえば、このコマンドは白文字や開き中括弧のあとでは``を、 バックスラッシュのあとでは"を、 これ以外の文字のあとでは''を挿入します。

特別な文脈で"文字が必要であれば、C-qを使って挿入します。 また、"に数引数を指定すると、その個数分の"を入力します。 ローカルマップからバインディング(see Key Bindings)を取り除けば、 "を展開する機能をオフにできます。

TeXモードでは、$にはTeXの数式モードの区切りの対応を確認する ための特別な構文コードが設定されています。 数式モード終了を意味する$を挿入すると、 それに対応した数式モード開始の$を1秒間ほど表示します。 これは、閉じ中括弧を挿入すると、 それに対応する開き中括弧を表示する機能と同じです。 しかし、$が数式モードを開始するものか終了するものかを 知る方法がありません。 したがって、数式モード開始の$を挿入しても、 たとえ実際には無関係であっても、 まえにある$が対応しているかのように表示されてしまいます。

TeXは、中括弧を必ず対応が取れている区切りとして使います。 ユーザーの中には、中括弧を別々に入力するよりも、 つねに対応が取れている中括弧の入力を好む人もいます。 C-c {tex-insert-braces)と打てば中括弧の対を挿入できます。 さらに、ポイントがそれらのあいだに置かれるので、 中括弧の内側にテキストを挿入できます。 そのあとに、コマンドC-c }up-list)を使って、 閉じ中括弧のうしろに移動します。

中括弧の対応を調べるコマンドは2つあります。 C-jtex-terminate-paragraph)は、 ポイントの直前の段落を検査してから、新たな段落を始める空行を2つ挿入します。 対応していない中括弧があれば、エコー領域にメッセージを表示します。 M-x tex-validate-regionは、リージョンの段落を1つ1つ検査します。 エラーはバッファ*Occur*に表示されます。 このバッファでC-c C-cMouse-2を使えば、 特定の非対応箇所へ移動できます。

TeXモードでは、Emacsコマンドは中括弧だけでなく、 括弧(())や角括弧([])も数えています。 これは、TeXの構文を検査する目的からいえば、厳密には正しくありません。 しかし、括弧や角括弧はテキスト内で対応する区切りとしてよく使われますし、 各種の移動コマンドや対応関係を自動表示するコマンドが それらを扱えると便利です。


Node:LaTeX Editing, Next:, Previous:TeX Editing, Up:TeX Mode

LaTeX編集コマンド

LaTeXモードと、その変種のSliTeX モードには、 プレインTeX(plain-tex)では利用できない特別な機能がいくつかあります。

C-c C-o
LaTeXのブロックを表す\begin\endを挿入し、 それらのあいだにポイントを置く(tex-latex-block)。
C-c C-e
まだ閉じていないもっとも内側のLaTeXのブロックを閉じる (tex-close-latex-block)。

LaTeXの入力では、\begin\endがテキストのブロックを グループ化するために使われます。 \beginと対応する\endを(\beginのつぎの新しい行に) 挿入するには、C-c C-otex-latex-block)を使います。 それらのあいだには空行が挿入されてポイントもそこに置かれます。 ブロックの種類を入力するときには、補完を使えます。 標準のリストに含まれないブロック名を使う場合には、 変数latex-block-namesに設定します。 つぎの例は、theoremcorollaryproofを追加するものです。

(setq latex-block-names '("theorem" "corollary" "proof"))

LaTeXの入力では、 \begin\endは対応が取れている必要があります。 C-c C-etex-close-latex-block)を使うと、 対応が取れていない最後の\beginに対応する\endを 自動的に挿入できます。 また、対応する\beginと同じ字下げを\endにも施します。 ポイントが行頭にあったときには、\endのうしろで改行します。


Node:TeX Print, Previous:LaTeX Editing, Up:TeX Mode

TeX印刷コマンド

バッファ全体あるいは一部のテキストに対して、 Emacsの下位プロセスとしてTeXを起動できます。 特定の章だけに対してこのようにTeXを実行するのは、 ファイル全体の清書に時間を費すことなく、 変更部分の見え方を確認するよい方法です。

C-c C-r
バッファのヘッダとともに、 カレントリージョンに対してTeXを起動する(tex-region)。
C-c C-b
カレントバッファ全体に対してTeXを起動する(tex-buffer)。
C-c <TAB>
現在のファイルに対してBibTeXを起動する(tex-bibtex-file)。
C-c C-f
現在のファイルに対してTeXを起動する(tex-file)。
C-c C-l
下位プロセスであるTeXの出力を表示したウィンドウをスクロールして、 出力行の最後が見えるようにする(tex-recenter-output-buffer)。
C-c C-k
TeXのサブプロセスを終了させる(tex-kill-job)。
C-c C-p
最後に実行したC-c C-rC-c C-bC-c C-fの出力を印刷する。 (tex-print)。
C-c C-v
最後に実行したC-c C-rC-c C-bC-c C-fの出力を プレビューする(tex-view)。
C-c C-q
プリンタキューを表示する(tex-show-print-queue)。

C-c C-btex-buffer)を使えば、 カレントバッファの内容を下位のTeXに渡すことができます。 清書結果は一時ファイルに出力されます。 それを印刷するには、C-c C-ptex-print)と打ちます。 そのあとで、印刷の進捗状況を確認するには C-c C-qtex-show-print-queue)を利用できます。 TeXの出力ファイルを表示する機能を持った端末があれば、 C-c C-vtex-view)でプレビューできます。

TeXが実行時に使うディレクトリを指定するには、 変数tex-directoryに設定します。 デフォルトの値は"."です。 環境変数TEXINPUTSに相対的なディレクトリ名が入っていたり、 TeXの\inputコマンドに相対的なファイル名を指定してある場合には、 tex-directory"."である必要があります。 さもないと、誤った結果になるでしょう。 そういった状況でなければ、"/tmp"のような、 他のディレクトリを設定しても安全です。

下位のTeXを起動するために使うコマンドを指定したければ、 変数tex-run-commandlatex-run-commandslitex-run-commandtex-dvi-print-commandtex-dvi-view-commandtex-show-queue-commandに それぞれ値を設定します。 tex-dvi-view-commandにはデフォルト値がないので、 使用する端末にあわせた値を設定する必要があります。 これ以外の変数には、使用するシステムに適切と思われる (そうでないかもしれないが)デフォルト値が設定されています。

通常は、これらのコマンドに与えるファイル名はコマンド文字列の最後にきます。 たとえば、latex filenameです。 しかし、ときにはコマンドの途中にファイル名を埋め込む必要があります。 たとえば、パイプを介して出力を他のコマンドに渡すようなコマンドの引数に ファイル名を指定する場合です。 ファイル名を置く箇所は、コマンド文字列中の*で指定できます。 たとえば、以下のように設定します。

(setq tex-dvi-print-command "dvips -f * | lpr")

エラーメッセージを含めたTeXからの端末出力は、 *tex-shell*と呼ばれるバッファにすべて現れます。 TeXがエラーを報告した場合には、 このバッファに切り替えれば適切な入力を与えることができます (これはシェル(shell)モードと同様に動作する。see Interactive Shell)。 このバッファに切り替えなくてもC-c C-lと打てば、 バッファの最後の行が表示されるようにスクロールできます。

TeXの出力が不要となったら、TeXプロセスを終了させるために C-c C-ktex-kill-job)と打ちます。 C-c C-bC-c C-rを使っても、 動作中のTeXプロセスを終了できます。

C-c C-rtex-region)と打てば、 任意のリージョンを下位のTeXに渡せます。 しかし、これには少々巧妙な手口を必要とします。 というのは、たいていの場合、TeXの入力ファイルの先頭部分には パラメータの設定やマクロ定義があり、それらがないと残りの部分を正しく 清書できないからです。 この問題を解決するために、C-c C-rでは ファイルの中で必須の整形コマンドを含んでいる部分を指定できます。 リージョンのまえにその部分を加えてTeXへの入力とします。 ファイル中の必須であると指定された部分をヘッダと呼びます。

プレインTeX(plain-tex)モードでヘッダの境界を示すには、 ファイルに2つの特別な文字列を挿入します。 ヘッダの直前に%**start of headerを、 ヘッダの直後に%**end of headerを挿入します。 どちらの文字列も2行にまたがってはいけませんが、 前後に別のテキストがあってもかまいません。 これらの文字列を持つ行もヘッダに含まれます。 バッファの先頭から100行以内に%**start of headerが現れなければ、 C-c C-rはヘッダがないと仮定します。

LaTeXモードでは、\documentstyleで始まり \begin{document}で終わる部分がヘッダです。 これらは、いかなる場合でもLaTeXが要求するコマンドなので、 ヘッダを認識するために特別なことをする必要はありません。

コマンドtex-buffertex-regionは、 一時的なディレクトリ上ですべての作業を行うので、 相互参照のためにTeXが必要とする補助ファイルを使用できません。 一般に、これらのコマンドは、相互参照がすべて正しい必要がある 最終的な原稿の作成には適していません。

相互参照のための補助ファイルを必要とする場合には、 カレントバッファのファイルを入力として、そのファイルを置いたディレクトリで TeXを実行するC-c C-ftex-file)を使います。 TeXを実行するまえに、変更したすべてのバッファを保存するか尋ねてきます。 一般には、正しい相互参照を得るためには、 tex-fileを2度実行する必要があります。

変数tex-start-options-stringの値は、 TeXの実行のオプションを指定します。 デフォルト値は、TeXをバッチモードで実行します。 TeXを対話的に実行するには、変数に""を設定します。

巨大なTeX文書は、複数のファイル、つまり、1つのメインファイルと サブファイルとに分割されることがよくあります。 サブファイルに対してTeXを実行しても、うまくいくことはまずありません。 メインファイルに対してTeXを実行する必要があります。 サブファイルを編集する場合でもtex-fileを使えるように、 メインファイルの名前を変数tex-main-fileに設定できます。 そうするとtex-fileはそのファイルに対してTeXを実行します。

tex-main-fileのもっとも便利な使い方は、 各サブファイルのローカル変数リストで指定することです。 See File Variables

LaTeX用ファイルであれば、 カレントバッファのファイルに対する補助ファイルを処理するために BibTeXを使えます。 BibTeXは、参考文献をデータベースで調べて、 参考文献の節のための文献リストを準備します。 コマンドC-c TABtex-bibtex-file)は、 カレントバッファのファイルに対する.bblファイルを 生成するためのシェルコマンド(tex-bibtex-command)を実行します。 通常は、まず.auxファイルを作るために C-c C-ftex-file)を一度実行してから、 つぎにC-c TABtex-bibtex-file)を実行し、 正しい相互参照を得るためにC-c C-ftex-file)を さらに2回実行します。

どのTeXモードに入っても、 フックtext-mode-hooktex-mode-hookを実行します。 そのあとで、 plain-tex-mode-hooklatex-mode-hookの適切なフックを実行します。 SliTeXファイルに対しては、slitex-mode-hookを呼びます。 TeX用のシェルの開始時には、フックtex-shell-hookを実行します。 See Hooks


Node:Nroff Mode, Next:, Previous:TeX Mode, Up:Text

nroffモード

nroffモードはテキスト(text)モードに似ていますが、 テキスト中のnroffコマンドを扱えるように変更してあります。 このモードに入るには、M-x nroff-modeを実行します。 テキスト(text)モードとは、2、3の点で異なるだけです。 nroffコマンドを含んだ行は、すべて段落区切りとみなすので、 詰め込みによってnroffコマンドが本文に混ざってしまうことはありません。 ページは.bpコマンドで分割されます。 コメントは.\"で始まります。 また、テキスト(text)モードにはない、つぎの3つの特別なコマンドがあります。

M-n
nroffコマンドではないつぎの行の先頭にポイントを移動する (forward-text-line)。 引数は反復回数。
M-p
M-nと同様だが、まえの行に移動する(backward-text-line)。
M-?
リージョン中のテキスト(nroffコマンド以外)の行数をエコー領域に表示する (count-text-lines)。

nroffモードの他の機能としては、エレクトリックnroff(electric-nroff)モードが あります。 これはM-x electric-nroff-modeでオン/オフできるマイナモードです (see Minor Modes)。 このモードがオンのとき、 グループを始めるnroffコマンドを含む行を終えるために<RET> 27を打つたびに、 そのグループを終える対応したnroffコマンドを自動的につぎの行に挿入します。 たとえば、行頭で. ( b <RET>と打つと、 ポイントのうしろに新たな行として対応するnroffコマンド.)bを挿入します。

nroffモードと一緒にアウトラインマイナ(outline-minor)モード (see Outline Mode)を使用すると、 見出し行は.Hのあとに(見出しのレベルにあたる)数字が続く形になります。

nroffモードに入ると、フックtext-mode-hookに続いて フックnroff-mode-hookが実行されます(see Hooks)。


Node:Formatted Text, Previous:Nroff Mode, Up:Text

整形済みテキストの編集

エンリッチ(enriched)モードは、 ワープロのようにWYSIWYG方式で、 整形済みテキストを含むファイルの編集を行うためのマイナモードです。 現在のところ、エンリッチ(enriched)モードの整形済みテキストには、 フォント、表示色、下線、左右端、詰め込みと幅揃えの種類を指定できます。 将来的には、その他の整形機能も実装しようと計画しています。

エンリッチ(enriched)モードはマイナモードです(see Minor Modes)。 通常は、テキスト(text)モードと一緒に使います(see Text Mode)。 しかしながら、アウトライン(outline)モードや 段落字下げ型テキスト(paragraph-indent-text)モードのような 他のメジャーモードと一緒に使うことも可能です。

Emacsは能力的には整形済みテキストのファイルをさまざまなファイル形式で 格納することができす。 現在のところは、1種類の形式のみ、 つまり、MIMEプロトコルで定義されたtext/enriched形式のみを 実装してあります。 Emacsがどのようにファイルの形式を識別し変換するかの詳細に関しては See Format Conversion

Emacsの配布の中には、実例として整形済みテキストファイル etc/enriched.docがあります。 このファイルには、本節で説明するすべての機能の実例が盛り込まれています。 また、将来の拡張に関するアイデアも述べてあります。


Node:Requesting Formatted Text, Next:, Up:Formatted Text

整形済みテキストの編集

text/enriched形式でEmacsが保存したファイルを訪れると、 Emacsは自動的にファイル中の整形情報をEmacs自身の内部形式(テキスト属性)に 変換し、エンリッチ(enriched)モードをオンにします。

新たに整形済みテキストファイルを作成するには、 まず、存在しないファイルを訪れてから、 テキストを入力するまえにM-x enriched-modeと打ちます。 このコマンドはエンリッチ(enriched)モードをオンにします。 入力されるテキストが正しく扱われることを保証するために、 テキストを挿入するまえにエンリッチ(enriched)モードをオンにしてください。

より一般的にいえば、コマンドenriched-modeは、 エンリッチ(enriched)モードがオフならオン、オンならオフにします。 数引数を指定すると、それが正であればエンリッチ(enriched)モードを オンにし、それ以外ではオフにします。

エンリッチ(enriched)モードがオンのときにバッファを保存すると、 Emacsはテキストをファイルに書き出すときに 自動的にtext/enriched形式へ変換します。 ふたたびそのファイルを訪問すると、Emacsは自動的にその形式を認識して テキストを変換し、エンリッチ(enriched)モードをオンにします。

通常、text/enriched形式のファイルを訪問すると、 Emacsは各段落を指定された右端に納まるように詰め込みます。 この詰め込みをやめて時間を短縮するために、 変数enriched-fill-after-visitingnilaskを設定します。

しかし、エンリッチ(enriched)モードで保存したファイルを訪問するときには、 Emacsは右端の設定をテキストと一緒に保存しているので、 テキストを再度詰め込む必要はありません。

通常はEmacsが保存しないテキスト属性に対する注記(annotation)も 保存するようにするには、 変数enriched-translationsに追加しておきます。 text/enriched規格では、非標準の注記には、x-read-onlyのように x-で始まる名前が必要なことに注目してください。 これによって、あとから追加される標準的な注記と 名前が衝突しないことが保証されます。


Node:Hard and Soft Newlines, Next:, Previous:Requesting Formatted Text, Up:Formatted Text

ハード改行とソフト改行

Emacsは整形済みテキスト中の改行を、 ハード改行とソフト改行の2種類に区別します。

ハード改行は、段落の区切り、リスト内の項目、 左右端に関係なく行分割がつねに必要な箇所に用いられます。 <RET>コマンド(newline)とC-oopen-line)は ハード改行を挿入します。

ソフト改行は、テキストを左右端のあいだに納めるために使用されます。 自動詰め込み(auto-fill)モードを含めたすべての詰め込みコマンドは ソフト改行を挿入し、ソフト改行だけを削除します。

ハード改行とソフト改行は見た目は同じですが、違いを理解することは重要です。 詰め込んだ段落の途中で行に分割するときに<RET>を使ってはいけません。 あとの詰め込みの妨げとなるハード改行を挿入してしまいます。 かわりに、自動詰め込み(auto-fill)モードに行分割を行わせて、 テキストや左右端が変化してもEmacsが適切に再度詰め込めるようにします。 See Auto Fill

一方、表やリストのように、入力したとおりの行にしておく必要がある場合には、 <RET>で行を終えます。 これらの行では、幅揃えのスタイルとしてunfilledを 指定するのもよいかもしれません。 See Format Justification


Node:Editing Format Info, Next:, Previous:Hard and Soft Newlines, Up:Formatted Text

整形情報の編集

整形済みテキストファイルの整形情報を変更するには、2つの方法があります。 キーボードコマンドを使うか、マウスを使います。

文書に属性を追加するもっとも簡単な方法は、 Text Propertiesメニューを使用することです。 このメニューを出すには2つの方法があります。 メニューバーのEditメニューから選択するか、 C-mouse-2(<CTRL>キーを押し下げたままマウスの真中のボタンを押す) です。

Text Propertiesメニューのほとんどの項目には、 別のサブメニューがついています。 これらについては後述します。 コマンドを直接実行する項目もあります。

Remove Properties
Text Propertiesメニューで扱えるすべてのテキスト属性をリージョンから取り除く (facemenu-remove-props)。
Remove All
すべてのテキスト属性をリージョンから取り除く (facemenu-remove-all)。
List Properties
ポイント直後の文字のすべてのテキスト属性を表示する (list-text-properties-at)。
Display Faces
定義済みフェイス一覧を表示する。
Display Colors
定義済み表示色一覧を表示する。


Node:Format Faces, Next:, Previous:Editing Format Info, Up:Formatted Text

整形済みテキストのフェイス

Facesサブメニューには、bolditalicunderlineといっ たEmacsで使用できる各種フェイスが並んでいます。 その中から1つを選ぶと、リージョンにフェイスを追加します。 See Faces。 以下のキーボードコマンドでフェイスを指定することもできます。

M-g d
リージョン、あるいは、つぎに挿入する文字のフェイスをdefaultにする (facemenu-set-default)。
M-g b
リージョン、あるいは、つぎに挿入する文字のフェイスをboldにする (facemenu-set-bold)。
M-g i
リージョン、あるいは、つぎに挿入する文字のフェイスをitalicにする (facemenu-set-italic)。
M-g l
リージョン、あるいは、つぎに挿入する文字のフェイスをbold-italicにする (facemenu-set-bold-italic)。
M-g u
リージョン、あるいは、つぎに挿入する文字のフェイスをunderlineにする (facemenu-set-underline)。
M-g o face <RET>
リージョン、あるいは、つぎに挿入する文字のフェイスをfaceにする (facemenu-set-face)。

前置引数を指定してこれらのコマンドを使ったり、 暫定マーク(transient-mark)モードでリージョンが選択されていなければ、 これらのコマンドはつぎに入力する自己挿入文字だけに使うフェイスを指定します。 See Transient Mark。 これはキーボードコマンドとメニューコマンドの両方に通用します。

エンリッチ(enriched)モードには、 excerptfixedの2つの追加フェイスが定義されています。 これらのフェイスは、text/enrichedファイル形式で 使用されるコードに対応しています。

excerptフェイスは引用を表すためのものです。 カスタマイズしてなければitalicと同じです (see Face Customization)。

fixedフェイスは、『この部分のテキストには固定幅フォントを使用する』と いう意味です。 現在、Emacsは固定幅フォントにだけ対応しています。 したがって、fixedの注記は今のところ必要ありません。 しかしながら、将来のEmacsでは可変幅フォントに対応したり、 固定幅フォントをデフォルトとしないtext/enriched形式を 表示可能な他のシステムを計画しています。 ですから、固定幅フォントをどうしても使いたい箇所には、 その部分のテキストにfixedを指定するべきです。

通常、fixedフェイスには、デフォルトと異なるフォントを使うように 定義されています。 ところが、システムごとにさまざまなフォントがありますから、 この定義をカスタマイズする必要があるかもしれません。

異なるフェイスを表示できない端末ではそれらの違いを目にすることはできませんが、 それでも、さまざまなフェイスを含む文書の編集は行えます。 文書にフェイスや表示色を追加することもできます。 それらを表示可能な端末で見たときにフェイスや色を目にすることができます。


Node:Format Colors, Next:, Previous:Format Faces, Up:Formatted Text

整形済みテキストの表示色

テキストの部分ごとに前景色と背景色を指定できます。 前景色を指定するメニューと背景色を指定するメニューがあります。 これらのメニューには、そのEmacsセッションのエンリッチ(enriched)モードで 使っている表示色一覧が表示されます。

前置引数とともに表示色を指定したり、 暫定マーク(transient-mark)モードでリージョンが選択されていなければ、 つぎに入力する自己挿入文字だけに作用します。 See Transient Mark。 そうでなければ、コマンドはリージョンに作用します。

それぞれの表示色メニューにはもう1つOtherという項目があります。 この項目は、メニューに表示されていない表示色を指定するために使います。 これは、ミニバッファで表示色名称を読み取ります。 利用可能な表示色と名前の一覧を表示するには、 Text PropertiesメニューのDisplay Colors項目を使います (see Editing Format Info)。

このようにして指定した表示色や、 読み込んだ整形済みテキスト内で使われている表示色は、 そのEmacsセッション中は、両方の表示色メニューに追加されます。

表示色を指定するためのキーバインディングはありませんが、 拡張コマンドM-x facemenu-set-foregroundM-x facemenu-set-backgroundを使えばできます。 どちらのコマンドもミニバッファで表示色名称を読み取ります。


Node:Format Indentation, Next:, Previous:Format Colors, Up:Formatted Text

整形済みテキストの字下げ

整形済みテキストの編集では、段落全体あるいは段落の一部に 異なる左端と右端の字下げを指定できます。 指定した左右端は、自動的に詰め込みコマンド(see Filling)と 行分割コマンドに反映されます

Indentationサブメニューは、 これらの属性を指定するための便利なインターフェイスです。 このサブメニューにはつぎの4つの項目があります。

Indent More
リージョンを4桁分字下げする(increase-left-margin)。 エンリッチ(enriched)モードでは、 このコマンドはC-x <TAB>でも実行できる。 数引数を指定すると、左端に加える桁数として扱う(負の値であれば桁を減らす)。
Indent Less
リージョンから4桁分字下げを取り除く。
Indent Right More
右端を4桁分字下げしてテキストの幅を狭める。
Indent Right Less
右端から4桁分字下げを取り除く。

なお、これらのコマンドを繰り返せば、字下げを増やしたり減らしたりできます。

これらのコマンドの一般的な使い方は、段落全体の字下げを変更することです。 しかし、それだけではありません。 任意の箇所で左右端を変更できます。 新たに設定された値は、行末(右端)や つぎの行の先頭(左端)に影響します。

それにより、ぶら下がり字下げで段落を整形することができます。 ぶら下がり字下げとは、1行目の字下げ幅が2行目以降の字下げ幅より少ないものです。 ぶら下がり字下げするには、段落の最初の単語の直後から始まり段落の末尾まで 続くリージョンの字下げ幅を増やします。

段落の1行目の字下げはもっと簡単です。 段落の本体があるべき位置に段落全体に対する左右端を設定してから、 最初の行に追加の空白やタブを挿入すればよいのです。

編集の結果、段落の詰め込みが汚くなってしまうことがあります。 たとえば、段落の一部が左端や右端からはみ出してしまうことです。 そうなったときには、M-qfill-paragraph)を使って、 段落を詰め込み直します。

変数standard-indentは、これらのコマンドで増減する字下げ幅を指定します。 デフォルト値は4です。 エンリッチ(Enriched)モード全体に対する右端のデフォルトは、 通常どおり変数fill-columnで制御します。

詰め込み接頭辞があれば、指定した段落の字下げに追加されます。 C-x .は、 詰め込み接頭辞として新たに指定された値には、字下げの白文字を含めません。 しかも、詰め込みコマンドは各行の字下げのうしろにある詰め込み接頭辞を探します。 See Fill Prefix


Node:Format Justification, Next:, Previous:Format Indentation, Up:Formatted Text

整形済みテキストの幅揃え

整形済みテキストの編集では、段落に対してさまざまなスタイルの揃え方を 指定できます。 指定したスタイルは自動的にEmacsの詰め込みコマンドに影響します。

Justificationサブメニューは、 スタイルを指定するための便利なインターフェイスです。 このサブメニューにはつぎの5項目があります。

Flush Left
これは(少なくとも英語では)もっとも一般的な幅揃えスタイル。 行は左端に揃えられるが、右側は不揃いのまま。
Flush Right
右端に行を揃える。 必要に応じて左側に空白やタブを挿入して右側で行を揃える。
Full
行ごとに左右両端を揃える。 このスタイルで揃えると空白を均等に挿入する。 印刷物では見栄えがたいへんよいが、 画面上の固定幅フォントではそれほど美しくない。 たぶん、将来のEmacsでは行内の空白量を調節できるようになり、 エレガントな幅揃えが達成できるであろう。
Center
各行を現在の左右端の中央に揃える。
None
28 詰め込みをいっさい止める。 各行は入力したままになる。 つまり、この設定をしたテキストでは、 詰め込みコマンドも自動詰め込み機能も何の効果もない。 それでも、左端を字下げすることは可能。 詰め込まないリージョンでは、改行はすべてハード改行として扱う (see Hard and Soft Newlines)。

エンリッチ(enriched)モードでは、 M-jプレフィックス文字を使ってキーボードで幅揃えを指定することもできます。

M-j l
リージョンを左端揃えにする(set-justification-left)。
M-j r
リージョンを右端揃えにする(set-justification-right)。
M-j f
リージョンを左右端揃えにする(set-justification-full)。
M-j c
M-S
リージョンを中央揃えにする(set-justification-center)。
M-j u
リージョンでは詰め込まない(set-justification-none)。

揃え方のスタイルは段落全体に適用されます。 揃え方を変更するコマンドは、ポイントを含む段落に作用しますが、 リージョンが設定されているときには リージョンと重なる段落すべてが対象になります。

揃え方のスタイルのデフォルトは、 変数default-justificationで指定されます。 この値は、leftrightfullcenternone 29 のいずれかのシンボルでなくてはいけません。


Node:Format Properties, Next:, Previous:Format Justification, Up:Formatted Text

他のテキスト属性の設定

Other Propertiesメニュー 30には、 read-onlyinvisibleintangibleといった有用な テキスト属性を追加/削除する項目があります。 intangible属性はテキスト内にポイントを移動できなくし、 invisible属性はテキストを表示しないようにし、 read-only属性はテキストを変更できなくします。

これらの特別な属性には、 リージョンに属性を付加するためのメニュー項目があります。 最後のメニュー項目Remove Specialは、 これらの特別な属性すべてをリージョンから取り除きます。

現在のところ、invisible属性とintangible属性は、 text/enriched形式に保存されませんread-only属性は保存されますが、 これはtext/enriched形式の標準的なものではないので、 Emacs以外の他のエディタでは使用されないかもしれません。


Node:Forcing Enriched Mode, Previous:Format Properties, Up:Formatted Text

エンリッチ(enriched)モードの強制

普通は、Emacsは訪問したファイル内にある特別な注記を認識するので、 整形済みテキストを編集中であることがわかります。 ところが、ファイルの内容を変換するために特別な操作をしたり、 手動でエンリッチ(enriched)モードをオンにする必要がある状況もあります。

コマンドformat-decode-bufferは、 さまざまな形式のテキストをEmacsの内部形式に変換します。 このコマンドは、どの形式からの変換であるのかを尋ねてきますが、 通常は単に<RET>を打てばEmacsが形式を推測します。

text/enriched形式のファイルをそのままの形、 つまり、整形済みテキストではなく文字列として見たいのであれば、 M-x find-file-literallyコマンドを使います。 このコマンドはfind-fileのようにファイルを訪問しますが、 形式変換を行いません。 文字コード変換(see Coding Systems)と 自動展開(see Compressed Files)も禁止します。 形式変換を禁止しても、適宜、文字コード変換や自動展開を行わせたいのであれば、 適当な引数を指定してformat-find-fileを使います。


Node:Programs, Next:, Previous:Text, Up:Top

プログラムの編集

Emacsには、LispやCといったプログラム言語の構文を 理解するように設計されたコマンドが数多くあります。 以下のことを行えます。

単語/文/段落を扱うコマンドは、 自然言語のテキストを編集するのが本来の目的ですが、 コードを編集する場合にもおおいに役立ちます。 なぜなら、たいていのシンボルは単語ですし(see Words)、 文は文字列やコメントの中にも含まれるからです(see Sentences)。 段落は本質的にはコードの中には存在しませんが、 プログラム言語向けのメジャーモードでは、 段落は空行で始まり空行で終わると定義するので、 段落コマンドも役立ちます(see Paragraphs)。 空行をうまく使ってプログラムが整然と見えるようにすると、 段落コマンドもうまく働きます。

選択的表示機能は、関数の全体構成を眺めるのに便利です (see Selective Display)。 この機能は、指定幅以内の字下げ幅の行だけを表示します。


Node:Program Modes, Next:, Up:Programs

プログラム言語向けメジャーモード

Emacsには、Lisp、Scheme(Lispの方言の1つ)、Awk、C、C++、Fortran、 Icon、Java、Objective-C、Pascal、Perl、Pike、CORBA IDL、 Tclといった各種プログラム言語向けのメジャーモードがあります。 makefile用のメジャーモード、makefileモードもあります。 Perl向けの別のモードとして、cperlモードもあります。

理想的には、Emacsで編集する可能性のあるすべてのプログラム言語に対して、 それぞれのメジャーモードを実装すべきです。 しかし、ある言語向けのモードが、構文的に類似した他の言語にも 使えることがよくあります。 既存の言語モード群は、誰かがわざわざ書こうと決心したものです。

Lispモードにはいくつか変種がありますが、 Lispを実行する際のインターフェイス方法が異なります。 See Executing Lisp

各プログラム言語向けメジャーモードでは、 その言語の慣用的な字下げ方法を理解し 現在行をそのように字下げする関数を実行するように <TAB>キーを定義します。 たとえば、Cモードでは、<TAB>はc-indent-lineにバインドされています。 また、C-jは、<RET>に続けて<TAB>を実行するように 定義されています。 つまり、モードに固有の字下げも行います。

多くのプログラム言語では、行ごとに字下げ量が異なります。 そのため、そのような言語向けのメジャーモードでは、 (コマンドbackward-delete-char-untabifyを使って) タブ文字を等価な個数の空白と同じに扱うように<DEL>を再定義しています。 その結果、字下げが空白かタブのどちらで構成されているのか気にせずに、 1度に1桁ずつ消去することが可能となります。 そのようなモードでは、ポイントの直前にあるタブ文字を削除するには C-b C-dを使います。

プログラム言語向けモードでは、段落は空行で分割されると定義するので、 段落コマンドも便利に使えます。 プログラム言語向けメジャーモードで 自動詰め込み(auto-fill)モードがオンのときには、 新たに行を作ると自動的に字下げも行われます。

メジャーモードに入ると、モードフック(mode hook)と 呼ばれるノーマルフックが実行されます。 モードフックは、Lisp変数の値です。 各メジャーモードにはモードフックがあり、 フック名はつねにモードに入るためのコマンド名に-hookを付加したものです。 たとえば、Cモードに入るとフックc-mode-hookが実行され、 Lispモードではフックlisp-mode-hookが実行されます。 See Hooks


Node:Lists, Next:, Previous:Program Modes, Up:Programs

リストとS式

慣習として、釣り合った式を扱うEmacsのキーは、普通、コントロール・メタ文字です。 これらは、コントロールやメタだけの対応したキーの機能に似せてあります。 これらは、プログラム言語の式だけに関係したコマンドだと考えられがちですが、 ある種の括弧が存在する(自然言語も含めた)任意の言語に対しても有益なものです。

これらのコマンドは、2つのグループに分けられます。 一方は(括弧でまとめた)リスト(list)31だけを扱うもので、 丸括弧、角括弧、中括弧(使用言語において対応が取れている必要がある括弧)と、 それらをクォートするエスケープ文字だけに注目するコマンド群です。

もう一方は、式あるいはS式(sexp)を扱うコマンド群です。 「sexp」という用語は、 Lispの式を意味する古くからの用語s-expressionに由来します。 Emacsでは「S式」の概念をLispに限定しません。 プログラムを記述した言語が何であっても、その式をS式と呼びます。 各プログラム言語には独自のメジャーモードがあり、 そこでは、その言語の式をS式とみなすように構文テーブルを調整してあります。

一般にS式には、丸括弧、角括弧、中括弧に囲まれた部分だけでなく、 シンボル、数値、文字列定数も含まれます。

Cのように前置演算子と中置演算子を使う言語では、 すべての式をS式として扱うことは不可能です。 たとえば、Cモードでは、foo + barはCの式ですが、 S式としては認識しません。 かわりに、foobarをそれぞれ1つのS式として認識し、 +はあいだにある句読点として認識します。 これは根本的に曖昧なのです。 たとえば、ポイントがfにあるとき、横断すべきS式としては、 foo + barでもfooでも正当な選択肢です。 (foo + bar)は、Cモードにおいて単一のS式であることに注意してください。

式の構文が曖昧なために、 Emacsが正しく解釈できるようにしようなどとは誰も思わない言語もあります。


Node:List Commands, Next:, Previous:Lists, Up:Programs

リストとS式に対するコマンド

C-M-f
S式を横断して前向きに移動する(forward-sexp)。
C-M-b
S式を横断して後向きに移動する(backward-sexp)。
C-M-k
前向きにS式をキルする(kill-sexp)。
C-M-<DEL>
後向きにS式をキルする(backward-kill-sexp)。
C-M-u
リスト構造を1レベル上がって後向きに移動する(backward-up-list)。
C-M-d
リスト構造を1レベル下がって前向きに移動する(down-list)。
C-M-n
リストを横断して前向きに移動する(forward-list)。
C-M-p
リストを横断して後向きに移動する(backward-list)。
C-M-t
式を入れ替える(transpose-sexps)。
C-M-@
つぎの式の直後にマークを設定する(mark-sexp)。

S式を横断して前向きに移動するには、 C-M-fforward-sexp)を使います。 ポイントに続く最初の意味ある文字が開き区切り (Lisp では(、Cでは([{)であれば、 対応する閉じ区切りのうしろに移動します。 シンボル、文字列、数値を始める文字の場合には、 それらを横断してその末尾に移動します。

コマンドC-M-bbackward-sexp)は、 S式を横断して後向きに移動します。 移動の詳しい規則は上記のC-M-fと同様ですが、方向は逆です。 S式のまえに接頭辞文字(Lispではシングルクォート、バッククォート、コンマ)が ある場合には、それらも横断します。 ほとんどのモードでは、S式コマンドはコメントを空白であるかのように 飛び越えます。

C-M-fC-M-bに引数を指定すると、 指定された回数だけ動作を繰り返します。 負の引数では、逆向きに移動します。

1つのS式全体をキルするには、C-M-kkill-sexp)や C-M-<DEL>backward-kill-sexp)で行います。 C-M-kC-M-fで横断するだけの文字をキルし、 C-M-<DEL>C-M-bで横断するだけの文字をキルします。

S式コマンドと同様に、リストコマンドはリストを横断しますが、 リスト以外のS式(シンボルや文字列など)は飛び越します。 これらのコマンドは、C-M-nforward-list)と C-M-pbackward-list)です。 これらのコマンドが便利である主な理由は、 (コメントにはリストが何も含まれないのが普通なので) コメントを無視するからです。

C-M-nC-M-pは、可能な限り同じレベルの括弧にとどまります。 1つ(あるいはnだけ)上のレベルに移動するには、 C-M-ubackward-up-list)を使います。 C-M-uは、対応の取れていない開き区切りのまえへ後向きに移動して、 1つレベルを上げます。 正の引数は反復回数になります。 負の引数は、移動を逆向きにしますが、やはり反復回数です。 つまり、前向きに移動して、1つ以上レベルを上げます。

リスト構造中でのレベルに移動するには、 C-M-ddown-list)を使います。 Lispモードでは、(が唯一の開き区切りなので、 このコマンドは(を探索するのとほとんど同じです。 引数は下がるべき括弧のレベルを指定します。

本当は役に立つのに、何の役に立つのだろうと思われるコマンドが C-M-ttranspose-sexps)です。 これはポイントのまえにあるS式を、つぎにあるS式を越えて移動するコマンドです。 引数は反復回数となり、負の引数では後向きにS式を移動します (つまり正の引数を指定したC-M-tの効果を打ち消せる)。 引数が0の場合は、何もしないのではなくて、 ポイントのあとにあるS式とマークのあとにあるS式を入れ替えます。

バッファ内でつぎにあるS式の周りにリージョンを設定するには、 C-M-@mark-sexp)を使います。 このコマンドは、C-M-fによる移動先にマークを設定します。 C-M-@は、C-M-fと同様に引数を取ります。 とりわけ、負の引数は、直前のS式の先頭にマークを設定するのに便利です。

リストおよびS式コマンドが行う構文の解釈は、 構文テーブルに完全に支配されます。 たとえば、任意の文字を開き区切りとして宣言できて、 そうすると開き括弧のようにふるまうようになります。 See Syntax


Node:Defuns, Next:, Previous:List Commands, Up:Programs

関数定義(defun)

Emacsでは、トップレベルの括弧でグループ化したものは 関数定義(defun)と呼ばれます。 この名前は、Lispファイルではトップレベルにあるリストの大半が スペシャルフォームdefunであるという事実に由来します。 しかし、その中身が何であろうとも、また、使用プログラム言語が何であろうとも、 Emacs流には、トップレベルの括弧でグループ化されたものは すべて関数定義(defun)です。 たとえば、Cの関数定義の本体は関数定義(defun)です。

C-M-a
現在の関数定義、あるいは、直前の関数定義の先頭に移動する (beginning-of-defun)。
C-M-e
現在の関数定義、あるいは、つぎの関数定義の末尾に移動する (end-of-defun)。
C-M-h
現在の関数定義、あるいは、つぎの関数定義を囲むリージョンを設定する (mark-defun)。

現在の関数定義の先頭や末尾に移動するコマンドは、 C-M-abeginning-of-defun)と C-M-eend-of-defun)です。

現在の関数定義を操作したいのであれば、 C-M-hmark-defun)を使って、 現在の関数定義かつぎの関数定義の先頭にポイントを置き、 その末尾にマークを設定します。 たとえば、関数定義をテキストの別の位置に移動する準備をするには、 このコマンドを使うのがもっとも簡単な方法です。 Cモードでは、C-M-hc-mark-functionを実行しますが、 mark-defunとほとんど同じです。 違いは、引数宣言、関数名、戻り値の型名と遡って、 Cの関数全体をリージョンに含めることです。 See Marking Objects

Emacsは、もっとも左の桁でみつけた任意の開き括弧を 関数定義の始まりであると仮定します。 したがって、トップレベルのリストの始まりでない限り、 Lispファイルの中では左端に開き括弧を置いてはいけません。 また、関数本体の始まりを表すのでない限り、 Cのコードの行頭に開き中括弧や開き区切りを置いてはいけません。 もっとも起こりやすい場面は、 文字列の途中で、行頭に開き区切りを入れたい場合です。 トラブルを避けるために、開き区切りのまえに エスケープ文字(CやEmacs Lispでは \、 その他のLisp方言のいくつかでは/)を入れてください。 これで文字列の内容が影響を受けることはありません。

大昔のもともとのEmacsでは、関数定義を探すために、 より上位レベルの括弧がなくなるまで遡っていました。 この方法では、たとえ小さな関数であっても、 バッファの先頭まで遡って走査することがつねに必要でした。 これを高速化するために、左端内の任意の( (あるいは、開き区切りと宣言された任意の文字)が 関数定義の始まりであると仮定するように、Emacsを変更しました。 この発見的手法で、ほとんど正しく処理できて、時間のかかる走査を回避できます。 しかし、上述の約束事は必要です。


Node:Program Indent, Next:, Previous:Defuns, Up:Programs

プログラムの字下げ

正しく字下げされた状態にプログラムを保つ最良の方法は、 変更したらEmacsに字下げをやり直させることです。 Emacsには、1行の字下げ、指定された行数の字下げ、あるいは、 括弧でグループ化した内部のすべての行の字下げを行うコマンドがあります。

Emacsでは、ライブラリppにLispのプリティプリンタ32 もあります。 このプログラムは、美しく見えるように字下げを施してLispオブジェクトを 清書するプログラムです。


Node:Basic Indent, Next:, Up:Program Indent

プログラムの字下げ基本コマンド

<TAB>
現在行の字下げを調整する。
C-j
<RET>に続けて<TAB>と打鍵するのと同じ (newline-and-indent)。

基本的な字下げコマンドは<TAB>です。 直前の数行から判断した正しい字下げを現在行に施します。 <TAB>が実行する関数は、メジャーモードに依存します。 たとえば、Lispモードではlisp-indent-line、 Cモードではc-indent-lineが実行されます。 これらの関数はそれぞれの言語の構文を解釈しますが、 どれも同じことを行うためのものです。 プログラム言語向けメジャーモードにおいては、 <TAB>は、現在行のどこにポイントがあっても、 現在行の先頭に白文字を挿入したり削除したりします。 ポイントが行頭の白文字の中にあったときは、 <TAB>は最後の白文字のうしろにポイントを置きます。 そうでなければ、<TAB>を打ったときの文字のところに留まります。

ポイント位置にタブを挿入するには、C-q <TAB>を使います。

新たにソースコード行を入力するときには、 C-jnewline-and-indent)を使ってください。 これは、<RET>に続けて<TAB>を打鍵することと等価です。 C-jは、空行を作ってから、その行で適切な字下げを行います。

括弧でグループにまとめたところでは、 <TAB>は、2行目以降の行をそれぞれ直前の行の真下にくるように字下げします。 したがって、ある行を非標準的な字下げにすると、 以降の行もその字下げに従うことになります。 <TAB>による標準的な字下げが、 特定の行では美しくないので無視したい場合には、 字下げのこのようなふるまいが便利です。

(字下げ処理を含めて)Emacsは、左端にある、開き丸括弧、開き中括弧、 および、その他の開き区切りを関数の始まりと仮定することを 覚えておきましょう。 たとえ文字列の中であっても、 関数の始まりでない開き区切りをけっして0桁目に置いてはいけません。 この制約は字下げコマンドを高速にするためにきわめて重要です。 無条件で受け入れてください。 これに関してより詳しくは、See Defuns


Node:Multi-line Indent, Next:, Previous:Basic Indent, Up:Program Indent

複数行の字下げ

変更した複数行や、リスト構造中の異なるレベル箇所へ移した複数の行を 字下げし直すには、いくつかのコマンドを利用できます。

C-M-q
リスト内のすべての行を字下げし直す(indent-sexp)。
C-u <TAB>
リストの最初の行が正しい字下げ位置にくるように、 リストのすべての行を横にそのまま動かす。
C-M-\
リージョン内のすべての行を字下げし直す(indent-region)。

1つのリストの中身を字下げし直すには、 リストの始まり位置にポイントを置いて C-M-q(Lispモードではindent-sexp、 Cモードではc-indent-exp、 他のモードでは適切なコマンドにバインドされている)と打ちます。 S式が始まる行の字下げは変化しません。 つまり、リスト内の相対的な字下げが変化するだけで、 リストの位置は変わりません。 リストの開始位置も直すには、C-M-qのまえに<TAB>を打ってください。

リスト内の相対的な字下げは正しいけれども、 リストの開始行の字下げが正しくない場合には、 その行に移動してC-u <TAB>と打ちます。 <TAB>に数引数を指定すると、通常どおり現在行を字下げしてから、 その行から始まるリスト内のすべての行にも同じ量の字下げを加えます。 いいかえれば、グループ全体をひとまとめに字下げし直します。 ただし、このコマンドは賢くて、文字列の中の行は移動しませんし、 Cモードではプリプロセッサ行を移動しません。

字下げし直す範囲を指定するには、リージョンを使うこともできます。 コマンドC-M-\indent-region)は、 ポイントとマークのあいだに 行の先頭文字が含まれるすべての行について<TAB>を実行します。


Node:Lisp Indent, Next:, Previous:Multi-line Indent, Up:Program Indent

Lispの字下げのカスタマイズ

Lisp式に対する字下げの仕方を、 その式から呼ばれる関数と関係付けることができます。 各Lisp関数に対して、あらかじめ定義された字下げパターンの中から選んだり、 Lispプログラムで任意のものを定義したりできます。

字下げの標準パターンは、つぎのとおりです。 式の開始行に関数呼び出しの引数がある場合は、 最初の引数の直下に2行目がくるように字下げします。 それ以外の場合は、関数名の直下に2行目がくるように字下げします。 続く各行は、入れ子の深さが同じである行の字下げと同じになります。

変数lisp-indent-offsetnil以外ならば、 式の2行目に対する通常の字下げパターンを無効にして、 式の開始桁からつねにlisp-indent-offsetだけ字下げします。

標準パターンが使用されない関数もいくつかあります。 名前がdefで始まる関数に対しては、 式を開始する開き括弧の桁位置にlisp-body-indentを加えた桁位置へ 2行目がくるように字下げします。

関数名の属性lisp-indent-functionを変更すれば、 各関数ごとに標準パターン以外の字下げを施せます。 この属性が取りえる値にはつぎの4つがあります。

nil
属性がないのと同じ。標準の字下げパターンを使用する。
defun
名前がdefで始まる関数に用いる字下げパターンを使用する。
数値 number
関数の最初のnumber個の引数を区別された引数と呼び、 残りを式の本体と呼ぶ。 行の最初の引数が区別された引数かどうかによって、各行の字下げが異なる。 引数が本体の一部ならば、それを含んだ式を開始する開き括弧の桁位置に lisp-body-indentを加えた桁位置へ字下げする。 引数が区別された引数で最初か2番目ならば、 lisp-body-indent2倍を加えた桁位置へ字下げする。 引数が区別された引数であっても3番目以降ならば、標準パターンを適用する。
シンボルsymbol
symbolは関数名であること。 この関数は、当該式の字下げ幅を計算する。 この関数はつぎの2つの引数を受け取る。
state
当該行の先頭までを解析したときのparse-partial-sexp (字下げと入れ子の計算を行うLispの基本的な関数)の戻り値。
pos
字下げ対象の行の開始位置。

この関数は、当該行に対する字下げ幅の桁数、あるいは、 リストのcarがそのような数値であるリストを返す必要がある。 数値を返した場合は、括弧の入れ子レベルが同じ行に対しては 同じ字下げ幅を意味する。 リストを返した場合は、後続の行に対しては字下げ幅が異なる可能性を意味する。 このような差異は、C-M-qで字下げを計算するときに現れる。 数値が返された場合、C-M-qは、リストの末尾に達するまでは、 字下げの再計算を行う必要がない。


Node:C Indent, Next:, Previous:Lisp Indent, Up:Program Indent

Cの字下げコマンド

ここでは、Cモードとその関連モードにおける字下げコマンドを紹介します。

C-c C-q
現在のトップレベルの関数定義、あるいは、型宣言の集まりを字下げし直す (c-indent-defun)。
C-M-q
ポイントのうしろにある釣り合った式の中の各行を字下げし直す (c-indent-exp)。 前置引数を指定すると、 不正な構文に対する検査をせずに、警告メッセージも発しない。
<TAB>
現在行を字下げし直すか、タブ文字を挿入する (c-indent-command)。

c-tab-always-indenttならば、 現在行を字下げし直すだけで、他には何もしない。 これがデフォルト。

この変数がnilならば、 ポイントが左端か字下げの余白部分にある場合に限り、字下げし直す。 さもなければ、タブ (あるいは、indent-tabs-modenilならば、 等価な個数の空白)を挿入する。

上記の(nilt)以外の値であれば、通常どおり字下げし直す。 ただし、コメント、文字列、プリプロセッサ指令の内側では、タブを挿入する。

C-u <TAB>
現在行の構文に従って現在行を字下げし直す。 なお、現在行から始まる式を構成する行も同じ幅だけ字下げし直す。 see Multi-line Indent

カレントバッファ全体を字下げし直すには、 C-x h C-M-\と打ちます。 これは、まず、バッファ全体をリージョンとしてから、 そのリージョンを字下げし直します。

カレントブロックを字下げし直すには、C-M-u C-M-qと打ちます。 これは、まず、ブロックの先頭に移動してから、 ブロック全体を字下げし直します。


Node:Custom C Indent, Previous:C Indent, Up:Program Indent

Cの字下げのカスタマイズ

Cモードとその関連モードでは、字下げのカスタマイズには、 単純ですが柔軟性のある機構を用いています。 この機構は2段階で動作します。 まず、行をその内容と文脈から構文的に分類します。 つぎに、構文構成要素の各種類に、 カスタマイズ可能な字下げのオフセットを対応させます。


Node:Syntactic Analysis, Next:, Up:Custom C Indent

第1段階−−構文解析

第1段階では、Cの字下げ機構は、字下げしようとしているまえの行を調べて、 その行を構成する構文上の構成要素を決定します。 つまり、構文シンボルとバッファ内の相対位置を要素とする 構文構成要素のリストを組み立てます。 構文シンボルには、statement(文)や substatement(部分文)のように 文法要素を記述するものと、 class-open(クラス開始)や knr-argdecl(K&R版引数宣言)のように文法要素のあいだの位置を 記述するものがあります。

概念的には、Cのコード行は、バッファ中でそれよりまえに あるいずれかの行に対して必ず相対的に字下げされます。 これは構文構成要素リストの中にあるバッファ内位置として表現されます。

以下に例を示します。 つぎのコードが、C++モードのバッファに入っているとしましょう (実際にバッファに行番号が表示されるわけではない)。

1: void swap (int& a, int& b)
2: {
3:   int tmp = a;
4:   a = b;
5:   b = tmp;
6: }

4行目で(c-show-syntactic-informationを実行する) C-c C-sを打つと、 その行に対する字下げ機構の結果が表示されます。

((statement . 32))

これは、その行が文であり、 バッファ内位置32に対して相対的に字下げされていることを示します。 バッファ内位置32は、3行目のintiにあたります。 カーソルを3行目に動かしてC-c C-sと打つと、 今度はつぎのように表示されます。

((defun-block-intro . 28))

この結果は、int行がブロックの最初の文であり、 バッファ内位置28に対して相対的に字下げされていることを示しています。 バッファ内位置28は、関数ヘッダの直後の中括弧にあたります。

別の例を見てみましょう。

1: int add (int val, int incr, int doit)
2: {
3:   if (doit)
4:     {
5:       return (val + incr);
6:     }
7:   return (val);
8: }

4行目でC-c C-sと打つと、つぎのように表示されます。

((substatement-open . 43))

これは、中括弧が部分文のブロックを始めていることを示しています。 ところで、部分文とは、ifelsewhiledoswitchfortrycatchfinallysynchronizedのあとの行を表します。

Cの字下げコマンドにおいては、 字下げのために行を構文解析し終えると、 変数c-syntactic-contextには解析結果を表すリストが入ります。 このリストの各要素は構文構成要素であり、 構文シンボルと(省かれるかもしれない)対応するバッファ内位置の コンスセルです。 構文構成要素リストには、複数の要素が含まれることもあります。 また、典型的には、バッファ内位置を持つ要素は1つだけです。


Node:Indentation Calculation, Next:, Previous:Syntactic Analysis, Up:Custom C Indent

第2段階−−字下げ計算

Cの字下げ機構は、構文解析で得られた構文構成要素リスト c-syntactic-contextを使って、現在行の字下げ幅を計算します。 このリストの各要素は、構文シンボルを含むコンスセルですが、 バッファ内位置を含んでいる場合もあります。

リストの各要素は、最終的な総字下げ量に2つの方法で寄与します。 まず、各構文シンボルに字下げオフセットを対応付ける連想リスト c-offsets-alistから要素を探すために構文シンボルが使われます。 各構文構成シンボルのオフセットを総字下げ量に加えます。 つぎに、リストの要素にバッファ内位置が含まれていれば、 その箇所の桁位置を字下げ量に加えます。 これらのオフセットと桁数をすべて加えることで、総字下げ量が求まります。

以下の例でCの字下げ機構の動作を説明しましょう。

1: void swap (int& a, int& b)
2: {
3:   int tmp = a;
4:   a = b;
5:   b = tmp;
6: }

3行目にポイントがあって、そこで<TAB>と打って字下げし直すとしましょう。 上(see Syntactic Analysis)でも説明しましたが、 その行に対する構文構成要素リストはつぎのようになります。

((defun-block-intro . 28))

ここでは、まず、連想リストc-offsets-alistから defun-block-introを探すことから始めます。 その結果が整数値2であったとしましょう。 この値を計算中の合計(0で初期化されている)に加えて、 総字下げ量は空白2文字と更新されます。

つぎの段階は、バッファ内位置28の桁位置を求めることです。 バッファ内位置28の中括弧は0桁目にあるので、 0を計算中の合計に加えます。 3行目には構文要素が1つしかないので、総字下げ量は空白2文字となります。

1: int add (int val, int incr, int doit)
2: {
3:   if (doit)
4:     {
5:       return(val + incr);
6:     }
7:   return(val);
8: }

4行目で<TAB>と打つと、同じ過程を繰り返しますが、 異なる値を使って計算されます。 この行に対する構文構成要素リストはつぎのとおりです。

((substatement-open . 43))

まずは、シンボルsubstatement-openを連想リスト c-offsets-alistから探します。 このシンボルに対するオフセットが2であったとしましょう。 この時点で計算中の合計は2(0 + 2 = 2)です。 つぎに、バッファ内位置43(3行目のifiの位置)の 桁位置2を加えます。 結果として、空白4文字という総字下げ量が求まります。

行を解析した結果、c-offsets-alistに現れない構文シンボルが みつかった場合、そのシンボルは無視します。 しかし、変数c-strict-syntax-pnil以外の値であれば、 エラーを報告します。


Node:Changing Indent Style, Next:, Previous:Indentation Calculation, Up:Custom C Indent

字下げスタイルの変更

C流のモードの字下げをカスタマイズする方法は2つあります。 1つは、あらかじめ定義されているスタイルから選択する方法です。 それぞれのスタイルでは、各構文シンボルに対するオフセットが定められています。 もう1つはより柔軟な方法で、各構文シンボルの扱い方をカスタマイズできます。 定義されている構文シンボルの一覧については、See Syntactic Symbols

M-x c-set-style <RET> style <RET>
あらかじめ定義されている字下げスタイルstyleを選択する。 styleを入力する際に?と打てば、 定義済みのスタイル一覧を見ることができる。 スタイルの見栄えを調べるには、 そのスタイルを選択して、適当なCのコードを字下げし直してみる。
C-c C-o symbol <RET> offset <RET>
構文シンボルsymbolに対する字下げのオフセットを設定する (c-set-offset)。 2番目の引数offsetで、字下げのオフセットを指定する。

変数c-offsets-alistは、各構文シンボルに与える字下げ量を制御します。 この変数の値は連想リストであり、 各要素は(syntactic-symbol . offset)の形をしています。 さまざまな構文シンボルに対するオフセットを変えることで、 字下げを細かくカスタマイズできます。 連想リストを変更するには、c-set-offsetを使います(下記参照)。

c-offsets-alist内の各オフセットには、 整数、関数名や変数名、あるいは、 変数c-basic-offsetの値の正負の倍数を表すシンボルである +-++--*/のいずれかを設定できます。 したがって、基本の字下げ幅を空白2文字から3文字に変更したければ、 c-basic-offsetに3を設定します。

オフセットに関数を用いると、 字下げのカスタマイズに究極の柔軟性を持たせられます。 この関数は、構文シンボルとバッファ内位置があればそれをconsしたものを 引数として呼ばれます。 戻り値としては、整数値のオフセットを返す必要があります。

オフセットの値がリストの場合、 各要素は、nil以外の値がみつかるまで上の規則にしたがって処理されます。 その後、その値は、通常のように、字下げの総量に加えられます。 これは、主に、複数の関数の結果を組み合わせるために使われます。

対話的に設定するにしてもファイル~/.emacsで設定するにしても、 オフセットを設定するもっとも簡単な方法は、 コマンドC-c C-oc-set-offset)を使うことです。 最初の引数は構文シンボル、2番目の引数は希望のオフセットです。 有効な構文シンボル名とその意味の一覧は、See Syntactic Symbols


Node:Syntactic Symbols, Next:, Previous:Changing Indent Style, Up:Custom C Indent

構文シンボル

Cモードや関連するモードの字下げに対して有効な構文シンボルを、 構文上の意味とともに、以下に示します。 これらのほとんどのシンボルには、 c-offsets-alistでオフセットが与えられています。

string
複数行におよぶ文字列の内側。
c
複数行におよぶCスタイルのブロックコメントの内側。
defun-open
関数定義を開始する中括弧。
defun-close
関数定義を終了する中括弧。
defun-block-intro
トップレベルの関数定義の最初の行。
class-open
クラス定義を開始する中括弧。
class-close
クラス定義を終了する中括弧。
inline-open
クラス内のインラインメソッドを開始する中括弧。
inline-close
クラス内のインラインメソッドを終了する中括弧。
extern-lang-open
外部言語ブロックを開始する中括弧。
extern-lang-close
外部言語ブロックを終了する中括弧。
func-decl-cont
関数定義の引数リストと関数定義の本体を開始する中括弧のあいだの領域。 ただし、K&R版の関数定義を除く。 Cでは、この部分に空文字やコメント以外は置けない。 C++やJavaでは、throws宣言などを置ける。
knr-argdecl-intro
K&R版Cの引数宣言の最初の行。
knr-argdecl
K&R版Cの引数宣言の2行目以降。
topmost-intro
最上位の言語構成要素の最初の行。
topmost-intro-cont
最上位の言語構成要素の2行目以降。
member-init-intro
(構造体の)メンバ初期化リストの最初の行。
member-init-cont
(構造体の)メンバ初期化リストの2行目以降。
inher-intro
多重継承リストの最初。
inher-cont
多重継承リストの2行目以降。
block-open
文ブロックを開始する中括弧。
block-close
文ブロックを終了する中括弧。
brace-list-open
enumのリストや静的配列の初期化リストを開始する中括弧。
brace-list-close
enumのリストや静的配列の初期化リストを終了する中括弧。
brace-list-intro
enumのリストや静的配列の初期化リストの最初の行。
brace-list-entry
enumのリストや静的配列の初期化リストの2行目以降。
brace-entry-open
行が開き中括弧で始まるときの、 enumのリストや静的配列の初期化リストの2行目以降。
statement
通常の文。
statement-cont
文の継続行。
statement-block-intro
新規文ブロックの最初の行。
statement-case-intro
caseブロックの最初の行。
statement-case-open
中括弧で始まるcaseブロックの最初の行。
inexpr-statement
式の内側にある文ブロック。 これは、C言語のGNU拡張や、 文ブロックを引数としてとるPikeの特殊関数に用いる。
inexpr-class
式の内側にあるクラス定義。 これは、Javaの無名クラスや無名配列の初期化式に用いる。
substatement
ifwhilefordoelseの直後の最初の行
substatement-open
substatementのブロックを開始する中括弧。
case-label
caseまたはdefaultラベルを表す。
access-label
C++のアクセス指定子privateprotectedpublicを表す。
label
通常のラベル。
do-while-closure
do-while文のwhile
else-clause
if-else文のelse
catch-clause
C++やJavaのtry...catch構成の catch行やfinally行。
comment-intro
コメントの導入部分だけを含んだ行。
arglist-intro
引数リストの最初の行。
arglist-cont
引数リストを開始する括弧の行に引数がない場合、 引数リストの2行目以降。
arglist-cont-nonempty
引数リストを開始する括弧の行に少なくとも1つの引数がある場合、 引数リストの2行目以降。
arglist-close
引数リストを終了する括弧。
stream-op
ストリーム演算子を用いた式が継続する行。
inclass
クラス定義の内側に入れ子になった言語構成要素。 字下げは、クラス定義の開き中括弧に相対である。
inextern-lang
外部言語ブロックの内側に入れ子になった言語構成要素。
inexpr-statement
式の内側の文ブロックの最初の行。 これは、構文({ ... })を使うCに対するGCC拡張に用いる。 文ブロックを引数としてとるPikeの特殊関数にも用いる。
inexpr-class
式の内側のクラス定義の最初の行。 これは、Javaの無名クラスや無名配列の初期化式に用いる。
cpp-macro
cppマクロの開始。
friend
C++のfriend宣言。
objc-method-intro
Objective-Cのメソッド定義の最初の行。
objc-method-args-cont
Objective-Cのメソッド定義を継続する行。
objc-method-call-cont
Objective-Cのメソッド呼び出しを継続する行。
inlambda
inclassと同様だが、ラムダ(つまり、無名)関数の内側に用いる。 Pikeのみで用いる。
lambda-intro-cont
キーワードlambdaと関数本体のあいだの、 ラムダ関数のヘッダーの継続行。 Pikeのみで用いる。


Node:Variables for C Indent, Next:, Previous:Syntactic Symbols, Up:Custom C Indent

Cの字下げのための変数

本節では、Cモードとその関連モードの字下げ動作を制御する、 モードに固有な変数について説明します。

c-offsets-alist
構文シンボルとその字下げオフセットの連想リスト。 このリストに直接に値を設定するのではなく、 c-set-offsetを使うこと。 詳細については、see Changing Indent Style
c-style-alist
字下げスタイルを定義している変数。 下記参照。
c-basic-offset
c-offsets-alistの中で、 シンボル+-が用いるオフセットの基本量。
c-special-indent-hook
ユーザー定義の特別な字下げ調整用のフック。 このフックは、Cモードやその関連モードが行の字下げを終えたあとに呼ばれる。

変数c-style-alistは、 あらかじめ定義された字下げスタイルを保持します。 各要素は(name variable-setting...)の形をしていて、 nameはスタイル名です。 また、各variable-settingは、 (variable . value)の形をしています。 variableには、Cモードが使用するカスタマイズ用変数の1つを指定します。 valueは、選択されたスタイルが使われるときのvariableの値です。

variablec-offsets-alistである場合は、特殊なケースです。 c-offsets-alistの値をvalueの値で置き換えるのではなく、 c-offsets-alistの値の先頭にvalueを追加します。 したがって、valueにすべての構文シンボルを設定する必要はありません。 デフォルトと異なる構文シンボルだけを単に設定すればよいのです。

コメントだけを含んだ行の字下げも、 変数c-comment-only-line-offset (see Comments in C)に影響されます。


Node:C Indent Styles, Previous:Variables for C Indent, Up:Custom C Indent

Cの字下げスタイル

Cスタイルとは、カスタマイズされた字下げスタイルの集合です。 Emacsには、Cモードや関連するモードのためにあらかじめ定義された、 gnuk&rbsdstroustruplinuxpythonjavawhitesmithellemtelcc-modeといった字下げスタイルがあります。 デフォルトのスタイルはgnuです。

望みのスタイルを選択するには、コマンドM-x c-set-styleを使います。 引数としてスタイル名を指定します (Cスタイル名では大文字小文字は区別しない)。 選択したスタイルは新たに訪問したバッファにだけ影響し、 すでに編集中のバッファには影響しません。 さまざまなメジャーモードのスタイルを指定するために 変数c-default-styleを設定することもできます。 その値は連想リストである必要があり、 その各要素は、1つのメジャーモードと そのモードで使う字下げスタイルを指定します。 たとえば、

(setq c-default-style
      '((java-mode . "java") (other . "gnu")))

は、Javaモードには対しては選択を明示し、 他のC流モードにはgnuをデフォルトとします。

Cの字下げスタイルを新たに定義するには、関数c-add-styleを呼びます。

(c-add-style name values use-now)

ここで、nameは新しいスタイルの名前(文字列)、 valuesは要素が(variable . value)の形をした 連想リストです。 variableには、Variables for C Indentに 書かれているものを指定してください。

use-nownil以外ならば、 新しいスタイルの定義後すぐにそれに切り替えます。


Node:Matching, Next:, Previous:Program Indent, Up:Programs

対応している括弧の自動表示

Emacsの括弧の対応付け機能は、テキスト中でどのように括弧が 対応しているか自動的に表示するよう設計されています。 閉じ区切りである自己挿入文字を打つと、 それに対応する開き区切りが画面上にあれば、 その箇所にほんのしばらくカーソルが移動します。 画面上になければ、エコー領域にその箇所の近くにある文字列を表示します。 いずれにしても、1つのまとまりが閉じたことが判ります。

Lispでは、括弧だけに対して自動的な対応付けを行います。 Cでは、中括弧や角括弧も対象となります。 Emacsは、メジャーモードが設定する構文テーブルに基づいて、 どの文字が対応関係にある区切りであるか判定します。 See Syntax

[x)のように、開き区切りと閉じ区切りが対応しない場合、 エコー領域に警告メッセージを表示します。 正しい対応関係は構文テーブルで指定します。

括弧の対応表示を制御する変数は3つあります。 blink-maching-parenは、対応表示機能をオンまたはオフにします。 nilを設定すると対応表示機能はオフになりますが、 デフォルトはtであり、対応表示を行います。 blink-matching-delayは、対応表示のために待つ秒数を指定します。 デフォルトは1秒ですが、システムによっては何分の1秒のほうが便利かもしれません。 blink-matching-paren-distanceは、 対応している開き区切りをみつけるために、 何文字分まで戻って探索するか指定します。 その範囲内で対応するものがみつからなければ、走査をやめて何も表示しません。 これは、存在しもしない対応する区切りを探すことに 時間を浪費するのを防ぐためです。 デフォルトは12,000です。

Xウィンドウシステムを使用している場合、 対応括弧表示(show-paren)モードにすれば、 より強力な括弧の対応表示を利用できます。 このモードは、通常の対応表示をオフにするかわりに、 対応する括弧同士を示すために強調表示を行います。 ポイントが閉じ括弧の直後にあるときには、 閉じ括弧とそれに対応する開き括弧の両方を強調表示します。 ポイントが開き括弧の直前にあるときには、対応する閉じ括弧を強調表示します。 (ポイントの直後に開き括弧があるときには、 カーソルが開き括弧に重ねて表示されるので、 開き括弧を強調表示する必要はない。) このモードをオン/オフするには、 コマンドM-x show-paren-modeを使います。


Node:Comments, Next:, Previous:Matching, Up:Programs

コメントの操作

コメントはプログラミングの重要な部分なので、 Emacsにはコメントの編集や挿入を行うための特別なコマンドがあります。


Node:Comment Commands, Next:, Up:Comments

コメント用コマンド

コメント用コマンドはコメントの挿入、削除、および位置揃えを行います。

M-;
コメントの挿入/位置揃えを行う(indent-for-comment)。
C-x ;
コメントの桁位置を設定する(set-comment-column)。
C-u - C-x ;
現在行のコメントをキルする(kill-comment)。
C-M-j
<RET>に続けて、コメントの挿入/位置揃えを行う (indent-new-comment-line)。
M-x comment-region
リージョン内の各行に対して、コメント区切りを追加/削除する。

コメントを挿入するコマンドはM-;indent-for-comment)です。 行にコメントがなければ、新規にコメントを作成して、 コメント桁位置と呼ばれる特定の桁に置きます。 コメントを作成する際には、Emacsが正しいと信じるコメント開始文字列 (comment-startの値。下記参照)を挿入します。 ポイントはその文字列の直後に置かれます。 コードのテキストがコメント桁位置を越えているときには、 適当な境界に字下げします(通常は少なくとも空白1文字)。 メジャーモードでコメント終了文字列が指定されていれば、 構文を正しく保つために、ポイントの直後にその文字列を挿入します。

M-;は、既存のコメントを位置揃えするためにも使えます。 行にコメント開始文字列がすでに含まれていれば、 その文字列の直後にポイントを移動してから、適切な位置に字下げします。 例外として、0桁目から始まるコメントは動かしません。

特定の文脈における、ある種のコメントの字下げには特殊な規則を持つ メジャーモードもあります。 たとえば、Lispのコードでは、セミコロン2つで始まるコメントは、 コメント桁位置に揃えるのでなく、コードであるかのように字下げされます。 また、セミコロン3つで始まるコメントは左端に置くと仮定されます。 Emacsはこれらの慣習を理解していて、 セミコロン2つのコメントは<TAB>で字下げし、 セミコロン3つのコメントは字下げをまったく変更しません。

;; This function is just an example
;;; Here either two or three semicolons are appropriate.
(defun foo (x)
;;; And now, the first part of the function:
  ;; The following line adds one.
  (1+ x))           ; This line adds one.

Cのコードでは、コメントのまえに白文字しかない場合には、 そのコメントをコードのように字下げします。

既存のコメントの位置が適切に揃えられている場合でも、 コメント開始直後の位置にすぐに移動するにはM-;が便利です。

C-u - C-x ;kill-comment)は、 現在行にコメントがあれば、それをキルします。 コメント開始文字列のまえにある字下げもキルします。 コメントと思われるものが何もなければ、何もしません。 他の行にコメントを再挿入するには、 その行の末尾に移動してからC-yと打って、 さらに、位置を再調整するためにM-;と打ちます。 C-u - C-x ;はひとまとまりのキーではなく、 負の引数を指定したC-x ;set-comment-column)で あることに注意しましょう。 このコマンドは、負の引数を受け取ると、 kill-commentを呼ぶようにプログラムされています。 kill-commentは、望むならばキーに直接バインドできる通常のコマンドです。


Node:Multi-Line Comments, Next:, Previous:Comment Commands, Up:Comments

複数行にわたるコメント

コメントを入力していて別の行に継続したければ、 コマンド C-M-jindent-new-comment-line)を利用できます。 このコマンドは、入力中のコメントを終了して、 そのつぎに空行を作り、 直前のコメントの直下にくるように字下げして新たなコメントを始めます。 自動詰め込み(auto-fill)モードがオンならば、 コメントを入力中に詰め込み桁を越えると、 同様にコメントはつぎの行に継続されます。 C-M-jを打ったときにポイントが行末になければ、 ポイント位置から行末までのテキストは新たなコメントの一部になります。

既存の行をコメントにするには、 コマンドM-x comment-regionを使います。 このコマンドは、リージョン内で始まる各行にコメント区切り文字列を加えて コメントにします。 負の引数を指定すると逆の操作、 つまり、コメント区切り文字列を削除します。

正の引数を指定すると、comment-regionは、 追加するコメント開始文字列の最後の文字を重複させます。 つまり、引数は、その文字を何回重複させるかを示します。 たとえば、LispモードでC-u 2 M-x commment-regionとすると、 各行に;;を付加します。 コメント区切り文字を重複させるのは、コメントに注意を引き付けるためです。 また、コメントの字下げにも影響します。 Lispでは、適切な字下げになるように、 関数定義(defun)のあいだでは引数として3を、 関数定義の内側では引数として2を指定すべきです。

変数comment-paddingは、 comment-regionがコメント区切りと各行のもとのテキストとのあいだに 挿入する空白の個数を指定します。 デフォルトは1です。


Node:Options for Comments, Previous:Multi-Line Comments, Up:Comments

コメントを制御するオプション

コメント桁位置は、変数comment-columnに入っています。 この変数には明示的に値を設定できます。 あるいは、コマンド C-x ;set-comment-column)を使って、 ポイント位置の桁をコメント桁位置として設定できます。 C-u C-x ;は、バッファ内で現在行よりまえにある最後のコメントの桁位置を コメント桁位置としてから、 M-;を行って現在行のコメントをまえのコメントの直下にくるように 位置を揃えます。 C-u - C-x ;は、前述のように 関数kill-commentを実行することに注意してください。

変数comment-columnは、バッファごとの変数です。 つまり、通常の方法で設定すると、カレントバッファだけに影響しますが、 setq-defaultでデフォルト値を変更できます。 See Locals。 多くのメジャーモードでは、この変数をカレントバッファ用に初期化します。

コメント用コマンドは、変数comment-start-skipの正規表現に基づいて コメントを認識します。 この正規表現が空文字列には一致しないようにしてください。 厳密にはコメント開始文字列よりも長く一致するかもしれません。 たとえば、Cモードではこの変数の値は"/\\*+ *"ですが、 これは /*のうしろの余分なアスタリスクと空白に一致します。 (Lispの構文では、文字列中に\を含めるために\\とする必要がある。 この\は、最初のアスタリスクの正規表現における特別な 意味を抑制するために必要。 see Regexps。)

コメント用コマンドで新たなコメントを作ると、 コメントを始めるためにcomment-startの値を挿入します。 また、ポイントの直後にはcomment-endの値が挿入されて、 これから入力するテキストのあとに続くことになります。 Cモードでは、comment-startの値は"/* "comment-endの値は" */"です。

変数comment-multi-lineは、 C-M-jindent-new-comment-line)が コメントの内側で使われたときの動作を制御します。 comment-multi-linenil(通常の設定)ならば、 現在行のコメントを終了し、新たなコメントをつぎの行から始めます。 comment-multi-linenil以外ならば、 現在行と同じコメントが継続されます。 つまり、現在行のコメントを終えず、新たな行にも開始文字列を挿入しません。 複数行にわたるコメントを許す言語では、 この変数に設定する値は好みの問題です。

変数comment-indent-functionには、 新たに挿入したコメントの字下げや 既存のコメントに桁を揃えるための字下げを計算する関数を 設定する必要があります。 この変数には、メジャーモードごとに異なった関数が設定されます。 この関数は引数なしで呼ばれますが、 コメントがあるときにはその開始位置にポイントを置いて、 新規コメントの挿入時には行末にポイントを置いて呼ばれます。 戻り値は、コメントを始めるべき桁位置です。 たとえば、Lispモードでは、この字下げ用フック関数は、 既存のコメントのセミコロンの個数と まえの行のコードに基づいて計算を行います。


Node:Balanced Editing, Next:, Previous:Comments, Up:Programs

括弧の対応を保った編集

M-(
つぎの(1つ以上の)S式を括弧で囲む(insert-parentheses)。
M-)
つぎの閉じ括弧のうしろへ移動してから字下げし直す (move-past-close-and-reindent)。

コマンドM-(insert-parenthesis)と M-)move-past-close-and-reindent)は、 括弧の対応をつねに保ったまま編集するために設計されました。 M-(は一対の括弧を挿入します。 引数がなければ()を挿入しますが、 引数を指定すると、つぎのその個数分のS式を括弧で囲みます。 ポイントは開き括弧の直後に置かれます。 コマンドM-)は、閉じ括弧のまえにある字下げを削除しながら 閉じ括弧のうしろにポイントを移動し、 そのあと、C-jで字下げします。

たとえば、( F O O )と打つかわりにM-( F O Oと打てば、 カーソルが閉じ括弧のまえにくることを除けば同じ効果を得られます。

M-(は、直前の文字の構文クラスによっては、 開き括弧のまえに空白を1個挿入することがあります。 これを禁止したければ、 parens-require-spacesnilを設定してください。


Node:Symbol Completion, Next:, Previous:Balanced Editing, Up:Programs

シンボル名の補完

通常、補完はミニバッファで行われます。 しかし、ある種の補完は任意のバッファで利用できます。 それはシンボル名に対する補完です。

M-<TAB>は、ポイント直前の部分的なシンボルを、 意味のあるシンボル名の集合から補完するコマンドを実行します。 部分的な名前から補完された追加文字はポイント位置に挿入されます。

バッファ内の部分的な名前に対して、 複数個の補完候補があり、しかも、追加できる共通部分がない場合には、 補完候補一覧を別のウィンドウに表示します。

ほとんどのプログラム言語向けメジャーモードでは、 M-<TAB>はコマンドcomplete-symbolを実行します。 この関数には、2種類の補完機能があります。 通常、このコマンドはタグテーブル(see Tags)に基づいて補完を行います。 数引数(値は無関係)を指定すると、当該言語のinfoファイルの索引に 並べられた名前を対象として補完を行います。 すなわち、プログラム中で定義されたシンボル名を補完するには 引数なしでM-<TAB>を使い、 標準ライブラリ関数の名前を補完するにはC-u M-<TAB>を使います。 もちろん、infoに基づいた補完は、使用言語の標準ライブラリ関数に対する infoファイルがあり、かつ、それがインストールされている場合にだけ動作します。

Emacs Lispモードでは、補完対象の名前空間は、 関数定義、値や属性を持つEmacs中の特殊なシンボルから成ります。 しかし、部分的なシンボルの直前に開き括弧があれば、 関数定義を持つシンボルだけを補完対象とします。 これを実現するコマンドはlisp-complete-symbolです。

テキスト(text)モードとその関連モードでは、 M-<TAB>はスペルチェッカの辞書に基づいた補完を行います。 See Spelling


Node:Which Function, Next:, Previous:Symbol Completion, Up:Programs

関数名表示モード(which-functionモード)

関数名表示(which-function)モードは、 バッファ内を動き廻るに従って現在の関数名をモード行に表示する マイナモードです。

関数名表示(which-function)モードをオン(あるいはオフ)にするには、 コマンドM-x which-function-modeを使います。 このコマンドはグローバルです。 つまり、既存のバッファでもこれから作るバッファでも、 すべてのバッファに通用します。 しかし、which-func-modesの値で指定された 特定のメジャーモードでのみ効果があります。 (which-func-modesのデフォルト値はtであり、 関数名表示(which-function)モードの支援方法を知っている すべてのメジャーモードに適用されることを意味する。 具体的には、imenuを使えるメジャーモード。)


Node:Documentation, Next:, Previous:Which Function, Up:Programs

説明文書用コマンド

Emacsで実行するLispコードを編集するときには、 関数や変数の説明文字列を表示するコマンド、 C-h fdescribe-function)や C-h vdescribe-variable)を利用できます。 これらのコマンドは、説明文字列を表示したい関数や変数の名前を ミニバッファから読み取り、ウィンドウに説明文字列を表示します。

たいへん便利なことに、これらのコマンドはポイント近傍のコードから、 デフォルトの引数を選択します。 C-h fは、ポイントを含むもっとも内側のリストで呼ばれる関数をデフォルト とします。 C-h vは、ポイントの周辺にあるか隣接するシンボル名を デフォルトとします。

Emacs Lispコードに対しては、eldocモードも使えます。 このマイナモードは、ポイント位置で呼び出されている関数の引数リストを、 たえずエコー領域に表示します。 (いいかえれば、ポイントを含む関数呼び出しを探し、 その関数の引数リストを表示する。) eldocマイナモードは、Emacs Lispモードと Lisp対話(lisp-interaction)モードだけに適用できます。 この機能をオン/オフするには、コマンドM-x eldoc-modeを使います。

C、Lisp、その他言語のシンボルのinfo文書を見るには C-h C-iinfo-lookup-symbol)を使います。 ミニバッファでシンボルを指定します。 デフォルトは、バッファ中のポイント位置にあるシンボルです。 シンボルに対する説明文書を探す場所、つまり、 どのinfoファイルのどの索引を探せばよいかは、 メジャーモードが決定します。 また、ファイル名に対する説明文書を探すには M-x info-lookup-fileを使います。

M-x manual-entryコマンドを使って、 オペレーティングシステムのコマンド、ライブラリ関数、システムコールの 『マニュアルページ』を読むことができます。 このコマンドは、マニュアルページを清書するために manプログラムを実行します。 システムが許せば非同期に実行するので、 マニュアルページが清書されるまで、編集を継続できます (MS-DOSやMS-Windows 3.xでは、非同期的なサブプロセスを実行できない。 このため、これらのシステムではmanの終了をEmacsが待つあいだは 編集できない)。 結果は、*Man topic*という名前のバッファに入ります。 これらのバッファではマン(man)モードと呼ばれる特別な メジャーモードが使われ、 スクロールや他のマニュアルページの調査を容易に行えます。 より詳しくは、マニュアルページ用のバッファで、 C-h mと打ってください。

長いマニュアルページでは、適切なフェイスを設定するにはとても時間がかかります。 さまざまなフォントや表示色を表示できる環境であれば、 デフォルトでマニュアルページにフェイスを用いるようになっています。 変数Man-fontify-manpage-flagnilを設定すれば、 マニュアルページにおけるフェイスの使用をオフにできます。

他の方法でマニュアルページのテキストをEmacsバッファに挿入した場合、 M-x manual-entryと同じ変換を施すには、 そこでM-x Man-fontify-manpageコマンドを実行します。

GNUプロジェクトでは最終的に、ほとんどのマニュアルページを infoで閲覧可能なよりよく構成されたマニュアルに置き換えることを望んでいます。 See Misc Help。 この作業は、ほんの一部が完了しただけなので、 まだマニュアルページを読めることは有益です。


Node:Change Log, Next:, Previous:Documentation, Up:Programs

変更記録

コマンドC-x 4 aは、編集中のファイルに対する 新たな項目を変更記録ファイルに追加します (add-change-log-entry-other-window)。

変更記録ファイルは、プログラムを変更した日付やその理由を 時間順に記録したもので、個々の変更を記述した項目の並びから成ります。 通常は、編集しているファイルと同じディレクトリ、あるいは、 その親ディレクトリに置いたChangeLogと呼ばれる ファイルに保存されています。 1つのChangeLogファイルで、このファイルを置いたディレクトリや そのサブディレクトリに置いた全ファイルの変更を記録できます。

変更記録項目は、名前、(user-mail-addressから得られた) 電子メイルアドレス、現在の日付と時刻から成るヘッダ行で始まります。 変更記録内の各行はヘッダ行を除いて、つねに空白かタブで始まります。 1つの項目は小項目から構成され、 各小項目は空白と星印で始まる行で始まります。 以下は、1993年5月付けの2つの項目で、 それぞれに2つの小項目があります。

1993-05-25  Richard Stallman  <rms@gnu.org>

        * man.el: Rename symbols `man-*' to `Man-*'.
        (manual-entry): Make prompt string clearer.

        * simple.el (blink-matching-paren-distance):
        Change default to 12,000.

1993-05-24  Richard Stallman  <rms@gnu.org>

        * vc.el (minor-mode-map-alist): Don't use it if it's void.
        (vc-cancel-version): Doc fix.

(Emacsの以前の版では、日付の形式が異なる。)

1つの項目で複数の変更を記述できます。 各変更について、それぞれの小項目を用意しなくてはいけません。 通常、小項目のあいだには空行がなくてはいけません。 小項目が関連している(場所は異なるが同じ変更の一部分の)場合には、 それらのあいだには空行を入れずに一塊にしておきます。 上記の2番目の項目には、このようにしてまとめた2つの小項目が含まれています。

C-x 4 aは、変更記録ファイルを訪問して、 最新の項目が今日の日付で当人の名前のものでなければ、 新たに項目を作成します。 また、現在のファイルに対する新たな小項目も作成します。 多くの言語に対して、変更された関数名やその他のオブジェクトを 推測することもできます。

変更記録ファイルは、変更記録(change-log)モードで訪問します。 このメジャーモードでは、(空行で区切らない)ひとまとまりの小項目群を 段落として扱い、各項目をページとして扱います。 これにより項目の編集が容易になります。 C-jや自動詰め込みにより、 新たな行は直前の行と同様に字下げされます。 これは項目内容を入力するのに便利です。

プログラムの変更を掌握し、変更記録を維持する他の手段としては、 版管理(バージョンコントロール)システムがあります。 See Log Buffer


Node:Tags, Next:, Previous:Change Log, Up:Programs

タグテーブル

タグテーブルとは、複数のファイルで構成されるプログラムが、 どのように各ファイルに分割されているのか記述したものです。 これは、プログラムを構成するファイル名、 そのファイルに入っている関数の名前(または、名前の付いた別の単位)や ファイル内の位置の一覧です。 こうして関連するファイルをまとめておけば、 全ファイルを対象とした探索や置換をコマンド1つで行えます。 また、関数名とその位置を記録してあるので、 関数がどのファイルに入っているか調べて関数定義をみつけだす M-.のようなコマンドを実現できます。

タグテーブルは、タグテーブルファイルと呼ばれるファイルに格納されます。 このファイルの慣習的な名前はTAGSです。

タグテーブルの各項目は、タグ名、タグが(暗黙に)定義されているファイルの名前、 そして、ファイル中でタグが定義されている位置を記録しています。

もとのプログラムファイルから、どんな名前がタグテーブルに記録されるかは、 プログラム言語によって異なります。 一般的には、すべての関数やサブルーチンを含み、 大域変数、データ型、あると便利なその他の情報などを含むこともあります。 記録された個々の名前をタグと呼びます。


Node:Tag Syntax, Next:, Up:Tags

ソースファイルのタグ構文

ここでは、広く一般に使われている言語に対するタグ構文の定義を紹介します。

他にも以下の言語で使えます。

正規表現に基づいてタグを生成する方法 (see Create Tags Table)もあるので、 上記以外の形式や言語を扱うこともできます。


Node:Create Tags Table, Next:, Previous:Tag Syntax, Up:Tags

タグテーブルの作成

タグテーブルファイルを作成するには、etagsプログラムを使います。 etagsは、数種類の言語について、 構文を解析しタグを取り出すことができます。 つぎのように実行します。

etags inputfiles...

etagsは指定されたファイルを読み、 カレント作業ディレクトリのTAGSという名前のファイルに タグテーブルを書き出します。 etagsは、ファイル名とその内容から自動的に使用言語を識別します。 後述の--language=nameオプションで、 言語を明示することもできます。

ファイルを変更するなどしてタグテーブルの内容が古くなった場合、 テーブルを更新するには、最初にタグテーブルを作成した手順を 繰り返します。 頻繁に更新する必要はありません。

タグテーブルに記録できなかったり、誤ったファイルを記録してしまった場合、 Emacsはタグの定義をみつけることはできません。 しかし、(タグの定義を含んだファイルを多少編集するなどしたために) タグテーブルに記録された位置が多少ズレている程度ならば、 タグをみつけるのに通常より少し時間がかかるだけです。 記録された位置が大幅に狂っていたとしても、 Emacsはタグをみつけることができますが、 そのためにファイル全体を調べなくてはなりません。

ですから、新しいタグを定義したとき、タグの定義を別のファイルに移動したとき、 ファイルを相当変更したときには、タグテーブルの更新が必要です。 しかし、ファイルを編集するつどタグテーブルを更新する必要はありませんし、 毎日更新する必要すらないでしょう。

タグテーブルに別のタグテーブルを取り込むこともできます。 取り込むタグファイル名をオプション--include=fileで 指定してタグファイルを作成します。 このように作成したタグファイルには、 指定したソースファイルに加えて、 取り込んだタグファイルに記録されていたファイルも含まれます。

etagsを実行するときに相対ファイル名でソースファイルを指定すると、 タグファイルには、タグファイルを書き出したときのディレクトリを 基準にしたファイル名が記録されます。 こうした場合、 タグファイルとソースファイルを含んだディレクトリ木構造全体を 移動することができ、しかも、タグファイルはソースファイルを正しく指し続けます。

etagsの引数として絶対ファイル名を指定すると、 タグファイルには絶対ファイル名が記録されます。 こうした場合、ソースファイルが同じ場所にある限り、 タグファイルを移動してもタグファイルは同じファイルを指し続けます。 絶対ファイル名は、/、あるいは、 MS-DOSとMS-Windowsではdevice:/で始まります。

非常に多数のファイルからタグテーブルを作成する場合、 コマンド行の長さを制限しているシステムもあるので、 ファイル名をコマンドラインで指定するときに問題が起こる可能性があります。 この制限を回避するもっとも単純な方法は、 つぎのように、ファイル名を指定する位置にダッシュを打って、 etagsに標準入力からファイル名を読み込ませることです。

find . -name "*.[chCH]" -print | etags -

オプション--language=nameを使えば、 言語を明示的に指定できます。 このオプションはファイル名と混ぜていくつでも使用できます。 それぞれ、あとに続くファイル名に適用されます。 --language=autoを指定すると、 etagsはファイル名とその内容からふたたび使用言語を推測します。 --language=noneを指定すれば、 言語に依存した処理をいっさい行わないようになります。 すると、etagsは正規表現による一致だけに 基づいてタグを認識します。 etagsが知っている言語と、言語を推測するファイル名規則を表示するには、 etags --helpを指定します。

--regexオプションは、 正規表現による一致に基づいてタグを認識させる一般的な方法です。 このオプションとファイル名を自由に混ぜて使用できます。 各--regexオプションは、それ以前に指定した正規表現に追加され、 オプションのあとにあるファイルに適用されます。 オプションの構文はつぎのとおりです。

--regex=/tagregexp[/nameregexp]/

ここで、tagregexpは、行に一致させてタグを取り出すために使われます。 これはつねに位置が固定されています。 つまり、^が前置されているかのように扱われます。 字下げ分を考慮したければ、正規表現を[ \t]*で始めて、 行頭の任意個の空白に一致するようにします。 正規表現においては、\は直後の文字をクォートし、 \tはタブ文字を表します。 etagsでは、これら以外にはCで使われるエスケープシーケンスを 扱えないことに注意してください。

etagsの正規表現の構文は、Emacsのものと同じで、 反復回数演算子(interval operator)が拡張されています。 この演算子は、grepedで使えるものと同じ動作をします。 反復回数演算子の構文は\{m,n\}であり、 直前の正規表現のm回以上n回以下の繰り返しに一致します。

tagregexpがタグとして認識したい部分よりも長く一致するようには しないでください。 tagregexpに一致する部分が必要以上に長くなるのが避けられないならば、 タグの範囲を狭めるためにnameregexpを追加するとよいかもしれません。 正規表現を利用した例をいくつか紹介しましょう。

-Rオプションは、それまでに--regexオプションで定義した すべての正規表現を削除します。 つぎの使用例からもわかるように、 オプションのあとに続くファイルに適用されます。

etags --regex=/reg1/ voo.doo --regex=/reg2/ \
    bar.ber -R --lang=lisp los.er

この例では、etagsは、 voo.doobar.berに対しては、その内容から使用言語を推定します。 さらに、voo.dooから余分にタグを認識するためにreg1を使い、 bar.berから余分にタグを認識するためには reg1reg2の両方を使います。 los.erからタグを認識するには、 Lispのタグ構文規則だけを使い、正規表現による一致はいっさい使いません。

別の例を示しましょう。 ここでは、シェルが解釈しないように正規表現をクォートします。

他のオプション一覧を表示するには、 etags --helpを実行してください。


Node:Select Tags Table, Next:, Previous:Create Tags Table, Up:Tags

タグテーブルの選択

Emacsでは、いつでも1つの選択されたタグテーブルがあり、 タグテーブルを使って動作するコマンドは選択されたタグテーブルを使用します。 タグテーブルを選択するには、M-x visit-tags-tableと打ちます。 すると、タグテーブルファイル名を聞いてきます。 デフォルトのファイル名は、デフォルトディレクトリのTAGSです。

このコマンドは、ファイル名を変数tags-file-nameに格納するだけです。 タグテーブルを使おうとしない限り、 Emacsは実際にはタグテーブルの内容を読み込みません。 visit-tags-tableを使わずに、 自分自身でこの変数にファイル名を設定してもかまいません。 この変数の初期値はnilです。 これは、タグテーブルを使うすべてのコマンドに、 使用するタグテーブルファイルを尋ねさせることになります。

すでにタグテーブルを読み込んであるときにvisit-tags-tableを使うと、 2つの選択肢があります。 現在のタグテーブルリストに新たにタグテーブルを追加するか、 タグテーブルリストを新規に始めるかです。 タグコマンドは、現在のリストにあるすべてのタグテーブルを使用します。 新たなタグテーブルリストを始めると、他のタグテーブルのかわりに 新たなタグテーブルが使われます。 現在のリストに新たなタグテーブルを追加すると、 他のタグテーブルとともに新たなものも使われます。 タグコマンドがタグテーブルリストを走査するときには、 つねにリストの先頭から始めるわけではありません。 現在のファイルを記録しているタグテーブルがあれば、 まずそれから始めてリストの末尾まで進みます。 そして、リストの先頭からリストに含まれる すべてのタグテーブルを調べ終るまで走査を続けます。

変数tags-table-listに文字列のリストを設定すれば、 タグテーブルの正確なリストをあらかじめ指定できます。 たとえば、つぎのようにします。

(setq tags-table-list
      '("~/emacs" "/usr/local/lib/emacs/src"))

この設定例では、タグコマンドは、 個人の~/emacsディレクトリと /usr/local/lib/emacs/srcディレクトリの (2つの)TAGSファイルを見にいきます。 上で述べたように、タグファイルを使う順番は、 対象としているファイルやそのファイルを記述しているタグテーブルに依存します。

tags-file-nametags-table-listの両方に 値を設定してはいけません。


Node:Find Tag, Next:, Previous:Select Tags Table, Up:Tags

タグの探索

タグテーブルで実現されるもっとも重要な機能は、 指定したタグの定義を探し出すことです。

M-. tag <RET>
タグtagの最初の定義を探す(find-tag)。
C-u M-.
最後に指定したタグのつぎの定義を探す。
C-u - M-.
まえにみつかったタグに戻る。
C-M-. pattern <RET>
名前がpatternに一致するタグを探す(find-tag-regexp)。
C-u C-M-.
最後に使用したパターンに一致するつぎのタグを探する。
C-x 4 . tag <RET>
タグtagの最初の定義を探し、 別のウィンドウに表示する(find-tag-other-window)。
C-x 5 . tag <RET>
タグtagの最初の定義を探し、 バッファを選択するための新たなフレームを作る。 (find-tag-other-frame)。
M-*
まえにM-.を起動した場所へ戻る。

M-.find-tag)は、指定したタグの定義を探すコマンドです。 まず、タグテーブルの中で文字列としてタグ名を探し、 タグテーブルの情報を用いて、 定義されているファイルの名前とファイル内でのおおよその文字位置を求めます。 続いて、find-tagはそのソースファイルを訪れて、 ポイントをおおよその文字位置に移動してから、 範囲を広げながらタグの定義を探します。

(単に<RET>と打って)引数を指定しないと、 ポイントの直前または周辺にあるS式をtag引数として使います。 S式に関しては、See Lists

コマンドM-.にタグの名前を完全に与える必要はありません。 その一部分で十分です。 というのは、M-.は、部分文字列としてtagを含む タグをタグテーブルで探すからです。 もちろん、部分一致よりも全一致のほうが望ましいです。 同じ部分文字列に一致する別のタグを探すには、 C-u M-.のようにfind-tagに数引数を指定します。 こうするとタグ名を聞いてきませんが、 最後に使ったものと同じ部分文字列を含む別のタグを タグテーブルから探します。 もし本物の<META>キーが使えるのであれば、 C-u M-.のかわりにM-0 M-.と打つほうが簡単でしょう。

バッファの切り替えを伴う他のコマンドと同様に、 find-tagにも新たなバッファを別のウィンドウに表示したり、 新規作成したフレームに表示する変種があります。 前者はC-x 4 .であり、コマンドfind-tag-other-windowを起動します。 後者はC-x 5 .であり、find-tag-other-frameを起動します。

最近にみつけたタグ位置に戻るには、C-u - M-.を使います。 より一般的には、M-.に負の数引数を指定します。 このコマンドは、別のバッファへも移動します。 C-x 4 .に負の数引数を指定すると、 別のウィンドウでまえのタグ位置に戻ります。

最近にみつけたタグ位置に戻るだけでなく、 タグを探したときの場所へ戻ることもできます。 それには、コマンドpop-tag-markを起動するM-*を使います。 典型的な使い方では、M-.で何かの定義を調べてから、 M-*でもとの場所に戻ります。

C-u - M-.M-*のどちらも、 変数find-tag-marker-ring-lengthで指定される深さまで、 辿った経路を引き返せます。

コマンドC-M-.find-tag-regexp)は、 指定した正規表現に一致するタグを訪れます。 部分文字列ではなく正規表現に一致するものであることを除けば、 M-.と同じです。


Node:Tags Search, Next:, Previous:Find Tag, Up:Tags

タグテーブルを用いた探索と置換

ここで紹介するコマンドは、選択されたタグテーブルに記録されている すべてのファイルを1つ1つ訪れては探索を行います。 これらのコマンドに対しては、タグテーブルは探索対象となる 一連のファイルを指定するだけです。

M-x tags-search <RET> regexp <RET>
選択されたタグテーブル内の各ファイルから 指定された正規表現を探索する。
M-x tags-query-replace <RET> regexp <RET> replacement <RET>
選択されたタグテーブル内の各ファイルに対して、 query-replace-regexpを実行する。
M-,
ポイント位置から上記のコマンドのいずれかを再実行する (tags-loop-continue)。

M-x tags-searchは、ミニバッファで正規表現を読み取り、 選択されたタグテーブル内のすべてのファイル1つ1つについて、 正規表現に一致する部分を探します。 このコマンドは探索しているファイル名を表示するので、 進行状況がわかります。 正規表現に一致する部分がみつかると、tags-searchはすぐに戻ります。

一致する部分をみつけたあとに、残りも探したくなるでしょう。 つぎの一致を探すには、 M-,tags-loop-continue)と打って、 tags-searchを再開します。 これは、カレントバッファの残りを探索してから、 タグテーブルの残りのファイルについても探索します。

M-x tags-query-replaceは、タグテーブル内のすべてのファイルを対象に、 query-replace-regexpを実行します。 このコマンドは、通常のM-x query-replace-regexp (問い合わせ型置換)と同じく、 探索すべき正規表現と置換文字列を読み取ります。 そして、M-x tags-searchのように探索を行い、 利用者の入力に応じて一致部分を処理することを繰り返します。 問い合わせ型置換について詳しくは、See Replace

M-x tags-query-replaceを一度起動するだけで、 タグテーブル内の全ファイルの置換を行うことができます。 しかし、一時的に置換作業から抜け出して、 問い合わせ型置換とは関係ないことを行えると便利です。 M-,と打てば、問い合わせ型置換を再開できます。 このコマンドは、最後に行ったタグの探索コマンドか置換コマンドを 再開します。

ここで紹介したコマンドは、find-tag系列のコマンドよりも、 幅広い探索を実行します。 find-tagコマンドは、指定した部分文字列や正規表現に一致する タグの定義だけをみつけます。 コマンドtags-searchtags-query-replaceは、 通常の探索コマンドや置換コマンドがカレントバッファで行うように、 正規表現に一致するあらゆる部分を探し出します。

これらのコマンドは、(Emacsバッファにまだ訪れていないものに対しては) 探索すべきファイル用に一時的なバッファを作成します。 一致部分がみつからなければバッファはただちに消されますが、 みつかれば存続します。

tags-searchは、grepプログラムにたいへんよく似ていると 思われたかもしれません。 Emacsの下位プロセスとしてgrepを実行して、 Emacsに一致した行を1つずつ表示させることもできます。 これは、コンパイルを実行するのと同じように動作します。 grepが一致を検出したソース箇所を探すことは、 コンパイルエラーを探すのと同様に動作します。 See Compilation


Node:List Tags, Previous:Tags Search, Up:Tags

タグテーブルの照会

M-x list-tags <RET> file <RET>
プログラムファイルfileで定義されているタグの一覧を表示する。
M-x tags-apropos <RET> regexp <RET>
regexpに一致するすべてのタグを表示する。

M-x list-tagsは、選択されたタグテーブルに記載されている ファイルのどれか1つのファイル名を読み取り、 そのファイルで定義されているすべてのタグを表示します。 引数の『ファイル名』は、タグテーブルに記録されたファイル名と 単純に文字列として比較されます。 ファイル名というよりは、文字列として読まれます。 したがって、補完やデフォルトはありませんし、 タグテーブルに格納されているとおりに正確にファイル名を入力する必要があります。 タグテーブル内のファイル名にディレクトリが含まれない限り、 ファイル名にもディレクトリを含めてはいけません。

M-x tags-approposは、タグに対するaproposにあたります (see Apropos)。 このコマンドは、正規表現を読み取り、 選択されたタグテーブルの中から正規表現に一致する項目のタグを すべてみつけだし、そのタグ名を表示します。

現在のタグテーブルに含まれるタグ名を名前空間として、 バッファ内で補完を行うこともできます。 See Symbol Completion


Node:Emerge, Next:, Previous:Tags, Up:Programs

emergeを用いたファイルの併合

ちょっとしたミスで、1つのプログラムから2つの別の版を 作ってしまうこともあります。 この混乱した状態を収拾するには、それらを併合する必要があります。 emergeを使うと、併合作業が容易になります。 手動で比較するコマンドについては、Comparing FilesEmergeを参照してください。


Node:Overview of Emerge, Next:, Up:Emerge

emergeの概要

以下の4つのコマンドのいずれかでemergeを実行します。

M-x emerge-files
指定した2つのファイルを併合する。
M-x emerge-files-with-ancestor
共通の祖先を参照しながら、指定した2つのファイルを併合する。
M-x emerge-buffers
2つのバッファを併合する。
M-x emerge-buffers-with-ancestor
3番目のバッファに入っている共通の祖先を参照しながら、2つのバッファを併合する。

emergeコマンドは、2つのファイル、あるいは、2つのバッファを比較して、 比較結果を3つのバッファ、つまり、 各入力テキストに1つずつ(AバッファBバッファ)と、 併合を実施するバッファ(併合バッファ)に表示します。 併合バッファには、比較によって得られる差分だけでなく、 併合したテキスト全体が表示されます。 2つの入力テキストが相違している箇所については、 どちらのテキストを併合バッファに含めるか選択できます。

既存のバッファを入力源とするemergeコマンドでは、 入力バッファがナロイングされていると、 バッファの参照可能な部分だけを使います(see Narrowing)。

併合したい2つのテキストのもとである共通の祖先にあたる版を利用できるときには、 emergeはそれを使ってどちらの選択肢が正しいのか推測します。 一方の入力と祖先との一致部分がどこかにあれば、 もう一方の入力には併合結果に残すべき意図的な変更がなされていると推測します。 共通の祖先のテキストを指定するには、 名前にwith-ancestorの付いたコマンドを使ってください。 これらのコマンドは、A版、B版、共通の祖先に対応する 3つのファイル名かバッファ名を読み取ります。

入力を比較してバッファの準備を終えると、つぎは対話的な併合作業が始まります。 併合バッファで特別な併合コマンドを打って併合作業を制御します。 併合バッファには、単なる差分ではなく併合したテキスト全体が表示されます。 入力テキストの各相違箇所に対して、どちら側を残すか選択したり、 両者をもとにして編集できます。

併合バッファでは、emergeモードと呼ばれる特別なメジャーモードが使われ、 これらを選択するコマンドがあります。 もちろん、通常のEmacsコマンドでバッファを編集することもできます。

emergeの注意は、いつでも注目相違箇所と呼ばれる 相違箇所に向けられています。 3つのバッファ内では、注目相違点はつぎのように印が付けられます。

vvvvvvvvvvvvvvvvvvvv
text that differs
^^^^^^^^^^^^^^^^^^^^

emergeはすべての相違箇所に順に番号をふります。 さらに、モード行にはつねに注目相違箇所の番号が表示されます。

通常、併合バッファはA版の内容で始まります。 しかし、A版の内容が共通の祖先の内容と一致するときには、 併合バッファはB版の内容で始まります。

emergeを終えると、併合バッファにはその時点の併合済みテキストが残ります。 emerge終了時には、C-x C-wでファイルに保存できます。 emerge-filesemerge-files-with-ancestorに 数引数を指定すると、ミニバッファで出力ファイル名を読み取ります。 (どちらの場合でも、これがいちばん最後に聞かれるファイル名。) すると、emerge終了時には、併合済みのテキストがその出力ファイルに保存されます。

emergeを終えると、通常、emergeコマンドが併合バッファをファイルに保存します。 emergeをC-]でアボートするとemergeコマンドは併合バッファを保存しませんが、 必要ならばユーザー自身で保存できます。


Node:Submodes of Emerge, Next:, Previous:Overview of Emerge, Up:Emerge

emergeのサブモード

併合コマンドを指示するためのモードが2つ、つまり、 高速モード(Fast mode)と編集モード(Edit mode)があり、どちらかを選べます。 高速モードでは、基本的な併合コマンドは1文字で表され、 通常のEmacsコマンドは禁止されています。 併合コマンドだけを使用するのであれば、高速モードが便利です。 編集モードでは、すべての併合コマンドはプレフィックスC-c C-cで始まり、 通常のEmacsコマンドも使えます。 このモードでは、併合バッファを編集できますが、emergeの処理は遅くなります。

編集モードに切り替えるにはeを使い、 高速モードに切り替えるにはC-c C-c fを使います。 モード行には、編集モードはE、高速モードはFと表示されます。

emergeには、特定の併合コマンドの動作に影響を与えるサブモードが さらに2つあります。 自動前進(auto-advance)モードと 優先箇所スキップ(skip-prefers)モードです。

自動前進モードがオンであると、コマンドabは、 自動的につぎの相違箇所にポイントを進めます。 このモードでは、どちらかの入力だけを選ぶ状況である限り、高速に併合を行えます。 モード行にはAと表示され、自動前進モードであるを示します。

優先箇所スキップモードがオンであると、 コマンドnpは、 A優先/B優先の状態にある相違箇所をスキップします (see State of Difference)。 つまり、どちらの版も『正しい』と推定されない相違箇所だけを調べことになります。 モード行にはSと表示され、優先箇所スキップモードであることを示します。

自動前進モードをオン/オフするには、 コマンドs aemerge-auto-advance-mode)を使います。 優先箇所スキップモードをオン/オフするには、 コマンドs semerge-skip-prefers-mode)を使います。 どちらのコマンドも、正の数引数を指定するとオンにし、 負あるいは0の数引数を指定するとオフにし、 引数を指定しないとトグル(切り替え)します。


Node:State of Difference, Next:, Previous:Submodes of Emerge, Up:Emerge

相違箇所の状態

併合バッファ内では、相違箇所はv^の文字だけの行に 挟まれて示されます。 各相違箇所は、つぎの7つのいずれかの状態になっています。

状態A
この相違箇所はA版の内容である。 aコマンドは必ずこの状態にする。 モード行にはAと表示される。
状態B
この相違箇所はB版の内容である。 bコマンドは必ずこの状態にする。 モード行にはBと表示される。
デフォルトA
デフォルトB
まだ決心していないので、『デフォルト』で、 相違箇所は状態A(A版の内容)か状態B(B版の内容)である。 どちらかの選択肢が『優先される』(下記参照)場合を除いて、 相違箇所はすべてデフォルトAで始まる (つまり、併合バッファの内容はAバッファのコピー)。

相違箇所を選択すると、その状態は、デフォルトAやデフォルトBから 状態Aや状態Bに遷移する。 つまり、一度でも選択した相違箇所は、 デフォルトAやデフォルトBの状態であることはなく、 これらの状態はけっしてモード行には表示されない。

デフォルトの状態として、 コマンドd aはデフォルトAを選び、 d bデフォルトBを選ぶ。 これらのコマンドで選んだデフォルトの状態は、 一度も選択してなく、かつ、どちらの版も優先されない相違箇所に適用される。 併合作業を先頭から順に行っている場合、 最後に選択した相違箇所に続く相違箇所群が一度も選択されていないものである。 したがって、先頭から順に進めるのであれば、 d ad bを使い分けて、 併合バッファのある部分ではA版をデフォルトとし、 別の部分ではB版をデフォルトとすることができる。

優先A
優先B
どちらかが優先されているので、 相違箇所は状態A(A版の内容)か状態B(B版の内容)である。 つまり、明示的にはまだ選択していないが、当該箇所では、 一方の版が共通の祖先に一致するため、 他方の版のほうが正しく思われるのである。 したがって、Aバッファが共通の祖先と一致する箇所では、 実際に変更されたほうが正しいものである可能性があるので、 B版が優先される。

これらの2つの状態は、モード行ではA*B*と表示される。

混合状態
x cx Cコマンドの結果、 相違箇所は、状態A(A版の内容)と状態B(B版の内容)の混合状態になっている。

相違箇所がいったんこの状態になると、 コマンドabに数引数を指定しない限り、何もしない。

この状態は、モード行ではcombと表示される。


Node:Merge Commands, Next:, Previous:State of Difference, Up:Emerge

併合コマンド

ここでは、高速モードの併合操作コマンドを示します。 編集モードでは、これらのコマンドのまえにC-c C-cを付けます。

p
まえの相違箇所を選択する。
n
つぎの相違箇所を選択する。
a
この相違箇所をA版にする(状態A)。
b
この相違箇所をB版にする(状態B)。
C-u n j
番号nの相違箇所を選択する。
.
ポイントを含む相違箇所を選択する。 このコマンドは、併合バッファ、Aバッファ、Bバッファのいずれでも使える。
q
終了する。 併合作業を完了。
C-]
アボートする。 併合作業をやめ、併合結果も保存しない。
f
高速モードに移行する。 (編集モードでは、実際にはC-c C-c fコマンド。)
e
編集モードに移行する。
l
3つのウィンドウすべてを(C-lのように)再表示する。
-
数引数の一部を指定する。
digit
これも、数引数の一部を指定する。
d a
併合バッファのこれ以降では、A版を選ぶ(デフォルトA)。
d b
併合バッファのこれ以降では、B版を選ぶ(デフォルトB)。
c a
この相違箇所のA版のテキストをキルリングにコピーする。
c b
この相違箇所のB版のテキストをキルリングにコピーする。
i a
この相違箇所のA版のテキストをポイント位置に挿入する。
i b
この相違箇所のB版のテキストをポイント位置に挿入する。
m
相違箇所の周りにポイントとマークを設定する。
^
3つのウィンドウすべてを(M-vのように)下にスクロールする。
v
3つのウィンドウすべてを(C-vのように)上にスクロールする。
<
3つのウィンドウすべてを(C-x <のように)左にスクロールする。
>
3つのウィンドウすべてを(C-x >のように)右にスクロールする。
|
3つのウィンドウすべてで、水平方向のスクロール分をリセットする。
x 1
併合バッファを表示しているウィンドウの高さを1行に縮小する。 (フルサイズに戻すにはC-u lを使う。)
x c
この相違箇所の2つの版を混合する(see Combining in Emerge)。
x f
emergeで作業しているファイル/バッファの名前を、 ヘルプ用ウィンドウに表示する。 (ウィンドウをもとの状態に戻すにはC-u lを使う。)
x j
この相違箇所を、つぎの相違箇所と結合する。 (C-u x jでは、まえの相違箇所と結合する。)
x s
この相違箇所を2つに分割する。 このコマンドを使うまえに、3つのバッファそれぞれで、 相違箇所を分割したい位置にポイントを移動しておく。
x t
相違箇所の先頭や末尾にある同じ行を取り去る。 このような行が現れるのは、 A版とB版は一致しているが、共通の祖先とは一致しない場合。


Node:Exiting Emerge, Next:, Previous:Merge Commands, Up:Emerge

emergeの終了

qコマンド(emerge-quit)は、併合を終了し、 出力ファイルを指定してあれば、そこに結果を保存します。 AバッファとBバッファは正しい内容に復元されますが、 emergeがAバッファとBバッファを作成して、かつ、編集されていなければ、 それらをキルします。 さらに、併合バッファでのemergeコマンドを使用禁止にします。 というのは、これ以降に併合コマンドを実行すると さまざまなバッファが悪影響を受ける可能性があるからです。

C-]は、併合作業をアボートします。 つまり、出力ファイルに書き出さずに終ります。 出力ファイルを指定していなければ、併合作業をアボートしようが終了しようが、 何の違いもありません。

他のLispプログラムからemergeコマンドが呼び出された場合、 正しく終了するとt、アボートしたときはnilが返されます。


Node:Combining in Emerge, Next:, Previous:Exiting Emerge, Up:Emerge

2つの版の混合

相違箇所によっては、両方の版を残したいこともあるでしょう。 そのような場合には、x cを使います。 すると、併合バッファはつぎのようになります。

#ifdef NEW
version from A buffer
#else /* not NEW */
version from B buffer
#endif /* not NEW */

この例では、2つの版をCのプリプロセッサの条件節で分けていますが、 変数emerge-combine-versions-templateに好みの文字列を設定すれば、 このコマンドで使用する文字列を指定できます。 この文字列内では、A版のテキストを置く箇所には%aを、 B版のを置く箇所には%bを指定します。 上に示した結果を生じるデフォルトの設定はつぎのとおりです。

"#ifdef NEW\n%a#else /* not NEW */\n%b#endif /* not NEW */\n"


Node:Fine Points of Emerge, Previous:Combining in Emerge, Up:Emerge

細かな注意点

併合作業中には、AバッファやBバッファを勝手に編集してはいけません。 emergeは一時的にこれらのバッファの内容を変更しますが、 最終的にはもとの状態に戻します。

複数の併合処理を同時に進めることもできますが、 別の併合処理の入力に同じバッファを使用してはいけません。 というのは、一時的にせよ、互いに異なる複数の変更が 1つのバッファに加えられてしまうからです。

入力ファイル全体を比較する必要があるため、 emergeの開始にはしばらく時間がかかる場合もあります。 また、diffコマンドが完了するまで、emergeは何もできません。 たぶん、そのうち誰かがemergeを変更して、 入力ファイルが大きいときにはバックグラウンドで比較を行うようにするでしょう。 そうすれば、emergeがコマンドを受け付けるようになるまで、 Emacsで他の作業を続けられます。

フックemerge-startup-hook(see Hooks)が、併合処理の設定の最後 に実行されます。


Node:C Modes, Next:, Previous:Emerge, Up:Programs

Cモードと関連するモード

本節では、C、C++、Objective-C、Java、CORBA IDL、 Pike用の各モードで利用可能な特別な機能について述べます。 『Cモードと関連するモード』と書いたときには、 これらのモードを意味します。


Node:Motion in C, Next:, Up:C Modes

Cモードの移動コマンド

本節では、Cモードとその関連モードでポイントを移動する コマンドについて述べます。

C-c C-u
マークをポイント位置に設定し、 ポイントを含むプリプロセッサの条件節の先頭に後向きにポイントを戻す。 数引数は反復回数として働く。 負の引数を指定すると、条件節の末尾に前向きにポイントを移動する。 後向きに戻る場合、 #elifは、#ifが続く#elseのように扱われる。 前向きに進む場合、#elifは無視される 33
C-c C-p
マークをポイント位置に設定し、 プリプロセッサの条件節を横断して後向きにポイントを移動する。 数引数は反復回数として働く。 負の引数を指定すると、前向きに移動する。
C-c C-n
マークをポイント位置に設定し、 プリプロセッサの条件節を横断して前向きにポイントを移動する。 数引数は反復回数として働く。 負の引数を指定すると、後向きに移動する。
M-a
もっとも内側のCの文の先頭にポイントを移動する (c-beginning-of-statement)。 すでに文の先頭にポイントがある場合、直前の文の先頭に移動する。 数引数nを指定すると、n-1だけまえの文に移動する。

ポイントが、文字列やコメントの内側、あるいは、 コメントのうしろ(コメントのあいだに白文字がある場合のみ)にある場合、 Cの文ではなく自然言語の文単位で移動する。

プログラムから呼ばれるときには、この関数は、3つの引数、つまり、 反復回数、(これよりも後向きには戻らない)移動限界、 ポイントがコメントの内側にある場合に自然言語の文単位の移動をするかどうか、 を取るが、これらは省略できる。

M-e
もっとも内側のCの文の末尾にポイントを移動する。 M-aと同じだが、移動方向が逆(c-end-of-statement)。
M-x c-backward-into-nomenclature
C++の命名語法の部分や単語の先頭に後向きにポイントを移動する。 数引数nを指定すると、n回移動する。 nが負ならば、前向きに移動する。 C++の命名語法とは、 NamingSymbolsWithMixedCaseAndNoUnderlinesのような形のシンボル名のこと (つまり、大文字で始めた単語を連結したもの)。 各大文字が部分や単語の先頭となる。

GNUプロジェクトでは、 CやC++の識別子は、大文字小文字で区別するのではなく、 単語を下線で区切ることを推奨する。

M-x c-forward-into-nomenclature
C++の命名語法の部分や単語の末尾に前向きにポイントを移動する。 数引数nを指定すると、n回移動する。


Node:Electric C, Next:, Previous:Motion in C, Up:C Modes

エレクトリックC文字

Cモードとその関連モードでは、ある種の印字文字は『エレクトリック』です。 つまり、その文字自身を挿入することに加えて、 現在行を字下げし直したり、改行も挿入することさえあります。 この機能は、変数c-auto-newlineで制御されます。 『エレクトリック』文字は、{}:#;,<>/*()です。

自動改行(auto-newline)機能がオン (モード行のモード名のあとに/aと表示される)の場合に限り、 エレクトリック文字は改行を挿入します。 この機能は、変数c-auto-newlineで制御されます。 コマンドC-c C-aでこの機能をオン/オフできます。

C-c C-a
自動改行機能をオン/オフする(c-toggle-auto-state)。 数引数を指定した場合、正ならば自動改行機能をオンにし、 負ならばオフにする。

コロン:はエレクトリックです。 なぜなら、単独のコロンの入力の解釈としてはそれが適切だからです。 しかし、C++で2つの連続するコロンを挿入する場合、 コロンのエレクトリックな動作は不便です。 C-c :と打てば、字下げも改行の挿入も行わずにコロンを2つ挿入できます。

C-c :
行の字下げも改行の挿入もせずに、 スコープ演算子を表すコロン2つをポイント位置に挿入する (c-scope-operator)。

エレクトリックキー#は、 プリプロセッサ指令の始まりと思われる位置では、行を字下げし直します。 変数c-electric-pound-behaviorの値が(alignleft)のときには、 このようになります。 この機能をオフにするには、 c-electric-pound-behaviornilを設定します。

変数c-hanging-braces-alistは、 挿入された中括弧の前/後への改行の挿入を制御します。 これは、(syntactic-symbol . nl-list)の形の要素 から成る連想リストです。 c-offsets-alistに現れるほとんどの構文シンボルは、 ここでも意味を持ちます。

リストnl-listは、シンボルbeforeafterのいずれか、 あるいはその両方、もしくはnilを含みます。 中括弧が挿入されるときには、その中括弧が定義する構文上の文脈を c-hanging-braces-alistから探します。 みつかれば、nl-listを使って 中括弧の前/後/前後のどこに改行を挿入するか決定します。 みつからなければ、デフォルトとして中括弧の前後に改行を挿入します。

変数c-hanging-colons-alistは、 挿入されたコロンの前/後への改行の挿入を制御します。 これは、(syntactic-symbol . nl-list)の形の要素 から成る連想リストです。 リストnl-listは、シンボルbeforeafterのいずれか、 あるいはその両方、もしくはnilを含みます。

コロンが挿入されるときには、そのコロンが定義する構文シンボルを この連想リストから探します。 みつかれば、nl-listを使って コロンの前/後のどこに改行を挿入するか決定します。 みつからなければ、改行を挿入しません。

自動改行機能がオンのときには、エレクトリック文字は自動的に改行を削除します。 この機能により、 改行が不要だと思われるもっとも一般的な場面で改行を削除するので、 自動改行機能をユーザーにより受け入れやすくしています。 Emacsは改行を削除することが望ましいいくつかの場面を認識できますが、 変数c-cleanup-listを設定すれば、どの場面で行うか指定できます。 この変数の値はシンボルのリストです。 各要素は、改行を削除してよい場面を1つ指定します。 以下に指定できるシンボルとその意味を示します。

brace-catch-brace
} catch (condition) {の構造全体を1行に再配置する。 catchcondition以外に中括弧のあいだになにもないときに {を打つと再配置する。
brace-else-brace
} else {の構造全体を1行に再配置する。 elseに続けて{を打ったときに再配置するが、 中括弧とelseのあいだに空白以外の文字がない場合に限る。
brace-elseif-brace
} else if (...) {の構造全体を1行に配置する。 {を打ったときに再配置するが、 キーワードとifの条件式を除いて、 }{のあいだに空白以外の文字がない場合に限る。
empty-defun-braces
空の関数定義の中括弧、{}を同じ行に再配置する。 閉じ中括弧}を打ったときに再配置する。
defun-close-semi
structや同様の型宣言のあとのセミコロンを閉じ中括弧と同じ行に再配置する。 セミコロンを打ったときに再配置する。
list-close-comma
配列/合成体の初期化式の中の閉じ中括弧とそれに続くコンマを同じ行に再配置する。 コンマを打ったときに再配置する。
scope-operator
C++のスコープ演算子を表している可能性がある2つのコロンを一緒にする。 2つめのコロンを打ったときに一緒にするが、 コロンのあいだに白文字以外の文字がない場合に限る。


Node:Hungry Delete, Next:, Previous:Electric C, Up:C Modes

Cの欲張りな削除機能

欲張りな削除機能をオン (モード行のモード名のあとに/h/ahで表示される)にすると、 1つの<DEL>コマンドで、直前の空白1つだけでなく、白文字すべてを削除します。 この機能をオン/オフにするには、C-c C-dを使います。

C-c C-d
欲張り削除機能(c-toggle-hungry-state)をオン/オフする。 数引数を指定した場合、正ならば欲張り削除機能をオンにし、 負ならばオフにする。
C-c C-t
自動改行機能と欲張り削除機能を同時にオン/オフする (c-toggle-auto-hungry-state)。

変数c-hungry-delete-keyは、 欲張り削除機能がオンかオフかを制御します。


Node:Other C Commands, Next:, Previous:Hungry Delete, Up:C Modes

Cモードのその他のコマンド

C-M-h
関数定義の末尾にマークを設定し、先頭にポイントを置く (c-mark-function)。
M-q
CやC++のコメントを考慮して、段落を詰め込む (c-fill-paragraph)。 現在行にコメントがあったり、現在行がコメントの内側なら、 コメントの字下げとコメント区切りを保存したまま、 ポイント位置のコメントや段落を詰め込む。
C-c C-e
リージョン内のテキストに対してCプリプロセッサを実行し、 マクロ呼び出しを展開した結果を表示する(c-macro-expand)。 リージョンのまえにあるテキストにマクロ定義があることもあるので、 それらもプリプロセッサに渡されるが、その部分の出力は表示しない。

マクロを用いたCのコードをデバッグするとき、 どのようにマクロが展開されるか正確に理解するのが難しいことがある。 このコマンドを使えば、マクロ展開のことを考える必要はない。 展開結果を目にすることができる。

C-c C-\
リージョン内の行末に\文字を挿入したり、 行末の\の位置揃えを行う(c-backslash-region)。 Cのマクロ定義を書いたり編集したあとに便利なコマンド。

行末がすでに\で終っているなら、そのまえに置く白文字の個数を調整する。 そうでなければ、新たに\を挿入する。 ただし、リージョン内の最後の行は特別扱いする。 その行に\を挿入することはなく、また、\がある場合には削除する。

M-x cpp-highlight-buffer
プリプロセッサ指令の条件節に従って、テキストの一部を強調表示する。 このコマンドは*CPP Edit*という名前のバッファを表示する。 このバッファは、特定のプリプロセッサ条件とその内容をどのように表示するかを 選択するグラフィックメニュー。 さまざま設定を変更したあとで、[A]pply these settingsをクリックする (あるいは、そのバッファへ移動してaと打つ)と、 設定に応じてCモードのバッファを強調表示し直す。
C-c C-s
現在のソース行に関する構文上の情報を表示する (c-show-syntactic-information)。 この情報は行の字下げを指示する。


Node:Comments in C, Previous:Other C Commands, Up:C Modes

Cモードのコメント

Cモードとその関連モードでは、 コメントの整形にいくつかの変数を使います。

c-comment-only-line-offset
コメント開始部分だけを含んだ行に与える余分のオフセット。 この変数の値は整数、あるいは (non-anchored-offset . anchored-offset)の形の コンスセルのどちらでもかまわない。 ここで、non-anchored-offsetは、 1桁目以降から始まるコメントに与えるオフセット。 anchored-offsetは、0桁目から始まるコメントに与えるオフセット。 整数値だけの場合は、(val . 0)と等価。
c-comment-start-regexp
コメント開始の識別方法を指定するバッファにローカルな変数。
c-hanging-comment-ender-p
この変数がnilであると、c-fill-paragraphは、 ブロックコメントのコメント終了区切りだけの行を作る。 デフォルト値はtで、 コメント終了区切り*/をコメントの最後の行の末尾に置く。
c-hanging-comment-starter-p
この変数がnilであると、c-fill-paragraphは、 ブロックコメントのコメント開始区切りだけの行を作る。 デフォルト値はtで、 コメント開始区切り/*をコメントの最初の行の先頭に置く。


Node:Fortran, Next:, Previous:C Modes, Up:Programs

Fortranモード

Fortranモードには、Fortranの文と副プログラム向けの特別な移動コマンド、 Fortranの入れ子、行番号と継続文の約束事に従う字下げコマンドがあります。 Fortranモードには、長い行を適切なFortranの継続行に分ける 専用の自動詰め込み(fortran-auto-fill)モードがあります。

Fortranのコメントは他の言語のコメントとは異なっているので、 コメントに対する特別なコマンドもあります。 Fortranのキーワードを入力するときの打鍵量を減らせる、 組み込みの略語もあります。

Fortran用のメジャーモードに切り替えるには、M-x fortran-modeを使います。 このコマンドは、フックfortran-mode-hookを実行します(see Hooks)。


Node:Fortran Motion, Next:, Up:Fortran

移動コマンド

Fortran モードには、副プログラム(関数やサブルーチン)や文を単位とて 移動するための特別なコマンドがあります。 また、副プログラムを囲むリージョンを設定するコマンドもあり、 副プログラムをキルしたり移動したりするのに便利です。

C-M-a
副プログラムの先頭に移動する(beginning-of-fortran-subprogram)。
C-M-e
副プログラムの末尾に移動する(end-of-fortran-subprogram)。
C-M-h
副プログラムの先頭にポイントを置き、末尾にマークを設定する (mark-fortran-subprogram)。
C-c C-n
現在の文かつぎの文の先頭に移動する(fortran-next-statement)。
C-c C-p
現在の文かまえの文の先頭に移動する (fortran-previous-statement)。


Node:Fortran Indent, Next:, Previous:Fortran Motion, Up:Fortran

Fortranの字下げ

Fortranのコードでは、構文上の各種要素(行番号、コメント行指示子、 継続マーク)は標準Fortranが要求する桁に現れるようにしなくてはいけないので、 字下げに関する特別なコマンドと機能が必要です。


Node:ForIndent Commands, Next:, Up:Fortran Indent

Fortranの字下げコマンド

<TAB>
現在行を字下げする(fortran-indent-line)。
C-j
現在行を字下げしてから、字下げした新たな行を始める (fortran-indent-new-line)。
C-M-j
ポイント位置で現在行を分割し、継続行を設定する。
M-^
現在行と直前の行を繋げる。
C-M-q
ポイントを含む副プログラムの行をすべて字下げする (fortran-indent-subprogram)。

Fortranモードでは、Fortranの行を字下げするように<TAB>を再定義します (fortran-indent-line)。 このコマンドは、行番号と継続マークを要求される桁位置に字下げしたうえ、 それとは独立にプログラム中の入れ子に基づいて文本体を字下げします。

キーC-jfortran-indent-new-lineを実行します。 これは、現在行を字下げしてから、新たな行を作成して字下げします。 新たな行を始めるまえに、doループやその他のブロックを 閉じる文を字下げし直すのに便利です。

キーC-M-qは、ポイントを含むFortranの副プログラム (関数やサブルーチン)の行すべてを字下げする コマンドfortran-indent-subprogramを実行します。

キーC-M-jは、適切な方法でFortranの行を分割するコマンド fortran-split-lineを実行します。 コメント行でなければ、後半部を継続行にし、それに応じて字下げします。 コメント行ならば、前後半部分とも独立したコメント行になります。

M-^は、fortran-split-lineの逆操作を行う コマンドfortran-join-lineを実行します。 現在行と直前の行を、Fortranコードとして適切に繋げます。


Node:ForIndent Cont, Next:, Previous:ForIndent Commands, Up:Fortran Indent

継続行

近代的なほとんどのFortranコンパイラには、 継続行の記述方法が2つ用意されています。 ある行の空白でない最初の文字が5桁目にあれば、先行する行の継続行です。 このスタイルを固定フォーマットと呼びます。 (GNU Emacsでは、桁位置はつねに0から数える。) 変数fortran-continuation-stringは、5桁目に置く文字を指定します。 タブ文字で始まり0以外の数字が続く行も継続行です。 このスタイルをタブフォーマットと呼びます。

Fortranモードではどちらのスタイルの継続行も利用できますが、 希望するほうを指定する必要があります。 変数indent-tabs-modeの値で希望を指定します。 nilならば固定フォーマット、 nil以外ならばタブフォーマットになります。 モード行に文字列Tabがあるかどうかで、 現在使用しているスタイルがわかります。

Fortranモードでは、テキストが慣用的なFortranの継続マーク$で始まる、 あるいは、 5桁目から白文字以外の文字で始まる場合には、その行を継続行として扱います。 <TAB>で継続行を字下げすると、 選択されている継続行のスタイルに変換します。 C-M-jでFortranの文を分割すると、 継続行のスタイルに応じて新たな行には継続マークを付けます。

継続行のスタイルは、Fortranモードでの編集に関わる その他の側面にも影響します。 固定フォーマットでは、文本体を置く最小桁位置は6になります。 Fortranのブロックの内側にある行を7桁目以降に字下げするときには、 白文字には空白文字を使います。 一方、タブフォーマットでは、文本体を置く最小桁位置は8で、 8桁目よりまえの白文字はつねにタブ文字です。

既存のファイルに対してFortranモードに入ると、 その内容から自動的に適切な継続行のスタイルを推測しようとします。 タブ文字か空白6個で始まる最初の行でスタイルを判断します。 変数fortran-analyze-depthで、 (ファイルの先頭から)何行分をスタイル判断に使用するか指定します。 この範囲内にスタイルを示すような行がみつからなければ、 変数fortran-tab-mode-defaultがスタイルを指定します。 nilなら固定フォーマット、nil以外ならタブフォーマットです。


Node:ForIndent Num, Next:, Previous:ForIndent Cont, Up:Fortran Indent

行番号

ある行の白文字以外の最初の文字が数字であれば、 Fortranの字下げではそれを行番号とみなして0桁目から4桁目のあいだに移動します。 (GNU Emacsでは、桁位置はつねに0から始まる。)

通常、4桁以下の行番号は空白1個で字下げします。 変数fortran-line-number-indentでこの字下げ幅を制御します。 この変数の値は、行番号の最大字下げ幅を表します。 最大字下げ幅まで字下げできなくなると、 行番号の最後の桁が4桁目になるように右揃えで字下げします。 この変数のデフォルト値は1です。

これらの規則に従って行番号を字下げするには、 行番号を挿入するだけで十分です。 行番号の各桁が挿入されるたびに、字下げ幅を再計算します。 この機能をオフにするには、 変数fortran-electric-line-numbernilを設定します。 こうすると、行番号の挿入はその他の文字の挿入と同様に行われます。


Node:ForIndent Conv, Next:, Previous:ForIndent Num, Up:Fortran Indent

構文上の規約

Fortranモードでは、適切な字下げをするためのFortranプログラムの解釈を 簡単にするために、以下の規約に従っているものと仮定します。

以上の規約に従っていない場合には、行を美しく字下げできないこともあります。 しかしながら、たとえ規約に従っていなくても、 正しいFortranプログラムであれば字下げによって意味が変わることはありません。


Node:ForIndent Vars, Previous:ForIndent Conv, Up:Fortran Indent

Fortranの字下げのための変数

Fortranの字下げ動作に影響する変数がいくつかあります。

fortran-do-indent
do文の各レベルごとに追加する字下げ幅(デフォルトは3)。
fortran-if-indent
if文の各レベルごとに追加する字下げ幅(デフォルトは3)。 この値は、Fortran 90のwhere文の字下げにも使われる。
fortran-structure-indent
structureunionmapの各文の各レベルごとに 追加する字下げ幅(デフォルトは3)。
fortran-continuation-indent
継続行の文本体に追加する字下げ幅(デフォルトは5)。
fortran-check-all-num-for-matching-do
この変数がnilなら、字下げ処理では、 do文はcontinue文で終っていると仮定する。 こうすると、continue以外の文の字下げを計算するときに、 当該文がdo文を終えるかどうか検査しなくてよいので、 時間を節約できる。 この変数がnil以外であれば、 行番号が付いた文の字下げを計算するときには、 当該文がdo文を終えるかどうか検査する必要がある。 デフォルト値はnil
fortran-blink-matching-if
この変数がtなら、endif文の字下げを行うときに、 対応するif文を示すために一時的にカーソルを移動する。 デフォルト値はnil
fortran-minimum-statement-indent-fixed
固定フォーマットの継続行スタイルを採用したときの、文に対する最小字下げ幅。 文本体の字下げ幅がこの値より小さくなることはない。 デフォルト値は6。
fortran-minimum-statement-indent-tab
タブフォーマットの継続行スタイルを採用したときの、文に対する最小字下げ幅。 文本体の字下げ幅がこの値より小さくなることはない。 デフォルト値は8。


Node:Fortran Comments, Next:, Previous:Fortran Indent, Up:Fortran

Fortranのコメント

Emacsの通常のコメント用コマンドは、コメントをコードのあとにも置けると仮定します。 Fortranでは、標準的なコメントの構文は、1つの行全体を必要とします。 そのため、Fortranモードでは、 Emacsの通常のコメント用コマンドを置き換え、新たな変数をいくつか定義しています。

Fortranモードでは、文字!で始まり他のテキストのあとにも置ける 非標準的なコメントの構文も扱えます。 しかし、この構文を受け付けるFortranコンパイラは限られるため、 まえもって指定しておかない限り、 Fortranモードは非標準のコメントを使いません。 このスタイルのコメントを使うには、 変数comment-start"!"を設定します(see Variables)。

M-;
コメントの位置を揃えたり、新たなコメントを挿入する (fortran-indent-comment)。
C-x ;
非標準の!コメントだけに作用する。
C-c ;
リージョン内のすべての行をコメントにする。 あるいは、(引数を指定すると)コメントをコードに戻す (fortran-comment-region)。

FortranモードのM-;は、 コマンドfortran-indent-commentに再定義されています。 通常のM-;と同じく、既存のコメントを認識して、 そのテキストの桁位置を揃えます。 コメントがなければ、コメントを挿入して桁位置を揃えます。 しかし、Fortranモードのコメントの挿入と揃え方は、 他のモードと同じではありません。

新たにコメントを挿入する場合、 現在行が空行のときは(1行全体を占める)行コメントを挿入します。 空行でないとき、非標準のコメントを使うように指定してあれば 非標準の!コメントを挿入します。 いずれでもないときには、現在行のまえに行コメントを挿入します。

非標準の!コメントは他の言語のコメントと同じように揃えられますが、 行コメントの場合はようすが異なります。 標準の行コメントでは、コメント区切りはつねに0桁目にある必要があります。 コメント内部のテキストだけを揃えます。 fortran-comment-indent-styleを設定して、 3種類の揃え方を選べます。

fixed
fortran-comment-line-extra-indentと文に対する最小字下げ幅を合計し た桁位置にテキストを揃える。 デフォルトはこれ。

文の最小字下げ幅は、 固定フォーマットの継続行スタイルの場合には fortran-minimum-statement-indent-fixedの値、 タブフォーマットの場合にはfortran-minimum-statement-indent-tabの値。

relative
コード行であるかのように揃えるが、 fortran-comment-line-extra-indentだけ余計に桁をずらす。
nil
行コメントのテキストを勝手に動かさない。

また、行コメントの字下げ文字を変更したければ、 変数fortran-comment-indent-charに好みの1文字を設定してください。

Fortranモードには、comment-line-startcomment-line-start-skipの2つの変数が新たに導入されています。 これらは、コードのあとに置く通常のコメントに対するcomment-startcomment-start-skipと同様の役割を、行コメントに対して果たします。 どちらもFortranモードが適切に設定するので、 変更する必要はありません。

Emacsの通常のコメント用コマンドC-x ;は、再定義されていません。 このコマンドは!コメントを扱えます。 !コメントを使っていない場合には、 このコマンドはFortranモードでは役に立ちません。

コマンドC-c ;fortran-comment-region)は、 リージョン内のすべての行の先頭にC$$$を挿入して コメントに変えます。 数引数を指定すると、行の先頭からC$$$を削除して、 リージョンを生きたコードに戻します。 これらのコメントに使う文字列は、 変数fortran-comment-regionの設定で制御できます。 ところで、ここではコマンドと変数に同じ名前が使われています。 LispやEmacsにおいては、使用される文脈から コマンドと変数をつねに区別できるので、 このような名前の使い方が問題を起こすことはありません。


Node:Fortran Autofill, Next:, Previous:Fortran Comments, Up:Fortran

Fortran専用自動詰め込み(fortran-auto-fill)モード

Fortran専用自動詰め込み(fortran-auto-fill)モードは、 挿入したFortranの文が長くなりすぎると自動的に文を分割するマイナモードです。 文を分割するには、 fortran-continuation-string(see ForIndent Cont)を用いて 継続行を作ります。 <SPC>、<RET>、<TAB>を打ったときや、 字下げコマンドを使ったときに分割されます。

M-x fortran-auto-fill-modeは、 Fortran専用自動詰め込み(fortran-auto-fill)モードがオンならばオフにし、 オフならばオンにします。 このコマンドは、通常の自動詰め込み(auto-fill)モード (see Filling)であるM-x auto-fill-modeが行うのと 同じように働きます。 正の数引数を指定すると、 Fortran専用自動詰め込み(fortran-auto-fill)モードをオンにし、 負であればオフにします。 このモードのオン/オフは、モード行の括弧の中にFillが あるかどうかで判断できます。 Fortran専用自動詰め込み(fortran-auto-fill)モードはマイナモードなので、 各バッファごとに独立にオン/オフにできます。 See Minor Modes

Fortran専用自動詰め込み(fortran-auto-fill)モードは、 行の長さが規定の幅(fill-columnの値)を越えると、 空白や区切りの位置で行を分割します。 Fortran専用自動詰め込み(fortran-auto-fill)が分割する区切りは、 ,'+-/*=)です。 変数fortran-break-before-delimitersnilの場合には、 区切りのうしろで分割します。 それ以外(デフォルトでもある)では、区切りのまえで分割します。

デフォルトではFortran専用自動詰め込み(fortran-auto-fill)モードはオフです。 この機能を恒常的に使いたければ、 (fortran-auto-fill-mode 1)を実行するフック関数を fortran-mode-hookに追加してください。 See Hooks


Node:Fortran Columns, Next:, Previous:Fortran Autofill, Up:Fortran

桁位置の確認

C-c C-r
現在行の上にしばらくのあいだ『桁定規』を表示する (fortran-column-ruler)。
C-c C-w
現在のウィンドウを一時的に分割して幅を72桁にする。 一部のFortranコンパイラは1行を72文字以内に制限しているので、 このコマンドを使用すれば1行が長くなりすぎることを防げる (fortran-window-create-momentarily)。

コマンドC-c C-rfortran-column-ruler)は、 桁定規をしばらくのあいだ、現在行の上に表示します。 桁定規は、Fortranプログラムにおいて特別な意味をもつ桁位置を表す 2行のテキストです。 2行目の角括弧と中括弧で、それぞれ、行番号と文の本体の範囲を表します。 桁番号は(それらの上の)1行目に表示されます。

GNU Emacsでは桁番号をつねに0から数えることに注意してください。 その結果、桁定規に示される桁番号は、 慣れ親しんだものより1だけ小さくなります。 しかし、それらが表す位置はFortranの標準に従ったものです。

桁定規の表示に用いるテキストは、 変数indent-tabs-modeの値に依存します。 この変数の値がnilならば、 変数fortran-column-ruler-fixedの値を桁定規の表示に使います。 nil以外であれば、変数 fortran-column-ruler-tabの内容を表示に使います。 これらの変数の内容を変更すれば、桁定規の表示を変更できます。

さらに桁合わせを支援するために、 C-c C-wfortran-window-create)は、 現在のウィンドウを幅が72桁になるように横位置で分割します。 このウィンドウで編集すれば、 正しいFortranのプログラムとしては長すぎる行を即座に発見できます。


Node:Fortran Abbrev, Next:, Previous:Fortran Columns, Up:Fortran

Fortranのキーワードの略語

Fortranモードには、一般的なキーワードや宣言に対する 数多くの組み込み略語があります。 これらは、ユーザー自身が定義できる略語と同じ種類のものです。 それらを使うには、略語(abbrev)モードをオンにします。 See Abbrevs

組み込み略語は他の略語と1つの点で変わっています。 すべてセミコロンで始まります。 通常は略語にはセミコロンを使えませんが、 Fortranモードでは、セミコロンの構文上の意味を『単語を構成する文字』に 変更することで、これを可能にしています。

たとえば、continueに対する組み込みFortran略語は;cです。 略語(abbrev)モードがオンのときに、 ;cを挿入してから空白や改行といった句読点文字を挿入すると、 ;cは自動的にcontinueと展開されます。

組み込みFortran略語とその展開形の一覧を表示するには、 ;?あるいは;C-hと打ちます。


Node:Fortran Misc, Previous:Fortran Abbrev, Up:Fortran

Fortranモードのその他のコマンド

C-x n d
現在のFortranの副プログラムにナロイングする。

Fortranモードでは、 キーC-x n dはコマンドfortran-narrow-to-subprogramを実行するように 再定義しています。 このコマンドは、キーの通常の定義をFrotran風にしたものです。 バッファをポイントを含む副プログラムにナロイングします。


Node:Asm Mode, Previous:Fortran, Up:Programs

asmモード

asmモードは、アセンブリコードのファイルを編集するためのメジャーモードです。 つぎのコマンドが定義されています。

<TAB>
tab-to-tab-stop
C-j
改行を挿入し、tab-to-tab-stopで字下げする。
:
コロンを挿入し、コロンに先行するラベルのまえの字下げを取り除く。 そして、tab-to-tab-stopを行う。
;
コメントの挿入/位置揃えを行う。

変数asm-comment-charは、 アセンブラ構文でコメントを開始する文字を指定します。


Node:Building, Next:, Previous:Programs, Up:Top

プログラムのコンパイルとテスト

前章ではプログラムの変更に便利なEmacsコマンドを説明しました。 本章ではプログラムの大規模な開発や保守を助けるコマンドを説明します。


Node:Compilation, Next:, Up:Building

Emacs下でのコンパイラの実行

EmacsはCやFortranのような非対話的な言語のコンパイラを 下位プロセスとして実行でき、 そのエラーログをEmacsバッファに取り込めます。 また、エラーメッセージを解析して、 コンパイルエラーを起こしたソース行を提示することもできます。

M-x compile
Emacs下でコンパイラを非同期に実行し、 エラーメッセージを*compilation*バッファに取り込む。
M-x grep
Emacs下でgrepを非同期に実行し、 一致した行を*grep*バッファに取り込む。
M-x grep-find
指定した引数でfindgrepを実行し、 出力を*grep*バッファに取り込む。
M-x kill-compilation
M-x kill-grep
実行中のコンパイラやgrepのサブプロセスを停止させる。

makeや他のコンパイルコマンドを実行するには、 M-x compileと打ちます。 このコマンドは、ミニバッファでシェルコマンドを読み取り、 そのコマンドを下位シェルで実行し、 出力結果を*compilation*という名のバッファに取り込みます。 カレントバッファのデフォルトディレクトリを シェルコマンド実行時の作業ディレクトリとして用います。 そのため、通常はこのディレクトリにあるものをコンパイルします。

シェルコマンド行を読み取るとき、 ミニバッファにはデフォルトのシェルコマンド行が表示されますが、 これは前回M-x compileを使ったときのコマンドです。 単に<RET>だけを打鍵すると、同じシェルコマンド行を再使用します。 最初のM-x compileでは、デフォルトはmake -kです。 デフォルトのコンパイルコマンドは変数compile-commandから取ります。 適切なコンパイルコマンドが他にある場合には、 ファイルでこの変数のローカルな値を指定すると便利でしょう (see File Variables)。

コンパイルが始まると、バッファ*compilation*は別のウィンドウに 表示されますが、選択されるわけではありません。 このバッファのモード行では、 括弧の中に単語runexitを表示して コンパイルが終了したかどうか示します。 このバッファを見えるようにしておく必要はありません。 いずれにしても、コンパイルは継続されます。 コンパイル中は、すべてのウィンドウのモード行に 文字列Compilingが表示されます。 この文字列が消えれば、コンパイルは終了しています。

コンパイルの進行状況を見たい場合には、 *compilation*バッファに切り替えてポイントをバッファの末尾に移動します。 ポイントがバッファの末尾にあると、 新らたなコンパイル出力はポイントのまえに挿入されポイントは末尾に留まります。 ポイントがバッファの末尾にないと、 コンパイル出力はバッファの末尾に追加されますが ポイントは途中の場所に留まったままです。

変数compilation-scroll-outputnil以外の値を設定すると、 出力が到着するたびに出力に追従するように コンパイルバッファをつねにスクロールします。

コンパイルプロセスを止めるには、 M-x kill-compilationを実行します。 コンパイルプロセスが終了すると、*compilation*バッファの モード行の表示がrunからsignalに変わります。 一度に実行可能なコンパイルは1つだけなので、 新しくコンパイルを始めると実行中のコンパイルは停止させられます。 しかし、M-x compileは、 実行中のコンパイルを実際に停止させるかどうか聞いてきます。


Node:Grep Searching, Next:, Previous:Compilation, Up:Building

Emacs下でのgrepによる探索

Emacsからコンパイラを実行し、コンパイルエラーを起こした行を 訪れることができるように、grepを実行して 一致した行を訪れることができます。 これは、grepが報告した一致を『エラー』として扱うことで行います。

それには、M-x grepと打鍵してから、 grepをどのように実行するかを指定するコマンド行を入力します。 普通にgrepを実行するときに指定する引数と同じものを使います。 つまり、grep流の (普通、シェルの特殊文字をクォートするためにシングルクォートで囲んだ) 正規表現に続けて、ワイルドカードなどを用いたファイル名を指定します。 grepの出力は*grep*バッファに入ります。 ファイル内の対応する行を探すには、コンパイルエラーの場合と同様に、 C-x `と<RET>を使います。

M-x grepに前置引数を指定すると、 ポイントの周りから(探すべき)タグを推測して デフォルトのgrepコマンドにそれを含めます。

M-x grep-findM-x grepコマンドと同様ですが、 シェルコマンドに与える最初のデフォルトが違います。 findgrepの両方を実行して、 ディレクトリ木構造下の各ファイルを探索します。 Dired and Findfind-grep-diredコマンドも参照してください。


Node:Compilation Mode, Next:, Previous:Grep Searching, Up:Building

コンパイルモード

*compilation*バッファは、 コンパイル(compilation)モードと呼ばれる特別なメジャーモードになります。 このモードの主な機能は、エラーが起きたソース行を簡単に参照できることです。

C-x `
つぎのコンパイルエラーやgrepのつぎの一致に 対応する箇所を訪れる。
<RET>
ポイントが位置するエラーメッセージに対応する箇所を訪れる。 このコマンドは、コンパイルバッファで使う。
Mouse-2
マウスでクリックしたエラーメッセージに対応する箇所を訪れる。

*compilation*でエラーメッセージにポイントを持っていって <RET>(compile-goto-error)を打鍵すれば、 そのエラーの原因となったソースを訪問できます。 あるいは、エラーメッセージをMouse-2でクリックしますが、 このときは、あらかじめ*compilation*バッファに 切り替えておく必要はありません。

コンパイラのエラーメッセージを順番に解析するには、 C-x `next-error)と打鍵します。 C-xに続く文字は、シングルクォートではなく バッククォート、すなわち、『アクサングレーブ』です。 このコマンドは*compilation*だけでなく、 すべてのバッファで使用可能です。 このコマンドは、一方のウィンドウの先頭にエラーメッセージを表示し、 別のウィンドウにエラーとなったソースコードを表示します。

コンパイル開始後に最初にC-x `を使うと、 最初のエラー箇所に移動します。 続けてC-x `を実行すると、次々にエラー箇所に移動していきます。 <RET>やMouse-2で特定のエラー箇所に移動したあとに C-x `コマンドを実行すると、その場所のつぎのエラー箇所に移動します。 バッファの末尾に到達してもうエラーメッセージがないと、 C-x `コマンドは失敗し、エラーを通知します。

C-u C-x `は、コンパイルバッファの先頭から解析を始めます。 コンパイルをやり直さずに一連のエラーの解析をもう一度行う方法の1つです。

コンパイル(compilation)モードでは、 <SPC>キーと<DEL>キーを1画面分のスクロールに、 M-nM-pを1つつぎ/まえのエラーメッセージへの移動に再定義します。 また、別のソースファイルのエラーメッセージへの移動には、 M-{M-}コマンドを使えます。

コンパイル(compilation)モードの機能は、 コンパイルマイナ(compilation-minor)モードと呼ばれるマイナモードでも 使えます。 これにより、普通のコンパイルバッファだけでなく任意のバッファ内の エラーメッセージを解析できます。 このマイナモードをオンにするには、 M-x compilation-minor-modeと打鍵します。 すると、メジャーモードのコンパイル(compilation)モードと同様に <RET>キーとMouse-2を定義します。

バッファの内容が認識できる形式である限り、 コンパイルマイナ(compilation-minor)モードは任意のバッファで動作します。 rloginバッファ(see Remote Host)では、 コンパイルマイナ(compilation-minor)モードは リモートのソースファイルをFTPで自動的に取ってきます(see File Names)。


Node:Compilation Shell, Next:, Previous:Compilation Mode, Up:Building

コンパイルのためのサブシェル

Emacsはシェルを使ってコンパイルコマンドを実行しますが、 非対話的なシェルになるようなオプションを指定します。 つまり、シェルはプロンプトを出さずに実行を開始するはずです。 *compilation*バッファに通常のシェルプロンプトがぶざまに現れる場合は、 個人のシェル初期化ファイルでプロンプトを無条件に設定していることを 意味します。 (シェル初期化ファイルの名前は、.bashrc.profile.cshrc.shrcなどだが、 使っているシェルによってさまざまな場合がある。) シェル初期化ファイルでは、プロンプトがすでに設定されているときだけ プロンプトを再設定するべきです。 たとえば、cshでは以下のようにします。

if ($?prompt) set prompt = ...

bashでは以下のようにします。

if [ "${PS1+set}" = set ]
then PS1=...
fi

読者のシェル初期化ファイルには、対話的なシェルに対してだけ 本来は設定するべきことがまだあるかもしれません。 同じ方法を用いて、それらを状況に応じて設定するようにできます。

MS-DOS『オペレーティングシステム』では、 非同期のサブプロセスを使えません。 対応策として、MS-DOSではM-x compileは コンパイルコマンドを同期的に実行します。 その結果、Emacs上で他の作業を行うには、 コンパイルコマンドの終了を待つ必要があります。 See MS-DOS


Node:Debuggers, Next:, Previous:Compilation Shell, Up:Building

Emacs下でのデバッガの実行

GUD(Grand Unified Debugger、大統一デバッガ)ライブラリは、 Emacsからさまざまなデバッガへのインターフェイスを提供します。 フリーソフトウェアであるGDBをお勧めしますが、 DBX、SDB、XDBを持っているならばそれらを使うこともできます。 GUDは、Perlのデバッグモード、 PythonのデバッガPDB、JavaデバッガJDBに対するインターフェイスにもなります。


Node:Starting GUD, Next:, Up:Debuggers

GUDの起動

デバッガを開始するコマンドはいくつかあり、 それぞれ、特定のデバッガに対応しています。

M-x gdb <RET> file <RET>
EmacsのサブプロセスとしてGDBを実行する。 このコマンドは、GDBへの入出力用のバッファを新たに作り、 そのバッファへ切り替える。 GDBバッファが既存の場合は、そのバッファへ切り替えるだけ。
M-x dbx <RET> file <RET>
同様に、GDBのかわりにDBXを実行する。
M-x xdb <RET> file <RET>
同様に、GDBのかわりにXDBを実行する。 ソースファイルを探索するディレクトリ群を指定するには、 変数gud-xdb-directoriesを使う。
M-x sdb <RET> file <RET>
同様に、GDBのかわりにSDBを実行する。

SDBのバージョンによっては、メッセージにソースファイル名を 含めないものがある。 そのようなSDBを使う場合には、GUDがソースコードから関数を探せるように 正しいタグテーブル(see Tags)が必要である。 タグテーブルを訪問していなかったり、 タグテーブルに当該関数がなかったりすると、 The sdb support requires a valid tag table to workという メッセージが表示される。 このような場合には、作業ディレクトリに正しいタグファイルを生成してから やり直す。

M-x perldb <RET> file <RET>
Perlプログラムfileをデバッグするために Perlインタープリタをデバッグモードで実行する。
M-x jdb <RET> file <RET>
fileをデバッグするためにJavaデバッガを実行する。
M-x pdb <RET> file <RET>
fileをデバッグするためにPythonデバッガを実行する。

これらのコマンドは引数を1つ、 つまり、デバッガを起動するコマンド行を取ります。 もっとも単純な場合は、デバッグしたい実行ファイルの名前を指定します。 デバッガに指定できるオプションを使うこともできます。 しかし、シェルのワイルドカードや変数名は使えません。 GUDは、-で始まらない最初の引数をデバッグする実行ファイル名であると 仮定します。

Emacsはデバッガプロセスを一度に1つだけ実行できます。


Node:Debugger Operation, Next:, Previous:Starting GUD, Up:Debuggers

デバッガの操作

GUDの下でデバッガを実行すると、 デバッガは通常の入出力にEmacsバッファを使います。 このバッファをGUDバッファと呼びます。 デバッガはEmacsバッファでファイルを訪問して、 プログラムのソースファイルを表示します。 このようなバッファの1つに矢印(=>)が表示され、 現在実行している行を表示します。 このバッファでポイントを動かしても矢印は動きません。

ソースファイルを表示したバッファでは、いつでもソースファイルを編集できます。 矢印はファイルのテキストの一部ではなく、画面上に表示されているだけです。 ソースファイルを変更するとき、 行を挿入/削除すると矢印の表示位置情報が失われることに注意してください。 GUDには、変更前のデバッガメッセージから変更後の対応する行番号を知る術は ありません。 また、デバッガにソースの変更を反映するには、 プログラムを再コンパイルしてから再実行する必要があります。

お好みならば、シェル(shell)モードの変形を用いた デバッガバッファを介して、デバッガプロセスを完全に制御することもできます。 こうすれば、デバッガのすべてのコマンドを利用でき、 シェル(shell)モードの履歴機能を用いて コマンドを繰り返し実行できます。 See Shell Mode


Node:Commands of GUD, Next:, Previous:Debugger Operation, Up:Debuggers

GUDのコマンド

GUD対話バッファはシェル(shell)モードの変形を使うので、 シェル(shell)モードのコマンドを使えます(see Shell Mode)。 GUDモードでは、ブレークポイントの設定と解除、スタックフレームの選択、 プログラムのステップ実行などのコマンドもあります。 これらのコマンドはGUDバッファでもそれ以外でも使えますが、 キーバインドは異なります。

ブレークポイントコマンドは、普通、ソースファイルのバッファで使います。 というのは、ソース上でブレークポイントを設定/解除するのが自然だからです。 以下はブレークポイントを設定するグローバルコマンドです。

C-x <SPC>
ポイントがあるソース行にブレークポイントを設定する。

以下はその他のGUDモード特有のコマンドです。 C-cで始まるキー列は、GUD対話バッファだけで使えます。 C-x C-aで始まるキー列は、 GUD対話バッファとソースファイル(のバッファ)の両方で使えます。

C-c C-l
C-x C-a C-l
GUDバッファで参照した最後の行を別のウィンドウに表示する (つまり、最新の実行位置メッセージが指す行を表示する)。 これは、コマンドgud-refreshを実行する。
C-c C-s
C-x C-a C-s
ソースコード1行分を実行する(gud-step)。 その行に関数呼び出しが含まれる場合は、呼び出された関数に入ってから停止する。
C-c C-n
C-x C-a C-n
ソースコード1行分を実行し、関数呼び出しでも 停止せずにフルスピードで実行する(gud-next)。
C-c C-i
C-x C-a C-i
機械語1命令を実行する(gud-stepi)。
C-c C-r
C-x C-a C-r
停止位置を指定せずに実行を継続する。 プログラムの実行は、ブレークポイントに出会う、 プログラムが終了する、 デバッガが監視しているシグナルを受け取るまで実行を継続する。
C-c C-d
C-x C-a C-d
現在のソース行にブレークポイントがあるならばそれを削除する (gud-remove)。 GUD対話バッファでこのコマンドを使うと、 プログラムが最後に停止した行に適用される。
C-c C-t
C-x C-a C-t
現在のソース行に一時的なブレークポイントを設定する。 GUD対話バッファでこのコマンドを使うと、 プログラムが最後に停止した行に適用される。

上にあげたコマンドは、(GUDから使える)すべてのデバッガに共通です。 GDBやDBX(のあるバージョン)では、さらに以下のコマンドも使えます。

C-c <
C-x C-a <
1つ外側のスタックフレームを選択する(gud-up)。 これはupコマンドと等価。
C-c >
C-x C-a >
1つ内側のスタックフレームを選択する(gud-down)。 これはdownコマンドと等価。

GDBを使う場合には以下のコマンドも使用できます。

<TAB>
GDBでは、シンボル名を補完する(gud-gdb-complete-command)。 このキーはGUDの対話バッファでだけ使える。 また、GDBのバージョンは4.13以降であること。
C-c C-f
C-x C-a C-f
あらかじめ選択したスタックフレームから戻る (あるいは、他の理由で停止する)までプログラムを実行する。

これらのコマンドは、意味がある場合には数引数を反復回数として解釈します。

<TAB>は、補完コマンドとして働くため、 GDBでデバッグしているプログラムへのタブの入力には使えません。 タブを入力するにはC-q <TAB>と打鍵します。


Node:GUD Customization, Previous:Commands of GUD, Up:Debuggers

GUDのカスタマイズ

GUDが実行を開始すると、 GDBの場合はgdb-mode-hook、 DBXの場合はdbx-mode-hook、 SDBの場合はsdb-mode-hook、 XDBの場合はxdb-mode-hook、 Perlのデバッグモードの場合はperldb-mode-hook、 PDBの場合はpdb-mode-hook、 JDBの場合はjdb-mode-hookのフックを実行します。 これらのフックを使って、デバッガの対話バッファ用に 自前のキーバインドを定義できます。 See Hooks

以下は、特定のコマンド文字列をデバッガに送るコマンドを定義し、かつ、 そのコマンドに対するキーバインドをデバッガの対話バッファに設定する 便利な方法です。

(gud-def function cmdstring binding docstring)

これは、デバッガプロセスにcmdstringを送る functionという名前のコマンドを定義し、 そのコマンドの説明文字列をdocstringとします。 このように定義したコマンドは、どのバッファでも使えます。 bindingnil以外の場合、 gud-defはGUDバッファのモードに対しては このコマンドをC-c bindingにバインドし、 それ以外に対してはC-x C-a bindingにバインドします。

コマンド文字列cmdstringには、 functionが呼び出されたときにデータが埋め込まれる %系列を含めることもできます。

%f
現在のソースファイルの名前。 カレントバッファがGUDバッファだった場合には、 『現在のソースファイル』とは プログラムが停止した箇所に対応するソースファイル。
%l
現在のソース行番号。 カレントバッファがGUDバッファだった場合には、 『現在のソース行番号』とは プログラムが停止した箇所に対応するソースファイルの行番号。
%e
ポイント位置あるいはポイントに隣接する Cの左辺値か関数呼び出し式。
%a
ポイント位置あるいはポイントに隣接する 箇所の16進数表記アドレス。
%p
functionを呼ぶときに指定された数引数を10進値表記したもの。 数引数なしで呼ばれた場合、%pは空文字列。

cmdstring%pを使用しなければ、 定義しようとしているfunctionは数引数を無視する。


Node:Executing Lisp, Next:, Previous:Debuggers, Up:Building

Lisp式の実行

Emacsには、LispやSchemeのための異なったメジャーモードがいくつかあります。 これらは編集コマンドという意味では同じですが、 Lisp式を実行するコマンドが異なります。 各モードには固有の目的があります。

emacs-lispモード
このモードはEmacs Lispで実行するプログラムのソースファイル編集用。 このモードでは、現在の関数定義を評価するC-M-xを定義する。 see Lisp Libraries
lisp対話モード(Lisp Interaction mode)
このモードはEmacs Lispの対話セッション用。 ポイントの直前のS式を評価し、その値をバッファに挿入するC-jを定義する。 see Lisp Interaction
lispモード
このモードはEmacs Lisp以外のLispで実行するプログラムのソースコード編集用。 このモードでは、 現在の関数定義を下位のLispプロセスに送るC-M-xを定義する。 see External Lisp
下位lispモード(Inferior Lisp mode)
このモードは下位Lispプロセスとの対話セッション用。 このモードは、lispモードとシェル(shell)モード(see Shell Mode) の特別な機能の組み合わせ。
schemeモード
lispモードと同様だが、Schemeプログラム編集用。
下位Schemeモード(Inferior Scheme mode)
このモードは下位のSchemeプロセスとの対話セッション用。

Lispプログラム用の編集コマンドの大部分は事実上どこでも使えます。 See Programs


Node:Lisp Libraries, Next:, Previous:Executing Lisp, Up:Building

Emacs用のLispコードのライブラリ

Emacs編集コマンドのLispコードは、習慣的に.elで終る名前の ファイルに格納されています。 これらの拡張子は、 emacs-lispモードで編集するようにEmacsに指示します (see Executing Lisp)。

Emacs Lispコードのファイルを実行するには、 M-x load-fileを使います。 このコマンドは、ミニバッファでファイル名を読み取り、 そのファイルの内容をLispコードとして実行します。 あらかじめファイルを訪問しておく必要はありません。 いずれにしても、このコマンドはディスク上のファイルを読むのであって、 Emacsバッファのテキストを読むのではありません。

LispコードのファイルをEmacs Lispライブラリのディレクトリに置いておけば、 そのファイルはM-x load-libraryでロードできます。 プログラムからは、load-libraryを呼んでロードするか、あるいは、 より基本的な類似の関数で余分な引数も指定できるloadでロードします。

M-x load-libraryM-x load-fileと異なる点は、 一連のディレクトリについて3つのファイル名を順に調べるということです。 引数がlibだとすると、3つのファイル名とは、 lib.elclib.el、そして最後にlibです。 lib.elcというファイルが存在すれば、 これは習慣としてlib.elをコンパイルしたものです。 コンパイル済みのファイルはロードと実行が速いので、 こちらをロードするほうが有利です。

load-librarylib.elcよりも新しい lib.elをみつけると、警告を出力します。 というのは、.elファイルを変更後に再コンパイルし忘れている 可能性があるからです。

load-libraryの引数は、通常、それ自体では 正しいファイル名でないことが多いため、ファイル名の補完はできません。 もちろん、このコマンドを使うとき、 指定すべき正確なファイル名を普通は知らないでしょうが。

M-x load-libraryが探索するディレクトリの順番は、 変数load-pathで指定します。 その値は、ディレクトリ名の文字列から成るリストです。 リストのデフォルト値には、Emacs自身のLispコードを収めたディレクトリが 含まれます。 個人用のLispライブラリがあるならば、それらを1つのディレクトリにまとめ、 そのディレクトリ名をload-pathに追加してください。 リスト内のnilはカレントデフォルトディレクトリを表しますが、 リストにnilを加えることはあまり勧められません。 リストにnilが本当に必要だと感じたときには、 それについてはM-x load-fileを実行するのでは いけないだろうかと考えてみてください。

ライブラリの中で定義されているコマンドに対しては、 そのライブラリを自動的にロード(autoload)するように 設定されているので、ほとんどの場合、ライブラリをロードするコマンドを 指定する必要はないでしょう。 ライブラリをロードするためにloadを呼び出すようなコマンドを1つ 試してみてください。 こうすると、「自動的にロードする」という定義が ライブラリ内の実際の定義で置き換わります。

Emacs Lispコードはバイトコードにコンパイルできます。 コンパイルすると、ロードが速くなり、ロードしても必要な記憶容量が少なくなり、 実行も速くなります。 See Byte Compilation。 習慣として、ライブラリのコンパイル済みのコードは、 ライブラリのソースファイル名にcを付けた名前の 別のファイルに入ります。 したがって、foo.elのコンパイル済みのコードは、foo.elcに入ります。 これが、load-libraryはまず.elcというファイルを探す理由です。


Node:Lisp Eval, Next:, Previous:Lisp Interaction, Up:Building

Emacs Lisp式の評価

Emacs内で動かすつもりのLispプログラムは、emacs-lispモードで編集しましょう。 ファイル名が.elで終っているファイルを編集すると、 自動的にこのモードになります。 一方、lispモードは、他のLispシステム向けのLispプログラムを編集する ためのモードです。 陽にemacs-lispモードに移るには、コマンドM-x emacs-lisp-modeを使います。

Emacs内で動くプログラムのテストには、 Emacsバッファにあるプログラムの一部を評価すると便利です。 たとえば、Lispの関数定義のテキストを変更してからその定義を評価すると、 それ以降にその関数を呼び出すと使われるようにインストールされます。 Lisp式を評価すると非対話的な(コマンドではない)関数を起動できるので、 どんな種類の編集作業にも便利です。

M-:
ミニバッファで1つのLisp式を読み取り、それを評価し、 その値をエコー領域に表示する (eval-expression)。
C-x C-e
ポイントの直前のLisp式を評価し、その値をエコー領域に表示する (eval-last-sexp)。
C-M-x
ポイントを含むか直後にある関数定義(defun)を評価し、 その値をエコー領域に表示する(eval-defun)。
M-x eval-region
リージョン内のすべてのLisp式を評価する。
M-x eval-current-buffer
バッファ内のすべてのLisp式を評価する。

M-:eval-expression)は、Lisp式を対話的に評価する もっとも基本的なコマンドです。 これは、ミニバッファで式を1つ読み取りますから、 バッファの内容に関係なくバッファ内でどんな式でも実行できます。 式が評価されたあとは、 M-:を打鍵したときのカレントバッファが、ふたたびカレントバッファになります。

emacs-lispモードでは、キーC-M-xはコマンドeval-defunにバインド されています。 このコマンドはポイントを含むか直後にある関数定義を Lisp式として解析し評価します。 その値はエコー領域に表示されます。 このコマンドは、関数定義のテキストの変更を Lisp環境に反映するのに便利です。

C-M-xdefvar式を特別扱いします。 通常、変数にすでに値が定義されている場合には、 defvar式を評価しても何もしません。 しかし、C-M-xは、defvar式で指定されている 初期値に変数の値を戻します。 この特別な機能は、Lispプログラムをデバッグするときに便利です。

コマンドC-x C-eeval-last-sexp)は、 ポイントのまえにあるLisp式を評価し その値をエコー領域に表示します。 このコマンドはemacs-lispモードだけでなく、 すべてのメジャーモードで使えます。 このコマンドは、defvarを特別扱いしません。

C-M-xC-x C-eM-:に数引数を指定すると、 値をエコー領域に表示するかわりにカレントバッファのポイント位置に挿入します。 引数の値は関係ありません。

バッファでLisp式を評価するもっとも一般的なコマンドはeval-regionです。 M-x eval-regionは、リージョン内の1つ以上のLisp式を解析して、 それらを1つずつ順に評価します。 M-x eval-current-bufferも同様ですが、バッファ全体を評価します。 これは、 テスト準備が整ったLispコードのファイルの内容を取り込むうまい方法です。 個々の関数のバグを発見して修正したら、 変更した関数それぞれにC-M-xを使います。 これによって、Lispの環境とソースファイルが一致します。


Node:Lisp Interaction, Next:, Previous:Lisp Libraries, Up:Building

lisp対話バッファ

Emacsが動き始めたときに選択されるバッファ*scratch*は、 Emacs内でLisp式を対話的に評価するためのものです。

*scratch*バッファを使うもっとも簡単な方法は、 Lisp式を挿入してから各式の末尾でC-jと打つことです。 このコマンドは、ポイントの直前のLisp式を読み取り、 それを評価し、その値を表示形式でポイントのまえに挿入します。 この結果は、評価した式とその値の完全なtypescript 34です。

*scratch*バッファのメジャーモードは lisp対話(lisp interaction)モードであり、 C-jのバインディングを除けば emacs-lispモードと同じです。

この機能が存在する理由を説明しましょう。 Emacsが実行を開始すると何かしらバッファが必要です。 しかし、ファイルを訪問するたびに新たにバッファが作られるので、 このバッファはファイルを編集するのには適しません。 最初のバッファをLispインタープリタのtypescriptにするというのが 作者が考えついたもっともよい方法でした。 M-x lisp-interaction-modeと打つと、 カレントバッファはlisp対話(lisp interaction)モードになります。

Emacs Lisp式を対話的に評価する別の方法は、 下位emacs-lispモードを使うことです。 このモードは、シェル(shell)モード(see Shell Mode)に似た インターフェイスでEmacs Lisp式を評価できます。 M-x ielmと打てば、 下位emacs-lispモードを使う*ielm*バッファが作られます。


Node:External Lisp, Previous:Lisp Eval, Up:Building

外部Lispの実行

Emacsには他のLispシステム上でプログラムを実行する機能があります。 LispプロセスをEmacsの下位プロセスとして実行し、 それに式を渡して評価させることができます。 また、Lispプログラムを編集するEmacsバッファの中で変更した 関数定義をそのまま下位のLispプロセスに渡すこともできます。

下位のLispプロセスを実行するには、M-x run-lispと打ちます。 このコマンドは、シェルコマンドとしてlispと入力するのと同じ lispという名前のプログラムを実行し、 プログラムの入出力は*lisp*という名前のEmacsバッファを 介してやりとりされます。 つまり、Lispからの『端末出力』はバッファに入りポイントを進め、 Lispへの『端末入力』はバッファのテキストから取られます。 (実行したいLisp実行ファイルの名前を変えるには、 変数inferior-lisp-programを設定する。)

Lispに入力を与えるには、バッファの末尾に移動してから入力を打鍵し、 最後に<RET>を打ちます。 *lisp*バッファは下位lisp(inferior lisp)モードになっていて、 シェル(shell)モード(see Shell Mode) のほとんどの機能にlispモードの特別な特性を組み合わせています。 サブプロセスに1行を送るという<RET>の定義は、 シェル(shell)モードの機能の1つです。

外部Lispで実行するプログラムのソースファイルにはlispモードを使います。 このモードはM-x lisp-modeで選択できます。 また、ほとんどのLispシステムで使われる .l35.lsp.lispで終る名前のファイルには このモードが自動的に使われます。

実行中のLispプログラムの関数を編集しているとき、 変更した定義を下位のLispプロセスに送るもっとも簡単な方法は キーC-M-xです。 lispモードでは、このキーは関数lisp-eval-defunを実行します。 この関数は、ポイントの周りや直後の関数定義を探し、 それをLispプロセスの入力へ送ります。 (Emacsはカレントバッファが何であるかに関わりなく、 どんな下位プロセスにも入力を送ることができる。)

C-M-xコマンドの (任意のLispシステムで実行するプログラムの編集用)lispモードでの意味と (Emacsで実行するLispプログラムの編集用)emacs-lispモードでの意味を 比較してみましょう。 どちらのモードでもポイントを含む関数定義をインストールしますが、 関連するLisp環境がどこにあるかに応じて、その方法は異なります。 See Executing Lisp


Node:Abbrevs, Next:, Previous:Building, Up:Top

略語の利用法

定義済みの略語(abbrev)とは、 挿入時に別のテキストに展開される単語のことです。 略語を定義するときに、それをどう展開するか指定します。 たとえば、fooを略語として、 find outer otterに展開すると定義したとします。 すると、f o o <SPC>と打鍵すれば バッファにはfind outer otter 36 が挿入されます。

略語の別な形に、動的略語展開(dynamic abbrev expansion)があります。 動的略語展開とは、バッファ中のポイントのまえにある文字列を バッファ内にあるその文字列で始まる既存の単語に展開することで、 陽にコマンドを実行して行います。 See Dynamic Abbrevs


Node:Abbrev Concepts, Next:, Up:Abbrevs

略語の考え方

略語とは、あらかじめどう展開するか定義された単語のことです。 略語に続けて、空白、タブ、ピリオドなどの単語の区切り文字を入力すると、 略語は展開されて展開形に置き換わります。 たとえば、略語fooを展開形find outer otterに展開するように 定義しておけば、f o o .と打鍵すると find outer otter.をバッファに挿入できます。

略語は、略語(abbrev)モード(マイナモード)がオンのときにだけ展開されます。 略語(abbrev)モードをオフにしても定義した略語が消えてしまうわけではなく、 つぎにオンにしたときに同じ定義をふたたび使えます。 コマンドM-x abbrev-modeでこのモードのオン/オフをトグル(切り替えが) できます。 また、数引数を指定した場合、 引数が正のときには略語(abbrev)モードはオンになり、 それ以外のときにはオフになります。 See Minor Modesabbrev-modeは変数でもあります。 この変数がnil以外のときには略語(abbrev)モードはオンです。 この変数に値を設定すると、自動的にカレントバッファに ローカルな変数になります。

略語定義はモードに固有にできます。 つまり、あるメジャーモードのときにだけ働くように定義できます。 略語はグローバルにも定義でき、 そのときはすべてのメジャーモードで使えます。 同じ略語に、グローバルな定義と、さまざまなメジャーモードに固有な定義とを 持たせることができます。 あるメジャーモードに固有な定義は、グローバルな定義に優先します。

略語は、編集作業中に対話的に定義できます。 略語の定義一覧を、あとで使うためにファイルに保存することもできます。 大量の略語定義をセッションごとにロードする人もいます。


Node:Defining Abbrevs, Next:, Previous:Abbrev Concepts, Up:Abbrevs

略語の定義方法

C-x a g
ポイントのまえの単語を展開形として、略語を定義する。 (add-global-abbrev)。
C-x a l
上と同様。 ただし、現在のメジャーモードに固有な略語を定義する。 (add-mode-abbrev)。
C-x a i g
バッファ中の1単語を略語として定義する。 (inverse-add-global-abbrev)。
C-x a i l
バッファ中の1単語をモードに固有な略語として定義する。 (inverse-add-mode-abbrev)。
M-x kill-all-abbrevs
このコマンドは現在有効なすべての略語定義を抹消し空にする。

略語を定義する普通の方法は、 まず、略語に置き換わってほしい展開形のテキストを入力し、 つぎにその直後にポイントをもっていき、 C-x a gadd-global-abbrev)と打鍵します。 すると、ミニバッファを用いて略語を読み取り、 ポイントの直前の単語(群)に対する略語として登録します。 展開形として用いる単語の個数は、数引数で指定します。 たとえば、略語fooをまえのように定義するには、 テキストfind outer otterを挿入し、 続いてC-u 3 C-x a g f o o <RET>と打鍵します。

C-x a gに数引数として0を指定すると、 展開形はリージョンの内容になります。

コマンドC-x a ladd-mode-abbrev)も同様ですが、 特定のモードに固有な定義になります。 モードに固有な略語は、特定のメジャーモードの中だけで有効です。 C-x a lは、C-x a lと打鍵したときのメジャーモードに対する 略語を定義します。 引数の意味はC-x a gと同じです。

すでにバッファ内にあるテキストを略語として使いたい場合には、 C-x a gのかわりにコマンドC-x a i ginverse-add-global-abbrev)、あるいは、 C-x a lのかわりにコマンドC-x a i linverse-add-mode-abbrev)を使います。 これらは『逆さ』(inverse)コマンドと呼ばれます。 というのは、これらのコマンドで使う (バッファにあるものとミニバッファから読むものの)2つの文字列 の用途が逆さだからです。

略語の定義を変更するには、単に新たに定義してください。 略語がすでに定義されていると、 略語定義コマンドは置き換えてよいかどうかを確認してきます。

略語の定義を削除するには、略語定義コマンドに負の数引数を指定します。 C-u - C-x a gC-u - C-x a lのようにします。 前者はグローバルな定義を、後者はモードに固有な定義を削除します。

M-x kill-all-abbrevs は、グローバルとローカルのすべての略語定義を 削除します。


Node:Expanding Abbrevs, Next:, Previous:Defining Abbrevs, Up:Abbrevs

略語展開の制御

ポイントの直前に略語があるときに白文字や区切り文字(<SPC>、コンマなど) を打鍵すると、略語はつねに展開されます。 より正確には、英単語の構成文字以外のどんな文字でも略語展開は起こり、 英単語の構成文字の任意の組み合わせを略語に使用できます。 略語の通常の使い方は、略語を入力してから区切り文字を入力して 展開を行わせるという方法です。

略語展開では大文字小文字を保存します。 したがって、 foofind outer otterに、 FooFind outer otterに展開されます。 また、変数abbrev-all-capsに応じて、FOOは (変数の値がnil以外のときは) FIND OUTER OTTER、あるいは、Find Outer Otterに展開されます

以下は略語展開を制御するために使うコマンドです。

M-'
これまで入力した部分を これから入力する略語から分離する。
C-x a e
ポイントの直前の略語を展開する(expand-abbrev)。 このコマンドは略語(abbrev)モードがオンでなくても働く。
M-x expand-region-abbrevs
リージョン中のいくつかの、あるいはすべての略語を展開する。

接頭辞が付いた略語を展開したい場合もあるでしょう。 略語cnstconstructionに展開されるとして、 reconstructionと入力するためにこの略語を使いたいとします。 recnstと打鍵してもだめです。 というのは、recnstは定義済みの略語ではないからです。 ではどうすればよいかというと、 接頭辞reと略語cnstのあいだでコマンドM-'abbrev-prefix-mark)を使うのです。 まずreと打ち込みます。 続いてM-'と打鍵します。 するとバッファにハイフン(-)が挿入され、切れ目が入ったことを示します。 それから略語cnstを入力します。 バッファにはre-cnstと入っています。 ここで単語構成文字以外の文字を打ち込めば、 略語cnstconstructionに展開されます。 展開時にはM-'が挿入したハイフン(-)は削除されます。 結果は、望みどおりのreconstructionです。

もし、略語を展開しないでそのまま残しておきたい場合には、 C-qに続けて区切り文字を入れます。 つまり、foo C-q ,とすると、バッファにはfoo,のまま残ります。

まちがって略語を展開してしまった場合には、 C-_(see Undo)と打鍵すれば、展開をアンドゥし略語に戻せます。 このとき略語展開を引き起こした区切り文字も削除されます。 略語を展開せずに区切り文字とともに入力したいならば、 区切り文字をC-qでクォートして挿入します。 区切り文字を削除せずに直前に展開したものを略語に戻すには、 コマンドM-x unexpand-abbrevを使うこともできます。

M-x expand-region-abbrevs は、リージョン全体にわたって定義済みの略語を 探し、みつかったそれぞれについてそれを展開するかを聞いてきます。 このコマンドは、略語(abbrev)モードをオンにし忘れて略語を用いた テキストを入力してしまったときに便利です。 あるいは、特別な略語定義一式を用いて 一度に全体を置き換えるときにも便利です。 このコマンドは略語(abbrev)モードがオンでなくても使えます。

略語を展開するときには、フックpre-abbrev-expand-hook (see Hooks)が実行されます。


Node:Editing Abbrevs, Next:, Previous:Expanding Abbrevs, Up:Abbrevs

略語の表示と編集

M-x list-abbrevs
すべての略語定義を表示する。
M-x edit-abbrevs
略語の一覧を編集する。 定義を追加、変更、削除できる。

M-x list-abbrevsの出力はつぎのようになります。

(lisp-mode-abbrev-table)
"dk"	       0    "define-key"
(global-abbrev-table)
"dfn"	       0    "definition"

(空行には意味はない。 また、いくつかのモードの略語表は省略した。)

括弧で括られた名前から成る行は、特定モードの略語表のヘッダです。 global-abbrev-tableには、グローバルな略語定義が入っています。 また、メジャーモード名からとったそれ以外の名前の略語表には、 モードに固有な略語が入っています。

各略語表では、空でない各行が1つの略語を定義します。 行の先頭の単語は略語です。 つぎに続く数字はこの略語を展開した回数です。 Emacsは、略語が実際にどれだけ使われているか数えていて、 あまり使わない定義を削除できるようにしています。 行の最後の文字列が展開形です。

M-x edit-abbrevsにより、Emacsバッファ内の略語一覧を編集することで 略語定義の追加、変更、削除を行えます。 一覧の形式は上で述べたものと同じです。 このバッファは*Abbrevs*と呼ばれ、 略語編集(edit-abbrevs)モードになっています。 このバッファでC-c C-cと打鍵すると、 バッファで指定したように略語定義が登録され、 バッファにない略語定義は削除されます。

コマンドedit-abbrevsは実際にはlist-abbrevsと同ですが、 前者はバッファ*Abbrevs*を選択するのに対し、 後者はバッファを別のウィンドウに表示するだけです。


Node:Saving Abbrevs, Next:, Previous:Editing Abbrevs, Up:Abbrevs

略語の保存

以下のコマンドは、編集セッション間で略語定義を保存するためのものです。

M-x write-abbrev-file <RET> file <RET>
ファイルfileにすべての略語定義を書き出す。
M-x read-abbrev-file <RET> file <RET>
ファイルfileから略語定義を読み込み、その指定どおりに定義する。
M-x quietly-read-abbrev-file <RET> file <RET>
上と同様だが、処理経過を表示しない。
M-x define-abbrevs
カレントバッファ内の定義で略語を定義する。
M-x insert-abbrevs
すべての略語とその展開形をカレントバッファに挿入する。

M-x write-abbrev-fileは、ミニバッファからファイル名を読み取り、 そのファイルにすべての略語定義情報を書き出します。 このコマンドは、 以後のセッションで使うために略語定義を保存するために使います。 ファイルに保存されるテキストは一連のLisp式であり、 これらの式を実行すると、現状と同じ略語が定義されます。

M-x read-abbrev-fileは、ミニバッファからファイル名を読み取り、 そのファイルを読み込んでファイルの内容に従って略語を定義します。 M-x quietly-read-abbrev-fileも同じですが、 現在何が進行しているかをエコー領域に表示しません。 このコマンドは、.emacsファイルで使うことに主眼があります。 どちらのコマンドも、空の引数を指定すると 変数abbrev-file-nameに指定したファイル名を使います。 この変数のデフォルトは"~/.abbrev_defs"です。

Emacsは、略語定義を変更してあると自動的に略語定義を保存するかどうか、 (C-x sC-x C-cなどで)すべてのファイルを保存するかどうか 問い合わせるときに同時に聞いてきます。 この機能は、変数save-abbrevsの値をnilにすると禁止できます。

コマンドM-x insert-abbrevsM-x define-abbrevsは、 上で述べたコマンドと同様ですが、 Emacsバッファ内のテキストに作用します。 M-x insert-abbrevsは、カレントバッファのポイントの直前に すべての略語定義を記述したテキストを挿入します。 M-x define-abbrevsは、 カレントバッファ全体を解析し、その内容に従って略語を定義します。


Node:Dynamic Abbrevs, Next:, Previous:Saving Abbrevs, Up:Abbrevs

動的略語展開

これまでに述べてきた略語の機能は、テキストを挿入するときに自動的に働きますが、 すべての略語を陽に登録しておく必要があります。 一方、動的略語(dynamic abbrevs)は、 バッファの内容に基づいて略語の展開形を自動的に決定することができます。 ただし、陽に指示したときだけ、動的略語展開を行います。

M-/
バッファのポイントの直前の単語を動的略語(dynamic abbrev)として、 その略語で始まる単語をバッファ内から探索し展開する (dabbrev-expand)。
C-M-/
ポイントの直前の単語を動的略語として補完する (dabbrev-completion)。

たとえば、バッファ内にdoes this follow があるときに f o M-/と打鍵すると、バッファ内でfoで始まる近くにある単語が followなのでfollowが挿入されます。 M-/に数引数を指定すると、ポイントから先頭に向かって探して、2番目のもの、 3番目のものというように異なる展開形に展開できます。 M-/を繰り返すことにより、 次々にさらに先頭へ向かって探して別の候補に展開します。 ポイントよりまえのすべてのテキストを探し終えた場合には、 ポイントよりうしろのテキストを探します。 変数dabbrev-limitnil以外 37 ならば、バッファ内のどの範囲まで展開候補を探すかを指定します。

カレントバッファを探し終ると、 変数dabbrev-check-all-buffersnilに設定していない限り、 M-/は他のバッファも探します。

C-u - M-/のようにM-/に負の数引数を指定すると、 まずポイントのうしろから展開候補を探し、 つぎにポイントのまえから展開候補を探します。 M-/を繰り返して別の展開候補を探す場合には、引数を指定しません。 これにより、ポイントよりうしろのすべての展開候補を試してから、 つぎにポイントよりまえのすべての展開候補を試せます。

動的略語を展開したあとでは、展開形のもともとの場所でつぎに続く単語(群)を コピーすることができます。 コピーしたい単語ごとに単に<SPC> M-/と打鍵します。 単語のあいだの空白や句読点も単語とともにコピーされます。

コマンドC-M-/dabbrev-completion)は、 動的略語の補完を行います。 展開候補を1つずつ試すかわりに、すべての候補を全部探して それらに共通するテキストを挿入します。 それらに共通部分がなければ、C-M-/は候補一覧を表示するので 普通の方法でその中から1つ選びます。 See Completion

動的略語展開は略語(abbrev)モードと完全に独立しています。 M-/による単語の展開は、 略語(abbrev)モードで定義済みかどうかとは完全に独立しています。


Node:Dabbrev Customization, Previous:Dynamic Abbrevs, Up:Abbrevs

動的略語のカスタマイズ方法

通常、動的略語展開では大文字小文字を区別しないで候補を探します。 つまり、展開候補と略語の大文字小文字が一致する必要はありません。

この機能は変数dabbrev-case-fold-searchで制御できます。 値がtのときは、候補を探すときに大文字小文字を区別しません。 値がnilのときは、候補と略語の大文字小文字が一致する必要があります。 変数dabbrev-case-fold-searchの値は、 デフォルトでは真であるcase-fold-searchです。 したがって、変数case-fold-searchが 展開候補を探すときの大文字小文字の区別を制御します。

通常、動的略語展開は打ち込んだ略語の大文字小文字のパターンを保存します。 つまり、略語の大文字小文字のパターンに合うように 展開形の大文字小文字を変換します。

変数dabbrev-case-replaceは、略語の大文字小文字のパターンを 保存するかどうかを制御します。 値がtのときは、たいていの場合、パターンを保存します。 nilのときは、つねに展開形をそのままコピーします。 dabbrev-case-replaceの値は、 デフォルトでは真であるcase-replaceです。 したがって、変数case-replaceが 展開形をそのままコピーするかどうかを制御します。

しかしながら、展開形の大文字小文字のパターンが複雑であるとき、 略語の始めから終りまでがそのパターンに一致する場合、 これらの変数に関わらず展開形をそのままコピーします。 たとえば、バッファにvariableWithSillyCasePatternとあって v a M-/と打鍵すると、 大文字小文字のパターンを含め展開形をそのままコピーします。

変数dabbrev-abbrev-char-regexpnil以外の場合、 動的展開においてどんな文字を単語構成文字とみなすかを制御します。 これに指定する正規表現は1文字のみに一致するものである必要があり、 2文字以上に一致してはいけません。 同じ正規表現は、どの文字が展開形を構成するかも指定します。 値としてnilを指定すると特別な意味があり、 略語は単語の構成文字だけから成り、 展開形は単語と記号文字から成るという意味になります。

シェルスクリプトやmakefileなどでは、 変数名には接頭辞$があったりなかったりします。 これらのテキスト用のメジャーモードでは、 変数dabbrev-abbrev-skip-leading-regexpを設定して 余分な接頭辞を扱えるように動的展開をカスタマイズできます。 この変数には、動的略語展開で無視すべき余分な接頭辞に一致する 正規表現を指定します。


Node:Picture, Next:, Previous:Abbrevs, Up:Top

絵の編集

テキスト文字で書いた絵(たとえば、プログラムのコメントとして レジスタをフィールドに分割した絵)を編集するには、 コマンドM-x edit-pictureを使って ピクチャー(picture)モードに入ります。

ピクチャー(picture)モードでは、 1/4平面モデル(quarter-plane)に基づいて編集を行います。 つまり、右側と下側に無限に続く領域にテキスト文字が散在するのです。 このモデルでは行末は存在しません。 行中で空白でない文字が最後に現れる場所がわかるだけです。

もちろん、Emacsはつねにテキストを文字の列としてとらえ、 実際には行に終りがあります。 しかし、ピクチャー(picture)モードでは、よく使われるコマンドの大部分を 1/4平面モデルに従って動作するように置き換えています。 空白を挿入したりタブを空白に置き換えることで、そのようにします。

Emacsの基本的な編集コマンドの大部分は、 ピクチャー(picture)モードでは 1/4平面モデルにおいて本質的には同じ動作をするように再定義されています。 さらに、ピクチャー(picture)モードでは、 C-cで始まるキー列を絵の編集用の特別なコマンドとして定義します。

これらのキーの1つであるC-c C-cは非常に重要です。 絵が、普通は別のメジャーモードで編集される大きなファイルの 一部であることがしばしばあります。 M-x edit-pictureは直前のメジャーモードを記録しておき、 あとでC-c C-cコマンド(picture-mode-exit)で そのモードに戻れるようにします。 また、数引数を指定しなければ、C-c C-cは行末の空白を削除します。

ピクチャー(picture)モードのすべての特別なコマンドは、 (pictureライブラリがロードされていれば) 他のモードでも使えますが、ピクチャー(picture)モード以外では キーにバインドされていません。 以下では『1桁』移動などと説明しますが、 ピクチャー(picture)モードのすべてのコマンドは、 それに対応する通常のコマンドと同じように数引数を扱えます。

ピクチャー(picture)モードに入るときに フックpicture-mode-hookを実行します(see Hooks)。


Node:Basic Picture, Next:, Previous:Picture, Up:Picture

ピクチャーモードの基本編集

ピクチャー(picture)モードでも、ほとんどのキーは通常と同じ動作をしますが、 1/4平面流の動作です。 たとえば、C-fは、 picture-forward-columnを実行するように再定義してあります。 このコマンドはポイントを1桁右に動かし、 必要なら空白を挿入して、行末がないかのようにふるまいます。 C-bは、 picture-backward-columnを実行するように再定義してあります。 このコマンドはポイントを1桁左に動かし、 必要に応じてタブを複数の空白に変換します。 C-nC-pは、それぞれpicture-move-downpicture-move-upを実行するように再定義してあります。 これらのコマンドは、必要に応じて空白を挿入したりタブを変換して、 ポイントが同じ桁位置に留まるように移動します。 C-epicture-end-of-lineを実行します。 このコマンドは、行の最後の白文字以外の文字の直後に移動します。 画面モデルは行頭には影響しないので、C-aを変更する必要はありません。

テキストの挿入は、上書き(overwrite)モードを用いて 1/4平面モデルに対応させてあります(see Minor Modes)。 自己挿入文字は、既存のテキストを右側へ押しやるのではなく、 既存のテキストを桁ごとに置き換えます。 <RET>はpicture-newlineを実行します。 このコマンドは、つぎの行の先頭に移動し、 その行が新たなテキストで置き換わるようにします。

ピクチャー(picture)モードでは、テキストの削除やキルのかわりに消去します。 <DEL>(picture-backward-clear-column)は、 直前の文字を削除するのではなく空白で置き換え、 また、ポイントを1つまえに戻します。 C-dpicture-clear-column)は直後の1つ以上の文字を 空白で置き換えますが、ポイントは動かしません。 (文字を空白で置き換えて、かつ、ポイントを先へ進めるには、<SPC>を使う。) C-kpicture-clear-line)は行の内容を実際にキルしますが、 バッファから改行を削除しません。

実際に挿入を行うには、特別なコマンドを使う必要があります。 C-opicture-open-line)は、 現在行のつぎに空行を作りますが、行を分割しません。 C-M-osplit-line)は ピクチャー(picture)モードでも意味があるので変更してありません。 C-jpicture-duplicate-line)は 現在行の下に現在行と同じ内容の行を挿入します。

ピクチャー(picture)モードで実際に削除を行うには、 C-wか (他のモードでのC-dと同じdelete-charに定義されている) C-c C-d、あるいは、絵の矩形領域コマンドの1つを使います (see Rectangles in Picture)。


Node:Insert in Picture, Next:, Previous:Basic Picture, Up:Picture

挿入後のポイント移動制御

ピクチャー(picture)モードでは『自己挿入』文字は 上書きしてポイントを動かしますから、 ポイントをどのように動かすかについて本質的な制限はありません。 通常ポイントは右に動きますが、『自己挿入』文字のあとで 上下左右斜めの8方向のいずれの方向へ移動するか指定できます。 これは、バッファに直線を引くときに役立ちます。

C-c <
挿入後、左へ移動(picture-movement-left)。
C-c >
挿入後、右へ移動(picture-movement-right)。
C-c ^
挿入後、上へ移動(picture-movement-up)。
C-c .
挿入後、下へ移動(picture-movement-down)。
C-c `
挿入後、左上(『北西』)へ移動(picture-movement-nw)。
C-c '
挿入後、右上(『北東』)へ移動(picture-movement-ne)。
C-c /
挿入後、左下(『南西』)へ移動(picture-movement-sw)。
C-c \
挿入後、右下(『南東』)へ移動(picture-movement-se)。

2つの移動コマンドは、現在指定されている挿入後の移動方向に基づいて動作します。 コマンドC-c C-fpicture-motion)は、 現在指定されている『挿入』後の移動方向と同じ方向へ移動しますが、 C-c C-bpicture-motion-reverse)は反対方向へ移動します。


Node:Tabs in Picture, Next:, Previous:Insert in Picture, Up:Picture

ピクチャーモードのタブ

ピクチャー(picture)モードにはタブ相当の動作が2種類あります。 文脈に基づくタブを行うにはM-<TAB>picture-tab-search)を使います。 引数を指定しないと、先行する空行でない行において白文字に続く 『興味ある』つぎの文字の下方に移動します。 ここで『つぎ』とは『開始位置より水平位置が1より大きい』という意味です。 C-u M-<TAB>のように引数を指定すると、 現在行において『興味ある』文字に移動します。 M-<TAB>はテキストを変更せずにポイントを移動するだけです。 『興味ある』文字は、変数picture-tab-charsで定義されますが、 文字集合を定義する必要があります。 この変数の構文は正規表現で使われる[...]の構文に似ていますが、 []で囲みません。 この変数のデフォルト値は"!-~"です。

<TAB>それ自身は、picture-tabを実行します。 このコマンドは、現在のタブストップの設定に基づいて動作します。 これは他のモードのtab-to-tab-stopに相当します。 通常これはポイントを動かすだけですが、 数引数を指定すると移動先までのテキストをクリアします。

文脈に基づくタブとタブストップに基づくタブは、 コマンドC-c <TAB>picture-set-tab-stops)で 結び付けることができます。 このコマンドは、現在行においてM-<TAB>が重要と考える位置に タブストップを設定します。 <TAB>とともにこのコマンドを使えば、 文脈に基づくタブと同じ効果を得られます。 しかし、M-<TAB>で十分ならばそのほうが便利でしょう。

本当のタブ文字を絵に使わないように抑制したほうが便利な場合があります。 たとえば、C-x <TAB>で絵をめちゃくちゃにしてしまうことを防止できます。 タブ文字の使用を抑制するには、 変数indent-tabs-modenilを設定します。 See Just Spaces


Node:Rectangles in Picture, Previous:Tabs in Picture, Up:Picture

ピクチャーモードの矩形領域コマンド

ピクチャー(picture)モードでは、 1/4平面モデルに適合するように、 テキストの矩形領域に作用するコマンドを定義します。 標準的な矩形領域コマンドも役立つでしょう (see Rectangles)。

C-c C-k
矩形領域を空白でクリアする(picture-clear-rectangle)。 数引数を指定するとテキストを削除する。
C-c C-w r
同様だが、まず矩形領域の内容をレジスタrに保存する (picture-clear-rectangle-to-register)。
C-c C-y
ポイント位置を左上隅として最後にキルした矩形領域をバッファに上書きする (picture-yank-rectangle)。 数引数を指定すると挿入する。
C-c C-x r
同様だが、レジスタrの矩形領域を使う (picture-yank-rectangle-from-register)。

絵の矩形領域コマンド、C-c C-kpicture-clear-rectangle)と C-c C-wpicture-clear-rectangle-to-register)は、 標準の矩形領域コマンドが矩形領域を削除するのに対しクリアする点で異なります。 これは、ピクチャー(picture)モードでのC-dの意味の変更方法に 類似したものです。

しかし、ピクチャー(picture)モードでも矩形領域の削除は便利なので、 数引数を与えるとこれらのコマンドは矩形領域を削除します。 引数を指定してもしなくてもC-c C-kC-c C-yのために矩形領域を(レジスタに)保存します。

ピクチャー(picture)モードのヤンクコマンドは標準のそれとは、 挿入のかわりに上書きする点で異なります。 これはピクチャー(picture)モードでのテキストの挿入が 他のモードでのそれと異なっているのと同じです。 C-c C-ypicture-yank-rectangle)は、 もっとも最近にキルした矩形領域を(上書きで)挿入しますが、 C-c C-xpicture-yank-rectangle-from-register) は同様のことを指定されたレジスタ内の矩形領域で行います。


Node:Sending Mail, Next:, Previous:Picture, Up:Top

メイルの送信

Emacsでメッセージを送信するには、 まずコマンド(C-x m)を打って *mail*バッファを選択して初期化します。 続いて、このバッファでテキストとヘッダを編集し、 最後に別のコマンド(C-c C-sC-c C-c)を 打ってメッセージを送信します。

C-x m
送信メッセージを作成する(compose-mail)。
C-x 4 m
同様だが、別のウィンドウにメッセージを表示する (compose-mail-other-window)。
C-x 5 m
同様だが、新たにフレームを作る (compose-mail-other-frame)。
C-c C-s
メイル(mail)モードでは、メッセージを送信する (mail-send)。
C-c C-c
メッセージを送信しメイルバッファを閉じる (mail-send-and-exit)。

コマンドC-x mcompose-mail)は、 *mail*という名前のバッファを選択し、 そのバッファ内に送信するメッセージの雛型を作ります。 C-x 4 mcompose-mail-other-window)は、 別のウィンドウで*mail*バッファを選択し、 直前のカレントバッファは見えるようにしておきます。 C-x 5 mcompose-mail-other-frame)は、 新たにフレームを作って*mail*バッファを選択します。

メイル作成バッファはEmacsの普通のバッファなので、 メイルを書いている途中で別のバッファに切り替えて あとで戻ってくる(あるいは戻らない)ことができます。 メッセージを書きかけのまま送信していないのに再度C-x mコマンドを使うと、 Emacsは古いメッセージを消してよいかどうか聞いてきます。 nと答えると、書きかけの古い内容の*mail*バッファが 選択されるので、古いメッセージを書き終えて送信できます。 C-u C-x mでもこのようにできます。 メッセージを送信すると*mail*バッファは『変更なし』と印が付けられ、 つぎにC-x mを使っても確認を求めないようにします。

*mail*バッファに書きかけのメッセージを残したまま 別のメッセージを送信したい場合には、 M-x rename-uniquelyを使って*mail*バッファを別の名前に 変更してください(see Misc Buffer)。 そして、C-x mコマンドや他のコマンドで 新しい*mail*バッファを作ります。 こうすれば個々のメイルバッファを独立に編集できます。


Node:Mail Format, Next:, Up:Sending Mail

メイルバッファの形式

メッセージにはテキスト、つまり、本文以外にも、 誰が、いつ、誰に、なぜ送ったかなどを示すヘッダフィールドがあります。 Date(日付)やSender(送り手)などのヘッダフィールドは、 メッセージを送信するときに自動的に作成されます。 受け手(宛先)などの他のヘッダフィールドは、 メッセージがきちんと送信されるように あなた自身が指定する必要があります。

メイル(mail)モードには、 ヘッダフィールドを編集するためのコマンド群があり、 一部のヘッダフィールドはバッファ内で自動的に初期化されます。 通常の編集コマンドを使ってヘッダフィールドに挿入したり編集したりできます。

バッファ内のつぎの行は、ヘッダとテキストを分ける特別な区切り行です。

--text follows this line--

この行のあとに続くものはすべてメッセージのテキストになります。 このまえにあるものはヘッダです。 実際に送信されるメッセージには、この区切り行自身は含まれません。 区切り行として使うテキストは変数mail-header-separatorで制御します。

以下は、メイルバッファ内のヘッダとテキストの例です。

To: gnu@gnu.org
CC: lungfish@spam.org, byob@spam.org
Subject: The Emacs Manual
--Text follows this line--
Please ignore this message.


Node:Mail Headers, Next:, Previous:Mail Format, Up:Sending Mail

メイルヘッダフィールド

メイルバッファ内のヘッダフィールドは、 行頭のフィールド名で始まり、コロン:で区切られます。 フィールド名(およびメイルアドレス)では、 大文字小文字の区別はありません。 コロンと省いてもよい白文字のあとにフィールドの内容を書きます。

ヘッダフィールドには好き勝手にどんな名前でも使えますが、 一般にはきちんと意味のある標準的なフィールド名だけを使います。 以下は送信メッセージで一般的に使われるフィールドの一覧です。

To
このフィールドには、 メッセージの送付先であるメイルアドレスを書く。 1つより多くのアドレスを書く場合には、 空白ではなくコンマで区切る。
Subject
Subjectフィールドの内容としては、 メッセージが何についてのものかを書く。 Subjectフィールドが有効な理由は、 大部分のメイル閲覧プログラムが、 各メッセージの本文ではなくSubjectを使ってメイル一覧を表示するため。
CC
このフィールドにはToフィールドと同様に メッセージ送付先の追加メイルアドレスを書く。 ただし、これらのアドレスにあげられた人達は、 自分宛てのメッセージだとは思わないように。
BCC
このフィールドにはメッセージ送付先の追加アドレスを書くが、 実際に送付されるメッセージのヘッダにはこのフィールドは含まれない。 このようにして送信したコピーをブラインドカーボンコピー (blind carbon copies)と呼ぶ。

すべての送信メッセージのブラインドカーボンコピーを自分自身に送るには、 変数mail-self-blindtを設定する。

FCC
このフィールドには、メッセージを送信するたびに Emacsがそのコピーを追加していくファイルの名前を指定する。 ファイルがrmail形式であれば、Emacsはメッセージをrmail形式で書き込む。 それ以外の場合、Emacsはシステムメイルファイル形式で書き込む。

送信メッセージを編集するたびに毎回決まったファイル名を FCCフィールドに指定するには、 変数mail-archive-file-nameにそのファイル名を設定する。 送信メッセージからFCCフィールドを削除しない限り、 メッセージを送信するたびにこのファイルにメッセージが書き込まれる。

From
Fromフィールドは、メイル送信時に使っているアカウントが自分のもの でない場合に、送信者が本当は誰なのかを示すために用いる。 返信には通常このフィールドが使われるので、 Fromフィールドの内容は正しいメイルアドレスであること。 自分でFromフィールドを指定しなければ、 Emacsはデフォルトで変数user-mail-addressの値を使う。
Reply-to
返信を別のアドレスに送ってほしい場合にこのフィールドを使う。 (rmailを含む)大部分のメイル閲覧プログラムは、 FromのアドレスよりReply-toのアドレスを優先して 自動的に返信を送る。 Reply-toフィールドをヘッダに加えておけば、 Fromのアドレスが返信時に引き起こすであろうどんな問題でも回避できる。

すべての送信メッセージのReply-toフィールドに決まったアドレスを 指定するには、 変数mail-default-reply-toに(文字列で)そのアドレスを設定する。 こうすると、mailは指定されたReply-toフィールドを 付けてメッセージを初期化する。 メッセージを送信するまえに、 必要なら、このフィールドを削除したり変更したりできる。 Emacsが動き始めたときに環境変数REPLYTOが設定されていれば、 その環境変数の値で変数mail-default-reply-toを初期化する。

In-reply-to
このフィールドは返信しようとしているメッセージについての情報を書く。 メイルシステムによっては、この情報を使ってメイルを互いに関連付ける。 rmailでメッセージに返信するときには、rmailが自動的にこのフィールドを 埋めるので、気にする必要はない(see Rmail)。
References
このフィールドには、関連する以前のメッセージのメッセージID一覧を書く。 rmailでメッセージに返信するときには、 rmailが自動的にこのフィールドを埋める。

ヘッダフィールド、ToCCBCCFCCは、 いくつあってもよく、しかも、これらの各フィールドには コンマで区切って複数のアドレスを書けます。 こうすれば、メッセージの送付先をいくつでも指定できます。 ToCCBCCフィールドでは継続行を使えます。 これらのフィールドに続く白文字で始まる行は、 すべてフィールドの一部であると見なします。 以下は継続行を用いたToフィールドの例です。

To: foo@here.net, this@there.net,
  me@gnu.cambridge.mass.usa.earth.spiral3281

メッセージを送信するときに、Fromフィールドを書いてないと、 Emacsがかわってこの項目を補います。 変数mail-from-styleでその書式を(以下のように)制御します。

nil
king@grassland.comのように電子メイルアドレスだけを補う。
parens
king@grassland.com (Elvis Parsley)のように、 電子メイルアドレスと氏名を補う。
angles
Elvis Parsley <king@grassland.com>のように、 氏名と電子メイルアドレスを補う。
system-default
システムにFromフィールドを埋めさせる。


Node:Mail Aliases, Next:, Previous:Mail Headers, Up:Sending Mail

メイルの別名

~/.mailrcという名前のファイルでメイルの別名 (mail alias)を定義できます。 メイルの別名とは、複数のメイルアドレスやそれらのグループに付けた 覚えやすい短い名前のことです。 他の多くのメイルプログラムと同様に、 ToFromCCBCCReply-toのフィールドに 別名が現れるとEmacsは別名を展開し、 当該フィールドの先頭にResent-を付加します。

~/.mailrcファイルで別名を定義するには、 以下のような形式の行を書きます。

alias shortaddress fulladdresses

fulladdressesは1つ以上のメイルアドレスであり、 shortaddressをそれらのアドレスに展開します。 複数のアドレスを書く場合は、空白で区切ります。 アドレスに空白が含まれる場合は、 アドレス全体をダブルクォート"で括ります。

たとえば、gnu@gnu.orgとあなたのローカルアドレスに対する別名を maingnuとするには、 つぎのように書きます。

alias maingnu gnu@gnu.org local-gnu

また、Emacsは.mailrcファイル内の「取り込み」コマンドも認識します。 つぎのように書きます。

source filename

ファイル~/.mailrcは主に他のメイル閲覧プログラムが使用するものです。 このファイルには、他にもさまざまなコマンドを指定できます。 Emacsは、このファイル内の別名定義(alias)と 取り込みコマンド(source)以外はすべて無視します。

Emacsの中だけでメイルの別名を定義する別の方法は、 define-mail-aliasコマンドを使うことです。 このコマンドは、別名と完全なアドレスを順次尋ねてきます。 これを使えば、つぎのようにして 個人の.emacsファイルで別名を定義できます。

(define-mail-alias "maingnu" "gnu@gnu.org")

define-mail-aliasは、 mail-aliasesという変数に別名を追加記録します。 Lispのリスト操作に慣れているなら、 mail-aliasesに直接設定してもかまいません。 変数mail-aliasの初期値はtとなっていて、 Emacsは.mailrcから別名定義を読み込むという指定です。

~/.mailrcのかわりに使う別のファイルの名前は、 変数mail-personal-alias-fileに設定します。

通常、Emacsはメッセージ送信時に別名を展開します。 送信に先だってみずからメイルアドレスを展開する必要はありませんが、 メイルが実際にどこへ送信されるか確認したければ別名を展開することもできます。 そうするには、コマンドM-x expand-mail-aliasesを使います。 アドレスを保持するメイルヘッダに書かれている すべてのメイルの別名を展開します。

もし好みに合うなら、メイルの別名を打ち込んだらただちに 略語展開することもできます(see Abbrevs)。 この機能を使うにはつぎのようにします。

(add-hook 'mail-setup-hook 'mail-abbrevs-setup)

これを個人の.emacsファイルに入れてもかまいません。 See Hooks。 この機能を使う場合には、define-mail-aliasのかわりに define-mail-abbrevを使う必要があります。 前者は、このパッケージでは動作しません。 メイル用略語パッケージでは、mail-aliasesのかわりに 変数mail-abbrevsを使い、さらに、 すべての別名は小文字に変換されます。

メイル用略語パッケージには、C-c C-amail-interactive-insert-alias)コマンドもあって、 別名を(補完を使って)読み取り、その定義をポイント位置に挿入します。 この機能は、Emacsが別名を通常展開しない本文やSubjectフィールドなど を編集しているときに便利です。

単語の区切り文字を挿入したあとで略語が展開されることに注意してください。 しかし、C-nM->を再定義して 展開が行われるように設定することもできます。 つぎのようにします。

(add-hook 'mail-setup-hook
          '(lambda ()
             (substitute-key-definition
               'next-line 'mail-abbrev-next-line
               mail-mode-map global-map)
             (substitute-key-definition
               'end-of-buffer 'mail-abbrev-end-of-buffer
               mail-mode-map global-map)))


Node:Mail Mode, Next:, Previous:Mail Aliases, Up:Sending Mail

メイルモード

メイルバッファで使われるメジャーモードはメイル(mail)モードです。 テキスト(text)モードに似ていますが、 プレフィックスC-cで始まる多くの特別なコマンドがあります。 これらのコマンドはすべてメッセージの編集や送信に関するものです。 さらに、メイル(mail)モードでは、文字%を単語の切れ目と定義しています。 これは、単語コマンドを使ってメイルアドレスを編集するときに便利です。

mailコマンドやそれに関連するコマンドが自動的に設定する バッファでは、普通、メイル(mail)モードを使います。 しかし、ファイルを訪問しているバッファをメイル(mail)モードに 切り替えることもできます。 これは、メッセージの草稿をファイルに保存してあるときなどに便利です。


Node:Mail Sending, Next:, Up:Mail Mode

メイルの送信

メイル(mail)モードには、編集したメッセージを送信するコマンドが2つあります。

C-c C-s
メッセージを送信し、メイルバッファは選択したままにする (mail-send)。
C-c C-c
メッセージを送信し、別のバッファを選択する (mail-send-and-exit)。

C-c C-smail-send)はメッセージを送信して メイルバッファに『変更なし』の印を付けます (変更フラグをクリアする)。 しかし、メッセージバッファは選択したままですから、 メッセージを修正して(新たな受け手に)再度送信できます。 C-c C-cmail-send-and-exit)はメッセージを送信してから、 ウィンドウを削除するか別のバッファに切り替えます。 メイルバッファは使い終えたので、 デフォルトではその選択優先度は最低になります。 普通はこのコマンドでメッセージを送信します。

ファイルを訪問しているバッファでは、メッセージ送信後でも変更フラグを クリアしません。 ファイルを保存した場合にだけ変更フラグをクリアすべきだからです。 この結果、同一メッセージを2回送信しようとしても警告は出ません。

非ASCII文字を含むメッセージを送信するときには、 それらをコーディングシステム(see Coding Systems) で符号化する必要があります。 通常、コーディングシステムは、 選択した言語環境(see Language Environments)によって 自動的に指定されます。 変数sendmail-coding-systemを設定すると、 送信メイルのコーディングシステムを明示できます。

このように決めたコーディングシステムが、 メッセージ内の文字を扱えない場合には、 Emacsは、可能なコーディングシステムの一覧を表示して、 使用するコーディングシステムを問い合わせます。


Node:Header Editing, Next:, Previous:Mail Sending, Up:Mail Mode

メイルヘッダの編集

メイル(mail)モードには、特定のヘッダフィールドへ移動したり ヘッダのアドレスを補完する特別なコマンドがあります。

C-c C-f C-t
ヘッダフィールドToへ移動する。 フィールドがなければ作成する(mail-to)。
C-c C-f C-s
ヘッダフィールドSubjectへ移動する。 フィールドがなければ作成する(mail-subject)。
C-c C-f C-c
ヘッダフィールドへCC移動する。 フィールドがなければ作成する(mail-cc)。
C-c C-f C-b
ヘッダフィールドBCCへ移動する。 フィールドがなければ作成する(mail-bcc)。
C-c C-f C-f
ヘッダフィールドFCCへ移動する。 フィールドがなければ作成する(mail-fcc)。
M-<TAB>
メイルアドレスを補完する(mail-complete)。

ポイントを特定のヘッダフィールドに移動するコマンドは5つあって、 すべてプレフィックスC-c C-fで始まります (C-fは『フィールド』(fields)のf)。 これらは上に示してあります。 当該フィールドが存在しなければ、 これらのコマンドはそのフィールドを作成します。 これらの特定のフィールドに移動するコマンドを用意したのは、 これらのフィールドを編集する可能性が高いからです。

To:CC:BCC:などのメイルアドレスを含む ヘッダフィールドを編集中には、 M-<TAB>mail-complete)と打てば メイルアドレスを補完できます。 完全な名前が決定できるならば、アドレスに対応する完全な名前を挿入します。 変数mail-from-styleと同様に、 変数mail-complete-styleは、 完全な名前を挿入するのか、どのスタイルを使うのかを制御します (see Mail Headers)。

補完のため使う正しいメイルアドレスは、 ローカルのユーザー名一覧と個人のメイルの別名からとられます。 正しいメイルアドレスの情報源を追加することもできます。 これに関するオプションを調べるには、カスタマイズバッファを使ってください。

メッセージの本文でM-<TAB>と打つと、 テキスト(text)モードと同様にispell-complete-wordを起動します。


Node:Citing Mail, Next:, Previous:Header Editing, Up:Mail Mode

メイルの引用

メイル(mail)モードには、 返信対象であるメッセージの全部や一部をヤンク、つまり、引用(cite) するためのコマンドもあります。 こうしたコマンドはrmailコマンドを 使ってメッセージを送信する場合にだけ使えます。

C-c C-y
rmailで選択したメッセージをヤンクする(mail-yank-original)。
C-c C-r
rmailバッファで選択したリージョンをヤンクする(mail-yank-region)。
C-c C-q
別のメッセージからの引用を段落に詰め込む (mail-fill-yanked-message)。

rmailコマンドを使ってrmailメイルリーダからメイル送信を起動したときには、 C-c C-yを使って返信対象のメッセージをメイルバッファに挿入できます。 このコマンドは、引用メッセージの各行を空白3文字で字下げして ほとんどのヘッダフィールドを削除します。 数引数は字下げする文字数を指定します。 C-uだけを指定すると、字下げをせずにヘッダフィールドも削除しません。 C-c C-yは、つねにrmailバッファのカレントメッセージを使います。 したがって、rmailで1つメッセージを選択してから *mail*バッファに切り替えてヤンクし、 また、rmailに切り替えて別のメッセージを選択してというようにすれば、 複数の古いメッセージを挿入できます。

C-c C-yが各行の先頭に挿入する文字列は指定できます。 変数mail-yank-prefixに望みの文字列を設定します。 (値がnilだと字下げしない。デフォルトはこれ。) しかし、C-u C-c C-yと打った場合、 変数mail-yank-prefixの値に関係なく、 各行の行頭には何も挿入しません。

届いたメイルの一部だけをヤンクするには、 rmailで目的の部分にリージョンを設定します。 そして*mail*バッファに移ってC-c C-rmail-yank-region)と打ちます。 コピーされる各行は、mail-yank-prefixに従って 字下げされるか行頭に文字列が挿入されます。

C-c C-yC-c C-rを使い終ったら、 C-c C-qmail-fill-yanked-message)と打てば ヤンクした古いメッセージを段落に詰め込めます 38。 引用したメッセージを1つの段落に詰め込むには、M-qを使います。 詰め込み処理で行頭の文字を自動的に正しく扱えない場合には、 詰め込み接頭辞を陽に指定して試してください。 See Filling


Node:Mail Mode Misc, Previous:Citing Mail, Up:Mail Mode

その他のメイルモードコマンド

C-c C-t
メッセージの本文の先頭に移動する(mail-text)。
C-c C-w
ファイル~/.signatureをメッセージの本文の末尾に挿入する (mail-signature)。
C-c C-i file <RET>
fileの内容を送信メッセージの末尾に挿入する (mail-attach-file)。
M-x ispell-message
メッセージの本文について綴りの訂正を行う。 ただし、他のメッセージからの引用部分については行わない。

C-c C-tmail-text)は、 ポイントをヘッダの区切り行のあと、つまり、メッセージ文の先頭に移動します。

C-c C-wmail-signature)は、 あなたを識別するための決まり文句(サイン)をメッセージの末尾に追加します。 このテキストは、ホームディレクトリのファイル~/.signatureから取ります。 このサインを自動的に挿入するようにするには、 変数mail-signaturetを設定します。 そうすると、メイルメッセージに自動的に ファイル~/.signatureの内容が付加されます。 特定のメッセージにサインを付けたくなければ、 送信前にバッファ内で削除してください。

変数mail-signatureに文字列を指定することもできます。 すると、送信メッセージを編集し始めると、 その文字列はサインとして自動的に挿入されます。 この変数にそれ以外のLisp式を指定すると、 毎回その式が評価されその値(文字列であること)がサインになります。

コマンドM-x ispell-messageで、 書きあげたメッセージの綴りを訂正できます。 このコマンドは、引用部分については調べませんが、 あなた自身が打ち込んだテキストは検査します。 (字下げやmail-yank-prefixを利用して、 引用部分とあなたの入力部分を区別します。) See Spelling

送信メッセージにファイルを付加するには、 カレントバッファにファイルを挿入する普通のコマンドC-x iを使います。 しかし、専用コマンドC-c C-imail-attach-file) を使うほうがより便利なことがしばしばあります。 このコマンドは、指定したファイルの内容をバッファの最後、 サインがあればそのうしろに、ファイル名を含んだ区切り行を付けて挿入します。

C-x mが自動的に行うように)メイル(mail)モードをオンにすると、 ノーマルフック、text-mode-hookmail-mode-hookとが 実行されます。 新たな送信メッセージを初期化するときには、 ノーマルフックmail-setup-hookを実行します。 メイルヘッダに特別なフィールドを追加したり メイルバッファの外見を変えたいならば、これらのフックを使ってください。 See Hooks

これらのフックの主な違いは、どの時点で起動されるかです。 M-x mailと打鍵すると、*mail*バッファを作成後ただちに mail-mode-hookが実行されます。 続いてmail-setup関数がバッファにデフォルトの内容を入れます。 そのあとで、mail-setup-hookが実行されます。


Node:Distracting NSA, Next:, Previous:Mail Mode, Up:Sending Mail

NSAを悩ますには

M-x spookは、ランダムに選んだキーワードから成る行を 送信メッセージに付け加えます。 破壊活動を画策していると思わせるような単語の一覧表からキーワードを選びます。

この機能の思想的背景には、NSA 39 は自分たちが関心を持つ特定のキーワードを 含んだすべての電子メイルを盗聴(盗読?)しているのではないかという 疑いがあります。 (NSAは否定していますが、彼らなら当然そういい張るだろう。) 多くの人々が怪しい単語をメッセージに付加しておけば、 NSAはこうした疑わしいメイルの盗聴で非常に忙しくなり、 おしまいにはこうした行為を止めるのではないかと考えたからです。

以下は、送信メッセージを編集し始めると 自動的に怪しいキーワードを付け加える方法です。

(add-hook 'mail-setup-hook 'spook)

これでNSAが混乱してもしなくても、 少なくとも人々を楽しませることができます。


Node:Mail Methods, Previous:Distracting NSA, Up:Sending Mail

メイル作成方式

本章では、メイルを編集/送信するためのEmacsの通常のモード、 メイル(mail)モードについて説明してきました。 本書ではふれていませんが、 MH-Eやメッセージ(message)モードを含む 別のメイル編集/送信機能もEmacsにはあります。 コマンド、C-x mC-x 4 mC-x 5 mは、 指定されたどの方式にも対応しています。 ですから、メイルを送信するEmacsのさまざまなコマンドや機能を利用できます。

メイル作成方式を指定するには、変数mail-user-agentを設定します。 現時点で正しい設定として認められるものは、 sendmail-user-agentmh-e-user-agentmessage-user-agentです。

異なるメイル作成方式を選択すると、本章で述べた*mail*バッファや メイル(mail)モードについての説明は役に立ちません。 異なったメイル作成方式では、 異なった名前のバッファで異なった形式の まったく異なったコマンドを使うかもしれないからです。


Node:Rmail, Next:, Previous:Sending Mail, Up:Top

メイルの閲覧rmail

rmailは、受け取ったメイルを読んだり処理したりするためのEmacsの サブシステムです。 rmailは、メイルメッセージをrmailファイルと呼ばれるファイルに格納します。 rmailファイル内のメッセージを読むには、 rmailモードという特別なメジャーモードで行います。 このモードでは、メイルを取り扱うコマンドを実行するように ほとんどのアルファベット文字を再定義しています。 コマンドrmail-modeでrmailモードに切り替えます。 するといつものようにフックrmail-mode-hookが実行されます。 しかし、このコマンドを直接実行しないでください。 正しいrmailファイルを訪問しているバッファでない限り、 このコマンドはまともに動きません。


Node:Rmail Basics, Next:, Up:Rmail

rmailの基本概念

もっとも簡単なrmailの使い方では、 ~/RMAILという1つのrmailファイルにすべてのメイルを保存します。 これを主rmailファイル(primary Rmail file)といいます。 コマンドM-x rmailは、主rmailファイルを読み込み、inbox 40 内の新しいメイルを併合して、最初の未読メッセージを表示して メイルを読み始められるようにします。 変数rmail-file-nameで、主rmailファイルの名前を指定します。

rmailは、rmailファイルの1つのメッセージだけが見えるようにナロイングします。 表示されているメッセージをカレントメッセージ(current message)と 呼びます。 rmailモードの特別なコマンドを使えば、 カレントメッセージを削除41 する、別のファイルへコピーする、返信を送る、 別のメッセージへ移動することができます。 また、複数のrmailファイルを作って、 それらのあいだでメッセージを移すこともできます。

rmailファイル内では、一般にメッセージは受け取った順に並べられます。 別の順序にソートすることもできます。 メッセージにはメッセージ番号(message numbers) として連続した整数が割り振られます。 カレントメッセージの番号は、rmailのモード行に表示され、 そのあとにファイル内の総メッセージ数も表示されます。 jキーにメッセージ番号を指定すれば、その番号のメッセージに移動できます (see Rmail Motion)。

Emacsの習慣に従って、rmailファイルの変更は ファイルを保存したときにだけ反映されます。 srmail-save)で保存しますが、 削除(see Rmail Deletion)と 指定されたメッセージをファイルからまず抹消します。 抹消せずにファイルを保存するには、C-x C-sを使います。 さらに、inboxから新着メイルを併合したあとにも rmailファイルを保存します (see Rmail Inbox)。

rmailを終了するにはqrmail-quit)を使います。 (メッセージを)抹消しrmailファイルを保存してから、 別のバッファに切り替えます。 しかし、正しく「終了」する必要はありません。 rmailから別のバッファへ切り替えて、 そのあと戻らなければ終了したことになります。 (rmailコマンドbrmail-buryがこれを行う。) (変更したファイルにするのと同様に) rmailファイルを確実に保存するようにしてください。 これには、C-x sがよいでしょう (see Saving)。


Node:Rmail Scrolling, Next:, Previous:Rmail Basics, Up:Rmail

メッセージをスクロールする

rmailが表示するメッセージが画面に入りきらないとき、 残りの部分を読むにはスクロールする必要があります。 これには、C-vM-vM-<を使いますが、 rmailではスクロールを頻繁に行うので、もっと簡単な操作を用意してあります。

<SPC>
先へ進める(scroll-up)。
<DEL>
まえへ戻す(scroll-down)。
.
メッセージの先頭へ戻る(rmail-beginning-of-message)。

メッセージを読むときもっとも多く行うことは 画面単位でのスクロールなので、 rmailでは、<SPC>と<DEL>は、それぞれ、 C-vscroll-up)とM-vscroll-down)の 同義になっています。

コマンド.rmail-beginning-of-message)は、 選択されているメッセージの先頭に移動します。 このコマンドはM-<とまったく同じというわけではありません。 まず、マークを設定しません。 さらに、カレントメッセージを変更してあるとバッファの境界を再設定します。


Node:Rmail Motion, Next:, Previous:Rmail Scrolling, Up:Rmail

メッセージ間での移動

もっとも基本的な操作は、メッセージを読むことです。 rmailでこれを行うには、メッセージをカレントメッセージにします。 メッセージは受け取った順に並んでいるので、 通常はファイルの中を順に移動して読んでいきます。 rmailに入ると、カレントメッセージにしたことがない最初のメッセージから始まります (つまり、未読を意味するunseen属性が付いている最初のもの。 see Rmail Attributes)。 先へ進めば他の新しいメッセージを読めます。 まえへ戻れば古いメッセージを読み直せます。

n
削除されたメッセージを飛ばして、 削除されていないつぎのメッセージへ移動する (rmail-next-undeleted-message)。
p
削除されていないまえのメッセージへ移動する (rmail-previous-undeleted-message)。
M-n
削除されたメッセージも含めてつぎのメッセージへ移動する (rmail-next-message)。
M-p
削除されたメッセージも含めてまえのメッセージへ移動する (rmail-previous-message)。
j
最初のメッセージへ移動する。 数引数nを指定すると、メッセージ番号nのメッセージへ移動する (rmail-show-message)。
>
最後のメッセージへ移動する(rmail-last-message)。
<
最初のメッセージへ移動する(rmail-first-message)。
M-s regexp <RET>
正規表現regexpに一致するつぎのメッセージへ移動する (rmail-search)。
- M-s regexp <RET>
正規表現regexpに一致するまえのメッセージへ移動する。

npは、rmailでメッセージ間を移動する普通の方法です。 これらのコマンドは、メッセージ間を順々に移動していきますが、 期待どおりに削除されたメッセージは飛び越えます。 コマンドの定義名はrmail-next-undeleted-messagermail-previous-undeleted-messageです。 削除されたメッセージを飛び越したくない場合、 たとえば、削除されたメッセージをアンデリート42したいときは、 (npの)変形である M-nM-prmail-next-messagermail-previous-message)を使います。 これらのコマンドに数引数を指定すると、反復回数とみなします。

rmailでは、数字を打つだけで数引数を指定できます。 始めにC-uを打つ必要はありません。

M-srmail-search)コマンドは、rmailにおける探索を行います。 通常のインクリメンタルサーチコマンドC-sもrmailで使えますが、 これはカレントメッセージの中だけを探索します。 M-sコマンドの目的は、他のメッセージを探すことです。 正規表現(see Regexps)を読み終えてから、 つぎのメッセージの先頭から一致するものを探し始めます。 そしてみつかったメッセージを選択します。 regexpが空だとM-sは最後に使った正規表現を再使用します。

ファイル内で逆向きに他のメッセージを探索するには、 M-sに負の数引数を指定します。 rmailでは、- M-sと打てばよいのです。

ラベルをもとにメッセージを探索することもできます。 See Rmail Labels

メッセージ番号を指定してメッセージへ移動するには、 メッセージ番号を引数としてjrmail-show-message)を使います。 引数がないとjは最初のメッセージを選択します。 <rmail-first-message)も最初のメッセージを選択します。 >rmail-last-message)は最後のメッセージを選択します。


Node:Rmail Deletion, Next:, Previous:Rmail Motion, Up:Rmail

メッセージの削除

メッセージを保存しておく必要がなくなったら、 そのメッセージを削除(delete)できます。 「無視せよ」という意味の削除印をメッセージに付けます。 すると、いくつかのrmailコマンドはそのメッセージが存在しないものとして扱います。 しかし、そのメッセージはまだrmailファイルの中にあって、 メッセージ番号も付いています。

rmailファイルを抹消(expunging)すると、 削除印が付いたメッセージを本当に消し去ります。 残ったメッセージには番号を順に振り直します。 抹消は、アンダイジェスト(see Rmail Digest)を除いて、 メッセージ番号を変更する唯一の動作です。

d
カレントメッセージを削除し、 削除されていないつぎのメッセージへ移動する (rmail-delete-forward)。
C-d
カレントメッセージを削除し、 削除されていないまえのメッセージへ移動する (rmail-delete-backward)。
u
カレントメッセージをアンデリートする、あるいは、 削除されたまえのメッセージへ戻ってアンデリートする (rmail-undelete-previous-message)。
x
rmailファイル(の削除の付いたメッセージ)を抹消する (rmail-expunge)。

rmailにはメッセージを削除するコマンドが2つあります。 どちらもカレントメッセージを削除し、別のメッセージを選択します。 drmail-delete-forward)は すでに削除したメッセージを飛ばしてつぎのメッセージへ移動しますが、 C-drmail-delete-backward)はまえのメッセージへ移動します。 指定した方向に削除されていないメッセージがないときは、 削除したばかりのメッセージがカレントメッセージのままです。 どちらのコマンドに対しても、数引数を指定すると、 削除後の移動方向を反転します。

rmailがメッセージを削除するときはいつでも、 rmail-delete-message-hookに登録されている関数(群)を起動します。 フック関数が起動されるときには、メッセージに削除印が付いていますが、 rmailバッファではそのメッセージはカレントメッセージのままです。

削除したすべてのメッセージをrmailファイルから本当に消すには xrmail-expunge)と打ちます。 これを実行するまえならば、アンデリート(undelete)、つまり、 メッセージの削除印を消すことができます。 アンデリートコマンド、urmail-undelete-previous-message)は dコマンドの効果をほとんどの場合打ち消します。 カレントメッセージが削除されていれば、 カレントメッセージをアンデリートします。 そうでなければ、削除されたメッセージが みつかるまでまえへ戻り、そのメッセージをアンデリートします。

普通はudをアンドゥできます。 なぜなら、dで削除したメッセージを まえへ戻って探してそのメッセージをuがアンデリートするからです。 しかし、dがメッセージを削除してから 後続のすでに削除されたメッセージを飛び越す場合には、 うまくいきません。 この場合、uコマンドは飛び越したメッセージのうちの 最後のものをアンデリートします。 この問題を回避する簡単な方法はありません。 ですが、uコマンドを繰り返せば、 最終的にはアンデリートしたいメッセージに辿り着きます。 あるいは、M-pコマンドで目的の削除されたメッセージに移動してから uを打ってアンデリートします。

削除されたメッセージには、deletedという属性が付きます。 その結果、カレントメッセージが削除されていると モード行にdeletedと表示されます。 メッセージを削除する、あるいは、アンデリートすると、 実際には、メッセージにこの属性を付加する、あるいは、取り去るだけです。 See Rmail Attributes


Node:Rmail Inbox, Next:, Previous:Rmail Deletion, Up:Rmail

rmailファイルとinbox

オペレーティングシステムは、inboxと呼ばれるファイルに 到着したメイルを格納します。 rmailを起動すると、movemailと呼ばれるCプログラムが走り、 inboxから主rmailファイルへ新着メッセージをコピーします。 ただし、主rmailファイルには、以前のrmailセッションで保存したメッセージも 入っています。 実際にrmailで読むメイルはこのファイルの中にあるのです。 この操作を、新着メイルの取得といいます。 rmail内でgと打てば、いつでも新着メイルを取得できます。

変数rmail-primary-inbox-listには、 主rmailファイルのinboxとなるファイルのリストを格納します。 この変数を明示的に設定しなければ、 環境変数MAILで初期化するか、あるいは、 最後の手段として、デフォルトのinboxを使うことを意味する nilに設定します。 デフォルトのinboxはオペレーティングシステムに依存して、 /var/mail/username/usr/spool/mail/username/usr/mail/usernameになります。

システムのデフォルトを調べるには、 C-h v rmail-primary-inbox <RET>を使います。 コマンドset-rmail-inbox-listで、 任意のrmailファイルに対して使うinboxファイルを指定できます。 Rmail Filesを参照してください。

rmailファイルとinboxに分ける理由は2つあります。

  1. inboxのファイル形式は、オペレーティングシステムや 使用するメイルソフトに依存して異なる。 rmailの一部分だけが違いを知っていればよく、 しかも、rmail独自の形式への変換方法だけを知っていればよい。
  2. メイル紛失という危険を犯さずにinboxを参照するのはたいへん厄介である。 というのは、メイル配送プログラムと相互排除を行う必要があるから。 さらに、オペレーティングシステムごとに相互排除の手法が異なる。 いったんinboxからメイルを取り出し、あとは別のrmailファイルを使う方式では、 rmailファイルしか扱わないのでrmailの各所で相互排除する必要がなくなる。

rmailでは独自の内部形式(Babyl形式)を使っています。 当初からUNIXやGNUシステムの普通のinbox形式で十分であると気づいていて、 inbox形式を内部形式として使おうと計画しています。 しかし、たとえファイルの形式が同一であっても、 rmailファイルはinboxファイルとは独立して存在し続けるでしょう。


Node:Rmail Files, Next:, Previous:Rmail Inbox, Up:Rmail

複数のrmailファイルの扱い方

rmailはデフォルトでは個人の主rmailファイルを操作します。 このファイルは、~/RMAILという名前で、 システムのinboxファイルから到着メイルを受け取ります。 しかし、別のrmailファイルを作ってそれをrmailで編集することもできます。 これらのファイルはそれぞれ独自のinboxからメイルを受け取ったり、 あるいは、rmailコマンドでそれらのあいだでメッセージを移せます (see Rmail Output)。

i file <RET>
fileをEmacsに読み込み、それに対してrmailを実行する (rmail-input)。
M-x set-rmail-inbox-list <RET> files <RET>
現在のrmailファイルに対してメイルを取り込むinboxファイルを指定する。
g
現在のrmailファイルのinboxから新着メイルを取得する (rmail-get-new-mail)。
C-u g file <RET>
inboxファイルfileから新着メイルを取得する。

主rmailファイル以外のファイルに対してrmailを実行するには、 rmailでirmail-input)コマンドを使います。 このコマンドは、指定されたファイルをrmailモードで訪問します。 rmailの外からでもM-x rmail-inputを使えます。

iで読み込むファイルは、 通常、正しいrmailファイルであるべきです。 そうでなければ、rmailは既知のさまざまな形式を用いて メッセージに分解しようと試みます。 それに成功すれば、ファイル全体をrmailファイルに変換します。 存在しないファイル名を指定すると、 iコマンドは新たなrmailファイル用の新しいバッファを初期化します。

メニューからrmailファイルを選択することもできます。 まず、メニューバーから項目Classifyを選びます。 続いて、Classifyメニューから項目Input Rmail Fileを選びます。 そして、望みのrmailファイルを選択します。 変数rmail-secondary-file-directoryと 変数rmail-secondary-file-regexpで、 メニューに含めるべきファイルを指定します。 最初の変数では探すべきディレクトリを指定し、 2番目の変数ではディレクトリ中のどのファイルか (正規表現に一致するもの)を指定します。 これらの変数は出力用のファイルを選択するときにも使われます。

各rmailファイルには、inboxファイル名の一覧を持たせることができます。 この一覧は、M-x set-rmail-inbox-list <RET> files <RET>で指定します。 引数には、コンマで区切っていくつもファイル名を書けます。 引数が空でもかまいませんが、その場合、 そのファイルにはinboxがないという指定になります。 いったんinboxの一覧を指定すれば、新たに指定し直さない限り、 rmailファイルはそれを覚えています。

特別な例外として、主rmailファイルにinboxファイルを指定しないと、 システム標準のinboxを使用します。

grmail-get-new-mail)コマンドは、 指定されたinboxから現在のrmailファイルにメイルを併合します。 rmailファイルにinboxが指定されていなければ、gは何もしません。 コマンドM-x rmailも、主rmailファイルに新着メイルを併合します。

普通のinboxでないファイルからメイルを併合するには、 C-u gのようにgキーに数引数を指定します。 すると、ファイル名を読み取り、そのファイルからメイルを併合します。 gに引数を指定したときには、 inboxファイルを削除したり変更したりしません。 したがって、これは、メッセージファイルを別のメッセージファイルへ 併合する一般的な方法です。


Node:Rmail Output, Next:, Previous:Rmail Files, Up:Rmail

ファイルへのメッセージのコピー

以下のコマンドで、rmailファイルから別のファイルへメッセージをコピーできます。

o file <RET>
デフォルトではrmailファイル形式を用いて、 カレントメッセージのコピーをファイルfileへ追加する。 (rmail-output-to-rmail-file)。
C-o file <RET>
デフォルトではシステムのinboxファイル形式を用いて、 カレントメッセージのコピーをファイルfileへ追加する。
w file <RET>
メッセージのヘッダSubjectからデフォルトのファイル名を作り、 メッセージの本文だけをファイルfileに書き出す。

コマンドoC-oは、 カレントメッセージを指定したファイルへコピーします。 そのファイルは、rmailファイルでもシステムのinbox形式でもかまいません。 出力コマンドは、ファイルの形式を確かめその形式に従って メッセージのコピーを書き込みます。

メッセージをUNIXのmailファイル形式のファイルにコピーする場合、 これらのコマンドは現在表示しているヘッダもコピーします。 表示(しコピー)するヘッダを指定したい場合には、 あらかじめtコマンドを使ってください。

コマンドoC-oは2つの点で異ります。 それぞれ、独自のデフォルトのファイル名を持ち、 ファイルが既存でない場合に使用する形式も別です。 新たにファイルを作成するとき、 oコマンドはrmail形式を使いますが、 C-oコマンドはシステムのinbox形式を使います。 デフォルトのファイル名は、 oでは最後にoで使ったものになり、 C-oも最後にC-oで使ったものです。

出力ファイルが、現在Emacsバッファで訪れているrmailファイルのときには、 出力コマンドはメッセージをバッファにコピーします。 そのバッファをファイルに保存するのはユーザーの責任です。

ときどき、ファイルの内容をそのまま本文にしたようなメッセージを 受け取ることもあるでしょう。 wrmail-output-body-to-file)コマンドで、 (メッセージのヘッダを除いて)本文をファイルに保存できます。 こうしたメッセージでは、Subjectフィールドに意図するファイル名が 入れていることがままあるので、 wコマンドはデフォルトの出力ファイル名に Subjectフィールドを使います。 しかし、ミニバッファでファイル名を読み取るので、 好きなファイル名を指定できます。

メニューを使ってrmailファイルにメッセージを出力することもできます。 まず、メニューバーの項目Classifyを選択し、 Classifyメニューから項目Output Rmail File Menuを選択します。 そして、望むrmailファイルを選択します。 これは、oコマンドのように、 カレントメッセージをそのファイルに出力します。 変数rmail-secondary-file-directoryと 変数rmail-secondary-file-regexpで、 メニューに含めるべきファイル名を選択します。 最初の変数では探すべきディレクトリを指定し、 2番目の変数ではディレクトリ中のどのファイルか (正規表現に一致するもの)を指定します。

メッセージをコピーすると、もとのメッセージにはfiled属性が付きます。 そのメッセージがカレントメッセージになると、 モード行にfiledと表示されます。 メイルメッセージをそれぞれ1個だけにしておきたい場合には、 変数rmail-delete-after-outputtを設定します。 すると、コマンドoC-oは、メッセージをコピーすると もとのメッセージを削除します。 (必要ならば、もとのメッセージをアンデリートできます。)

システムのinbox形式でファイルにメッセージをコピーするときには、 rmailで今表示しているヘッダフィールドを使います。 したがって、tコマンドを使ってヘッダ全体を見えるようにしてから メッセージをコピーすると、ヘッダ全体がコピーされます。 See Rmail Display

変数rmail-output-file-alistを使うと、 カレントメッセージの内容に基づいて デフォルトの出力ファイルを賢く指定できます。 値はつぎの形式の要素から成るリストである必要があります。

(regexp . name-exp)

カレントメッセージがregexpで指定されるパターンに一致すると、 デフォルトの出力ファイル名はname-expになります。 複数の要素がメッセージに一致する場合は、 最初に一致した要素がデフォルトのファイル名になります。 部分要素name-expは、ファイル名を指定する文字列か、 より一般的には、文字列としてファイル名を返すLisp式です。 変数rmail-output-file-alistは、 oC-oの両方に適用されます。


Node:Rmail Labels, Next:, Previous:Rmail Output, Up:Rmail

ラベル

各メッセージには分類のためにいろいろなラベル(label)が付きます。 各ラベルには名前があって、名前が異なれば別のラベルです。 どのラベルもメッセージに付いているか付いていないかのどちらかです。 少数のラベル名には標準的な意味があり、 適切な場合にはrmailが自動的にメッセージに付けます。 これらの特別なラベルを属性(attribute)と呼びます。 それ以外のすべてのラベルはユーザーだけが付けます。

a label <RET>
カレントメッセージにラベルlabelを付ける (rmail-add-label)。
k label <RET>
カレントメッセージからラベルlabelを取り去る (rmail-kill-label)。
C-M-n labels <RET>
ラベル群labelsのどれか1つを持つつぎのメッセージへ移動する (rmail-next-labeled-message)。
C-M-p labels <RET>
ラベル群labelsのどれか1つを持つまえのメッセージへ移動する (rmail-previous-labeled-message)。
C-M-l labels <RET>
ラベル群labelsのどれかを持つすべての メッセージのサマリを作成する (rmail-summary-by-labels)。

コマンドarmail-add-label)と krmail-kill-label)で、 カレントメッセージに任意のラベルを付けたり取り去ったりできます。 引数が空の場合は、もっとも最近に付けたり取り去ったりしたものと 同じラベルを意味します。

分類するためのラベルをメッセージにいったん付ければ、 そのラベルを使って2つのこと、つまり、移動とサマリ作成ができます。

コマンドC-M-n labels <RET>rmail-next-labeled-message) は、ラベル群labelsのどれか1つを持つつぎのメッセージへ移動します。 引数labelsには、1つのラベル名、あるいは、 コンマで区切って複数のラベル名を指定します。 C-M-prmail-previous-labeled-message)も同様ですが、 まえのメッセージへ向かって逆向きに移動します。 これらのコマンドに対する数引数は、反復回数になります。

コマンドC-M-l labels <RET>rmail-summary-by-labels) は、指定したラベルの集まりの中の少なくとも1つのラベルを持つような メッセージからなるサマリを表示します。 引数labelsは、1つのラベル名、あるいは、 コンマで区切った複数のラベル名です。 サマリについては、See Rmail Summary

C-M-nC-M-pC-M-lに対する引数labelsが空の場合には、 これらのコマンドのどれかにもっとも最近に指定したラベルの集まりを意味します。


Node:Rmail Attributes, Next:, Previous:Rmail Labels, Up:Rmail

rmailの属性

deletedfiledのようなラベルのいくつかには 組み込みの意味付けがあり、 適切なときに自動的にメッセージに付けられたり取り去られたりします。 このようなラベルを属性(attribute)と呼びます。 以下はrmailの属性の一覧です。

unseen
メッセージが一度もカレントメッセージになったことがないことを意味する。 inboxファイルから取り込またときにメッセージに付けられ、 メッセージがカレントメッセージになると取り去られる。 rmailを起動すると、まずこの属性を持つ最初のメッセージが表示される。
deleted
メッセージが削除されたことを意味する。 削除コマンドが付け、アンデリートコマンドが取り去る (see Rmail Deletion)。
filed
メッセージは他のファイルへコピーされたことを意味する。 ファイル出力コマンドが付ける (see Rmail Files)。
answered
メッセージに返信したことを意味する。 rrmail-reply)コマンドが付ける。 see Rmail Reply
forwarded
メッセージを他者に転送したことを意味する。 frmail-forward)コマンドが付ける。 see Rmail Reply
edited
rmail内でメッセージのテキストを編集したことを意味する。 see Rmail Editing
resent
メッセージを再送信したことを意味する。 M-xrmail-resendコマンドが付ける。 see Rmail Reply

これら以外のすべてのラベルはユーザーだけが付けたり取り去ったりするのであって、 標準的な意味はまったくありません。


Node:Rmail Reply, Next:, Previous:Rmail Attributes, Up:Rmail

返事の送信

rmailには、メイルの送信にメイル(mail)モードを使うコマンドが いくつかあります。 メイル(mail)モードの使用方法については、rmailから使えるある種の機能も含めて、 See Sending Mail。 本節では、メイル(mail)モードへ入るrmailに特有のコマンドを説明します。 メイル送信のための通常のキー、 C-x mC-x 4 mC-x 5 mは、 rmailモードでも使え、その動作もまったく同じであることに注意してください。

m
メッセージを送信する(rmail-mail)。
c
書き始めたメッセージの編集を再開する(rmail-continue)。
r
カレントメッセージに対する返事を送信する(rmail-reply)。
f
カレントメッセージを他のユーザーに転送する(rmail-forward)。
C-u f
カレントメッセージを他のユーザーに再送信する(rmail-resend)。
M-m
送信できずに戻ってきたメッセージを再度送信する (rmail-retry-failure)。

rmailからメッセージを送信するのは、ほとんどの場合、 読んでいるメッセージに返信するためでしょう。 それには、rrmail-reply)と打ちます。 すると、C-x 4 mのように 別のウィンドウに*mail*バッファが表示されますが、 返事を出そうとするメッセージに基づいて SubjectToCCIn-reply-toの ヘッダフィールドがあらかじめ埋められています。 Toフィールドにはそのメッセージの送信者が書かれ、 CCフィールドにはそのメッセージのすべての受信者が書かれます。

変数rmail-dont-reply-to-namesを使うと、 CCに自動的に含まれる受信者から特定の受信者を除くことができます。 この変数の値は(文字列で表した)正規表現である必要があります。 この正規表現に一致する受信者はCCフィールドから除かれます。 デフォルトの値は、あなた自身の名前とinfo-で始まる名前です。 (このような名前は、 大規模なメイリングリストで全員に送信するために使う習慣があるから。)

CCフィールドを完全に省いて返信したいときには、 数引数を指定して返信コマンドを入力します。 つまり、C-u r1 rです。

ひとたび*mail*バッファが初期化されれば、 メイルの編集や送信は通常どおりです (see Sending Mail)。 あらかじめ用意されたヘッダフィールドが適切でなければ、 編集してかまいません。 また、メイル(mail)モードのコマンドを使うこともでき (see Mail Mode)、 C-c C-yコマンドでもとの返信メッセージをヤンクすることもできます。 rmailバッファに切り替えてから別のメッセージを選択し、 もとに戻って新しいカレントメッセージをヤンクしてもかまいません。

メッセージが相手先へ届かない場合があります。 メイル配送プログラムは、通常、 失敗したメッセージを失敗メッセージに同封して 発信者に送り返します。 rmailのコマンドM-mrmail-retry-failure)は、 同じメッセージを再送する準備をします。 前回と同じ本文とヘッダフィールドで*mail*バッファを立ち上げます。 すぐにC-c C-cと打つと、 前回とまったく同様にメッセージを再送信します。 あるいは、本文やヘッダを編集してから送信することもできます。 変数rmail-ignored-headers(see Rmail Display)と同じ形式の 変数rmail-retry-ignored-headersは、 再送信するときに送信に失敗したメッセージから取り除くヘッダを制御します。 デフォルトではnilです。

rmailからメッセージを送信する別の場面は、 他のユーザーにメッセージを転送(forward)することでしょう。 frmail-forward)はこれを簡単に行えるようにします。 つまり、カレントメッセージをテキストとして*mail*バッファを初期化し、 Subjectも転送メッセージである旨の初期化をします。 あとは、受信者を埋め込んで送信するだけです。 メッセージを転送したとき、受信者はあなた『から』メッセージを受け取りますが、 内容はもとのメッセージのままです。

転送されるメッセージは、2つの区切り行に挟まれています。 また、各行は、行頭にを挿入してハイフンで始まるように 修正されます。 転送メッセージを受け取って、たとえばプログラムのソースコードのように 文書以外に何か役立つようなものが含まれているときには、 このような変更をもとに戻せたら便利です。 これを行うには、転送メッセージを選択して M-x unforward-rmail-messageと打ちます。 このコマンドは、挿入されたを削除してもとのメッセージを取り出し、 それをrmailファイルのカレントメッセージの直後に別のメッセージとして挿入します。

再送(resending)は転送に似ている別の手段です。 異なる点は、再送はもともとの送信者『から』メッセージをもう一度送ることです。 また、あなたから送られたことを示すために Resent-fromResent-toのヘッダフィールドが付加されます。 rmailでメッセージを再送するには、C-u fを使います。 (frmail-forwardを実行するが、 数引数を指定するとrmail-resendを実行するようになっている。)

mrmail-mail)コマンドは、 返信ではない送信メッセージを編集し始めるのに使います。 ヘッダフィールドは空のままです。 このコマンドとC-x 4 mとの唯一の違いは、 ちょうどrがするように C-c C-yでrmailバッファを参照できるようにすることです。 したがって、mコマンドでメッセージに返信したり転送したりできます。 rfでできることは何でもできます。

crmail-continue)コマンドは、 書きかけのメッセージの編集を完了したり、 送信したメッセージを変更したりするために *mail*バッファの編集を再開します。

変数rmail-mail-new-framenil以外の値を設定すると、 メッセージの送信を始めるすべてのrmailコマンドは編集用に新しいフレームを 作ります。 メッセージを送信したりMailメニューの項目Don't Sendを使うと、 このフレームは削除されます。

メッセージを送信するためすべてのrmailコマンドは、 あなたが選択したメイル作成方式を使います (see Mail Methods)。


Node:Rmail Summary, Next:, Previous:Rmail Reply, Up:Rmail

rmailのサマリ機能

サマリ(summary)とは、 rmailファイルにあるメイルの概要を示すために 1メッセージにつき1行の情報を収めたバッファです。 各行には、メッセージ番号、送信者、ラベル、 サブジェクト(Subjectの内容)が表示されます。 ほとんどすべてのrmailコマンドはサマリバッファでも有効で、 サマリの現在行が指すメッセージに適用されます。 サマリバッファでポイントを動かすと、 ポイントがある行が指すメッセージを選択します。

1つのサマリバッファは、それに対応した1つのrmailファイルにしか適用されません。 複数のrmailファイルを編集している場合には、 それぞれに専用のサマリバッファを作れます。 サマリバッファの名前は、rmailバッファの名前に-summaryを 付け加えたものです。 通常、一度に表示されるサマリバッファは1つだけです。


Node:Rmail Make Summary, Next:, Up:Rmail Summary

サマリの作成

現在のrmailファイルのサマリを作成するコマンドを説明します。 いったんrmailファイルに対するサマリバッファを作っておくと、 (メッセージの削除/抹消、新着メイルの取得などで) rmailファイルが変更されると自動的にサマリも更新されます。

h
C-M-h
すべてのメッセージのサマリを作成する(rmail-summary)。
l labels <RET>
C-M-l labels <RET>
指定したラベルのいずれかを含むメッセージのサマリを作成する (rmail-summary-by-labels)。
C-M-r rcpts <RET>
指定した受信者名のいずれかを含むメッセージのサマリを作成する (rmail-summary-by-recipients)。
C-M-t topic <RET>
指定した正規表現topicに一致するサブジェクトを持つ メッセージのサマリを作成する(rmail-summary-by-topic)。

コマンドhC-M-hrmail-summary)は、 現在のrmailファイルのサマリバッファを このファイルの全メッセージのサマリで満たします。 そして、別のウィンドウにサマリバッファを表示し選択します。

C-M-l labels <RET>rmail-summary-by-labels)は、 ラベルlabelsのいずれかを含むメッセージに対する部分的なサマリを作ります。 labelsはラベル名をコンマで区切ったものである必要があります。

C-M-r rcpts <RET>rmail-summary-by-recipients)は、 受信者名rcptsのいずれかを含むメッセージに対する部分的な サマリを作ります。 rcptsはメイルアドレスをコンマで区切ったものである必要があります。

C-M-t topic <RET>rmail-summary-by-topic)は、 正規表現topicに一致するサブジェクトを持つメッセージに対する 部分的なサマリを作成します。

どのrmailファイルにも1つのサマリバッファしかないことに注意してください。 ある種類のサマリを作成すると、それ以前のサマリは消されてしまいます。

変数rmail-summary-window-sizeは、 サマリウィンドウに使う行数を指定します。 変数rmail-summary-line-count-flag は、 各メッセージのサマリ行にメッセージの行数を表示するかどうかを制御します。


Node:Rmail Summary Edit, Previous:Rmail Make Summary, Up:Rmail Summary

サマリでの編集

rmailバッファ自体にできることは、 rmailサマリバッファでもほとんどできます。 実際、いったんサマリバッファを作っておけば、 rmailバッファに切り替える必要はありません。

サマリバッファ上でポイントを行から行へ移動するだけで、 サマリバッファからrmailバッファのさまざまなメッセージを選択し表示できます。 どんなEmacsコマンドを使ってポイントを移動してもかまいません。 コマンドを実行し終ったときにポイントがある行がどこであっても、 rmailバッファのそれに対応するメッセージが選択されます。

ほとんどすべてのrmailコマンドは、rmailバッファと同様にサマリバッファ でも機能します。 つまり、 dはサマリバッファでもカレントメッセージを削除し、 uはアンデリートし、xは抹消します。 oC-oはカレントメッセージをファイルに書き込みます。 rは返信を開始します。 サマリバッファにいても、 <SPC>と<DEL>を使ってカレントメッセージをスクロールできます。

メッセージのあいだを移動するrmailコマンドもサマリバッファで使えますが、 事情が少々違っています。 つまり、現在サマリが作られているメッセージのあいだでしか移動できません。 また、rmailバッファが必ず画面に表示されるようにします。 (カーソル移動のコマンドはrmailバッファの内容を更新しますが、 rmailバッファがウィンドウに表示されていなければ表示されません。) 以下はこれらのコマンドの一覧です。

n
(削除された)「deleted」となっている行を 飛び越してつぎの行に移動し、そのメッセージを選択する。
p
(削除された)「deleted」となっている行を 飛び越してまえの行に移動し、そのメッセージを選択する。
M-n
つぎの行に移動し、そのメッセージを選択する。
M-p
まえの行に移動し、そのメッセージを選択する。
>
最後の行に移動し、そのメッセージを選択する。
<
最初の行に移動し、そのメッセージを選択する。
M-s pattern <RET>
カレントメッセージから始めてpatternに一致するメッセージを探索する。 みつかったメッセージを選択し、 サマリバッファ内のそのメッセージに対応する行にポイントを移動する。

rmailバッファで、削除、アンデリート、新着メイルの取得、 別のメッセージの選択を実行すると、サマリバッファを必ず更新します。 変数rmail-redisplay-summarynil以外ならば、 これらのコマンドを実行するとサマリバッファは画面に表示されます。

サマリを使い終ったらQrmail-summary-wipe)と打って サマリバッファのウィンドウを削除します。 サマリでrmailを終了することもできます。 qrmail-summary-quit)はサマリウィンドウを削除し、 rmailファイルを保存してrmailを抜け、別のバッファに切り替えます。


Node:Rmail Sorting, Next:, Previous:Rmail Summary, Up:Rmail

rmailファイルのソート

M-x rmail-sort-by-date
現在のrmailファイルのメッセージを日付順にソートする。
M-x rmail-sort-by-subject
現在のrmailファイルのメッセージをSubject順にソートする。
M-x rmail-sort-by-author
現在のrmailファイルのメッセージを筆者名順にソートする。
M-x rmail-sort-by-recipient
現在のrmailファイルのメッセージを受け手名順にソートする。
M-x rmail-sort-by-correspondent
現在のrmailファイルのメッセージを他の文通者名順にソートする。
M-x rmail-sort-by-lines
現在のrmailファイルのメッセージを行数順にソートする。
M-x rmail-sort-by-keywords <RET> labels <RET>
現在のrmailファイルのメッセージをラベル順にソートする。 引数 labelsは、コンマで区切られたラベルの並びである必要がある。 ラベルの順序がメッセージの順序を決める。 最初のラベルを持つメッセージが最初にきて、 2番目のラベルを持つものが2番目にくるというようになる。 指定したラベルも持たないメッセージは最後にくる。

rmailのソートコマンドは、順序を保存するソート(stable sort)を行います。 2つのメッセージのどちらを先にするか明確な基準がないときには、 その順序関係は保存されます。 これを用いれば、複数の基準でソートできます。 たとえば、rmail-sort-by-dateを使ってから rmail-sort-by-authorを使うと、 同じ筆者のメッセージは日付順に並びます。

数引数を指定するとこれらのすべてのコマンドは逆順序に並べます。 つまり、新しいものから古いものへ、大きなものから小さなものへ、 アルファベットの逆順にメッセージをソートします。


Node:Rmail Display, Next:, Previous:Rmail Sorting, Up:Rmail

メッセージの表示

初めてメッセージを表示するとき、rmailはメッセージのヘッダを 整形し直してから表示します。 むだな表示を削るために重要でないヘッダフィールドを隠します。 tコマンドを使うと、ヘッダ全体を表示したり再度整形することができます。

t
ヘッダ全体を表示するかどうかを切り替える(rmail-toggle-header)。

ヘッダの整形では、各ヘッダフィールドの重要性に基づいて ほとんどのヘッダフィールドを削除することになります。 変数rmail-ignored-headersには、このようにして隠すヘッダフィールドを 指定する正規表現を記述します。 ヘッダフィールドの先頭部分がこの正規表現に一致すると そのフィールド全体を隠します。

rmailは整形を行うまえにもとのヘッダ全体を保存します。 これを見るにはtrmail-toggle-header)コマンドを使います。 カレントメッセージの整形されたヘッダを捨て、もとのヘッダを表示します。 tを再度実行すると、メッセージのヘッダを再度整形します。 メッセージを選択し直しても再度整形します。

この結果として、(see Rmail Editing) 整形されたヘッダを(eコマンドで)編集しても、 そのあとにtを使うと編集したものは破棄されます(see Rmail Editing)。 一方、tのあとにeを使って もとの(整形していない)ヘッダを編集すると、その変更は保存されます。

tコマンドに数引数を付けると、 正の引数ならは整形したヘッダを表示し、 ゼロか負ならばヘッダ全体を表示します。

複数のフォントを使えるウィンドウシステムで使用すると、 rmailは特に重要なある種のヘッダフィールドを強調表示します。 デフォルトでは、 FromフィールドとSubjectフィールドです。 変数rmail-highlighted-headersには、強調表示したいヘッダフィールドを 指定する正規表現を記述します。 ヘッダフィールドの先頭部分がこの正規表現に一致すると そのフィールド全体を強調表示します。

テキストの前景や背景に標準的でない色を指定すると、 うまく強調表示できないこともあります。 そのような場合には、highlightフェイスに別の色を指定します。 highlightフェイスはrmail以外の強調表示にも使われるので、 指定を行う価値があります。 方法は、See Faces

rmailの強調表示をすべてやめるには、 変数rmail-highlighted-headersnilを設定してください。


Node:Rmail Editing, Next:, Previous:Rmail Display, Up:Rmail

メッセージの編集

rmailモードでも通常のEmacsコマンドのほとんどを使えますが、 C-M-nC-M-hのように他の目的のためにrmailで再定義された ものもいくつかあります。 しかし、rmail バッファは通常読み出し専用であり、 アルファベット文字のほとんどもrmailコマンドとして再定義されています。 メッセージのテキストを編集したいときには、 rmailコマンドeを使う必要があります。

e
カレントメッセージを通常のテキストとして編集する。

ermail-edit-current-message)コマンドは、 rmailモードからrmail編集(rmail-edit)モードに移行します。 このモードは、テキスト(text)モードとほとんど同じ別のメジャーモードです。 モード行にこの変化が表示されます。

rmail編集(rmail-edit)モードでは、文字は通常どおり挿入でき、 rmailコマンドは使えません。 メッセージを編集し終えてrmailへ戻るには、 C-c C-cと打ちます。 するとrmailモードに戻ります。 あるいは、行った編集をすべて取り消してrmailモードに戻るには、 C-c C-]と打ちます。

rmail編集(rmail-edit)モードに入るとき、 フックtext-mode-hookが実行されます。 それからフックrmail-edit-mode-hook が実行されます (see Hooks)。 メッセージには属性edited が付けられます。 さらに、メッセージのヘッダ全体が表示されるので、 メッセージの本文と同様にヘッダも編集できます。 ヘッダに対する変更も保存されます。


Node:Rmail Digest, Next:, Previous:Rmail Editing, Up:Rmail

ダイジェストメッセージ

ダイジェストメッセージ(digest message)は、 数個のメッセージをまとめて運ぶためのメッセージです。 ダイジェストは管理人のいるメイリングリスト上で使われます。 1日単位などの一定期間内にリスト宛に受け取ったすべてのメッセージを 1つのダイジェストにまとめて加入者に送ります。 合計のサイズが同じであったとしても、ダイジェストにして送るほうが 個々にメッセージを送るよりコンピュータの使用時間がずっと少なくてすみます。 というのは、メイル送信に必要なメッセージあたりのネットワーク上の オーバーヘッドがとても大きいからです。

ダイジェストメッセージを受け取ったならば、 もっとも簡単な読み方は、それをアンダイジェスト(undigestify)して 個々のメッセージに戻すことです。 そうすれば好きなように、個々のメッセージを読んだり削除したりできます。

アンダイジェストするには、ダイジェストメッセージを選び、 コマンドM-x undigestify-rmail-messageを打ちます。 これは、(ダイジェストメッセージ内の)サブメッセージを別々の rmailメッセージとして取り出し、ダイジェストのあとに それらのメッセージを挿入します。 ダイジェストメッセージ自体は削除されます。


Node:Out of Rmail, Next:, Previous:Rmail Digest, Up:Rmail

rmailファイルからinbox形式への変換

コマンド M-x unrmailは、rmail形式のファイルを (システムのメイルボックス形式としても知られる)inbox形式に変換します。 こうすると、そのファイルを別のメイル編集ツールでも使えるようになります。 2つの引数、rmailファイル名と変換後のファイル名を指定する必要があります。 M-x unrmailはrmailファイル自体には変更を加えません。


Node:Rmail Rot13, Next:, Previous:Out of Rmail, Up:Rmail

rot13メッセージの読み方

特定の読者に不快を与える可能性があるメイリングリストのメッセージは、 rot13と呼ばれる単純な方法で暗号化してある場合があります。 この名前は、アルファベットを13文字分巡回させることに由来します。 これは機密保持のためではなく、そのような機能もありません。 不快に感じるかもしれない読者が メッセージの本当の本文を見ないようにするために使います。

rot13暗号を使っているバッファを見るには、 コマンドM-x rot13-other-windowを使います。 テキストを表示するときに暗号を解いて 別のウィンドウにカレントバッファを表示します。


Node:Movemail, Previous:Rmail Rot13, Up:Rmail

movemailとPOP

新着メイルを取得するとき、rmailはまずinboxファイルからrmailファイルに 新着メイルをコピーします。 それから、rmailファイルを保存します。 そして、inboxファイルの内容を消します。 こうすると、システムがクラッシュするとinboxとrmailファイルに メイルを重複して持つことになりますが、 メイルを紛失することはありえません。 変数rmail-preserve-inboxnil以外ならば、 rmailは、inboxファイルからrmailファイルに新着メイルをコピーしてから inboxファイルの内容を消しません。 たとえば、旅行中は携帯コンピュータでPOPを介してメイルを調べ、 メイルをサーバーに残しておいてあとでワークステーションに保存するように するには、このような設定をします。

場合によっては、rmailは間接的にinboxファイルから新着メイルをコピーします。 まず、movemailプログラムを実行して、 inboxから~/.newmail-inboxnameという中間ファイルに メイルを移動します。 それから、rmailは中間ファイルから新着メイルを併合して rmailファイルを保存してから中間ファイルを削除します。 これを実行中の都合が悪いときにクラッシュすると中間ファイルが残ってしまい、 rmailがつぎにinboxから新着メイルを 取得するときにまたそのファイルを使ってしまいます。

rmailが~/.newmail-inboxnameのデータを独自形式(Babyl形式) に変換できないと、同じデータでトラブルが再発しないように ファイル名を~/RMAILOSE.nnは名前が一意になるような整数)に変えます。 このファイルを調べて、rmailが解釈できなかったメッセージ (たぶん、コントロール下線の文字、8進コード037を使ったメッセージかもしれない) を探してそれを削除します。 そうしてから、1 gコマンドを使って修正したファイルから 新着メイルを取り込みます。

inboxファイルにデータを保存するかわりに、 POPと呼ばれる方法を用いてユーザーのinboxのデータを参照する 場合もあります。 movemailをコンパイルするときにマクロMAIL_USE_POPを定義して コンパイルすればmovemailはPOPを使って動きます。 (Emacsをインストールするとき、 --with-popを指定してconfigureを実行すれば、 このようにできる。) movemailはPOP3でしか動かず、POPの古いバージョンでは使えません。

movemailを適切にコンパイルしてインストールしたとすると、 rmailファイルのinboxリストで、 po:usernameの形の『ファイル名』でPOPのinboxを指定できます。 movemailは、そのような名前に対しては、 POPサーバーに対する接続を開きます。 MAILHOST環境変数で、どのマシンでサーバーを探すかを指定します。

POP経由でメイルを参照するにはパスワードが必要です。 変数rmail-pop-passwordnil以外のときは、 これはPOPに対してを使うパスワードを指定します。 あるいは、変数rmail-pop-password-requirednil以外ならば、 rmailはユーザーにパスワードを尋ねます。

movemailにコマンド行オプションを追加する必要があるときには、 変数rmail-movemail-flagsに指定したいオプションのリストを設定します。 inboxの内容を保存するオプション-pを指定するために この変数を使わないでください。 かわりにrmail-preserve-inboxを使ってください。

読者のサイトでインストールしたmovemailプログラムは、 Kerberos認証を使うかもしれません。 その場合、 rmail-pop-passwordrmail-pop-password-requiredが設定されて いなければ、POPでメイルを取得するときにデフォルトで Kerberos認証を使います。

POPサーバーによってはメッセージを逆順序に保存します。 そのようなサーバーで受信順にメイルを読むには、 rmail-movemail-flagsにフラグ-rを追加して、 ダウンロードしたメッセージを逆順にするように movemailに指示します。


Node:Dired, Next:, Previous:Rmail, Up:Top

ディレクトリエディタdired

diredはディレクトリ一覧をバッファに作成します。 場合によっては、サブディレクトリの一覧も含まれます。 普通のEmacsコマンドでこのバッファの中を動き廻ったり、 特別なdiredコマンドで一覧中にあるファイルを操作できます。


Node:Dired Enter, Next:, Up:Dired

diredの起動

diredを起動するには、C-x dM-x diredを使います。 このコマンドは、一覧表示するファイルを指定するための ディレクトリ名やファイルのワイルドカードパターンをミニバッファで読み取ります。 diredlist-directoryと違うのは、 バッファがdiredモードになっていて 特別なdiredコマンドを使えるようになることです。

変数dired-listing-switchesには、 ディレクトリ一覧を作成するlsプログラムに与えるオプションを指定します。 オプション中には-lが必ず含まれている必要があります。 diredコマンドに数引数を指定すると、 ミニバッファでディレクトリを指定するまえに lsのオプションを指定できます。

diredバッファを現在選択しているウィンドウではなく 別のウィンドウに表示したい場合には、 C-x dのかわりにC-x 4 ddired-other-window)を使います。 C-x 5 ddired-other-frame)は 別のフレームにdiredバッファを表示します。


Node:Dired Commands, Next:, Previous:Dired Enter, Up:Dired

diredバッファ内のコマンド

diredバッファは『読み出し専用』であり、 このバッファに文字を挿入しても意味がないので、 dxのような通常の印字文字は特別なdiredコマンドに使われます。 diredコマンドのいくつかは、diredバッファの カレントファイル(current file、つまり、現在行のファイル)に (mark)やフラグ(flag)を付けます。 他のコマンドは、印やフラグが付いたファイル群に作用します。

Emacsの普通のカーソル移動コマンドはdiredバッファでも使えます。 特殊用途のカーソル移動コマンドもあります。 C-nC-pは、カーソルを行の先頭ではなく ファイル名の先頭に位置合わせするように再定義されています。

さらに便利なように、 diredモードでは<SPC>とnC-nに等価です。 pC-pに等価です。 (diredでは行単位の移動をよく行うため、打鍵しやすくしてある。) <DEL>(上に移動してフラグを消す)は、単に上へ移動する場合には便利です。


Node:Dired Deletion, Next:, Previous:Dired Commands, Up:Dired

diredでのファイル削除

diredの主な利用法は、ファイルに削除のフラグを付けてから、 フラグの付いているファイルを(本当に)削除することです。

d
このファイルに削除フラグを付ける。
u
この行の削除フラグを消す。
<DEL>
ポイントをまえの行に移し、その行の削除フラグを消す。
x
削除フラグが付いたファイルを(本当に)削除する。

ファイルに削除フラグを付けるには、 そのファイルを表示している行に移動してdと打ちます。 削除フラグは、行頭に表示されるDという文字でわかります。 このコマンドはポイントをつぎの行に進めますから、 dコマンドを繰り返し実行すれば後続のファイルにもフラグを 付けることができます。 数引数は反復回数になります。

即座にファイルを削除するかわりに削除フラグを付けるので、 誤ってファイルを消してしまう危険性は低くなります。 フラグを付けたファイルを抹消するようにdiredに指示するまでは、 uや<DEL>を使って削除フラグを消せます。 udired-unmark)は、dと同じように動作しますが、 フラグを付けるのではなくフラグを消します。 DELdired-unmark-backward)は上に移動してフラグを消します。 これは、数引数-1を指定したuと同じです。

削除フラグが付いたファイルを(本当に)削除するには、 xdired-expunge)と打ちます。 このコマンドは、削除フラグが付いたファイルの一覧を表示し、 yesでの確認応答を求めます。 確認するとdiredはフラグが付いたファイルを削除し、 diredバッファからそれらに対応する行を削除します。 小さくなったdiredバッファは選択されたままです。

確認にnoと答えたり、C-gで中断すると、 ただちにdiredに戻りますが、削除フラグは付いたままで、 ファイルを実際に削除しません。


Node:Flagging Many Files, Next:, Previous:Dired Deletion, Up:Dired

一度に多数のファイルにフラグを付ける

#
(名前が#で始まり#で終る) すべての自動保存ファイルに削除フラグを付ける。 (see Auto Save)。
~
(名前が~で終る)すべてのバックアップファイルに削除フラグを付ける。 (see Backup)。
&
簡単に作成し直せるような名前のすべてのファイルに削除フラグを付ける。
. (ピリオド)
余分な番号付きバックアップファイルに削除フラグを付ける。 新しいバックアップファイル数個と古いのもの数個を除いて、 そのあいだのものにフラグを付ける。
% d regexp <RET>
名前が正規表現regexpに一致するすべてのファイルに削除フラグを付ける。

#~&.のコマンドは、 ファイル名に基づいて数多くのファイルに削除フラグを付けます。 これらのコマンドは本当に便利です。 というのは、ファイルを実際には削除しないからです。 残しておきたいファイルの削除フラグは消せばいいのです。

&dired-flag-garbage-files)は、 変数dired-garbage-files-regexpで指定される 正規表現に一致する名前のファイルに削除フラグを付けます。 デフォルトは、TeXが生成するある種のファイルと patchプログラム 43 が生成する.orig.rejのファイルです。

#dired-flag-auto-save-files)は、 自動保存ファイルと思われる名前のファイル、 すなわち、名前が#で始まり#で終るもの すべてに削除フラグを付けます。 ~dired-flag-backup-files)は、 バックアップファイルと思われる名前のファイル、 すなわち、名前が~で終るものすべてに削除フラグを付けます。

.(ピリオド、dired-clean-directory)は、 バックアップファイルのいくつか、つまり、 古いもの数個と新しいもの数個を除くすべてに削除フラグを付けます。 通常、変数dired-kept-versions (保存するときに適用される変数kept-new-versionsではない) には新しい版を何個残すかを指定し、 変数kept-old-versionsには古い版を何個残すかを指定します。

C-u 3 .のように正の数引数をピリオドに指定すると、 変数dired-kept-versionsを無視して新しい版を何個残すか指定します。 負の数引数は変数kept-old-versionsを無視して 数引数の絶対値で古い版を何個残すか指定します。

% dコマンドは、指定した正規表現(dired-flag-files-regexp)に 一致する名前のファイルに削除フラグを付けます。 ファイル名のうちディレクトリに無関係な部分についてだけ一致を調べます。 ^(先頭)や$(末尾)で、一致箇所を固定できます。 サブディレクトリを隠蔽すれば、サブディレクトリを一致検査から除外できます (see Hiding Subdirectories)。


Node:Dired Visiting, Next:, Previous:Flagging Many Files, Up:Dired

diredでのファイルの訪問

diredには、diredバッファに表示したファイルを訪問したり調べたりするための コマンドがあります。 これらは現在行のファイルに作用します。 そのファイルが実際にはディレクトリであると、 これらのコマンドはそのサブディレクトリに対して (別のdiredバッファを作って)diredを起動します。

f
C-x C-fと打鍵したのと同様に、 現在行が表すファイルを訪問する(dired-find-file) see Visiting
<RET>
fと等価。
o
fと同様だが、ファイルのバッファを別のウィンドウに表示する (dired-find-file-other-window)。 diredバッファは最初のウィンドウに表示されたまま残る。 これはC-x 4 C-fでファイルを訪問するのに似ている。 see Windows
C-o
現在行が表すファイルを訪問して別のウィンドウに表示するが、 そのウィンドウを選択しない(dired-display-file)。
Mouse-2
クリックした行が表すファイルを訪問する (dired-mouse-find-file-other-window)。 oコマンドのように、 ファイルの表示には別のウィンドウを使う。
v
M-x view-fileを用いて現在行が表すファイルを閲覧する (dired-view-file)。

ファイルを閲覧することはファイルを訪問することに似ているが、 ファイルの中で移動できることに重きを置き、 ファイルの変更は許されない。 see View File


Node:Marks vs Flags, Next:, Previous:Dired Visiting, Up:Dired

diredの印とフラグ

ファイルにDで示される削除フラグを付けるかわりに 他の文字(通常*)で示されるを付けることもできます。 『抹消』(x)以外のほとんどのdiredコマンドは、 *で印付けしたファイルを扱えます。

以下のコマンドは、*で印付けするコマンド、 印を消すコマンド、印に作用するコマンドです。 (フラグを付けたり消したりするコマンドについてはsee Dired Deletion。)

m
* m
カレントファイルに*で印を付ける(dired-makr)。 数引数nを指定すると、カレントファイルから始めて後続の n個のファイルに印を付ける。 (nが負の場合は、上の-n個のファイルに印を付ける。)
* *
実行ファイルすべてに*で印を付ける (dired-mark-executables)。 数引数を指定すると、これらのファイルすべての印を消す。
* @
シンボリックリンクすべてに*で印を付ける (dired-mark-symlinks)。 数引数を指定すると、これらのファイルすべての印を消す。
* /
...を除くすべてのディレクトリに*で印を付ける (dired-mark-directories)。 数引数を指定すると、これらのディレクトリすべての印を消す。
* s
現在のサブディレクトリ内の...を除くすべてのファイルに 印を付ける(dired-mark-subdir-files)。
u
* u
この行の印を消す(dired-unmark)。
<DEL>
* <DEL>
ポイントをまえの行へ動かし、その行の印を消す (dired-unmark-backward)。
* !
diredバッファのすべてのファイルの印を消す (dired-unmark-all-files-no-query)。
* ? markchar
指定した文字markcharの印すべてを消す (dired-unmark-all-files)。 引数は1文字。 <RET>で入力を終えてはならない。

数引数を指定すると、このコマンドは印の付いたファイルごとに 印を消すかどうか聞いてくる。 yは消すの意味、nは消さないの意味。 !で答えると残りのファイルすべてについて問い合わせずに印を消す。

* C-n
印が付いているつぎのファイルへ進む (dired-next-marked-file)。 ファイルに『印』が付いているとは、なんらかの印があること。
* C-p
印が付いているまえのファイルへ戻る (dired-prev-marked-file
* t
すべての印を切り替える(dired-do-toggle)。 つまり、*で印が付いているファイルの印を消し、 印が付いていなかったファイルすべてに*で印を付ける。 *以外で印が付いたファイル群は影響されない。
* c old new
文字oldの印を文字newの印に置き換える (dired-change-marks)。 このコマンドは、*D以外の文字で印を付けるための主要な手段。 引数はそれぞれ1文字。 <RET>で入力を終えてはならない。

このコマンドではほとんどどんな文字でも印として使えるため、 ファイルをいろいろに分類できる。 oldが空白( )であると、 コマンドは印が付いていないすべてのファイルに作用する。 newが空白であると、コマンドは作用するファイルの印を消す。

下の例はこのコマンドの能力を例示するものであり、 印のないファイルすべてにDフラグを付け、 Dフラグが付いているものすべてからはフラグを消します。

* c D t  * c SPC D  * c t SPC

ここでは、tで印を付けたファイルはないものと仮定します。

% m regexp <RET>
* % regexp <RET>
正規表現regexpに一致する名前のファイルすべてに (*で)印を付ける(dired-mark-files-regexp)。 このコマンドは% dに似ているが、 削除フラグDのかわりに*でファイルに印を付ける。 see Flagging Many Files

ファイル名のうちディレクトリに無関係な部分だけで一致を検査する。 ^(先頭)や$(末尾)で、一致箇所を固定できる。 サブディレクトリを一致検査から除外するには、 サブディレクトリを隠蔽する。

% g regexp <RET>
ファイルの内容が正規表現regexpに一致するすべてのファイルに (*で)印を付ける(dired-mark-files-containing-regexp)。 このコマンドは% mに似ているが、 ファイル名ではなくその内容で探す。
C-_
印の追加や削除などのdiredバッファに対する変更をアンドゥする (dired-undo


Node:Operating on Files, Next:, Previous:Marks vs Flags, Up:Dired

ファイルの操作

本節では、ファイルを操作する基本的なdiredコマンドについて説明します。 コマンドはすべて大文字であり、実行前に、引数を読み取ったり確認を求めるために ミニバッファを使います。 これらすべてのコマンドには、 操作対象となるファイルを指定する方法がいくつかあります。

以下は、上のように操作対象を選ぶファイル操作コマンドの一覧です。 (!%などの他のdiredコマンドも、 操作対象とするファイルを決定するのに上の方法を用いる。)

C new <RET>
指定したファイルをコピーする(dired-do-copy)。 引数newはコピー先のディレクトリか、 (1つのファイルをコピーする場合は)新しい名前。

変数dired-copy-preserve-timenil以外の場合には、 このコマンドでコピーしたファイルの更新時間はもとのファイルと同じになる。

D
指定したファイルを削除する(dired-do-delete)。 本節の他のコマンドと同様に、このコマンドは印付けされたファイル、 あるいは、後続のn個のファイルに作用する。 対照的に、xdired-expunge)は、 フラグが付いたファイルを削除する。
R new <RET>
指定したファイルの名前を変更する(dired-do-rename)。 引数newは移動先のディレクトリか、 (1つのファイルの名前を変える場合には)新しい名前。

diredは、名前を変更したファイルに対応するバッファの訪問先の ファイル名を自動的に変更するので、新しい名前が反映される。

H new <RET>
指定したファイルにハードリンクを張る(dired-do-hardlink)。 引数newはリンクを置くディレクトリか、 (1つのリンクを張る場合には)リンクに与える名前。
S new <RET>
指定したファイルにシンボリックリンクを張る(dired-do-symlink)。 引数newはリンクを置くディレクトリか、 (1つのリンクを張る場合には)リンクに与える名前。
M modespec <RET>
指定したファイルのモード(いわゆるパーミッションビット)を変更する (dired-do-chmod)。 このコマンドはchmodプログラムを使うので、 modspecにはchmodが扱える任意の引数を指定できる。
G newgroup <RET>
指定したファイルのグループをnewgroupに変更する (dired-do-chgrp)。
O newowner <RET>
指定したファイルの所有者をnewownerに変更する (dired-do-chown)。 (ほとんどのシステムでは、スーパーユーザーだけがこれを実行できる。)

変数dired-chown-programで、 実際の操作を行うために使用するプログラムの名前を指定する。 (システムによっては、chownを置く場所が異なる。)

P command <RET>
指定したファイルを印刷する(dired-do-print)。 ファイルを印刷するコマンドを指定する必要があるが、 (lpr-bufferが使うのと同じ) 変数lpr-commandlpr-switchesとから推定した 適切なものがミニバッファに示される。
Z
指定したファイルを圧縮する(dired-do-compress)。 ファイルがすでに圧縮済みと思われるときは展開する。
L
指定したEmacs Lispのファイルをロードする(dired-do-load)。 see Lisp Libraries
B
指定したEmacs Lispのファイルをバイトコンパイルする (dired-do-byte-compile)。 see Byte Compilation
A regexp <RET>
指定したファイル群に対して正規表現regexpに一致するものを探す (dired-do-search)。

このコマンドはtags-searchの変形。 最初にみつかったところで探索は終る。 探索を再開してつぎに一致するものを探すには、M-,を使う。 see Tags Search

Q from <RET> to <RET>
指定したファイル群のそれぞれについて、 query-replace-regexp(問い合わせながら正規表現を置換する)を実行し、 from(正規表現)に一致する部分をtoに置換する (dired-do-query-replace)。

このコマンドはtags-searchの変形。 置換のループを抜けたあとに、 探索を再開してさらに置換を行うには、M-,を使う。 see Tags Search

+は特別なファイル操作コマンドです(dired-create-directory)。 このコマンドは、ディレクトリ名を読み取り、 それが既存でなければ新たに作成します。


Node:Shell Commands in Dired, Next:, Previous:Operating on Files, Up:Dired

diredでのシェルコマンド

diredコマンドの!dired-do-shell-command)は、 ミニバッファからシェルコマンドを読み取り、 指定したファイルすべてについてそのシェルコマンドを実行します。 diredコマンドの普通の方法で操作対象のファイルを指定できます (see Operating on Files)。 複数ファイルにシェルコマンドを適用する方法は2通りあります。

各ファイルごとにコマンドを1回実行したいが、 コマンドの最後ではなく途中にファイル名を指定したい場合にはどうするのでしょう? あるいは、もっと複雑にファイル名を指定したい場合にはどうするのでしょう? それにはシェルのループを使います。 下の例では、指定した各ファイルに対してuuencodeを実行しますが、 その出力は対応する.uuというファイルに格納します。

for file in *; do uuencode $file $file >$file.uu; done

シェルコマンドの作業ディレクトリは、 diredバッファのトップディレクトリです。

!コマンドは、実行後に新たにできたファイルや変更された ファイルを表示するためにdiredバッファを更新することはしません。 これはシェルコマンドを実際には理解しておらず、 シェルコマンドがどのファイルを変更するのかわからないからです。 diredバッファを更新するにはgコマンドを使います (see Dired Updating)。


Node:Transforming File Names, Next:, Previous:Shell Commands in Dired, Up:Dired

diredでのファイル名の変換

ここにあげるコマンドはファイル名を組織的に変更します。

% u
選択したファイルの名前を大文字に変える (dired-upcase)。 古いファイル名がFoobarだった場合、 新しいファイル名はFOOBARになる。
% l
選択したファイルの名前を小文字に変える (dired-downcase)。 古いファイル名がFoobarだった場合、 新しいファイル名はfoobarになる。
% R from <RET> to <RET>
% C from <RET> to <RET>
% H from <RET> to <RET>
% S from <RET> to <RET>
これらの4つのコマンドは、それぞれ、 ファイル名を変更する、コピーする、ハードリンクを張る、 シンボリックリンクを張る。 これらのコマンドは、いずれも、 古いファイル名から正規表現の置換で新しいファイル名を決定する。

正規表現の置換を用いる4つのコマンドは、実質的には、 diredバッファにおいて一連の選択したファイルの名前を 探索して置換を行います。 これらは引数を2つ読み取ります。 正規表現fromと置換パターンtoです。

これらのコマンドは、正規表現fromに一致する各『古い』ファイル名の 一致した部分をtoで置換します。 replace-regexp(see Regexp Replace)のように、 toの中では\&\digitを用いて 古いファイル名に一致したパターン全体やその一部を参照できます。 ファイル名の2箇所以上の部分に正規表現が一致する場合には、 最初の一致部分が置換されます。

たとえば、% R ^.*$ <RET> x-\& <RET>は、 選択されたファイルの名前の先頭にx-を付け加える形で 名前を変えます。 逆に、各ファイルの名前の先頭のx-を取り去ることもできて、 1つの方法は、% R ^x-\(.*\)$ <RET> \1 <RET>です。 あるいは、% R ^x- <RET> <RET>でもできます。 (ファイル名全体に一致するようにするには^$を使う。)

通常、置換処理ではファイル名のディレクトリ部分は考慮しません。 ディレクトリ内のファイルの名前だけを操作します。 数引数0を指定すると、置換はディレクトリ名を含んだ絶対ファイル名に作用します。

一連のファイルを操作対象に選ぶときに、 それらを操作するときに使うのと同じregexp(正規表現)を使いたい場合が あるでしょう。 これを行うには、% m regexp <RET>でまず一連のファイルに 印を付けてから、それらを操作するコマンドにも同じ正規表現を使います。 これを簡単に行えるように、 %の付いたコマンドは、%付きコマンドいずれかに最近指定した 正規表現をデフォルトで使います。


Node:Comparison in Dired, Next:, Previous:Transforming File Names, Up:Dired

diredでのファイルの比較

diredには、指定したファイルをdiffで比較するコマンドが2つあります。

=
diffプログラム(dired-diff)を用いて、 (ポイントがある箇所の)カレントファイルを (マークがある箇所の)他のファイルと比較する。 マークがある箇所のファイルがdiffの第1引数で、 ポイントがある箇所のファイルが第2引数になる。
M-=
カレントファイルとその最新のバックアップファイルとを比較する (dired-backup-diff)。 カレントファイルがバックアップファイルそのものであるときは、 バックアップファイルのバックアップファイルとの比較を行う。 このようにして、任意の版のバックアップファイルとの比較を行える。

バックアップファイルはdiffの第1引数になる。


Node:Subdirectories in Dired, Next:, Previous:Comparison in Dired, Up:Dired

diredのサブディレクトリ

通常、diredバッファは1つのディレクトリだけを表示します。 しかし、そのサブディレクトリ群を一緒に表示させることもできます。

1つのdiredバッファ内に複数のディレクトリを表示させるもっとも簡単な方法は、 lsを実行するときにオプション-lRを指定することです。 (diredを実行するときに数引数を指定すると、 これらのオプションをミニバッファで指定できる。) これにより、すべてのレベルのすべてのサブディレクトリを表示した 再帰的なディレクトリ一覧を作れます。

しかし、一般には、すべてのサブディレクトリでは多すぎます。 普通は、特定のサブディレクトリだけを含めたいでしょう。 それには、iコマンドを使います。

i
指定したサブディレクトリの内容をバッファの終りに追加する。

ディレクトリであるファイルを表す行で、 idired-maybe-insert-subdir)コマンドを使います。 指定したサブディレクトリの内容を同じdiredバッファに挿入し、 その箇所へ移動します。 挿入されたサブディレクトリの内容は、 ls -lRの出力と同様に、 diredバッファのトップレベルのディレクトリのあとに続きます。

すでにサブディレクトリの内容がバッファにある場合には、 iコマンドはその表示箇所に移動するだけです。

どちらの場合においても、iは移動するまえにEmacsのマークを設定するので、 C-u C-<SPC>でバッファ内のもとの箇所 (そのサブディレクトリを表す行)へ戻れます。

サブディレクトリの内容を更新するには、 ldired-do-redisplay)コマンドを使います。 サブディレクトリを削除するにはkを使います。 See Dired Updating


Node:Subdirectory Motion, Next:, Previous:Subdirectories in Dired, Up:Dired

サブディレクトリへの移動

diredバッファにサブディレクトリが表示されている場合、 コマンドC-x [C-x ]でディレクトリ単位に移動できます。

以下のコマンドは、1つのdiredバッファ内で ディレクトリ木構造を上下に移動するコマンドです。 これらはすべてディレクトリのヘッダ行 (directory header lines)、 つまり、ディレクトリの内容を表示する部分の先頭にある ディレクトリ名を示す行に移動します。

C-M-n
レベルに関係なくつぎのサブディレクトリのヘッダ行へ進む (dired-next-subdir)。
C-M-p
レベルに関係なくまえのサブディレクトリのヘッダ行へ戻る (dired-prev-subdir)。
C-M-u
親ディレクトリのディレクトリヘッダ行へ移動する(dired-tree-up)。
C-M-d
ディレクトリ木構造を1つ降りて最初のサブディレクトリのヘッダ行へ移動する (dired-tree-down)。
<
まえのディレクトリファイルの表示行へ戻る(dired-prev-dirline)。 これらの行は、親ディレクトリにおいてファイルとしてディレクトリを表す行。
>
つぎのディレクトリファイルの表示行へ進む(dired-next-dirline)。


Node:Hiding Subdirectories, Next:, Previous:Subdirectory Motion, Up:Dired

サブディレクトリの隠蔽

サブディレクトリの隠蔽(hide)とは、 選択的表示(see Selective Display)を用いて ヘッダ行以外を見えなくすることです。

$
ポイント位置にあるサブディレクトリを隠蔽、あるいは、再表示して、 ポイントをつぎのサブディレクトリへ移動する (dired-hide-subdir)。 数引数は反復回数。
M-$
diredバッファ中のすべてのサブディレクトリを隠蔽し、 サブディレクトリのヘッダ行だけを残す(dired-hide-all)。 あるいは、隠蔽されているサブディレクトリがある場合には、 すべてのサブディレクトリを再表示する。 このコマンドを使うと、 深いディレクトリ木構造の概形を調べたり、 遠く離れたサブディレクトリへ素早く移動できる。

通常のdiredコマンドは、 隠蔽されたサブディレクトリ内のファイルについてまったく考慮しません。 たとえば、印を付けたファイルに作用するコマンドは、 隠蔽されたディレクトリ内に印を付けたファイルが あったとしてもそれらを無視します。 したがって、サブディレクトリを一時的に隠蔽すれば、 印を消さなくてもサブディレクトリを操作対象から外せます。

サブディレクトリを隠蔽するコマンドはトグルとして働きます。 つまり、表示されていれば隠蔽し、隠蔽されていれば表示します。


Node:Dired Updating, Next:, Previous:Hiding Subdirectories, Up:Dired

diredバッファの更新

本節では、(diredとは無関係に)外部でのディレクトリやファイルの変更を diredバッファに反映させるコマンド、および、 diredバッファの一部を削除するコマンドを説明します。

g
diredバッファの全内容を更新する(revert-buffer)。
l
指定したファイルを更新する(dired-do-redisplay)。
k
指定したファイルの表示行を削除する。 ファイルではなく、単に表示行だけを消す(dired-do-kill-lines)。
s
アルファベット順の表示と日付/時間順の表示を切り替える (dired-sort-toggle-or-edit)。
C-u s switches <RET>
オプションswitchesdired-listing-switchesとして用いて diredバッファを更新する。

grevert-buffer)コマンドを実行すると、 表示されているファイルやディレクトリの変更に基づいてdiredバッファを 更新します。 このコマンドは消されたファイルに対するものを除いて すべての印やフラグを保存します。 隠蔽されたサブディレクトリも更新されますが、隠蔽されたままです。

いくつかのファイルだけを更新する場合には、 ldired-do-redisplay)と打ちます。 このコマンドは、後続のn個のファイル、 印を付けたファイルがあればそれらのファイル、 カレントファイルのいずれかに作用します。 それらを更新するとは、それらのファイルの現状をファイルシステムから取得し、 それを正しく反映するようにバッファを更新します。

lをサブディレクトリのヘッダ行で実行すると、 対応するサブディレクトリの内容を更新します。

指定したファイルの表示行を削除する、 つまり、ファイルそのものではなく行だけを削除するには kdired-do-kill-lines)と打ちます。 数引数nを指定すると、 このコマンドは、後続のn個のファイルに作用します。 さもなければ、印を付けたファイルに作用します。

削除するファイルの表示行がディレクトリだった場合には、 そのディレクトリの内容もバッファから削除されます。 サブディレクトリのヘッダ行でC-u kと打っても、 diredバッファからサブディレクトリの内容を削除できます。

gコマンドは、このようにして削除した表示行を画面に呼び戻すことが できますが、サブディレクトリに関してはできません。 各サブディレクトリを再度挿入するにはiを使う必要があります。

diredバッファ内のファイルは、通常、 ファイル名のアルファベット順に並んでいます。 diredは日付/時間順に並べ替えることもできます。 diredコマンドsdired-sort-toggle-or-edit)は、 これら2つのソート方法を切り替えます。 diredバッファのモード行には、アルファベット順と日付/時間順の どちらで現在表示しているかが示されます。

C-u s switches <RET>で、 変数dired-listing-switchesに新しい値を設定できます。


Node:Dired and Find, Previous:Dired Updating, Up:Dired

diredとfindプログラム

findプログラムを使ってファイルを選べば、 diredバッファ上に表示する一連のファイルをもっと柔軟に選択できます。

ワイルドカードに一致する名前のファイルを探索するには M-x find-name-diredを使います。 このコマンドは、2つの引数directorypatternを読み取り、 directoryにあるすべてのファイル、 あるいは、そのサブディレクトリ下にあるpatternに一致する名前のファイルを 選択します。

このようにして選択されたファイルはdiredバッファに表示され、 このバッファではもとのdiredコマンドを使えます。

ファイル名ではなくファイルの内容で調べたい場合には、 M-x find-grep-diredを使います。 このコマンドはミニバッファから2つの引数directoryregexpを 読み取ります。 directoryにあるすべてのファイル、 あるいは、regexpに一致するものを含む一連のサブディレクトリを選択します。 このコマンドは、プログラムfindgrepを実行して動作します。 CompilationM-x grep-findも参照してください。 Emacsの正規表現ではなくgrepの正規表現を書くことを忘れないでください。

このような一連のコマンドの中でもっとも一般的なコマンドはM-x find-diredで、 findが検査に用いる任意の条件を指定できます。 このコマンドはミニバッファから2つの引数directoryfind-argsを 読み取ります。 検査すべき条件を指示するfind-argsを渡して、 directoryにおいてfindを実行します。 このコマンドを使うには、findの使い方を知っている必要があります。

これらのコマンドが出力する表示形式は変数find-ls-optionで 制御されます。 デフォルトは、lsに使うオプションとして-ldを指定します。 出力形式が壊れて見える場合には、 この変数の値を変更する必要があるかもしれません。


Node:Calendar/Diary, Next:, Previous:Dired, Up:Top

暦と日誌

Emacsには、過去や将来の予定を記録する日誌の機能を持つ カレンダー機能があります。 カレンダーに入るにはM-x calendarと打ちます。 すると、今月を中央月として3か月分のカレンダーが表示され、 ポイントは今日の日付に置かれます。 C-u M-x calendarのように数引数を指定すると、 3か月分のカレンダーの中央に表示する月と年を聞いてきます。 カレンダーは専用のバッファを使い、 そのメジャーモードはカレンダー(calendar)モードです。

カレンダー内でMouse-2をクリックすると、 その日付で使用できる機能のメニューが表示されます。 C-Mouse-3をクリックすると、 特定の日付に関わらずに使える機能のメニューが表示されます。 カレンダーから抜けるにはqと打ちます。 カレンダーと日誌のカスタマイズに関しては、 See Calendar


Node:Calendar Motion, Next:, Up:Calendar/Diary

カレンダー内の移動

カレンダー(calendar)モードでは、 日、週、月、年といった論理的単位で移動します。 始めに表示された3か月の外に移動すると、 カレンダーは自動的に『スクロール』して 指定された日付の箇所が表示されるようにします。 ある日付へ移動すると、祝祭日の名称や日誌記録を見たり、 その日付を別の暦に変換したりできます。 カレンダーを単にスクロールすれば、大きな時間単位での移動に便利です。


Node:Calendar Unit Motion, Next:, Up:Calendar Motion

日/週/月/年単位の移動

カレンダー内を移動するコマンドはテキスト内を移動するコマンドに対比できます。 日、週、月、年を単位として前後に移動できます。

C-f
1日後にポイントを進める(calendar-forward-day)。
C-b
1日前にポイントを戻す(calendar-backward-day)。
C-n
1週間後にポイントを進める(calendar-forward-week)。
C-p
1週間前にポイントを戻す(calendar-backward-week)。
M-}
1か月後にポイントを進める(calendar-forward-month)。
M-{
1か月前にポイントを戻す(calendar-backward-month)。
C-x ]
1年後にポイントを進める(calendar-forward-year)。
C-x [
1年前にポイントを戻す(calendar-backward-year)。

日や週を単位とした移動は、Emacsの通常の文字単位や行単位の移動の類推です。 C-nは通常はつぎの行の同じ桁に移動しますが、 カレンダー(calendar)モードでは つぎの週の同じ曜日に移動します。 また、C-pはまえの週の同じ曜日に移動します。

矢印キーは他のモードと同様に、それぞれ、 C-fC-bC-nC-pに等価です。

月単位や年単位の移動コマンドは週単位の移動と同じように働きますが、 より大きな単位での移動です。 月単位の移動コマンドM-}M-{は、それぞれ、 翌月、前月に移動します。 年単位の移動コマンドC-x ]C-x [は、 それぞれ、1年後、1年前に移動します。

これらのコマンドを簡単に覚えるには、それぞれ、 月と年を段落とページに対比させることです。 しかし、コマンド自体は同じではありません。 Emacsの通常の段落移動コマンドは段落の先頭か末尾に移動しますが、 月単位や年単位の移動コマンドは1か月分や1年分で移動しますから、 月や年の区切りを普通は飛び越します。

これらのコマンドはすべて数引数を反復回数として扱います。 簡単のために、カレンダー(calendar)モードでは Meta修飾なしでも数字とマイナス記号で数引数を指定できます。 たとえば、100 C-fは100日後の日付にポイントを進めます。


Node:Move to Beginning or End, Next:, Previous:Calendar Unit Motion, Up:Calendar Motion

週/月/年の始めと終り

週(または、月、年)というのは、単に1日1日が集まったものではありません。 週(月、年)は特定の日で始まると考えます。 そこで、カレンダー(calendar)モードには、 週、月、年の始めや終りに移動するコマンドがあります。

C-a
週の始めにポイントを移動する(calendar-beginning-of-week)。
C-e
週の終りにポイントを移動する(calendar-end-of-week)。
M-a
月の始めにポイントを移動する(calendar-beginning-of-month)。
M-e
月の終りにポイントを移動する(calendar-end-of-month)。
M-<
年の始めにポイントを移動する(calendar-beginning-of-year)。
M->
年の終りにポイントを移動する(calendar-end-of-year)。

これらのコマンドは数引数を反復回数と扱い、 何週、何か月、何年だけ前後に移動するのかを指定します。

デフォルトでは、週は日曜から始まります。 月曜から始めるには、変数calendar-week-start-dayに1を設定します。 44


Node:Specified Dates, Previous:Move to Beginning or End, Up:Calendar Motion

特定の日付

カレンダー(calendar)モードには、 さまざまな方法で指定した特定の日付へ移動するコマンドがあります。

g d
指定した日付へポイントを移動する(calendar-goto-date)。
o
指定した月をカレンダーの中央月にする(calendar-other-month)。
.
ポイントを今日の日付に移動する(calendar-goto-today)。

g dcalendar-goto-date)は、 年、月、日を読み取ってその日付に移動します。 カレンダーには西暦紀元がすべて含まれているため、 西暦年を略さずに打つ必要があります。 つまり、90ではなく1990です。

ocalendar-other-month)は、 月と年を読み取って、その月を中央月として3か月分のカレンダーを表示します。

.calendar-goto-today)で、今日の日付に戻ることができます。


Node:Scroll Calendar, Next:, Previous:Calendar Motion, Up:Calendar/Diary

カレンダーのスクロール

見えている範囲を越えて移動するとカレンダーは自動的にスクロールします。 手動でスクロールすることもできます。 カレンダーを表示しているウィンドウでは、 長い長い紙に月を印刷したものの一部が見えているのだと考えてください。 カレンダーをスクロールするとは、 新しい月が見えるようにこの紙を動かすことに相当します。

C-x <
カレンダーを1か月後にスクロールする(scroll-calendar-left)。
C-x >
カレンダーを1か月前にスクロールする(scroll-calendar-right)。
C-v
<NEXT>
カレンダーを3か月後にスクロールする (scroll-calendar-left-three-months)。
M-v
<PRIOR>
カレンダーを3か月前にスクロールする (scroll-calendar-right-three-months)。

カレンダーをスクロールするもっとも基本的なコマンドは、 一度に1か月分スクロールします。 つまり、コマンドの実行前後の表示を比べると、2か月分重複しています。 C-x <はカレンダーを1か月分左にスクロールします。 つまり、時間的に1か月後を表示します。 C-x >コマンドはカレンダーを右にスクロールし、 時間的に1か月前に戻します。

コマンドC-vM-vは、 カレンダーを『1画面分』、つまり、3か月分スクロールします。 これは、通常のモードでのこれらのコマンドと意味的に同じになっています。 C-vは将来の日付を見えるようにし、 M-vは過去の日付を見えるようにします。 これらのコマンドは数引数を反復回数として扱います。 たとえば、C-uは後続のコマンドを4回反復するので、 C-u C-vと打てば1年分先へカレンダーをスクロールし、 C-u M-vと打てば1年分前へカレンダーをスクロールします。

ファンクションキー<NEXT>と<PRIOR>は、 他のモードと同様に、それぞれ、C-vM-vに等価です。


Node:Counting Days, Next:, Previous:Scroll Calendar, Up:Calendar/Diary

日数計算

M-=
カレントリージョン内の日数を表示する (calendar-count-days-region)。

リージョン内の日数を調べるには、 M-=calendar-count-days-region)と打ちます。 このコマンドで表示される日数は、 マークとポイントで指定した両日を含んだ日数です。


Node:General Calendar, Next:, Previous:Counting Days, Up:Calendar/Diary

その他のカレンダーコマンド

p d
通年日(1年のうちの何日目の日か)を表示する (calendar-print-day-of-year)。
C-c C-l
カレンダーを表示しているウィンドウを再表示する(redraw-calendar)。
<SPC>
別のウィンドウをスクロールする (scroll-other-window)。
q
カレンダーから抜ける(exit-calendar)。

年始から数えた日数、あるいは、1年の残り日数を表示するには、 p dcalendar-print-day-of-year)コマンドを打ちます。 すると、上の2つの日数をエコー領域に表示します。 年始からの日数には指定した日が含まれます。 また、残りの日数には指定した日は含まれません。

カレンダーのウィンドウのテキストが壊れた場合には、 C-c C-lredraw-calendar)と打って再表示させます。 (カレンダー(calendar)モード以外の編集用コマンドを使った場合に限り、 表示がおかしくなる。)

カレンダー(calendar)モードでは、 <SPC>(scroll-other-window)を使って 別のウィンドウをスクロールできます。 このコマンドは、 別のウィンドウに祝祭日や日誌記録の一覧を表示しているときに便利です。

カレンダーから抜けるには、 qexit-calendar)と打ちます。 このコマンドはカレンダーに関係したすべてのバッファを閉じ、 別のバッファを選択します。 (カレンダー関連のウィンドウ専用のフレームであった場合には、 カレンダーを終了するとそのフレームをアイコン化する。)


Node:LaTeX Calendar, Next:, Previous:General Calendar, Up:Calendar/Diary

LaTeXカレンダー

カレンダーLaTeXコマンドは、 カレンダーを印刷するLaTeXコードのバッファに作成します。 使用するコマンドに依存して、ポイント位置の日、週、月、年の いずれかを含んだカレンダーを印刷できます。

t m
1か月分のカレンダーを生成する(cal-tex-cursor-month)。
t M
横づかいで1か月分のカレンダーを生成する (cal-tex-cursor-month-landscape)。
t d
1日分のカレンダーを生成する(cal-tex-cursor-day)。
t w 1
1週間分の1ページのカレンダーを生成する(cal-tex-cursor-week)。
t w 2
1週間分の2ページのカレンダーを生成する(cal-tex-cursor-week2)。
t w 3
1週間分のISOスタイルのカレンダーを生成する(cal-tex-cursor-week-iso)。
t w 4
月曜から始まる1週間分のカレンダーを生成する (cal-tex-cursor-week-monday)。
t f w
ファイロファックス(システム手帳)スタイルの見開き2週間分のカレンダーを生成する (cal-tex-cursor-filofax-2week)。
t f W
ファイロファックス(システム手帳)スタイルの見開き1週間分のカレンダーを生成する (cal-tex-cursor-filofax-week)。
t y
1年分のカレンダーを生成する(cal-tex-cursor-year)。
t Y
横づかいで1年分のカレンダーを生成する (cal-tex-cursor-year-landscape)。
t f y
ファイロファックス(システム手帳)スタイルの1年分のカレンダーを生成する (cal-tex-cursor-filofax-year)。

これらのコマンドのいくつかは、横づかい(つまり、『ランドスケープ』)の カレンダーを印刷し、横長になります。 いくつかのコマンドでは、ファイロファックス(システム手帳) サイズ(3.75インチ×6.75インチ、約95.25mm×171.45mm)を使います。 これらのコマンドはすべて、印刷する日数、週数、月数、年数を 数引数で指定できます(つねに選択した日から始まる)。

変数cal-tex-holidaysnil以外(デフォルト)ならば、 印刷されるカレンダーにはcalendar-holidaysの祝祭日が表示されます。 変数cal-tex-diarynil以外 (デフォルトはnil)ならば、 日誌記録も一緒に印刷されます(週間および月間カレンダーの場合だけ)。


Node:Holidays, Next:, Previous:LaTeX Calendar, Up:Calendar/Diary

祝祭日

Emacsのカレンダーはすべての祝祭日を把握しており、 それらをカレンダーに表示できます。

h
選択された日付の祝祭日を表示する(calendar-cursor-holidays)。
Mouse-2 Holidays
マウスでクリックした日付の祝祭日を表示する。
x
カレンダーウィンドウの祝祭日に印を付ける (mark-calendar-holidays)。
u
カレンダーウィンドウの印を消す(calendar-unmark)。
a
表示中の3か月分のカレンダーの すべての祝祭日を別のウィンドウに表示する (list-calendar-holidays)。
M-x holidays
今日を中心とした3か月間のすべての祝祭日を別のウィンドウに表示する。
M-x list-holidays
指定した範囲の年の祝祭日を別のウィンドウに表示する。

カレンダー上のある日付が祝祭日かどうかを知るには、 その日付にポイントを動かしhコマンドを使います。 あるいは、その日付をMouse-2でクリックし、 立ち上がったメニューからHolidaysを選択します。 いずれの方法でも、その日付に関する祝祭日情報が、 エコー領域に収まればエコー領域に、あるいは、別のウィンドウに表示されます。

カレンダーに表示されている期間内にどれだけの祝祭日があるかを知るには、 xコマンドを使います。 祝祭日である日を異なるフェイスで(複数のフェイスを使えなければ、 日付のあとに*を付けて)表示します。 このコマンドは、画面に見えている期間だけでなく、 スクロールすると見えてくる期間にも適用されます。 印を消してもとの状態に戻るにはuコマンドを使いますが、 日誌の印も同時に消えます。 (see Diary)。

より詳しい情報を得るには、aコマンドを使います。 これは、現在の3か月間に含まれるすべての祝祭日の一覧を別のバッファに表示します。 カレンダーのウィンドウで<SPC>を使うと、 その一覧をスクロールできます。

コマンドM-x holidaysは、今月を中央月として前後1か月に含まれる 祝祭日の一覧を表示します。 カレンダーウィンドウがなくてもこのコマンドを使えます。 別の月を中央月とした祝祭日の一覧が必要な場合は、 C-u M-x holidaysを使います。 (中央月の)月と年を聞いてきます。

Emacsが知っている祝祭日は、 アメリカ合衆国の祝祭日、キリスト教の祝祭日、 ユダヤ教の祝祭日、イスラム教の祝祭日、夏至、冬至、春分、秋分です。

コマンドM-x list-holidaysは、 指定した数年間の祝祭日の一覧を表示します。 始めの年と終りの年を聞いてくるので、 すべての祝祭日、ある特定の種類の祝祭日を選べます。 カレンダーウィンドウがなくてもこのコマンドを使えます。

Emacsが祝祭日を決定するために用いる暦は、 歴史的な事実に基づくものではなく、 現在用いているものです。 たとえば、歴史的には夏時間 45 (daylight savings time)を始める時期や施行するかどうかは、 年ごとにばらばらでした。 現在の合衆国の法律では4月の最初の日曜から始めると定めています。 合衆国の夏時間を適用するかどうかを Emacsは現在の定義に基づいて決定しますので、 昔の年代については誤りである場合もあります。


Node:Sunrise/Sunset, Next:, Previous:Holidays, Up:Calendar/Diary

日出入時刻

カレンダーの特別なコマンドで、 任意の日付の日出入時刻を2分以内の精度で調べられます。

S
選択した日付の日出入時刻を表示する (calendar-sunrise-sunset)。
Mouse-2 Sunrise/Sunset
クリックした日付の日出入時刻を表示する。
M-x sunrise-sunset
今日の日出入時刻を表示する。
C-u M-x sunrise-sunset
指定した日付の日出入時刻を表示する

カレンダー内で地方時(local times)で日出入時刻を表示するには、 目的の日付にポイントを移動してからSと打ちます。 あるいは、目的の日付をMouse-2でクリックすると メニューが立ち上がるのでその中からSunrise/Sunsetを選びます。 カレンダーの外からでも、 今日や指定した日付の日出入時刻を M-x sunrise-sunsetコマンドで調べられます。 今日以外の日付を指定するには、 C-u M-x sunrise-sunsetコマンドを使います。 すると、年月日を聞いてきます。

C-u C-u M-x sunrise-sunsetで、 任意の場所の任意の日付の日出入時刻を表示できます。 経度、緯度、協定世界時46 からの分単位のずれ、日付の指定を聞いてきます。 すると、その場所でのその日付の日出入時刻が表示されます。

日出入時刻は、地球上の場所に依存しますので、 これらのコマンドを使うまえにEmacsに現在いる場所の緯度/経度と土地の名前を 教えなければなりません。 これにはつぎのようにします。

(setq calendar-latitude 40.1)
(setq calendar-longitude -88.2)
(setq calendar-location-name "Urbana, IL")

変数calendar-latitudecalendar-longitudeの値には、 小数点以下1桁まで指定します。

タイムゾーンは、地方時で表した日出入時刻に影響します。 通常、Emacsはオペレーティングシステムからタイムゾーンを取得しますが、 それがまちがっている場合(あるいは、オペレーティングシステムが その情報を与えない場合)には、自分で設定する必要があります。 つぎは設定例です。

(setq calendar-time-zone -360)
(setq calendar-standard-time-zone-name "CST")
(setq calendar-daylight-time-zone-name "CDT")

calendar-time-zoneの値は、協定世界時(グリニッジ標準時)と 地方標準時との差を分単位で表したものです。 calendar-standard-time-zone-namecalendar-daylight-time-zone-nameは、 現在いる場所のタイムゾーンの省略名称です。 Emacsは夏時間を補正して日出入時刻を表示します。 夏時間をどのように決定するかは、 See Daylight Savings

ユーザーとしては、個人の.emacsファイルで カレンダーの位置関連の変数に普段いる場所の値を設定すると便利でしょう。 あるいは、Emacsをマシンにインストールするときに、 そのマシンの大部分のユーザー用に典型的な場所に関する 情報をdefault.elファイルに設定してもかまいません。 See Init File


Node:Lunar Phases, Next:, Previous:Sunrise/Sunset, Up:Calendar/Diary

朔弦望(新月、上弦、満月、下弦)

以下のコマンドは、朔弦望(新月、上弦、満月、下弦)の日付と時刻を表示します。 これらの機能は、『朔弦望に依存する』問題をデバッグするときに重宝します。

M
表示してある3か月間の朔弦望の日付/時刻の一覧を表示する (calendar-phases-of-moon)。
M-x phases-of-moon
今日を中央にした3か月間の朔弦望の日付/時刻の一覧を表示する。

カレンダー内でMコマンドを使うと、 現在の3か月間の朔弦望の日付/時刻を別のバッファに表示します。 一覧内の日付/時刻は数分以内の精度です。

カレンダーの外からでも、 M-x phases-of-moonコマンドを使って、 今月を中央月として前後1か月の朔弦望の日付/時刻を 表示できます。 別の期間に関して調べるにはC-u M-x phases-of-moonを使います。 すると、月と年を聞いてきます。

朔弦望の日付/時刻は(必要ならば夏時間を補正して)地方時で与えられます。 しかし、変数calendar-time-zoneが設定されていなければ、 協定世界時(グリニッジ標準時)が使われます。 See Daylight Savings


Node:Other Calendars, Next:, Previous:Lunar Phases, Up:Calendar/Diary

他の暦との相互変換

Emacsのカレンダーはつねに グレゴリオ暦(Gregorian calendar)で表示します。 この暦は『新暦』とも呼ばれ、今日では世界の大部分で使われています。 しかし、この暦は16世紀以前には存在せず、 18世紀になるまでは普及していませんでした。 ユリウス暦(Julian calendar)に置き替って 世界的に受け入れられたのは20世紀初頭になってからです。 Emacsのカレンダーは西暦1年1月以降の任意のカレンダーを表示できますが、 グレゴリオ暦が存在しなかった時代に関しても グレゴリオ暦に基づいた暦を表示します。

Emacsは他の暦を表示することはできませんが、 指定した日付と他の暦の日付とを相互に変換できます。


Node:Calendar Systems, Next:, Up:Other Calendars

参照可能な暦

ISO商用暦はヨーロッパで広く使われています。

ユリウス暦は、ジュリアス・シーザー(ユリウス・カエサル、Julius Caesar)に 因んで命名されたもので、 中世から19世紀にかけてヨーロッパ中で使われていました。

天文学者は、ユリウス暦紀元前4713年1月1日月曜の正午からの経過日数を使います。 この経過日数をユリウス日(Julian day number)とか 天文通算日(Astronomical day number)と呼びます。

ヘブライ暦は昔からユダヤ教で使われてきました。 Emacsのカレンダープログラムは、ユダヤの祝祭日がどの日付かを 決定するのにヘブライ暦を使います。 ヘブライ暦では1日は日没から始まり日没で終ります。 47

イスラム暦は多くのイスラム教の国々で使われています。 Emacsはイスラム暦を用いてイスラム教の祝祭日を決定します。 イスラムの世界ではカレンダーについての世界的な取り決めが存在しません。 Emacsは広く受け入れられているものを使用していますが、 イスラム教の祝祭日の正確な日付は、計算によってではなく 宗教上の権威筋の布告によってしばしば決定されます。 そのため、実際の日付とEmacsが計算した日付には少々違いがあります。 イスラム暦の1日は日没から始まり日没で終ります。

フランス革命暦は、1789年の大革命以降にジャコバン党によって作成されました。 より永続的で自然に準じて年周期を捉えることを目的に、 度量衡に類似した合理的な尺度ということで1週間を10日にしています。 フランス政府は、この暦を1805年の終りに公式に放棄しました。

中央アメリカのマヤでは、3種類の別だが重複している暦の体系、 ロングカウント(long count)、ゾルキン(tzolkin)、 ハアブ(haab)を使っていました。 Emacsはこれらの3つの暦をすべて知っています。 専門家はマヤ暦とわれわれの暦が正確にはどのように関連しているか 議論している最中です。 Emacsは、グッドマン・マーチンス・トンプソンの関連付けを用いて計算します。

コプト教徒は古代エジプト太陽暦に基づく暦を使っています。 この暦は、おのおの30日からなる12個の月と、それに続く余分の5日間で構成されます。 4年に一度、余分の5日間に閏日(1日間)を付け加えて6日間とします。 エチオピア暦は構造的にはコプト暦と同一ですが、 コプト暦とは異なった年数と月の名前を用いています。

ペルシア人はオマール・カイヤーム(Omar Khayyam) 48が 作った暦に基づいた太陽暦を使っています。 この暦は、12個の月から成り、最初の6個の月は31日、 つぎの5個の月は30日、最後の1個の月は平年は29日で閏年には30日となります。 閏年は4年か5年に一度入る複雑なパターンで起こります。

中国暦は、朔望月を太陽年に埋め込んだ複雑なものです。 年は60を単位として一周し、平年は12個の月ですが、閏年は13個の月です。 各月は29日か30日です。 年、平月、日は、10の天の主節49と 12の地の副節50 に従って名付けられ、 60を周期として巡回します。 51


Node:To Other Calendar, Next:, Previous:Calendar Systems, Up:Other Calendars

他の暦への変換

以下のコマンドは選択した日(ポイントがある日)を他の暦で表示します。

Mouse-2 Other Calendars
クリックした日が、他のさまざまな暦ではどうなるかを表示する。
p c
選択した日をISO商用暦の日付で表示する (calendar-print-iso-date)。
p j
選択した日をユリウス暦の日付で表示する (calendar-print-julian-date)。
p a
選択した日を天文通算日(ユリウス日)で表示する (calendar-print-astro-day-number)。
p h
選択した日をヘブライ暦の日付で表示する (calendar-print-hebrew-date)。
p i
選択した日をイスラム暦の日付で表示する (calendar-print-islamic-date)。
p f
選択した日をフランス革命暦の日付で表示する (calendar-print-french-date)。
p C
選択した日を中国暦の日付で表示する (calendar-print-chinese-date)。
p k
選択した日をコプト暦の日付で表示する (calendar-print-coptic-date)。
p e
選択した日をエチオピア暦の日付で表示する (calendar-print-ethiopic-date)。
p p
選択した日をペルシア暦の日付で表示する (calendar-print-persian-date)。
p m
選択した日をマヤ暦の日付で表示する(calendar-print-mayan-date)。

XウィンドウシステムでEmacsを使っている場合には、 ある日付を他の暦での日付に変換する いちばん簡単な方法は、その日付をMouse-2でクリックし、 立ち上がったメニューからOther Calendarsを選びます。 対応する日付をEmacsが知っているすべての暦でメニューに表示します。 (このメニューは単なる表示用なので、項目を選んでも何も起こらない。)

グレゴリオ暦の目的の日付にポイントを動かして適切なキーを打ちます。 pはprintの意味で、 Emacsはその日を指定された暦でエコー領域に表示します。


Node:From Other Calendar, Next:, Previous:To Other Calendar, Up:Other Calendars

他の暦からの変換

Emacsが扱える暦で日付を指定して、カレンダーの対応する日に移動できます。 本節では、マヤ暦を除く暦でこれを行うコマンドを説明します。 マヤ暦については、これに続く節を参照してください。

g c
ISO商用暦で指定した日付に移動する(calendar-goto-iso-date)。
g j
ユリウス暦で指定した日付に移動する(calendar-goto-julian-date)。
g a
天文通算日(ユリウス日)で指定した日付に移動する (calendar-goto-astro-day-number)。
g h
ヘブライ暦で指定した日付に移動する(calendar-goto-hebrew-date)。
g i
イスラム暦で指定した日付に移動する(calendar-goto-islamic-date)。
g f
フランス革命暦で指定した日付に移動する(calendar-goto-french-date)。
g C
中国暦で指定した日付に移動する(calendar-goto-chinese-date)。
g p
ペルシア暦で指定した日付に移動する(calendar-goto-persian-date)。
g k
コプト暦で指定した日付に移動する(calendar-goto-coptic-date)。
g e
エチオピア暦で指定した日付に移動する(calendar-goto-ethiopic-date)。

これらのコマンドは、それぞれの暦での日付を聞いてきて、 それに対応するグレゴリオ暦の日付にポイントを移動します。 また、エコー領域には指定した暦の日付を表示します。 Emacsは月の名前をユーザーに聞くときに強い補完(see Completion) を使うので、ヘブライ暦/イスラム暦/フランス革命暦などの月の名前の綴りを 気にする必要はないでしょう。

ヘブライ暦で問題となるのが追悼記念祭『ヤールツァイト』(yahrzeit)と 呼ばれる命日の計算です。 Emacsのカレンダーにはその計算機能があります。 カレンダー内にカーソルがあるときにM-x list-yahrzeit-datesコマンドを 実行すると年の範囲を聞いてきます。 そして、ポイントがある日付に対応した追悼記念祭の日付を指定した範囲の年に ついて一覧表示します。 カレンダー内にいないときにこのコマンドを使うと、 まず死亡年月日を聞いてから年の範囲を聞いてきます。 そして、追悼記念祭の日付の一覧を表示します。


Node:Mayan Calendar, Previous:From Other Calendar, Up:Other Calendars

マヤ暦からの変換

以下はマヤ暦で日付を指定する方法です。

g m l
ロングカウント暦で指定した日付に移動する (calendar-goto-mayan-long-count-date)。
g m n t
ゾルキン暦のつぎの周期の日に進む (calendar-next-tzolkin-date)。
g m p t
ゾルキン暦のまえの周期の日に戻る (calendar-previous-tzolkin-date)。
g m n h
ハアブ暦のつぎの周期の日に進む (calendar-next-haab-date)。
g m p h
ハアブ暦のまえの周期の日に戻る (calendar-previous-haab-date)。
g m n c
マヤのカレンダーラウンドのつぎの周期の日に進む (calendar-next-calendar-round-date)。
g m p c
マヤのカレンダーラウンドのまえの周期の日に戻る (calendar-previous-calendar-round-date)。

これらのコマンドを理解するには、 マヤ暦を理解しておく必要があります。 ロングカウントは以下の単位に基づいて日付を計算したものです。

1キン(kin) = 1日   1ユイナル(uinal) = 20キン
1タン(tun) = 18ユイナル   1カタン(katun) = 20タン
1バクタン(baktun) = 20カタン

したがって、ロングカウントの12.16.11.16.6は、 12バクタン、16カタン、11タン、16ユイナル、6キンを表しています。 Emacsのカレンダーはマヤ暦ロングカウント7.17.18.13.1 52 まで遡ることができますが、 それ以前は扱えません。 g m lコマンドを使ってマヤ暦ロングカウントの日付を入力するときには、 バクタン、カタン、タン、ユイナル、キンをピリオドで区切ってください。

マヤ暦ゾルキンは、独立した13日と20日の周期からなる260日周期です。 この周期が永遠に繰り返されるため、 Emacsには、つぎの周期へ進んだりまえの周期へ戻るコマンドがあります。 g m p tと打つと、ゾルキン暦のまえの周期の日に戻ります。 このコマンドは、ゾルキン暦の日付を聞いてきて、 その日付のまえの周期の日にポイントを戻します。 同様に、g m n tは、ゾルキン暦のつぎの周期の日に進めます。

マヤ暦ハアブは365日の周期で、20日からなる18個の月と 月に属さない5日間からなっています。 ゾルキン暦の周期と同様に、この周期が永遠に繰り返されるため、 Emacsにはつぎの周期の日へ進んだりまえの周期の日に戻るコマンドがあります。 g m p hと打つと、ハアブ暦のまえの周期に日に戻ります。 このコマンドは、ハアブ暦の日付を聞いてきて、 その日付のまえの周期の日にポイントを戻します。 同様に、g m n hは、ハアブ暦のつぎの周期の日に進めます。

マヤではゾルキン暦とハアブ暦を組み合わせた暦も使われていました。 組み合わせの1周期は約52年でカレンダーラウンドと呼ばれます。 g m p cと打つと、 Emacsはハアブ暦の日付とゾルキン暦の日付を聞いてきます。 そして、まえの組み合わせ周期の日にポイントを戻します。 つぎの組み合わせ周期の日にポイントを進めるには g m n cを使います。 これらのコマンドは、指定したハアブ暦/ゾルキン暦の日付の組み合わせが不可能であると エラーを通知します。

Emacsはマヤ暦の名前の入力では強い補完(see Strict Completion)を 使うので、綴りを気にする必要はありません。


Node:Diary, Next:, Previous:Other Calendars, Up:Calendar/Diary

日誌

Emacsの日誌機能は、カレンダーと連動して、 1日を単位に約束やその他の予定を管理します。 日誌機能を使うには、用事と日付を書き込んだ 日誌ファイル(diary file)をまず作っておく必要があります。 そうしておくと、Emacsは自動的にこのファイルを取り込んで、 今日/数日先/指定した日付の予定を表示します。

デフォルトでは、Emacsは日誌ファイルとして~/diaryを使います。 これはcalendarプログラムが使うファイルと同じです。 以下に~/diaryファイルの例を示します。

12/22/1988  20回目の結婚記念日!
&1/1.       新年おめでとう!
10/22       ルースの誕生日
* 21, *:    給料日
Tuesday  10時から院生たちと週間ミーティング
         スポウイット、シェン、ビットナー、カポールと約束
1/13/89     13日の金曜日!!
&thu 4pm    ロイドとスカッシュをする
mar 16      親父の誕生日
April 15, 1989 所得税の納付期限
&* 15       勤務表の提出期限

この例では、大部分の予定の項目に余分な空白を入れて整列してありますが、 これは純粋に好みの問題です。

日誌を手で作成しようとしているかもしれませんが、 Emacsには、日誌の項目を眺めたり、追加したり、変更したりする コマンドが数多くあります。


Node:Diary Commands, Next:, Up:Diary

日誌項目の表示コマンド

いったん~/diaryファイルを作成しておけば、 カレンダーを使ってこれを眺めることができます。 また、カレンダー(calendar)モードの外からでも、 今日の予定を参照できます。

d
選択した日付のすべての日誌項目を表示する(view-diary-entries)。
Mouse-2 Diary
クリックした日付のすべての日誌項目を表示する。
s
日誌ファイル全体を表示する(show-all-diary-entries)。
m
日誌項目が登録されているすべての日付に印を付ける (mark-diary-entries)。
u
カレンダーウィンドウの印を消す(calendar-unmark)。
M-x print-diary-entries
現在表示している日誌項目をそのまま印刷する。
M-x diary
今日の日付の日誌項目すべてを表示する。
M-x diary-mail-entries
これからの予定を自分自身にメイルする。

dで日誌項目を表示すると、 別のウィンドウに選択した日付の日誌項目が表示されます。 新しいウィンドウのモード行には、 日誌項目の日付とその日付の祝祭日情報が表示されます。 dに数引数を指定すると、指定した日数の期間の日誌項目を表示します。 したがって、2 dは、選択した日とそのつぎの日のすべての項目を表示します。

ある日付の日誌項目を表示する別の方法として、 日付をMouse-2でクリックし、 立ち上がったメニューから項目Diaryを選ぶことです。

日誌が記載されている日付を知るにはmコマンドを使います。 このコマンドは、日誌が記載されている日付を別のフェイスで (複数のフェイスを使えなければ、 日付のあとに+を付けて)表示します。 このコマンドは、画面に見えている期間だけでなく、 スクロールすると見えてくる期間にも適用されます。 印を消してもとの状態に戻るにはuコマンドを使いますが、 祝祭日の印も同時に消えます。 (see Holidays)。

日誌ファイル内の数項目ではなく全体を見るには、 sコマンドを使います。

選択した日誌項目だけを表示するには、 選択表示機能を用いて他の項目を隠します。

画面で見ている日誌用バッファは幻でしかありません。 そのため、単純にバッファを印刷しても 画面に表示されているようには印刷できません。 画面に表示されている日誌項目をあるがままに印刷するには専用のコマンド M-x print-diary-entriesを使う必要があります。 このコマンドはデータをプリンタに直接送ります。 lpr-regionのようにカスタマイズできます (see Hardcopy)。

コマンドM-x diaryは、現在のカレンダー表示とは関係なしに、 場合によっては数日後までを含めて今日の日誌を表示します。 変数number-of-diary-entriesには何日間まで含めるか指定します。 See Calendar

個人の.emacsファイルに(diary)と書けば、 Emacsを実行すると自動的に当日の日誌項目をウィンドウに表示します。 そのウィンドウのモード行には、日付と祝祭日情報が表示されます。

多くのユーザーは、日誌に記載した予定を電子メイルで受け取ることを好みます。 自分自身にそのようなメイルを送るには、 コマンドM-x diary-mail-entriesを使います。 数引数で(今日から始めて)何日間を含めるか指定します。 数引数を指定しなければ、変数diary-mail-daysが日数を指定します。


Node:Format of Diary File, Next:, Previous:Diary Commands, Up:Diary

日誌ファイル

個人の日誌ファイルは、用事と日付の対応付けを記録したファイルです。 日誌ファイルの名前は、変数diary-fileで指定します。 デフォルトは~/diaryです。 calendarプログラムは、 Emacsの日誌機能が扱う形式を部分的に扱えます。 そのため、calendarプログラムでもそれなりに 日誌ファイルを眺められますが、正しく解釈されない項目もあるでしょう。

日誌ファイルの各項目は、1つの用事を表し、1行以上の行から成ります。 項目はつねに行頭の日付指定で始まります。 項目の残りの部分は用事を説明する単なるテキストです。 項目が1行に収まらないときには、後続行の行頭を白文字で始めて 直前の項目の続きであることを示します。 正しい日付指定で始まらない行や 直前の項目の続きの行でないものは無視されます。

カレンダーのウィンドウ内で特定の日誌項目に印を付けないようにできます。 それには、項目の日付指定のまえにアンパーサンド(&)を付けます。 これは、日誌ウィンドウに項目を表示するのには影響ありません。 カレンダーウィンドウの日付の印だけに影響します。 印付けを禁止した項目は一般的な項目としては便利で、 こうしないと印が付いた日が多くなりすぎます。

項目の最初の行が日付指定や曜日だけの場合には、 最初の行は日誌ウィンドウに表示されません。 後続の行だけが表示されます。 たとえば、つぎの項目は、日誌ウィンドウでは先頭に日付の行は表示されません。

02/11/1989
     本日B. ビルがプリンストンに来る
     2pm 認知研究委員会の会合
     2:30-5:30 ローレンスビルにリズ
     4:00pm 歯医者予約
     7:30pm ジョージの所で夕食
     8:00-10:00pm コンサート

この流儀だと1日分の予定を表示する限りはきちんと見えるのですが、 2日分以上の場合には混乱しかねません。

ウィンドウに表示された日誌項目は編集できますが、 表示されたバッファには日誌ファイル全体が含まれていて、 ある部分が隠されいるのだということを忘れてはなりません。 たとえば、C-fforward-char)コマンドで 表示上の行末にポイントを置けますが、 実際には隠された行の途中にいるのかもしれません。

日誌項目を編集するときには注意してください! 項目に余分な行を追加したり見えている行の途中に文字を追加/削除しても 問題は生じませんが、行末で編集すると予期しないことが起こる可能性があります。 行を削除すると今は見えていない後続の他の項目を 削除してしまうかもしれません。 日誌を編集するまえには、sshow-all-diary-entries)で ファイル全体を表示させるのが最良です。


Node:Date Formats, Next:, Previous:Format of Diary File, Up:Diary

日付指定の形式

以下は日誌項目の例で、 使用可能ないくつかの日付指定形式を示しています。 この例では日付をアメリカ形式(月、日、年)で指定していますが、 カレンダー(calendar)モードではオプションで ヨーロッパ形式(日、月、年)も使用できます。

4/20/93  新しい計算システムへ切換
apr. 25  年ごとの計算開始
4/30     4月分の処理完了〆切
*/25     月ごとのサイクル完了
Friday   ファイルのバックアップを忘れないこと

最初の項目は1993年4月20日に一度だけ表示されます。 2番目と3番目は毎年指定した日付に表示され、 4番目は月の指定にワイルドカード(アスタリスク、*)を使っているため、 毎月25日に表示されます。 最後の項目は毎週金曜日に表示されます。

日付には、month/daymonth/day/yearのように数字だけを使ってもかまいません。 この場合、あとに続く文字は数字であってはいけません。 日付自体のmonth(月)とday(日)は1桁か2桁の数字です。 year(年)は省いてもかまいませんが、これも数字で、 最後の2桁だけに省略してもかまいません。 つまり、11/12/1989と書いても11/12/89と書いても同じです。

日付を、monthname daymonthname day, yearと書くこともできます。 ここで、monthnameは英語の月の名前で 3文字の省略形(ピリオドがあってもなくてもよい)でもかまいません。 大文字小文字は区別しません。

日付の指定は総称的であってもかまいません。 つまり、特定しない部分があってもかまいません。 そうすると、その指定に一致するすべての日付にその項目が適用されます。 年を指定しなければ、それは総称的であり、その項目は毎年に適用されます。 あるいは、monthdayyearのそれぞれに *を指定できます。 これは、それぞれ、任意の月、任意の日、任意の年に一致します。 したがって、3/*/*という日誌項目は、 任意の年の3月のどの日にも一致します。 march *も同じことです。

もし、月のまえに日を書くヨーロッパ形式で日付を指定したいときには、 カレンダー中でM-x european-calendarと打ちます。 あるいは、カレンダー/日誌コマンドを使うまえに 変数european-calendar-styletを設定します。 この状態では、日誌の中のすべての日付指定をヨーロッパ形式で解釈します。 また、日誌の日付を表示するときもヨーロッパ形式です。 (ヨーロッパ形式では、monthnameのあとにはコンマは付けない。) (デフォルトの)アメリカ形式の日付に戻るには、 M-x american-calendarと打ちます。

ある曜日を指定する総称的な日付として曜日の名前を使えます。 曜日の名前は英語で綴り、3文字の省略形 (ピリオドがあってもなくてもよい)でもかまいません。 大文字小文字は問いません。


Node:Adding to Diary, Next:, Previous:Date Formats, Up:Diary

日誌への追加コマンド

カレンダー(calendar)モードの中には、 日誌の項目を作成するコマンドがいくつかあります。

i d
選択した日に日誌項目を追加する(insert-diary-entry)。
i w
選択した曜日に日誌項目を追加する(insert-weekly-diary-entry)。
i m
選択した月の日に日誌項目を追加する(insert-monthly-diary-entry)。
i y
選択した年の日に日誌項目を追加する(insert-yearly-diary-entry)。

カレンダーウィンドウ内で日を選択してi dコマンドを打てば、 選択した日に日誌項目を作成できます。 このコマンドは、別のウィンドウに日誌ファイルの末尾を表示し、 日付を挿入します。 そうしたら、日誌項目の残りの部分を打ち込みます。

特定の曜日に日誌項目を作成したい場合には、 その曜日を選択して(どの場所でもよい)i wと打ちます。 これで、総称的な日付として曜日名が挿入されます。 そうしたら、日誌項目の残りの部分を打ち込みます。 同様にして、月の特定の日を選択してからi mコマンドを打って、 項目の残りの部分を打ち込みます。 同じように、i yコマンドで、 毎年の特定の日に項目を挿入できます。

これらのコマンドはすべて、デフォルトでは印付けされる項目を作成します。 印付け禁止の項目を作成するには、コマンドに数引数を指定します。 たとえば、C-u i wは毎週の印付け禁止項目を作ります。

日誌ファイルを修正したときには、 Emacsを終了するまえにファイルを必ず保存してください。


Node:Special Diary Entries, Previous:Adding to Diary, Up:Diary

特別な日誌項目

カレンダーの日付に基づいて項目を追加する以外に、 毎年の記念日などを表すS式項目(sexp entries)を 日誌ファイルに入れることができます。 これらの項目は、Emacsが日誌ファイルを読み込むときに Lisp式(S式、sexp)を評価することに基づいています。 S式項目では日付のかわりに、%%に続けて括弧で括ったLisp式があります。 Lisp式が項目を適用する日付を決定します。

カレンダー(calendar)モードには、 よく使われるS式項目を追加するコマンドがあります。

i a
指定した日付の毎年の記念日の日誌項目を追加する (insert-anniversary-diary-entry)。
i b
カレントリージョンに対してブロック日誌項目を追加する (insert-block-diary-entry)。
i c
指定した日から始まる定期的に巡ってくる日誌項目を追加する (insert-cyclic-diary-entry)。

ある特定の日を毎年の記念日に指定したい場合には、 その日付にポイントを移動してからi aコマンドを使います。 このコマンドは、別のウィンドウに日誌ファイルの末尾を表示し、 記念日を指定するS式を挿入します。 そうしたら、日誌項目の残りの部分を打ち込みます。 以下はその例です。

%%(diary-anniversary 10 31 1948) アーサーの誕生日

この項目は、1948年以降の毎年10月31日に適用されます。 10 31 1948は日付を指定します。 (ヨーロッパ形式の日付を使っている場合には、 3110が入れ替わる。) この式に開始年が必要なのは、日誌関数で経過年数の計算に使うからです。

ブロック日誌項目は、指定した期間に適用されます。 以下は、1990年6月24日から1990年7月10日までに適用される ブロック日誌項目の例です。

%%(diary-block 6 24 1990 7 10 1990) 休暇

6 24 1990は開始日付を表し、7 10 1990は終了日付を表します。 (ヨーロッパ形式を使っている場合は、月と日が入れ替わる。)

ブロック項目を追加するには、 ポイントとマークを期間の開始日付と終了日付に設定してから i bと打ちます。 このコマンドは、日誌ファイルの末尾を別のウィンドウに表示して、 ブロック項目指定を追加します。 そうしたら、日誌項目の残りの部分を打ち込みます。

周期的な日誌項目は、一定間隔で繰り返します。 これを作るには、開始日を選択してi cコマンドを使います。 このコマンドは、間隔を聞いてきます。 そうしたら、項目を挿入します。 以下のようになります。

%%(diary-cyclic 50 3 1 1990) つぎの投薬

この項目は1990年3月1日から始まり、50日ごとに適用されます。 3 1 1990はこの開始日を指定しています (ヨーロッパ形式を使っている場合は、月と日が入れ替わる。)

これら3つのコマンドはいずれも印付けされる項目を作成します。 印付け禁止項目を挿入する場合には、コマンドに数引数を指定します。 たとえば、C-u i aは、印付け禁止の記念日の項目を作ります。

日誌のS式項目をカレンダーに印付けするのは非常に時間がかかります。 なぜなら、カレンダーのウィンドウに見えているすべての日付について 1つ1つ調べる必要があるからです。 したがって、S式項目を登録する際にはできる限り(&を付けて) 印付け禁止の日誌項目にするのがよいでしょう。

S式項目の別の利用方法には、流動型日誌項目があります。 これは毎年定期に起きることがらを日数や週数や月数のオフセットで表したものです。 これはcronプログラムが解釈するcrontabの項目と互換性があります。 以下は、毎年11月の最終木曜日に印付け禁止の流動型日誌項目を指定する例です。

&%%(diary-float 11 4 -1) アメリカの感謝祭

この11は11月を表し、4は木曜(日曜を0として週の4番目の日)を表します。 -1は『最後』を表します (1は『最初』、2は『2番目『、-2は『最後の1つまえ』などなど)。 月の指定は1個の月でも月のリストでもかまいません。 たとえば、上の11を'(1 2 3)に変更すると、 1月、2月、3月の最終木曜日に適用する項目になります。 月の指定がtならば、すべての月に適用されます。

もっとも一般的には、 日誌のS式項目は適用する日付を決定するために、どんな計算でもできます。 See Sexp Diary Entries


Node:Appointments, Next:, Previous:Diary, Up:Calendar/Diary

約束

日誌項目に約束が入っていて、 Emacsが認識可能な形で時刻が指定されている場合には、 その予定の何分かまえに「約束がありますよ。」と警告を出す機能があります。 Emacsはモード行に約束がある旨の警告メッセージを表示します。

約束の警告表示を行わせるには、 まずEmacsの時刻表示機能をオンにする必要があります。 M-x display-time(see Mode Line)と打ちます。 さらに、関数appt-make-listを以下のようにして diary-hookに追加する必要があります。

(add-hook 'diary-hook 'appt-make-list)

個人の.emacsファイルに以下のテキストを追加すれば、 これまでのことを行えます。

(display-time)
(add-hook 'diary-hook 'appt-make-list)
(diary 0)

このように準備しておくと、(カレンダーのウィンドウでdコマンドを使うか、 M-x diaryコマンドを使うかして) 日誌を表示したときに、Emacsが認識できる時刻指定のある約束をすべて取り込み、 それらのおのおのについて指定された時刻よりも少しまえに警告を表示します。

たとえば、日誌ファイルに以下のような項目があるとします。

Monday
  9:30am 休憩
 12:00pm 昼食

すると、毎週月曜には、日誌を表示していると午前9時20分に もうすぐ休憩だと表示を出し、午前11時50分には昼食時間だと表示を出します。

時刻指定は、9:00amのようにam/pmスタイルでも (12:00amは夜中の12時、12:00pmはお昼の12時を表す)、 ヨーロッパや軍隊流の24時間制でもかまいません。 また、一貫している必要もなく、 日誌ファイルにこれらが混在していてもかまいません。

Emacsはこれらの約束リストを夜中の12時過ぎに更新します。 変数appt-display-diarynilを設定していない限り、 日誌用バッファにつぎの日の予定を表示します。

約束の警告表示を目覚し時計として利用することもできます。 コマンドM-x appt-addは、個人の日誌ファイルを変更せずに 約束リストに項目を追加します。 M-x appt-deleteは、約束リストから項目を削除します。

変数appt-issue-messagenilを設定すれば、 約束の警告表示はいつでもオフにできます。


Node:Daylight Savings, Previous:Appointments, Up:Calendar/Diary

夏時間

Emacsは標準時と夏時間の違いを理解していて、 日出入、夏至、冬至、春分、秋分、朔弦望の時刻ではこれを補正しています。 夏時間の規則は、地域によっても、また、歴史的にもさまざまです。 補正を正しく行うには、使用する規則をEmacsに与えておく必要があります。

オペレーティングシステムのなかには、 その設置場所で適用する規則を記録しているものもあります。 このようなシステムでは、Emacsは自動的に必要な情報をシステムから取得します。 情報の一部や全部が欠けている場合には、現在マサチューセッツ州ケンブリッジで 使われている規則でEmacsは欠落部分を補おうとします。 その結果が正しくないならば、 変数calendar-daylight-savings-startscalendar-daylight-savings-endsを設定し、 規則をEmacsに与える必要があります。

これらの変数の値は、変数yearを参照するLisp式である必要があり、 評価すると、グレゴリオ暦での夏時間の開始日や終了日を表す (month day year)という形のリストになる必要があります。 在住地方で夏時間を採用していない場合には、 これらの値はnilにしておきます。

Emacsはこれらの式を用いて夏時間の開始日を決定し、 祝祭日一覧や太陽や月に関する計算の時刻補正に使います。

マサチューセッツ州ケンブリッジの値は以下のとおりです。

(calendar-nth-named-day 1 0 4 year)
(calendar-nth-named-day -1 0 10 year)

yearで指定される年の4月の最初の日曜日(0番目)から始まり、 その年の10月の最後の月曜まで続くことを表します。 夏時間の開始日が10月1日に変更されたならば、 変数calendar-daylight-savings-startsには以下のように設定します。

(list 10 1 year)

読者の地方で夏時間を採用していなかったり、 すべての時刻を標準時で扱いたい場合には、 変数calendar-daylight-savings-startsと 変数calendar-daylight-savings-endsにはnilを設定してください。

変数calendar-daylight-time-offsetは、 夏時間と標準時の差を分単位で指定します。 マサチューセッツ州ケンブリッジでは60(分)です。

2つの変数calendar-daylight-savings-starts-timeと 変数calendar-daylight-savings-ends-timeは、 夏時間の開始/終了が地方時の真夜中の0時から何分ずれるかを指定します。 マサチューセッツ州ケンブリッジではどちらも120(分)です。


Node:Gnus, Next:, Previous:Calendar/Diary, Up:Top

gnus

gnusは主にネットニュースを読んだり投稿するためのEmacsパッケージです。 電子メイル、リモートディレクトリ、ダイジェストなどの ネットニュース以外のメッセージを読んだりそれらに応答するのにも使えます。

以下ではgnusについて紹介し、いくつかの基本的な機能について説明します。

gnusを起動するには、M-x gnus <RET>と打ちます。


Node:Buffers of Gnus, Next:, Up:Gnus

gnusのバッファ

ふつうのEmacsのパッケージと違って、 gnusは多数の異なるバッファを使って情報を提示したり ユーザーのコマンドを受け取ります。 ユーザーがもっとも多くの時間を使うことになるバッファは、 グループバッファサマリバッファ記事バッファの3つです。

グループバッファはニュースグループの一覧です。 gnusが起動すると、まずこのバッファが表示されます。 通常はユーザーが購読していて、かつ、 未読記事が存在するグループだけが表示されます。 このバッファでグループを選択します。

サマリバッファは選択したグループ内の1つの記事につき 1行の情報を表示します。 デフォルトでは、各記事の投稿者、題目、行数が表示されますが、 gnusのほとんどの表示内容と同様にこの表示内容はカスタマイズできます。 グループバッファでグループを選択するとサマリバッファが作られ、 グループから出ると削除されます。 サマリバッファを使って記事を選択します。

記事バッファは記事を表示します。 gnusの普通の使い方では、このバッファを選択することはありません。 記事を操作対象とするコマンド群はサマリバッファで動作します。 しかし、望むなら、記事バッファに切り替えて、 そこでgnusのコマンドを実行することも可能です。


Node:Gnus Startup, Next:, Previous:Buffers of Gnus, Up:Gnus

gnusの起動時の動作

gnusが起動すると、個人のニュース初期化ファイル.newsrcを読み込み、 ニュース記事を蓄えているローカルのニュースサーバーと通信しようとします。 ニュースサーバーは、 ユーザーがログインしているマシンと同じである必要はありません。

gnusを起動してニュースサーバーと通信したあとでも グループバッファにグループが1つも表示されないときは、 LA kと打ってすべてのグループを表示させます。 つぎに各グループの行でuと打って 個々のグループの購読/非購読を切り替えます。

初めてgnusを起動したときは、ごく少数の選ばれたグループのみが 購読状態にあります。 他のグループは非購読グループ(killed groups)になっていて、 A kを使うと表示されます。 最初の起動以後にニュースサーバー上に追加されたグループはすべて、 ゾンビグループ(zombie groups)になっていて、 A zを使うと表示されます。 uを使えばこれらのグループを購読状態にできます。

qでgnusを終了すると、初期化ファイル.newsrc.newsrc.eldにすべてのグループの購読/非購読を自動的に記録します。 通常はこれらのファイルを手で編集すべきではありませんが、 やりかたがわかっているならかまいません。


Node:Summary of Gnus, Previous:Gnus Startup, Up:Gnus

gnusコマンドのまとめ

ニュースを読むにはつぎの2つの段階を踏みます。

  1. グループバッファでグループを選択する。
  2. サマリバッファで記事を選択する。 記事を選択すると、サマリバッファの小さなウィンドウの下の 大きめのウィンドウの中の記事バッファに選択した記事が表示される。

gnusの各バッファにはそれぞれ独自のコマンドがあります。 しかし、gnusのさまざまなバッファのどんなキーの意味も、 等価ではないにせよ、だいたい同じです。 以下は、グループバッファとサマリバッファのコマンドです。

q
グループバッファでは、初期化ファイル.newsrcを更新してgnusを終了する。

サマリバッファでは、 カレントグループから抜け出てグループバッファに戻る。 したがって、qを2回打つとgnusを終る。

L
グループバッファでは、 ニュースサーバーにある(非購読にしたもの以外の) すべてのグループを表示する。 すごく長いリストになるかもしれないので注意!
l
グループバッファでは、購読中で未読記事があるグループのみを表示する。
u
グループバッファでは、ポイントのある行のグループの購読/非購読を切り替える。 qでgnusを終ると、gnusはこの状態を.newsrcファイルに記録する。 gnusは、通常、購読グループのみを表示するため、 つぎにgnusを起動したときには非購読にしたグループは表示されない。
C-k
グループバッファでは、ポイントのある行のグループを「抹消」する。 すなわち、そのグループは以後.newsrcにも現れなくなる。 このコマンドの効果は、現在のgnusセッションだけでなく 将来のgnusセッションにも影響する。

qでgnusを終了すると、 gnusはファイル.newsrcに 抹消したグループを除くすべてのグループの情報を書き出す。

<SPC>
グループバッファでは、ポイントのある行に対応するグループを選択し、 そのグループの最初の未読記事を表示する。

サマリバッファでは、つぎのようになる。

すなわち、繰り返し<SPC>を打と、すべての記事を順に見ていくことができる。

<DEL>
グループバッファでは、ポイントを未読記事がある1つまえのグループに移動する。

サマリバッファでは、記事のテキストを1画面分戻す。

n
ポイントをつぎの未読グループに進めるか、 または、つぎの未読記事を選択する。
p
ポイントをまえの未読グループへ戻すか、 または、まえの未読記事を選択する。
C-n
C-p
既読であってもポイントを1つあと/まえの項目に移動する。 ポイントがある行の記事やグループを選択することはしない。
s
サマリバッファでは、記事バッファに切り替えてC-sを打ったかのように、 記事バッファのテキストに対してインクリメンタルサーチを行う。
M-s regexp <RET>
サマリバッファでは、 regexpに一致する記事がみつかるまで前向きに探索する。


Node:Shell, Next:, Previous:Gnus, Up:Top

Emacsからシェルコマンドを実行する

Emacsには、 1つのコマンド行を下位のシェルプロセスに渡して実行させる機能があります。 また、入出力を*shell*という名前のEmacsバッファに接続して 対話的にシェルを実行する機能もあります。

M-! cmd <RET>
シェルコマンドcmdを実行し、その結果を表示する (shell-command)。
M-| cmd <RET>
リージョンの内容を入力としてシェルコマンドcmdを実行する。 場合によっては、リージョンをシェルコマンドの出力で置き換える。 (shell-command-on-region)。
M-x shell
入出力をEmacsバッファに接続してサブシェルを実行する。 すると、対話的にコマンドを入力できる。


Node:Single Shell, Next:, Up:Shell

単一のシェルコマンド

M-!shell-command)は、新たに作ったサブシェルにて、 ミニバッファで読み取った1行のテキストをシェルコマンドとして実行します。 シェルコマンドの標準入力はnull装置(つまり空)です。 シェルコマンドの出力があれば、*Shell Command Output*という名前の Emacsバッファに入れて別のウィンドウに表示しますが、 (カレントバッファには)選択しません。 M-1 M-!のように数引数を指定すると、 シェルコマンドの出力をカレントバッファに挿入します。 その場合、ポイントは(挿入された)出力の先頭に置かれ、 マークは出力の末尾に置かれます。

シェルコマンドの末尾が&になっていると、 シェルコマンドは非同期に実行されます。 同期実行のシェルコマンドでは、Lispプログラムから呼ばれたときには、 shell-commandはコマンドの終了状態(0は成功を意味する)を返します。

M-|shell-command-on-region)はM-!と同様ですが、 シェルコマンドの標準入力は空ではなくリージョンの内容が引き渡されます。 数引数を指定すると、それまでのリージョンは削除され シェルコマンドの出力で置き換わり新たなリージョンになります。 このコマンドは、Lispプログラムから呼ばれたときには、 コマンドの終了状態を返します。

M-!M-|も、使用するシェルはshell-file-nameで指定します。 この変数は、Emacs起動時の環境変数SHELLをもとに初期設定されます。 ファイル名にディレクトリが指定されていなければ、 exec-pathに指定されているディレクトリ群を探索