索引
重要な全般的な概念
基本的な編集コマンド
重要なテキスト変更コマンド
Emacsの主要な構造
中級向けの機能
mail
, etc.
トラブルからの復旧
以下は、上にあげたメニューの下位メニューです。 1ステップで移動できるように示しておきます。
−−− 詳細ノード一覧 −−−
スクリーンの構成
基本編集コマンド
ミニバッファ
ヘルプ
マークとリージョン
削除とキル
ヤンク
レジスタ
表示方法の制御
探索と置換
置換コマンド
綴り誤り訂正用のコマンド
ファイルの扱い方
ファイルの保存
版管理
複数のバッファの使い方
複数のウィンドウ
フレームとXウィンドウシステム
フォントロックモード
国際化文字集合
メジャーモード
字下げ
自然言語向けコマンド
テキストを詰め込む
プログラムの編集
プログラムの字下げ
タグテーブル
etags
.
emergeによるファイルの併合
プログラムのコンパイルとテスト
Emacsでデバッガを起動する
略語
絵の編集
メイルの送信
rmailでメイルを読む
ディレクトリエディタdired
暦と日誌
カレンダー内の移動
さまざまな暦のあいだの変換
日誌
GNUS
Emacsからシェルコマンドを起動する
カスタマイズ
.emacs
file.
変数
キーボードマクロ
キーバインドのカスタマイズ
.emacs
.
初期化ファイル~/.emacs
Emacsのトラブルに対する対処
バグの報告
コマンド行オプションと引数
環境変数
MS-DOSとWindows 95/98/NT
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を注文したり、 定期購読するように提案してください。
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)本使用許諾の条項の下で ソフトウェアを複製・頒布・変更する権利をユーザに与えます。
また、各作成者や我々自身を守るために、 本フリー・ソフトウェアが無保証であることを 全ての人々が了解している必要があります。 さらに、他の誰かによって変更されたソフトウェアが頒布された場合、 受領者はそのソフトウェアがオリジナル・バージョンではないということを 知らされる必要があります。 それは、他人の関与によって原開発者に対する評価が 影響されないようにするためです。
最後に、どのフリー・プログラムもソフトウェア特許に絶えず脅かされています。 我々は、フリー・プログラムの再頒布者が個人的に特許権を取得し、 事実上そのプログラムを自分の財産にしてしまうという危険を 避けたいと願っています。 これを防ぐために我々は、いずれの特許も、 誰でも自由に使用できるように使用許諾されるべきか、 あるいは何人に対しても全く使用させないかの、 いずれかにすべきであることを明らかにしてきました。
複写・頒布・変更に対する正確な条項と条件を次に示します。
複製、頒布、変更以外の行為は本使用許諾の対象としません。 それらは本使用許諾の範囲外です。 「プログラム」を実行させる行為に関して制約はありません。 「プログラム」の出力は、 (「プログラム」を実行させて作成させたかどうかとは無関係に) その内容が「プログラム生成物」である場合に限り本使用許諾の対象となります。 これが当てはまるかどうかは、「プログラム」が何をするものかに依ります。
複製物の引き渡しに要する実費は請求することができます。 また、あなた独自の保証を行なう場合はそれを有償とすることができます。
これらの要件は変更された作成物にも全て適用されます。 その変更版の或る部分が「プログラム」の派生物ではなく、 しかもそれ自体独立で異なる作成物だと合理的に考えられる場合、 あなたがそれらを別の作成物として頒布した時は、 本使用許諾とその条項はそれらの部分には適用されません。 しかし、それらを「プログラム生成物」の一部として頒布する場合は、 全体が本使用許諾の条項に従って頒布されなければならず、 使用許諾を受ける他の全ての者に対する許諾も プログラム全体にわたって与えられなければならず、 結果として、誰が書いたかにかかわらず、 全ての部分に本使用許諾が適用されなければなりません。
このように、本条項の意図するところは、 完全にあなたによって書かれた作成物について、権利を要求したり、 あなたと権利関係を争うことではありません。 むしろその目的は、作成物が「プログラム生成物」 である場合にその派生物や集合物の頒布を規制することにあります。
さらに、「プログラム」(又は「プログラム生成物」)と 「プログラム生成物」とはならない他のプログラムとを、 単に保管や頒布のために同一の媒体上にまとめて記録したとしても、 本使用許諾は他のプログラムには適用されません。
なお、ソース・コードとは、変更作業に適した記述形式を指します。 また、実行可能形式のファイルに対応するソース・コード一式とは、 それに含まれる全モジュールに対応する全てのソース・コード、 及びあらゆる関連のインタフェース定義ファイル、 及び実行を可能にするコンパイルとインストールの制御に関する記述を指します。 特別な例外として、実行可能なファイルが動作するオペレーティング・システムの 主要な構成要素(コンパイラ、カーネルなど)と共に (ソース・コード又はバイナリのどちらかで)頒布されているものについては、 その構成要素自体が実行形式に付随していない場合に限り、 頒布されるソース・コードに含める必要はありません。
実行可能形式またはオブジェクト・コードの頒布が、 指示された場所からの複製のためのアクセス権の賦与である場合、 同じ場所からのソース・コードの複製のための同等なアクセス権を賦与すれば、 たとえ第三者にオブジェクト・コードと共にソースの複製を強いなくとも、 ソース・コードを頒布したものとみなします。
本条項の或る部分が何らかの特別な状況下で無効または適用不可能になった場合、 本条項のその他の残りの部分が適用されるように意図されており、また、 本条項は全体としてその他の状況に当てはまるように意図されています。
本条項の目的は、特許やその他の財産権を侵害したり、 そのような権利に基づく主張の妥当性を争うようにあなたに 勧めることではありません。 本条項の唯一の目的は、フリー・ソフトウェアの頒布システムの完全性を守ることで、 それは公有使用許諾の実践によって履行されます。 多くの人々が、このシステムの一貫した適用を信頼して、 このシステムを通じて頒布されている幅広い範囲のソフトウェアに惜しみない貢献を してくれました。 作成者や寄贈者が他の何らかのシステムを通じてソフトウェアを 頒布したいと決めることは彼らの自由意志であり、 使用許諾を受ける者はその選択を強いることはできません。
本条項は、本使用許諾の他の条項の意味内容が何であるかを 完全に明らかにすることを意図しています。
各バージョンは、バージョン番号によって区別します。 「プログラム」中に本使用許諾のバージョン番号の指定がある場合は、 その指定されたバージョンか、又はその後にFree Software Foundationから 公表されているいずれかのバージョンから1つを選択して、 その条項と条件に従ってください。 「プログラム」中に本使用許諾のバージョン番号の指定がない場合は、 Free Software Foundation が公表したどのバージョンでも選択することができます。
英文文書(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 w
やshow c
は各々、
本一般公有使用許諾の関連する部分を表示するコマンドを指します。
もちろん、あなたが使うこれらのコマンドはshow w
やshow c
といった
呼び名でなくても構いません。
さらに、それらのコマンドはあなたのプログラムに合わせる為に、
マウスでクリックしたりメニュー形式にすることもできます。
また、必要と認めた場合には、あなたの雇い主 (あなたがプログラマとして働いている場合)や在籍する学校から、 そのプログラムに対する「著作権放棄」を認めた署名入りの書面を入手してください。 ここにその文例を載せます。名前は変えてください。
Yoyodyne, Inc. は、James Hacker が開発したプログラム`Gnomovision' (コンパイラにつなげるプログラム)についての著作権法上の全ての権利を放棄する。 Ty Coon の署名, 1 April 1989 Ty Coon, 副社長
本一般公有使用許諾は、あなたのプログラムを財産権の対象となっている 他のプログラムに組み込むことは認めていません。 あなたのプログラムがサブルーチン・ライブラリであって、 あなたがそのライブラリを財産権の対象となっている他のアプリケーションと リンクさせることによって、さらに有用なものにしようとする場合には、 本使用許諾書の代わりに、GNUライブラリ一般公有使用許諾書に従ってください。
あなたは、先進的で、セルフドキュメント方式で、カスタマイズ可能で、 拡張可能な、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はウィンドウシステムの恩恵を与えてくれます。 たとえば、複数のファイルを同時に眺めたり編集したり、 ファイル間でテキストを移動したり、 シェルコマンドを実行している最中でもファイルを編集できます。
文字端末の場合、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*
で始まります。
モード行は、ウィンドウ内でその上にどのバッファを表示しているのか、
どのメジャーモードやマイナモードを使っているのか、
バッファには未保存の変更があるかどうかなどの情報を示します。
Emacsでは、端末のカーソルが編集コマンドの作用する位置を示します。 この位置のことをポイント(point)と呼びます。 多くのEmacsコマンドはポイントをテキスト中で移動し、 テキスト中のさまざまな箇所で編集できるようにします。 マウスのボタン1をクリックしても、ポイントを置けます。
カーソルはある文字に重なって表示されますが、
ポイントは2つの文字のあいだにあると考えなければいけません。
つまり、ポイントは、カーソルが重なっている文字のまえにあります。
たとえば、frob
というテキストで、b
にカーソルがある場合、
ポイントはo
とb
のあいだにあります。
その位置に!
という文字を挿入すると、fro!b
という結果になり、
ポイントは!
とb
のあいだにあります。
つまり、カーソルはb
に重なったままで、実行前と同じです。
『ポイント』を意味して『カーソル』といったり、 ポイントを移動するコマンドのことを『カーソル移動』コマンドと いうこともあります。
端末にはカーソルは1つしかなく、 出力中は出力されている場所にカーソルが表示される必要があります。 これはポイントが移動したということではありません。 端末がアイドルでないと、Emacsにはポイント位置を示す方法がないだけです。
Emacsでいくつかのファイルを編集して、 各ファイルをそれ専用のバッファに入れているとき、 各バッファには独自のポイント位置があります。 バッファが表示されていなくても、 あとで表示されるときに備えてポイント位置を記録しています。
1つのフレームに複数のウィンドウがある場合、 各ウィンドウには独自のポイント位置があります。 カーソルは選択されたウィンドウのポイント位置を示します。 これにより、どのウィンドウが選択されているかもわかります。 複数のウィンドウに同じバッファが表示されている場合には、 そのバッファのポイント位置は各ウィンドウごとに独立にあります。
複数のフレームがある場合、各フレームでは1つのカーソルを表示できます。 選択されているフレームの中のカーソルは塗り潰されます。 他のフレームのカーソルは中抜きの箱で、フレームに 入力フォーカスが与えられると選択されるウィンドウに表示されます。
『ポイント』という用語は、文字.
に由来します。
この文字は、現在『ポイント』と呼んでいる値を参照するための
(オリジナルのEmacsを記述していた言語)TECOのコマンドです。
フレームの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。
テキストウィンドウの最後の行はモード行(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は、ウィンドウの最上部より上や最下部より下に
さらにテキストがあるかどうかを示します。
バッファが小さくて、すべてがウィンドウに収まっている場合には、
posはAll
となります。
そうでない場合、バッファの先頭が表示されていれば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 Modes。
Narrow
は、表示中のバッファが、
そのテキストの一部のみを編集するように制限されていることを示します。
これは、実際にはマイナモードではありませんが、そのようなものです。
See Narrowing。
Def
は、キーボードマクロを定義中であることを示します。
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-unix
、eol-mnemonic-dos
、
eol-mnemonic-mac
、eol-mnemonic-undecided
に
ユーザーにとって適切な任意の文字列を
設定することでカスタマイズできます。
変数の設定方法については、See Variables。
ポイント位置の桁番号、現在時刻、新着メイルの有無などの お手ごろ情報をモード行へ追加する機能については、 See Optional Mode Line。
各Emacsフレームには、通常、最上部にメニューバー(menu bar)があり、 よく使われる操作を実行するのに使えます。 読者自身で簡単に確かめられますから、 ここではそれらを列挙する必要はないでしょう。
ウィンドウシステムを使っているのであれば、
マウスを使ってメニューバーからコマンドを選べます。
メニュー項目のあとにある右向き矢印は、
その項目にサブメニューがあることを示します。
項目の最後に...
がある場合は、コマンドを実際に実行するまえに、
コマンドがキーボードから引数を読み取ることを意味します。
メニュー項目の完全なコマンド名や説明文を見るには、 C-h kと打ってから、通常どおりにマウスでメニューバーを選択します (see Key Help)。
マウスのない文字端末でも、
M-`や<F10>(これらはtmm-menubar
を起動する)を打てば、
メニューバーを利用できます。
このコマンドは、キーボードからメニュー項目を選択するモードに入ります。
エコー領域には、仮の選択項目が表示されます。
左矢印キーや右矢印キーでメニューの中を移動して別の項目を選べます。
選択を確定するには<RET>キーを打ちます。
各メニュー項目には、その項目を指定する1個の文字や数字も割り当てられています。
通常、それらは項目名の単語の頭文字です。
これらの文字や数字は、項目名と=>
で分離されています。
項目の文字や数字を打てばその項目を選べます。
メニューバーにあるコマンドの中には、 キーバインディングを持つものもあります。 その場合、項目自身のあとの括弧の中に等価なキーバインドを表示します。
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-aとC-Aは同じ文字であり、Emacsは区別できません。
しかし、Emacsの文字集合自体には、 すべての印字文字にコントロール変種を用意する余地があり、 C-aとC-Aを区別できます。 Xウィンドウシステムでは、これらすべての文字を入力できます。 たとえば、C--(コントロールマイナス)とC-5は、 Xウィンドウシステム上では意味を持つEmacsコマンドです。
Emacsの文字集合に対するもう1つの拡張は、修飾ビットの追加です。 通常は1ビットの修飾ビットだけを使い、 このビットをメタ(Meta)と呼びます。 すべての文字にはメタ変種があります。 たとえば、Meta-a(通常はM-aと略記)や M-A(M-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ユーザーの目にふれることはありません。
キー列(key sequence)(キーと略記)は、 一塊で『1つのコマンド』としての意味を持つ入力イベントの列です。 Emacsのコマンド列の中には、1文字のみ、つまり、 1イベントのみであるものもあります。 たとえば、C-fはポイントを1文字先へ進めます。 しかし、なかには、起動に2つ以上のイベントを必要とするコマンドもあります。
あるイベント列が1つのコマンドを起動するのに十分である場合、 それらを完結キー(complete key)と呼びます。 完結キーの例としては、C-a、X、<RET>、 <NEXT>(ファンクションキーの1つ)、<DOWN>(矢印キー)、C-x C-f、 C-x 4 C-fがあります。 完結するほど十分に長くないイベント列を、 プレフィックスキー(prefix key)と呼びます。 上の例では、C-xやC-x 4が、プレフィックスキーです。 すべてのキー入力列は、完結キーかプレフィックスキーのどちらかです。
Emacs標準のコマンド割り当てでは、ほとんどの1文字は完結キーです。 残りの少数はプレフィックスキーです。 プレフィックスキーは、後続の入力イベントと結び付いて、 それ自体が完結キーやプレフィックスキーとなる、 さらに長いキーの列を作ります。 たとえば、C-xはプレフィックスキーなので、 C-xに続く入力イベントと結び付いて2文字のキー列を作ります。 C-x C-fやC-x bを含めて、 これらのキー列のほとんどは完結キーになります。 C-x 4やC-x rのように、 いくつかのキー列はそれ自体がプレフィックスキーとなり、 3文字のキー列を作ります。 キー列の長さに制限はありませんが、 実用上は4文字を超える長さのキー列を使うことはめったにありません。
これに対して、完結キーには入力イベントを付け加えることができません。 たとえば、2文字の列C-f C-kはキーではありません。 というのは、C-fがそれ自体で完結キーだからです。 C-f C-kにコマンドとしての独立した意味付けをすることは不可能です。 C-f C-kは、2つのキー列であって、1つのキー列ではありません。
Emacsのプレフィックスキーは、C-c、C-h、C-x、 C-x <RET>、C-x @、C-x a、C-x n、 C-x r、C-x v、C-x 4、C-x 5、 C-x 6、<ESC>、M-g、M-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>はすべてのプレフィックスに対して使えるはずです。
本書は、特定のキーの機能を詳しく説明したページばかりです。 しかし、Emacsは直接キーに意味を与えてはいません。 そのかわりに、Emacsは名前を付けたコマンド(commands)に意味を持たせ、 キーとコマンドをバインディング(binding、結び付ける) することによって、キーに意味を与えています。
すべてのコマンドには、プログラマが選んだ名前が付いています。
その名前は、たいていダッシュで区切った数語の英単語です。
たとえば、next-line
やforward-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-n(next-line
)は、
ポイントを下向きに移動する』という表現では、
下向きに移動するコマンドはnext-line
であり、
標準ではキーC-nにバインドされていることを意味します。
これまでカスタマイズに関して述べてきましたので、
変数についてふれておく時期でしょう。
コマンドの説明では、
『これを変更するには、変数mumble-foo
を設定する』と
記述することがあります。
変数とは、値を記憶しておくために使う名前のことです。
本書に記載された変数の大部分は、カスタマイズのために使われます。
いくつかのコマンドやEmacsの他の部分では、
変数を調べて設定された値に従ってそのふるまいを変えていきます。
カスタマイズに興味が出てくるまでは、
変数に関する記述は無視してかまいません。
カスタマイズしてみたいと思ったら、
変数に関する基礎を読んでください。
そうすれば、個々の変数に関する情報を理解できるでしょう。
See Variables。
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。
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。
Emacsの抜け方には、休止(suspending)する、 終了(killing)するの2種類があるので、 Emacsを抜けるコマンドも2つあります。
休止(suspending)は、一時的にEmacsを止めて、 親プロセス(通常はシェル)に制御を戻します。 こうすると、同じバッファ、同じキルリング、同じアンドゥ履歴を保持したままの 同じEmacsジョブをあとで再開できます。 これが通常の抜け方 6です。
終了(killing)は、Emacsジョブの破壊を意味します。 あとでまたEmacsを起動できますが、新たなEmacs環境です。 終了したあとでは、同じ編集セッションを再開する方法はありません。
iconify-or-deiconify-frame
)。
save-buffers-kill-emacs
)。
Emacsを休止するには、C-z(suspend-emacs
)と打ちます。
すると、Emacsを起動したシェルに戻ります。
ほとんどの一般的なシェルでは、
シェルコマンド%emacs
でEmacsを再開できます。
プログラムを休止できないシステムでは、
C-zは、端末と直接やりとりする下位シェルを起動します。
Emacsは、ユーザーがこのサブシェルから抜け出るまで待ちます。
(普通、C-dやexit
でサブシェルを終了するはずだが、
使っているシェルに依存する。)
このようなシステムでは、
Emacsを起動したシェルに(たとえばログアウトのために)戻るには、
Emacsを終了する以外に方法はありません。
プログラムを休止できるシステムであっても、
プログラムを休止できないシェル上で実行しているEmacsは休止できません。
このような場合、変数cannot-suspend
にnil
以外の値を設定して、
C-zに下位シェルの実行を強制できます。
(適切なジョブ制御をできないEmacsの親シェルを
『下位』と呼ぶこともできるが、これは好みの問題。)
EmacsがXサーバーと直接通信して専用のXのウィンドウを作っている場合には、
C-zは別の意味になります。
専用のXのウィンドウを持つアプリケーションを休止しても、
あまり意味がありませんし、便利なわけでもありません。
そのかわり、C-zは、選択されているEmacsフレーム(see Frames)を
一時的に閉じるコマンドiconify-or-deiconify-frame
を実行します。
シェルウィンドウに戻るには、ウィンドウマネージャの機能を使います。
Emacsを終了するには、C-x C-c
(save-buffers-kill-emacs
)と打ちます。
これを2文字のキーにしてあるのは、少々打ちづらく7するためです。
このコマンドは、まず、変更したバッファを保存するかどうか聞いてきます。
未保存のものがあるとそれらを永久に失うことになるので、
Emacsを終了するまえにyesでの再確認を求めてきます。
Emacsを終了するとサブプロセスもただちに終了されられてしまうため、
サブプロセスが走っている場合にも、それらに関して確認を求めてきます。
一度Emacsを終了してしまうと、Emacsセッションを再開する方法はありません。 しかしながら、終了時に訪問していたファイルなどの 特定のセッション情報を記録するようにEmacsに指示しておけば、 つぎにEmacsを起動し直したときに、 同じファイルを訪問するなどを試みるようになります。 See Saving Emacs Sessions。
オペレーティングシステムは、通常、実行中のプログラムを終了させたり 休止させたりする特定の特殊文字を監視しています。 Emacsを使っているときには、 オペレーティングシステムのこの機能はオフになっています 8 。 EmacsのキーとしてのC-zやC-x C-cの意味は、 いくつかのオペレーティングシステムでプログラムを 休止させたり終了させたりするために用いる文字、 C-zとC-cにヒントを得たものですが、 オペレーティングシステムとの関係はそれだけです。 これらのキーで好きなコマンドを実行するようにカスタマイズできます (see Keymaps)。
テキストの入力、修正、ファイルへの保存といった基本操作について説明します。 これらに接するのが初めてという読者は、 手を動かしながら学ぶチュートリアルを実行したほうが、 もっと簡単に習得できる思います。 チュートリアルを利用するには、 Emacsを起動してControl-h tと打ちます。 9
画面をクリアして再表示するには、C-l(recenter
)と打ちます。
編集中のテキストに印字文字を挿入するには、
単にその文字を打ちます。
こうすると、打鍵した文字がバッファのカーソル位置
(すなわちポイント位置。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-q(quoted-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>を別のコマンドにバインドし直しています。
文字の挿入以外のことを行うには、ポイント(see Point) の移動方法を知っておく必要があります。 もっとも簡単な方法は、矢印キーを使うか、 移動先の箇所でマウスの左ボタンをクリックします。
カーソル移動のためのコントロール文字やメタ文字もあります。 一部は矢印キーと同等です (これらは、矢印キーを備えた端末が現れるまえからあった。 矢印キーがない端末では便利)。 他のものは、こったことをします。
beginning-of-line
)。
end-of-line
)。
forward-char
)。
backward-char
)。
forward-word
)。
backward-word
)。
next-line
)。
このコマンドは行内での横方向の位置を保とうとする。
したがって、行の途中で使うと、つぎの行の途中に移動する。
テキストの最終行である場合には、
C-nは新たな行を作り、その行へ移動する。
previous-line
)。
move-to-window-line
)。
テキストは画面上を移動しない。
数引数は、画面上の何行目にポイントを移動するかを指定する。
行数は、ウィンドウ上端(0行目)から下向きに数える。
負の引数では、ウィンドウの下端(-1行)から数える。
beginning-of-buffer
)。
数引数nを指定すると、先頭から全体のn/10の行にポイントを移動する。
数引数の詳細については、see Arguments。
end-of-buffer
)。
変数track-eol
にnil
以外を設定すると、
行末にポイントがある場合のC-nやC-pは、
移動先の行でも行末にポイントを移動します。
通常、track-eol
はnil
です。
track-eol
のような変数の設定方法については、See Variables。
通常、バッファの最終行でのC-nは、新しい行を追加します。
変数next-line-add-newlines
がnil
である場合、
C-nは新規の行を追加せずに
(先頭行でのC-pと同様に)エラーになります。
delete-backward-char
)。
delete-char
)。
kill-line
)。
kill-word
)。
backward-kill-word
)。
ポイントの直前(つまり、カーソルの直前)の文字を削除する <DEL>キーについてはすでに知っていますね。 Control-d(C-dと略記)は、ポイントの直後の文字 (つまり、カーソルが重なっている文字)を削除します。 すると、残りのテキストは左に移動します。 行末でC-dを打つと、その行とつぎの行が連結されます。
大量のテキストを消去するには、C-kを使います。 C-kは1行を一度にキルします。 行頭や行の途中でC-kを打つと、 行末までのすべてのテキストをキルします。 行末でC-kを打つと、その行とつぎの行を連結します。
より柔軟なテキストのキルについての詳細は、See Killing。
バッファのテキストに対する変更は、ある時点まで遡って、
すべてアンドゥ(もとに戻すことが)できます。
各バッファでは個々の変更をそれぞれ記録していて、
アンドゥコマンドは、つねにカレントバッファに作用します。
通常、各編集コマンドはアンドゥ記録に別々の項目を作成しますが、
query-replace
のようなコマンドは一度に多くの項目を作りますし、
自己挿入文字のように非常に単純なコマンドは、
もとに戻すのを単純にするために、まとめられます。
undo
)。
変更をもとに戻すには、コマンド、C-x uやC-_を使います。 始めにこのコマンドを実行すると、直前の変更をもとに戻します。 ポイントは、もとに戻されたコマンドを実行するまえの位置に戻ります。
C-_やC-x uを連続して実行すると、 アンドゥ情報の限界に達するまで、 次々に以前の変更をもとに戻していきます。 記録されているすべての変更をもとに戻してしまうと、 アンドゥコマンドはその旨エラーメッセージを表示します。
アンドゥコマンド以外の他のコマンドを実行すると、 アンドゥコマンドの連続実行系列が断ち切られます。 これ以後、これよりまえのアンドゥコマンドの実行自体が、 もとに戻すことが可能な一般の変更として扱われます。 したがって、もとに戻してしまった変更をやはりそのとおりに 変更しておきたい場合には、 C-fと打つか、あるいは、無害なコマンドを実行して アンドゥの連続実行系列を断ち切ってから、さらにアンドゥコマンドを打ちます。
普通のアンドゥは、カレントバッファにおけるすべての変更に作用します。
カレントリージョン内に制限した選択的なアンドゥ(selective undo)を
行うこともできます。
これには、リージョンを設定してから、数引数(値は関係ない)を指定して
undo
コマンドを、つまり、C-u C-x uやC-u C-_を実行します。
これにより、リージョン内のもっとも最近の変更がもとに戻ります。
同じリージョン内の変更をさらにもとに戻すには、
undo
コマンドを繰り返します(これには数引数は必要ない)。
暫定マーク(transient-mark)モードでは、
リージョンが活性のときにundo
を使うと選択的なアンドゥを行います。
つまり、数引数は必要ありません。
バッファを誤って変更してしまった場合、 もとに戻すもっとも簡単な方法は、モード行の先頭部分から星印が 消えるまでC-_を繰り返し打つことです。 そうすれば、すべての修正を取り消したことになります。 アンドゥコマンドによりモード行から星印が消えた場合はつねに、 バッファの内容がファイルを訪問したときと同じであるか、 最後に保存したときと同じであることを意味します。
意図してバッファを変更したかどうかあやふやなときは、 一度だけC-_を打ちます。 もとに戻すことで最後の変更箇所がわかりますから、 それが意図した変更かどうか判断できるでしょう。 意図した変更でなければ、もとに戻したままにしておきます。 意図した変更であったなら、上記の方法で変更し直します。
すべてのバッファでアンドゥ情報を記録するわけではありません。 空白で始まる名前のバッファでは記録しません。 これらのバッファは、 Emacsやその拡張部分が内部的に使用するもので、 ユーザーが通常見たり編集したりしないテキストを保持しています。
単なるカーソル移動はアンドゥできません。 バッファの内容を変更したときだけアンドゥ情報が保存されます。 ただし、いくつかのカーソル移動コマンドはマークを設定しますから、 これらのコマンドをときどき使えば、 マークリング(see Mark Ring)から取り出しながら、 通ってきたそれぞれの箇所へ戻ることができます。
バッファに関するアンドゥ情報が大きくなると、
Emacsはもっとも古いアンドゥ情報から順に(ガベッジコレクション中に)
破棄していきます。
保持すべきアンドゥ情報の量を指定するには、
2つの変数undo-limit
とundo-strong-limit
を設定します。
これらの変数の値は、保存領域のバイト数です。
変数undo-limit
は緩い限界(soft limit)を設定します。
Emacsは、このサイズに達するまでのコマンド分のアンドゥデータを保持します。
データ量がこのサイズを超える場合もありますが、
このデータ量を超えるような古いコマンド分のデータは保持しません。
デフォルトは、20000です。
変数undo-strong-limit
は、厳密な限界(stricter limit)を設定します。
この量を超えるデータに対応するコマンドのデータは破棄します。
初期値は30000です。
これらの変数の値に関わらず、最新の変更を破棄することはありませんので、 意図しない大きな変更を加えてしまった直後に ガベッジコレクションが発生しても、 その変更をアンドゥできないというようなことはありません。
アンドゥコマンドを実行するキーがC-x uとC-_と2つある理由は、 1文字キーにするほど重要なのですが、どうやってC-_を打つか自明でない キーボードもあるからです。 C-x uは、どの端末でも素直に打てる代替手段なのです。
Emacsバッファ内でテキストを作成したり変更したりするには、 これまでに説明したコマンドで十分なはずです。 より高度なEmacsコマンドといっても、 これらの操作を容易にするだけです。 しかし、テキストを恒久的なものとするには、 ファイル(file)に保存する必要があります。 ファイルとは、 オペレーティングシステムが保存するために名前を付けたテキストの一塊であり、 あとでその名前で取り出せます。 Emacsでファイルを編集する場合を含めて、 ファイルの内容を眺めたり利用したりするには、 ファイル名を指定する必要があります。
/usr/rms/foo.c
という名前のファイルがあるとしましょう。
このファイルを編集し始めるには、Emacsではつぎのように打ちます。
C-x C-f /usr/rms/foo.c <RET>
ここで、ファイル名は、コマンドC-x C-f(find-file
)に対する
引数(argument)として与えます。
このコマンドは引数を読むためにミニバッファを使います。
引数の入力を終えるには、<RET>を打ちます(see Minibuffer)。
Emacsはコマンドに従い、ファイルを訪問(visiting)します。
つまり、バッファを作成し、ファイルの内容をそのバッファにコピーし、
ユーザーが編集できるようにそのバッファを表示します。
テキストを変更したら、C-x C-s(save-buffer
)と打てば、
新しいテキストをファイルに保存(save)できます。
これにより、バッファの変更した内容を
ファイル/usr/rms/foo.c
にコピーし戻したので、
変更は恒久的になります。
ユーザーが保存するまでは、変更はEmacs内部のみに存在するだけで、
ファイルfoo.c
自体は未変更のままです。
ファイルを作成するには、そのファイルが既存であるかのように、 C-x C-fでファイルを訪問するだけです。 これにより、空のバッファが作られ、 ファイルに収めたいテキストを挿入できるようになります。 C-x C-sでバッファを保存したときに、 ファイルが実際に作成されます。
もちろん、ファイルについてはもっと知っておく必要があります。 See Files。
キーの機能を忘れてしまった場合には、
ヘルプ文字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。
空行の挿入と削除に関する特別なコマンドや技法を紹介します。
open-line
)。
delete-blank-lines
)。
既存の行のまえに新たに1行を挿入するには、
新しい行のテキストを打ってから<RET>を打つこともできます。
しかし、まず空行を作ってから、
そこに希望のテキストを挿入するほうが何をしているのかがわかりやすいでしょう。
キーC-o(open-line
)を使えば簡単です。
これはポイントの直後に改行を挿入して、
ポイントは改行の直前に置かれたままとなります。
C-oに続けて、新しい行のテキストを打ちます。
C-o F O Oは、ポイントの最終的な位置を除けば、
F O O <RET>と同じ効果を持ちます。
複数の空行を作るには、C-oを数回打つか、 作りたい空行の個数を指定する数引数を指定します。 数引数の指定方法は、See Arguments。 詰め込み接頭辞を設定してある場合、 行の先頭でC-oコマンドを使うと、 このコマンドは新しい行に詰め込み接頭辞を挿入します。 See Fill Prefix。
余分な空行を削除するには、
コマンドC-x C-o(delete-blank-lines
)を使います。
連続する複数の空行の中でC-x C-oを実行すると、
1行を残してすべての空行を削除します。
空行が1行だけの場合、その空行自体を削除します。
空行でない行にポイントがある場合、
その行に続くすべての空行を削除します。
<RET>で分割せずに1行に文字を加え続けると、
その行は画面上で2行以上を占めるようになります。
このとき、そのような行の最後の行を除くすべての行の右端には、
\
が表示されます。
この\
は、画面上の後続の行はテキスト内の独立した行ではなく、
画面に収まりきらない長い行が継続(continuation)
していることを意味します。
この継続を、折り返し(wrapping)とも呼びます。
行が長くなりすぎたときにEmacsが自動的に改行を挿入すると便利なことがあります。 画面上での継続は、このようには機能しません。 自動的に改行するようにするには、 自動詰め込み(auto-fill)モード(see Filling)を使います。
継続のかわりの方法として、Emacsは長い行を切り捨て(truncation)て
表示することもできます。
つまり、画面やウィンドウの幅に収まりきらない文字は表示しません。
もちろん、一時的に見えないだけで、バッファ内には存在しています。
切り捨てていることを示すために、
\
ではなく$
を右端に用います。
水平スクロールを使っていたり、ウィンドウを左右に並べていると、
継続のかわりに切り捨て表示します(see Windows)。
特定のバッファの変数truncate-lines
にnil
以外を設定すると、
そのバッファを切り捨て表示にできます(see Variables)。
変数truncate-lines
の値を変更すると、
この変数はカレントバッファにローカルになります。
そうするまでは、デフォルト値が使われます。
デフォルトの初期値はnil
です。
See Locals。
テキストの表示方法に影響する変数については、See Display Vars。
バッファのある部分の大きさや位置に関する情報を得るコマンドや 行を数えるコマンドを紹介します。
count-lines-region
)。
リージョンに関しては、see Mark。
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)
数学や計算機の用語では、引数(argument)という単語は 『関数や操作に与えるデータ』を意味します。 Emacsのすべてのコマンドには、数引数(numeric argument) (前置引数(prefix argument)とも呼ぶ)を指定できます。 コマンドによっては、引数を反復回数として解釈します。 たとえば、引数10をC-fに指定すると、 カーソルを通常の1文字ではなく、10文字分前向きに移動します。 これらのコマンドでは、引数を指定しないと引数1を指定したのと同等になります。 この種のコマンドの多くでは、負の引数を指定すると、 逆向きの移動や逆の操作を指示することになります。
端末のキーボードに<META>キーがある場合、 数引数を入力するもっとも簡単な方法は、 <META>キーを押し下げたままで、数字やマイナス記号を打ちます。 たとえば、
M-5 C-n
は、カーソルを5行下に移動します。
Meta-1、Meta-2、Meta--などの文字がこのように動作するのは、
これらのキーが、後続のコマンドに引数を与えるように定義されたコマンド
(digit-argument
とnegative-argument
)に
バインドされているからです。
コントロールやコントロールとメタで修飾した数字と-も、
同様に数引数を指定します。
引数を指定する別の方法は、
C-u(universal-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-nやC-u C-u C-n(画面の下方への移動に便利)、 C-u C-u C-o(『数多く』の空行を作る)、 C-u C-k(4行キルする)です。
コマンドによっては、引数の値ではなく、引数の有無だけを問題にします。
たとえば、コマンドM-q(fill-paragraph
)に引数を指定しないと
テキストの詰め込みのみを行います。
引数を指定すると、さらに幅揃えも行います。
(M-qに関する詳細は、see Filling。)
C-uだけを使えば、このようなコマンドに簡単に引数を指定できます。
引数の値を反復回数として使うにも関わらず、
引数がないと特別な動作をするコマンドもあります。
たとえば、C-k(kill-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個挿入できます。
コマンドのまえに引数を打つということを強調するために、また、 コマンドのあとのミニバッファ引数と区別するために、 『数引数』と同様に用語『前置引数』を使います。
コマンドC-x z(repeat
)は、
Emacsコマンドを何回も反復する別の方法です。
このコマンドは、直前のEmacsコマンドが何であっても、それを繰り返します。
繰り返されるコマンドは、まえと同じ引数を使います。
毎回、新たに引数を読むことはしません。
コマンドを2回以上繰り返すには、zを追加して打ちます。 1つのzで、コマンドを1回繰り返します。 z以外の文字を打つか、マウスボタンを押すと、 繰り返しを終了します。
たとえば、20文字削除するためにC-u 2 0 C-dと打ったとしましょう。 C-x z z zと打てば、 (引数を含めて)削除コマンドをさらに3回繰り返し、全部で80文字削除できます。 始めのC-x zでコマンドを1回繰り返し、 そのあとのそれぞれのzで1回ずつ繰り返します。
ミニバッファは、単純な数よりも複雑な引数をEmacsコマンドが 読み取るために用いる機構です。 ミニバッファ引数は、ファイル名、バッファ名、Lisp関数名、Emacsコマンド名、 Lisp式など、引数を読み取るコマンドに応じて多種多様です。 ミニバッファでは、通常のバッファと同様の編集機能を用いて 引数のテキストを編集できます。
ミニバッファが使われているときには、ミニバッファはエコー領域に表示されて、 端末のカーソルもエコー領域に移動します。 ミニバッファの行の先頭にはプロンプト(prompt)が表示されます。 プロンプトにより、何を入力しそれがどのように使われるかを 知ることができます。 プロンプトは、引数を要求しているコマンドの名前から導かれることが多いです。 プロンプトは通常コロンで終ります。
コロンのあとの括弧の中にデフォルト引数(default argument)が 表示されることもあります。 これもプロンプトの一部です。 (たとえば、<RET>だけを打って)空の引数を入力したときには、 デフォルトが引数として使われます。 たとえば、バッファ名を読み取るコマンドは、つねに、デフォルトを表示しますが、 それは<RET>だけを打ったときに使われるバッファ名です。
ミニバッファ引数を入力するもっとも簡単な方法は、 目的のテキストを入力してから、 ミニバッファから抜ける<RET>で終えることです。 C-gを打てば、引数を必要とするコマンドを取り消して、 ミニバッファを抜けることができます。
ミニバッファは画面のエコー領域を使うため、 習慣的にエコー領域を使用するEmacsの機能と衝突する可能性があります。 Emacsは、そのような衝突を以下のように扱います。
最初からテキストを伴って始まるミニバッファもあります。 たとえば、ファイル名を指定しなければならない場合、 ミニバッファはスラッシュで終るデフォルトディレクトリ (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-directory
にnil
を設定すると、
ミニバッファにはデフォルトディレクトリを挿入しません。
つまり、ミニバッファは空で始まります。
しかし、入力したファイル名が相対的なものであれば、
同じデフォルトディレクトリ相対に解釈されます。
ミニバッファは(少々特殊だが)普通のEmacsバッファなので、 通常のEmacsコマンドを使って、入力中の引数のテキストを編集できます。
ミニバッファでは、<RET>はミニバッファから抜けるように定義されているので、 ミニバッファで改行を挿入するために<RET>を使うことはできません。 改行を挿入するには、C-oやC-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-minibuffers
にnil
以外を設定します。
ある種の引数では、引数の値の入力に補完(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
とは補完しません。
大文字小文字を区別しない引数に対しては、補完も両者を区別しません。
具体的な例で考えてみましょう。
M-x au <TAB>と打つと、
<TAB>はau
で始まる候補(この場合はコマンド名)を探します。
au
で始まるものには、auto-fill-mode
とauto-save-mode
を
含めていくつかありますが、どれも少なくともauto-
までは同じです。
そこで、ミニバッファ内のau
はauto-
に変わります。
ここでただちに<TAB>をもう一度打っても、
つぎにくる文字の候補が複数、つまり、cfilrs
のどれかなので、
さらに文字が追加されることはありません。
そのかわり、<TAB>は補完候補の一覧を別のウィンドウに表示します。
続けてf <TAB>と打つと、
今度の<TAB>は文字列auto-f
を探します。
auto-f
から始まるコマンド名はauto-fill-mode
だけなので、
補完は残りの部分を補います。
これで、au <TAB> f <TAB>と打つだけで、
ミニバッファにはauto-fill-mode
が入ります。
<TAB>キーがこのような効果を持つのは、
このキーがミニバッファ内ではコマンドminibuffer-complete
に
バインドしてあるからだということに注意してください。
補完を使えるミニバッファでは、 つぎのような補完コマンドを定義してあります。
minibuffer-complete
)。
minibuffer-complete-word
)。
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-choose-completion
)。
通常は、ポイントがミニバッファ内にあるときにこのコマンドを使うだろうが、
ミニバッファではなく候補一覧でクリックする必要がある。
switch-to-completions
)。
この機能は、以下のコマンドの利用を簡単にする。
(通常の方法でもそのウィンドウを選択できるが、この方法のほうが便利であろう。)
choose-completion
)。
このコマンドを使う場合、
補完候補一覧を表示しているウィンドウにまず移動する必要がある。
next-completion
)。
previous-completion
)。
ミニバッファでの補完において、 <RET>は引数の使われ方に依存して3種類の異なる動作を示します。
慎重な補完は、既存でなければならない ファイルの名前を読み取るような場合に使われる。
補完コマンドは、つぎにくる文字として複数の可能性がある場合、 補完可能な全候補一覧をウィンドウに表示します。 また、?と打てば、このような一覧を表示できます。 補完候補一覧が長いときには、 C-M-vでスクロールできます(see Other Window)。
ファイル名の補完を行う場面では、ある種のファイル名を通常無視します。
変数completion-ignored-extensions
は、文字列のリストを保持します。
これらの文字列の1つで終る名前のファイルは、補完候補としては無視します。
この変数の標準値には、".o"
、".elc"
、".dvi"
、
"~"
が含まれます。
この効果は、たとえば、foo
は、foo.o
が存在したとしても、
foo.c
に補完されます。
ただし、補完候補のすべてが無視すべき文字列で終るものである場合には、
これらの候補を無視しません。
無視した拡張子を持つものが補完候補一覧に入ることはありません。
一覧にはつねに補完可能な候補のすべてを表示します。
通常、補完コマンドは、つぎにくる文字を自動的に決定できない場合には、
すべての補完候補一覧を表示します。
変数completion-auto-help
にnil
が設定されていると、
一覧を表示しません。
補完候補を表示するには、?を打つ必要があります。
complete
ライブラリは、
一度に複数の単語を補完できる、より強力な補完機能を提供します。
たとえば、p-b
と省略されたコマンド名を
print-buffer
と補完できます。
というのは、頭文字がp
とb
である2つの単語で
始まるコマンドが他にはないからです。
このライブラリを使うには、個人の~/.emacs
ファイルに
(load "complete")
を入れておきます(see Init File)。
補完示唆(icomplete)モードでは、 それまでに入力したテキストから補完できるものを常時更新して表示します。 このマイナモードをオン/オフするコマンドはM-x icomplete-modeです。
ミニバッファで入力した引数はすべてミニバッファ履歴リスト (minibuffer history list)に保存され、 あとで別の引数中で使うことができます。 特別のコマンドで、以前に使った引数のテキストをミニバッファに入れます。 これらは、ミニバッファの古い内容を破棄するので、 過去の引数の履歴の中を動き廻っていると考えることができます。
previous-history-element
)。
next-history-element
)。
previous-matching-history-element
)。
next-matching-history-element
)。
履歴リストに保存されている引数を再利用するもっとも簡単な方法は、
履歴リストの中を1つ1つ移動していくことです。
ミニバッファの中では、1つまえ(古い)のミニバッファの入力内容に
『移動する』にはM-p(previous-history-element
)を、
1つあと(新しい)の入力内容に移動するには
M-n(next-history-element
)を打ちます。
ミニバッファの内容は、履歴から持ってきた以前の入力内容で完全に 置き換えられます。 この内容を引数として使うには、 通常と同じように<RET>でミニバッファを抜けます。 引数として再使用するまえに、テキストを編集してもかまいません。 編集してもミニバッファに『持ってきた』履歴のもともとの要素は変更されません。 ただし、当然、新しい引数は履歴リストの最後に追加されます。
多くのミニバッファ引数には、デフォルト値があります。 ミニバッファ履歴操作コマンドが、 これらのデフォルト値を知っている場合もあります。 その場合、M-nで履歴中の『未来』へ移動する 12 ことで、このデフォルト値をテキストとしてミニバッファに挿入できます。 将来的には、ミニバッファにデフォルト値がある場合には、 つねにこの機能を利用できるようにしたいと考えています。
履歴の中を前向きや後向きに探索するコマンドもあります。
これらのコマンドは、ミニバッファで指定した正規表現に
一致する履歴要素を探索します。
M-r(previous-matching-history-element
)は、
履歴のより古い要素を探します。
一方、M-s(next-matching-history-element
)は、
より新しい要素を探します。
特例なのですが、
これらのコマンドは、コマンドを呼び出す時点で
すでにミニバッファに入っているにも関わらず、
ミニバッファから引数を読み取ります。
インクリメンタルサーチの場合と同様に、
正規表現に大文字を使うと、大文字小文字を区別して探索します
(see Search Case)。
ミニバッファを使えば入力は必ず履歴リストに記録されますが、 引数の種類ごとに別々の履歴リストがあります。 たとえば、ファイル名に関する履歴リストは、 ファイル名を読み取るすべてのコマンドで使われます。 (特別な機能として、この履歴リストには、 絶対ファイル名を入力しなくても絶対ファイル名が記録される。)
特定目的用の履歴リストがいくつかあります。
M-xが読むコマンド名用、バッファ名用、
query-replace
のようなコマンドの引数用、
compile
が読むコンパイルコマンド用などです。
さらに、ほとんどのミニバッファ引数が利用する
『その他』の履歴リストも1つあります。
変数history-length
は、ミニバッファ履歴リストの最大長を指定します。
履歴リストが設定された長さに達すると、
そのあとは、新しい要素を追加するたびに最古の要素を削除します。
ただし、変数history-length
の値がt
であると、
長さの制限はなくなり要素を削除しません。
ミニバッファを少なくとも1回使ったコマンドは、 その引数の値とともにすべて特別な履歴リストに記録されますから、 コマンド全体を繰り返すことができます。 特に、M-xはコマンド名を読み取るためにミニバッファを使うので、 必ず履歴に記録されます。
repeat-complex-command
)。
C-x <ESC> <ESC>は、 ミニバッファを利用した最近のコマンドを再度実行します。 引数を指定しなければ、そのような最後のコマンドを繰り返します。 数引数は、どのコマンドを繰り返すかを指定します。 1は最後のコマンドを指し、大きい数ほどより以前のコマンドを指します。
C-x <ESC> <ESC>は、過去のコマンドをLisp式に変換し、 その式のテキストで初期化したミニバッファに入ります。 <RET>だけを打てば、コマンドは以前とまったく同様に繰り返されます。 Lisp式を編集してコマンドを変更してもかまいません。 最終的な式が何であれ、その式を実行します。 繰り返したコマンドは、 履歴リスト内に既存の最後に実行したコマンドと同一でない限り、 コマンド履歴の先頭に追加されます。
Lisp構文が理解できないとしても、 繰り返しのためにどのコマンドが表示されたか、たぶんわかるでしょう。 テキストを変更しなければ、以前とまったく同じに繰り返されます。
C-x <ESC> <ESC>でいったんミニバッファに入ってしまえば、 ミニバッファ履歴リストコマンド (M-p、M-n、M-r、M-s、see Minibuffer History) を使って、保存されたすべてのコマンドの履歴リストの中を動き廻れます。 目的のコマンドを捜しあてたら、通常の方法でその式を編集できますし、 これも通常と同じように<RET>を打てば実行できます。
ミニバッファを使った過去のコマンド一覧は、
Lispのリストとして変数command-history
に格納されます。
各要素はそれぞれ1つのコマンドとその引数を表すLisp式です。
Lispプログラムからは、
command-history
の要素を引数として
eval
を呼べばコマンドを再実行できます。
使用頻度の高いコマンドや素早い打鍵が必要なEmacsコマンドは、 使い勝手をよくするために、キー(文字の短い列)にバインドしてあります。 短縮する必要のないその他のEmacsコマンドはキーにバインドしてありません。 これらのコマンドを実行するには、コマンド名を使う必要があります。
慣習として、コマンド名は1単語かハイフンで区切った2語以上の単語です。
たとえば、auto-fill-mode
やmanual-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-bindings
にnil
を設定すれば、
これらのメッセージ表示をオフにできます。
本書では、名前で実行するコマンドの説明において、 名前を終えるために必要な<RET>を省略します。 つまり、M-x auto-fill-mode <RET>ではなく、 M-x auto-fill-modeとします。 コマンド名に続く引数も示す場合のように、 <RET>が必要なことを強調する場合にのみ、 <RET>を書きます。
M-xは、execute-extended-command
を実行することで動作します。
execute-extended-command
は、
他のコマンドの名前を読み取って、それを実行する役割を担うコマンドです。
Emacsには、C-hのたった1文字で呼び出せる 高度なヘルプ機能があります。 C-hは、説明文表示コマンドのためだけに使われるプレフィックスキーです。 C-hのあとに打つ文字(列)を ヘルプオプション(help options)と呼びます。 C-hもヘルプオプションの1つであって、 C-hの使い方を調べることができます。 途中で取り消すには、C-gを打ちます。 ファンクションキー<F1>は、C-hと等価です。
C-h C-h(help-for-help
)は、
利用可能なヘルプオプションの一覧を簡素な説明とともに表示します。
ヘルプオプションを打つまでは、
<SPC>や<DEL>で一覧をスクロールできます。
C-hや<F1>は、他のさまざまな状況でも『ヘルプ』を意味します。
たとえば、query-replace
の実行中には、
今一致している文字列に対して適用可能な操作を説明します。
プレフィックスキーに続けてC-hや<F1>を打つと、
そのプレフィックスキーに続けることができるキーの一覧を表示します。
(C-hに独自の意味を定義しているプレフィックスキーもあり、
そのような場合にはC-hを使えない。
しかし、<F1>はすべてのプレフィックスキーで使える。)
ほとんどのヘルプバッファでは、特別なメジャーモードである ヘルプ(help)モードを使います。 ヘルプ(help)モードでは、 <SPC>と<DEL>で画面を簡単にスクロールできます。
定義されているヘルプコマンドを以下にまとめておきます。
apropos-command
)。
describe-bindings
)。
describe-key-briefly
)。
ここで、cは『character』(文字)のcのこと。
keyのさらに詳しい情報を得るには、C-h kを使う。
describe-function
)。
コマンドはLisp関数なので、コマンド名も使える。
hello
ファイルを表示する。
info
)。
infoでは、完全なEmacsマニュアルをオンラインで見ることができる。
describe-key
)。
view-lossage
)。
describe-mode
)。
view-emacs-news
)。
finder-by-keyword
)。
describe-syntax
)。
see Syntax。
help-with-tutorial
)。
describe-variable
)。
where-is
)。
describe-coding-system
)。
describe-input-method
)。
describe-language-environment
)。
Info-goto-emacs-command-node
)。
Info-goto-emacs-key-command-node
)。
info-lookup-symbol
)。
C-hのもっとも基本的なオプションは、
C-h c(describe-key-briefly
)と
C-h k(describe-key
)です。
C-h c keyは、
keyにバインドしてあるコマンド名をエコー領域に表示します。
たとえば、C-h c C-fと打てばforward-char
と表示されます。
コマンド名はそのコマンドが何をするかを表すように選んでありますから、
キーkeyが何をするかをちょっと調べたい場合に、よい方法です。
C-h k keyも同様ですが、より多くの情報を表示します。 つまり、コマンドの名前だけでなく、説明文も表示します。 その内容はエコー領域に表示するには多すぎるため、 ウィンドウに表示します。
C-h cやC-h kは、ファンクションキーやマウスイベントも含めた、 あらゆるキー列に適用できます。
C-h f(describe-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 v(describe-variable
)はC-h fに似ていますが、
Lisp関数ではなくLisp変数を説明する点が異なります。
デフォルトはポイント周辺またはポイントの直前のLispシンボルですが、
既知のLisp変数に限ります。
See Variables。
より洗練された質問方法としては、『ファイルを扱うコマンドは?』と
いうのがあります。
このように質問するには、C-h a file <RET>と打ちます。
すると、copy-file
やfind-file
といった、
file
を名前に含むすべてのコマンドの一覧が表示されます。
各コマンドには、使い方の簡単な説明や
そのコマンドを起動するキーが表示されます。
たとえば、find-file
を起動するにはC-x C-fと打つ、
といった具合です。
C-h aのaは「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-all
がnil
以外ならば、
上に述べたコマンドはすべて、前置引数を指定したものとして動作します。
アプロポス(apropos)バッファに表示された関数定義、 変数、属性リストについて詳しく知りたいときには、 Mouse-2ボタンでクリックするか、 その箇所へ移動して<RET>を打ちます。
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 --- ワープロ。
コマンドC-h L(describe-language-environment
)を使うと、
特定の言語環境向けに、どのような支援があるかを把握できます。
See Language Environments。
このコマンドは、今の言語環境がどの言語向けなのかを示し、
一緒に使われる文字集合、コーディングシステム、入力方式も表示します。
また、字体を例示するためのサンプルテキストもいくつか表示します。
コマンドC-h h(view-hello-file
)は、
ファイルetc/HELLO
を表示します。
このファイルには、いろいろな国の言葉で書いた『hello』を収めてあります。
コマンドC-h I(describe-input-method
)は、
指定した入力方式、あるいは、デフォルトとして
今使っている入力方式についての情報を表示します。
See Input Methods。
コマンドC-h C(describe-coding-system
)は、
指定したコーディングシステム、あるいは、デフォルトとして
今使っているコーディングシステムについての情報を表示します。
See Coding Systems。
ヘルプバッファには、閲覧(view)モード(see Misc File Ops)の コマンドに加えて、独自の特別なコマンドもいくつかあります。
説明文に現れるコマンド名(see M-x)や変数名(see Variables)は
通常、引用符('
)で囲まれています。
その名前をMouse-2でクリックしたり、あるいは、
そこへポイントを移動して<RET>を打つと、
そのコマンドや変数の説明文字列を表示できます。
もとの場所に戻るにはC-c C-bを使います。
ヘルプテキスト内の相互参照にポイントを移動する便利なコマンドがあります。
<TAB>(help-next-ref
)は、
ポイントをつぎの相互参照箇所へ進めます。
ポイントをまえの相互参照箇所へ戻すには
S-<TAB>(help-previous-ref
)を使います。
C-h i(info
)は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-node
、
Info-goto-emacs-key-command-node
を実行します。
プログラム言語のinfo版のマニュアルがあれば、 プログラムの編集中にコマンドC-h C-iを使って、 マニュアルドキュメントの シンボル(キーワード、関数、変数)に関する箇所を参照できます。 コマンドの細かい動作は、メジャーモードに依存します。
予期しなかったことが起きたり、
入力したコマンドがわからなくなってしまったときは、
C-h l(view-lossage
)を使ってください。
C-h lは、それまでに打鍵した最後の100個のコマンド文字を表示します。
知らないコマンドが表示されたら、C-h cでその機能を知ることができます。
Emacsには数多くのメジャーモードがあり、各メジャーモードでは、
いくつかのキーを再定義し、編集動作も少々変更しています。
C-h m(describe-mode
)は、
使用中のメジャーモードについての説明文を表示します。
これには、通常、モード内で変更してある
すべてのコマンドについての記述があります。
C-h b(describe-bindings
)と
C-h s(describe-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 n(view-emacs-news
)は、
ファイルemacs/etc/NEWS
を表示します。
このファイルには、Emacsの変更に関する記述を時間順に収めてあります。
C-h F(view-emacs-FAQ
)は、
Emacsの「よくある質問集」を表示します。
C-h t(help-with-tutorial
)は、
「操作しながらEmacsを学ぶ」チュートリアルを表示します。
C-h C-c(describe-copying
)は、
ファイルemacs/etc/COPYING
を表示します。
このファイルには、Emacsを配布する場合に従うべき条件を記述してあります。
C-h C-d(describe-distribution
)は、
ファイルemacs/etc/DISTRIB
を表示します。
このファイルには、Emacsの最新版の注文方法を述べてあります。
C-h C-p(describe-project
)は、
GNUプロジェクトに関する一般情報を表示します。
Emacsの数多くのコマンドは、カレントバッファの任意の連続領域を操作します。 このようなコマンドに操作対象となるテキストを指定するには、 その一方の端にマーク(mark)を置き、 もう一方の端にポイントを移動します。 ポイントとマークに挟まれたテキストをリージョン(region)と呼びます。 暫定マーク(transient-mark)モードをオンにすると、 リージョンが存在すれば Emacsはつねにそのリージョンを強調表示します (see Transient Mark)。
リージョンの境界を調整するには、ポイントやマークを移動します。 時間的にどちらを先に設定したとか、 テキスト内でどちらが先にあるかとかは関係ありません。 いったんマークを設定すると、他の箇所に再設定するまで、 その位置情報はそのまま変わりません。 各Emacsバッファには個別にマークがありますから、 以前に選択したバッファへ戻ったときには、 以前と同じままのマークが残っています。
C-y(yank
)やM-x insert-bufferなどのテキストを
挿入するコマンドの多くは、挿入したテキストの両端にポイントとマークを置いて、
挿入したテキストがリージョンに含まれるようにします。
リージョンの境界を定めること以外に、 あとで戻る可能性のある箇所を覚えておくためにもマークを使えます。 この機能をより使いやすくするために、 各バッファでは、それまでに設定した16個のマーク位置を マークリング(mark ring)に記録しています。
マークを設定するコマンドはつぎのとおりです。
set-mark-command
)。
exchange-point-and-mark
)。
mouse-save-then-kill
)。
たとえば、コマンドC-x C-u(upcase-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-x(exchange-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
です。
Xウィンドウシステムを使っているのであれば、 Emacsはカレントリージョンを強調表示できます。 ただし、通常はリージョンを強調表示しません。 なぜでしょうか?
実は、もともとのEmacsではリージョンの強調表示をうまくできないのです。 いったんマークを設定してしまうと、 そのバッファ内にはつねにリージョンが存在することになるからです。 リージョンを強調表示し続けても迷惑なだけでしょう。
暫定マーク(transient-mark)モードをオンにすると、 リージョンの強調表示機能をオンにできます。 暫定マーク(transient-mark)モードは、 リージョンが一時的にしか『存続』しない、 通常よりきびしい操作モードです。 ユーザーは、リージョンを使うコマンドごとにリージョンを設定する必要があります。 暫定マーク(transient-mark)モードでは、 ほとんどの期間、リージョンは存在しません。 それゆえ、リージョンが存在するときにリージョンを強調表示しても 邪魔になりません。
暫定マーク(transient-mark)モードをオンにするには、 M-x transient-mark-modeと打ちます。 このコマンドはモードのオン/オフを切り替えますから、 モードをオフにしたいときにはコマンドをもう1度繰り返します。
暫定マーク(transient-mark)モードの詳細を以下に示します。
set-mark-command
)と打つ。
この操作はマークを活性にする。
ポイントを移動するたびに、
強調表示されたリージョンが広がったり狭まったりする。
exchange-point-and-mark
)を実行する。
リージョンの強調表示には、region
フェイスを使います。
このフェイスを変更すれば、リージョンの強調表示方法をカスタマイズできます。
複数のウィンドウで同じバッファを表示しているときには、
それぞれのウィンドウで別の部分を表示できます。
というのは、(マーク位置は共有されるが)
各ウィンドウごとに別々にポイントの値があるからです。
通常、選択されたウィンドウでのみ、
リージョンを強調表示します(see Windows)。
しかし、変数highlight-nonselected-windows
にnil
以外を設定すると、
(暫定マーク(transient-mark)モードがオンであり、かつ、
ウィンドウのバッファのマークが活性である場合に限り)
各ウィンドウでそれぞれのリージョンを強調表示します。
暫定マーク(transient-mark)モードがオフであると、 マークを設定するすべてのコマンドはマークを活性にし、 マークを不活性にするものは何もありません。
暫定マーク(transient-mark)モードにおいて、
変数mark-even-if-inactive
がnil
以外であると、
マークが不活性であってもコマンドはマークやリージョンを利用できます。
通常の暫定マーク(transient-mark)モードと同様に、
リージョンが強調表示されたりされなかったりしますが、
強調表示されていなくてもマークが本当になくなることはありません。
暫定マーク(transient-mark)モードは『zmacsモード』としても知られています。 というのも、MITのLispマシン上で動作していたZmacsエディタが 同じようにマークを扱っていたからです。
いったんリージョンを設定しマークを活性にすれば、 以下のようにリージョンを操作できます。
リージョン内のテキストを操作するコマンドの多くは、
その名前にregion
という単語を含みます。
単語、リスト、段落、ページといったテキストのまとまりに ポイントやマークを置くコマンドがあります。
mark-word
)。
このコマンドとつぎのコマンドはポイントを移動しない。
mark-sexp
)。
mark-paragraph
)。
mark-defun
)。
mark-whole-buffer
)。
mark-page
)。
M-@(mark-word
)がつぎの語の末尾にマークを設定するのに対し、
C-M-@(mark-sexp
)はつぎのLisp式の末尾にマークを設定します。
これらのコマンドは、M-fやC-M-fと同様に引数を扱います。
その他のコマンドは、ポイントとマークの両方を設定して、
バッファ内で対象物を区切ります。
たとえば、M-h(mark-paragraph
)は、
ポイントを囲むあるいはポイントに続く段落の先頭にポイントを移動し、
その段落の末尾にマークを置きます(see Paragraphs)。
このようにリージョンを設定するので、
段落全体を字下げしたり、大文字小文字を変換したり、キルしたりできます。
C-M-h(mark-defun
)も同様に、
現在の関数定義や後続の関数定義の先頭にポイントを置き、
その末尾にマークを置きます(see Defuns)。
C-x C-p(mark-page
)は、
現在のページの先頭にポイントを置き、
その末尾にマークを置きます(mark-page
)。
マークはページ区切りの直後に設定され(リージョンに含まれる)、
一方、ポイントはページ区切りの直後に置かれます(リージョンに含まれない)。
数引数で、現在のページのかわりに(正ならば)後続のページや、
(負ならば)先行するページを指定できます。
最後に紹介するC-x h(mark-whole-buffer
)は、
バッファ全体にリージョンを設定します。
つまり、ポイントをバッファの先頭に置き、
マークをバッファの末尾に置きます。
暫定マーク(transient-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
は、最新のマーカオブジェクトを先頭にして、
マーカオブジェクトのリストとしてマークリングを保持します。
この変数は各バッファにローカルです。
個々のバッファごとの普通のマークリングに加えて、 Emacsにはグローバルマークリング(global mark ring)が1つあります。 グローバルマークリングは、最近マークを設定したバッファの系列を記録しますから、 それらのバッファに戻ることができます。
マークを設定すると、つねにカレントバッファのマークリングに項目を作ります。 マークを設定した以降にバッファを切り替えていると、 新しくマークを設定するとグローバルマークリングにも項目を作成します。 その結果、グローバルマークリングには訪れていたバッファの系列が記録され、 各バッファではマークを設定した箇所が記録されます。
コマンドC-x C-<SPC>(pop-global-mark
)は、
グローバルマークリングの最新の項目が示すバッファの位置に移動します。
グローバルマークリングも巡回されるので、
C-x C-<SPC>を繰り返し使用すると、
1つずつまえのバッファに移動できます。
バッファからテキストを消しさるコマンドのほとんどは、
そのテキストをキルリングにコピーしておくので、
バッファの他の部分にそのテキストを移動したりコピーしたりできます。
これらのコマンドを、キル(kill)コマンドと呼びます。
それ以外の『テキストを消すコマンド』は、
テキストをキルリングに保存しません。
これらを削除(delete)コマンドと呼びます。
(両者を区別するのは、バッファ内のテキストを消す場合だけ。)
キルコマンドや削除コマンドを誤って実行してしまった場合には、
C-x u(undo
)コマンドを使って、もとに戻すことができます。
削除コマンドには、一度に1つの文字だけを削除する
C-d(delete-char
)や<DEL>(delete-backward-char
)、
空白や改行だけを削除するコマンドがあります。
単純ではないデータをかなりの分量で破壊する可能性のあるコマンドは、
一般にキルを行います。
コマンド名や個々の説明では、そのコマンドがどちらの働きをするかによって、
キル
(kill)と削除
(delete)を使い分けています。
delete-char
)。
delete-backward-char
)。
delete-horizontal-space
)。
just-one-space
)。
delete-blank-lines
)。
delete-indentation
)。
もっとも基本的な削除コマンドは、C-d(delete-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-o(delete-blank-lines
)は、
現在行に続くすべての空行を削除します。
現在行が空行である場合には、(空行である現在行だけを残して)
先行する空行も同様にすべて削除します。
M-^(delete-indentation
)は、
改行とその周りの空白を削除して、
通常は空白を1個残して現在行と先行する行を繋げます。
See M-^。
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-line
がnil
以外の場合、
行頭でC-kを使うと、行末の改行も含めて行全体をキルします。
この変数は、通常、nil
です。
kill-region
)。
kill-word
)。
see Words。
backward-kill-word
)。
backward-kill-sentence
)。
see Sentences。
kill-sentence
)。
kill-sexp
)。
see Lists。
zap-to-char
)。
汎用的なキルコマンドといえばC-w(kill-region
)です。
このコマンドは、あらかじめ連続領域をポイントとマークで囲んでおけば、
どんな連続領域でもキルできます。
探索と組み合わせた便利なキルの仕方もあります。
M-z(zap-to-char
)は1文字を読み取り、
ポイントからバッファ内でその文字がつぎに現れる箇所までを
(その文字も含めて)キルします。
数引数を指定した場合は、反復回数を意味します。
負の引数の場合は、ポイント位置から逆方向に探索し、
ポイントの直前までをキルします。
他の構文単位でもキルできます。 M-<DEL>やM-d(see Words)で単語を、 C-M-k(see Lists)でS式を、 C-x <DEL>やM-k(see Sentences)で文をキルできます。
読み出し専用のバッファでもキルできます。 実際にはバッファに変更を加えることはありませんし、 ベルを鳴らしてその旨警告を発しますが、 キルしようとしたテキストはキルリングにコピーされます。 ですから、別のバッファにそのテキストをヤンクできます。 ほとんどのキルコマンドは、 このようにコピーするテキストを越えてポイントを進めますから、 連続してキルコマンドを実行しても キルリングに入る項目は通常どおり1個だけです。
ヤンク(yank)とは、 以前にキルしたテキストをバッファにふたたび挿入することです。 他のシステムでは『ペースト』と呼ぶこともあります。 テキストを移動したりコピーしたりする普通の方法は、 そのテキストをいったんキルしてから、別の場所に(1回以上)ヤンクすることです。
yank
)。
yank-pop
)。
kill-ring-save
)。
append-next-kill
)。
すべてのキルされたテキストは、キルされたテキストの塊をリストとする キルリング(kill ring)に記録されています。 キルリングはたった1つしかなくて、すべてのバッファで共有しています。 ですから、あるバッファでキルしたテキストは、 別のバッファでヤンクできます。 普通、このようにして、あるファイルから別のファイルへテキストを移動します。 (別の方法については、see Accumulating Text。)
コマンドC-y(yank
)は、
最後にキルしたテキストをふたたび挿入します。
カーソルは挿入したテキストの末尾に置かれます。
マークは挿入したテキストの先頭に置かれます。
See Mark。
C-u C-yは、テキストのまえにカーソルを置き、うしろにマークを置きます。 引数としてC-uだけを指定した場合に限り、こうなります。 C-uと数字を含めた他の引数を指定すると、 いくつまえのキル内容をヤンクするかを意味します(see Earlier Kills)。
一塊のテキストをコピーする場合は、
M-w(kill-ring-save
)を使うとよいでしょう。
このコマンドは、バッファからリージョンをキルせずに、
リージョンをキルリングにコピーします。
このコマンドは、C-wに続けてC-x uを実行するのとほぼ同等ですが、
M-wはアンドゥ履歴を変更しませんし、一時的にせよ画面表示も変わりません。
通常、各キルコマンドは、キルリングに新たな項目を押し込みます。 しかし、連続したキルコマンドでは、 それぞれでキルしたテキストを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-w(append-next-kill
)を打っておけば、
既存の項目へ追加するように強制できます。
C-M-wは、つぎがキルコマンドであれば、
新たな項目を作成するかわりにキルしたテキストを
以前にキルしたテキストに付け加えるよう指示します。
C-M-wを使うことで、
まとめて1か所にヤンクできるように、
離れた場所にあるいくつかのテキスト断片をキルして集めておけます。
M-wに続くキルコマンドでは、 M-wがキルリングにコピーしたテキストには付け加えません。
直前にキルしたものではないテキストを取り出すには、
M-yコマンド(yank-pop
)を使います。
M-yは、直前にヤンクしたテキストを
それ以前にキルしたテキストで置き換えます。
たとえば、最後から2つめのキルテキストを取り出すには、
まずC-yで最後にキルしたテキストをヤンクしてから、
M-yで1つまえのものに置き換えます。
M-yはC-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で見ることができます。
通常、テキストをコピーしたり移動したりするにはキルとヤンクで行います。 しかし、一塊のテキストを何か所にもコピーしたり、 多くの箇所に分散したテキストを1か所にコピーしたりするのに 便利な方法が他にもあります。 一塊のテキストを何か所にもコピーするには、 そのテキストをレジスタに保存します(see Registers)。 ここでは、何か所かに分散したテキストをバッファやファイルに 蓄積するためのコマンドを説明します。
テキストをバッファに蓄積するには、M-x append-to-bufferを使います。
これは、バッファ名を読み取り、
リージョンのコピーを指定したバッファに挿入します。
存在しないバッファを指定した場合、
append-to-buffer
はバッファを作成します。
テキストは、そのバッファ内のポイント位置に挿入されます。
バッファを編集用に使っている場合には、
そのバッファ内のテキストのあいだ、
その時点のポイント位置にコピーしたテキストを挿入します。
コピー先のバッファ内では、ポイントはコピーされたテキストの末尾に置かれます。
したがって、連続してappend-to-buffer
を使うと、
コピーした順序でバッファにテキストが蓄積されます。
厳密には、append-to-buffer
は、
バッファ内の既存のテキストに追加するとは限りません。
そのバッファの末尾にポイントがある場合に限り、追加します。
しかし、バッファを変更するコマンドがappend-to-buffer
だけならば、
ポイントはつねに末尾に置かれています。
M-x prepend-to-bufferはappend-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に隠れてファイルを変更することになり、 編集内容の一部を失うことにもなりかねません。
矩形領域コマンドはテキストの矩形領域を操作します。 矩形領域のテキストとは、 2つの行の範囲内にある2つの桁位置のあいだにある文字すべてを指します。 矩形領域をキルする、キルした矩形領域をヤンクする、 矩形領域をクリアする、矩形領域を空白やテキストで充填する、 矩形領域を削除する、といったコマンドがあります。 矩形領域コマンドは、複数段に組んだテキストを操作したり、 テキストをそのように組んだり戻したりする場合に便利です。
コマンドで操作する矩形領域を指定するには、 一方の隅にマークを設定し、その対角にポイントを置きます。 このように設定した矩形領域を矩形リージョン (region-rectangle)と呼びます。 というのも、リージョンの制御と似た方法で矩形領域を制御できるからです。 しかし、ポイントとマークの組は、それを使うコマンドに依存して、 リージョンとして解釈される、あるいは、 矩形領域として解釈されることに注意してください。
ポイントとマークが同じ桁位置にある場合、 それらが切り分ける矩形領域は空です。 同じ行上にある場合は、矩形領域の高さは1行です。 桁と行の扱い方が非対称であるのは、 ポイント(同様にマーク)は2つの桁のあいだにあるのに対し、 行ではその中にあるからです。
kill-rectangle
)。
delete-rectangle
)。
yank-rectangle
)。
open-rectangle
)。
矩形リージョンの直前の内容は右に押しやられる。
string-rectangle
)。
矩形操作は2種類に分類できます。 矩形領域を削除したり挿入したりするコマンドと、 空白の矩形領域を扱うコマンドです。
矩形領域内のテキストを消すには、2つの方法があります。
テキストを捨てる(削除する)か、
『最後にキルした』矩形領域として保存するかです。
これらの機能を実現するコマンドは、C-x r d(delete-rectangle
)と
C-x r k(kill-rectangle
)です。
どちらも、矩形領域の内側にある各行の部分を削除し、
それより右側にテキストがあれば、
隙間を埋めるようにそれらを左へ移動します。
矩形領域の『キル』は普通の意味でのキルではない、 ということに注意してください。 矩形領域はキルリングには保存されませんが、 最後にキルした矩形領域を1つだけ記録できる特別な場所に保存されます。 というのは、矩形領域をヤンクすることは、 線形のテキストのヤンクとは大きく異なり、 特別なヤンクコマンドが必要だったり、 ヤンクしたテキストの入れ換え操作が意味をなさなかったりするからです。
最後にキルした矩形領域をヤンクするには、
C-x r y(yank-rectangle
)と打ちます。
矩形領域のヤンクは矩形領域のキルの逆です。
ポイントは矩形領域の左上隅の位置を指定します。
その場所には矩形領域の1行目が挿入され、
矩形領域の2行目はそのつぎの行にというように挿入されます。
影響される行数は、保存されている矩形領域の高さで決まります。
矩形領域のキルとヤンクを使うと、1段組みの一覧表を2段組の一覧表に変換できます。 一覧表の後半を矩形領域としてキルして、 一覧表の第1行の隣にヤンクすればよいのです。
また、C-x r r rやC-x r i rを使えば、 矩形領域をレジスタにコピーしたり、レジスタから矩形領域をコピーしたりできます。 See Rectangle Registers。
空白の矩形領域を作るコマンドは2つあります。
M-x clear-rectangleは既存のテキストを空白で置き換え、
C-x r o(open-rectangle
)は空白の矩形領域を挿入します。
矩形領域をクリアすることは、
矩形領域を削除してから同じ大きさの空白の矩形領域を挿入するのと同じことです。
コマンドM-x delete-whitespace-rectangleは、 特定の桁位置から始まる横に並んだ白文字を削除します。 矩形領域内の各行に作用し、桁位置は矩形領域の左端です。 矩形領域の右端はこのコマンドには関係ありません。
コマンドC-x r t(M-x string-rectangle)は、 矩形領域を指定した文字列で置き換えます。 文字列の幅は、矩形領域の幅と同じである必要はありません。 文字列の幅が足りなければ、矩形領域の右側にあるテキストは左へ移動します。 文字列の幅が広ければ、矩形領域の右側にあるテキストは右へ移動します。
Emacsのレジスタ(registers)は、 あとで使うためにテキストやポイント位置を保存するための場所です。 テキストや矩形領域をレジスタにいったん保存すれば、 何度でもバッファにコピーできます。 また、レジスタに保存した位置には何度でもポイントを移動できます。
各レジスタには1文字の名前が付いています。 レジスタには、テキストの一部、矩形領域、位置、 ウィンドウの構成情報、ファイル名を保存できますが、 1度にはそのうちの1つしか保存できません。 レジスタに保存した内容は、そのレジスタに他のものを保存するまでは 保持され続けます。 レジスタrに何が入っているか調べるには、 M-x view-registerを使います。
位置を保存するとは、 あとで戻ってこられるようにバッファ中の位置を記録することです。 保存した位置に移動すると、そのバッファに切り替えてから ポイントをその位置に移動します。
point-to-register
)。
jump-to-register
)。
ポイントの現在位置をレジスタに保存するには、名前rを選んでから、 C-x r <SPC> rと打ちます。 他のものを保存するまで、 レジスタrはこうして保存した位置を保持し続けます。
コマンドC-x r j rは、 レジスタrに記録した位置にポイントを移動します。 レジスタは変わらず、同じ位置を記録し続けます。 何度でも保存した位置に移動できます。
C-x r jを使って保存位置に移動しようとしたとき、 その対象となるバッファがすでに消去されていた場合には、 C-x r jは同じファイルを訪問するバッファを作成し直そうとします。 もちろん、これはファイルを訪問したバッファに対してのみ働きます。
テキストの同じ部分のコピーを頻繁に挿入する場合、 キルリングからヤンクするのは便利ではないでしょう。 というのは、キルするごとに、必要な部分がリングの下方に徐々に 移動してしまうからです。 別の手段としては、レジスタにテキストを保存しておき、 レジスタから取り込むという方法があります。
copy-to-register
)。
insert-register
)。
C-x r s rは、リージョンのテキストのコピーを rという名前のレジスタに保存します。 C-x r s rに数引数を指定すると、 保存すると同時にバッファからテキストを削除します。
C-x r i rはレジスタrからテキストをバッファに挿入します。 通常、テキストの直前にポイントを置き、直後にマークを置きます。 しかし、数引数(C-u)を指定すると、 テキストの直後にポイントを置き、直前にマークを置きます。
レジスタには、連続したテキスト以外にも、矩形領域を保持できます。 矩形領域は、文字列のリストとして表されます。 バッファ内での矩形領域の指定方法に関する基礎情報については、 See Rectangles。
copy-rectangle-to-register
)。
数引数を指定すると、コピー後に矩形領域を削除する。
insert-register
)。
C-x r i rコマンドは、レジスタにテキストが入っていれば、 そのテキストの文字列を挿入しますし、 矩形領域があれば矩形領域を挿入します。
コマンドsort-columns
も参照してください。
このコマンドは矩形領域をソートすると考えられます。
See Sorting。
選択したフレームのウィンドウ構成をレジスタに保存したり、 すべてのフレームのすべてのウィンドウ構成を保存したりできて、 しかも、あとでその構成に戻せます。
window-configuration-to-register
)。
frame-configuration-to-register
)。
ウィンドウやフレームの構成をもとに戻すには、 C-x r j rを使います。 これは、カーソル位置を復元するコマンドと同じです。 フレームの構成を復元すると、 構成情報に含まれていない既存のフレームは隠れた状態になります。 これらのフレームを削除したければ、C-u C-x r j rを使います。
レジスタに数値を保存しておき、数値を10進数でバッファに挿入してから 数値を増やすコマンドがあります。 これらのコマンドは、キーボードマクロで役立ちます (see Keyboard Macros)。
number-to-register
)。
increment-register
)。
C-x r gは、レジスタの数値以外の内容をバッファに挿入するために 使うコマンドと同じです。
特定のファイル名を頻繁に訪問する場合には、 これらの名前をレジスタに置いておくと、 より簡単にファイルを訪問できます。 ファイル名をレジスタに置くLispコードをつぎに示します。
(set-register ?r '(file . name))
たとえば、
(set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog"))
とすると、上に示したファイル名をレジスタz
に保存します。
レジスタrに入れた名前のファイルを訪問するには、 C-x r j rと打ちます。 (このコマンドは、保存位置に移動したり フレーム構成を復元するために使うコマンドと同じ。)
ブックマーク(bookmarks)とは、 移動先の位置を記録しておくためのレジスタのようなものです。 レジスタと違って、長い名前を付けることができて、 自動的につぎのEmacsセッションに引き継がれます。 ブックマークの典型的な使い方は、 各ファイルの『どこを読んでいるか』を記録しておくことです。
bookmark-set
)。
bookmark-jump
)。
list-bookmarks
)。
ブックマークの典型的な使い方は、 各ファイルごとに現在のポイント位置を保存しておくことです。 ブックマークを設定するコマンドC-x r mは、 訪問先のファイルの名前をブックマーク名のデフォルトとして使います。 ブックマークが指すファイルをもとにブックマークの名前を付ければ、 C-x r bで任意のファイルを再訪問して、 同時にブックマーク位置に移動するという操作を楽に行えます。
設定したすべてのブックマークの一覧を別のバッファに表示するには、
C-x r l(list-bookmarks
)と打ちます。
そのバッファに切り替えれば、ブックマークの定義を編集したり、
ブックマークに注記を付けたりできます。
このバッファで使える特別な編集コマンドについての情報を得るには、
このバッファでC-h mと打ちます。
内容を変更したブックマークがある場合、Emacsを終了する時点で、
Emacsはブックマークの値をデフォルトの
ブックマークファイル~/.emacs.bmk
に保存するかどうか聞いてきます。
M-x bookmark-saveコマンドを使っても、
変更したブックマークをいつでも保存できます。
ブックマークコマンドは、個人のデフォルトのブックマークファイルを
自動的に読み込みます。
これらの保存と読み込みによって、
ブックマークの内容をつぎのEmacsセッションに引き継げるのです。
変数bookmark-save-flag
に1を設定しておくと、
ブックマークを設定する各コマンドは、ブックマークの保存も行います。
こうしておけば、Emacsがクラッシュした場合でも、
ブックマークデータを失わなくてすみます。
(この変数の値が数値であれば、
ブックマークを何回変更したら保存するという意味。)
ブックマークの位置情報は、その周辺の文脈情報と一緒に保存されるので、
ファイルが少し変更されていたとしても、
bookmark-jump
は正しい位置をみつけだせます。
変数bookmark-search-size
で、
ブックマーク位置の前後何文字分の内容を保存するかを指定します。
ブックマークを用いるコマンドには、以下のものもあります。
bookmark-write
と同じく、このコマンドを使える。
大きなバッファの一部しかウィンドウには収まりませんから、 Emacsは必要そうな部分を表示しようとします。 画面制御コマンドを使って、 テキストのどの部分を表示したいのか、また、 どのように表示するか指定できます。
バッファを表示しているウィンドウに全部を表示するには 大きすぎるテキストが入っているバッファでは、 Emacsはテキストの連続する一部分を表示します。 表示する部分にはつねにポイントが入っています。
スクロール(scroll)とは、 ウィンドウ内でテキストを上下に動かして、 テキストの異なる部分を表示することです。 前向きのスクロールでは、テキストを上へ移動して、 新たなテキストがウィンドウの最下端から現れます。 後向きのスクロールでは、テキストを下に移動して、 新たなテキストがウィンドウの最上端から現れます。
ポイントをウィンドウの下端や上端を超えて移動すると、 自動的にスクロールします。 本節で紹介するコマンドを使って、明示的にスクロールすることもできます。
recenter
)
scroll-up
)。
scroll-down
)。
recenter
)。
reposition-window
)。
もっとも基本的なスクロールコマンドは、
引数を指定しないC-l(recenter
)です。
このコマンドは、画面全体をクリアして、すべてのウィンドウを再表示します。
さらに、ポイントがウィンドウの中央の行に位置するように、
選択されているウィンドウをスクロールします。
スクロールコマンドC-vとM-vは、
ウィンドウ内の全テキストを上下に何行か移動します。
C-v(scroll-up
)に引数を指定すると、
C-lと同じようにテキストとポイントを一緒に上へ移動して、
追加分(引数分)の行をウィンドウの下部に表示します。
C-vに負の引数を指定した場合は、
ウィンドウの上端に追加分の行を表示します。
M-v(scroll-down
)はC-vに似ていますが、
スクロール方向が逆です。
ファンクションキーの<NEXT>と<PRIOR>は、
C-vとM-vに等価です。
スクロールコマンドの名前は、
ウィンドウ内でテキストを動かす向きに基づいています。
したがって、前向きにスクロールするコマンドは、
画面上ではテキストを上へ移動するため、
scroll-up
と呼ばれます。
一度にウィンドウ1面分のバッファを読んでいくには、
引数を指定せずにC-vを使います。
ウィンドウの下端2行を上端に持っていき、
それに続けてこれまで表示されていなかったほぼ
ウィンドウ1面分の行を表示します。
ポイントがウィンドウの上端より上に出てしまう場合には、
ポイントはウィンドウの新たな上端の行に移動します。
引数を指定しないM-vも同様に、
テキストを重複させながら、後向きに移動します。
C-vやM-vで重複させる行数は、
変数next-screen-context-lines
で制御します。
デフォルトでは2です。
画面上でのポイント位置を保ったまま
1画面分のスクロールを行うコマンドを好むユーザーもいます。
このようにするには、変数scroll-preserve-screen-position
に
nil
以外を設定します。
このモードは、
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です。
水平スクロール(horizontal scrolling)とは、 すべての行をウィンドウ内で横方向に動かすことです。 これにより、左端近くのテキストは表示されなくなります。
scroll-left
)。
scroll-right
)。
ウィンドウが水平方向にスクロールされているときには、
テキスト行を継続(see Continuation Lines)しないで切り捨てます。
テキストの左側を切り捨てているときは最初の桁に$
を表示し、
右側を切り捨てているときには最後の桁に$
を表示します。
コマンドC-x <(scroll-left
)は、
選択されたウィンドウを引数nの桁数だけ左にスクロールします。
各行の最初の部分はウィンドウの左端から出てしまいます。
引数を指定しないと、ほぼウィンドウ幅(正確には2桁少ない桁数)
だけスクロールします。
C-x >(scroll-right
)は、同様に右にスクロールします。
ウィンドウが(各行がウィンドウの左端から始まっている)通常の表示をしていると、
それ以上はスクロールできません。
スクロールさせようとしても何も起こりません。
つまり、C-x >に与える引数を正確に計算する必要はないのです。
十分に大きな引数を指定すれば、通常の表示に戻せます。
水平スクロール(hscroll)モードをオンにすると、 自動的に水平スクロールを行います。 このモードがオンであると、 ポイントが左右端から離れすぎない場所に見えるように Emacsが水平方向にウィンドウをスクロールします。 このモードのオン/オフを切り替えるコマンドは、M-x hscroll-modeです。
追従(follow)モードは、 同じバッファを表示している2つのウィンドウを、 1つの『仮想ウィンドウ』としてスクロールするマイナモードです。 追従(follow)モードを使うには、 ウィンドウが1つだけのフレームに移動して、 C-x 3を使って左右に並んだ2つのウィンドウに分割してから、 M-x follow-modeと打ちます。 これ以後、いずれのウィンドウのバッファでも編集できますし、 どちらをスクロールしてもかまいません。 もう一方のウィンドウは他方に追従します。
追従(follow)モードをオフにするには、もう一度M-x follow-modeを打ちます。
Emacsには、(指定した)桁数以上字下げしてある行を隠す機能があります。 プログラムの一部を概観するのにこの機能を使えます。
行を隠すには、数引数nを指定してC-x $
(set-selective-display
)と打ちます。
これにより、n桁以上字下げしてある行は画面から消えます。
1行以上の不可視行に先行する可視行の末尾には、
3つのドット(...
)を表示します。
この印が不可視行の存在を示す唯一のものです。
コマンドC-nやC-pは、 不可視行が存在しないかのように不可視行を飛び越えて移動します。
不可視行は依然としてバッファ内に存在しています。 たいていの編集コマンドはそれらを通常と同じように扱うので、 隠蔽されたテキスト内にポイントを移動してしまうことも起こりえます。 このような場合、カーソルは先行する行の末尾の3つのドットの直後に 表示されます。 ポイントが可視行の行末の改行文字の直前にあるときには、 3つのドットの直前にカーソルが現れます。
すべての行をふたたび表示するには、引数を指定せずにC-x $を打ちます。
変数selective-display-ellipses
にnil
を設定すると、
不可視行に先行する可視行の末尾には3つのドットを表示しなくなります。
すると、不可視行の存在を示すものは何もありません。
この変数を設定すると、自動的にローカルになります。
行番号(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
ここで、hhとmmは、時分を表し、
つねにam
かpm
が続きます。
l.llは、システム全体で実行中のプロセスの個数の最近の平均数です。
(オペレーティングシステムが情報を提供しなければ、
いくつかの内容が消えていることもある。)
時刻を24時間表示したければ、
変数display-time-24hr-format
にt
を設定します。
負荷レベル表示に続く語Mail
は、
未読のメイルがある場合に表示されます。
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。
本節は、カスタマイズに関する情報のみです。 初心者の方は読み飛ばしてください。
変数mode-line-inverse-video
は、
(端末が反転表示を扱えると仮定して)
モード行を反転表示するかどうかを制御します。
nil
は反転表示しないことを意味します。
See Mode Line。
modeline
フェイスに前景色を指定していて、しかも、
mode-line-inverse-video
がnil
以外であれば、
modeline
フェイスのデフォルトの背景色は通常の前景色です。
See Faces。
変数inverse-video
がnil
以外である場合、
Emacsは画面上のすべての行を通常の状態から反転表示します。
変数visible-bell
がnil
以外の場合、
Emacsは、通常は端末のベルを鳴らす場面では、画面全体を点滅します。
端末に画面を点滅する機能がなければ、この変数は何の効果もありません。
Emacsを休止したあとで再開した場合、通常Emacsは画面をクリアし、
画面全体を再表示します。
ページメモリを複数個備えた端末では、termcapの定義を変更して、
(それぞれ、Emacsを起動するときと抜けるときに端末に出力される)
文字列ti
とte
でページメモリを切り替えて、
1ページをEmacs用に使い、もう1ページを他の出力用に使うようにできます。
そして、変数no-redraw-on-reenter
にnil
以外を設定します。
こうすると、Emacsは、再開時には
最後に出力した内容が画面ページに入っているものと仮定します。
変数echo-keystrokes
は、複数個の文字キーのエコーを制御します。
設定する値は、エコーを開始するまでの待機時間の秒数です。
ゼロを指定するとエコーしません。
See Echo Area。
変数ctl-arrow
にnil
を設定すると、
改行とタブを除いて、バッファ内のコントロール文字を
8進のエスケープシーケンスで表示します。
変数ctl-arrow
の値を変更すると、
この変数はカレントバッファにローカルになります。
それまでは、デフォルトの値が使われます。
デフォルトの初期値はt
です。
See Display Tables。
通常、バッファ内のタブ文字は、つぎのタブストップ位置までの
空白として表示され、タブストップは8個分の空白と同じ間隔です。
タブ1個あたりの空白の文字数は、変数tab-width
で制御します。
この変数もctl-arrow
と同様に、変更するとバッファにローカルになります。
バッファ内のタブ文字をどのように表示するかと、
コマンドとしての<TAB>の定義とは無関係であることに注意してください。
変数tab-width
の値は1以上1000以下の整数である必要があります。
変数truncate-lines
にnil
以外を設定すると、
テキストの各行は表示上は画面の1行を占有します。
テキスト行が長すぎる場合は、画面に収まる範囲だけを表示します。
一方、truncate-lines
にnil
を設定すると、
長いテキスト行は、画面上では2行以上にわたってテキスト行の表示に必要なだけの
行数で表示されます。
See Continuation Lines。
変数truncate-lines
の値を変更すると、
カレントバッファにローカルになります。
それまでは、デフォルトが使われます。
デフォルトの初期値はnil
です。
変数truncate-partial-width-windows
にnil
以外を設定すると、
画面やフレームの幅に満たないウィンドウでは、
テキストの表示方法はtruncate-lines
の値とは無関係に、
継続行ではなく切り捨てて表示します。
左右に並べたウィンドウに関しては、See Split Window。
Displayも
参照してください。
変数baud-rate
は、Emacsにとっての端末の出力速度を保持します。
この変数の値を設定したとしても、
実際のデータ転送速度を変更できるわけではなく、
この値はパディングの計算などに用いられます。
さらに、ウィンドウシステムを使用している場合であっても、
画面の一部をスクロールするのか、再表示するのかの決定にも影響します。
(ウィンドウシステムには正しい『出力速度』がないにしても、
スクロール/再表示を調整できるようにこのように設計してある。)
どんな文字コードの表示方法も、表示テーブルを用いてカスタマイズできます。 See Display Tables。
他のエディタと同様に、Emacsにも文字列を探索するコマンドがあります。 主な探索コマンドがインクリメンタル(incremental)であるという点で、 普通とは違います。 探索したい文字列全体を入力し終えなくても、探索を始めます。 他のエディタの探索コマンドのように、 インクリメンタルでない探索コマンドもあります。
指定した文字列の出現すべてを探し出して別の文字列に置換する、
普通の置換コマンドreplace-string
に加えて、
Emacsにはより高級な、
出現箇所をみつけるたびに置換するかどうか対話的に尋ねる
問い合わせ型置換コマンドquery-replace
もあります。
インクリメンタルサーチでは、 探索文字列の最初の文字を打つとただちに探索を開始します。 探索文字列を入力するたびに、 Emacsは(それまでに入力した)文字列がどこでみつかるか表示します。 目的の箇所を特定するのに十分なだけの文字を打ってしまえば、 そこで終りにできます。 つぎに何をするかにもよりますが、 <RET>で探索を陽に終了する必要がある場合もあります。
isearch-forward
)。
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-q、C-w、C-r、C-s、 C-y、M-y、M-r、M-s)である場合だけです。
FOO
を探してそれがみつかった場合でも、
予期していたFOO
ではないこともあるでしょう。
最初のFOO
以降に、2つめのFOO
があることを
忘れていたような場合です。
このようなときには、さらにC-sを打てば、
探索文字列のつぎの出現箇所に移動できます。
この操作は何度でも繰り返せます。
行き過ぎてしまったときには、<DEL>でC-sの操作を取り消せます。
探索を終了したあとでも、単にC-s C-sと打てば、 ふたたび同じ文字列を探索できます。 つまり、最初のC-sがインクリメンタルサーチを起動して、 つぎのC-sが『再探索』を意味します。
以前に探索した文字列を再利用するには、 探索リング(search ring)を使います。 コマンドM-pとM-nでリング内を移動して、 再利用する文字列を取り出します。 これらのコマンドは、探索リング内の選択した要素をミニバッファに置きますから、 編集することも可能です。 C-sやC-rを打てば、 文字列の編集を終了して探索を開始できます。
探している文字列がまったくみつからなかった場合には、
エコー領域にFailing I-Search
と表示されます。
カーソルは、指定した文字列に可能な限り一致する箇所の直後にあります。
たとえば、FOOT
を探索しようとしたのにFOOT
がなければ、
カーソルはFOOL
のFOO
の直後にあります。
この時点でできることはいくつかあります。
文字列を打ちまちがえたのならば、それを消去して訂正します。
その箇所でよいのなら、『探索したものを受理する』ために、
<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-yとC-wを使って、 バッファから探索文字列へテキストを取り込むことができます。 この機能は、ポイント位置にあるテキストの出現箇所を探すときに便利です。 C-wは、ポイント以降の単語を探索文字列の一部としてコピーし、 ポイントをその単語の末尾に進めます。 探索を繰り返す意味でC-sを打つと、 その単語を含んだ文字列を探索します。 C-yもC-wに似ていますが、 現在行の残りの部分をすべて探索文字列にコピーします。 大文字小文字を区別しない探索では、 C-yとC-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です。
Emacsでは、従来方式の一括型探索コマンドもあります。 探索を開始するまえに探索文字列全体を打っておく必要があります。
一括型探索を実行するには、まずC-s <RET>と打ちます。 すると、探索文字列を読み取るためにミニバッファに移動します。 文字列を<RET>で終えると、探索を開始します。 文字列がみつからなければ、探索コマンドはエラーになります。
C-s <RET>はつぎのように動作します。 まず、C-sがインクリメンタルサーチを起動します。 インクリメンタルサーチは、特別な場合として、 引数が空であったときには一括型探索を起動するようにプログラムしてあります。 (さもなければ、そのような空の引数に意味はない。) C-r <RET>もこのように動作します。
しかし、C-s <RET>で実行される一括型探索は、
search-forward
をただちに呼び出すわけではありません。
まず、つぎの文字が単語探索を指示するC-wであるかどうか調べます。
前向き/後向きの一括型探索は、
コマンドsearch-forward
とsearch-backward
で実装されています。
これらのコマンドは通常と同じようにキーにバインドできます。
インクリメンタルサーチコマンドから呼び出せるようになっているのは、
歴史的な理由、および、
これらの機能にふさわしいキー列を選ぶ労力を削減できるという理由からです。
単語探索は、単語の区切られ方を無視して、単語の列を探索します。 より正確には、空白1個で区切った数個の単語を打ち込むと、 単語と単語のあいだに複数個の空白/改行/句読点があったとしても、 それらの文字列をみつけだすことができます。
単語探索は、テキスト清書系で整形済みの文書を編集する場合に便利です。 整形した印刷出力を見ながら編集する場合、 ソースファイルのどこで行が区切られているのかわかりません。 単語探索を使えば、単語の区切られ方を知らなくても探索できます。
単語探索は、一括型探索の特別な場合であって、 C-s <RET> C-wで起動します。 この入力に続いて、探索文字列を入力し、 文字列はつねに<RET>で終えます。 一括型であるため、単語探索も引数を入力し終えるまで探索を開始しません。 単語探索は、正規表現を構築し、その正規表現で探索を行うことで 動作します。 See Regexp Search。
後向きの単語探索にはC-r <RET> C-wを使います。
前向き/後向きの単語探索は、それぞれ、
コマンドword-search-forward
とword-search-backward
で
実装されています。
これらのコマンドは通常どおりキーに割り当てることができます。
インクリメンタルサーチコマンドから呼び出せるようになっているのは、
歴史的な理由、および、
これらの機能にふさわしいキー列を選ぶ労力を削減できるという理由からです。
正規表現(regular expression、regexpと略す)とは、 一致する可能性がある一連の(無限個でもよい)文字列を表現するパターンです。 GNU Emacsでは、インクリメンタルサーチでも一括型探索でも、 正規表現を用いてつぎの一致箇所を探索できます。
正規表現によるインクリメンタルサーチを実行するには、
C-M-s(isearch-forward-regexp
)と打ちます。
このコマンドは、C-sと同様に、探索文字列を逐次読み取ります。
ただし、探索文字列をバッファのテキストに対して正確に照合するため
のものとみなすのではなく、正規表現として扱います。
探索文字列にテキストを追加するごとに、
正規表現は長くなり、新たな正規表現を探索します。
(値は関係ない)前置引数を指定してC-sを起動しても、
前向きに正規表現の探索を始められます。
後向きに正規表現を探索するには、
C-M-r(isearch-backward-regexp
)を使うか、
前置引数を指定してC-rを使います。
通常のインクリメンタルサーチにおいて特別な機能を持つコントロール文字は、 正規表現のインクリメンタルサーチでも同じ機能を持ちます。 探索の開始直後にC-sやC-rを打つと、 最後のインクリメンタルサーチに用いた正規表現を再度使います。 つまり、正規表現を用いる探索とそうでない探索とには、 それぞれ独立のデフォルトがあるのです。 M-pとM-nで参照できる探索リングも それぞれ別々です。
正規表現のインクリメンタルサーチで<SPC>を打つと、 改行を含めた任意個の白文字に一致します。 ちょうど1個の空白に一致させたいのであれば、 C-q <SPC>と打ちます。
正規表現のインクリメンタルサーチ中に正規表現に文字を加えると、
カーソルをもとに戻して探索し直すことがあります。
たとえば、foo
を探索し終えたときに\|bar
を追加したとします。
最初のbar
が最初のfoo
に先行する場合には、
カーソルはまえに戻ります。
正規表現の一括型探索は、関数re-search-forward
と
re-search-backward
で行われます。
これらは、M-xで呼び出したり、キーに割り当てたり、あるいは、
C-M-s <RET>やC-M-r <RET>として
正規表現のインクリメンタルサーチの方法で起動したりできます。
正規表現のインクリメンタルサーチコマンドに前置引数を指定すると、
isearch-forward
やisearch-backward
のように、
普通の文字列探索を行います。
See Incremental Search。
正規表現には、特別な使い方をする少数の文字と
その他の普通の文字から成る構文があります。
普通の文字は、
同じ文字だけに一致してそれ以外には一致しない単純な正規表現です。
特別な文字は、$
、^
、.
、*
、+
、
?
、[
、]
、および、\
です。
\
が先行する場合を除いて、
正規表現に現れるこれら以外の文字は普通の文字です。
たとえば、f
は特別な文字ではなく、通常の文字ですから、
文字列f
に一致してそれ以外の文字列には一致しない正規表現です。
(これは、文字列ff
には一致しない。)
同様に、o
は、o
だけに一致する正規表現です。
(大文字小文字を区別しない場合、
これらの正規表現はF
やO
にも一致するが、
これらは例外というよりは、『同じ文字列』の一般化として捉える。)
任意の2つの正規表現aとbを連結できます。 その結果は、aが文字列の始めの適当な部分に一致して、かつ、 bが文字列の残りの部分に一致する場合に、 文字列に一致するような正規表現です。
簡単な例として、正規表現f
とo
を連結すると、
正規表現fo
を得ますが、
これは文字列fo
だけに一致します。
簡単ですね。
多少とも複雑なことを行うには、特別な文字を使う必要があります。
以下にその一覧をあげます。
a.b
のような正規表現を作れる。
これは、a
で始まりb
で終る任意の3文字の文字列に一致する。
o
が存在しない場合も含めて)
o*
は任意個のo
に一致する。
*
はつねに先行する最小の正規表現に適用される。
したがって、fo*
はfo
を繰り返すのではなく、
o
を繰り返す。
この正規表現はf
、fo
、foo
などに一致する。
*
を用いた構成は、一致を処理するときには、
ただちに得られる限りの反復回数に展開される。
そうしてから、残りのパターンを処理する。
一致に失敗すると、バックトラック(後戻り)が発生して、
*
を用いた構成の反復回数を減らして、
パターンの残りの部分が一致するようにする。
たとえば、文字列caaar
に対して
ca*ar
を一致させることを考えてみる。
始めに、a*
を3つのa
すべてに一致させようとする。
しかし、残りのパターンがar
なのにr
しか残っていないため、
この試みは失敗する。
そこで、つぎはa*
をa
2つだけに一致させる。
こうすると、残りの正規表現も正しく一致する。
*
に似た後置演算子だが、
直前の正規表現に1回以上一致する必要がある。
たとえば、ca+r
は、文字列car
やcaaaar
には一致するが、
文字列cr
には一致ない。
ca*r
の場合は、上記の3つすべてに一致する。
*
に似た後置演算子だが、
直前の正規表現に1回だけ一致するか、あるいは、1回も一致しない。
たとえば、ca?r
は、car
やcr
に一致するが、
他のものには一致しない。
[
で始まり]
で終る文字集合を表す。
もっとも単純な場合は、
この2つの中括弧のあいだにある文字の1つ1つがこの文字集合に一致する。
したがって、[ad]
は、a
1文字かd
1文字のどちらにも一致する。
[ad]*
は、a
とd
だけから成る
(空の文字列を含む)任意の文字列に一致する。
このことから、c[ad]*r
は、
cr
、car
、cdr
、caddaar
などに一致することがわかる。
文字集合には、文字範囲の指定を含めることもでき、
始めの文字と終りの文字のあいだに-
を書く。
つまり、[a-z]
はすべてのASCII小文字に一致する。
範囲指定と個々の文字を自由に織り混ぜてよく、
[a-z$%.]
のように書ける。
これは、任意のASCII小文字、$
、%
、ピリオドに一致する。
文字集合の内側では、正規表現の通常の特別な文字を
特別扱いしないことに注意。
文字集合の内側では、まったく別の特別な文字、
]
、-
、および、^
が存在する。
文字集合に]
を含めるには、
]
を最初の文字として指定する必要がある。
たとえば、[]a]
は、]
やa
に一致する。
-
を含めるのであれば、-
を文字集合の最初の文字か
最後の文字として指定して、範囲指定のあとに置く。
したがって、[]-]
は、]
と-
の両方に一致する。
文字集合に^
を含めるには、^
を文字集合の2番目以降に置く。
大文字小文字を区別する探索で文字範囲を指定するときは、
範囲の両端を、大文字だけ、小文字だけ、あるいは、
英字以外だけで書くべきである。
A-z
のような大文字小文字を混ぜた文字範囲の動作は、
定義が明確ではなく、将来のEmacsでは変更するかもしれない。
[^
は文字の補集合の始まりを意味し、
指定した文字を除く任意の文字に一致する。
すなわち、[^a-z0-9A-Z]
は、
英文字と数字を除くすべての文字に一致する。
^
は先頭になければ文字集合では特別な意味を持たない。
^
に続く文字は先頭にあるものとして扱われる
(いいかえれば、ここでは-
や]
は特別な意味を持たない)。
文字の補集合は、一致しない文字として改行を指定しない限り、改行にも一致する。
この点は、grep
のようなプログラムでの正規表現の扱い方と対照的。
^foo
は、行頭にあるfoo
に一致する。
^
と似ていて、行末のみに一致する。
したがって、x+$
は、
行末にある1文字以上のx
から成る文字列に一致する。
\
を含む)特別な文字をクォートする(意味を抑える)ことと、
特別な構成を導入すること。
\
は特別な文字をクォートするので、
\$
は文字$
だけに一致する正規表現、
\[
は文字[
だけに一致する正規表現、
というようになる。
注意:
従来との互換性のために、特別な文字が、
それらの特別な意味をなしえない文脈で使われた場合には、
普通の文字として扱われます。
たとえば、*foo
では、*
の対象となる正規表現が直前にないため、
*
は普通の文字として扱われます。
このようなふるまいに依存することはよい習慣ではありません。
特別な文字を書く位置に関係なく特別な文字はクォートするべきです。
多くの場合、任意の文字を伴う\
はその文字だけに一致します。
しかし、いくつか例外があって、
\
で始まる2文字列が特別な意味を持つ場合があります。
2文字目にくる文字は、
単独で使った場合には普通の文字として扱われるものです。
以下に\
の構成を列挙します。
\|
をあいだに伴った2つの正規表現aとbは、
aかbのいずれかに一致する文字列に一致する正規表現となる。
したがって、foo\|bar
は、foo
かbar
に一致するが、
それ以外の文字列には一致しない。
\|
は、周囲にある適用しうる正規表現の中でも最大のものに適用される。
\|
によるグループ化を制限するのは、
これを囲む\( ... \)
によるグループ化だけ。
何度\|
を使っても処理できるだけの十分なバックトラック能力がある。
\|
を括る。
したがって、\(foo\|bar\)x
は、
foox
かbarx
のいずれかに一致する。
*
、+
、?
を適用できるように、
複雑な正規表現を括る。
したがって、ba\(na\)*
は、
bananana
のように、(0個以上の)任意個の
文字列na
に一致する。
最後の使い方は、括弧によるグループ化という考え方から
派生したものではない。
同一の\( ... \)
構成に与えた2つめの別の機能である。
実用上、これら2つの意味が混同されることはない。
\( ... \)
に一致したテキストと
同じテキストに一致する。
一致を処理するときには、\( ... \)
構成の末尾に達すると、
この構成に一致したテキストの始めと終りを記録する。
そして、正規表現のそれよりうしろでは、
『d番目に現れた\( ... \)
に一致したテキスト』という意味で
\
に続けて数字dを使える。
1つの正規表現内に現れる最初の9個の\( ... \)
に一致する文字列には、
正規表現中で開き括弧が現れた順に、1から9までの番号を割りふる。
そのため、\1
から\9
で、
対応する\( ... \)
に一致したテキストを参照できる。
たとえば、\(.*\)\1
は、改行を含まない文字列で、かつ、
前半と後半が同一である文字列に一致する。
\(.*\)
は前半部分に一致し、それはどのようなものでもかまわない。
一方、それに続く\1
は、
前半部分とまったく同じテキストに一致しなければならない。
ある\( ... \)
が、
(直後に*
がある場合などに簡単に起こりえる)
複数回一致する場合には、最後に一致したものだけを記録する。
\bfoo\b
は、単語として独立して現れるfoo
に一致する。
\bballs?\b
は、単語として独立して現れる
ball
やballs
に一致する。
\b
は、
バッファの先頭や末尾にあるテキストとは無関係に、
バッファの先頭や末尾にも一致する。
\<
は、単語構成文字が続く場合に限って、
バッファの先頭にも一致する。
\>
は、単語構成文字で終了している場合に限って、
バッファの末尾にも一致する。
w
は単語構成要素を、
-
は白文字を、(
は開き括弧を表すといった具合。
(改行を含む)白文字は、-
や空白で表す。
単語や構文に関連する構成要素は、 構文テーブル(see Syntax)の設定で制御されます。
複雑な正規表現を以下に示します。
これは、任意個の白文字がうしろに続く文末を認識するためにEmacsが使うものです。
空白とタブ文字を区別できるように、Lispの構文で示してあります。
Lisp構文では、文字列定数はダブルクォートで始まり、
ダブルクォートで終ります。
\"
は正規表現の一部としてのダブルクォートを表し、
\\
は正規表現の一部としてのバックスラッシュを表します。
\t
はタブ文字、\n
は改行文字を表します。
"[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*"
この正規表現は4つの部分が繋がってできています。
ピリオド、?
、!
のいずれかに一致する文字集合。
閉じ中括、2種類の引用符、括弧に一致する文字集合の任意回数の繰り返し。
バックスラッシュ付きの括弧で括った、
行末、タブ、空白2つのいずれかに一致する選択肢。
白文字に一致する文字集合の任意回数の繰り返し。
これと同じ正規表現を対話的に入力するときには、 タブを入力するには<TAB>を打ち、 改行を入力するにはC-jを打ちます。 また、Lisp構文上ではバックスラッシュを2つ続けてますが、 対話的に入力するには、1つのバックスラッシュだけを打ちます。
Emacsのインクリメンタルサーチでは、小文字だけで探索文字列を指定すると、
探索対象のテキストの大文字小文字の違いを通常無視します。
したがって、foo
を探索するように指定すると、
Foo
にもfoo
にも一致します。
正規表現、特に文字集合の場合でも同様です。
[ab]
は、a
、A
、b
、B
のいずれにも一致します。
インクリメンタルサーチする探索文字列のどこかに大文字があると、
大文字小文字を区別して探索します。
したがって、Foo
の探索では、
foo
やFOO
をみつけだせません。
このことは、文字列の探索だけでなく正規表現の探索にもあてはまります。
探索文字列から大文字を消去すれば、この効果はなくなります。
変数case-fold-search
にnil
を設定すれば、
大文字小文字の違いを含めて、すべての文字はそのとおりに一致するようになります。
これは、バッファごとの変数です。
変数を変更してもカレントバッファだけに影響しますが、
変更可能なデフォルトの値があります。
See Locals。
この変数は、置換コマンド(see Replace)や
ミニバッファの履歴探索コマンド(see Minibuffer History)が
行う探索を含む、一括型探索にも適用されます。
大域的な探索置換操作は、他のエディタ 13 で必要なほどEmacsでは必要はありませんが、Emacsでも使えます。 多くのエディタにあるような単純なコマンドM-x replace-stringの他にも、 パターンの各出現ごとに置換するかどうか尋ねてくる M-x query-replaceコマンドがあります。
置換コマンドは、通常、ポイントからバッファの末尾までのテキストを操作します。
しかし、暫定マーク(transient-mark)モードでは、
マークが活性である場合にはリージョンを操作します。
置換コマンドはどれも、
1つの文字列(や正規表現)を1つの置換文字列に置き換えます。
コマンドexpand-region-abbrevs
(see Expanding Abbrevs)を使って、
いくつかの置き換えを並行に行うことができます。
ポイント以降にあるfoo
のすべての出現を
bar
で置き換えるには、2つの引数foo
とbar
を指定した
コマンドM-x replace-stringを使います。
置換はポイント以降でのみ実施されますから、
バッファ全体に対して置換を行いたいときには、
まずバッファの先頭に移動しておく必要があります。
バッファの末尾までに現れるすべての出現を置換します。
バッファの一部に置換を限定したいときには、
置換を実行するまえに、バッファの当該部分にナロイングしておきます
(see Narrowing)。
暫定マーク(transient-mark)モードにおいては、
リージョンが活性のときには、置換はリージョン内に限定されます。
replace-string
を終了すると、
ポイントは最後に置換した出現箇所に置かれます。
マークは(replace-string
コマンドを起動したとき)
以前のポイント位置に設定されます。
その位置に戻るにはC-u C-<SPC>を使います。
数引数を指定すると、 単語区切りで囲まれた出現だけを置換対象とします。 引数の値は関係ありません。
M-x replace-stringコマンドは、 1つの文字列に正確に一致するものだけを置き換えます。 これに類似したコマンドM-x replace-regexpは、 指定したパターンに一致する任意のものを置き換えます。
replace-regexp
では、
newstringが定数である必要はありません。
regexpに一致したものの全体あるいはその一部を参照できます。
newstringの中の\&
は、
置換対象の文字列全体(つまり、regexpに一致したものの全体)を
表します。
newstringの中の\d
(dは数字)は、
regexpの中のd番目の括弧のグループ化部分に
一致した部分を表します。
置き換えるテキスト内に\
を含めるには、
\\
と入力する必要があります。
M-x replace-regexp <RET> c[ad]+r <RET> \&-safe <RET>
たとえばこの例は、cadr
をcadr-safe
で、
cddr
をcddr-safe
で置換します。
M-x replace-regexp <RET> \(c[ad]+r\)-safe <RET> \1 <RET>
この例は、逆の置換を行います。
置換コマンドの第1引数がすべて小文字である場合、
case-fold-search
がnil
以外であるときには、
大文字小文字を区別せずに置換対象を探索します。
case-fold-search
がnil
であるときには、
すべての探索において大文字小文字を区別します。
さらに、引数newstringが、すべて小文字、あるいは、 一部が小文字のときには、置換コマンドは、 各置換対象の大文字小文字のパターンを保存しようとします。 つまり、コマンド
M-x replace-string <RET> foo <RET> bar <RET>
は、小文字のfoo
を小文字のbar
に、
すべて大文字のFOO
をBAR
に、
大文字で始まるFoo
をBar
に置換します。
(replace-string
が区別できるのは、これら3つの選択肢、
つまり、小文字のみ、すべて大文字、大文字で始まるだけ。)
置換文字列に大文字を使ったときには、
これを挿入するときは大文字は大文字のままです。
第1引数に大文字を使ったときには、
第2引数では大文字小文字を変換せずにつねに指定どおりに置き換えます。
同様に、case-replace
やcase-fold-search
に
nil
を設定すると、
大文字小文字を変換せずに置換します。
foo
のすべての出現ではなく、
そのうちのいくつかだけをbar
に変更したいときには、
通常のreplace-string
を使うことはできません。
かわりに、M-%(query-replace
)を使います。
このコマンドはfoo
の出現をみつけるたびに、
その出現を表示し、置換するかどうか聞いてきます。
query-replace
に数引数を指定すると、
単語区切り文字で区切られた出現だけを対象とします。
通常どおりcase-replace
がnil
以外であれば、
replace-string
と同じく、
このコマンドも大文字小文字の違いを保存します。
問い合わせることを除けば、
query-replace
はreplace-string
と同様に動作し、
query-replace-regexp
はreplace-regexp
と同様に動作します。
このコマンドは、C-M-%で実行できます。
stringの出現やregexpに一致したものが表示されたときに 打てる文字はつぎのとおりです。
この時点では、C-r(下記参照)を打って、置換したテキストを変更できる。
また、C-x uと打って、置換をアンドゥする(もとに戻す)こともできるが、
そうすると、query-replace
を終了してしまう。
さらに先の置換を行いたいときには、
C-x <ESC> <ESC> <RET>を使って再開する必要がある
(see Repetition)。
query-replace
は直前の1つの置換位置だけを記録するため、
^を続けて入力しても意味はない。
上記のコマンドの別名である文字が他にもいくつかあります。 y、n、qは、それぞれ、 <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も参照してください。
正規表現に一致するものをみつけるコマンドは、他にもいくつかあります。
それらは、ポイント位置からバッファの末尾までを操作対象とします。
さらに、パターンに大文字が含まれていないときや、
case-fold-search
がnil
以外であるときには、
大文字小文字の違いを無視して一致を探します。
出力を表示したバッファ*Occur*
は、
もとの文脈での出現位置を探すためのメニューとして機能する。
*Occur*
に表示された出現をMouse-2でクリックするか、あるいは、
ポイントをそこに置いて<RET>を打つ。
この操作により、探索を行ったバッファに切り替え、
選択した出現のもとの位置にポイントを移動する。
さらに、Emacsからgrep
を使って、
一連のファイルに対して正規表現に一致するものを探して、
一致するものを含むファイルを順番に、あるいは、
任意の順に訪問できます。
See Grep Searching。
本章では、入力直後にテキストのまちがいに気づいたとき、 あるいは、テキストを作成中に気が変わったときに 特に便利なコマンドを説明します。
まちがった編集を訂正するもっとも基本的なコマンドは、アンドゥコマンド、
C-x uやC-_です。
このコマンドは、(通常)1つのコマンド、
コマンドの一部分(query-replace
の場合)、
いくつかの連続した自己挿入文字をアンドゥします。
C-_やC-x uを連続して繰り返すと、
アンドゥ情報がある限り、次々と以前の変更をアンドゥします。
より詳しくは、See Undo。
delete-backward-char
)。
backward-kill-word
)。
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-yやM-yで戻せるように保存します。 See Yanking。
何を打とうとしているのか混乱したりわからなくなったりしたときには、 打ちまちがいがたとえ数文字であってもM-<DEL>はとても便利です。 このような場合、画面を見ながらでないと<DEL>では訂正できません。 M-<DEL>ならば、ほとんど何も考えずに単語全体をキルして、 入力を再開できます。
transpose-chars
)。
transpose-words
)。
transpose-sexps
)。
transpose-lines
)。
2つの文字を入れ替えてしまうというよくあるまちがいは、
それらが隣接しているならば、
C-tコマンド(transpose-chars
)で直せます。
通常、C-tは、ポイントの両側にある文字を入れ替えます。
行末では、行末の文字と改行文字を入れ替えるという役に立たない
ことではなくて、C-tはその行の最後の2文字を入れ替えます。
よって、入れ替えまちがいにすぐに気づいたなら、
C-tだけで訂正できます。
まちがいにすぐに気づかなかったときには、
2つの入れ替わっている文字のあいだにカーソルを移動する必要があります。
空白とそのまえの単語の最後の文字とを入れ替えてしまったときには、
単語移動コマンドでその場所へ戻るのがよいでしょう。
それ以外の場合には、後向き探索(C-r)が最良であることがままあります。
See Search。
M-t(transpose-words
)は、
ポイントの直前の単語とポイントの直後の単語を入れ替えます。
ポイントは単語を1つ前向きに横断し、
ポイントの直前の単語かポイントを含む単語を前向きに引きずっていきます。
単語のあいだにある句読点文字は動きません。
たとえば、FOO, BAR
はBAR FOO,
ではなくて、
BAR, FOO
と入れ替わります。
C-M-t(transpose-sexps
)は、2つの式(see Lists)を
入れ替えるコマンドです。
また、C-x C-t(transpose-lines
)は、行を入れ替えます。
これらのコマンドはM-tに似た動作をしますが、
テキストを構文単位に分ける点が異なります。
入れ替えコマンドに数引数を指定すると、反復回数になります。
ポイントの直前やポイントを含む文字(単語、S式、行)を
いくつ先の文字(単語、S式、行)へ移動するか指定します。
たとえば、C-u 3 C-tは、ポイントの直前の文字を3文字先の文字へ移動します。
つまり、f-!-oobar
をoobf-!-ar
にします。
これは C-tを3回繰り返したのと同じことです。
C-u - 4 M-tは、ポイントの直前の単語を4つまえの単語へ移動します。
C-u - C-M-tは、引数を指定しないC-M-tの効果を打ち消します。
数引数0には特別な意味があります (さもないと、コマンドを0回繰り返しても何もしない)。 ポイントの直後の文字(単語、S式、行)と マークの直後の文字(単語、S式、行)を入れ替えます。
とてもよくあるまちがいは、単語を打つときに大文字小文字をまちがうことです。 このため、単語の大文字小文字を変換するコマンド、 M-l、M-u、M-cに負の引数を指定すると、 カーソル(ポイント)を移動しないという特別な機能があります。 単語を打ちまちがえたとすぐに気づいたときには、 単に大文字小文字を変換して、入力を続けられます。 See Case。
本節では、1つの単語やバッファのある部分の綴りを検査するコマンドを説明します。 これらのコマンドは、Emacsの一部ではない綴り検査プログラム (スペルチェッカ)ispellを 使って動作します。
ispell-word
)。
ispell-complete-word
)。
フライスペル(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を使います。 これは、バッファ全体を検査しますが、 字下げしてある部分や他のメッセージからの引用と思われる部分は検査しません。
これらのコマンドは、正しくない単語に出会うたびに、どうするか聞いてきます。 通常、検査した単語に似ている『近い』単語をいくつか含めた 選択肢一覧を表示します。 そうしたら、文字を打たなくてはなりません。 以下に有効な返答をあげます。
query-replace
を実行する。
*
を使うこともできる。
テキスト(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サブプロセスを再起動します。
オペレーティングシステムは、 データを指定したファイル(file)に恒久的に保存します。 ですから、Emacsで編集するテキストの多くはファイルから取り込み、 最終的にはファイルに格納されます。
ファイルを編集するには、 Emacsに対してファイルを読むように指示して、 ファイルの内容のコピーを入れたバッファを用意させる必要があります。 これを、ファイルを訪問する/訪れる(visiting)といいます。 編集コマンドはバッファ内のテキストに直接作用します。 つまり、Emacs内にあるコピーを操作します。 バッファをファイルに保存(save)した場合に限り、 変更はファイルそのものに反映されます。
ファイルを訪問したり保存したりすることに加えて、 Emacsは、ファイルを、削除したり、コピーしたり、名前を変更したり、 別のファイルへ追加したり、複数の版を保持したり、 ファイルディレクトリを操作したりできます。
ファイルを操作するほとんどの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-directory
をnil
に設定すると、
デフォルトディレクトリを挿入しません。
ミニバッファで入力するとき、
テキストの一部として入っているデフォルトディレクトリを無視して、
絶対ファイル名を打っても何の問題もありません。
最終的なミニバッファの内容は不正なように見えても、
そうではありません。
たとえば、ミニバッファには/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-system
にnil
以外を設定すると、
ファイル名に非ASCIIを含めることができます。
See Specify Coding。
find-file
)。
find-file-read-only
)。
find-alternate-file
)。
find-file-other-window
)。
選択されているウィンドウに表示されている内容は変化しない。
find-file-other-frame
)。
選択されているフレームに表示されている内容は変化しない。
ファイルを訪問する/訪れるとは、
ファイルの内容のコピーを編集できるようにEmacsバッファに入れることです。
Emacsは、訪問する各ファイルごとに新たにバッファを作ります。
バッファ名は、ディレクトリ部分を取りさったファイル名から作ります。
たとえば、ファイル名/usr/rms/emacs.tex
の
バッファ名はemacs.tex
となります。
その名前のバッファがすでに存在するならば、
まだ使われていない名前になるようなもっとも小さい数を使って、
<2>
, <3>
などを付加して唯一の名前を作ります。
各ウィンドウのモード行にはウィンドウ内に表示している バッファ名が示されているので、 編集しているバッファが何かいつでもわかります。
編集コマンドによる変更は、Emacsバッファに対して行われます。 バッファを保存するまでは、 変更は、訪問先のファイルや他のどんな恒久的なものにも影響しません。 バッファを保存するとは、 バッファの現在の内容をそのバッファの訪問先のファイルに書き出すことです。 See Saving。
バッファに未保存の変更がある場合、 バッファは変更されているといいます。 バッファを保存しないと変更内容が失われてしまうので、 これは重要なことです。 モード行の左端近くに2個の星印を表示して、 バッファが変更されていることを示します。
ファイルを訪問するには、コマンドC-x C-f(find-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-dired
がnil
ならば、
ディレクトリを訪問しようとするとエラーになります。
指定したファイル名にワイルドカード文字が含まれていると、 Emacsは一致するすべてのファイルを訪問します。 ワイルドカード文字そのものを含む名前のファイルを訪問するには、 See Quoted File Names。
オペレーティングシステムが変更を許さないファイルを訪問すると、
Emacsはバッファを読み出し専用に設定するので、
修正できなかったり、修正できてもあとで保存に手間取ります。
C-x C-q(vc-toggle-read-only
)で、
バッファを書き込み可能にできます。
See Misc Buffer。
ときには、自分でまちがって変更しないように、
ファイルを読み出し専用で訪問したい場合があります。
そういう場合には、コマンドC-x C-r(find-file-read-only
)で
ファイルを訪問します。
(ファイル名をまちがって打ったりして)
存在しないファイルを意図せずに訪問してしまったときには、
C-x C-vコマンド(find-alternate-file
)を使って
本当の目的のファイルを訪問します。
C-x C-vはC-x C-fと同様ですが、
(バッファが変更されていればまず保存するかどうか聞いてから)
カレントバッファを消去します。
訪問するファイル名を読むときには、
ミニバッファにデフォルトファイル名全体を挿入し、
ディレクトリ部分の直後にポイントを置きます。
これは、ファイル名をほんの少しまちがって入力したときに便利です。
存在するのに読めないファイルを訪問すると、 C-x C-fはエラーを通知します。
C-x 4 f(find-file-other-window
)は、
別のウィンドウで、指定したファイルを入れたバッファを選択することを除けば、
C-x C-fと同じです。
C-x 4 fを実行するまえに選択されていたウィンドウは、
同じバッファを表示したままです。
ウィンドウを1つだけ表示しているときにこのコマンドを使うと、
そのウィンドウを2つに分けて、一方のウィンドウにはまえと同様に同じバッファを
表示しますが、もう一方には新たに指示したファイルを表示します。
See Windows。
C-x 5 f(find-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)を 定義する方法がいくつかあります。
Emacsにおいてバッファを保存するとは、 バッファの内容をそのバッファの訪問先のファイルへ書き戻すことです。
save-buffer
)。
save-some-buffers
)。
not-modified
)。
write-file
)。
ファイルを保存して変更を恒久的なものとするには、
C-x C-s(save-buffer
)と打ちます。
保存を完了するとC-x C-sはつぎのようなメッセージを表示します。
Wrote /u/rms/gnu/gnu.tasks
選択されているバッファが変更されていなければ (バッファを作って以降、あるいは、最後に保存して以降に、変更されていない)、 保存しても何もならないので実際には保存しません。 かわりに、C-x C-sはつぎのようなメッセージをエコー領域に表示します。
(No changes need to be saved)
コマンドC-x s(save-some-buffers
)は、
変更された任意のバッファやすべてのバッファを保存できるようにします。
各バッファについて、何をするか聞いてきます。
このとき選べる返答は、query-replace
に対するものに似ています。
save-some-buffers
を終了する。
save-some-buffers
を終える。
save-some-buffers
に戻りふたたび質問する。
Emacsから抜けるキー列C-x C-cは、
save-some-buffers
を起動するので、同じ質問をしてきます。
バッファを変更したけれども変更を保存したくないならば、
それを避けるための処置をすべきでしょう。
そうしないと、C-x sやC-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-w(write-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-newline
がnil
以外だと、
Emacsはファイルを保存するたびに、
ファイルの末尾に改行がなければ改行を挿入します。
デフォルトはnil
です。
多くのオペレーティングシステムでは、 ファイルを書き換えるとファイルに入っていたそれまでの記録は 自動的に破棄されます。 したがって、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つバックアップファイルを作るように準備します。
単一バックアップファイルを作ることを選択すると(デフォルト)、
バックアップファイルの名前は、
編集しているファイルの名前に~
を付加したものになります。
したがって、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
を設定します。
環境変数の値がt
かnumbered
なら、
version-control
はt
になります。
環境変数の値がnil
かexisting
なら、
version-control
はnil
になります。
環境変数の値がnever
かsimple
なら、
version-control
はnever
になります。
ディスク容量を無限に浪費することを避けるために、 Emacsは番号付きバックアップの版を自動的に削除できます。 一般には、Emacsは始めの数個と最新の数個のバックアップを残して、 そのあいだのものをすべて削除します。 これは、新たにバックアップを作るごとに行われます。
2つの変数kept-old-versions
とkept-new-versions
は、
このような削除を制御します。
それらの値は、それぞれ、新たにバックアップを作るときに、
保持すべき最古(番号が最小)のバックアップの個数、
保持すべき最新(番号が最大)のバックアップの個数です。
それらの値は、バックアップの新版を作った直後に使われることに
注意してください。
新たに作ったバックアップも、kept-new-versions
の数に含まれます。
デフォルトでは、どちらの変数も2です。
delete-old-versions
がnil
以外ならば、
何もいわずに余分な中間の版を削除します。
デフォルト値であるnil
ならば、
余分な中間の版を削除するかどうかを聞いてきます。
diredの.(ピリオド)コマンドも古い版を削除するために使えます。 See Dired Deletion。
バックアップファイルは、古いファイルをコピーする、あるいは、 それを改名することで作ります。 古いファイルに複数の名前があると、これには違いが出てきます。 古いファイルを改名してバックアップファイルにすると、 (古いファイルの)別の名前もバックアップファイルを指します。 古いファイルをコピーした場合には、 (古いファイルの)別の名前は編集しているファイルを指し続け、 その名前で参照される内容も新しい内容になります。
バックアップファイルを作る方法は、 元ファイルの所有者とグループにも影響します。 コピーするならば、何も変更されません。 改名すると、ファイルの所有者はあなたになり、 ファイルのグループはデフォルトになります (オペレーティングシステムごとにグループのデフォルトは異なる)。
所有者を変更することは、多くの場合、よいことです。
というのは、所有者がつねに最後にファイルを編集した人を表すからです。
同様に、バックアップの所有者はその版を作った人を表します。
ときには、ファイルの所有者を変更すべきでないファイルがあります。
そのようなファイルについては、
backup-by-copying-when-mismatch
をローカルに設定する
ローカル変数リストをファイルに入れておくのがよいです。
改名するかコピーするかは、3つの変数で制御されます。
デフォルトは、改名です。
変数backup-by-copying
がnil
以外ならばコピーします。
nil
のときには、
変数backup-by-copying-when-linked
がnil
以外ならば、
複数の名前を持つファイルではコピーし、
編集中のファイルには名前が1つだけなら改名します。
変数backup-by-copying-when-mismatch
がnil
以外のときには、
改名するとファイルの所有者やグループが変更されるときにはコピーします。
スーパーユーザーでEmacsを起動すると、
backup-by-copying-when-mismatch
のデフォルトはt
です。
ファイルを版管理システム(see Version Control)で管理している場合には、 通常Emacsはそのファイルのバックアップを通常の方法では作りません。 チェックインとチェックアウトは、 ある意味でバックアップを作ることに似ています。 残念なことに、 これらの操作は典型的にはハードリンクを切るという 類似性があります。 つまり、あるファイルの別の名前を使っていたとすると そのファイル名がなくなるのです。 Emacsにできることはありません。 版管理システムが処理します。
2人のユーザーが同じファイルを訪問し、両者がそれを編集し、 両者がそれを保存すると、同時編集が発生します。 こういったことが起きていることを誰も知らせなければ、 最初に保存したユーザーは、あとになって自分の変更が失われていることを知るでしょう。
ある種のシステムでは、2人目のユーザーがファイルを変更し始めたことを Emacsがただちに検知して警告を発します。 すべてのシステムでは、ファイルを保存するときにEmacsが検査して、 他人の変更を上書きしようとしているならば警告します。 ファイルを保存するかわりに適切な修正操作を行えば、 他人の作業結果を失うことを避けられます。
ファイルを訪問しているEmacsバッファで初めて修正を行うと、 Emacsはそのユーザーがファイルをロックしたと記録します。 (同じディレクトリ内に異なる名前のシンボリックリンクを作ることで実現する。) 変更を保存するとEmacsはロックを消します。 つまり、ファイルを訪問しているEmacsバッファに未保存の変更があるときには ファイルをロックしておくのです。
他人がロックしているファイルを訪問先とするバッファを
修正し始めると衝突が起こります。
Emacsが衝突を検知すると、Lisp関数ask-user-about-lock
を呼び出して、
どうするかを聞いてきます。
この関数をカスタマイズのために再定義することもできます。
この関数の標準の定義では、ユーザーに質問をし、3つの返答を受理します。
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つのファイルを比較することでしょう。
広範囲にファイルを変更したあとで気が変わったときには、 そのような変更を捨てるためにファイルのまえの版を読み込みます。 これには、カレントバッファに作用する M-x revert-bufferを使います。 意図せずにバッファを復元することは、 たくさんの作業結果を失うことになるので、 このコマンドにはyesで確認を与える必要があります。
revert-buffer
は、ファイルの先頭から同じ距離(文字数)に
ポイントを保ちます。
少し編集しただけなら、復元前後のポイント位置はだいたい同じ部分にあります。
徹底的に変更してしまったときには、
古いファイルでのポイント位置では
まったく異なるテキスト部分に位置付けるでしょう。
復元すると、改めて変更するまでは、 そのバッファには『変更なし』の印が付きます。
diredバッファのように、ファイル以外のデータを反映するバッファでも
復元できる場合があります。
その場合、復元とは、適切なデータに基づいて内容を計算し直すことを意味します。
C-x bで明示的に作ったバッファを復元することはできません。
そういった指示をすると、revert-buffer
はエラーを報告します。
自動的にかつ頻繁に変更されるファイル、 たとえば、実行中のプロセスから出力されるログ、 を編集するときには、C-x C-fでファイルを再訪問すると 何も聞かずにファイルを復元できると便利です。
こういったふるまいを指示するには、
変数revert-without-query
に正規表現のリストを設定します。
これらの正規表現の1つにファイル名が一致すると、
find-file
とrevert-buffer
は、
バッファが変更されていない限り、
そのファイルが変更されていても復元します。
(テキストを編集してしまったときには、
変更を捨てさるのはまちがっている。)
Emacsは(打鍵数に基づいて)定期的に、 訪問しているすべてのファイルを何も聞かずに保存します。 これを自動保存(auot-saving)と呼びます。 これは、システムがクラッシュしたときに 失ってしまう作業結果をある程度以下に制限します。
自動保存を実施する時間になるとEmacsは各バッファを調べて、
そのバッファに自動保存が指定されていて、かつ、
最後に自動保存した以後に変更されている場合は、
そのバッファを自動保存します。
実際にファイルを自動保存すると、
エコー領域にメッセージAuto-saving...
を表示します。
自動保存の最中に発生したエラーは捕獲されるので、
打ち込んだコマンドの実行に干渉することはありません。
自動保存は、通常、訪問先のファイルそのものへは保存しません。 というのは、予定の半分を変更しただけでプログラムにまだ一貫性がないのに 保存してしまうのは望ましくないからです。 そのかわりに自動保存ファイルと呼ばれる別のファイルに自動保存し、 (C-x C-sなどで)明示的に保存するよう指示されたときだけ、 訪問先のファイルに保存します。
通常、自動保存ファイルの名前は、訪問先のファイルの名前の前後に
#
を付加したものです。
したがって、ファイルfoo.c
を訪問したバッファは、
ファイル#foo.c#
に自動保存されます。
ファイルを訪問していないほとんどのバッファは、
明示的に指定したときだけ自動保存されます。
それらのバッファの自動保存ファイルの名前は、
バッファ名のまえに#%
、あとに#
を付けたものになります。
たとえば、送信するメッセージを作成するバッファ*mail*
は、
#%*mail*#
というファイルに自動保存されます。
自動保存ファイルの名前は、Emacsの一部(関数make-auto-save-file-name
と
auto-save-file-name-p
)をプログラムし直さない限り、
この方法で作られます。
バッファの自動保存に使うファイル名は、
そのバッファで自動保存をオンにしたときに計算されます。
大きなバッファで相当量のテキストを削除したときには、 そのバッファの自動保存を一時的にやめます。 意図せずにテキストを削除してしまった場合には、 自動保存ファイルに削除してしまったテキストが残っているほうが、 自動保存ファイルとしてより役に立つからです。 こうなったあとで自動保存をふたたびオンにするには、 C-x C-sでバッファを保存するか、 C-u 1 M-x auto-saveを使います。
訪問先のファイルそのものに自動保存を行いたい場合には、
変数auto-save-visited-file-name
にnil
以外の値を設定します。
こうすると、自動保存と明示的な保存には、何の違いもありません。
訪問先のファイルにバッファを保存すると、
バッファの自動保存ファイルは削除されます。
これを禁止するには、
変数delete-auto-save-files
にnil
を設定します。
C-x C-wやset-visited-file-name
で
訪問先ファイル名を変更すると、
新たな訪問先ファイル名に合わせて自動保存ファイルも改名されます。
変数auto-save-default
がnil
以外ならば、
ファイルを訪問するたびにそのファイルのバッファの自動保存をオンにします
(ただしバッチモードを除く。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で、自動保存の実施を明示的に指示できます。
コマンドM-x recover-file <RET> file <RET>で、
自動保存ファイルの内容から紛失データを復旧できます。
このコマンドは、fileを訪問してから、
(確認したあとで)その自動保存ファイル#file#
から内容を回復します。
そのあとに、C-x C-sでfileそのものに復旧したテキストを保存します。
たとえば、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-prefix
に
nil
を設定すると、復旧のためのセッションを記録しません。
シンボリックリンクやハードリンクを使うことで、
同じファイルをいくつかの異なるファイル名で指すことができます。
ハードリンクは、ファイルを直接に指している別の名前です。
すべての名前は等しく有効で、それらに優劣はありません。
対照的に、シンボリックリンクは定義された別名の一種です。
foo
がbar
へのシンボリックリンクであるとき、
どちらの名前でもファイルを指せますが、
bar
が本当の名前であり、foo
は別名にすぎません。
シンボリックリンクがディレクトリを指しているときには、
より複雑な状況になります。
同一のファイルに対して2つの名前で訪問すると、 Emacsは通常2つの別々のバッファを作成しますが、 その状況を警告します。
同一のファイルを異なる名前で別々のバッファに訪問することを避けたいならば、
変数find-file-existing-other-name
にnil
以外の値を設定します。
そうすれば、どのファイル名を指定しようとも、
find-file
はファイルを訪問している既存のバッファを使います。
変数find-file-visit-truename
がnil
以外であれば、
バッファに記録するファイル名は、ユーザーが指定した名前ではなくて、
ファイルの(すべてのシンボリックリンクをその先の名前に置き換えて得られる)
実名になります。
find-file-visit-truename
を設定すると、
find-file-existing-other-name
も暗に設定されます。
版管理システムは、 ファイルの変更されていない部分を通常は一度だけ格納して、 ソースファイルの複数の版を記録できるパッケージです。 版管理システムは、各版の作成時刻、作成者、 その版の変更部分に関する記述などの履歴情報も記録します。
Emacsの版管理パッケージはVCと呼ばれます。 このコマンドは、3つの版管理システム、RCS、CVS、SCCSで動作します。 GNUプロジェクトでは、フリーソフトウェアでありFree Software Foundationから 入手できるRCSとCVSを推奨します。
VCはEmacsから版管理システムを使えるようにして、 編集作業を版管理操作に滑らかに統合します。 VCは統一された版管理インターフェイスを提供するので、 どの版管理システムを使っているかに関わらず、 同じ使い方ができます。
本節では、版管理を概観するとともに、 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を使うべきです。
ファイルが版管理の管理下にあるとき、 そのファイルは版管理システムに登録されているといいます。 各登録されたファイルには、 ファイルの現状とその変更履歴を記述した対応する マスタファイルが存在します。 この情報は、現在の版や以前の版を再構成するのに十分です。 通常、マスタファイルには、それぞれの版について、 その版の変更点を言葉で記述した記録項目も記録されています。
版管理の下で管理されているファイルを、 そのマスタファイルに対応する作業ファイルと呼ぶこともあります。 普通のファイルと同様に、作業ファイルを編集して変更します。 (SCCSやRCSでは、ファイルを編集するまえにファイルをロック 15 する必要がある。) 一連の変更を終えたら、ファイルをチェックイン、つまり、 記録項目とともに変更をマスタファイルに記録します。
CVSでは、1つのマスタファイルに対応する作業ファイルを複数個持てます。 しばしば、各ユーザーが1個ずつ作業ファイルを持てます。 RCSでもこのようにできますが、RCSの通常の使い方ではありません。
典型的な版管理システムには、複数のユーザーが同じファイルを使う際の 調停を行うためのなんらかの機構が必要です。 1つの方法は(Emacsが同時編集の検出に使うロックに類似だが、それとは別の) ロックを使うことです。 別の方法は、ファイルをチェックインする時点で、 他人の変更分を併合することです。
ロックを使う版管理の場合、作業ファイルは変更できないように 通常は読み出し専用です。 版管理システムに対して、 書き込み可能な作業ファイルを作り、それをロックするように要求します。 一度には1人のユーザーだけがこれをできます。 自分の変更分をチェックインすると、 ファイルのロックを外し、作業ファイルをふたたび読み出し専用にします。 これにより、他のユーザーがさらに変更するために ファイルをロックできるようになります。 SCCSはつねにロックを使いますし、RCSも通常はロックを使います。
RCSでは別の方法もあって、各ユーザーがいつでも作業ファイルを変更できます。 このモードではロックは必要ありませんが、使うこともできます。 新版を記録する方法は、やはりチェックインです。
CVSでは、通常、各ユーザーはいつでも各自の作業ファイルを変更できますが、 チェックイン時に他のユーザーの変更分を併合する必要があります。 しかし、CVSでもロックを使うようにもできます (see Backend Options)。
版管理の下にあるファイルを訪問すると、
Emacsはそのことをモード行に示します。
たとえば、RCS-1.3
は、そのファイルにはRCSが使われていて、
現在の版が1.3であることを表します。
バックエンドの名前と版番号のあいだの文字は、ファイルの版管理状態を示します。
-
は、(ロックを使っているのであれば)
作業ファイルがロックされていないこと、あるいは、
(ロックを使っていないのであれば)ファイルが変更されていないことを表します。
:
は他のユーザー(たとえば、jim
)がロックしていることを表し、
RCS:jim:1.3
のように表示されます。
主要なVCコマンドは、状況に応じてロックかチェックインを行う 汎用コマンドです。
正確にいえば、この操作を行うコマンドはvc-next-action
であって、
C-x v vにバインドしてあります。
しかし、C-x C-qの通常の意味は、
読み出し専用バッファを書き込み可能にするか、あるいは、その逆を行います。
この操作を、適切な版管理操作を実施することで
版管理下で管理されているファイルに対しても同じことを
正しく行うように拡張したのです。
登録されたファイルに対してC-x C-qを打つと、
C-x v vのように動作します。
このコマンドの正確な動作は、ファイルの状態と版管理システム(バックエンド) がロックを使うかどうかに依存します。 SCCSとRCSは通常はロックを使いますが、CVSは通常はロックを使いません。
(SCCSの場合とRCSのデフォルトの場合)ファイルに対してロックを使う場合、 C-x C-qは、ファイルをロックする、あるいは、 ファイルをチェックインするのいずれかを行います。
以上の規則は、CVSでロックを使用している場合にも適用できますが、 『ロックを横取りする』ことはありません。
CVSのデフォルトのように、ロックを使わないときには、
作業ファイルはいつでも書き込み可能です。
ファイルを編集するまえにすべきことは何もありません。
モード行の状態表示は、ファイルが変更されていなければ-
です。
作業ファイルに変更を保存するとただちに:
に変わります。
以下は、CVSを使っているときのC-x C-qの動作です。
以上の規則は、RCSのロックを使わないモードにも適用できますが、 マスタファイルから自動的に変更を併合する機能は実装してありません。 残念なことに、あなたが編集を始めたあとに、他のユーザーが同じファイルに変更を チェックインしても何も警告されないのです。 しかも、このような事態が発生すると、あなたが自分の版をチェックインしたときに、 そのユーザーの変更は実質的には取り除かれてしまいます (とはいえ、マスタファイルの中には残っているので、 完全になくなるわけではない)。 したがって、自分の変更をチェックインするまえには、 現在の版が変更されていないことを確認する必要があります。 Emacsの将来の版では、このような危険性を取り除き、 RCSでも自動併合を行えるように考えています。
また、このモードでもRCSのロックを使えますが、必須ではありません。 ファイルを変更していないときにC-x C-qを使うと、 RCSの通常の(ロックを使う)モードのように、 ファイルをロックします。
変更をチェックインすると、C-x C-qは記録項目をまず読みます。
記録項目を入力するように、*VC-Log*
というバッファを立ち上げます。
入力し終えたら、*VC-Log*
でC-c C-cと打ちます。
実際にチェックインを行うと、このように行われます。
チェックインをアボートするには、そのバッファではC-c C-cを
打たないでください。
別のバッファに切り替えて、別の編集をします。
別のファイルをチェックインしようとしない限り、
入力していた記録項目は*VC-Log*
バッファに残っていますから、
チェックインを完了するため、いつでもそのバッファに戻れます。
複数のソースファイルを同じ理由で変更したときには、 多くのファイルに同じ記録項目を指定できると便利です。 こうするには、まえの記録項目の履歴を使います。 コマンド、M-n、M-p、M-s、M-rは、 ミニバッファの履歴コマンドのように働きます (ただし、これらのコマンドはミニバッファの外部で使う)。
ファイルにチェックインするたびに、
記録項目用バッファはVC記録(vc-log)モードになります。
このモードは2つのフック、text-mode-hook
とvc-log-mode-hook
を
起動します。
See Hooks。
版管理の便利な機能の1つは、ファイルの任意の版を調べたり、 2つの版を比較できることです。
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倍します。
本節では、VCの副次的なコマンドを説明します。 1日に一度くらい使うようなコマンドです。
ファイルを訪問してからC-x v i(vc-register
)と打つだけで、
ファイルを版管理の管理下に置けます。
ファイルを登録するには、Emacsはそのファイルに対してどの版管理システムを
使うか選ぶ必要があります。
vc-default-back-end
に、RCS
、CVS
、SCCS
の
いずれかを設定すれば、明示的に指定できます。
あるいは、RCS
、SCCS
、CVS
という名前の
サブディレクトリがあるなら、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-comment
がnil
以外ならば、
C-x v iはこのソースファイルの目的を記した初期コメントを読みます。
これは記録項目(see Log Buffer)を読むのと同じように動作します。
ファイルの詳しい版管理状態や履歴を見るには、
C-x v l(vc-print-log
)と打ちます。
記録項目を含めてカレントファイルの変更履歴を表示します。
出力は別のウィンドウに表示されます。
これまでの一連の変更を破棄してチェックインしてある最新版へ復元したいときは、
C-x v u(vc-revert-buffer
)を使います。
ロックを使用しているときには、ファイルのロックを解除するので、
変更を始めるまえにまずファイルをロックし直す必要があります。
チェックインした最新版から変更していないと判断できない限り、
C-x v uは確認を求めてきます。
C-x v uは、 ファイルをロックしたけれどもやはりファイルを変更しないと決めたときに、 ロックを解除するコマンドでもあります。
すでにチェックインしてしまった変更を取り消すには、
C-x v c(vc-cancel-version
)を使います。
このコマンドは、チェックインした最新版のすべての記録を捨てさります。
さらに、C-x v cは、作業ファイルとバッファを
以前の版(捨てた最新版の1つまえの版)に復元するかどうか
聞いてきます。
noと答えると、VCはバッファでの変更を保持して ファイルもロックしたままにします。 チェックインした変更に明らかなまちがいがあるとわかったときに、 この「復元しない」という選択肢は便利です。 誤りを含んだチェックインを取り消し、誤りを訂正してから、 改めてファイルをチェックインできます。
C-x v cがバッファを復元しないときには、 そのかわりに、バッファ内のすべての版管理ヘッダの展開形をもとの形に戻します (see Version Headers)。 なぜなら、バッファはもはや既存のどの版にも対応しないからです。 ふたたびチェックインすると、チェックインの過程で、 新たな版番号として正しくヘッダを展開します。
しかしながら、RCSの$Log$
ヘッダを
自動的にもとの形に戻すことは不可能です。
このヘッダの機能を使うなら、取り消した版に対応する項目を削除することで、
もとの形に手で戻す必要があります。
多くの作業結果を簡単に失ってしまうので、 C-x v cを起動するときには十分注意してください。
大きなプログラムを扱っているときは、ディレクトリの木構造全体の中で
どのファイルが変更されたのかを調べたり、
版管理の下に置かれているすべてのファイルの状態を一度に見られると便利です。
コマンドC-x v d(vc-directory
)を使えば、
版管理に関連したファイルだけを含んだディレクトリ一覧を作れます。
C-x v dは、VC diredモードを使うバッファを作ります。
これは、普通のdiredバッファ(see Dired)にそっくりですが、
(ロックされていたり、未更新の)注意を払うべきファイルだけを
通常は表示します。
これを簡素な表示と呼びます。
変数vc-dired-terse-display
にnil
を設定すると、
VC diredは、関連するすべてのファイル、つまり、
版管理の下に置かれたファイルとすべてのサブディレクトリを表示します
(完全な表示)。
VC diredバッファのコマンドv tは、
簡素な表示と完全な表示を切り替えます。
(see VC Dired Commands。)
デフォルトでは、VC diredは、指定したディレクトリやそれより下に置かれた
注意を払うべきファイルや関連するファイルの再帰的な一覧を作ります。
この動作を変えるには、
変数vc-dired-recurse
にnil
を設定します。
すると、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
ファイル、file1
とfile2
が、版管理の下に置かれていて、
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で(『完全な表示』のときに)サブディレクトリを表示するときには、
版管理の下には絶対に置かれないものは省略します。
デフォルトでは、RCS
やCVS
などのVCのサブディレクトリが含まれます。
これは、変数vc-directory-exclusion-list
を設定して
カスタマイズできます。
普通のdiredのように、C-u C-x v dと打てば、
ls
プログラムに渡す追加オプションを指定して、
VC diredの出力書式を微調整できます。
VC diredモードでも、通常のdiredコマンドはすべて普通に動作しますが、
vは例外で、版管理プレフィックスとして再定義してあります。
vc-diff
やvc-print-log
のようなVCコマンドは、
v =やv lいうように打てば起動できます。
これらのコマンドの多くは、現在行のファイルに作用します。
コマンドv v(vc-next-action
)は、
印を付けたすべてのファイルに作用するので、
複数のファイルを一度にロックしたりチェックインしたりできます。
複数のファイルに作用する場合、各ファイルの現状に応じて個別に扱います。
つまり、あるファイルはロックしたり、別のファイルはチェックインしたりします。
これは混乱の原因かもしれません。
同じ状態の一連のファイルに印を付けて、
混乱を防止するのはユーザーの責任です。
ファイルをチェックインするときには、 v vは1つの記録項目を読んで、それをチェックインするすべての ファイルに使います。 これは、同じ変更に属する一連のファイルを一度にチェックインする場合に 便利です。
v t(vc-dired-toggle-terse-mode
)と打てばいつでも、
(ロックされていたり、内容が未更新のものだけを表示する)
簡素な表示と完全な表示とを切り替えられます。
特別なコマンド* l(vc-dired-mark-locked
)もあります。
これは現在ロックされている(CVSの場合には、内容が未更新である)
すべてのファイルに印を付けます。
つまり、現在ロックされいるもの以外のすべてのファイルをバッファから
削除する別の方法は、* l t kと打つことです。
版管理の用途の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です。
枝を切り替えるには、C-u C-x C-qと打ってから、 選択したい版番号を指定します。 その版をロックしない(書き込み不可)で訪問するので、 ロックするまえに調べることができます。 このような枝の切り替えが可能なのは、 ファイルがロックされていない場合に限ります。
枝の中での版番号を省略して枝番号だけを指定できます。 すると、その枝の先頭版を選ぶことになります。 <RET>だけを打つと、Emacsは幹の上のもっとも大きい版を選びます。
(幹を含む)どれかの枝へ切り替えたあとでは、 明示的に他の枝を選択するまで、それ以降のVCコマンドはその枝を使います。
先頭版(枝の中にある最新版)から新たな枝を作るには、 必要ならまずその版を選択してから、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で明示的に別の版を選ぶ必要があります。 ある枝から別の枝へ変更を移すには、次節で説明する併合コマンドを使ってください。
ある枝で変更を完了したときには、それらの変更をファイルの開発の主流(幹)に
取り込みたいことがしばしばあるでしょう。
これは簡単な操作ではありません。
というのは、幹でも開発は進行しているので、
別の向きに変更されているファイルに変更を併合する必要があるからです。
VCでは、vc-merge
コマンドで併合(とそれ以外のことも)できます。
C-x v m(vc-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セッションを開始します。
ファイルの異なる枝上で同時に複数の開発者が作業すると有益なことが
しばしばあります。
CVSでは、デフォルトで、これができます。
RCSでは、複数のソースディレクトリを作れば可能です。
RCSのマスタファイルを置いた共通のディレクトリを指すRCS
という名前の
リンクを各ソースディレクトリに置きます。
こうすれば、各ソースディレクトリでは、それぞれ独自に版を選択できます。
しかし、同じ共通のRCSレコードをすべてで共有します。
ソースファイルにRCSの版管理ヘッダ(see Version Headers)が入っていれば、 この技法は信頼性があり自動的に動作します。 ヘッダにより、Emacsはいつでも作業ファイルに入っている版番号がわかります。
ファイルに版管理ヘッダが入っていないときには、 各セッションごとにどの枝で作業しているかをEmacsに明示する必要があります。 こうするには、ファイルを訪問してから、 C-u C-x C-qと打ち、正しい枝番号を指定します。 これにより、編集セッションではどの枝を操作しているかを Emacsが知っていることを保証します。
スナップショットとは、 ファイルの版(登録されたファイルそれぞれに1つずつ) の集合に名前を付けたもので、一塊として扱うことができます。 スナップショットの重要な種類の1つは、リリースです。 これは、ユーザーへ配布する準備が整ったシステムの(理論的には) 安定した版のことです。
スナップショットに対しては、基本的なコマンドが2つあります。 1つは名前を指定してスナップショットを作り、 もう1つは指名したスナップショットを取り出すことです。
C-x v s name <RET>
vc-create-snapshot
)。
C-x v r name <RET>
カレントディレクトリやその下に置いてある登録されたファイルのいずれかが ロックされていると、このコマンドは何も変更せずにエラーを報告する。 これは、進行中の作業結果を上書きしてしまうことを避けるため。
スナップショットはとても少量の資源しか使いません。 ファイル名一覧とスナップショットに属する版番号を 記録するに十分な量だけでいいのです。 したがって、使いものになるものをスナップショットにすることを 躇うことはありません。
C-x v =やC-x v ~(see Old Versions)の引数として、 スナップショットの名前を指定できます。 したがって、スナップショットと現在のファイル、あるいは、 2つのスナップショット同士、あるいは、 指定した名前の版とスナップショット同士を比較できます。
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で使っている名前ではありません。
ですから、取り出しただけではプログラムは動かないでしょう。
本節では、使用頻度の少ないVCの機能を説明します。
プログラムに対してRCSやCVSを使い、しかも、それらに変更記録ファイル (see Change Log)を保持しているならば、 版管理の記録項目から変更記録項目を自動的に生成できます。
vc-update-change-log
)。
このコマンドはRCSやCVSだけで動作し、SCCSでは動作しない。
たとえば、ChangeLog
の最初の行の日付が1999年4月10日であり、
それ以降のチェックインは
Nathaniel Bowditchが1999年5月22日に
Ignore log messages that start with `#'.
という記録で
rcs2log
にチェックインしたものだけだとしましょう。
そうすると、C-x v aはChangeLog
を訪問して、
つぎのようなテキストを挿入します。
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
に
入れないですみます。
登録したファイルを改名するときには、そのマスタファイルも同様に改名して
正しい結果を得られるようにする必要があります。
指定どおりにソースファイルを改名し、それに従って
マスタファイルも改名するには、vc-rename-file
を使います。
このコマンドは、当該ファイルを指名しているどんなスナップショット
(see Snapshots)も更新するので、スナップショットでも
新しい名前を使うようになります。
それにも関わらず、修正したスナップショットは動作しないかもしれません
(see Snapshot Caveats)。
誰かがロックしているファイルに対しては、
vc-rename-file
を使えません。
版を識別する文字列を作業ファイルへ直接入れておくと便利なこともあります。 版管理ヘッダと呼ばれる特別な文字列は、 各版ごとにその版番号で置き換えられます。
RCSを使っていて、かつ、作業ファイルに版管理ヘッダが入っていれば、 Emacsは、版管理ヘッダを使って現在の版とファイルのロック状態を決定できます。 これは、版管理ヘッダがないときにマスタファイルを参照するより、 信頼できます。 複数の枝を使う環境では、 VCが正しくふるまうためには版管理ヘッダが必要です (see Multi-User Branching)。
版管理ヘッダの探索は、変数vc-consult-headers
で制御されます。
nil
以外ならば、編集中の版番号を決定するためにEmacsはヘッダを探します。
nil
を設定すると、この機能はオフになります。
適切なヘッダ文字列を入れるには、コマンドC-x v h
(vc-insert-headers
)を使います。
デフォルトのヘッダ文字列は、
RCSでは$Id$
、SCCSでは%W%
です。
変数vc-header-alist
に設定すれば、他のヘッダを指定できます。
この値は、(program . string)
の形式の
要素から成るリストです。
ここで、programはRCS
または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つの版管理ヘッダのあいだに置かれたマーカを扱えないこともあります。
VCをカスタマイズする方法はたくさんあります。 設定可能なオプションは、次節に述べる4つに分類できます。
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-cvs
にnil
を設定すれば、
CVSの管理下に置いたファイルに対してVCを使わないようにできます。
こうすると、Emacsは、これらのファイルを
あたかも登録されていないかのように扱い、
それらに対してVCコマンドは使えません。
すべてのCVS操作を手動で行う必要があります。
Emacsは、版管理の下に置かれたソースファイルに対しては、
通常バックアップファイルを作りません。
版管理を使っているファイルに対してもバックアップファイルを作りたいなら、
変数vc-make-backup-files
にnil
以外の値を設定します。
ロックの状態に関わらず、
普通、作業ファイルはつねに存在します。
vc-keep-workfiles
にnil
を設定すると、
C-x C-qで新版をチェックインすると、作業ファイルを削除します。
しかし、Emacsでファイルを訪問しようとすると、作業ファイルをふたたび作ります。
(CVSでは、作業ファイルはつねに存在する。)
版管理されているファイルをシンボリックリンクを介して編集することは、 危険なことになりえます。 版管理システムを迂回してしまいます。 つまり、ロックせずにファイルを編集できてしまい、 変更のチェックインには失敗します。 また、他のユーザーがあなたの変更を上書きしてしまうかもしれません。 こういったことを防ぐために、 VCは、訪問する各シンボリックリンクを検査して、 それが版管理の下に置かれたファイルを指しているかどうか調べます。
変数vc-follow-symlinks
は、
シンボリックリンクが版管理されているファイルを指しているときに
どうするかを制御します。
その値がnil
ならば、VCは警告メッセージを表示するだけです。
t
ならば、VCは自動的にリンクを辿って、かわりに本当のファイルを訪問し、
エコー領域にこのことを表示します。
値がask
(デフォルト)ならば、
VCはリンクを辿るかどうかを毎回聞いてきます。
ファイルのロック状態を推測するとき、 VCはまずファイルのRCSの版管理ヘッダ文字列を探します (see Version Headers)。 ヘッダ文字列がなかったり、SCCSを使っているときは、 VCは通常、作業ファイルのパーミッションを調べます。 ここまでは、すぐにできます。 しかし、ファイルのパーミッションを信頼できない場合もあります。 この場合、やや手間がかかりますが、マスタファイルを調べる必要があります。 さらに、マスタファイルは、ファイルがロックされているかどうかは 教えてくれますが、 作業ファイルがロックされた版を本当に含んでいるかどうかは教えてくれません。
ロック状態を調べるために版管理ヘッダを使わないようにVCに指示するには、
変数vc-consult-headers
にnil
を設定します。
すると、VCは(信頼できるなら)ファイルパーミッションを使うか、
マスタファイルを調べます。
変数vc-mistrust-permissions
を設定することで、
ファイルパーミッションを信頼するかどうかの基準を指定できます。
その値は、t
(つねにファイルパーミッションを疑い、
マスタファイルを調べる)、
nil
(つねにファイルパーミッションを信頼する)、あるいは、
可否を決定する1引数の関数です。
その引数は、サブディレクトリ、RCS
、CVS
、SCCS
の
いずれかの名前です。
関数の戻り値がnil
以外ならば、ファイルパーミッションを疑います。
作業ファイルのパーミッションがまちがって変更されていると思うなら、
vc-mistrust-permissions
にt
を設定します。
すると、VCはつねにファイルの状態を決定するためにマスタファイルを調べます。
vc-suppress-confirm
がnil
以外ならば、
C-x C-qとC-x v iは確認せずにカレントバッファを保存し、
C-x v uも確認せずに作用します。
(この変数はC-x v cには影響しない。
その操作は思い切ったものなので、つねに確認するべき。)
VCモードは、RCS、CVS、SCCSのシェルコマンドを実行することで、
その作業の多くを行います。
vc-command-messages
がnil
以外ならば、
VCはどのシェルコマンドを実行しているか表示し、
コマンドが終了したときに追加メッセージを表示します。
変数vc-path
を設定すれば、
版管理プログラムを探すための追加のディレクトリを指定できます。
これらのディレクトリは、通常の探索パスを探すまえに探されます。
しかし、通常は適切なファイルを自動的にみつけられます。
ファイルシステムは、ファイル群をディレクトリにまとめます。 ディレクトリ一覧は、ディレクトリの中にある、 すべてのファイルの一覧表です。 Emacsには、ディレクトリを作成したり削除したりするコマンド、 短形式(ファイル名のみ)や長形式(サイズ、日付、作者を含む)の ディレクトリ一覧を作成するコマンドがあります。 diredと呼ばれるディレクトリブラウザもあります。 See Dired。
list-directory
)。
ディレクトリ一覧を表示するコマンドは
C-x C-d(list-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"
)。
コマンド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-pとM-nでカーソル移動できます。
See Compilation。
コマンドM-x diff-backupは、
指定されたファイルとその最新のバックアップとを比較します。
バックアップファイルの名前を指定すると、
diff-backup
はそのもとのファイルとバックアップファイルとを比較します。
コマンドM-x compare-windowsは、 カレントウィンドウの中のテキストと、 つぎのウィンドウの中のテキストを比較します。 それぞれのウィンドウのポイント位置から比較を始めます。 それぞれの開始位置は、各バッファのマークリングに積まれます。 そして、各ウィンドウでそれぞれのポイントを1文字ずつ進めることを、 両者のウィンドウで一致しないものに出会うまで行います。 そして、コマンドは終了します。 Emacsのウィンドウについてより詳しくは、See Windows。
数引数を指定すると、compare-windows
は
白文字の違いを無視します。
変数compare-ignore-case
がnil
以外ならば、
大文字小文字の違いも同様に無視します。
2つの似たファイルの併合に便利な機能に関しては、See Emerge。
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つのファイル名、 oldとnewを読み取り、ファイルoldをnewに改名します。 newという名前のファイルが既存のときには、 確認にyesで応答する必要があります。 そうしないと、改名しません。 これは、改名により名前newの古い意味が失われるからです。 oldとnewが異なるファイルシステムの上にあるときには、 ファイルoldを(newに)コピーしてから削除します。
似たコマンドM-x add-name-to-fileは、 既存ファイルの名前を消さずに別の名前を追加するために使います。 新しい名前は、既存ファイルが置かれている同じファイルシステムに 属している必要があります。
M-x copy-fileは、ファイルoldを読んで、 新しいファイルnewに同じ内容を書き出します。 newという名前のファイルが既存なら、確認を求めてきます。 というのは、コピーするとファイルnewの古い内容を上書きしてしまうからです。
M-x make-symbolic-linkは、2つのファイル名、 targetとlinknameを読み取って、 targetを指すlinknameという名前のシンボリックリンクを作ります。 この結果、将来linknameをオープンしようとすると、 その時点でtargetという名前のファイルを参照します。 その時点で名前targetが使われていなければ、エラーになります。 このコマンドは引数targetを展開しないので、 リンク先に相対名を書くことができます。
linknameが使われていると、 リンクを作るときに確認を求めます。 すべてのシステムでシンボリックリンクを使えるわけではないことに 注意してください。
Emacsには、 圧縮されたファイルを訪問すると自動的に展開し、 それを変更して保存すると自動的に再度圧縮するライブラリがあります。 この機能を利用するには、コマンドM-x auto-compression-modeを打ちます。
(自動展開を含む)自動圧縮がオンのときには、
Emacsはファイル名で圧縮されたファイルを認識します。
ファイル名の語尾が.gz
のものは、
gzip
で圧縮されたファイルであることを表します。
他の語尾の場合には、他の圧縮プログラムであることを表します。
自動展開と自動圧縮は、Emacsがファイルの内容を使うすべての操作に適用されます。 ファイルを訪問する、ファイルに保存する、ファイルの内容をバッファに挿入する、 ファイルをロードする、ファイルをバイトコンパイルすることを含みます。
特別なファイル名の構文を使って、他のマシン上のファイルを参照できます。
/host:filename /user@host:filename
このようにすると、Emacsは、 指定したホスト上のファイルを読み書きするためにFTPプログラムを使います。 あなたのユーザー名かuserを使ってFTPでログインします。 毎回パスワードを聞かれることもありますが、 これはhostへのログインに使われます。
普通、リモートファイル名にユーザー名を指定しないと、
あなたのユーザー名を使うことを意味します。
しかし、変数ange-ftp-default-user
に文字列を設定しておけば、
その文字列をかわりに使います。
(FTPによるファイル参照を実装するEmacsのパッケージは、
ange-ftp
と呼ばれる。)
変数file-name-handler-alist
にnil
を設定すると、
FTPファイル名機能を完全にオフにできます
16。
特殊文字や特別な構文の特別な効果を抑えるために、
絶対ファイル名をクォートできます。
そうするには、先頭に/:
を加えます。
たとえば、リモートにあるように見えるローカルなファイル名をクォートして、
リモートファイル名として扱われるのを防ぎます。
したがって、ディレクトリが/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
を訪問します。
Emacs内で編集しているテキストはバッファ(buffer)と
呼ばれるオブジェクトの中に存在します。
ファイルを訪問するたびに、
ファイルのテキストを保持するバッファを作ります。
diredを起動するたびに、ディレクトリ一覧を保持するバッファを作ります。
C-x mでメッセージを送信するときには、
メッセージのテキストを保持するためにバッファ*mail*
が使われます。
コマンドの説明文を求めると、*Help*
と呼ばれるバッファに説明文が現れます。
どんなときでも、1つのバッファだけが選択されています。 このバッファをカレントバッファとも呼びます。 バッファが1つしかないかのように、 コマンドが『バッファ』に作用するといういい方をよくします。 しかし、実際には、コマンドが選択されたバッファに作用するということです (多くのコマンドはそうする)。
複数のウィンドウがあるとき、 各ウィンドウはそこに表示しているバッファを選んでいますが、 いつでもそれらのウィンドウのうち1つだけが選択されていて、 そのウィンドウに表示されているバッファが選択されているバッファです。 各ウィンドウのモード行は、 そのウィンドウに表示しているバッファの名前を表示します(see Windows)。
各バッファにはどんな長さでもよい名前があり、
バッファ名を指定してバッファを選択できます。
多くのバッファはファイルを訪問することで作成され、
それらの名前はファイル名から導き出します。
好きな名前で空のバッファを作ることもできます。
Emacsを新たに始めると、Emacs内でLisp式の評価に使える
*scratch*
という名前のバッファができます。
バッファ名では大文字小文字を区別します。
各バッファは独立に、どのファイルを訪問しているか、 変更されているか、どのメジャーモードとマイナモードを使っているか を記録しています。(see Major Modes)。 どのEmacs変数も各バッファにローカルにすることができます。 つまり、あるバッファでの変数の値を 他のバッファでのその変数の値とは違う値にできます。 See Locals。
switch-to-buffer
)。
switch-to-buffer-other-window
)。
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は、これらのバッファを少々特別に扱います。 たとえば、デフォルトでは、アンドゥ情報を記録しません。 このようなバッファ名は避けるのが最良です。
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が作ったものです。
vc-toggle-read-only
)。
<number>
を付加して
カレントバッファ名を変更する。
バッファは、読み出し専用にもなります。
そうすると、その内容を変更するコマンドは許されません。
モード行では、左端付近に%%
や%*
を表示して、
読み出し専用バッファであることを示します。
通常、読み出し専用バッファは、テキストを操作する特別なコマンドを持つ
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-bufferとM-x insert-bufferは、 1つのバッファから別のバッファへテキストをコピーするのに使います。 See Accumulating Text。
Emacsのセッションをしばらく続けると、 たくさんの数のバッファが溜っているでしょう。 もう必要としないバッファを消去したほうがよいと思うかもしれません。 多くのオペレーティングシステムでは、 バッファを消去するとそのメモリ領域を解放して オペレーティングシステムに返すので、 他のプログラムが使えるようになります。 バッファを消去するコマンドをいくつかあげます。
kill-buffer
)。
C-x k(kill-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-mode
にt
を設定します。
See Easy Customization。
バッファメニュー(buffer-menu)機能は 『バッファに対するdired』に似ています。 このコマンドは、バッファ一覧を収めたEmacsバッファを編集することで、 さまざまなEmacsバッファを操作できます。 バッファの保存、消去(ここではdiredとの一貫性のために削除と呼ぶ)、 表示を行うことができます。
コマンドbuffer-menu
は、
すべてのEmacsバッファの一覧をバッファ*Buffer List*
に書き、
そのバッファをバッファメニュー(buffer-menu)モードにして
選択します。
そのバッファは読み出し専用で、本節で述べる特別なコマンドでのみ変更できます。
普通のEmacsカーソル移動コマンドは、*Buffer List*
バッファでも使えます。
つぎにあげるコマンドは、現在行に書かれているバッファに作用します。
D
を表示する。
指示した削除は、xコマンドを打ったときに実行される。
S
が表示される。
指示した保存は、xコマンドを打ったときに実行される。
同じバッファに対して、保存と削除の両方を指示できる。
d、C-d、s、uコマンドは、 フラグを追加または削除して、1行下へ(あるいは上へ)移動します。 これらのコマンドは、反復回数として数引数を取ります。
つぎにあげるコマンドは、現在行に書かれているバッファにただちに作用します。
他のバッファや複数のバッファを選択するコマンドもあります。
*Buffer List*
のかわりに、この行のバッファをただちに選択する。
*Buffer List*
はそのまま。
*Buffer List*
バッファを除いて)まえに選択していたバッファを
もう1つに表示する。
>
を表示する。
(1つのバッファに、削除指示と表示指示の両方を付けることはできない。)
buffer-menu
が直接行うことは、
適切なバッファを作成してそれに切り替えてから、
バッファメニュー(buffer-menu)モードにすることです。
それ以外の上に述べたことはすべて、
バッファメニュー(buffer-menu)モードが用意した特別なコマンドで
実装されています。
その結果、*Buffer List*
バッファから別のEmacsバッファへ切り替えて、
そこで編集できます。
あとで*Buffer List*
バッファをふたたび選択してすでに指示した操作を実行したり、
このバッファを削除したり、無視したりもできます。
buffer-menu
とlist-buffers
の唯一の違いは、
buffer-menu
は選択されたウィンドウで
*Buffer List*
バッファに切り替えることです。
list-buffers
は別のウィンドウにこのバッファを表示するだけです。
list-buffers
を実行し(つまり、C-x C-bと打つ)、
*Buffer List*
バッファを手動で選択すると、
ここに述べたすべてのコマンドを使えます。
バッファを作成したり削除したりしても、
バッファ*Buffer List*
は自動的に更新されません。
その内容はただのテキストにすぎません。
バッファを作成/削除/改名したら、
現在のバッファの状態を見るために*Buffer List*
を更新する方法は、
g(revert-buffer
)を打つか、
buffer-menu
コマンドを再度実行することです。
間接バッファは、他のバッファとテキストを共有します。 そのような他のバッファを間接バッファの基底バッファと呼びます。 ある意味で、ファイルのあいだのシンボリックリンクに似ています。
間接バッファのテキストはつねに基底バッファのテキストと同じです。 どちらか片方を編集して変更すると、他方のバッファでもすぐにそれが見えます。 しかし、それ以外のすべての点では、 間接バッファとその基底バッファは完全に別のものです。 これらは、異なる名前、異なるポイントの値、異なるナロイング、 異なるマーカ、異なるメジャーモード、異なるローカル変数を持ちます。
間接バッファではファイルを訪問できませんが、 基底バッファではできます。 間接バッファを保存しようとすると、実際には基底バッファを保存します。 基底バッファを消去すると間接バッファも消去されますが、 間接バッファを消去しても基底バッファには影響しません。
間接バッファの使い方の1つは、アウトラインを複数の視点で表示することです。 See Outline Views。
Emacsは、フレームを2つ以上のウィンドウに分割できます。 複数のウィンドウは、異なるバッファの一部分、あるいは、 1つのバッファの異なる部分を表示することができます。 複数フレームはつねに複数ウィンドウを意味します。 というのは、各フレームはそれ独自のウィンドウの集合を持つからです。 各ウィンドウはたった1つのフレームだけに属します。
各Emacsウィンドウは、いつでも1つのEmacsバッファを表示します。 1つのバッファは複数のウィンドウに表示できます。 その場合、そのテキストの変更は、そのバッファを表示している すべてのウィンドウで表示されます。 しかし、同じバッファを表示している各ウィンドウでは バッファの異なる部分を表示することができます。 なぜなら、各ウィンドウはそれ自身のポイント値を持つからです。
どんなときでも、1つのウィンドウだけが選択されたウィンドウです。 そのウィンドウに表示されているバッファがカレントバッファです。 端末のカーソルは、そのウィンドウのポイント位置を示します。 別の各ウィンドウにもそれぞれ同じようにポイント位置がありますが、 端末にはカーソルは1つしかないので、 それらの位置を示す方法がありません。 Xウィンドウシステムで複数フレームを表示しているときには、 各フレームには、そのフレームで選択されたウィンドウにカーソルがあります。 選択されているフレームのカーソルは塗り潰されている矩形で、 それ以外のフレームのカーソルは中空の矩形です。
ポイントを移動するコマンドは、選択されているEmacsウィンドウのポイント
値に対してだけ影響します。
たとえ同じバッファを表示しているとしても、
他のEmacsウィンドウのポイント値は変更しません。
選択しているウィンドウで選択しているバッファを変更する
C-x bといったコマンドでも同様です。
他のウィンドウには少しも影響しません。
しかし、別のウィンドウを選択してそのバッファを切り替える
C-x 4 bのようなコマンドもあります。
さらに、(たとえば)C-h f(describe-function
)や
C-x C-b(list-buffers
)などを含む
ウィンドウに情報を表示するコマンドは、
選択されているウィンドウに影響することなく、
選択されていないウィンドウのバッファを切り替えます。
複数のウィンドウが同じバッファを表示するとき、 異なるリージョンを持つことができます。 というのは、各ウィンドウは、それぞれ異なるポイント値を持てるからです。 しかしながら、各バッファにはたった1つのマーク位置しかないため、 マークの値はすべて同じになります。
各ウィンドウにはそれ専用のモード行があり、 そこにはウィンドウに表示しているバッファの名前、修正状態、 バッファのメジャーモード、バッファのマイナモードを表示します。 モード行に関して詳しくは、See Mode Line。
split-window-vertically
)。
split-window-horizontally
)。
コマンドC-x 2(split-window-vertically
)は、
選択されているウィンドウを上下2つのウィンドウに分割します。
どちらのウィンドウも同じポイント値、同じバッファを表示するところから
始まります。
デフォルトでは2つのウィンドウは、
それぞれ、分割されるウィンドウの半分の高さになります。
数引数は上のウィンドウの行数を指定します。
C-x 3(split-window-horizontally
)は、
選択されているウィンドウを左右2つのウィンドウに分割します。
数引数は左側のウィンドウの桁数を指定します。
2つのウィンドウはスクロールバーで分けられます。
画面幅に満たないウィンドウのモード行は、切り詰められます。
Emacsが強調表示を扱えない端末では、
切り詰めたモード行が反転表示されない場合があります。
モード行やスクロールバーでC-Mouse-2をクリックすることで、 ウィンドウを左右や上下に分割できます。 分割する線はクリックした位置を通ります。 モード行でクリックすると、新しいスクロールバーはクリックした点上を通ります。 スクロールバーでクリックすると、 分割したウィンドウのモード行はクリックした位置に並びます。
ウィンドウの幅が十分でないと、長すぎて行に入りきらないテキスト行が
多くなります。
これらの行すべてを継続すると混乱してしまうかもしれません。
変数truncate-partial-width-windows
にnil
以外を設定すると、
画面幅に満たないすべてのウィンドウで切り詰めを強制できます。
これは、表示されているバッファやtruncate-lines
の値とは独立しています。
See Continuation Lines。
水平スクロールは左右に並べたウィンドウでよく使われます。 See Display。
split-window-keep-point
の値がnil
以外(デフォルト)ならば、
C-x 2で分割した2つのウィンドウは、
分割前のウィンドウのポイント値を継承します。
つまり、スクロールを避けられません。
この変数がnil
ならば、
C-x 2は、画面上のテキストが移動しないように、
各ウィンドウで見えている部分にポイントを移動しようと試みます。
また、分割前にカーソルがあった行を表示しているウィンドウを選択します。
遅い端末では後者の動作を好むユーザーもいます。
other-window
)。
(小文字の)oであってゼロではない。
scroll-other-window
)。
mouse-select-window
)。
別のウィンドウを選択するには、そのモード行でMouse-1をクリックします。
キーボードからは、C-x o(other-window
)で
ウィンドウを切り替えられます。
これは「other」のoであってゼロではありません。
2つ以上のウィンドウがあるときは、このコマンドはすべてのウィンドウを、
一般的には、上から下へ、左から右へ巡回します。
もっとも右下のウィンドウのつぎは、左上隅にあるウィンドウに戻ります。
数引数は、ウィンドウを巡回する回数を意味します。
負の引数では逆順に巡回します。
ミニバッファを使っているときには、
ミニバッファが巡回の最後のウィンドウになります。
ミニバッファウィンドウから別のウィンドウに切り替えて、
あとで戻ってきて、ミニバッファ引数が要求しているものを与えてから終了できます。
See Minibuffer Edit。
通常のスクロールコマンド(see Display)は、
選択されているウィンドウのみに作用しますが、
つぎのウィンドウをスクロールするコマンドが1つあります。
C-M-v(scroll-other-window
)は、
C-x oが選択するウィンドウをスクロールします。
C-vのように正負の引数を取ります。
(ミニバッファでは、ミニバッファヘルプがあると、
標準の巡回順でつぎのウィンドウではなくて、
ミニバッファヘルプを表示しているウィンドウをスクロールする。)
コマンドM-x compare-windowsは、 2つのウィンドウで見えている2つのファイル、つまり、バッファを比較して、 一致しないつぎの箇所へ移動します。 詳細は、See Comparing Files。
C-x 4は、(ウィンドウが1つだけならば分割して) 別のウィンドウを選択して、そのウィンドウでバッファを選択するコマンドの プレフィックスキーです。 異なるC-x 4コマンドは、異なる方法で選択するバッファを探します。
switch-to-buffer-other-window
を実行する。
display-buffer
を実行する。
find-file-other-window
を実行する。
see Visiting。
dired-other-window
を実行する。
see Dired。
mail-other-window
を実行する。
これは、同じウィンドウを使うC-x mに類似したもの。
(see Sending Mail)。
find-tag-other-window
を実行するが、
M-.の複数ウィンドウ向けの変種
(see Tags)。
find-file-read-only-other-window
を実行する。
see Visiting。
ある種の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。
delete-window
)。
このキー列の最後の文字はゼロ。
delete-other-windows
)。
kill-buffer-and-window
)。
このキー列の最後の文字はゼロ。
enlarge-window
)。
enlarge-window-horizontally
)。
shrink-window-horizontally
)。
shrink-window-if-larger-than-buffer
)。
balance-windows
)。
mouse-delete-other-windows
)。
mouse-delete-window
)。
ウィンドウを削除するには、C-x 0(delete-window
)と打ちます
(これはゼロ)。
削除されたウィンドウが占めていた場所は、隣接のウィンドウに与えられます。
(ただし、ミニバッファのウィンドウを使っている場合でも、
ミニバッファのウィンドウには与えない。)
ウィンドウを一度削除すると、その属性は失われます。
ウィンドウの構成情報を回復する以外にウィンドウをもとに戻す方法はありません。
ウィンドウを削除しても、そこに表示していたバッファには何の影響もありません。
バッファは存在し続け、どのウィンドウへでもC-x bで選択できます。
C-x 4 0(kill-buffer-and-window
)は、
C-x 0よりも強いコマンドです。
これは、カレントバッファを削除し、そこで選択されていたウィンドウを削除します。
C-x 1(delete-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-height
と
window-min-width
で指定します。
コマンドC-x -(shrink-window-if-larger-than-buffer
)は、
選択されているウィンドウの高さが、表示しているバッファのテキスト全体を
表示するために必要な高さよりも大きい場合には、
その高さを縮めます。
余った行はフレーム内の他のウィンドウに与えられます。
選択されているフレーム内のすべてのウィンドウの高さをすべて同じにするには、
C-x +(balance-windows
)を使えます。
ミニバッファのテキストにちょうど合うように ミニバッファウィンドウの大きさを自動的に変更する ミニバッファリサイズ(resize-minibuffer)モードについては、 See Minibuffer Edit。
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。
リージョンを選択したりコピーしたりするマウスコマンドは、
xterm
プログラムとほぼ互換です。
Emacsと他のXクライアントプログラムとのあいだでコピーするには、
Xのマウスコマンドと同じものを使えます。
これらのマウスコマンドでリージョンを選択して、 そのあとすぐにファンクションキー<DELETE>を打つと、 選択したリージョンを削除します。 ファンクションキー<BACKSPACE>やASCII文字<DEL>は、 これを行いません。 マウスコマンドと<DELETE>のあいだに別のキーを打ったときも、 これを行いません。
mouse-set-point
)。
通常、左ボタン。
mouse-set-region
)。
リージョンの始めと終りの両方をこのコマンド1つで指定できる。
ドラッグ中に、ウィンドウの上下からマウスが出ると、
マウスがウィンドウ内に戻ってくるまで、
ウィンドウを一定の割合でスクロールする。
こうして、画面全体に入りきらないリージョンでも選択できる。
一度にスクロールする行数は、
マウスがウィンドウの縁からどの程度離れているかに依存する。
変数mouse-scroll-min-lines
には最小の行数を指定する。
mouse-yank-at-click
)。
通常、中ボタン。
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を使うと、
すでに選択してあるリージョンをキルする。
開き括弧や閉じ括弧の構文の文字をクリックすると、
その文字で始まり/終る括弧で囲まれた塊(sexp)にリージョンを設定する。
文字列区切りの構文(Cのシングルクォートやダブルクォート)の文字をクリック
すると、(その文字が文字列の始まりか終りかを発見的方法を使って決めて)
文字列定数を囲むリージョンを設定する。
マウスを使ったもっとも単純なテキストのキル方法は、 片方の端でMouse-1を押し、もう一方の端でMouse-3を2回押すことです。 See Killing。 バッファから削除しないでキルリングにテキストをコピーするには、 Mouse-3を一度だけ押します。 あるいは、Mouse-1でテキストを横断してドラッグするだけです。 そうすると、どこででも、それをヤンクすることでコピーできます。
キルしたりコピーしたりしたテキストをどこか別の場所にヤンクするには、
マウスをその場所に移動してMouse-2を押します。
See Yanking。
しかし、mouse-yank-at-point
がnil
以外ならば、
Mouse-2はポイント位置にヤンクします。
つまり、ウィンドウのどこをクリックしたのか、あるいは、
フレームのどのウィンドウをクリックしたのかは問題ではありません。
デフォルトの値はnil
です。
この変数は二次セレクションのヤンクにも影響します。
別のXのウィンドウへテキストをコピーするには、 その部分をキルするかキルリングに保存します。 Xの管理下では、一次セレクションも設定します。 そのあとで、別のXのウィンドウで動いているプログラムの『ペースト』や 『ヤンク』コマンドを使って、セレクションからテキストを挿入します。
別のXのウィンドウからテキストをコピーするには、 そのウィンドウで動いているプログラムの『カット』や『コピー』コマンドを 使って目的のテキストをセレクションにします。 そのあとで、C-yやMouse-2を使ってEmacsにヤンクします。
これらのカット/ペーストコマンドはMS-Windows上でも動作します。
Emacsがテキストをキルリングに入れたり、
キルリングのテキストを先頭へ巡回するとき、
EmacsはXサーバーの一次セレクションに設定します。
このために、別のXクライアントがテキストを参照できるのです。
テキストが十分に短い場合にのみ
(x-cut-buffer-max
は最大文字数を指定する)、
Emacsはカットバッファにもテキストを収めます。
長い文字列をカットバッファへ置くには時間がかかります。
キルリングの始めのテキストをヤンクするコマンドは、 実際には、別のプログラムの一次セレクションをまず調べ、 そのあとで、カットバッファのテキストを調べます。 どちらにもヤンクするテキストがなれば、キルリングの内容を使います。
二次セレクションは、Xにおいてテキストを選択する別の方法です。 これは、ポイントやマークを使わないので、 ポイントやマークを設定せずにテキストを削除するのに使えます。
mouse-set-secondary
)。
強調表示されドラッグするにつれて変化する。
ドラッグ中にウィンドウの上下からマウスが出ると、
ウィンドウへマウスが戻ってくるまで、
ウィンドウを一定の割合でスクロールする。
こうして、画面全体に入りきらないリージョンも選択できる。
mouse-start-secondary
)。
mouse-secondary-save-then-kill
)。
同じ位置での2回目のクリックは、
ちょうど作成した二次セレクションをキルする。
mouse-yank-secondary
)。
ヤンクしたテキストの最後にポイントを置く。
M-Mouse-1のダブルクリックやトリプルクリックは、 Mouse-1のように単語や行単位に作用します。
mouse-yank-at-point
がnil
以外ならば、
M-Mouse-2はポイント位置にヤンクします。
そのときには、どこをクリックしたかは関係なく、
どのウィンドウをクリックしたかだけが関係します。
See Mouse Commands。
いくつかのEmacsバッファでは、いろいろなものの一覧を表示します。 ファイル一覧、バッファ一覧、補完候補一覧、パターンに一致したものの一覧 などです。
これらのバッファにテキストをヤンクできても便利ということはないので、 これらの多くはMouse-2を特別に定義して、 クリックした項目を使ったり眺めたりするコマンドとしています。
たとえば、diredバッファのファイル名をMouse-2でクリックすると、
そのファイルを訪問します。
*Compilation*
バッファのエラーメッセージをMouse-2で
クリックすると、そのエラーメッセージに対応するソースコードへ行きます。
*Completions*
バッファの補完候補をMouse-2でクリックすると、
その補完候補を選択します。
反応するテキストの上にマウスが移動するとテキストが強調表示されるので、 Mouse-2がいつ特別な意味を持つか普通はわかります。
<CTRL>や<SHIFT>キーで修飾されたマウスクリックは、 メニューを立ち上げます。
ウィンドウを選択したり操作するために、 ウィンドウのモード行でマウスクリックを使えます。
スクロールバーでC-Mouse-2をクリックすると、 対応するウィンドウを上下に分割します。 See Split Window。
プレフィックスキーC-x 5は、 C-x 4と同じようなサブコマンドがあるという点で似ています。 違いは、C-x 5コマンドは、 選択されているフレームで新たにウィンドウを作るのではなく、 新しいフレームを作ることです(see Pop Up Window)。 既存の見えているフレームやアイコン化されたフレームが、 要求された内容を表示しているなら、これらのコマンドは、 必要ならフレームをいちばん手前にもってきたりアイコンを開いてから、 既存のフレームを使います。
さまざまなC-x 5コマンドは、 選択するバッファの探し方や作成方法が異なります。
make-frame-command
)。
switch-to-buffer-other-frame
を実行する。
find-file-other-frame
を実行する。
see Visiting。
dired-other-frame
を実行する。
see Dired。
mail-other-frame
を実行する。
これは、C-x mの他のフレームを使う変形版。
see Sending Mail。
find-tag-other-frame
を実行し、
M-.の複数フレーム向けの変形版。
see Tags。
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"))
Emacsのフレームは、スピードバーを持つことができます。 スピードバーは、縦長のウィンドウで、 訪問したりタグを探したりするためのスクロール可能な ファイルメニューとして働きます。 スピードバーを作るには、M-x speedbarと打ちます。 これは、選択されたフレームに対するスピードバーウィンドウを作ります。 そうすると、スピードバーのファイル名をクリックすると、 対応するEmacsフレームでそのファイルを訪問できます。 あるいは、タグの名前をクリックすると、 Emacsフレームでそのタグの箇所へ飛んで行きます。
最初、スピードバーには、カレントディレクトリの直下の内容を
1行につき1つのファイルで表示します。
各行には、[+]
か<+>
の箱があって、
それをMouse-2でクリックするとその項目の内容を『開け』ます。
その行の名前がディレクトリならば、それを開くと、
そのディレクトリの内容をその行の下に追加してスピードバーに表示します。
その行が普通のファイルならば、それを開くと、
そのファイル内のタグ一覧をスピードバーに追加して表示します。
ファイルが開かれていると、[+]
は[-]
に変わります。
ファイルを『閉じる』(内容を隠す)ためにその箱をクリックできます。
rmailモード、infoモード、GUDモードを含むいくつかのメジャーモードには、
選択可能な有用な項目をスピードバーに追加する特別な方法があります。
たとえば、rmailモードでは、スピードバーにはrmailファイル一覧を表示します。
カレントメッセージを別のrmailファイルに移すには、
目的のrmailファイルの<M>
の箱をクリックするだけです。
スピードバーは1つのEmacsフレームに属し、つねにそのフレームに作用します。 複数のフレームを使うときには、 一部のフレームやすべてのフレームにスピードバーを作れます。 フレームのスピードバーを作るには、そのフレームでM-x speedbarと打ちます。
1つのEmacsは、複数のXディスプレイと通信できます。
最初は、Emacsは1つのディスプレイだけを使います。
環境変数DISPLAY
や--display
オプションに指定されたものです
(see Initial Options)。
他のディスプレイに接続するには、
コマンドmake-frame-on-display
を使います。
1つのXサーバーは複数のスクリーンを扱えます。 1つのサーバーに属する2つのスクリーンにフレームを開くとき、 Emacsは1つのキーボードを共有していることを知っていて、 これらのスクリーンから到着するすべてのコマンドを1つの 入力ストリームとして扱います。
異なるXサーバー上にフレームを開くとき、 Emacsはそれぞれのサーバーに対して別々の入力ストリームを作ります。 こうすることで、2つのディスプレイ上で2人のユーザーが同時に打鍵でき、 Emacsはそれらの入力をごっちゃにすることはありません。 各サーバーにはそれ自身が選択しているフレームがあります。 特定のXサーバーで入力したコマンドは、 そのサーバーが選択しているフレームに適用されます。
これらの機能にも関わらず、異なるディスプレイで同じEmacsジョブを 使っている人達は、注意を怠ると、互いに干渉し合ってしまいます。 たとえば、誰かがC-x C-cと打つと、 その人達が共有している(1つの)Emacsジョブは終了してしまいます!
ウィンドウが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-names
やspecial-display-regexps
の要素は、
リストでもかまいません。
その場合、最初の要素はバッファ名か正規表現です。
リストの残りは、フレームの作成方法を指定します。
これは、フレームパラメータの値を指定する連想リストにすることもできます。
これらの値は、special-display-frame-alist
に
指定されたパラメータの値より優先されます。
あるいは、リストはつぎのような形式にすることもできます。
(function args...)
ここで、functionはシンボルです。 こうすると、functionを呼んでフレームを作ります。 関数呼び出しの最初の引数はバッファで、残りの引数はargsです。
似たような機能で、バッファをどの選択されているウィンドウに表示するか
指定できます。
See Force Same Window。
同じウィンドウに表示する機能は、特別なフレームに表示する機能に優ります。
したがって、バッファ名をspecial-display-buffer-names
に追加しても
何の効果もなかったら、
その機能が同じバッファ名に対しても使われていないか調べてください。
本節では、選択しているフレームの表示スタイルやウィンドウ管理のふるまいを 変更するコマンドを説明します。
modeline
フェイスの前景色も変更するので、
デフォルトと比較しても反転表示のままになる。
このオートレイズ機能はEmacs自身が実装していることに注意。
ウィンドウマネージャの中にも、オートレイズを実装しているものがある。
XのウィンドウマネージャでEmacsフレームのオートレイズを指定しているときには、
それが動作するはず。
しかし、それはEmacsの制御を超えているので、それに関しては
auto-raise-mode
は何の影響もない。
コマンドauto-lower-mode
は、
Xのウィンドウマネージャが実装するオートローワには何の影響もない。
それを制御するには、適切なウィンドウマネージャの機能を使う必要がある。
ポップアップメニューから、フレームの主要フォントを設定することもできる。 このメニューを立ち上げるにはS-Mouse-1を押す。
Xツールキットを使うEmacsの版では、表示色とフォントを設定する関数は メニューやメニューバーには影響しません。 というのは、メニューやメニューバーは、 それら自身のウィジェットクラスを使って表示されているからです。 メニューとメニューバーの見た目を変更するには、 Xのリソースを使う必要があります(see Resources X)。 表示色に関しては、See Colors X。 フォントの選択については、See Font X。
フレームパラメータとそのカスタマイズについては、 See Frame Parameters。
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コマンドを使います。
M-x menu-bar-modeでメニューバーの表示をオン/オフできます。
引数を指定しないと、このコマンドはマイナモードである
メニューバー(menu-bar)モードをトグルします。
引数を指定した場合、引数が正ならメニューバー(menu-bar)モードをオンにし、
引数が正でないならオフにします。
XのリソースmenuBarLines
を使って、
メニューバー(menu-bar)モードの初期設定を制御できます。
See Resources X。
熟練したユーザーは、メニューバーをしばしばオフにし、
特に文字端末上ではそうします。
というのは、テキスト表示に1行余分に使えるからです。
メニューバーでコマンドを起動する方法については、See Menu Bar。
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
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。
フォントロック(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)))
フォントロックには、大きなバッファに対して フォントロック(font-lock)モードを高速に動作させるモードがあります。 高速ロック(fast-lock)モードと遅延ロック(lazy-lock)モードです。 これらは、フォントロック(font-lock)モードの速度を向上するために 2つの異なる方法を使います。
大きなファイルを訪問したバッファに対して フォントロック(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
以外ならば保存します(これがデフォルト)。
大きなバッファに対してフォントロック(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-contextually
に
nil
以外を設定していると、遅延ロック(lazy-lock)モードでは、
lazy-lock-defer-time
秒後にこれを自動的に行います。
Emacsが長時間アイドルだと、遅延ロックは、 バッファのまだ表示されていない部分を、 のちの表示に備えてフォント表示化します。 これを内密のフォント表示化(stealth fontification)と呼びます。
変数lazy-lock-stealth-time
は、内密のフォント表示化を開始するまでに、
Emacsが何秒間アイドルであるべきかを指定します。
値がnil
だと、内密のフォント表示化をしません。
変数lazy-lock-stealth-lines
とlazy-lock-stealth-verbose
は、
内密のフォント表示化の粒度と冗長性を指定します。
フォントロックで使えるモードの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)))
バッファ内の最近に変更された部分を示すためにフェイス(典型的には表示色)を 用いるマイナモードをオンにするには、 M-x highlight-changes-modeを使います。
つぎのコマンドは、フレームを作成したり削除したり操作したりします。
iconify-or-deiconify-frame
)。
Emacsを休止するというC-zの通常の意味は、
ウィンドウシステムでは有用ではない。
そのため、別のバインドになっている。
Emacsフレームのアイコンでこのコマンドを打つと、
アイコンをフレームに開く。
delete-frame
)。
フレームがたった1つの場合には、このコマンドは許されない。
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>を使います。
指定した名前は、フレームを選択するとモード行に表示されます。
Emacsでは広範囲の国際化文字集合を使えます。 ラテンアルファベットの変種であるヨーロッパの言語はもちろん、中国語、 デバナーガリー(ヒンディー語とマラッタ語)、エチオピア語、ギリシア語、 IPA(International Phonetic Alphabet、万国表音文字)、日本語、韓国語、 ラオ語、ロシア語、タイ語、チベット語、ベトナム語の文字を含んでいます。 これらの機能は、MULE(『MULti-lingual Enhancement to GNU Emacs』)と して知られるEmacsの修正版から併合しました。
これらの文字のユーザーは、ファイルに格納するために、 たくさんの標準的なコーディングシステムを確立してきました。 Emacsは内部的には単一のマルチバイト文字符号化を使用しているので、 1つのバッファや1つの文字列の中に、 これらのすべての文字を混ぜ合わせることができます。 この符号化では、非ASCII文字を0200から0377の範囲のバイトの 並びとして表現します。 Emacsは、ファイルを読み書きするとき、サブプロセスとデータを交換するとき、 (場合によっては)C-qコマンドを使うときに、 マルチバイト文字符号化と 他のさまざまなコーディングシステムのあいだで変換します (see Multibyte Conversion)。
コマンドC-h h(view-hello-file
)は、
多くの言語で『hello』と書いたファイルetc/HELLO
を表示します。
これは、さまざまな字体を例示します。
これらの文字集合を使っている国々であっても、 一般にキーボードには、 それらすべての文字に対するキーはありません。 ですから、Emacsではさまざまな入力方式(input methods) 18を使って、 便利に文字を打ち込めるようにします。 典型的には、1つの字体や1つの言語について1つの入力方式があります。
プレフィックスキーC-x <RET>は、 マルチバイト文字、コーディングシステム、入力方式に関係するコマンドに使います。
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> c(universal-coding-system-argument
)を使って、
ファイルを探したり保存するときのコーディングシステムとして
raw-text
を指定することもできます。
See Specify Coding。
raw-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個だけです。
マルチバイト文字が使用可のときはいつでも、 すべての扱える文字集合を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
を設定するべきです。
入力方式(input method)は、 対話的に入力するために特別に設計された文字変換の一種です。 Emacsでは、典型的には、各言語向けに専用の入力方式があります。 ときには、同じ文字を使ういくつかの言語で入力方式を共有します。 複数の入力方式を使う言語も少しはあります。
入力方式のもっとも単純なものは、ASCII文字を別のアルファベットに 対応させることで動作します。 ギリシア語とロシア語の入力方式はこのように動作します。
より強力な方法は合成で、文字の列を1つの文字に変換します。 多くのヨーロッパの入力方式は、文字のうしろにアクセント文字が続く列 (あるいはその逆順)から、1つの非ASCII文字を生成する合成を使います。 たとえば、いくつかの入力方式では、 文字の列a'を1つのアクセント付き文字に変換します。 これらの入力方式には、その方式に固有の特別なコマンドはありません。 印字文字の列を合成するだけです。
音節文字用の入力方式では、典型的には、対応付けたあとで合成します。 タイ語と韓国語の入力方式は、この方法で動作します。 まず、文字を音声記号に対応付けます。 そして、1つの音節全体を構成するそれらの列を1つの音節記号に対応付けます。
中国語や日本語では、より複雑な方法が必要です。
中国語の入力方式では、まず、中国語の単語の発音表記を入力する
(とりわけ入力方式chinese-py
)か、
1文字の各部分部分の列(とりわけ入力方式chinese-4corner
や
chinese-sw
)を入力します。
1つの発音表記は、普通、多くの異なる中国語の文字に対応しているので、
特別なEmacsコマンドを使って候補群から1つを選ぶ必要があります。
C-f、C-b、C-n、C-pと数字キーは、
この状況で候補を選ぶために使われる特別な定義になっています。
<TAB>は、すべての候補をバッファに表示します。
日本語の入力方式19 では、まず、発音表記を使って1つの単語全体を入力します。 そして、単語がバッファに入ったあとで、 Emacsは大きな辞書を使って1つ以上の文字へ変換します。 1つの発音表記は、たくさんの異なる日本語の単語に対応しているので、 その中から選ぶ必要があります。 候補を巡回するには、C-nやC-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-flag
と
input-method-verbose-flag
は、
入力方式に何が進行中かをどのように表示させるかを制御します。
input-method-highlight-flag
がnil
以外ならば、
バッファでは(入力途中の)部分列を強調表示します。
input-method-verbose-flag
がnil
以外ならば、
(ミニバッファの中でなければ)
つぎに打鍵できる文字の一覧をエコー領域に表示します。
describe-input-method
)。
デフォルトでは、(あれば)現在の入力方式を説明する。
この説明で、ある入力方式の使い方の詳細がわかるはず。
カレントバッファに対する入力方式を選ぶには、
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と打ちます。 この一覧には、モード行に表示される入力方式を表す文字列を含めて、 各入力方式についての情報が示されます。
マルチバイト文字が使用可のときには、 文字コード0240(8進数)から0377(8進数)の文字は、 実際にそのままではバッファ内に存在しません。 正しい非ASCII印字文字は、0400から始まるコードになります。
0240から0377の不正な範囲の自己挿入文字を打った場合、 Emacsは、ISO Latin-n文字集合の1つを使おうとしていると仮定して、 Latin-nの文字を表すEmacsのコードに変換します。 言語環境の選択を介して、どのISO Latin文字集合を使うのか指定できます 何も選んでないと、デフォルトはLatin-1です。
C-qでこの範囲の8進コードを入力すると、同じことが起こります。
さまざまな言語を使うユーザーは、 それらを表現するための標準的な コーディングシステムを数多く確立してきました。 Emacsはこれらのコーディングシステムを内部的には使用しません。 そのかわり、データを読むときには、 さまざまなコーディングシステムからEmacs独自のコーディングシステムに変換し、 データを書くときには、 内部コーディングシステムから他のコーディングシステムに変換します。 ファイルの読み書き、端末とのやりとり、サブプロセスとのデータ交換において、 変換できます。
Emacsは各コーディングシステムに名前を付けています。
多くのコーディングシステムは、1つの言語で使用されるので、
コーディングシステムの名前は、言語の名前で始まります。
いくつかのコーディングシステムは、いくつもの言語で使用されます。
その場合、コーディングシステムの名前は、通常、iso
で始まります。
印字文字をまったく変換しない特別なコーディングシステム、
no-conversion
、raw-text
、emacs-mule
もあります。
非ASCII文字のさまざまな表現形の変換に加えて、 コーディングシステムは行末変換も行います。 Emacsは、ファイル内の行の区切り方として、 3つの異なる変換を扱えます。 つまり、改行、復帰改行、復帰です。
コマンドC-h C(describe-coding-system
)は、
特定のコーディングシステムについての情報を表示します。
引数にコーディングシステム名を指定できます。
あるいは、引数が空のときには、
カレントバッファに対するものとデフォルトの両方について、
さまざまな目的のために選択されている現在のコーディングシステムと、
コーディングシステムを認識するための優先順位表を説明します。
(see Recognize Coding)。
利用可能なすべてのコーディングシステムの一覧を表示するには、 M-x list-coding-systemsと打ちます。 モード行に表示される文字を含めて、 各コーディングシステムについての情報の一覧を表示します(see Mode Line)。
いかなる種類の変換も行わないno-conversion
を除いて、
この一覧に現れる各コーディングシステムは
印字文字をどのように変換する/しないを指定します。
しかし、行末変換は、各ファイルの内容に基づいて決定されます。
たとえば、ファイルが行区切りに復帰改行を使用しているように思われるときには、
その行末変換を使います。
一覧の各コーディングシステムには、 どのように行末変換するかを正確に指定する3つの変種があります。
...-unix
...-dos
...-mac
これらのコーディングシステムの変種は、
完全に予想できるのでlist-coding-systems
の表示からは
簡潔にするために除かれています。
たとえば、コーディングシステムiso-latin-1
には、
iso-latin-1-unix
、iso-latin-1-dos
、iso-latin-1-mac
の変種があります。
コーディングシステムraw-text
は、
主にASCIIテキストのファイルに適していますが、
ファイルには、非ASCII文字の符号を意味しない127を越えるバイト値が
含まれるかもしれません。
raw-text
では、
Emacsは、それらのバイトが適切に解釈されるように値を変更しないでコピーし、
カレントバッファの
enable-multibyte-characters
にnil
を設定します。
raw-text
は、出会ったデータに基づく普通の方法で行末変換を処理し、
使用する行末変換を指定する3つの変種を持ちます。
対照的に、コーディングシステムno-conversion
は、
非ASCIIバイト値と行末に対して、いかなる文字コード変換も指定しません。
これは、バイナリファイル、tarファイル、
そのまま処理する必要があるその他のファイルを読み書きするのに便利です。
これも、enable-multibyte-characters
にnil
を設定します。
いかなる種類の変換もしないでファイルを編集するもっとも簡単な方法は、
M-x find-file-literallyコマンドを使うことです。
このコマンドは、no-conversion
を使い、
あなたがファイルを見るまえにファイルの内容を
変換するかもしれないEmacsのその他の機能を抑制します。
See Visiting。
コーディングシステムemacs-mule
は、
Emacs内部の符号化のままで格納された非ASCII文字を
含むファイルであることを意味します。
これは、出会ったデータに基づいて行末変換を扱い、
行末変換の種類を指定する通常の3つの変種を持ちます。
一度自分の好みを指定しておけば、ほとんどの場合、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-conversion
にnil
以外を設定すると、
行末変換の自動的な使用を禁止できます。
ファイルの先頭の-*-...-*-
や、
ファイルの最後のローカル変数リストを使って、
個々のファイルに対してコーディングシステムを指定できます
(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-buffer
やwrite-region
も含まれます。
異なるコーディングシステムを用いてこのバッファからファイルに書きたいときには、
set-buffer-file-coding-system
を使って、
そのバッファに対して異なるコーディングシステムを指定します
(see Specify Coding)。
メイル(mail)モード(see Sending Mail)でメッセージを送るとき、
Emacsには、メッセージテキストの符号化に使うコーディングシステムを決定する
異なる方法が4つあります。
バッファのbuffer-file-coding-system
がnil
以外ならば、
その値を試します。
さもなければ、sendmail-coding-system
の値がnil
以外ならば、
その値を使います。
3つめの方法は、新しいファイルに対するデフォルトの
コーディングシステムがnil
以外ならば、それを使います。
この値は、言語環境の選択で制御されます。
これらの3つの値がすべてnil
ならば、
Emacsは、Latin-1のコーディングシステムを使用して送出メイルを符号化します。
rmailで新しいメイルを受けとったとき、
各メッセージが別々のファイルであるかのように、
各メッセージは自動的にそのメイルが書かれたコーディングシステムで変換されます。
これには、指定したコーディングシステムの優先順位表を使います。
MIMEメッセージが文字集合を指定するときには、
rmail-decode-mime-charset
がnil
でない限り、
rmailはその指定に従います。
rmailファイル自身を読んだり保存したりするときには、
Emacsは、変数rmail-file-coding-system
で指定された
コーディングシステムを使います。
そのデフォルト値は、nil
です。
rmailファイルは変換しないという意味です
(rmailファイルは、Emacsの内部文字コードで読み書きされる。)
Emacsが自動的に正しいコーディングシステムを選択しない場合には、 コーディングシステムを指定するつぎのコマンドを使用できます。
コマンドC-x <RET> f(set-buffer-file-coding-system
)は
カレントバッファに対してファイルコーディングシステムを指定します。
いいかえれば、訪問したファイルを保存したりふたたび読む込むときに
使うコーディングシステムです。
コーディングシステムはミニバッファを使って指定します。
このコマンドは、すでに訪問したファイルに作用するので、
ファイルを保存するときにしか影響しません。
ファイルに対するコーディングシステムを指定する別の方法は、
ファイルを訪問するときです。
まずコマンドC-x <RET> c
(universal-coding-system-argument
)を使います。
このコマンドは、ミニバッファを使ってコーディングシステム名を読みます。
ミニバッファを出たあと、
直後のコマンドに対して指定したコーディングシステムが使用されます。
ですから、たとえば、その直後のコマンドがC-x C-fならば、 そのコーディングシステムを使ってファイルを読みます (そして、ファイルを保存するときのために そのコーディングシステムを記録します)。 あるいは、その直後のコマンドがC-x C-wならば、 そのコーディングシステムを使ってファイルに書きます。 コーディングシステムを指定することで、影響される他のファイルコマンドは、 C-x C-iとC-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> t(set-terminal-coding-system
)は
端末出力に対するコーディングシステムを指定します。
端末出力のコーディングシステムを指定すると、
端末へのすべての文字出力はそのコーディングシステムに翻訳されます。
この機能は、特定の言語や文字集合向けに作られたある種の文字端末には便利です。 たとえば、ISO Latin 文字集合の1つを扱えるヨーロッパの端末です。 マルチバイトテキストを使っているときには、 Emacsが端末で実際に扱える文字を知るために、 端末コーディングシステムを指定する必要があります。
Emacsがあなたの端末の正しいコーディングシステムを推測できない限り、 デフォルトでは、端末出力はまったく変換しません。
コマンドC-x <RET> k(set-keyboard-coding-system
)は
キーボード入力に対するコーディングシステムを指定します。
キーボードから入力した文字コードの変換は、
非ASCII図形文字を送出するキーを有する端末には便利です。
たとえば、いくつかの端末は、ISO Latin-1やその部分集合向けに設計されています。
デフォルトでは、キーボード入力はまったく変換しません。
コーディングシステムを使用してキーボード入力を変換することと、 入力方式の使用には似たところがあります。 どちらも、1つの文字に変換するキーボード入力列を定義しています。 しかしながら、入力方式は人が対話的に使用するのに便利なように設計されていて、 変換される列は典型的にはASCII印字文字の列です。 コーディングシステムは、典型的には非図形文字の列を変換します。
コマンドC-x <RET> x(set-selection-coding-system
)は、
選択されたテキストをウィンドウシステムへ送るとき、および、
他のアプリケーションで作られたセレクションのテキストを受け取るときの
コーディングシステムを指定します。
このコマンドは、再設定しない限り、以降のすべてのセレクションに作用します。
コマンドC-x <RET> X(set-next-selection-coding-system
)は、
Emacsが作る/読むつぎのセレクションのコーディングシステムを指定します。
コマンドC-x <RET> p(set-buffer-process-coding-system
)は、
サブプロセスの入出力に対するコーディングシステムを指定します。
このコマンドはカレントバッファに作用します。
通常、各サブプロセスはそれ自身のバッファを持ちます。
ですから、各サブプロセスの入出力の変換を指定するには、
対応するバッファでこのコマンドを使用します。
デフォルトでは、プロセスの入出力はまったく変換しません。
変数file-name-coding-system
は、
ファイル名を符号化するためのコーディングシステムを指定します。
この変数に(Lispシンボルや文字列で)コーディングシステム名を設定すると、
Emacsは、すべてのファイル操作に対してそのコーディングシステムを
使ってファイル名を符号化します。
これは、ファイル名に非ASCII文字を使うことを可能にしています。
あるいは、少なくとも、指定したコーディングシステムで符号化できる
非ASCII文字を使えるはずです。
file-name-coding-system
がnil
ならば、
Emacsは、選択されている言語環境で決まるデフォルトのコーディングシステムを
使います。
デフォルトの言語環境では、
ファイル名の中の非ASCII文字は特別に符号化しません。
Emacsの内部表現でファイルシステム上に現れます。
警告:
Emacsセッションの途中でfile-name-coding-system
(や言語環境)を変更すると、問題となる場合があります。
つまり、それまでのコーディングシステムで符号化された名前のファイルを
すでに訪問していて、新しいコーディングシステムではその名前を
符号化できない(あるいは異なって符号化される)ときです。
そのようなバッファを訪問先ファイル名で保存しようとすると、
まちがった名前のファイルに保存されるか、エラーになります。
そのような問題が発生した場合には、 C-x C-wを使って、
そのバッファに新しいファイル名を指定します。
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-font
がnil
以外ならば、
これらのまちがった大きさの文字は箱で囲まれて表示されます。
Emacsはstandard-fontset-spec
の値に従って、
自動的に標準フォントセットを作ります。
フォントセットの名前はつぎのとおりです。
-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard
または、省略してfontset-standard
です。
標準フォントセットのボールド、イタリック、ボールドイタリックの変種も
自動的に作られます。
それらの名前は、medium
のかわりにbold
、
r
のかわりにi
、あるいは、両方ともそのようになります。
リソースFont
やオプション-fn
で、
デフォルトのASCIIフォントを指定すると、
Emacsはそれから自動的にフォントセットを生成します。
これが、スタートアップフォントセットで、
その名前はfontset-startup
です。
これは、フォント名のフィールド、foundry、family、
add_style、average_widthを*
で、
charset_registryをfontset
で、
charset_encodingをstartup
で置き換えて得られた文字列を
フォントセットの指定に使用します。
たとえば、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-alias
を
ISO8859-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 ti
かfangsong 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。
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-environment
にnil
以外の
値を設定します。
もし、端末でLatin-1文字集合を表示できなければ、
Emacsは、これらの文字をその文字が少なくとも何であるかを明確に理解できるような
ASCII列として表示できます。
これを行うには、ライブラリiso-ascii
をロードします。
他のLatin-n文字集合に対しても似たようなライブラリを実装できますが、
まだ行っていません。
(文字128から159の)非ISO 8859文字は、通常、8進表示されます。
ライブラリdisp-table
の関数standard-display-8bit
を使えば、
この表示を非標準の「拡張」版のISO 8859文字集合に変更できます。
1バイト非ASCII文字を入力する異なる方法が3つあります。
(set-input-mode (car (current-input-mode)) (nth 1 (current-input-mode)) 0)
ライブラリiso-transl
をロードすることでC-x 8は動作する。
ライブラリをロードしておくと、
<ALT>修飾キーがあるならば、C-x 8と同じ目的で使用できる。
後続の文字を修飾するには、アクセント文字と一緒に<ALT>を使う。
さらに、Latin-1の『専用アクセント文字』キーがあると、
iso-transl
をロード後は、
それらのキーも後続の文字を合成するように定義される。
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。)
カレントバッファに対して明示的にメジャーモードを選択することもできます。 しかし、たいていは、ファイル名やファイル内の特別のテキストに基づいて 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)
の形式で
flagがnil
以外ならば、
functionを呼んだあとにregexpに一致する接尾辞を捨てて、
リストで他に一致するものをふたたび探します。
ファイルの空行でない最初の行の特別な種類のテキストによって、
そのファイルを編集するためにどのメジャーモードを使うかを指定できます。
モード名は、その行に-*-
で囲まれて現れます。
他のテキストがその行にあってもかまいません。
たとえば、
;-*-Lisp-*-
は、EmacsにLispモードを使うように指示します。 このような明示的な指定は、 ファイル名に基づいたメジャーモードに優先します。 この行がLispのコメントになるように セミコロンを使っていることに注意してください。
モードを指定する別の書式は、つぎのとおりです。
-*- mode: modename;-*-
これは、同様にローカル変数も指定できて、つぎのように書きます。
-*- mode: modename; var: value; ... -*-
より詳しくは、See File Variables。
ファイルの内容が#!
で始まるときは、
ファイルの1行目で指定したコマンドインタープリタを実行することで、
実行可能なシェルコマンドとして働きます。
ファイルの残りの部分は、インタープリタへの入力として使われます。
Emacsでそのようなファイルを訪問したとき、
ファイルの名前がメジャーモードを指定しないときには、
Emacsはモードを選択するために1行目のインタープリタの名前を使います。
1行目が、perl
やtcl
のような認識される
インタープリタプログラムの名前ならば、
Emacsはインタープリタのプログラムにとって適切なモードを使用します。
変数interpreter-mode-alist
は、
インタープリタプログラム名とメジャーモードとの対応を指定します。
1行目が#!
で始まるときには、
インタープリタを実行するときにシステムが混乱するため、
1行目では-*-
の機能を使えません。
そのため、そのようなファイルでは、Emacsは1行目に加えて2行目でも
-*-
を探します。
使用するメジャーモードを指定しないファイルを訪問したとき、
あるいは、C-x bで新たにバッファを作るときには、
変数default-major-mode
が、使用するモードを指定します。
通常、その値は、基本(fundamental)モードを指定する
シンボルfundamental-mode
です。
default-major-mode
がnil
なら、
メジャーモードはまえに選択していたバッファのモードと同じものとなります。
バッファのメジャーモードを変更しても、
Emacsが自動的に選択するメジャーモードに戻れます。
それには、コマンドM-x normal-modeを使います。
このコマンドは、メジャーモードを選択するために
find-file
が呼び出す関数と同じ関数です。
この関数は、ファイル中にローカル変数リストがあればそれも処理します。
コマンドC-x C-wとset-visited-file-name
は、
新しいファイル名がモードを示すものであるなら、
新しいメジャーモードに変更します(see Saving)。
しかし、バッファの内容がメジャーモードを指定していて、かつ、
ある『特別な』メジャーモードがそのモードの変更を許さないなら、
メジャーモードは変更されません。
change-major-mode-with-file-name
をnil
に設定すると、
このモード変更機能をオフにできます。
本章では、字下げ(indentation)を 付加/削除/調整するEmacsコマンドについて説明します。
newline-and-indent
)。
delete-indentation
)。
C-jの効果を取り消す。
split-line
)。
back-to-indentation
)。
indent-region
)。
indent-rigidly
)。
tab-to-tab-stop
)。
ほとんどのプログラム言語には、字下げの慣習があります。 Lispコードでは、括弧の入れ子の深さに従って行を字下げします。 細部はかなり異なりますが、概念的にはCコードでも同様の考え方で字下げします。
どんな言語であっても、行を字下げするには<TAB>コマンドを使います。 各メジャーモードでは、特定の言語に適した字下げを行うように、 このコマンドを定義します。 Lispモードでは、<TAB>は括弧の深さに応じて行を整列します。 行のどこで<TAB>を打鍵しても、その行全体を整列します。 Cモードでは、<TAB>は、 Cの構文上のさまざまな側面を考慮した巧みで洗練された 字下げスタイルを実現しています。
テキスト(text)モードでは、
<TAB>はtab-to-tab-stop
コマンドを実行します。
これは、つぎのタブストップ位置まで字下げを行います。
タブストップ位置はM-x edit-tab-stopsで設定できます。
行の字下げを飛び越えるには、M-m(back-to-indentation
)を使います。
行のどこで実行しても、その行の空白でない最初の文字位置にポイントを移動します。
現在行のまえに字下げした行を挿入するには、 C-a C-o <TAB>を使います。 現在行のあとに字下げした行を挿入するには、C-e C-jを使います。
単にタブ文字を挿入するには、C-q <TAB>と打ちます。
C-M-o(split-line
)は、
ポイントから行末までのテキストを垂直に下ろします。
その結果、現在行は2つの行に分割されます。
C-M-oは、まず、ポイントの直後に空白やタブがある限りポイントを進めます。
そして、ポイントの直後に、
改行とポイント位置の桁までに必要な字下げを挿入します。
ポイント自身は挿入した改行の直前に留まります。
この点では、C-M-oはC-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-relative
はtab-to-tab-stop
を実行します
字下げテキスト(indented text)モードでは、
<TAB>はindent-relative
と定義されます。
See Text。
テキストの一部を字下げする別の方法についてはSee Format 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。
Emacsでは、通常、行の字下げにはタブと空白の両方を使用します。
しかし、空白だけを用いて字下げを行うことも可能です。
そうするには、変数indent-tabs-mode
にnil
を設定します。
この変数はバッファごとの変数です。
変数を変更してもカレントバッファだけに影響しますが、
デフォルト値を変更することもできます。
See Locals。
空白以外のテキストの桁を保存したまま、タブを空白(あるいはその逆)に 変換するコマンドもあります。 M-x tabifyは、リージョン内の連続する空白を探して、 字下げを変えることがなければ少なくとも連続する3個の空白をタブに変換します。 M-x untabifyは、リージョン内のすべてのタブを 適切な個数の空白に変換します。
コンピュータの分野では、テキスト(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の画面上で整形結果を見ながら編集できるわけです。
Emacsには、単語を横断してポイントを移動したり、 単語を操作対象とするコマンドがあります。 慣例として、これらのコマンドのキーはメタ文字です。
forward-word
)。
backward-word
)。
kill-word
)。
backward-kill-word
)。
mark-word
)。
transpose-words
)。
これらのキーは、文字単位の操作コマンド、C-f、C-b、 C-d、<DEL>、C-tに対応していることに注目してください。 M-@も、C-<SPC>の別名であるC-@に対応しています。
コマンドM-f(forward-word
)と
M-b(backward-word
)は、
単語を横断してポイントを前向きに(末尾に向かって)
あるいは後向きに(先頭に向かって)移動します。
これらのメタ文字は、文字単位でポイントを前後に移動する
コントロール文字C-fやC-bに類似しています。
この類似性は、数引数を反復回数として扱うことにもおよびます。
負の引数を指定すると、M-fは後向きに移動し、
M-bは前向きに移動します。
前向き移動では単語の最後の文字の直後に、
後向き移動では最初の文字の直前に、ポイントを移動します。
21
M-d(kill-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-t(transpose-words
)は、
ポイントの直前にある単語あるいはポイントを含む単語と、
後続の単語とを入れ替えます。
単語のあいだにある区切り文字は動きせん。
たとえば、FOO, BAR
を入れ替えると、
BAR FOO,
ではなくBAR, FOO
となります。
入れ替えや入れ替えコマンドの引数については、
See Transpose。
ポイントとマークのあいだに適用される操作を後続のn個の単語に適用する方法は、
2つあります。
ポイント位置にマークを設定してから、単語を横断してポイントを移動します。
あるいは、コマンドM-@(mark-word
)を使います。
このコマンドは、ポイントを移動せずに、
M-fによる移動位置にマークを設定します。
M-@には、何単語先にマークを設定するかを数引数で指定できます。
暫定マーク(transient-mark)モードでは、このコマンドはマークを活性にします。
単語操作コマンドが理解する構文は、すべて構文テーブルで制御されます。 たとえば、任意の文字を単語の区切り文字として宣言できます。 See Syntax。
Emacsの文/段落操作コマンドは、単語操作コマンドと同じく、 ほとんどメタキーです。
backward-sentence
)。
forward-sentence
)。
kill-sentence
)。
backward-kill-sentence
)。
コマンドM-aとM-e
(backward-sentence
とforward-sentence
)は、
それぞれ、ポイントを含む文の先頭あるいは末尾にポイントを移動します。
これらは、行頭や行末にポイントを移動するコマンドC-aとC-eに
類似するように選ばれました。
ただし、M-aやM-eを反復して使ったり数引数を指定すると、
ポイントは連続した文を横断して移動する点が違います。
(文頭に向かって)後向きに移動するときは、 文の先頭の文字の直前にポイントを置きます。 (文末に向かって)前向きに移動するときは、 文を終える句読点の直後に置きます。 どちらのコマンドも、文と文の境界にある白文字に ポイントを移動することはありません。
C-aとC-eには調和したキルコマンドC-kがあるように、
M-aとM-eにもコマンドM-k(kill-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個だけ追加することを指示します。
ただし、このように設定すると、
文末のピリオドと省略のピリオドとを区別できなくなることに注意してください。
段落を操作するEmacsコマンドもメタキーです。
backward-paragraph
)。
forward-paragraph
)。
mark-paragraph
)。
M-{は、ポイントを含む段落の先頭か、 まえの段落の先頭にポイントを移動します。 一方、M-}は、ポイントを含む段落の末尾か、 つぎの段落の末尾にポイントを移動します。 段落は、空行やテキスト整形コマンドの行で区切られますが、 それらの行自体は段落には属しません。 基本(fundamental)モードでは、 字下げした行も新たな段落の始まりとみなしますが、 テキスト(text)モードではそうしません。 (段落の直前に空行があれば、 これらのコマンドはそれらを段落の先頭として扱う。)
プログラム用のメジャーモードでは、段落は空行で始まり空行で終ります。 こうしておけば、本来段落を持たないプログラムでも 段落操作コマンドが役立ちます。
詰め込み接頭辞がある場合には、接頭辞で始まらない行が段落の区切りとなります。 See Filling。
段落を対象に操作したいときには、
コマンドM-h(mark-paragraph
)を使って
段落を囲むようなリージョンを設定します。
したがって、たとえば、M-h C-wとすると、
ポイントを含むか直後の段落を削除します。
M-hコマンドは、ポイントを含む段落の先頭にポイントを置き、
末尾にマークを設定します。
暫定マーク(transient-mark)モードでは、このマークを活性にします。
ポイントが段落のあいだ(空行や境界)にある場合は、
ポイントの直後にある段落の周りにポイントとマークを設定します。
段落の1行目のまえに空行があれば、
直前の空行1行もM-hが設定するリージョンに含まれます。
正確な段落の境界は、変数paragraph-separate
と
paragraph-start
で定義されます。
paragraph-start
の値は、
段落を始めたり区切ったりする行に一致する正規表現です。
paragraph-separate
の値も別の正規表現ですが、
どの段落にも属さない段落を分割する行(たとえば空行)だけに一致するものです。
新たな段落を始めてその段落に属す行は、paragraph-start
だけに一致して、
paragraph-separate
に一致してはいけません。
たとえば、基本(fundamental)モードでは、
paragraph-start
は"[ \t\n\f]"
であり、
paragraph-separate
は"[ \t\f]*$"
です。
通常、ページ境界でも段落が区切られるのが望ましいです。 これらの変数のデフォルト値は、ページの一般的な区切り文字も認識します。
ファイルをページ送り文字(ASCIIコードのコントロールL、8進コードの014) で区切ったページの集まりとして捉えることがよくあります。 ファイルを印刷すると、この文字は改ページを行います。 そのため、ファイル内の各ページは別々の用紙に印刷されます。 ほとんどのEmacsコマンドは、ページを区切る文字を他の文字と同様に扱いますから、 C-q C-lでページ送り文字を挿入したり、<DEL>で削除できます。 つまり、ファイルをページに区切るのも区切らないのも自由です。 しかし、ページはファイルを分割する意味ある単位なので、 Emacsには、ページ間の移動やページを対象とするコマンドがあります。
backward-page
)。
forward-page
)。
mark-page
)。
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"
で、
行頭のページ送り文字に一致します。
テキストの詰め込み(filling)とは、 指定した幅に納まるようにテキストを行に分割することです。 Emacsには、詰め込む方法が2つあります。 自動詰め込み(auto-fill)モードでは、 自己挿入文字でテキストを挿入すると同時に詰め込みを行います。 あるいは、詰め込まずにテキストを編集しているときには、 陽に詰め込みコマンドを使います。 整形済みテキストを編集しているときは、 テキストの各部分ごとに詰め込みのスタイルを指定できます (see Formatted Text)。
自動詰め込み(auto-fill)モードはマイナモードで、 行が長くなりすぎると自動的に分割します。 <SPC>や<RET>を打鍵したときだけ、行を分割します。
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。
fill-paragraph
)。
set-fill-column
)。
fill-region
)。
段落を詰め直すには、コマンドM-q(fill-paragraph
)を使います。
ポイントを含む段落、あるいは、
ポイントが段落のあいだにある場合には直後の段落を操作します。
改行をすべて取り除いてから、必要な箇所に新たに改行を挿入することで
段落を詰め直します。
いくつもの段落を詰め直すには、M-x fill-regionを使います。 これは、リージョンを段落に分けてから、各段落を詰め込みます。
M-qとfill-region
は、M-hと同じ基準で段落の境界を
探します(see Paragraphs)。
段落の大きさを制御するには、M-x fill-region-as-paragraphを使います。
これは、ポイントとマークのあいだにあるものすべてを詰め直します。
このコマンドはリージョン内の空行をすべて削除して、
分かれていたテキストの塊を1つの塊にまとめ上げます。
M-qに数引数を指定すると、テキストの詰め込みだけでなく、
テキストの幅揃え(justify)も行います。
つまり、余分に空白を挿入して、行の右端が詰め込み桁に一致するようにします。
余分な空白を取り除くには、引数を指定しないでM-qを使います。
(fill-region
も同様。)
幅揃えを制御して別の詰め込みスタイルを選択する別の方法は、
テキスト属性justification
を使うことです。
これに関しては、Format Justificationを参照してください。
コマンドM-s(center-line
)は、
詰め込み桁までの範囲内で現在行を中央に揃えます。
引数nを指定すると、
現在行を含めn行をそれぞれ独立に中央に揃えてから、
揃えた行のつぎにポイントを移動します。
詰め込むときの行の最大幅は、変数fill-column
に入っています。
fill-column
の値を変更すると、
カレントバッファにローカルな変数になります。
それまではデフォルト値が有効です。
デフォルト値は始めは70です。
See Locals。
fill-column
を設定するもっとも簡単な方法は、
コマンドC-x f(set-fill-column
)を使うことです。
このコマンドに数引数を指定すると、
その値を新たな詰め込み桁として使います。
C-uだけを引数に指定すると、
ポイントの現在の水平位置をfill-column
に設定します。
Emacsコマンドは通常、 ピリオドの直後に空白が2個あるか改行があれば文末として扱います。 ピリオドの直後に空白が1個だけでは、文末ではなく省略とみなします。 ピリオドのこれら2つの用法の違いを保存するために、 ピリオドの直後に空白が1個だけの箇所では詰め込みコマンドは行を分割しません。
変数sentence-end-double-space
がnil
ならば、
詰め込みコマンドは、文末には空白が1個だけあると仮定し、かつ、
文末には空白を1個だけ残します。
普通、この変数の値はt
なので、
上述のように空白が2個ある場合だけを文末として扱います。
See Sentences。
colon-double-space
がnil
以外ならば、
詰め込みコマンドはコロンのうしろに空白を2個置きます。
各行が(段落を字下げする数個の空白などの)特別の印で始まっている 段落を詰め込むには、詰め込み接頭辞(fill prefix)の機能を使えます。 詰め込み接頭辞は文字列であり、 Emacsはすべての行がその文字列で始まると仮定しますが、 詰め込み接頭辞自体は詰め込みの対象ではありません。 明示的に詰め込み接頭辞を指定できますが、 Emacsが詰め込み接頭辞を自動的に推測することもできます (see Adaptive Fill)。
set-fill-prefix
)。
fill-paragraph
)。
詰め込み接頭辞を指定するには、
目的の接頭辞で始まっている行に移動して接頭辞の直後にポイントを置いてから、
コマンド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。
詰め込みコマンド自身が、 段落に対する適切な詰め込み接頭辞を推測できる状況もあります。 段落のすべての行の先頭に白文字やある種の句読点文字が使われている場合です。
段落が2行以上から成る場合、 段落の2行目から詰め込み接頭辞を切り出しますが、 1行目にもそれが現れるときに限ります。
段落が1行だけの場合には、その行から詰め込み接頭辞を切り出す かもしれません 23。 こういった状況では、つぎのような3つの合理的な挙動が考えられるので、 接頭辞の決定は複雑です。
これら3つの整形スタイルは、いずれも一般的に使用されます。 そこで、詰め込みコマンドは、現れた接頭辞とそのときのメジャーモードに基づいて、 ユーザーが望むスタイルを決定しようとします。 判断基準はつぎのとおりです。
1行目でみつけた接頭辞がadaptive-fill-first-line-regexp
に一致するか、
(メジャーモードに依存する)コメント開始文字列のようであれば、
みつけた接頭辞を段落の詰め込みに用います。
ただし、その接頭辞が後続の行に対して段落の始まりにならない場合に限ります。
さもなければ、みつけた接頭辞を相当分の空白に変換して、 それらの空白を段落の2行目以降の詰め込み接頭辞として使います。 ただし、それらの空白が後続の行に対して段落の始まりにならない場合に限ります。
テキスト(text)モード、および、 空行やページ区切りだけが段落を区切るモードでは、 適応型詰め込みによって選ばれた接頭辞が 段落の始まりになることはけっしてありませんから、 その接頭辞を段落の詰め込みに使用することができます。
変数adaptive-fill-regexp
で、
行頭のどんな文字列を詰め込み接頭辞として使えるかを決定します。
この変数の正規表現に一致する行頭の文字列を接頭辞とします。
変数adaptive-fill-mode
にnil
を設定すると、
詰め込み接頭辞を自動的には切り出しません。
変数adaptive-fill-function
に関数を設定すると、
詰め込み接頭辞を自動的に切り出すためのより複雑な方法を指定できます。
この関数は行の左端の直後にポイントを置いて呼び出されます。
その行から類推される適切な詰め込み接頭辞を返さなくてはいけません。
その行に詰め込み接頭辞がなさそうであればnil
を返します。
Emacsには、単語や任意の長さのテキストを 大文字あるいは小文字に変換するコマンドがあります。
downcase-word
)。
upcase-word
)。
capitalize-word
)。
downcase-region
)。
upcase-region
)。
単語変換コマンドはたいへん便利です。
M-l(downcase-word
)は
ポイントの直後の単語を小文字に変換し、
単語の末尾にポイントを移動します。
したがって、M-lを繰り返すと、連続した単語を変換できます。
M-u(upcase-word
)は単語を大文字に変換し、
M-c(capitalize-word
)は単語の1文字目を
大文字して残りを小文字に変換します。
これらのコマンドに引数を指定すると、一度に数単語を変換できます。
これらのコマンドは、大文字だけの大量のテキストを
大文字小文字が混在するように変換するときに、特に威力を発揮します。
というのは、必要に応じてM-l、M-u、
M-cを使い分けて移動したり、M-fで変換せずに単語を
飛び越えられるからです。
負の引数を指定すると、ポイントの直前にある数個の単語を変換しますが、 ポイントは移動しません。 これは、大文字小文字をまちがえて単語を入力した直後には便利です。 大文字小文字変換コマンドを打ってからすぐに入力を再開できます。
単語の途中で大文字小文字変換コマンドを実行すると、
ポイントのうしろにある部分だけを変換します。
これはM-d(kill-word
)のふるまいと同じです。
また、負の引数を指定すると、ポイントよりまえの部分を変換します。
他の大文字小文字変換コマンドは、
C-x C-u(upcase-region
)と
C-x C-l(downcase-region
)です。
これらは、リージョン内のテキストを指定どおりに変換します。
ポイントもマークも移動しません。
リージョンに対する大文字小文字変換コマンドである
upcase-region
とdowncase-region
は、
通常、使用禁止になっています。
つまり、これらのコマンドを使おうとすると、最初に確認を求めてきます。
確認するときにコマンドを使用可にしておけば、つぎからは確認を求めてきません。
See Disabling。
自然言語テキストのファイルを編集するときには、 基本(fundamental)モードではなく テキスト(text)モードを使ったほうが便利です。 テキスト(text)モードに入るにはM-x text-modeと打ちます。
テキスト(text)モードでは、空行とページ区切りだけが段落の区切りです。 その結果、段落を字下げできて、 適応型詰め込みでは段落の詰め込みに使用する字下げを決定できます。 See Adaptive Fill。
テキスト(text)モードでは、<TAB>は
indent-relative
(see Indentation)を実行するように
定義してあるので、先行する行と同じように字下げするのに便利です。
先行する行が字下げされてなければ、
indent-relative
はtab-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。
アウトライン(outline)モードはテキスト(text)モードにたいへん よく似たメジャーモードですが、アウトライン構造を持つテキストの編集用です。 アウトライン構造を把握できるようにテキストの一部を一時的に不可視にできます。 カレントバッファのメジャーモードをアウトライン(outline)モードに 切り替えるには、M-x outline-modeと打ちます。
アウトライン(outline)モードで行を不可視にすると、 その行は画面上に表示されません。 画面上では、不可視にした行が削除されたかのように見えますが、 それに先行する可視な行の末尾に省略記号(ピリオドが3つ...)が表示されます (何行不可視にしていても、省略記号は1つだけ)。
C-nやC-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)。
アウトライン(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つの単語、chapter
とsection
は同じ長さですが、
正規表現では、chap
だけに一致するように定義することで、
章見出しに一致するテキストの長さのほうを短くできます。
これによって、アウトライン(outline)モードは、
章(chapter)の中に節(section)が含まれるとわかるのです。
他のコマンドが@chap
で始まらない限り、この設定は有効です。
変数outline-level
を設定すると、見出し行のレベル計算方法を変更できます。
outline-level
の値は、引数を取らない、
現在の見出しのレベルを返す関数である必要があります。
Cモード、nroffモード、Emacs Lispモードといったメジャーモードのいくつかでは、
アウトラインマイナ(outline-minor)モードが有効に働くように、
この変数を設定します。
アウトライン(outline)モードには、 前後の見出し行に移動する特別なコマンドがあります。
outline-next-visible-heading
)。
outline-previous-visible-heading
)。
outline-forward-same-level
)。
outline-backward-same-level
)。
outline-up-heading
)。
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
)は、
より浅いレベルの見出し行へ戻るようにポイントを移動します。
アウトライン(outline)モードの特別なコマンドとして、
行を可視/不可視にするものもあります。
これらのコマンドの名前は、すべてhide
あるいはshow
で始まります。
これらのほとんどは、逆の機能のコマンドと対になっています。
これらのコマンドはアンドゥ可能ではありませんが、
実行直後ならば戻すことはできます。
行を可視/不可視にするのは、アンドゥ機構に単純に記録するのではありません。
hide-body
)。
show-all
)。
hide-subtree
)。
show-subtree
)。
hide-leaves
)。
show-branches
)。
show-children
)。
hide-entry
)。
show-entry
)。
hide-sublevels
)。
hide-other
)。
C-c C-c(hide-entry
)と
C-c C-e(show-entry
)の2つのコマンドは、
正反対の機能を持っています。
これらは、見出し行にポイントがある場合
24
に、その本体のみに作用します。
下位見出しとその本体は影響を受けません。
もっと強力で機能が正反対のコマンドは、
C-c C-d(hide-subtree
)と
C-c C-s(show-subtree
)です。
どちらも見出し行にポイントがあるとき
25
に使い、
見出しの部分木内のすべての行
つまり、本体、直接/間接に関わらずあらゆる下位の見出しとその本体、
に作用します。
つまり、部分木には、その見出し行に続く
つぎの同レベルか上位レベルの見出し行の直前までが含まれます。
可視な部分木と、すべて不可視な部分木の中間的な状態には、
本体は不可視で下位の見出し行はすべて可視といったものも存在します。
この状態を作り出すコマンドは2つあり、
本体を不可視にするか、下位見出しを可視にするかです。
これらは、C-c C-l(hide-leaves
)と
C-c C-k(show-branches
)です。
C-c C-i(show-children
)は、
show-branches
より少し弱いコマンドです。
これは、直下の、つまり1レベル深い見出し行だけを可視にします。
より深いレベルの見出しは不可視ならば不可視のままです。
ファイル全体に効果がおよぶ2つのコマンドがあります。
C-c C-t(hide-entry
)は本体行をすべて不可視にするので、
アウトライン構造だけを眺めることができます。
C-c C-a(show-all
)は、すべての行を可視にします。
C-c C-aは本体行以外にも作用しますが、
これらのコマンドは正反対の機能の対と考えることができます。
コマンドC-c C-q(hide-sublevels
)は、
最上位レベルの見出し以外をすべて不可視にします。
数引数nを指定すると、最上位からnレベルまでの見出し行を除いた
すべてを不可視にします。
コマンドC-c C-o(hide-other
)は、
ポイント位置の見出しあるいは本体、その親(
アウトライン構造においてポイント位置から最上位レベルまで至る見出し)を
除いたすべてを不可視にします。
変数selective-display-ellipses
にnil
を設定すると、
可視な行の末尾に現れる省略記号を消せます。
そうすると、不可視な行の存在を示すものは何もなくなります。
インクリメンタルサーチでアウトライン(outline)モードが 不可視にしているテキストを探しだすと、バッファのその部分は可視になります。 その箇所で探索から抜けると、テキストは可視のまま 26になります。
1つのアウトライン構造を同時に2つの視点から別々のウィンドウに表示して 眺めることができます。 それには、M-x make-indirect-bufferを使って 間接バッファを作成する必要があります。 このコマンドの最初の引数は、既存のアウトライン用バッファの名前で、 2番目の引数は新たに作成する間接バッファの名前です。 See Indirect Buffers。
間接バッファがあるならば、C-x 4 bや他のEmacsコマンドで普通に そのバッファをウィンドウに表示できます。 テキストの一部を可視/不可視にするアウトライン(outline)モードのコマンドは、 各バッファで独立に働きます。 その結果、各バッファごとに独自の視点を持たせることが可能です。 同じアウトラインに対して3つ以上の視点が必要ならば、 間接バッファをさらに作成してください。
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-mode、M-x latex-mode、 M-x slitex-modeで明示的にTeXの変種を選択できます。
ここでは、TeXの入力ファイルのテキストを編集するために TeXモードに用意してある特別なコマンドについて述べます。
``
、"
、''
を挿入する
(tex-insert-quote
)。
tex-terminate-paragraph
)。
{}
を挿入して、そのあいだにポイントを移動する
(tex-insert-braces
)。
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-j(tex-terminate-paragraph
)は、
ポイントの直前の段落を検査してから、新たな段落を始める空行を2つ挿入します。
対応していない中括弧があれば、エコー領域にメッセージを表示します。
M-x tex-validate-regionは、リージョンの段落を1つ1つ検査します。
エラーはバッファ*Occur*
に表示されます。
このバッファでC-c C-cやMouse-2を使えば、
特定の非対応箇所へ移動できます。
TeXモードでは、Emacsコマンドは中括弧だけでなく、
括弧(()
)や角括弧([]
)も数えています。
これは、TeXの構文を検査する目的からいえば、厳密には正しくありません。
しかし、括弧や角括弧はテキスト内で対応する区切りとしてよく使われますし、
各種の移動コマンドや対応関係を自動表示するコマンドが
それらを扱えると便利です。
LaTeXモードと、その変種のSliTeX モードには、 プレインTeX(plain-tex)では利用できない特別な機能がいくつかあります。
\begin
と\end
を挿入し、
それらのあいだにポイントを置く(tex-latex-block
)。
tex-close-latex-block
)。
LaTeXの入力では、\begin
と\end
がテキストのブロックを
グループ化するために使われます。
\begin
と対応する\end
を(\begin
のつぎの新しい行に)
挿入するには、C-c C-o(tex-latex-block
)を使います。
それらのあいだには空行が挿入されてポイントもそこに置かれます。
ブロックの種類を入力するときには、補完を使えます。
標準のリストに含まれないブロック名を使う場合には、
変数latex-block-names
に設定します。
つぎの例は、theorem
、corollary
、proof
を追加するものです。
(setq latex-block-names '("theorem" "corollary" "proof"))
LaTeXの入力では、
\begin
と\end
は対応が取れている必要があります。
C-c C-e(tex-close-latex-block
)を使うと、
対応が取れていない最後の\begin
に対応する\end
を
自動的に挿入できます。
また、対応する\begin
と同じ字下げを\end
にも施します。
ポイントが行頭にあったときには、\end
のうしろで改行します。
バッファ全体あるいは一部のテキストに対して、 Emacsの下位プロセスとしてTeXを起動できます。 特定の章だけに対してこのようにTeXを実行するのは、 ファイル全体の清書に時間を費すことなく、 変更部分の見え方を確認するよい方法です。
tex-region
)。
tex-buffer
)。
tex-bibtex-file
)。
tex-file
)。
tex-recenter-output-buffer
)。
tex-kill-job
)。
tex-print
)。
tex-view
)。
tex-show-print-queue
)。
C-c C-b(tex-buffer
)を使えば、
カレントバッファの内容を下位のTeXに渡すことができます。
清書結果は一時ファイルに出力されます。
それを印刷するには、C-c C-p(tex-print
)と打ちます。
そのあとで、印刷の進捗状況を確認するには
C-c C-q(tex-show-print-queue
)を利用できます。
TeXの出力ファイルを表示する機能を持った端末があれば、
C-c C-v(tex-view
)でプレビューできます。
TeXが実行時に使うディレクトリを指定するには、
変数tex-directory
に設定します。
デフォルトの値は"."
です。
環境変数TEXINPUTS
に相対的なディレクトリ名が入っていたり、
TeXの\input
コマンドに相対的なファイル名を指定してある場合には、
tex-directory
は"."
である必要があります。
さもないと、誤った結果になるでしょう。
そういった状況でなければ、"/tmp"
のような、
他のディレクトリを設定しても安全です。
下位のTeXを起動するために使うコマンドを指定したければ、
変数tex-run-command
、latex-run-command
、
slitex-run-command
、tex-dvi-print-command
、
tex-dvi-view-command
、tex-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-k(tex-kill-job
)と打ちます。
C-c C-bやC-c C-rを使っても、
動作中のTeXプロセスを終了できます。
C-c C-r(tex-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-buffer
とtex-region
は、
一時的なディレクトリ上ですべての作業を行うので、
相互参照のためにTeXが必要とする補助ファイルを使用できません。
一般に、これらのコマンドは、相互参照がすべて正しい必要がある
最終的な原稿の作成には適していません。
相互参照のための補助ファイルを必要とする場合には、
カレントバッファのファイルを入力として、そのファイルを置いたディレクトリで
TeXを実行するC-c C-f(tex-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 TAB(tex-bibtex-file
)は、
カレントバッファのファイルに対する.bbl
ファイルを
生成するためのシェルコマンド(tex-bibtex-command
)を実行します。
通常は、まず.aux
ファイルを作るために
C-c C-f(tex-file
)を一度実行してから、
つぎにC-c TAB(tex-bibtex-file
)を実行し、
正しい相互参照を得るためにC-c C-f(tex-file
)を
さらに2回実行します。
どのTeXモードに入っても、
フックtext-mode-hook
とtex-mode-hook
を実行します。
そのあとで、
plain-tex-mode-hook
かlatex-mode-hook
の適切なフックを実行します。
SliTeXファイルに対しては、slitex-mode-hook
を呼びます。
TeX用のシェルの開始時には、フックtex-shell-hook
を実行します。
See Hooks。
nroffモードはテキスト(text)モードに似ていますが、
テキスト中のnroffコマンドを扱えるように変更してあります。
このモードに入るには、M-x nroff-modeを実行します。
テキスト(text)モードとは、2、3の点で異なるだけです。
nroffコマンドを含んだ行は、すべて段落区切りとみなすので、
詰め込みによってnroffコマンドが本文に混ざってしまうことはありません。
ページは.bp
コマンドで分割されます。
コメントは.\"
で始まります。
また、テキスト(text)モードにはない、つぎの3つの特別なコマンドがあります。
forward-text-line
)。
引数は反復回数。
backward-text-line
)。
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)。
エンリッチ(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
があります。
このファイルには、本節で説明するすべての機能の実例が盛り込まれています。
また、将来の拡張に関するアイデアも述べてあります。
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-visiting
にnil
かask
を設定します。
しかし、エンリッチ(enriched)モードで保存したファイルを訪問するときには、 Emacsは右端の設定をテキストと一緒に保存しているので、 テキストを再度詰め込む必要はありません。
通常はEmacsが保存しないテキスト属性に対する注記(annotation)も
保存するようにするには、
変数enriched-translations
に追加しておきます。
text/enriched規格では、非標準の注記には、x-read-only
のように
x-
で始まる名前が必要なことに注目してください。
これによって、あとから追加される標準的な注記と
名前が衝突しないことが保証されます。
Emacsは整形済みテキスト中の改行を、 ハード改行とソフト改行の2種類に区別します。
ハード改行は、段落の区切り、リスト内の項目、
左右端に関係なく行分割がつねに必要な箇所に用いられます。
<RET>コマンド(newline
)とC-o(open-line
)は
ハード改行を挿入します。
ソフト改行は、テキストを左右端のあいだに納めるために使用されます。 自動詰め込み(auto-fill)モードを含めたすべての詰め込みコマンドは ソフト改行を挿入し、ソフト改行だけを削除します。
ハード改行とソフト改行は見た目は同じですが、違いを理解することは重要です。 詰め込んだ段落の途中で行に分割するときに<RET>を使ってはいけません。 あとの詰め込みの妨げとなるハード改行を挿入してしまいます。 かわりに、自動詰め込み(auto-fill)モードに行分割を行わせて、 テキストや左右端が変化してもEmacsが適切に再度詰め込めるようにします。 See Auto Fill。
一方、表やリストのように、入力したとおりの行にしておく必要がある場合には、
<RET>で行を終えます。
これらの行では、幅揃えのスタイルとしてunfilled
を
指定するのもよいかもしれません。
See Format Justification。
整形済みテキストファイルの整形情報を変更するには、2つの方法があります。 キーボードコマンドを使うか、マウスを使います。
文書に属性を追加するもっとも簡単な方法は、 Text Propertiesメニューを使用することです。 このメニューを出すには2つの方法があります。 メニューバーのEditメニューから選択するか、 C-mouse-2(<CTRL>キーを押し下げたままマウスの真中のボタンを押す) です。
Text Propertiesメニューのほとんどの項目には、 別のサブメニューがついています。 これらについては後述します。 コマンドを直接実行する項目もあります。
Remove Properties
facemenu-remove-props
)。
Remove All
facemenu-remove-all
)。
List Properties
list-text-properties-at
)。
Display Faces
Display Colors
Facesサブメニューには、bold
、italic
、underline
といっ
たEmacsで使用できる各種フェイスが並んでいます。
その中から1つを選ぶと、リージョンにフェイスを追加します。
See Faces。
以下のキーボードコマンドでフェイスを指定することもできます。
default
にする
(facemenu-set-default
)。
bold
にする
(facemenu-set-bold
)。
italic
にする
(facemenu-set-italic
)。
bold-italic
にする
(facemenu-set-bold-italic
)。
underline
にする
(facemenu-set-underline
)。
facemenu-set-face
)。
前置引数を指定してこれらのコマンドを使ったり、 暫定マーク(transient-mark)モードでリージョンが選択されていなければ、 これらのコマンドはつぎに入力する自己挿入文字だけに使うフェイスを指定します。 See Transient Mark。 これはキーボードコマンドとメニューコマンドの両方に通用します。
エンリッチ(enriched)モードには、
excerpt
とfixed
の2つの追加フェイスが定義されています。
これらのフェイスは、text/enrichedファイル形式で
使用されるコードに対応しています。
excerpt
フェイスは引用を表すためのものです。
カスタマイズしてなければitalic
と同じです
(see Face Customization)。
fixed
フェイスは、『この部分のテキストには固定幅フォントを使用する』と
いう意味です。
現在、Emacsは固定幅フォントにだけ対応しています。
したがって、fixed
の注記は今のところ必要ありません。
しかしながら、将来のEmacsでは可変幅フォントに対応したり、
固定幅フォントをデフォルトとしないtext/enriched形式を
表示可能な他のシステムを計画しています。
ですから、固定幅フォントをどうしても使いたい箇所には、
その部分のテキストにfixed
を指定するべきです。
通常、fixed
フェイスには、デフォルトと異なるフォントを使うように
定義されています。
ところが、システムごとにさまざまなフォントがありますから、
この定義をカスタマイズする必要があるかもしれません。
異なるフェイスを表示できない端末ではそれらの違いを目にすることはできませんが、 それでも、さまざまなフェイスを含む文書の編集は行えます。 文書にフェイスや表示色を追加することもできます。 それらを表示可能な端末で見たときにフェイスや色を目にすることができます。
テキストの部分ごとに前景色と背景色を指定できます。 前景色を指定するメニューと背景色を指定するメニューがあります。 これらのメニューには、そのEmacsセッションのエンリッチ(enriched)モードで 使っている表示色一覧が表示されます。
前置引数とともに表示色を指定したり、 暫定マーク(transient-mark)モードでリージョンが選択されていなければ、 つぎに入力する自己挿入文字だけに作用します。 See Transient Mark。 そうでなければ、コマンドはリージョンに作用します。
それぞれの表示色メニューにはもう1つOther
という項目があります。
この項目は、メニューに表示されていない表示色を指定するために使います。
これは、ミニバッファで表示色名称を読み取ります。
利用可能な表示色と名前の一覧を表示するには、
Text PropertiesメニューのDisplay Colors
項目を使います
(see Editing Format Info)。
このようにして指定した表示色や、 読み込んだ整形済みテキスト内で使われている表示色は、 そのEmacsセッション中は、両方の表示色メニューに追加されます。
表示色を指定するためのキーバインディングはありませんが、 拡張コマンドM-x facemenu-set-foregroundや M-x facemenu-set-backgroundを使えばできます。 どちらのコマンドもミニバッファで表示色名称を読み取ります。
整形済みテキストの編集では、段落全体あるいは段落の一部に 異なる左端と右端の字下げを指定できます。 指定した左右端は、自動的に詰め込みコマンド(see Filling)と 行分割コマンドに反映されます
Indentationサブメニューは、 これらの属性を指定するための便利なインターフェイスです。 このサブメニューにはつぎの4つの項目があります。
Indent More
increase-left-margin
)。
エンリッチ(enriched)モードでは、
このコマンドはC-x <TAB>でも実行できる。
数引数を指定すると、左端に加える桁数として扱う(負の値であれば桁を減らす)。
Indent Less
Indent Right More
Indent Right Less
なお、これらのコマンドを繰り返せば、字下げを増やしたり減らしたりできます。
これらのコマンドの一般的な使い方は、段落全体の字下げを変更することです。 しかし、それだけではありません。 任意の箇所で左右端を変更できます。 新たに設定された値は、行末(右端)や つぎの行の先頭(左端)に影響します。
それにより、ぶら下がり字下げで段落を整形することができます。 ぶら下がり字下げとは、1行目の字下げ幅が2行目以降の字下げ幅より少ないものです。 ぶら下がり字下げするには、段落の最初の単語の直後から始まり段落の末尾まで 続くリージョンの字下げ幅を増やします。
段落の1行目の字下げはもっと簡単です。 段落の本体があるべき位置に段落全体に対する左右端を設定してから、 最初の行に追加の空白やタブを挿入すればよいのです。
編集の結果、段落の詰め込みが汚くなってしまうことがあります。
たとえば、段落の一部が左端や右端からはみ出してしまうことです。
そうなったときには、M-q(fill-paragraph
)を使って、
段落を詰め込み直します。
変数standard-indent
は、これらのコマンドで増減する字下げ幅を指定します。
デフォルト値は4です。
エンリッチ(Enriched)モード全体に対する右端のデフォルトは、
通常どおり変数fill-column
で制御します。
詰め込み接頭辞があれば、指定した段落の字下げに追加されます。 C-x .は、 詰め込み接頭辞として新たに指定された値には、字下げの白文字を含めません。 しかも、詰め込みコマンドは各行の字下げのうしろにある詰め込み接頭辞を探します。 See Fill Prefix。
整形済みテキストの編集では、段落に対してさまざまなスタイルの揃え方を 指定できます。 指定したスタイルは自動的にEmacsの詰め込みコマンドに影響します。
Justificationサブメニューは、 スタイルを指定するための便利なインターフェイスです。 このサブメニューにはつぎの5項目があります。
Flush Left
Flush Right
Full
Center
None
エンリッチ(enriched)モードでは、 M-jプレフィックス文字を使ってキーボードで幅揃えを指定することもできます。
set-justification-left
)。
set-justification-right
)。
set-justification-full
)。
set-justification-center
)。
set-justification-none
)。
揃え方のスタイルは段落全体に適用されます。 揃え方を変更するコマンドは、ポイントを含む段落に作用しますが、 リージョンが設定されているときには リージョンと重なる段落すべてが対象になります。
揃え方のスタイルのデフォルトは、
変数default-justification
で指定されます。
この値は、left
、right
、full
、
center
、none
29
のいずれかのシンボルでなくてはいけません。
Other Propertiesメニュー
30には、
read-only
、invisible
、intangible
といった有用な
テキスト属性を追加/削除する項目があります。
intangible
属性はテキスト内にポイントを移動できなくし、
invisible
属性はテキストを表示しないようにし、
read-only
属性はテキストを変更できなくします。
これらの特別な属性には、
リージョンに属性を付加するためのメニュー項目があります。
最後のメニュー項目Remove Special
は、
これらの特別な属性すべてをリージョンから取り除きます。
現在のところ、invisible
属性とintangible
属性は、
text/enriched形式に保存されません。
read-only
属性は保存されますが、
これはtext/enriched形式の標準的なものではないので、
Emacs以外の他のエディタでは使用されないかもしれません。
普通は、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
を使います。
Emacsには、LispやCといったプログラム言語の構文を 理解するように設計されたコマンドが数多くあります。 以下のことを行えます。
単語/文/段落を扱うコマンドは、 自然言語のテキストを編集するのが本来の目的ですが、 コードを編集する場合にもおおいに役立ちます。 なぜなら、たいていのシンボルは単語ですし(see Words)、 文は文字列やコメントの中にも含まれるからです(see Sentences)。 段落は本質的にはコードの中には存在しませんが、 プログラム言語向けのメジャーモードでは、 段落は空行で始まり空行で終わると定義するので、 段落コマンドも役立ちます(see Paragraphs)。 空行をうまく使ってプログラムが整然と見えるようにすると、 段落コマンドもうまく働きます。
選択的表示機能は、関数の全体構成を眺めるのに便利です (see Selective Display)。 この機能は、指定幅以内の字下げ幅の行だけを表示します。
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。
慣習として、釣り合った式を扱うEmacsのキーは、普通、コントロール・メタ文字です。 これらは、コントロールやメタだけの対応したキーの機能に似せてあります。 これらは、プログラム言語の式だけに関係したコマンドだと考えられがちですが、 ある種の括弧が存在する(自然言語も含めた)任意の言語に対しても有益なものです。
これらのコマンドは、2つのグループに分けられます。 一方は(括弧でまとめた)リスト(list)31だけを扱うもので、 丸括弧、角括弧、中括弧(使用言語において対応が取れている必要がある括弧)と、 それらをクォートするエスケープ文字だけに注目するコマンド群です。
もう一方は、式あるいはS式(sexp)を扱うコマンド群です。 「sexp」という用語は、 Lispの式を意味する古くからの用語s-expressionに由来します。 Emacsでは「S式」の概念をLispに限定しません。 プログラムを記述した言語が何であっても、その式をS式と呼びます。 各プログラム言語には独自のメジャーモードがあり、 そこでは、その言語の式をS式とみなすように構文テーブルを調整してあります。
一般にS式には、丸括弧、角括弧、中括弧に囲まれた部分だけでなく、 シンボル、数値、文字列定数も含まれます。
Cのように前置演算子と中置演算子を使う言語では、
すべての式をS式として扱うことは不可能です。
たとえば、Cモードでは、foo + bar
はCの式ですが、
S式としては認識しません。
かわりに、foo
とbar
をそれぞれ1つのS式として認識し、
+
はあいだにある句読点として認識します。
これは根本的に曖昧なのです。
たとえば、ポイントがf
にあるとき、横断すべきS式としては、
foo + bar
でもfoo
でも正当な選択肢です。
(foo + bar)
は、Cモードにおいて単一のS式であることに注意してください。
式の構文が曖昧なために、 Emacsが正しく解釈できるようにしようなどとは誰も思わない言語もあります。
forward-sexp
)。
backward-sexp
)。
kill-sexp
)。
backward-kill-sexp
)。
backward-up-list
)。
down-list
)。
forward-list
)。
backward-list
)。
transpose-sexps
)。
mark-sexp
)。
S式を横断して前向きに移動するには、
C-M-f(forward-sexp
)を使います。
ポイントに続く最初の意味ある文字が開き区切り
(Lisp では(
、Cでは(
や[
や{
)であれば、
対応する閉じ区切りのうしろに移動します。
シンボル、文字列、数値を始める文字の場合には、
それらを横断してその末尾に移動します。
コマンドC-M-b(backward-sexp
)は、
S式を横断して後向きに移動します。
移動の詳しい規則は上記のC-M-fと同様ですが、方向は逆です。
S式のまえに接頭辞文字(Lispではシングルクォート、バッククォート、コンマ)が
ある場合には、それらも横断します。
ほとんどのモードでは、S式コマンドはコメントを空白であるかのように
飛び越えます。
C-M-fやC-M-bに引数を指定すると、 指定された回数だけ動作を繰り返します。 負の引数では、逆向きに移動します。
1つのS式全体をキルするには、C-M-k(kill-sexp
)や
C-M-<DEL>(backward-kill-sexp
)で行います。
C-M-kはC-M-fで横断するだけの文字をキルし、
C-M-<DEL>はC-M-bで横断するだけの文字をキルします。
S式コマンドと同様に、リストコマンドはリストを横断しますが、
リスト以外のS式(シンボルや文字列など)は飛び越します。
これらのコマンドは、C-M-n(forward-list
)と
C-M-p(backward-list
)です。
これらのコマンドが便利である主な理由は、
(コメントにはリストが何も含まれないのが普通なので)
コメントを無視するからです。
C-M-nとC-M-pは、可能な限り同じレベルの括弧にとどまります。
1つ(あるいはnだけ)上のレベルに移動するには、
C-M-u(backward-up-list
)を使います。
C-M-uは、対応の取れていない開き区切りのまえへ後向きに移動して、
1つレベルを上げます。
正の引数は反復回数になります。
負の引数は、移動を逆向きにしますが、やはり反復回数です。
つまり、前向きに移動して、1つ以上レベルを上げます。
リスト構造中で下のレベルに移動するには、
C-M-d(down-list
)を使います。
Lispモードでは、(
が唯一の開き区切りなので、
このコマンドは(
を探索するのとほとんど同じです。
引数は下がるべき括弧のレベルを指定します。
本当は役に立つのに、何の役に立つのだろうと思われるコマンドが
C-M-t(transpose-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。
Emacsでは、トップレベルの括弧でグループ化したものは
関数定義(defun)と呼ばれます。
この名前は、Lispファイルではトップレベルにあるリストの大半が
スペシャルフォームdefun
であるという事実に由来します。
しかし、その中身が何であろうとも、また、使用プログラム言語が何であろうとも、
Emacs流には、トップレベルの括弧でグループ化されたものは
すべて関数定義(defun)です。
たとえば、Cの関数定義の本体は関数定義(defun)です。
beginning-of-defun
)。
end-of-defun
)。
mark-defun
)。
現在の関数定義の先頭や末尾に移動するコマンドは、
C-M-a(beginning-of-defun
)と
C-M-e(end-of-defun
)です。
現在の関数定義を操作したいのであれば、
C-M-h(mark-defun
)を使って、
現在の関数定義かつぎの関数定義の先頭にポイントを置き、
その末尾にマークを設定します。
たとえば、関数定義をテキストの別の位置に移動する準備をするには、
このコマンドを使うのがもっとも簡単な方法です。
Cモードでは、C-M-hはc-mark-function
を実行しますが、
mark-defun
とほとんど同じです。
違いは、引数宣言、関数名、戻り値の型名と遡って、
Cの関数全体をリージョンに含めることです。
See Marking Objects。
Emacsは、もっとも左の桁でみつけた任意の開き括弧を
関数定義の始まりであると仮定します。
したがって、トップレベルのリストの始まりでない限り、
Lispファイルの中では左端に開き括弧を置いてはいけません。
また、関数本体の始まりを表すのでない限り、
Cのコードの行頭に開き中括弧や開き区切りを置いてはいけません。
もっとも起こりやすい場面は、
文字列の途中で、行頭に開き区切りを入れたい場合です。
トラブルを避けるために、開き区切りのまえに
エスケープ文字(CやEmacs Lispでは \
、
その他のLisp方言のいくつかでは/
)を入れてください。
これで文字列の内容が影響を受けることはありません。
大昔のもともとのEmacsでは、関数定義を探すために、
より上位レベルの括弧がなくなるまで遡っていました。
この方法では、たとえ小さな関数であっても、
バッファの先頭まで遡って走査することがつねに必要でした。
これを高速化するために、左端内の任意の(
(あるいは、開き区切りと宣言された任意の文字)が
関数定義の始まりであると仮定するように、Emacsを変更しました。
この発見的手法で、ほとんど正しく処理できて、時間のかかる走査を回避できます。
しかし、上述の約束事は必要です。
正しく字下げされた状態にプログラムを保つ最良の方法は、 変更したらEmacsに字下げをやり直させることです。 Emacsには、1行の字下げ、指定された行数の字下げ、あるいは、 括弧でグループ化した内部のすべての行の字下げを行うコマンドがあります。
Emacsでは、ライブラリpp
にLispのプリティプリンタ32
もあります。
このプログラムは、美しく見えるように字下げを施してLispオブジェクトを
清書するプログラムです。
newline-and-indent
)。
基本的な字下げコマンドは<TAB>です。
直前の数行から判断した正しい字下げを現在行に施します。
<TAB>が実行する関数は、メジャーモードに依存します。
たとえば、Lispモードではlisp-indent-line
、
Cモードではc-indent-line
が実行されます。
これらの関数はそれぞれの言語の構文を解釈しますが、
どれも同じことを行うためのものです。
プログラム言語向けメジャーモードにおいては、
<TAB>は、現在行のどこにポイントがあっても、
現在行の先頭に白文字を挿入したり削除したりします。
ポイントが行頭の白文字の中にあったときは、
<TAB>は最後の白文字のうしろにポイントを置きます。
そうでなければ、<TAB>を打ったときの文字のところに留まります。
ポイント位置にタブを挿入するには、C-q <TAB>を使います。
新たにソースコード行を入力するときには、
C-j(newline-and-indent
)を使ってください。
これは、<RET>に続けて<TAB>を打鍵することと等価です。
C-jは、空行を作ってから、その行で適切な字下げを行います。
括弧でグループにまとめたところでは、 <TAB>は、2行目以降の行をそれぞれ直前の行の真下にくるように字下げします。 したがって、ある行を非標準的な字下げにすると、 以降の行もその字下げに従うことになります。 <TAB>による標準的な字下げが、 特定の行では美しくないので無視したい場合には、 字下げのこのようなふるまいが便利です。
(字下げ処理を含めて)Emacsは、左端にある、開き丸括弧、開き中括弧、 および、その他の開き区切りを関数の始まりと仮定することを 覚えておきましょう。 たとえ文字列の中であっても、 関数の始まりでない開き区切りをけっして0桁目に置いてはいけません。 この制約は字下げコマンドを高速にするためにきわめて重要です。 無条件で受け入れてください。 これに関してより詳しくは、See Defuns。
変更した複数行や、リスト構造中の異なるレベル箇所へ移した複数の行を 字下げし直すには、いくつかのコマンドを利用できます。
indent-sexp
)。
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>を実行します。
Lisp式に対する字下げの仕方を、 その式から呼ばれる関数と関係付けることができます。 各Lisp関数に対して、あらかじめ定義された字下げパターンの中から選んだり、 Lispプログラムで任意のものを定義したりできます。
字下げの標準パターンは、つぎのとおりです。 式の開始行に関数呼び出しの引数がある場合は、 最初の引数の直下に2行目がくるように字下げします。 それ以外の場合は、関数名の直下に2行目がくるように字下げします。 続く各行は、入れ子の深さが同じである行の字下げと同じになります。
変数lisp-indent-offset
がnil
以外ならば、
式の2行目に対する通常の字下げパターンを無効にして、
式の開始桁からつねにlisp-indent-offset
だけ字下げします。
標準パターンが使用されない関数もいくつかあります。
名前がdef
で始まる関数に対しては、
式を開始する開き括弧の桁位置にlisp-body-indent
を加えた桁位置へ
2行目がくるように字下げします。
関数名の属性lisp-indent-function
を変更すれば、
各関数ごとに標準パターン以外の字下げを施せます。
この属性が取りえる値にはつぎの4つがあります。
nil
defun
def
で始まる関数に用いる字下げパターンを使用する。
lisp-body-indent
を加えた桁位置へ字下げする。
引数が区別された引数で最初か2番目ならば、
lisp-body-indent
の2倍を加えた桁位置へ字下げする。
引数が区別された引数であっても3番目以降ならば、標準パターンを適用する。
parse-partial-sexp
(字下げと入れ子の計算を行うLispの基本的な関数)の戻り値。
この関数は、当該行に対する字下げ幅の桁数、あるいは、 リストのcarがそのような数値であるリストを返す必要がある。 数値を返した場合は、括弧の入れ子レベルが同じ行に対しては 同じ字下げ幅を意味する。 リストを返した場合は、後続の行に対しては字下げ幅が異なる可能性を意味する。 このような差異は、C-M-qで字下げを計算するときに現れる。 数値が返された場合、C-M-qは、リストの末尾に達するまでは、 字下げの再計算を行う必要がない。
ここでは、Cモードとその関連モードにおける字下げコマンドを紹介します。
C-c C-q
c-indent-defun
)。
C-M-q
c-indent-exp
)。
前置引数を指定すると、
不正な構文に対する検査をせずに、警告メッセージも発しない。
<TAB>
c-indent-command
)。
c-tab-always-indent
がt
ならば、
現在行を字下げし直すだけで、他には何もしない。
これがデフォルト。
この変数がnil
ならば、
ポイントが左端か字下げの余白部分にある場合に限り、字下げし直す。
さもなければ、タブ
(あるいは、indent-tabs-mode
がnil
ならば、
等価な個数の空白)を挿入する。
上記の(nil
やt
)以外の値であれば、通常どおり字下げし直す。
ただし、コメント、文字列、プリプロセッサ指令の内側では、タブを挿入する。
C-u <TAB>
カレントバッファ全体を字下げし直すには、 C-x h C-M-\と打ちます。 これは、まず、バッファ全体をリージョンとしてから、 そのリージョンを字下げし直します。
カレントブロックを字下げし直すには、C-M-u C-M-qと打ちます。 これは、まず、ブロックの先頭に移動してから、 ブロック全体を字下げし直します。
Cモードとその関連モードでは、字下げのカスタマイズには、 単純ですが柔軟性のある機構を用いています。 この機構は2段階で動作します。 まず、行をその内容と文脈から構文的に分類します。 つぎに、構文構成要素の各種類に、 カスタマイズ可能な字下げのオフセットを対応させます。
第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行目のint
のi
にあたります。
カーソルを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))
これは、中括弧が部分文のブロックを始めていることを示しています。
ところで、部分文とは、if
、else
、while
、
do
、switch
、for
、try
、catch
、
finally
、synchronized
のあとの行を表します。
Cの字下げコマンドにおいては、
字下げのために行を構文解析し終えると、
変数c-syntactic-context
には解析結果を表すリストが入ります。
このリストの各要素は構文構成要素であり、
構文シンボルと(省かれるかもしれない)対応するバッファ内位置の
コンスセルです。
構文構成要素リストには、複数の要素が含まれることもあります。
また、典型的には、バッファ内位置を持つ要素は1つだけです。
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行目のif
のi
の位置)の
桁位置2を加えます。
結果として、空白4文字という総字下げ量が求まります。
行を解析した結果、c-offsets-alist
に現れない構文シンボルが
みつかった場合、そのシンボルは無視します。
しかし、変数c-strict-syntax-p
がnil
以外の値であれば、
エラーを報告します。
C流のモードの字下げをカスタマイズする方法は2つあります。 1つは、あらかじめ定義されているスタイルから選択する方法です。 それぞれのスタイルでは、各構文シンボルに対するオフセットが定められています。 もう1つはより柔軟な方法で、各構文シンボルの扱い方をカスタマイズできます。 定義されている構文シンボルの一覧については、See Syntactic Symbols。
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-o(c-set-offset
)を使うことです。
最初の引数は構文シンボル、2番目の引数は希望のオフセットです。
有効な構文シンボル名とその意味の一覧は、See Syntactic Symbols。
Cモードや関連するモードの字下げに対して有効な構文シンボルを、
構文上の意味とともに、以下に示します。
これらのほとんどのシンボルには、
c-offsets-alist
でオフセットが与えられています。
string
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
throws
宣言などを置ける。
knr-argdecl-intro
knr-argdecl
topmost-intro
topmost-intro-cont
member-init-intro
member-init-cont
inher-intro
inher-cont
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
inexpr-class
substatement
if
、while
、for
、
do
、else
の直後の最初の行
substatement-open
case-label
case
またはdefault
ラベルを表す。
access-label
private
、protected
、public
を表す。
label
do-while-closure
do
-while
文のwhile
。
else-clause
if
-else
文のelse
。
catch-clause
try
...catch
構成の
catch
行やfinally
行。
comment-intro
arglist-intro
arglist-cont
arglist-cont-nonempty
arglist-close
stream-op
inclass
inextern-lang
inexpr-statement
({ ... })
を使うCに対するGCC拡張に用いる。
文ブロックを引数としてとるPikeの特殊関数にも用いる。
inexpr-class
cpp-macro
friend
friend
宣言。
objc-method-intro
objc-method-args-cont
objc-method-call-cont
inlambda
inclass
と同様だが、ラムダ(つまり、無名)関数の内側に用いる。
Pikeのみで用いる。
lambda-intro-cont
lambda
と関数本体のあいだの、
ラムダ関数のヘッダーの継続行。
Pikeのみで用いる。
本節では、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-style-alist
は、
あらかじめ定義された字下げスタイルを保持します。
各要素は(name variable-setting...)
の形をしていて、
nameはスタイル名です。
また、各variable-settingは、
(variable . value)
の形をしています。
variableには、Cモードが使用するカスタマイズ用変数の1つを指定します。
valueは、選択されたスタイルが使われるときのvariableの値です。
variableがc-offsets-alist
である場合は、特殊なケースです。
c-offsets-alist
の値をvalueの値で置き換えるのではなく、
c-offsets-alist
の値の先頭にvalueを追加します。
したがって、valueにすべての構文シンボルを設定する必要はありません。
デフォルトと異なる構文シンボルだけを単に設定すればよいのです。
コメントだけを含んだ行の字下げも、
変数c-comment-only-line-offset
(see Comments in C)に影響されます。
Cスタイルとは、カスタマイズされた字下げスタイルの集合です。
Emacsには、Cモードや関連するモードのためにあらかじめ定義された、
gnu
、k&r
、bsd
、stroustrup
、
linux
、python
、java
、whitesmith
、
ellemtel
、cc-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-nowがnil
以外ならば、
新しいスタイルの定義後すぐにそれに切り替えます。
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を使います。
コメントはプログラミングの重要な部分なので、 Emacsにはコメントの編集や挿入を行うための特別なコマンドがあります。
コメント用コマンドはコメントの挿入、削除、および位置揃えを行います。
indent-for-comment
)。
set-comment-column
)。
kill-comment
)。
indent-new-comment-line
)。
コメントを挿入するコマンドは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
は、望むならばキーに直接バインドできる通常のコマンドです。
コメントを入力していて別の行に継続したければ、
コマンド C-M-j(indent-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です。
コメント桁位置は、変数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-j(indent-new-comment-line
)が
コメントの内側で使われたときの動作を制御します。
comment-multi-line
がnil
(通常の設定)ならば、
現在行のコメントを終了し、新たなコメントをつぎの行から始めます。
comment-multi-line
がnil
以外ならば、
現在行と同じコメントが継続されます。
つまり、現在行のコメントを終えず、新たな行にも開始文字列を挿入しません。
複数行にわたるコメントを許す言語では、
この変数に設定する値は好みの問題です。
変数comment-indent-function
には、
新たに挿入したコメントの字下げや
既存のコメントに桁を揃えるための字下げを計算する関数を
設定する必要があります。
この変数には、メジャーモードごとに異なった関数が設定されます。
この関数は引数なしで呼ばれますが、
コメントがあるときにはその開始位置にポイントを置いて、
新規コメントの挿入時には行末にポイントを置いて呼ばれます。
戻り値は、コメントを始めるべき桁位置です。
たとえば、Lispモードでは、この字下げ用フック関数は、
既存のコメントのセミコロンの個数と
まえの行のコードに基づいて計算を行います。
insert-parentheses
)。
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-spaces
にnil
を設定してください。
通常、補完はミニバッファで行われます。 しかし、ある種の補完は任意のバッファで利用できます。 それはシンボル名に対する補完です。
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。
関数名表示(which-function)モードは、 バッファ内を動き廻るに従って現在の関数名をモード行に表示する マイナモードです。
関数名表示(which-function)モードをオン(あるいはオフ)にするには、
コマンドM-x which-function-modeを使います。
このコマンドはグローバルです。
つまり、既存のバッファでもこれから作るバッファでも、
すべてのバッファに通用します。
しかし、which-func-modes
の値で指定された
特定のメジャーモードでのみ効果があります。
(which-func-modes
のデフォルト値はt
であり、
関数名表示(which-function)モードの支援方法を知っている
すべてのメジャーモードに適用されることを意味する。
具体的には、imenuを使えるメジャーモード。)
Emacsで実行するLispコードを編集するときには、
関数や変数の説明文字列を表示するコマンド、
C-h f(describe-function
)や
C-h v(describe-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-i(info-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-flag
にnil
を設定すれば、
マニュアルページにおけるフェイスの使用をオフにできます。
他の方法でマニュアルページのテキストをEmacsバッファに挿入した場合、 M-x manual-entryと同じ変換を施すには、 そこでM-x Man-fontify-manpageコマンドを実行します。
GNUプロジェクトでは最終的に、ほとんどのマニュアルページを infoで閲覧可能なよりよく構成されたマニュアルに置き換えることを望んでいます。 See Misc Help。 この作業は、ほんの一部が完了しただけなので、 まだマニュアルページを読めることは有益です。
コマンド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。
タグテーブルとは、複数のファイルで構成されるプログラムが、 どのように各ファイルに分割されているのか記述したものです。 これは、プログラムを構成するファイル名、 そのファイルに入っている関数の名前(または、名前の付いた別の単位)や ファイル内の位置の一覧です。 こうして関連するファイルをまとめておけば、 全ファイルを対象とした探索や置換をコマンド1つで行えます。 また、関数名とその位置を記録してあるので、 関数がどのファイルに入っているか調べて関数定義をみつけだす M-.のようなコマンドを実現できます。
タグテーブルは、タグテーブルファイルと呼ばれるファイルに格納されます。
このファイルの慣習的な名前はTAGS
です。
タグテーブルの各項目は、タグ名、タグが(暗黙に)定義されているファイルの名前、 そして、ファイル中でタグが定義されている位置を記録しています。
もとのプログラムファイルから、どんな名前がタグテーブルに記録されるかは、 プログラム言語によって異なります。 一般的には、すべての関数やサブルーチンを含み、 大域変数、データ型、あると便利なその他の情報などを含むこともあります。 記録された個々の名前をタグと呼びます。
etags
.
ここでは、広く一般に使われている言語に対するタグ構文の定義を紹介します。
struct
、union
、enum
の定義もやはりタグである。
また、タグテーブルを作成するときにオプション--no-defines
を
指定しなければ、#define
によるマクロ定義や
enum
の定数もタグとして扱う。
同様に、大域変数も--no-globals
を指定しない限りタグになる。
--no-globals
と--no-defines
を指定すると、
タグテーブルファイルはかなり小さくなる。
--members
オプションを指定すれば、メンバ変数もタグになる。
クラス内の変数と関数に対するタグには、それぞれ、
class::variable
、class::function
と
名前が付く。
extends
とimplements
に現れる名前もタグとして含む。
クラス内の変数と関数に対するタグには、それぞれ、
class.variable
、
class.function
と名前が付く。
\chapter
、\section
、\subsection
、
\subsubsection
、\eqno
、\label
、\ref
、
\cite
、\bibitem
、\part
、\appendix
、
\entry
、\index
のコマンドの引数がタグになる。
その他のLaTeXコマンドでも、etags
を起動するまえに、
環境変数TEXTAGS
にそれらのコマンドを指定しておけばタグの対象になる。
この環境変数の値は、コマンド名をコロンで区切った並び。
たとえば、(bourneシェルでは)
TEXTAGS="def:newcommand:newenvironment" export TEXTAGS
とすると、\def
、\newcommand
、\newenvironment
の
コマンドの引数もタグの対象になる。
defun
で定義した関数、
defvar
やdefconst
で定義した変数、
および、一般に0桁目から(def
で始まる任意の式の最初の引数がタグ。
def
で定義されるものと、名前がdef
で始まるものがタグに含まれる。
また、ファイル内のトップレベルでset!
を
使って値が設定される変数もタグ。
他にも以下の言語で使えます。
sub
で定義される手続きがタグ。
正規表現に基づいてタグを生成する方法 (see Create Tags Table)もあるので、 上記以外の形式や言語を扱うこともできます。
タグテーブルファイルを作成するには、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)が拡張されています。
この演算子は、grep
やed
で使えるものと同じ動作をします。
反復回数演算子の構文は\{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.doo
とbar.ber
に対しては、その内容から使用言語を推定します。
さらに、voo.doo
から余分にタグを認識するためにreg1を使い、
bar.ber
から余分にタグを認識するためには
reg1とreg2の両方を使います。
los.er
からタグを認識するには、
Lispのタグ構文規則だけを使い、正規表現による一致はいっさい使いません。
別の例を示しましょう。 ここでは、シェルが解釈しないように正規表現をクォートします。
DEFVAR
マクロをタグとする。
--regex='/[ \t]*DEFVAR_[A-Z_ \t(]+"\([^"]+\)"/'
--language=none --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ ]* +OF/' --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\ \( BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'
--lang=none --regex='/proc[ \t]+\([^ \t]+\)/\1/'
他のオプション一覧を表示するには、
etags --help
を実行してください。
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-name
とtags-table-list
の両方に
値を設定してはいけません。
タグテーブルで実現されるもっとも重要な機能は、 指定したタグの定義を探し出すことです。
find-tag
)。
find-tag-regexp
)。
find-tag-other-window
)。
find-tag-other-frame
)。
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-.と同じです。
ここで紹介するコマンドは、選択されたタグテーブルに記録されている すべてのファイルを1つ1つ訪れては探索を行います。 これらのコマンドに対しては、タグテーブルは探索対象となる 一連のファイルを指定するだけです。
query-replace-regexp
を実行する。
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-search
とtags-query-replace
は、
通常の探索コマンドや置換コマンドがカレントバッファで行うように、
正規表現に一致するあらゆる部分を探し出します。
これらのコマンドは、(Emacsバッファにまだ訪れていないものに対しては) 探索すべきファイル用に一時的なバッファを作成します。 一致部分がみつからなければバッファはただちに消されますが、 みつかれば存続します。
tags-search
は、grep
プログラムにたいへんよく似ていると
思われたかもしれません。
Emacsの下位プロセスとしてgrep
を実行して、
Emacsに一致した行を1つずつ表示させることもできます。
これは、コンパイルを実行するのと同じように動作します。
grep
が一致を検出したソース箇所を探すことは、
コンパイルエラーを探すのと同様に動作します。
See Compilation。
M-x list-tagsは、選択されたタグテーブルに記載されている ファイルのどれか1つのファイル名を読み取り、 そのファイルで定義されているすべてのタグを表示します。 引数の『ファイル名』は、タグテーブルに記録されたファイル名と 単純に文字列として比較されます。 ファイル名というよりは、文字列として読まれます。 したがって、補完やデフォルトはありませんし、 タグテーブルに格納されているとおりに正確にファイル名を入力する必要があります。 タグテーブル内のファイル名にディレクトリが含まれない限り、 ファイル名にもディレクトリを含めてはいけません。
M-x tags-approposは、タグに対するapropos
にあたります
(see Apropos)。
このコマンドは、正規表現を読み取り、
選択されたタグテーブルの中から正規表現に一致する項目のタグを
すべてみつけだし、そのタグ名を表示します。
現在のタグテーブルに含まれるタグ名を名前空間として、 バッファ内で補完を行うこともできます。 See Symbol Completion。
ちょっとしたミスで、1つのプログラムから2つの別の版を 作ってしまうこともあります。 この混乱した状態を収拾するには、それらを併合する必要があります。 emergeを使うと、併合作業が容易になります。 手動で比較するコマンドについては、Comparing Filesと Emergeを参照してください。
以下の4つのコマンドのいずれかでemergeを実行します。
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-files
やemerge-files-with-ancestor
に
数引数を指定すると、ミニバッファで出力ファイル名を読み取ります。
(どちらの場合でも、これがいちばん最後に聞かれるファイル名。)
すると、emerge終了時には、併合済みのテキストがその出力ファイルに保存されます。
emergeを終えると、通常、emergeコマンドが併合バッファをファイルに保存します。 emergeをC-]でアボートすると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)モードです。
自動前進モードがオンであると、コマンドaとbは、
自動的につぎの相違箇所にポイントを進めます。
このモードでは、どちらかの入力だけを選ぶ状況である限り、高速に併合を行えます。
モード行にはA
と表示され、自動前進モードであるを示します。
優先箇所スキップモードがオンであると、
コマンドnとpは、
A優先/B優先の状態にある相違箇所をスキップします
(see State of Difference)。
つまり、どちらの版も『正しい』と推定されない相違箇所だけを調べことになります。
モード行にはS
と表示され、優先箇所スキップモードであることを示します。
自動前進モードをオン/オフするには、
コマンドs a(emerge-auto-advance-mode
)を使います。
優先箇所スキップモードをオン/オフするには、
コマンドs s(emerge-skip-prefers-mode
)を使います。
どちらのコマンドも、正の数引数を指定するとオンにし、
負あるいは0の数引数を指定するとオフにし、
引数を指定しないとトグル(切り替え)します。
併合バッファ内では、相違箇所はv
と^
の文字だけの行に
挟まれて示されます。
各相違箇所は、つぎの7つのいずれかの状態になっています。
A
と表示される。
B
と表示される。
相違箇所を選択すると、その状態は、デフォルトAやデフォルトBから 状態Aや状態Bに遷移する。 つまり、一度でも選択した相違箇所は、 デフォルトAやデフォルトBの状態であることはなく、 これらの状態はけっしてモード行には表示されない。
デフォルトの状態として、
コマンドd aはデフォルトAを選び、
d bデフォルトBを選ぶ。
これらのコマンドで選んだデフォルトの状態は、
一度も選択してなく、かつ、どちらの版も優先されない相違箇所に適用される。
併合作業を先頭から順に行っている場合、
最後に選択した相違箇所に続く相違箇所群が一度も選択されていないものである。
したがって、先頭から順に進めるのであれば、
d aとd bを使い分けて、
併合バッファのある部分ではA版をデフォルトとし、
別の部分ではB版をデフォルトとすることができる。
これらの2つの状態は、モード行ではA*
やB*
と表示される。
相違箇所がいったんこの状態になると、 コマンドaやbに数引数を指定しない限り、何もしない。
この状態は、モード行ではcomb
と表示される。
ここでは、高速モードの併合操作コマンドを示します。 編集モードでは、これらのコマンドのまえにC-c C-cを付けます。
qコマンド(emerge-quit
)は、併合を終了し、
出力ファイルを指定してあれば、そこに結果を保存します。
AバッファとBバッファは正しい内容に復元されますが、
emergeがAバッファとBバッファを作成して、かつ、編集されていなければ、
それらをキルします。
さらに、併合バッファでのemergeコマンドを使用禁止にします。
というのは、これ以降に併合コマンドを実行すると
さまざまなバッファが悪影響を受ける可能性があるからです。
C-]は、併合作業をアボートします。 つまり、出力ファイルに書き出さずに終ります。 出力ファイルを指定していなければ、併合作業をアボートしようが終了しようが、 何の違いもありません。
他のLispプログラムからemergeコマンドが呼び出された場合、
正しく終了するとt
、アボートしたときはnil
が返されます。
相違箇所によっては、両方の版を残したいこともあるでしょう。 そのような場合には、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"
併合作業中には、AバッファやBバッファを勝手に編集してはいけません。 emergeは一時的にこれらのバッファの内容を変更しますが、 最終的にはもとの状態に戻します。
複数の併合処理を同時に進めることもできますが、 別の併合処理の入力に同じバッファを使用してはいけません。 というのは、一時的にせよ、互いに異なる複数の変更が 1つのバッファに加えられてしまうからです。
入力ファイル全体を比較する必要があるため、
emergeの開始にはしばらく時間がかかる場合もあります。
また、diff
コマンドが完了するまで、emergeは何もできません。
たぶん、そのうち誰かがemergeを変更して、
入力ファイルが大きいときにはバックグラウンドで比較を行うようにするでしょう。
そうすれば、emergeがコマンドを受け付けるようになるまで、
Emacsで他の作業を続けられます。
フックemerge-startup-hook
(see Hooks)が、併合処理の設定の最後
に実行されます。
本節では、C、C++、Objective-C、Java、CORBA IDL、 Pike用の各モードで利用可能な特別な機能について述べます。 『Cモードと関連するモード』と書いたときには、 これらのモードを意味します。
本節では、Cモードとその関連モードでポイントを移動する コマンドについて述べます。
C-c C-u
#elif
は、#if
が続く#else
のように扱われる。
前向きに進む場合、#elif
は無視される
33。
C-c C-p
C-c C-n
M-a
c-beginning-of-statement
)。
すでに文の先頭にポイントがある場合、直前の文の先頭に移動する。
数引数nを指定すると、n-1だけまえの文に移動する。
ポイントが、文字列やコメントの内側、あるいは、 コメントのうしろ(コメントのあいだに白文字がある場合のみ)にある場合、 Cの文ではなく自然言語の文単位で移動する。
プログラムから呼ばれるときには、この関数は、3つの引数、つまり、
反復回数、(これよりも後向きには戻らない)移動限界、
ポイントがコメントの内側にある場合に自然言語の文単位の移動をするかどうか、
を取るが、これらは省略できる。
M-e
c-end-of-statement
)。
M-x c-backward-into-nomenclature
GNUプロジェクトでは、
CやC++の識別子は、大文字小文字で区別するのではなく、
単語を下線で区切ることを推奨する。
M-x c-forward-into-nomenclature
Cモードとその関連モードでは、ある種の印字文字は『エレクトリック』です。
つまり、その文字自身を挿入することに加えて、
現在行を字下げし直したり、改行も挿入することさえあります。
この機能は、変数c-auto-newline
で制御されます。
『エレクトリック』文字は、{、}、:、#、
;、,、<、>、/、*、(、)です。
自動改行(auto-newline)機能がオン
(モード行のモード名のあとに/a
と表示される)の場合に限り、
エレクトリック文字は改行を挿入します。
この機能は、変数c-auto-newline
で制御されます。
コマンドC-c C-aでこの機能をオン/オフできます。
c-toggle-auto-state
)。
数引数を指定した場合、正ならば自動改行機能をオンにし、
負ならばオフにする。
コロン:はエレクトリックです。 なぜなら、単独のコロンの入力の解釈としてはそれが適切だからです。 しかし、C++で2つの連続するコロンを挿入する場合、 コロンのエレクトリックな動作は不便です。 C-c :と打てば、字下げも改行の挿入も行わずにコロンを2つ挿入できます。
c-scope-operator
)。
エレクトリックキー#は、
プリプロセッサ指令の始まりと思われる位置では、行を字下げし直します。
変数c-electric-pound-behavior
の値が(alignleft)
のときには、
このようになります。
この機能をオフにするには、
c-electric-pound-behavior
にnil
を設定します。
変数c-hanging-braces-alist
は、
挿入された中括弧の前/後への改行の挿入を制御します。
これは、(syntactic-symbol . nl-list)
の形の要素
から成る連想リストです。
c-offsets-alist
に現れるほとんどの構文シンボルは、
ここでも意味を持ちます。
リストnl-listは、シンボルbefore
かafter
のいずれか、
あるいはその両方、もしくはnil
を含みます。
中括弧が挿入されるときには、その中括弧が定義する構文上の文脈を
c-hanging-braces-alist
から探します。
みつかれば、nl-listを使って
中括弧の前/後/前後のどこに改行を挿入するか決定します。
みつからなければ、デフォルトとして中括弧の前後に改行を挿入します。
変数c-hanging-colons-alist
は、
挿入されたコロンの前/後への改行の挿入を制御します。
これは、(syntactic-symbol . nl-list)
の形の要素
から成る連想リストです。
リストnl-listは、シンボルbefore
かafter
のいずれか、
あるいはその両方、もしくはnil
を含みます。
コロンが挿入されるときには、そのコロンが定義する構文シンボルを この連想リストから探します。 みつかれば、nl-listを使って コロンの前/後のどこに改行を挿入するか決定します。 みつからなければ、改行を挿入しません。
自動改行機能がオンのときには、エレクトリック文字は自動的に改行を削除します。
この機能により、
改行が不要だと思われるもっとも一般的な場面で改行を削除するので、
自動改行機能をユーザーにより受け入れやすくしています。
Emacsは改行を削除することが望ましいいくつかの場面を認識できますが、
変数c-cleanup-list
を設定すれば、どの場面で行うか指定できます。
この変数の値はシンボルのリストです。
各要素は、改行を削除してよい場面を1つ指定します。
以下に指定できるシンボルとその意味を示します。
brace-catch-brace
} catch (condition) {
の構造全体を1行に再配置する。
catch
やcondition以外に中括弧のあいだになにもないときに
{
を打つと再配置する。
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
欲張りな削除機能をオン
(モード行のモード名のあとに/h
か/ah
で表示される)にすると、
1つの<DEL>コマンドで、直前の空白1つだけでなく、白文字すべてを削除します。
この機能をオン/オフにするには、C-c C-dを使います。
c-toggle-hungry-state
)をオン/オフする。
数引数を指定した場合、正ならば欲張り削除機能をオンにし、
負ならばオフにする。
c-toggle-auto-hungry-state
)。
変数c-hungry-delete-key
は、
欲張り削除機能がオンかオフかを制御します。
c-mark-function
)。
c-fill-paragraph
)。
現在行にコメントがあったり、現在行がコメントの内側なら、
コメントの字下げとコメント区切りを保存したまま、
ポイント位置のコメントや段落を詰め込む。
c-macro-expand
)。
リージョンのまえにあるテキストにマクロ定義があることもあるので、
それらもプリプロセッサに渡されるが、その部分の出力は表示しない。
マクロを用いたCのコードをデバッグするとき、
どのようにマクロが展開されるか正確に理解するのが難しいことがある。
このコマンドを使えば、マクロ展開のことを考える必要はない。
展開結果を目にすることができる。
\
文字を挿入したり、
行末の\
の位置揃えを行う(c-backslash-region
)。
Cのマクロ定義を書いたり編集したあとに便利なコマンド。
行末がすでに\
で終っているなら、そのまえに置く白文字の個数を調整する。
そうでなければ、新たに\
を挿入する。
ただし、リージョン内の最後の行は特別扱いする。
その行に\
を挿入することはなく、また、\
がある場合には削除する。
*CPP Edit*
という名前のバッファを表示する。
このバッファは、特定のプリプロセッサ条件とその内容をどのように表示するかを
選択するグラフィックメニュー。
さまざま設定を変更したあとで、[A]pply these settings
をクリックする
(あるいは、そのバッファへ移動してaと打つ)と、
設定に応じてCモードのバッファを強調表示し直す。
c-show-syntactic-information
)。
この情報は行の字下げを指示する。
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
で、
コメント開始区切り/*
をコメントの最初の行の先頭に置く。
Fortranモードには、Fortranの文と副プログラム向けの特別な移動コマンド、 Fortranの入れ子、行番号と継続文の約束事に従う字下げコマンドがあります。 Fortranモードには、長い行を適切なFortranの継続行に分ける 専用の自動詰め込み(fortran-auto-fill)モードがあります。
Fortranのコメントは他の言語のコメントとは異なっているので、 コメントに対する特別なコマンドもあります。 Fortranのキーワードを入力するときの打鍵量を減らせる、 組み込みの略語もあります。
Fortran用のメジャーモードに切り替えるには、M-x fortran-modeを使います。
このコマンドは、フックfortran-mode-hook
を実行します(see Hooks)。
Fortran モードには、副プログラム(関数やサブルーチン)や文を単位とて 移動するための特別なコマンドがあります。 また、副プログラムを囲むリージョンを設定するコマンドもあり、 副プログラムをキルしたり移動したりするのに便利です。
beginning-of-fortran-subprogram
)。
end-of-fortran-subprogram
)。
mark-fortran-subprogram
)。
fortran-next-statement
)。
fortran-previous-statement
)。
Fortranのコードでは、構文上の各種要素(行番号、コメント行指示子、 継続マーク)は標準Fortranが要求する桁に現れるようにしなくてはいけないので、 字下げに関する特別なコマンドと機能が必要です。
fortran-indent-line
)。
fortran-indent-new-line
)。
fortran-indent-subprogram
)。
Fortranモードでは、Fortranの行を字下げするように<TAB>を再定義します
(fortran-indent-line
)。
このコマンドは、行番号と継続マークを要求される桁位置に字下げしたうえ、
それとは独立にプログラム中の入れ子に基づいて文本体を字下げします。
キーC-jはfortran-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コードとして適切に繋げます。
近代的なほとんどの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
以外ならタブフォーマットです。
ある行の白文字以外の最初の文字が数字であれば、 Fortranの字下げではそれを行番号とみなして0桁目から4桁目のあいだに移動します。 (GNU Emacsでは、桁位置はつねに0から始まる。)
通常、4桁以下の行番号は空白1個で字下げします。
変数fortran-line-number-indent
でこの字下げ幅を制御します。
この変数の値は、行番号の最大字下げ幅を表します。
最大字下げ幅まで字下げできなくなると、
行番号の最後の桁が4桁目になるように右揃えで字下げします。
この変数のデフォルト値は1です。
これらの規則に従って行番号を字下げするには、
行番号を挿入するだけで十分です。
行番号の各桁が挿入されるたびに、字下げ幅を再計算します。
この機能をオフにするには、
変数fortran-electric-line-number
にnil
を設定します。
こうすると、行番号の挿入はその他の文字の挿入と同様に行われます。
Fortranモードでは、適切な字下げをするためのFortranプログラムの解釈を 簡単にするために、以下の規約に従っているものと仮定します。
do
ループは、
けっしてcontinue
文を共有しない。
if
、else
、then
、do
といった
Fortranのキーワードは、あいだに空白があったり、途中で行分けされない。
一般にFortranコンパイラは文字列定数の外側にある空白を無視するが、
Fortranモードは途中に空白が入っているキーワードを認識しない。
else if
やend do
のような書き方は許されるが、
2つの単語を同じ行に置いた場合に限る。
継続行に分かれていると認識しない。
以上の規約に従っていない場合には、行を美しく字下げできないこともあります。 しかしながら、たとえ規約に従っていなくても、 正しいFortranプログラムであれば字下げによって意味が変わることはありません。
Fortranの字下げ動作に影響する変数がいくつかあります。
fortran-do-indent
do
文の各レベルごとに追加する字下げ幅(デフォルトは3)。
fortran-if-indent
if
文の各レベルごとに追加する字下げ幅(デフォルトは3)。
この値は、Fortran 90のwhere
文の字下げにも使われる。
fortran-structure-indent
structure
、union
、map
の各文の各レベルごとに
追加する字下げ幅(デフォルトは3)。
fortran-continuation-indent
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
fortran-minimum-statement-indent-tab
Emacsの通常のコメント用コマンドは、コメントをコードのあとにも置けると仮定します。 Fortranでは、標準的なコメントの構文は、1つの行全体を必要とします。 そのため、Fortranモードでは、 Emacsの通常のコメント用コマンドを置き換え、新たな変数をいくつか定義しています。
Fortranモードでは、文字!
で始まり他のテキストのあとにも置ける
非標準的なコメントの構文も扱えます。
しかし、この構文を受け付けるFortranコンパイラは限られるため、
まえもって指定しておかない限り、
Fortranモードは非標準のコメントを使いません。
このスタイルのコメントを使うには、
変数comment-start
に"!"
を設定します(see Variables)。
fortran-indent-comment
)。
!
コメントだけに作用する。
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-start
と
comment-line-start-skip
の2つの変数が新たに導入されています。
これらは、コードのあとに置く通常のコメントに対するcomment-start
と
comment-start-skip
と同様の役割を、行コメントに対して果たします。
どちらもFortranモードが適切に設定するので、
変更する必要はありません。
Emacsの通常のコメント用コマンドC-x ;は、再定義されていません。
このコマンドは!
コメントを扱えます。
!
コメントを使っていない場合には、
このコマンドはFortranモードでは役に立ちません。
コマンドC-c ;(fortran-comment-region
)は、
リージョン内のすべての行の先頭にC$$$
を挿入して
コメントに変えます。
数引数を指定すると、行の先頭からC$$$
を削除して、
リージョンを生きたコードに戻します。
これらのコメントに使う文字列は、
変数fortran-comment-region
の設定で制御できます。
ところで、ここではコマンドと変数に同じ名前が使われています。
LispやEmacsにおいては、使用される文脈から
コマンドと変数をつねに区別できるので、
このような名前の使い方が問題を起こすことはありません。
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-delimiters
がnil
の場合には、
区切りのうしろで分割します。
それ以外(デフォルトでもある)では、区切りのまえで分割します。
デフォルトではFortran専用自動詰め込み(fortran-auto-fill)モードはオフです。
この機能を恒常的に使いたければ、
(fortran-auto-fill-mode 1)
を実行するフック関数を
fortran-mode-hook
に追加してください。
See Hooks。
fortran-column-ruler
)。
fortran-window-create-momentarily
)。
コマンドC-c C-r(fortran-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-w(fortran-window-create
)は、
現在のウィンドウを幅が72桁になるように横位置で分割します。
このウィンドウで編集すれば、
正しいFortranのプログラムとしては長すぎる行を即座に発見できます。
Fortranモードには、一般的なキーワードや宣言に対する 数多くの組み込み略語があります。 これらは、ユーザー自身が定義できる略語と同じ種類のものです。 それらを使うには、略語(abbrev)モードをオンにします。 See Abbrevs。
組み込み略語は他の略語と1つの点で変わっています。 すべてセミコロンで始まります。 通常は略語にはセミコロンを使えませんが、 Fortranモードでは、セミコロンの構文上の意味を『単語を構成する文字』に 変更することで、これを可能にしています。
たとえば、continue
に対する組み込みFortran略語は;c
です。
略語(abbrev)モードがオンのときに、
;c
を挿入してから空白や改行といった句読点文字を挿入すると、
;c
は自動的にcontinue
と展開されます。
組み込みFortran略語とその展開形の一覧を表示するには、
;?
あるいは;C-h
と打ちます。
Fortranモードでは、
キーC-x n dはコマンドfortran-narrow-to-subprogram
を実行するように
再定義しています。
このコマンドは、キーの通常の定義をFrotran風にしたものです。
バッファをポイントを含む副プログラムにナロイングします。
asmモードは、アセンブリコードのファイルを編集するためのメジャーモードです。 つぎのコマンドが定義されています。
tab-to-tab-stop
。
tab-to-tab-stop
で字下げする。
tab-to-tab-stop
を行う。
変数asm-comment-char
は、
アセンブラ構文でコメントを開始する文字を指定します。
前章ではプログラムの変更に便利なEmacsコマンドを説明しました。 本章ではプログラムの大規模な開発や保守を助けるコマンドを説明します。
EmacsはCやFortranのような非対話的な言語のコンパイラを 下位プロセスとして実行でき、 そのエラーログをEmacsバッファに取り込めます。 また、エラーメッセージを解析して、 コンパイルエラーを起こしたソース行を提示することもできます。
*compilation*
バッファに取り込む。
grep
を非同期に実行し、
一致した行を*grep*
バッファに取り込む。
find
とgrep
を実行し、
出力を*grep*
バッファに取り込む。
grep
のサブプロセスを停止させる。
make
や他のコンパイルコマンドを実行するには、
M-x compileと打ちます。
このコマンドは、ミニバッファでシェルコマンドを読み取り、
そのコマンドを下位シェルで実行し、
出力結果を*compilation*
という名のバッファに取り込みます。
カレントバッファのデフォルトディレクトリを
シェルコマンド実行時の作業ディレクトリとして用います。
そのため、通常はこのディレクトリにあるものをコンパイルします。
シェルコマンド行を読み取るとき、
ミニバッファにはデフォルトのシェルコマンド行が表示されますが、
これは前回M-x compileを使ったときのコマンドです。
単に<RET>だけを打鍵すると、同じシェルコマンド行を再使用します。
最初のM-x compileでは、デフォルトはmake -k
です。
デフォルトのコンパイルコマンドは変数compile-command
から取ります。
適切なコンパイルコマンドが他にある場合には、
ファイルでこの変数のローカルな値を指定すると便利でしょう
(see File Variables)。
コンパイルが始まると、バッファ*compilation*
は別のウィンドウに
表示されますが、選択されるわけではありません。
このバッファのモード行では、
括弧の中に単語run
かexit
を表示して
コンパイルが終了したかどうか示します。
このバッファを見えるようにしておく必要はありません。
いずれにしても、コンパイルは継続されます。
コンパイル中は、すべてのウィンドウのモード行に
文字列Compiling
が表示されます。
この文字列が消えれば、コンパイルは終了しています。
コンパイルの進行状況を見たい場合には、
*compilation*
バッファに切り替えてポイントをバッファの末尾に移動します。
ポイントがバッファの末尾にあると、
新らたなコンパイル出力はポイントのまえに挿入されポイントは末尾に留まります。
ポイントがバッファの末尾にないと、
コンパイル出力はバッファの末尾に追加されますが
ポイントは途中の場所に留まったままです。
変数compilation-scroll-output
にnil
以外の値を設定すると、
出力が到着するたびに出力に追従するように
コンパイルバッファをつねにスクロールします。
コンパイルプロセスを止めるには、
M-x kill-compilationを実行します。
コンパイルプロセスが終了すると、*compilation*
バッファの
モード行の表示がrun
からsignal
に変わります。
一度に実行可能なコンパイルは1つだけなので、
新しくコンパイルを始めると実行中のコンパイルは停止させられます。
しかし、M-x compileは、
実行中のコンパイルを実際に停止させるかどうか聞いてきます。
Emacsからコンパイラを実行し、コンパイルエラーを起こした行を
訪れることができるように、grep
を実行して
一致した行を訪れることができます。
これは、grep
が報告した一致を『エラー』として扱うことで行います。
それには、M-x grepと打鍵してから、
grep
をどのように実行するかを指定するコマンド行を入力します。
普通にgrep
を実行するときに指定する引数と同じものを使います。
つまり、grep
流の
(普通、シェルの特殊文字をクォートするためにシングルクォートで囲んだ)
正規表現に続けて、ワイルドカードなどを用いたファイル名を指定します。
grep
の出力は*grep*
バッファに入ります。
ファイル内の対応する行を探すには、コンパイルエラーの場合と同様に、
C-x `と<RET>を使います。
M-x grepに前置引数を指定すると、
ポイントの周りから(探すべき)タグを推測して
デフォルトのgrep
コマンドにそれを含めます。
M-x grep-findはM-x grepコマンドと同様ですが、
シェルコマンドに与える最初のデフォルトが違います。
find
とgrep
の両方を実行して、
ディレクトリ木構造下の各ファイルを探索します。
Dired and Findのfind-grep-dired
コマンドも参照してください。
*compilation*
バッファは、
コンパイル(compilation)モードと呼ばれる特別なメジャーモードになります。
このモードの主な機能は、エラーが起きたソース行を簡単に参照できることです。
grep
のつぎの一致に
対応する箇所を訪れる。
*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-nとM-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)。
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。
GUD(Grand Unified Debugger、大統一デバッガ)ライブラリは、 Emacsからさまざまなデバッガへのインターフェイスを提供します。 フリーソフトウェアであるGDBをお勧めしますが、 DBX、SDB、XDBを持っているならばそれらを使うこともできます。 GUDは、Perlのデバッグモード、 PythonのデバッガPDB、JavaデバッガJDBに対するインターフェイスにもなります。
デバッガを開始するコマンドはいくつかあり、 それぞれ、特定のデバッガに対応しています。
gud-xdb-directories
を使う。
SDBのバージョンによっては、メッセージにソースファイル名を
含めないものがある。
そのようなSDBを使う場合には、GUDがソースコードから関数を探せるように
正しいタグテーブル(see Tags)が必要である。
タグテーブルを訪問していなかったり、
タグテーブルに当該関数がなかったりすると、
The sdb support requires a valid tag table to work
という
メッセージが表示される。
このような場合には、作業ディレクトリに正しいタグファイルを生成してから
やり直す。
これらのコマンドは引数を1つ、
つまり、デバッガを起動するコマンド行を取ります。
もっとも単純な場合は、デバッグしたい実行ファイルの名前を指定します。
デバッガに指定できるオプションを使うこともできます。
しかし、シェルのワイルドカードや変数名は使えません。
GUDは、-
で始まらない最初の引数をデバッグする実行ファイル名であると
仮定します。
Emacsはデバッガプロセスを一度に1つだけ実行できます。
GUDの下でデバッガを実行すると、
デバッガは通常の入出力にEmacsバッファを使います。
このバッファをGUDバッファと呼びます。
デバッガはEmacsバッファでファイルを訪問して、
プログラムのソースファイルを表示します。
このようなバッファの1つに矢印(=>
)が表示され、
現在実行している行を表示します。
このバッファでポイントを動かしても矢印は動きません。
ソースファイルを表示したバッファでは、いつでもソースファイルを編集できます。 矢印はファイルのテキストの一部ではなく、画面上に表示されているだけです。 ソースファイルを変更するとき、 行を挿入/削除すると矢印の表示位置情報が失われることに注意してください。 GUDには、変更前のデバッガメッセージから変更後の対応する行番号を知る術は ありません。 また、デバッガにソースの変更を反映するには、 プログラムを再コンパイルしてから再実行する必要があります。
お好みならば、シェル(shell)モードの変形を用いた デバッガバッファを介して、デバッガプロセスを完全に制御することもできます。 こうすれば、デバッガのすべてのコマンドを利用でき、 シェル(shell)モードの履歴機能を用いて コマンドを繰り返し実行できます。 See Shell Mode。
GUD対話バッファはシェル(shell)モードの変形を使うので、 シェル(shell)モードのコマンドを使えます(see Shell Mode)。 GUDモードでは、ブレークポイントの設定と解除、スタックフレームの選択、 プログラムのステップ実行などのコマンドもあります。 これらのコマンドはGUDバッファでもそれ以外でも使えますが、 キーバインドは異なります。
ブレークポイントコマンドは、普通、ソースファイルのバッファで使います。 というのは、ソース上でブレークポイントを設定/解除するのが自然だからです。 以下はブレークポイントを設定するグローバルコマンドです。
以下はその他のGUDモード特有のコマンドです。 C-cで始まるキー列は、GUD対話バッファだけで使えます。 C-x C-aで始まるキー列は、 GUD対話バッファとソースファイル(のバッファ)の両方で使えます。
gud-refresh
を実行する。
gud-step
)。
その行に関数呼び出しが含まれる場合は、呼び出された関数に入ってから停止する。
gud-next
)。
gud-stepi
)。
gud-remove
)。
GUD対話バッファでこのコマンドを使うと、
プログラムが最後に停止した行に適用される。
上にあげたコマンドは、(GUDから使える)すべてのデバッガに共通です。 GDBやDBX(のあるバージョン)では、さらに以下のコマンドも使えます。
gud-up
)。
これはup
コマンドと等価。
gud-down
)。
これはdown
コマンドと等価。
GDBを使う場合には以下のコマンドも使用できます。
gud-gdb-complete-command
)。
このキーはGUDの対話バッファでだけ使える。
また、GDBのバージョンは4.13以降であること。
これらのコマンドは、意味がある場合には数引数を反復回数として解釈します。
<TAB>は、補完コマンドとして働くため、 GDBでデバッグしているプログラムへのタブの入力には使えません。 タブを入力するにはC-q <TAB>と打鍵します。
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とします。
このように定義したコマンドは、どのバッファでも使えます。
bindingがnil
以外の場合、
gud-def
はGUDバッファのモードに対しては
このコマンドをC-c bindingにバインドし、
それ以外に対してはC-x C-a bindingにバインドします。
コマンド文字列cmdstringには、
functionが呼び出されたときにデータが埋め込まれる
%
系列を含めることもできます。
%f
%l
%e
%a
%p
%p
は空文字列。
cmdstringで%p
を使用しなければ、
定義しようとしているfunctionは数引数を無視する。
Emacsには、LispやSchemeのための異なったメジャーモードがいくつかあります。 これらは編集コマンドという意味では同じですが、 Lisp式を実行するコマンドが異なります。 各モードには固有の目的があります。
Lispプログラム用の編集コマンドの大部分は事実上どこでも使えます。 See Programs。
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-libraryがM-x load-fileと異なる点は、
一連のディレクトリについて3つのファイル名を順に調べるということです。
引数がlibだとすると、3つのファイル名とは、
lib.elc
、lib.el
、そして最後にlib
です。
lib.elc
というファイルが存在すれば、
これは習慣としてlib.el
をコンパイルしたものです。
コンパイル済みのファイルはロードと実行が速いので、
こちらをロードするほうが有利です。
load-library
がlib.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
というファイルを探す理由です。
Emacs内で動かすつもりのLispプログラムは、emacs-lispモードで編集しましょう。
ファイル名が.el
で終っているファイルを編集すると、
自動的にこのモードになります。
一方、lispモードは、他のLispシステム向けのLispプログラムを編集する
ためのモードです。
陽にemacs-lispモードに移るには、コマンドM-x emacs-lisp-modeを使います。
Emacs内で動くプログラムのテストには、 Emacsバッファにあるプログラムの一部を評価すると便利です。 たとえば、Lispの関数定義のテキストを変更してからその定義を評価すると、 それ以降にその関数を呼び出すと使われるようにインストールされます。 Lisp式を評価すると非対話的な(コマンドではない)関数を起動できるので、 どんな種類の編集作業にも便利です。
eval-expression
)。
eval-last-sexp
)。
eval-defun
)。
M-:(eval-expression
)は、Lisp式を対話的に評価する
もっとも基本的なコマンドです。
これは、ミニバッファで式を1つ読み取りますから、
バッファの内容に関係なくバッファ内でどんな式でも実行できます。
式が評価されたあとは、
M-:を打鍵したときのカレントバッファが、ふたたびカレントバッファになります。
emacs-lispモードでは、キーC-M-xはコマンドeval-defun
にバインド
されています。
このコマンドはポイントを含むか直後にある関数定義を
Lisp式として解析し評価します。
その値はエコー領域に表示されます。
このコマンドは、関数定義のテキストの変更を
Lisp環境に反映するのに便利です。
C-M-xはdefvar
式を特別扱いします。
通常、変数にすでに値が定義されている場合には、
defvar
式を評価しても何もしません。
しかし、C-M-xは、defvar
式で指定されている
初期値に変数の値を戻します。
この特別な機能は、Lispプログラムをデバッグするときに便利です。
コマンドC-x C-e(eval-last-sexp
)は、
ポイントのまえにあるLisp式を評価し
その値をエコー領域に表示します。
このコマンドはemacs-lispモードだけでなく、
すべてのメジャーモードで使えます。
このコマンドは、defvar
を特別扱いしません。
C-M-x、C-x C-e、M-:に数引数を指定すると、 値をエコー領域に表示するかわりにカレントバッファのポイント位置に挿入します。 引数の値は関係ありません。
バッファでLisp式を評価するもっとも一般的なコマンドはeval-region
です。
M-x eval-regionは、リージョン内の1つ以上のLisp式を解析して、
それらを1つずつ順に評価します。
M-x eval-current-bufferも同様ですが、バッファ全体を評価します。
これは、
テスト準備が整ったLispコードのファイルの内容を取り込むうまい方法です。
個々の関数のバグを発見して修正したら、
変更した関数それぞれにC-M-xを使います。
これによって、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*
バッファが作られます。
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システムで使われる
.l
35
や.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。
定義済みの略語(abbrev)とは、
挿入時に別のテキストに展開される単語のことです。
略語を定義するときに、それをどう展開するか指定します。
たとえば、foo
を略語として、
find outer otter
に展開すると定義したとします。
すると、f o o <SPC>と打鍵すれば
バッファにはfind outer otter
36
が挿入されます。
略語の別な形に、動的略語展開(dynamic abbrev expansion)があります。 動的略語展開とは、バッファ中のポイントのまえにある文字列を バッファ内にあるその文字列で始まる既存の単語に展開することで、 陽にコマンドを実行して行います。 See Dynamic Abbrevs。
略語とは、あらかじめどう展開するか定義された単語のことです。
略語に続けて、空白、タブ、ピリオドなどの単語の区切り文字を入力すると、
略語は展開されて展開形に置き換わります。
たとえば、略語foo
を展開形find outer otter
に展開するように
定義しておけば、f o o .と打鍵すると
find outer otter.
をバッファに挿入できます。
略語は、略語(abbrev)モード(マイナモード)がオンのときにだけ展開されます。
略語(abbrev)モードをオフにしても定義した略語が消えてしまうわけではなく、
つぎにオンにしたときに同じ定義をふたたび使えます。
コマンドM-x abbrev-modeでこのモードのオン/オフをトグル(切り替えが)
できます。
また、数引数を指定した場合、
引数が正のときには略語(abbrev)モードはオンになり、
それ以外のときにはオフになります。
See Minor Modes。
abbrev-mode
は変数でもあります。
この変数がnil
以外のときには略語(abbrev)モードはオンです。
この変数に値を設定すると、自動的にカレントバッファに
ローカルな変数になります。
略語定義はモードに固有にできます。 つまり、あるメジャーモードのときにだけ働くように定義できます。 略語はグローバルにも定義でき、 そのときはすべてのメジャーモードで使えます。 同じ略語に、グローバルな定義と、さまざまなメジャーモードに固有な定義とを 持たせることができます。 あるメジャーモードに固有な定義は、グローバルな定義に優先します。
略語は、編集作業中に対話的に定義できます。 略語の定義一覧を、あとで使うためにファイルに保存することもできます。 大量の略語定義をセッションごとにロードする人もいます。
add-global-abbrev
)。
add-mode-abbrev
)。
inverse-add-global-abbrev
)。
inverse-add-mode-abbrev
)。
略語を定義する普通の方法は、
まず、略語に置き換わってほしい展開形のテキストを入力し、
つぎにその直後にポイントをもっていき、
C-x a g(add-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 l(add-mode-abbrev
)も同様ですが、
特定のモードに固有な定義になります。
モードに固有な略語は、特定のメジャーモードの中だけで有効です。
C-x a lは、C-x a lと打鍵したときのメジャーモードに対する
略語を定義します。
引数の意味はC-x a gと同じです。
すでにバッファ内にあるテキストを略語として使いたい場合には、
C-x a gのかわりにコマンドC-x a i g
(inverse-add-global-abbrev
)、あるいは、
C-x a lのかわりにコマンドC-x a i l
(inverse-add-mode-abbrev
)を使います。
これらは『逆さ』(inverse)コマンドと呼ばれます。
というのは、これらのコマンドで使う
(バッファにあるものとミニバッファから読むものの)2つの文字列
の用途が逆さだからです。
略語の定義を変更するには、単に新たに定義してください。 略語がすでに定義されていると、 略語定義コマンドは置き換えてよいかどうかを確認してきます。
略語の定義を削除するには、略語定義コマンドに負の数引数を指定します。 C-u - C-x a gやC-u - C-x a lのようにします。 前者はグローバルな定義を、後者はモードに固有な定義を削除します。
M-x kill-all-abbrevs は、グローバルとローカルのすべての略語定義を 削除します。
ポイントの直前に略語があるときに白文字や区切り文字(<SPC>、コンマなど) を打鍵すると、略語はつねに展開されます。 より正確には、英単語の構成文字以外のどんな文字でも略語展開は起こり、 英単語の構成文字の任意の組み合わせを略語に使用できます。 略語の通常の使い方は、略語を入力してから区切り文字を入力して 展開を行わせるという方法です。
略語展開では大文字小文字を保存します。
したがって、
foo
はfind outer otter
に、
Foo
はFind outer otter
に展開されます。
また、変数abbrev-all-caps
に応じて、FOO
は
(変数の値がnil
以外のときは)
FIND OUTER OTTER
、あるいは、Find Outer Otter
に展開されます
以下は略語展開を制御するために使うコマンドです。
expand-abbrev
)。
このコマンドは略語(abbrev)モードがオンでなくても働く。
接頭辞が付いた略語を展開したい場合もあるでしょう。
略語cnst
はconstruction
に展開されるとして、
reconstruction
と入力するためにこの略語を使いたいとします。
recnst
と打鍵してもだめです。
というのは、recnst
は定義済みの略語ではないからです。
ではどうすればよいかというと、
接頭辞re
と略語cnst
のあいだでコマンドM-'
(abbrev-prefix-mark
)を使うのです。
まずre
と打ち込みます。
続いてM-'と打鍵します。
するとバッファにハイフン(-)が挿入され、切れ目が入ったことを示します。
それから略語cnst
を入力します。
バッファにはre-cnst
と入っています。
ここで単語構成文字以外の文字を打ち込めば、
略語cnst
がconstruction
に展開されます。
展開時には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)が実行されます。
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*
を選択するのに対し、
後者はバッファを別のウィンドウに表示するだけです。
以下のコマンドは、編集セッション間で略語定義を保存するためのものです。
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 sやC-x C-cなどで)すべてのファイルを保存するかどうか
問い合わせるときに同時に聞いてきます。
この機能は、変数save-abbrevs
の値をnil
にすると禁止できます。
コマンドM-x insert-abbrevsとM-x define-abbrevsは、 上で述べたコマンドと同様ですが、 Emacsバッファ内のテキストに作用します。 M-x insert-abbrevsは、カレントバッファのポイントの直前に すべての略語定義を記述したテキストを挿入します。 M-x define-abbrevsは、 カレントバッファ全体を解析し、その内容に従って略語を定義します。
これまでに述べてきた略語の機能は、テキストを挿入するときに自動的に働きますが、 すべての略語を陽に登録しておく必要があります。 一方、動的略語(dynamic abbrevs)は、 バッファの内容に基づいて略語の展開形を自動的に決定することができます。 ただし、陽に指示したときだけ、動的略語展開を行います。
dabbrev-expand
)。
dabbrev-completion
)。
たとえば、バッファ内にdoes this follow
があるときに
f o M-/と打鍵すると、バッファ内でfo
で始まる近くにある単語が
follow
なのでfollow
が挿入されます。
M-/に数引数を指定すると、ポイントから先頭に向かって探して、2番目のもの、
3番目のものというように異なる展開形に展開できます。
M-/を繰り返すことにより、
次々にさらに先頭へ向かって探して別の候補に展開します。
ポイントよりまえのすべてのテキストを探し終えた場合には、
ポイントよりうしろのテキストを探します。
変数dabbrev-limit
がnil
以外
37
ならば、バッファ内のどの範囲まで展開候補を探すかを指定します。
カレントバッファを探し終ると、
変数dabbrev-check-all-buffers
をnil
に設定していない限り、
M-/は他のバッファも探します。
C-u - M-/のようにM-/に負の数引数を指定すると、 まずポイントのうしろから展開候補を探し、 つぎにポイントのまえから展開候補を探します。 M-/を繰り返して別の展開候補を探す場合には、引数を指定しません。 これにより、ポイントよりうしろのすべての展開候補を試してから、 つぎにポイントよりまえのすべての展開候補を試せます。
動的略語を展開したあとでは、展開形のもともとの場所でつぎに続く単語(群)を コピーすることができます。 コピーしたい単語ごとに単に<SPC> M-/と打鍵します。 単語のあいだの空白や句読点も単語とともにコピーされます。
コマンドC-M-/(dabbrev-completion
)は、
動的略語の補完を行います。
展開候補を1つずつ試すかわりに、すべての候補を全部探して
それらに共通するテキストを挿入します。
それらに共通部分がなければ、C-M-/は候補一覧を表示するので
普通の方法でその中から1つ選びます。
See Completion。
動的略語展開は略語(abbrev)モードと完全に独立しています。 M-/による単語の展開は、 略語(abbrev)モードで定義済みかどうかとは完全に独立しています。
通常、動的略語展開では大文字小文字を区別しないで候補を探します。 つまり、展開候補と略語の大文字小文字が一致する必要はありません。
この機能は変数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-regexp
がnil
以外の場合、
動的展開においてどんな文字を単語構成文字とみなすかを制御します。
これに指定する正規表現は1文字のみに一致するものである必要があり、
2文字以上に一致してはいけません。
同じ正規表現は、どの文字が展開形を構成するかも指定します。
値としてnil
を指定すると特別な意味があり、
略語は単語の構成文字だけから成り、
展開形は単語と記号文字から成るという意味になります。
シェルスクリプトやmakefileなどでは、
変数名には接頭辞$
があったりなかったりします。
これらのテキスト用のメジャーモードでは、
変数dabbrev-abbrev-skip-leading-regexp
を設定して
余分な接頭辞を扱えるように動的展開をカスタマイズできます。
この変数には、動的略語展開で無視すべき余分な接頭辞に一致する
正規表現を指定します。
テキスト文字で書いた絵(たとえば、プログラムのコメントとして レジスタをフィールドに分割した絵)を編集するには、 コマンド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)。
ピクチャー(picture)モードでも、ほとんどのキーは通常と同じ動作をしますが、
1/4平面流の動作です。
たとえば、C-fは、
picture-forward-column
を実行するように再定義してあります。
このコマンドはポイントを1桁右に動かし、
必要なら空白を挿入して、行末がないかのようにふるまいます。
C-bは、
picture-backward-column
を実行するように再定義してあります。
このコマンドはポイントを1桁左に動かし、
必要に応じてタブを複数の空白に変換します。
C-nとC-pは、それぞれpicture-move-down
と
picture-move-up
を実行するように再定義してあります。
これらのコマンドは、必要に応じて空白を挿入したりタブを変換して、
ポイントが同じ桁位置に留まるように移動します。
C-eはpicture-end-of-line
を実行します。
このコマンドは、行の最後の白文字以外の文字の直後に移動します。
画面モデルは行頭には影響しないので、C-aを変更する必要はありません。
テキストの挿入は、上書き(overwrite)モードを用いて
1/4平面モデルに対応させてあります(see Minor Modes)。
自己挿入文字は、既存のテキストを右側へ押しやるのではなく、
既存のテキストを桁ごとに置き換えます。
<RET>はpicture-newline
を実行します。
このコマンドは、つぎの行の先頭に移動し、
その行が新たなテキストで置き換わるようにします。
ピクチャー(picture)モードでは、テキストの削除やキルのかわりに消去します。
<DEL>(picture-backward-clear-column
)は、
直前の文字を削除するのではなく空白で置き換え、
また、ポイントを1つまえに戻します。
C-d(picture-clear-column
)は直後の1つ以上の文字を
空白で置き換えますが、ポイントは動かしません。
(文字を空白で置き換えて、かつ、ポイントを先へ進めるには、<SPC>を使う。)
C-k(picture-clear-line
)は行の内容を実際にキルしますが、
バッファから改行を削除しません。
実際に挿入を行うには、特別なコマンドを使う必要があります。
C-o(picture-open-line
)は、
現在行のつぎに空行を作りますが、行を分割しません。
C-M-o(split-line
)は
ピクチャー(picture)モードでも意味があるので変更してありません。
C-j(picture-duplicate-line
)は
現在行の下に現在行と同じ内容の行を挿入します。
ピクチャー(picture)モードで実際に削除を行うには、
C-wか
(他のモードでのC-dと同じdelete-char
に定義されている)
C-c C-d、あるいは、絵の矩形領域コマンドの1つを使います
(see Rectangles in Picture)。
ピクチャー(picture)モードでは『自己挿入』文字は 上書きしてポイントを動かしますから、 ポイントをどのように動かすかについて本質的な制限はありません。 通常ポイントは右に動きますが、『自己挿入』文字のあとで 上下左右斜めの8方向のいずれの方向へ移動するか指定できます。 これは、バッファに直線を引くときに役立ちます。
picture-movement-left
)。
picture-movement-right
)。
picture-movement-up
)。
picture-movement-down
)。
picture-movement-nw
)。
picture-movement-ne
)。
picture-movement-sw
)。
picture-movement-se
)。
2つの移動コマンドは、現在指定されている挿入後の移動方向に基づいて動作します。
コマンドC-c C-f(picture-motion
)は、
現在指定されている『挿入』後の移動方向と同じ方向へ移動しますが、
C-c C-b(picture-motion-reverse
)は反対方向へ移動します。
ピクチャー(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-mode
にnil
を設定します。
See Just Spaces。
ピクチャー(picture)モードでは、 1/4平面モデルに適合するように、 テキストの矩形領域に作用するコマンドを定義します。 標準的な矩形領域コマンドも役立つでしょう (see Rectangles)。
picture-clear-rectangle
)。
数引数を指定するとテキストを削除する。
picture-clear-rectangle-to-register
)。
picture-yank-rectangle
)。
数引数を指定すると挿入する。
picture-yank-rectangle-from-register
)。
絵の矩形領域コマンド、C-c C-k(picture-clear-rectangle
)と
C-c C-w(picture-clear-rectangle-to-register
)は、
標準の矩形領域コマンドが矩形領域を削除するのに対しクリアする点で異なります。
これは、ピクチャー(picture)モードでのC-dの意味の変更方法に
類似したものです。
しかし、ピクチャー(picture)モードでも矩形領域の削除は便利なので、 数引数を与えるとこれらのコマンドは矩形領域を削除します。 引数を指定してもしなくてもC-c C-kは C-c C-yのために矩形領域を(レジスタに)保存します。
ピクチャー(picture)モードのヤンクコマンドは標準のそれとは、
挿入のかわりに上書きする点で異なります。
これはピクチャー(picture)モードでのテキストの挿入が
他のモードでのそれと異なっているのと同じです。
C-c C-y(picture-yank-rectangle
)は、
もっとも最近にキルした矩形領域を(上書きで)挿入しますが、
C-c C-x(picture-yank-rectangle-from-register
)
は同様のことを指定されたレジスタ内の矩形領域で行います。
Emacsでメッセージを送信するには、
まずコマンド(C-x m)を打って
*mail*
バッファを選択して初期化します。
続いて、このバッファでテキストとヘッダを編集し、
最後に別のコマンド(C-c C-sかC-c C-c)を
打ってメッセージを送信します。
compose-mail
)。
compose-mail-other-window
)。
compose-mail-other-frame
)。
mail-send
)。
mail-send-and-exit
)。
コマンドC-x m(compose-mail
)は、
*mail*
という名前のバッファを選択し、
そのバッファ内に送信するメッセージの雛型を作ります。
C-x 4 m(compose-mail-other-window
)は、
別のウィンドウで*mail*
バッファを選択し、
直前のカレントバッファは見えるようにしておきます。
C-x 5 m(compose-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*
バッファを作ります。
こうすれば個々のメイルバッファを独立に編集できます。
メッセージにはテキスト、つまり、本文以外にも、
誰が、いつ、誰に、なぜ送ったかなどを示すヘッダフィールドがあります。
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.
メイルバッファ内のヘッダフィールドは、
行頭のフィールド名で始まり、コロン:
で区切られます。
フィールド名(およびメイルアドレス)では、
大文字小文字の区別はありません。
コロンと省いてもよい白文字のあとにフィールドの内容を書きます。
ヘッダフィールドには好き勝手にどんな名前でも使えますが、 一般にはきちんと意味のある標準的なフィールド名だけを使います。 以下は送信メッセージで一般的に使われるフィールドの一覧です。
To
Subject
Subject
フィールドの内容としては、
メッセージが何についてのものかを書く。
Subject
フィールドが有効な理由は、
大部分のメイル閲覧プログラムが、
各メッセージの本文ではなくSubject
を使ってメイル一覧を表示するため。
CC
To
フィールドと同様に
メッセージ送付先の追加メイルアドレスを書く。
ただし、これらのアドレスにあげられた人達は、
自分宛てのメッセージだとは思わないように。
BCC
すべての送信メッセージのブラインドカーボンコピーを自分自身に送るには、
変数mail-self-blind
にt
を設定する。
FCC
送信メッセージを編集するたびに毎回決まったファイル名を
FCC
フィールドに指定するには、
変数mail-archive-file-name
にそのファイル名を設定する。
送信メッセージからFCC
フィールドを削除しない限り、
メッセージを送信するたびにこのファイルにメッセージが書き込まれる。
From
From
フィールドは、メイル送信時に使っているアカウントが自分のもの
でない場合に、送信者が本当は誰なのかを示すために用いる。
返信には通常このフィールドが使われるので、
From
フィールドの内容は正しいメイルアドレスであること。
自分でFrom
フィールドを指定しなければ、
Emacsはデフォルトで変数user-mail-address
の値を使う。
Reply-to
From
のアドレスよりReply-to
のアドレスを優先して
自動的に返信を送る。
Reply-to
フィールドをヘッダに加えておけば、
From
のアドレスが返信時に引き起こすであろうどんな問題でも回避できる。
すべての送信メッセージのReply-to
フィールドに決まったアドレスを
指定するには、
変数mail-default-reply-to
に(文字列で)そのアドレスを設定する。
こうすると、mail
は指定されたReply-to
フィールドを
付けてメッセージを初期化する。
メッセージを送信するまえに、
必要なら、このフィールドを削除したり変更したりできる。
Emacsが動き始めたときに環境変数REPLYTO
が設定されていれば、
その環境変数の値で変数mail-default-reply-to
を初期化する。
In-reply-to
References
ヘッダフィールド、To
、CC
、BCC
、FCC
は、
いくつあってもよく、しかも、これらの各フィールドには
コンマで区切って複数のアドレスを書けます。
こうすれば、メッセージの送付先をいくつでも指定できます。
To
、CC
、BCC
フィールドでは継続行を使えます。
これらのフィールドに続く白文字で始まる行は、
すべてフィールドの一部であると見なします。
以下は継続行を用いた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
フィールドを埋めさせる。
~/.mailrc
という名前のファイルでメイルの別名
(mail alias)を定義できます。
メイルの別名とは、複数のメイルアドレスやそれらのグループに付けた
覚えやすい短い名前のことです。
他の多くのメイルプログラムと同様に、
To
、From
、CC
、BCC
、Reply-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-a
(mail-interactive-insert-alias
)コマンドもあって、
別名を(補完を使って)読み取り、その定義をポイント位置に挿入します。
この機能は、Emacsが別名を通常展開しない本文やSubject
フィールドなど
を編集しているときに便利です。
単語の区切り文字を挿入したあとで略語が展開されることに注意してください。 しかし、C-nとM->を再定義して 展開が行われるように設定することもできます。 つぎのようにします。
(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)))
メイルバッファで使われるメジャーモードはメイル(mail)モードです。
テキスト(text)モードに似ていますが、
プレフィックスC-cで始まる多くの特別なコマンドがあります。
これらのコマンドはすべてメッセージの編集や送信に関するものです。
さらに、メイル(mail)モードでは、文字%
を単語の切れ目と定義しています。
これは、単語コマンドを使ってメイルアドレスを編集するときに便利です。
mail
コマンドやそれに関連するコマンドが自動的に設定する
バッファでは、普通、メイル(mail)モードを使います。
しかし、ファイルを訪問しているバッファをメイル(mail)モードに
切り替えることもできます。
これは、メッセージの草稿をファイルに保存してあるときなどに便利です。
メイル(mail)モードには、編集したメッセージを送信するコマンドが2つあります。
mail-send
)。
mail-send-and-exit
)。
C-c C-s(mail-send
)はメッセージを送信して
メイルバッファに『変更なし』の印を付けます
(変更フラグをクリアする)。
しかし、メッセージバッファは選択したままですから、
メッセージを修正して(新たな受け手に)再度送信できます。
C-c C-c(mail-send-and-exit
)はメッセージを送信してから、
ウィンドウを削除するか別のバッファに切り替えます。
メイルバッファは使い終えたので、
デフォルトではその選択優先度は最低になります。
普通はこのコマンドでメッセージを送信します。
ファイルを訪問しているバッファでは、メッセージ送信後でも変更フラグを クリアしません。 ファイルを保存した場合にだけ変更フラグをクリアすべきだからです。 この結果、同一メッセージを2回送信しようとしても警告は出ません。
非ASCII文字を含むメッセージを送信するときには、
それらをコーディングシステム(see Coding Systems)
で符号化する必要があります。
通常、コーディングシステムは、
選択した言語環境(see Language Environments)によって
自動的に指定されます。
変数sendmail-coding-system
を設定すると、
送信メイルのコーディングシステムを明示できます。
このように決めたコーディングシステムが、 メッセージ内の文字を扱えない場合には、 Emacsは、可能なコーディングシステムの一覧を表示して、 使用するコーディングシステムを問い合わせます。
メイル(mail)モードには、特定のヘッダフィールドへ移動したり ヘッダのアドレスを補完する特別なコマンドがあります。
To
へ移動する。
フィールドがなければ作成する(mail-to
)。
Subject
へ移動する。
フィールドがなければ作成する(mail-subject
)。
CC
移動する。
フィールドがなければ作成する(mail-cc
)。
BCC
へ移動する。
フィールドがなければ作成する(mail-bcc
)。
FCC
へ移動する。
フィールドがなければ作成する(mail-fcc
)。
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
を起動します。
メイル(mail)モードには、 返信対象であるメッセージの全部や一部をヤンク、つまり、引用(cite) するためのコマンドもあります。 こうしたコマンドはrmailコマンドを 使ってメッセージを送信する場合にだけ使えます。
mail-yank-original
)。
mail-yank-region
)。
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-r
(mail-yank-region
)と打ちます。
コピーされる各行は、mail-yank-prefix
に従って
字下げされるか行頭に文字列が挿入されます。
C-c C-yやC-c C-rを使い終ったら、
C-c C-q(mail-fill-yanked-message
)と打てば
ヤンクした古いメッセージを段落に詰め込めます
38。
引用したメッセージを1つの段落に詰め込むには、M-qを使います。
詰め込み処理で行頭の文字を自動的に正しく扱えない場合には、
詰め込み接頭辞を陽に指定して試してください。
See Filling。
mail-text
)。
~/.signature
をメッセージの本文の末尾に挿入する
(mail-signature
)。
mail-attach-file
)。
C-c C-t(mail-text
)は、
ポイントをヘッダの区切り行のあと、つまり、メッセージ文の先頭に移動します。
C-c C-w(mail-signature
)は、
あなたを識別するための決まり文句(サイン)をメッセージの末尾に追加します。
このテキストは、ホームディレクトリのファイル~/.signature
から取ります。
このサインを自動的に挿入するようにするには、
変数mail-signature
にt
を設定します。
そうすると、メイルメッセージに自動的に
ファイル~/.signature
の内容が付加されます。
特定のメッセージにサインを付けたくなければ、
送信前にバッファ内で削除してください。
変数mail-signature
に文字列を指定することもできます。
すると、送信メッセージを編集し始めると、
その文字列はサインとして自動的に挿入されます。
この変数にそれ以外のLisp式を指定すると、
毎回その式が評価されその値(文字列であること)がサインになります。
コマンドM-x ispell-messageで、
書きあげたメッセージの綴りを訂正できます。
このコマンドは、引用部分については調べませんが、
あなた自身が打ち込んだテキストは検査します。
(字下げやmail-yank-prefix
を利用して、
引用部分とあなたの入力部分を区別します。)
See Spelling。
送信メッセージにファイルを付加するには、
カレントバッファにファイルを挿入する普通のコマンドC-x iを使います。
しかし、専用コマンドC-c C-i(mail-attach-file
)
を使うほうがより便利なことがしばしばあります。
このコマンドは、指定したファイルの内容をバッファの最後、
サインがあればそのうしろに、ファイル名を含んだ区切り行を付けて挿入します。
(C-x mが自動的に行うように)メイル(mail)モードをオンにすると、
ノーマルフック、text-mode-hook
とmail-mode-hook
とが
実行されます。
新たな送信メッセージを初期化するときには、
ノーマルフックmail-setup-hook
を実行します。
メイルヘッダに特別なフィールドを追加したり
メイルバッファの外見を変えたいならば、これらのフックを使ってください。
See Hooks。
これらのフックの主な違いは、どの時点で起動されるかです。
M-x mailと打鍵すると、*mail*
バッファを作成後ただちに
mail-mode-hook
が実行されます。
続いてmail-setup
関数がバッファにデフォルトの内容を入れます。
そのあとで、mail-setup-hook
が実行されます。
M-x spookは、ランダムに選んだキーワードから成る行を 送信メッセージに付け加えます。 破壊活動を画策していると思わせるような単語の一覧表からキーワードを選びます。
この機能の思想的背景には、NSA 39 は自分たちが関心を持つ特定のキーワードを 含んだすべての電子メイルを盗聴(盗読?)しているのではないかという 疑いがあります。 (NSAは否定していますが、彼らなら当然そういい張るだろう。) 多くの人々が怪しい単語をメッセージに付加しておけば、 NSAはこうした疑わしいメイルの盗聴で非常に忙しくなり、 おしまいにはこうした行為を止めるのではないかと考えたからです。
以下は、送信メッセージを編集し始めると 自動的に怪しいキーワードを付け加える方法です。
(add-hook 'mail-setup-hook 'spook)
これでNSAが混乱してもしなくても、 少なくとも人々を楽しませることができます。
本章では、メイルを編集/送信するためのEmacsの通常のモード、
メイル(mail)モードについて説明してきました。
本書ではふれていませんが、
MH-Eやメッセージ(message)モードを含む
別のメイル編集/送信機能もEmacsにはあります。
コマンド、C-x m
、C-x 4 m
、C-x 5 m
は、
指定されたどの方式にも対応しています。
ですから、メイルを送信するEmacsのさまざまなコマンドや機能を利用できます。
メイル作成方式を指定するには、変数mail-user-agent
を設定します。
現時点で正しい設定として認められるものは、
sendmail-user-agent
、mh-e-user-agent
、
message-user-agent
です。
異なるメイル作成方式を選択すると、本章で述べた*mail*
バッファや
メイル(mail)モードについての説明は役に立ちません。
異なったメイル作成方式では、
異なった名前のバッファで異なった形式の
まったく異なったコマンドを使うかもしれないからです。
rmailは、受け取ったメイルを読んだり処理したりするためのEmacsの
サブシステムです。
rmailは、メイルメッセージをrmailファイルと呼ばれるファイルに格納します。
rmailファイル内のメッセージを読むには、
rmailモードという特別なメジャーモードで行います。
このモードでは、メイルを取り扱うコマンドを実行するように
ほとんどのアルファベット文字を再定義しています。
コマンドrmail-mode
でrmailモードに切り替えます。
するといつものようにフックrmail-mode-hook
が実行されます。
しかし、このコマンドを直接実行しないでください。
正しい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ファイルの変更は
ファイルを保存したときにだけ反映されます。
s(rmail-save
)で保存しますが、
削除(see Rmail Deletion)と
指定されたメッセージをファイルからまず抹消します。
抹消せずにファイルを保存するには、C-x C-sを使います。
さらに、inboxから新着メイルを併合したあとにも
rmailファイルを保存します
(see Rmail Inbox)。
rmailを終了するにはq(rmail-quit
)を使います。
(メッセージを)抹消しrmailファイルを保存してから、
別のバッファに切り替えます。
しかし、正しく「終了」する必要はありません。
rmailから別のバッファへ切り替えて、
そのあと戻らなければ終了したことになります。
(rmailコマンドb、rmail-bury
がこれを行う。)
(変更したファイルにするのと同様に)
rmailファイルを確実に保存するようにしてください。
これには、C-x sがよいでしょう
(see Saving)。
rmailが表示するメッセージが画面に入りきらないとき、 残りの部分を読むにはスクロールする必要があります。 これには、C-v、M-v、M-<を使いますが、 rmailではスクロールを頻繁に行うので、もっと簡単な操作を用意してあります。
scroll-up
)。
scroll-down
)。
rmail-beginning-of-message
)。
メッセージを読むときもっとも多く行うことは
画面単位でのスクロールなので、
rmailでは、<SPC>と<DEL>は、それぞれ、
C-v(scroll-up
)とM-v(scroll-down
)の
同義になっています。
コマンド.(rmail-beginning-of-message
)は、
選択されているメッセージの先頭に移動します。
このコマンドはM-<とまったく同じというわけではありません。
まず、マークを設定しません。
さらに、カレントメッセージを変更してあるとバッファの境界を再設定します。
もっとも基本的な操作は、メッセージを読むことです。
rmailでこれを行うには、メッセージをカレントメッセージにします。
メッセージは受け取った順に並んでいるので、
通常はファイルの中を順に移動して読んでいきます。
rmailに入ると、カレントメッセージにしたことがない最初のメッセージから始まります
(つまり、未読を意味するunseen
属性が付いている最初のもの。
see Rmail Attributes)。
先へ進めば他の新しいメッセージを読めます。
まえへ戻れば古いメッセージを読み直せます。
rmail-next-undeleted-message
)。
rmail-previous-undeleted-message
)。
rmail-next-message
)。
rmail-previous-message
)。
rmail-show-message
)。
rmail-last-message
)。
rmail-first-message
)。
rmail-search
)。
nとpは、rmailでメッセージ間を移動する普通の方法です。
これらのコマンドは、メッセージ間を順々に移動していきますが、
期待どおりに削除されたメッセージは飛び越えます。
コマンドの定義名はrmail-next-undeleted-message
と
rmail-previous-undeleted-message
です。
削除されたメッセージを飛び越したくない場合、
たとえば、削除されたメッセージをアンデリート42したいときは、
(nやpの)変形である
M-nやM-p(rmail-next-message
、
rmail-previous-message
)を使います。
これらのコマンドに数引数を指定すると、反復回数とみなします。
rmailでは、数字を打つだけで数引数を指定できます。 始めにC-uを打つ必要はありません。
M-s(rmail-search
)コマンドは、rmailにおける探索を行います。
通常のインクリメンタルサーチコマンドC-sもrmailで使えますが、
これはカレントメッセージの中だけを探索します。
M-sコマンドの目的は、他のメッセージを探すことです。
正規表現(see Regexps)を読み終えてから、
つぎのメッセージの先頭から一致するものを探し始めます。
そしてみつかったメッセージを選択します。
regexpが空だとM-sは最後に使った正規表現を再使用します。
ファイル内で逆向きに他のメッセージを探索するには、 M-sに負の数引数を指定します。 rmailでは、- M-sと打てばよいのです。
ラベルをもとにメッセージを探索することもできます。 See Rmail Labels。
メッセージ番号を指定してメッセージへ移動するには、
メッセージ番号を引数としてj(rmail-show-message
)を使います。
引数がないとjは最初のメッセージを選択します。
<(rmail-first-message
)も最初のメッセージを選択します。
>(rmail-last-message
)は最後のメッセージを選択します。
メッセージを保存しておく必要がなくなったら、 そのメッセージを削除(delete)できます。 「無視せよ」という意味の削除印をメッセージに付けます。 すると、いくつかのrmailコマンドはそのメッセージが存在しないものとして扱います。 しかし、そのメッセージはまだrmailファイルの中にあって、 メッセージ番号も付いています。
rmailファイルを抹消(expunging)すると、 削除印が付いたメッセージを本当に消し去ります。 残ったメッセージには番号を順に振り直します。 抹消は、アンダイジェスト(see Rmail Digest)を除いて、 メッセージ番号を変更する唯一の動作です。
rmail-delete-forward
)。
rmail-delete-backward
)。
rmail-undelete-previous-message
)。
rmail-expunge
)。
rmailにはメッセージを削除するコマンドが2つあります。
どちらもカレントメッセージを削除し、別のメッセージを選択します。
d(rmail-delete-forward
)は
すでに削除したメッセージを飛ばしてつぎのメッセージへ移動しますが、
C-d(rmail-delete-backward
)はまえのメッセージへ移動します。
指定した方向に削除されていないメッセージがないときは、
削除したばかりのメッセージがカレントメッセージのままです。
どちらのコマンドに対しても、数引数を指定すると、
削除後の移動方向を反転します。
rmailがメッセージを削除するときはいつでも、
rmail-delete-message-hook
に登録されている関数(群)を起動します。
フック関数が起動されるときには、メッセージに削除印が付いていますが、
rmailバッファではそのメッセージはカレントメッセージのままです。
削除したすべてのメッセージをrmailファイルから本当に消すには
x(rmail-expunge
)と打ちます。
これを実行するまえならば、アンデリート(undelete)、つまり、
メッセージの削除印を消すことができます。
アンデリートコマンド、u(rmail-undelete-previous-message
)は
dコマンドの効果をほとんどの場合打ち消します。
カレントメッセージが削除されていれば、
カレントメッセージをアンデリートします。
そうでなければ、削除されたメッセージが
みつかるまでまえへ戻り、そのメッセージをアンデリートします。
普通はuでdをアンドゥできます。 なぜなら、dで削除したメッセージを まえへ戻って探してそのメッセージをuがアンデリートするからです。 しかし、dがメッセージを削除してから 後続のすでに削除されたメッセージを飛び越す場合には、 うまくいきません。 この場合、uコマンドは飛び越したメッセージのうちの 最後のものをアンデリートします。 この問題を回避する簡単な方法はありません。 ですが、uコマンドを繰り返せば、 最終的にはアンデリートしたいメッセージに辿り着きます。 あるいは、M-pコマンドで目的の削除されたメッセージに移動してから uを打ってアンデリートします。
削除されたメッセージには、deleted
という属性が付きます。
その結果、カレントメッセージが削除されていると
モード行にdeleted
と表示されます。
メッセージを削除する、あるいは、アンデリートすると、
実際には、メッセージにこの属性を付加する、あるいは、取り去るだけです。
See Rmail Attributes。
オペレーティングシステムは、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つあります。
rmailでは独自の内部形式(Babyl形式)を使っています。 当初からUNIXやGNUシステムの普通のinbox形式で十分であると気づいていて、 inbox形式を内部形式として使おうと計画しています。 しかし、たとえファイルの形式が同一であっても、 rmailファイルはinboxファイルとは独立して存在し続けるでしょう。
rmailはデフォルトでは個人の主rmailファイルを操作します。
このファイルは、~/RMAIL
という名前で、
システムのinboxファイルから到着メイルを受け取ります。
しかし、別のrmailファイルを作ってそれをrmailで編集することもできます。
これらのファイルはそれぞれ独自のinboxからメイルを受け取ったり、
あるいは、rmailコマンドでそれらのあいだでメッセージを移せます
(see Rmail Output)。
rmail-input
)。
rmail-get-new-mail
)。
主rmailファイル以外のファイルに対してrmailを実行するには、
rmailでi(rmail-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を使用します。
g(rmail-get-new-mail
)コマンドは、
指定されたinboxから現在のrmailファイルにメイルを併合します。
rmailファイルにinboxが指定されていなければ、gは何もしません。
コマンドM-x rmailも、主rmailファイルに新着メイルを併合します。
普通のinboxでないファイルからメイルを併合するには、 C-u gのようにgキーに数引数を指定します。 すると、ファイル名を読み取り、そのファイルからメイルを併合します。 gに引数を指定したときには、 inboxファイルを削除したり変更したりしません。 したがって、これは、メッセージファイルを別のメッセージファイルへ 併合する一般的な方法です。
以下のコマンドで、rmailファイルから別のファイルへメッセージをコピーできます。
rmail-output-to-rmail-file
)。
Subject
からデフォルトのファイル名を作り、
メッセージの本文だけをファイルfileに書き出す。
コマンドoとC-oは、 カレントメッセージを指定したファイルへコピーします。 そのファイルは、rmailファイルでもシステムのinbox形式でもかまいません。 出力コマンドは、ファイルの形式を確かめその形式に従って メッセージのコピーを書き込みます。
メッセージをUNIXのmailファイル形式のファイルにコピーする場合、 これらのコマンドは現在表示しているヘッダもコピーします。 表示(しコピー)するヘッダを指定したい場合には、 あらかじめtコマンドを使ってください。
コマンドoとC-oは2つの点で異ります。 それぞれ、独自のデフォルトのファイル名を持ち、 ファイルが既存でない場合に使用する形式も別です。 新たにファイルを作成するとき、 oコマンドはrmail形式を使いますが、 C-oコマンドはシステムのinbox形式を使います。 デフォルトのファイル名は、 oでは最後にoで使ったものになり、 C-oも最後にC-oで使ったものです。
出力ファイルが、現在Emacsバッファで訪れているrmailファイルのときには、 出力コマンドはメッセージをバッファにコピーします。 そのバッファをファイルに保存するのはユーザーの責任です。
ときどき、ファイルの内容をそのまま本文にしたようなメッセージを
受け取ることもあるでしょう。
w(rmail-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-output
にt
を設定します。
すると、コマンドoとC-oは、メッセージをコピーすると
もとのメッセージを削除します。
(必要ならば、もとのメッセージをアンデリートできます。)
システムのinbox形式でファイルにメッセージをコピーするときには、 rmailで今表示しているヘッダフィールドを使います。 したがって、tコマンドを使ってヘッダ全体を見えるようにしてから メッセージをコピーすると、ヘッダ全体がコピーされます。 See Rmail Display。
変数rmail-output-file-alist
を使うと、
カレントメッセージの内容に基づいて
デフォルトの出力ファイルを賢く指定できます。
値はつぎの形式の要素から成るリストである必要があります。
(regexp . name-exp)
カレントメッセージがregexpで指定されるパターンに一致すると、
デフォルトの出力ファイル名はname-expになります。
複数の要素がメッセージに一致する場合は、
最初に一致した要素がデフォルトのファイル名になります。
部分要素name-expは、ファイル名を指定する文字列か、
より一般的には、文字列としてファイル名を返すLisp式です。
変数rmail-output-file-alist
は、
oとC-oの両方に適用されます。
各メッセージには分類のためにいろいろなラベル(label)が付きます。 各ラベルには名前があって、名前が異なれば別のラベルです。 どのラベルもメッセージに付いているか付いていないかのどちらかです。 少数のラベル名には標準的な意味があり、 適切な場合にはrmailが自動的にメッセージに付けます。 これらの特別なラベルを属性(attribute)と呼びます。 それ以外のすべてのラベルはユーザーだけが付けます。
rmail-add-label
)。
rmail-kill-label
)。
rmail-next-labeled-message
)。
rmail-previous-labeled-message
)。
rmail-summary-by-labels
)。
コマンドa(rmail-add-label
)と
k(rmail-kill-label
)で、
カレントメッセージに任意のラベルを付けたり取り去ったりできます。
引数が空の場合は、もっとも最近に付けたり取り去ったりしたものと
同じラベルを意味します。
分類するためのラベルをメッセージにいったん付ければ、 そのラベルを使って2つのこと、つまり、移動とサマリ作成ができます。
コマンドC-M-n labels <RET>(rmail-next-labeled-message
)
は、ラベル群labelsのどれか1つを持つつぎのメッセージへ移動します。
引数labelsには、1つのラベル名、あるいは、
コンマで区切って複数のラベル名を指定します。
C-M-p(rmail-previous-labeled-message
)も同様ですが、
まえのメッセージへ向かって逆向きに移動します。
これらのコマンドに対する数引数は、反復回数になります。
コマンドC-M-l labels <RET>(rmail-summary-by-labels
)
は、指定したラベルの集まりの中の少なくとも1つのラベルを持つような
メッセージからなるサマリを表示します。
引数labelsは、1つのラベル名、あるいは、
コンマで区切った複数のラベル名です。
サマリについては、See Rmail Summary。
C-M-n、C-M-p、C-M-lに対する引数labelsが空の場合には、 これらのコマンドのどれかにもっとも最近に指定したラベルの集まりを意味します。
deleted
やfiled
のようなラベルのいくつかには
組み込みの意味付けがあり、
適切なときに自動的にメッセージに付けられたり取り去られたりします。
このようなラベルを属性(attribute)と呼びます。
以下はrmailの属性の一覧です。
unseen
deleted
filed
answered
rmail-reply
)コマンドが付ける。
see Rmail Reply。
forwarded
rmail-forward
)コマンドが付ける。
see Rmail Reply。
edited
resent
これら以外のすべてのラベルはユーザーだけが付けたり取り去ったりするのであって、 標準的な意味はまったくありません。
rmailには、メイルの送信にメイル(mail)モードを使うコマンドが いくつかあります。 メイル(mail)モードの使用方法については、rmailから使えるある種の機能も含めて、 See Sending Mail。 本節では、メイル(mail)モードへ入るrmailに特有のコマンドを説明します。 メイル送信のための通常のキー、 C-x m、C-x 4 m、C-x 5 mは、 rmailモードでも使え、その動作もまったく同じであることに注意してください。
rmail-mail
)。
rmail-continue
)。
rmail-reply
)。
rmail-forward
)。
rmail-resend
)。
rmail-retry-failure
)。
rmailからメッセージを送信するのは、ほとんどの場合、
読んでいるメッセージに返信するためでしょう。
それには、r(rmail-reply
)と打ちます。
すると、C-x 4 mのように
別のウィンドウに*mail*
バッファが表示されますが、
返事を出そうとするメッセージに基づいて
Subject
、To
、CC
、In-reply-to
の
ヘッダフィールドがあらかじめ埋められています。
To
フィールドにはそのメッセージの送信者が書かれ、
CC
フィールドにはそのメッセージのすべての受信者が書かれます。
変数rmail-dont-reply-to-names
を使うと、
CC
に自動的に含まれる受信者から特定の受信者を除くことができます。
この変数の値は(文字列で表した)正規表現である必要があります。
この正規表現に一致する受信者はCC
フィールドから除かれます。
デフォルトの値は、あなた自身の名前とinfo-
で始まる名前です。
(このような名前は、
大規模なメイリングリストで全員に送信するために使う習慣があるから。)
CC
フィールドを完全に省いて返信したいときには、
数引数を指定して返信コマンドを入力します。
つまり、C-u rや1 rです。
ひとたび*mail*
バッファが初期化されれば、
メイルの編集や送信は通常どおりです
(see Sending Mail)。
あらかじめ用意されたヘッダフィールドが適切でなければ、
編集してかまいません。
また、メイル(mail)モードのコマンドを使うこともでき
(see Mail Mode)、
C-c C-yコマンドでもとの返信メッセージをヤンクすることもできます。
rmailバッファに切り替えてから別のメッセージを選択し、
もとに戻って新しいカレントメッセージをヤンクしてもかまいません。
メッセージが相手先へ届かない場合があります。
メイル配送プログラムは、通常、
失敗したメッセージを失敗メッセージに同封して
発信者に送り返します。
rmailのコマンドM-m(rmail-retry-failure
)は、
同じメッセージを再送する準備をします。
前回と同じ本文とヘッダフィールドで*mail*
バッファを立ち上げます。
すぐにC-c C-cと打つと、
前回とまったく同様にメッセージを再送信します。
あるいは、本文やヘッダを編集してから送信することもできます。
変数rmail-ignored-headers
(see Rmail Display)と同じ形式の
変数rmail-retry-ignored-headers
は、
再送信するときに送信に失敗したメッセージから取り除くヘッダを制御します。
デフォルトではnil
です。
rmailからメッセージを送信する別の場面は、
他のユーザーにメッセージを転送(forward)することでしょう。
f(rmail-forward
)はこれを簡単に行えるようにします。
つまり、カレントメッセージをテキストとして*mail*
バッファを初期化し、
Subject
も転送メッセージである旨の初期化をします。
あとは、受信者を埋め込んで送信するだけです。
メッセージを転送したとき、受信者はあなた『から』メッセージを受け取りますが、
内容はもとのメッセージのままです。
転送されるメッセージは、2つの区切り行に挟まれています。
また、各行は、行頭に-
を挿入してハイフンで始まるように
修正されます。
転送メッセージを受け取って、たとえばプログラムのソースコードのように
文書以外に何か役立つようなものが含まれているときには、
このような変更をもとに戻せたら便利です。
これを行うには、転送メッセージを選択して
M-x unforward-rmail-messageと打ちます。
このコマンドは、挿入された-
を削除してもとのメッセージを取り出し、
それをrmailファイルのカレントメッセージの直後に別のメッセージとして挿入します。
再送(resending)は転送に似ている別の手段です。
異なる点は、再送はもともとの送信者『から』メッセージをもう一度送ることです。
また、あなたから送られたことを示すために
Resent-from
とResent-to
のヘッダフィールドが付加されます。
rmailでメッセージを再送するには、C-u fを使います。
(fはrmail-forward
を実行するが、
数引数を指定するとrmail-resend
を実行するようになっている。)
m(rmail-mail
)コマンドは、
返信ではない送信メッセージを編集し始めるのに使います。
ヘッダフィールドは空のままです。
このコマンドとC-x 4 mとの唯一の違いは、
ちょうどrがするように
C-c C-yでrmailバッファを参照できるようにすることです。
したがって、mコマンドでメッセージに返信したり転送したりできます。
rやfでできることは何でもできます。
c(rmail-continue
)コマンドは、
書きかけのメッセージの編集を完了したり、
送信したメッセージを変更したりするために
*mail*
バッファの編集を再開します。
変数rmail-mail-new-frame
にnil
以外の値を設定すると、
メッセージの送信を始めるすべてのrmailコマンドは編集用に新しいフレームを
作ります。
メッセージを送信したりMail
メニューの項目Don't Send
を使うと、
このフレームは削除されます。
メッセージを送信するためすべてのrmailコマンドは、 あなたが選択したメイル作成方式を使います (see Mail Methods)。
サマリ(summary)とは、
rmailファイルにあるメイルの概要を示すために
1メッセージにつき1行の情報を収めたバッファです。
各行には、メッセージ番号、送信者、ラベル、
サブジェクト(Subject
の内容)が表示されます。
ほとんどすべてのrmailコマンドはサマリバッファでも有効で、
サマリの現在行が指すメッセージに適用されます。
サマリバッファでポイントを動かすと、
ポイントがある行が指すメッセージを選択します。
1つのサマリバッファは、それに対応した1つのrmailファイルにしか適用されません。
複数のrmailファイルを編集している場合には、
それぞれに専用のサマリバッファを作れます。
サマリバッファの名前は、rmailバッファの名前に-summary
を
付け加えたものです。
通常、一度に表示されるサマリバッファは1つだけです。
現在のrmailファイルのサマリを作成するコマンドを説明します。 いったんrmailファイルに対するサマリバッファを作っておくと、 (メッセージの削除/抹消、新着メイルの取得などで) rmailファイルが変更されると自動的にサマリも更新されます。
rmail-summary
)。
rmail-summary-by-labels
)。
rmail-summary-by-recipients
)。
rmail-summary-by-topic
)。
コマンドhやC-M-h(rmail-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
は、
各メッセージのサマリ行にメッセージの行数を表示するかどうかを制御します。
rmailバッファ自体にできることは、 rmailサマリバッファでもほとんどできます。 実際、いったんサマリバッファを作っておけば、 rmailバッファに切り替える必要はありません。
サマリバッファ上でポイントを行から行へ移動するだけで、 サマリバッファからrmailバッファのさまざまなメッセージを選択し表示できます。 どんなEmacsコマンドを使ってポイントを移動してもかまいません。 コマンドを実行し終ったときにポイントがある行がどこであっても、 rmailバッファのそれに対応するメッセージが選択されます。
ほとんどすべてのrmailコマンドは、rmailバッファと同様にサマリバッファ でも機能します。 つまり、 dはサマリバッファでもカレントメッセージを削除し、 uはアンデリートし、xは抹消します。 oとC-oはカレントメッセージをファイルに書き込みます。 rは返信を開始します。 サマリバッファにいても、 <SPC>と<DEL>を使ってカレントメッセージをスクロールできます。
メッセージのあいだを移動するrmailコマンドもサマリバッファで使えますが、 事情が少々違っています。 つまり、現在サマリが作られているメッセージのあいだでしか移動できません。 また、rmailバッファが必ず画面に表示されるようにします。 (カーソル移動のコマンドはrmailバッファの内容を更新しますが、 rmailバッファがウィンドウに表示されていなければ表示されません。) 以下はこれらのコマンドの一覧です。
rmailバッファで、削除、アンデリート、新着メイルの取得、
別のメッセージの選択を実行すると、サマリバッファを必ず更新します。
変数rmail-redisplay-summary
がnil
以外ならば、
これらのコマンドを実行するとサマリバッファは画面に表示されます。
サマリを使い終ったらQ(rmail-summary-wipe
)と打って
サマリバッファのウィンドウを削除します。
サマリでrmailを終了することもできます。
q(rmail-summary-quit
)はサマリウィンドウを削除し、
rmailファイルを保存してrmailを抜け、別のバッファに切り替えます。
Subject
順にソートする。
rmailのソートコマンドは、順序を保存するソート(stable sort)を行います。
2つのメッセージのどちらを先にするか明確な基準がないときには、
その順序関係は保存されます。
これを用いれば、複数の基準でソートできます。
たとえば、rmail-sort-by-date
を使ってから
rmail-sort-by-author
を使うと、
同じ筆者のメッセージは日付順に並びます。
数引数を指定するとこれらのすべてのコマンドは逆順序に並べます。 つまり、新しいものから古いものへ、大きなものから小さなものへ、 アルファベットの逆順にメッセージをソートします。
初めてメッセージを表示するとき、rmailはメッセージのヘッダを 整形し直してから表示します。 むだな表示を削るために重要でないヘッダフィールドを隠します。 tコマンドを使うと、ヘッダ全体を表示したり再度整形することができます。
rmail-toggle-header
)。
ヘッダの整形では、各ヘッダフィールドの重要性に基づいて
ほとんどのヘッダフィールドを削除することになります。
変数rmail-ignored-headers
には、このようにして隠すヘッダフィールドを
指定する正規表現を記述します。
ヘッダフィールドの先頭部分がこの正規表現に一致すると
そのフィールド全体を隠します。
rmailは整形を行うまえにもとのヘッダ全体を保存します。
これを見るにはt(rmail-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-headers
にnil
を設定してください。
rmailモードでも通常のEmacsコマンドのほとんどを使えますが、 C-M-nやC-M-hのように他の目的のためにrmailで再定義された ものもいくつかあります。 しかし、rmail バッファは通常読み出し専用であり、 アルファベット文字のほとんどもrmailコマンドとして再定義されています。 メッセージのテキストを編集したいときには、 rmailコマンドeを使う必要があります。
e(rmail-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
が付けられます。
さらに、メッセージのヘッダ全体が表示されるので、
メッセージの本文と同様にヘッダも編集できます。
ヘッダに対する変更も保存されます。
ダイジェストメッセージ(digest message)は、 数個のメッセージをまとめて運ぶためのメッセージです。 ダイジェストは管理人のいるメイリングリスト上で使われます。 1日単位などの一定期間内にリスト宛に受け取ったすべてのメッセージを 1つのダイジェストにまとめて加入者に送ります。 合計のサイズが同じであったとしても、ダイジェストにして送るほうが 個々にメッセージを送るよりコンピュータの使用時間がずっと少なくてすみます。 というのは、メイル送信に必要なメッセージあたりのネットワーク上の オーバーヘッドがとても大きいからです。
ダイジェストメッセージを受け取ったならば、 もっとも簡単な読み方は、それをアンダイジェスト(undigestify)して 個々のメッセージに戻すことです。 そうすれば好きなように、個々のメッセージを読んだり削除したりできます。
アンダイジェストするには、ダイジェストメッセージを選び、 コマンドM-x undigestify-rmail-messageを打ちます。 これは、(ダイジェストメッセージ内の)サブメッセージを別々の rmailメッセージとして取り出し、ダイジェストのあとに それらのメッセージを挿入します。 ダイジェストメッセージ自体は削除されます。
コマンド M-x unrmailは、rmail形式のファイルを (システムのメイルボックス形式としても知られる)inbox形式に変換します。 こうすると、そのファイルを別のメイル編集ツールでも使えるようになります。 2つの引数、rmailファイル名と変換後のファイル名を指定する必要があります。 M-x unrmailはrmailファイル自体には変更を加えません。
特定の読者に不快を与える可能性があるメイリングリストのメッセージは、 rot13と呼ばれる単純な方法で暗号化してある場合があります。 この名前は、アルファベットを13文字分巡回させることに由来します。 これは機密保持のためではなく、そのような機能もありません。 不快に感じるかもしれない読者が メッセージの本当の本文を見ないようにするために使います。
rot13暗号を使っているバッファを見るには、 コマンドM-x rot13-other-windowを使います。 テキストを表示するときに暗号を解いて 別のウィンドウにカレントバッファを表示します。
movemail
とPOP新着メイルを取得するとき、rmailはまずinboxファイルからrmailファイルに
新着メイルをコピーします。
それから、rmailファイルを保存します。
そして、inboxファイルの内容を消します。
こうすると、システムがクラッシュするとinboxとrmailファイルに
メイルを重複して持つことになりますが、
メイルを紛失することはありえません。
変数rmail-preserve-inbox
がnil
以外ならば、
rmailは、inboxファイルからrmailファイルに新着メイルをコピーしてから
inboxファイルの内容を消しません。
たとえば、旅行中は携帯コンピュータでPOPを介してメイルを調べ、
メイルをサーバーに残しておいてあとでワークステーションに保存するように
するには、このような設定をします。
場合によっては、rmailは間接的にinboxファイルから新着メイルをコピーします。
まず、movemail
プログラムを実行して、
inboxから~/.newmail-inboxname
という中間ファイルに
メイルを移動します。
それから、rmailは中間ファイルから新着メイルを併合して
rmailファイルを保存してから中間ファイルを削除します。
これを実行中の都合が悪いときにクラッシュすると中間ファイルが残ってしまい、
rmailがつぎにinboxから新着メイルを
取得するときにまたそのファイルを使ってしまいます。
rmailが~/.newmail-inboxname
のデータを独自形式(Babyl形式)
に変換できないと、同じデータでトラブルが再発しないように
ファイル名を~/RMAILOSE.n
(nは名前が一意になるような整数)に変えます。
このファイルを調べて、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-password
がnil
以外のときは、
これはPOPに対してを使うパスワードを指定します。
あるいは、変数rmail-pop-password-required
がnil
以外ならば、
rmailはユーザーにパスワードを尋ねます。
movemail
にコマンド行オプションを追加する必要があるときには、
変数rmail-movemail-flags
に指定したいオプションのリストを設定します。
inboxの内容を保存するオプション-p
を指定するために
この変数を使わないでください。
かわりにrmail-preserve-inbox
を使ってください。
読者のサイトでインストールしたmovemail
プログラムは、
Kerberos認証を使うかもしれません。
その場合、
rmail-pop-password
とrmail-pop-password-required
が設定されて
いなければ、POPでメイルを取得するときにデフォルトで
Kerberos認証を使います。
POPサーバーによってはメッセージを逆順序に保存します。
そのようなサーバーで受信順にメイルを読むには、
rmail-movemail-flags
にフラグ-r
を追加して、
ダウンロードしたメッセージを逆順にするように
movemail
に指示します。
diredはディレクトリ一覧をバッファに作成します。 場合によっては、サブディレクトリの一覧も含まれます。 普通のEmacsコマンドでこのバッファの中を動き廻ったり、 特別なdiredコマンドで一覧中にあるファイルを操作できます。
diredを起動するには、C-x dかM-x diredを使います。
このコマンドは、一覧表示するファイルを指定するための
ディレクトリ名やファイルのワイルドカードパターンをミニバッファで読み取ります。
dired
がlist-directory
と違うのは、
バッファがdiredモードになっていて
特別なdiredコマンドを使えるようになることです。
変数dired-listing-switches
には、
ディレクトリ一覧を作成するls
プログラムに与えるオプションを指定します。
オプション中には-l
が必ず含まれている必要があります。
dired
コマンドに数引数を指定すると、
ミニバッファでディレクトリを指定するまえに
ls
のオプションを指定できます。
diredバッファを現在選択しているウィンドウではなく
別のウィンドウに表示したい場合には、
C-x dのかわりにC-x 4 d(dired-other-window
)を使います。
C-x 5 d(dired-other-frame
)は
別のフレームにdiredバッファを表示します。
diredバッファは『読み出し専用』であり、 このバッファに文字を挿入しても意味がないので、 dやxのような通常の印字文字は特別なdiredコマンドに使われます。 diredコマンドのいくつかは、diredバッファの カレントファイル(current file、つまり、現在行のファイル)に 印(mark)やフラグ(flag)を付けます。 他のコマンドは、印やフラグが付いたファイル群に作用します。
Emacsの普通のカーソル移動コマンドはdiredバッファでも使えます。 特殊用途のカーソル移動コマンドもあります。 C-nとC-pは、カーソルを行の先頭ではなく ファイル名の先頭に位置合わせするように再定義されています。
さらに便利なように、 diredモードでは<SPC>とnはC-nに等価です。 pはC-pに等価です。 (diredでは行単位の移動をよく行うため、打鍵しやすくしてある。) <DEL>(上に移動してフラグを消す)は、単に上へ移動する場合には便利です。
diredの主な利用法は、ファイルに削除のフラグを付けてから、 フラグの付いているファイルを(本当に)削除することです。
ファイルに削除フラグを付けるには、
そのファイルを表示している行に移動してdと打ちます。
削除フラグは、行頭に表示されるD
という文字でわかります。
このコマンドはポイントをつぎの行に進めますから、
dコマンドを繰り返し実行すれば後続のファイルにもフラグを
付けることができます。
数引数は反復回数になります。
即座にファイルを削除するかわりに削除フラグを付けるので、
誤ってファイルを消してしまう危険性は低くなります。
フラグを付けたファイルを抹消するようにdiredに指示するまでは、
uや<DEL>を使って削除フラグを消せます。
u(dired-unmark
)は、dと同じように動作しますが、
フラグを付けるのではなくフラグを消します。
DEL(dired-unmark-backward
)は上に移動してフラグを消します。
これは、数引数-1を指定したuと同じです。
削除フラグが付いたファイルを(本当に)削除するには、
x(dired-expunge
)と打ちます。
このコマンドは、削除フラグが付いたファイルの一覧を表示し、
yesでの確認応答を求めます。
確認するとdiredはフラグが付いたファイルを削除し、
diredバッファからそれらに対応する行を削除します。
小さくなったdiredバッファは選択されたままです。
確認にnoと答えたり、C-gで中断すると、 ただちにdiredに戻りますが、削除フラグは付いたままで、 ファイルを実際に削除しません。
#
で始まり#
で終る)
すべての自動保存ファイルに削除フラグを付ける。
(see Auto Save)。
~
で終る)すべてのバックアップファイルに削除フラグを付ける。
(see Backup)。
#、~、&、.のコマンドは、 ファイル名に基づいて数多くのファイルに削除フラグを付けます。 これらのコマンドは本当に便利です。 というのは、ファイルを実際には削除しないからです。 残しておきたいファイルの削除フラグは消せばいいのです。
&(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)。
diredには、diredバッファに表示したファイルを訪問したり調べたりするための コマンドがあります。 これらは現在行のファイルに作用します。 そのファイルが実際にはディレクトリであると、 これらのコマンドはそのサブディレクトリに対して (別のdiredバッファを作って)diredを起動します。
dired-find-file
)
see Visiting。
dired-find-file-other-window
)。
diredバッファは最初のウィンドウに表示されたまま残る。
これはC-x 4 C-fでファイルを訪問するのに似ている。
see Windows。
dired-display-file
)。
dired-mouse-find-file-other-window
)。
oコマンドのように、
ファイルの表示には別のウィンドウを使う。
dired-view-file
)。
ファイルを閲覧することはファイルを訪問することに似ているが、 ファイルの中で移動できることに重きを置き、 ファイルの変更は許されない。 see View File。
ファイルにD
で示される削除フラグを付けるかわりに
他の文字(通常*
)で示される印を付けることもできます。
『抹消』(x)以外のほとんどのdiredコマンドは、
*
で印付けしたファイルを扱えます。
以下のコマンドは、*
で印付けするコマンド、
印を消すコマンド、印に作用するコマンドです。
(フラグを付けたり消したりするコマンドについてはsee Dired Deletion。)
*
で印を付ける(dired-makr
)。
数引数nを指定すると、カレントファイルから始めて後続の
n個のファイルに印を付ける。
(nが負の場合は、上の-n個のファイルに印を付ける。)
*
で印を付ける
(dired-mark-executables
)。
数引数を指定すると、これらのファイルすべての印を消す。
*
で印を付ける
(dired-mark-symlinks
)。
数引数を指定すると、これらのファイルすべての印を消す。
.
と..
を除くすべてのディレクトリに*
で印を付ける
(dired-mark-directories
)。
数引数を指定すると、これらのディレクトリすべての印を消す。
.
と..
を除くすべてのファイルに
印を付ける(dired-mark-subdir-files
)。
dired-unmark
)。
dired-unmark-backward
)。
dired-unmark-all-files-no-query
)。
dired-unmark-all-files
)。
引数は1文字。
<RET>で入力を終えてはならない。
数引数を指定すると、このコマンドは印の付いたファイルごとに
印を消すかどうか聞いてくる。
yは消すの意味、nは消さないの意味。
!で答えると残りのファイルすべてについて問い合わせずに印を消す。
dired-next-marked-file
)。
ファイルに『印』が付いているとは、なんらかの印があること。
dired-prev-marked-file
)
dired-do-toggle
)。
つまり、*
で印が付いているファイルの印を消し、
印が付いていなかったファイルすべてに*
で印を付ける。
*
以外で印が付いたファイル群は影響されない。
dired-change-marks
)。
このコマンドは、*
やD
以外の文字で印を付けるための主要な手段。
引数はそれぞれ1文字。
<RET>で入力を終えてはならない。
このコマンドではほとんどどんな文字でも印として使えるため、
ファイルをいろいろに分類できる。
oldが空白(
)であると、
コマンドは印が付いていないすべてのファイルに作用する。
newが空白であると、コマンドは作用するファイルの印を消す。
下の例はこのコマンドの能力を例示するものであり、
印のないファイルすべてにD
フラグを付け、
D
フラグが付いているものすべてからはフラグを消します。
* c D t * c SPC D * c t SPC
ここでは、t
で印を付けたファイルはないものと仮定します。
*
で)印を付ける(dired-mark-files-regexp
)。
このコマンドは% dに似ているが、
削除フラグD
のかわりに*
でファイルに印を付ける。
see Flagging Many Files。
ファイル名のうちディレクトリに無関係な部分だけで一致を検査する。
^
(先頭)や$
(末尾)で、一致箇所を固定できる。
サブディレクトリを一致検査から除外するには、
サブディレクトリを隠蔽する。
*
で)印を付ける(dired-mark-files-containing-regexp
)。
このコマンドは% mに似ているが、
ファイル名ではなくその内容で探す。
dired-undo
)
本節では、ファイルを操作する基本的なdiredコマンドについて説明します。 コマンドはすべて大文字であり、実行前に、引数を読み取ったり確認を求めるために ミニバッファを使います。 これらすべてのコマンドには、 操作対象となるファイルを指定する方法がいくつかあります。
*
で印が付いていれば、
コマンドは印が付いているすべてのファイルを操作する。
以下は、上のように操作対象を選ぶファイル操作コマンドの一覧です。 (!や%などの他のdiredコマンドも、 操作対象とするファイルを決定するのに上の方法を用いる。)
dired-do-copy
)。
引数newはコピー先のディレクトリか、
(1つのファイルをコピーする場合は)新しい名前。
変数dired-copy-preserve-time
がnil
以外の場合には、
このコマンドでコピーしたファイルの更新時間はもとのファイルと同じになる。
dired-do-delete
)。
本節の他のコマンドと同様に、このコマンドは印付けされたファイル、
あるいは、後続のn個のファイルに作用する。
対照的に、x(dired-expunge
)は、
フラグが付いたファイルを削除する。
dired-do-rename
)。
引数newは移動先のディレクトリか、
(1つのファイルの名前を変える場合には)新しい名前。
diredは、名前を変更したファイルに対応するバッファの訪問先の
ファイル名を自動的に変更するので、新しい名前が反映される。
dired-do-hardlink
)。
引数newはリンクを置くディレクトリか、
(1つのリンクを張る場合には)リンクに与える名前。
dired-do-symlink
)。
引数newはリンクを置くディレクトリか、
(1つのリンクを張る場合には)リンクに与える名前。
dired-do-chmod
)。
このコマンドはchmod
プログラムを使うので、
modspecにはchmod
が扱える任意の引数を指定できる。
dired-do-chgrp
)。
dired-do-chown
)。
(ほとんどのシステムでは、スーパーユーザーだけがこれを実行できる。)
変数dired-chown-program
で、
実際の操作を行うために使用するプログラムの名前を指定する。
(システムによっては、chown
を置く場所が異なる。)
dired-do-print
)。
ファイルを印刷するコマンドを指定する必要があるが、
(lpr-buffer
が使うのと同じ)
変数lpr-command
とlpr-switches
とから推定した
適切なものがミニバッファに示される。
dired-do-compress
)。
ファイルがすでに圧縮済みと思われるときは展開する。
dired-do-load
)。
see Lisp Libraries。
dired-do-byte-compile
)。
see Byte Compilation。
dired-do-search
)。
このコマンドはtags-search
の変形。
最初にみつかったところで探索は終る。
探索を再開してつぎに一致するものを探すには、M-,を使う。
see Tags Search。
query-replace-regexp
(問い合わせながら正規表現を置換する)を実行し、
from(正規表現)に一致する部分をtoに置換する
(dired-do-query-replace
)。
このコマンドはtags-search
の変形。
置換のループを抜けたあとに、
探索を再開してさらに置換を行うには、M-,を使う。
see Tags Search。
+は特別なファイル操作コマンドです(dired-create-directory
)。
このコマンドは、ディレクトリ名を読み取り、
それが既存でなければ新たに作成します。
diredコマンドの!(dired-do-shell-command
)は、
ミニバッファからシェルコマンドを読み取り、
指定したファイルすべてについてそのシェルコマンドを実行します。
diredコマンドの普通の方法で操作対象のファイルを指定できます
(see Operating on Files)。
複数ファイルにシェルコマンドを適用する方法は2通りあります。
*
を使うと、
指定したファイル名のリストで*
を置き換えてコマンドを一度だけ実行する。
リスト内でファイルが現れる順番はdiredバッファに表示されている順。
したがって、! tar cf foo.tar * <RET>はtar
を実行し、
指定した一連のファイルをfoo.tar
というtarファイルにまとめる。
*
が含まれていない場合には、
コマンド文字列の最後にそれぞれのファイル名を付け加えて
各ファイルごとにコマンドを1回ずつ実行する。
たとえば、! uudecode <RET>は、
各ファイルに対してuudecode
コマンドを実行する。
各ファイルごとにコマンドを1回実行したいが、
コマンドの最後ではなく途中にファイル名を指定したい場合にはどうするのでしょう?
あるいは、もっと複雑にファイル名を指定したい場合にはどうするのでしょう?
それにはシェルのループを使います。
下の例では、指定した各ファイルに対してuuencode
を実行しますが、
その出力は対応する.uu
というファイルに格納します。
for file in *; do uuencode $file $file >$file.uu; done
シェルコマンドの作業ディレクトリは、 diredバッファのトップディレクトリです。
!コマンドは、実行後に新たにできたファイルや変更された ファイルを表示するためにdiredバッファを更新することはしません。 これはシェルコマンドを実際には理解しておらず、 シェルコマンドがどのファイルを変更するのかわからないからです。 diredバッファを更新するにはgコマンドを使います (see Dired Updating)。
ここにあげるコマンドはファイル名を組織的に変更します。
dired-upcase
)。
古いファイル名がFoo
とbar
だった場合、
新しいファイル名はFOO
とBAR
になる。
dired-downcase
)。
古いファイル名がFoo
とbar
だった場合、
新しいファイル名はfoo
とbar
になる。
正規表現の置換を用いる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>でまず一連のファイルに 印を付けてから、それらを操作するコマンドにも同じ正規表現を使います。 これを簡単に行えるように、 %の付いたコマンドは、%付きコマンドいずれかに最近指定した 正規表現をデフォルトで使います。
diredには、指定したファイルをdiff
で比較するコマンドが2つあります。
diff
プログラム(dired-diff
)を用いて、
(ポイントがある箇所の)カレントファイルを
(マークがある箇所の)他のファイルと比較する。
マークがある箇所のファイルがdiff
の第1引数で、
ポイントがある箇所のファイルが第2引数になる。
dired-backup-diff
)。
カレントファイルがバックアップファイルそのものであるときは、
バックアップファイルのバックアップファイルとの比較を行う。
このようにして、任意の版のバックアップファイルとの比較を行える。
バックアップファイルはdiff
の第1引数になる。
通常、diredバッファは1つのディレクトリだけを表示します。 しかし、そのサブディレクトリ群を一緒に表示させることもできます。
1つのdiredバッファ内に複数のディレクトリを表示させるもっとも簡単な方法は、
ls
を実行するときにオプション-lR
を指定することです。
(diredを実行するときに数引数を指定すると、
これらのオプションをミニバッファで指定できる。)
これにより、すべてのレベルのすべてのサブディレクトリを表示した
再帰的なディレクトリ一覧を作れます。
しかし、一般には、すべてのサブディレクトリでは多すぎます。 普通は、特定のサブディレクトリだけを含めたいでしょう。 それには、iコマンドを使います。
ディレクトリであるファイルを表す行で、
i(dired-maybe-insert-subdir
)コマンドを使います。
指定したサブディレクトリの内容を同じdiredバッファに挿入し、
その箇所へ移動します。
挿入されたサブディレクトリの内容は、
ls -lR
の出力と同様に、
diredバッファのトップレベルのディレクトリのあとに続きます。
すでにサブディレクトリの内容がバッファにある場合には、 iコマンドはその表示箇所に移動するだけです。
どちらの場合においても、iは移動するまえにEmacsのマークを設定するので、 C-u C-<SPC>でバッファ内のもとの箇所 (そのサブディレクトリを表す行)へ戻れます。
サブディレクトリの内容を更新するには、
l(dired-do-redisplay
)コマンドを使います。
サブディレクトリを削除するにはkを使います。
See Dired Updating。
diredバッファにサブディレクトリが表示されている場合、 コマンドC-x [とC-x ]でディレクトリ単位に移動できます。
以下のコマンドは、1つのdiredバッファ内で ディレクトリ木構造を上下に移動するコマンドです。 これらはすべてディレクトリのヘッダ行 (directory header lines)、 つまり、ディレクトリの内容を表示する部分の先頭にある ディレクトリ名を示す行に移動します。
dired-next-subdir
)。
dired-prev-subdir
)。
dired-tree-up
)。
dired-tree-down
)。
dired-prev-dirline
)。
これらの行は、親ディレクトリにおいてファイルとしてディレクトリを表す行。
dired-next-dirline
)。
サブディレクトリの隠蔽(hide)とは、 選択的表示(see Selective Display)を用いて ヘッダ行以外を見えなくすることです。
dired-hide-subdir
)。
数引数は反復回数。
dired-hide-all
)。
あるいは、隠蔽されているサブディレクトリがある場合には、
すべてのサブディレクトリを再表示する。
このコマンドを使うと、
深いディレクトリ木構造の概形を調べたり、
遠く離れたサブディレクトリへ素早く移動できる。
通常のdiredコマンドは、 隠蔽されたサブディレクトリ内のファイルについてまったく考慮しません。 たとえば、印を付けたファイルに作用するコマンドは、 隠蔽されたディレクトリ内に印を付けたファイルが あったとしてもそれらを無視します。 したがって、サブディレクトリを一時的に隠蔽すれば、 印を消さなくてもサブディレクトリを操作対象から外せます。
サブディレクトリを隠蔽するコマンドはトグルとして働きます。 つまり、表示されていれば隠蔽し、隠蔽されていれば表示します。
本節では、(diredとは無関係に)外部でのディレクトリやファイルの変更を diredバッファに反映させるコマンド、および、 diredバッファの一部を削除するコマンドを説明します。
revert-buffer
)。
dired-do-redisplay
)。
dired-do-kill-lines
)。
dired-sort-toggle-or-edit
)。
dired-listing-switches
として用いて
diredバッファを更新する。
g(revert-buffer
)コマンドを実行すると、
表示されているファイルやディレクトリの変更に基づいてdiredバッファを
更新します。
このコマンドは消されたファイルに対するものを除いて
すべての印やフラグを保存します。
隠蔽されたサブディレクトリも更新されますが、隠蔽されたままです。
いくつかのファイルだけを更新する場合には、
l(dired-do-redisplay
)と打ちます。
このコマンドは、後続のn個のファイル、
印を付けたファイルがあればそれらのファイル、
カレントファイルのいずれかに作用します。
それらを更新するとは、それらのファイルの現状をファイルシステムから取得し、
それを正しく反映するようにバッファを更新します。
lをサブディレクトリのヘッダ行で実行すると、 対応するサブディレクトリの内容を更新します。
指定したファイルの表示行を削除する、
つまり、ファイルそのものではなく行だけを削除するには
k(dired-do-kill-lines
)と打ちます。
数引数nを指定すると、
このコマンドは、後続のn個のファイルに作用します。
さもなければ、印を付けたファイルに作用します。
削除するファイルの表示行がディレクトリだった場合には、 そのディレクトリの内容もバッファから削除されます。 サブディレクトリのヘッダ行でC-u kと打っても、 diredバッファからサブディレクトリの内容を削除できます。
gコマンドは、このようにして削除した表示行を画面に呼び戻すことが できますが、サブディレクトリに関してはできません。 各サブディレクトリを再度挿入するにはiを使う必要があります。
diredバッファ内のファイルは、通常、
ファイル名のアルファベット順に並んでいます。
diredは日付/時間順に並べ替えることもできます。
diredコマンドs(dired-sort-toggle-or-edit
)は、
これら2つのソート方法を切り替えます。
diredバッファのモード行には、アルファベット順と日付/時間順の
どちらで現在表示しているかが示されます。
C-u s switches <RET>で、
変数dired-listing-switches
に新しい値を設定できます。
find
プログラムfind
プログラムを使ってファイルを選べば、
diredバッファ上に表示する一連のファイルをもっと柔軟に選択できます。
ワイルドカードに一致する名前のファイルを探索するには M-x find-name-diredを使います。 このコマンドは、2つの引数directoryとpatternを読み取り、 directoryにあるすべてのファイル、 あるいは、そのサブディレクトリ下にあるpatternに一致する名前のファイルを 選択します。
このようにして選択されたファイルはdiredバッファに表示され、 このバッファではもとのdiredコマンドを使えます。
ファイル名ではなくファイルの内容で調べたい場合には、
M-x find-grep-diredを使います。
このコマンドはミニバッファから2つの引数directoryとregexpを
読み取ります。
directoryにあるすべてのファイル、
あるいは、regexpに一致するものを含む一連のサブディレクトリを選択します。
このコマンドは、プログラムfind
とgrep
を実行して動作します。
CompilationのM-x grep-findも参照してください。
Emacsの正規表現ではなくgrep
の正規表現を書くことを忘れないでください。
このような一連のコマンドの中でもっとも一般的なコマンドはM-x find-diredで、
find
が検査に用いる任意の条件を指定できます。
このコマンドはミニバッファから2つの引数directoryとfind-argsを
読み取ります。
検査すべき条件を指示するfind-argsを渡して、
directoryにおいてfind
を実行します。
このコマンドを使うには、find
の使い方を知っている必要があります。
これらのコマンドが出力する表示形式は変数find-ls-option
で
制御されます。
デフォルトは、ls
に使うオプションとして-ld
を指定します。
出力形式が壊れて見える場合には、
この変数の値を変更する必要があるかもしれません。
Emacsには、過去や将来の予定を記録する日誌の機能を持つ カレンダー機能があります。 カレンダーに入るにはM-x calendarと打ちます。 すると、今月を中央月として3か月分のカレンダーが表示され、 ポイントは今日の日付に置かれます。 C-u M-x calendarのように数引数を指定すると、 3か月分のカレンダーの中央に表示する月と年を聞いてきます。 カレンダーは専用のバッファを使い、 そのメジャーモードはカレンダー(calendar)モードです。
カレンダー内でMouse-2をクリックすると、 その日付で使用できる機能のメニューが表示されます。 C-Mouse-3をクリックすると、 特定の日付に関わらずに使える機能のメニューが表示されます。 カレンダーから抜けるにはqと打ちます。 カレンダーと日誌のカスタマイズに関しては、 See Calendar。
カレンダー(calendar)モードでは、 日、週、月、年といった論理的単位で移動します。 始めに表示された3か月の外に移動すると、 カレンダーは自動的に『スクロール』して 指定された日付の箇所が表示されるようにします。 ある日付へ移動すると、祝祭日の名称や日誌記録を見たり、 その日付を別の暦に変換したりできます。 カレンダーを単にスクロールすれば、大きな時間単位での移動に便利です。
カレンダー内を移動するコマンドはテキスト内を移動するコマンドに対比できます。 日、週、月、年を単位として前後に移動できます。
calendar-forward-day
)。
calendar-backward-day
)。
calendar-forward-week
)。
calendar-backward-week
)。
calendar-forward-month
)。
calendar-backward-month
)。
calendar-forward-year
)。
calendar-backward-year
)。
日や週を単位とした移動は、Emacsの通常の文字単位や行単位の移動の類推です。 C-nは通常はつぎの行の同じ桁に移動しますが、 カレンダー(calendar)モードでは つぎの週の同じ曜日に移動します。 また、C-pはまえの週の同じ曜日に移動します。
矢印キーは他のモードと同様に、それぞれ、 C-f、C-b、C-n、C-pに等価です。
月単位や年単位の移動コマンドは週単位の移動と同じように働きますが、 より大きな単位での移動です。 月単位の移動コマンドM-}とM-{は、それぞれ、 翌月、前月に移動します。 年単位の移動コマンドC-x ]とC-x [は、 それぞれ、1年後、1年前に移動します。
これらのコマンドを簡単に覚えるには、それぞれ、 月と年を段落とページに対比させることです。 しかし、コマンド自体は同じではありません。 Emacsの通常の段落移動コマンドは段落の先頭か末尾に移動しますが、 月単位や年単位の移動コマンドは1か月分や1年分で移動しますから、 月や年の区切りを普通は飛び越します。
これらのコマンドはすべて数引数を反復回数として扱います。 簡単のために、カレンダー(calendar)モードでは Meta修飾なしでも数字とマイナス記号で数引数を指定できます。 たとえば、100 C-fは100日後の日付にポイントを進めます。
週(または、月、年)というのは、単に1日1日が集まったものではありません。 週(月、年)は特定の日で始まると考えます。 そこで、カレンダー(calendar)モードには、 週、月、年の始めや終りに移動するコマンドがあります。
calendar-beginning-of-week
)。
calendar-end-of-week
)。
calendar-beginning-of-month
)。
calendar-end-of-month
)。
calendar-beginning-of-year
)。
calendar-end-of-year
)。
これらのコマンドは数引数を反復回数と扱い、 何週、何か月、何年だけ前後に移動するのかを指定します。
デフォルトでは、週は日曜から始まります。
月曜から始めるには、変数calendar-week-start-day
に1を設定します。
44
カレンダー(calendar)モードには、 さまざまな方法で指定した特定の日付へ移動するコマンドがあります。
calendar-goto-date
)。
calendar-other-month
)。
calendar-goto-today
)。
g d(calendar-goto-date
)は、
年、月、日を読み取ってその日付に移動します。
カレンダーには西暦紀元がすべて含まれているため、
西暦年を略さずに打つ必要があります。
つまり、90
ではなく1990
です。
o(calendar-other-month
)は、
月と年を読み取って、その月を中央月として3か月分のカレンダーを表示します。
.(calendar-goto-today
)で、今日の日付に戻ることができます。
見えている範囲を越えて移動するとカレンダーは自動的にスクロールします。 手動でスクロールすることもできます。 カレンダーを表示しているウィンドウでは、 長い長い紙に月を印刷したものの一部が見えているのだと考えてください。 カレンダーをスクロールするとは、 新しい月が見えるようにこの紙を動かすことに相当します。
scroll-calendar-left
)。
scroll-calendar-right
)。
scroll-calendar-left-three-months
)。
scroll-calendar-right-three-months
)。
カレンダーをスクロールするもっとも基本的なコマンドは、 一度に1か月分スクロールします。 つまり、コマンドの実行前後の表示を比べると、2か月分重複しています。 C-x <はカレンダーを1か月分左にスクロールします。 つまり、時間的に1か月後を表示します。 C-x >コマンドはカレンダーを右にスクロールし、 時間的に1か月前に戻します。
コマンドC-vとM-vは、 カレンダーを『1画面分』、つまり、3か月分スクロールします。 これは、通常のモードでのこれらのコマンドと意味的に同じになっています。 C-vは将来の日付を見えるようにし、 M-vは過去の日付を見えるようにします。 これらのコマンドは数引数を反復回数として扱います。 たとえば、C-uは後続のコマンドを4回反復するので、 C-u C-vと打てば1年分先へカレンダーをスクロールし、 C-u M-vと打てば1年分前へカレンダーをスクロールします。
ファンクションキー<NEXT>と<PRIOR>は、 他のモードと同様に、それぞれ、C-vとM-vに等価です。
calendar-count-days-region
)。
リージョン内の日数を調べるには、
M-=(calendar-count-days-region
)と打ちます。
このコマンドで表示される日数は、
マークとポイントで指定した両日を含んだ日数です。
calendar-print-day-of-year
)。
redraw-calendar
)。
scroll-other-window
)。
exit-calendar
)。
年始から数えた日数、あるいは、1年の残り日数を表示するには、
p d(calendar-print-day-of-year
)コマンドを打ちます。
すると、上の2つの日数をエコー領域に表示します。
年始からの日数には指定した日が含まれます。
また、残りの日数には指定した日は含まれません。
カレンダーのウィンドウのテキストが壊れた場合には、
C-c C-l(redraw-calendar
)と打って再表示させます。
(カレンダー(calendar)モード以外の編集用コマンドを使った場合に限り、
表示がおかしくなる。)
カレンダー(calendar)モードでは、
<SPC>(scroll-other-window
)を使って
別のウィンドウをスクロールできます。
このコマンドは、
別のウィンドウに祝祭日や日誌記録の一覧を表示しているときに便利です。
カレンダーから抜けるには、
q(exit-calendar
)と打ちます。
このコマンドはカレンダーに関係したすべてのバッファを閉じ、
別のバッファを選択します。
(カレンダー関連のウィンドウ専用のフレームであった場合には、
カレンダーを終了するとそのフレームをアイコン化する。)
カレンダーLaTeXコマンドは、 カレンダーを印刷するLaTeXコードのバッファに作成します。 使用するコマンドに依存して、ポイント位置の日、週、月、年の いずれかを含んだカレンダーを印刷できます。
cal-tex-cursor-month
)。
cal-tex-cursor-month-landscape
)。
cal-tex-cursor-day
)。
cal-tex-cursor-week
)。
cal-tex-cursor-week2
)。
cal-tex-cursor-week-iso
)。
cal-tex-cursor-week-monday
)。
cal-tex-cursor-filofax-2week
)。
cal-tex-cursor-filofax-week
)。
cal-tex-cursor-year
)。
cal-tex-cursor-year-landscape
)。
cal-tex-cursor-filofax-year
)。
これらのコマンドのいくつかは、横づかい(つまり、『ランドスケープ』)の カレンダーを印刷し、横長になります。 いくつかのコマンドでは、ファイロファックス(システム手帳) サイズ(3.75インチ×6.75インチ、約95.25mm×171.45mm)を使います。 これらのコマンドはすべて、印刷する日数、週数、月数、年数を 数引数で指定できます(つねに選択した日から始まる)。
変数cal-tex-holidays
がnil
以外(デフォルト)ならば、
印刷されるカレンダーにはcalendar-holidays
の祝祭日が表示されます。
変数cal-tex-diary
がnil
以外
(デフォルトはnil
)ならば、
日誌記録も一緒に印刷されます(週間および月間カレンダーの場合だけ)。
Emacsのカレンダーはすべての祝祭日を把握しており、 それらをカレンダーに表示できます。
calendar-cursor-holidays
)。
mark-calendar-holidays
)。
calendar-unmark
)。
list-calendar-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は現在の定義に基づいて決定しますので、 昔の年代については誤りである場合もあります。
カレンダーの特別なコマンドで、 任意の日付の日出入時刻を2分以内の精度で調べられます。
calendar-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-latitude
とcalendar-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-name
と
calendar-daylight-time-zone-name
は、
現在いる場所のタイムゾーンの省略名称です。
Emacsは夏時間を補正して日出入時刻を表示します。
夏時間をどのように決定するかは、
See Daylight Savings。
ユーザーとしては、個人の.emacs
ファイルで
カレンダーの位置関連の変数に普段いる場所の値を設定すると便利でしょう。
あるいは、Emacsをマシンにインストールするときに、
そのマシンの大部分のユーザー用に典型的な場所に関する
情報をdefault.el
ファイルに設定してもかまいません。
See Init File。
以下のコマンドは、朔弦望(新月、上弦、満月、下弦)の日付と時刻を表示します。 これらの機能は、『朔弦望に依存する』問題をデバッグするときに重宝します。
calendar-phases-of-moon
)。
カレンダー内でMコマンドを使うと、 現在の3か月間の朔弦望の日付/時刻を別のバッファに表示します。 一覧内の日付/時刻は数分以内の精度です。
カレンダーの外からでも、 M-x phases-of-moonコマンドを使って、 今月を中央月として前後1か月の朔弦望の日付/時刻を 表示できます。 別の期間に関して調べるにはC-u M-x phases-of-moonを使います。 すると、月と年を聞いてきます。
朔弦望の日付/時刻は(必要ならば夏時間を補正して)地方時で与えられます。
しかし、変数calendar-time-zone
が設定されていなければ、
協定世界時(グリニッジ標準時)が使われます。
See Daylight Savings。
Emacsのカレンダーはつねに グレゴリオ暦(Gregorian calendar)で表示します。 この暦は『新暦』とも呼ばれ、今日では世界の大部分で使われています。 しかし、この暦は16世紀以前には存在せず、 18世紀になるまでは普及していませんでした。 ユリウス暦(Julian calendar)に置き替って 世界的に受け入れられたのは20世紀初頭になってからです。 Emacsのカレンダーは西暦1年1月以降の任意のカレンダーを表示できますが、 グレゴリオ暦が存在しなかった時代に関しても グレゴリオ暦に基づいた暦を表示します。
Emacsは他の暦を表示することはできませんが、 指定した日付と他の暦の日付とを相互に変換できます。
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
以下のコマンドは選択した日(ポイントがある日)を他の暦で表示します。
calendar-print-iso-date
)。
calendar-print-julian-date
)。
calendar-print-astro-day-number
)。
calendar-print-hebrew-date
)。
calendar-print-islamic-date
)。
calendar-print-french-date
)。
calendar-print-chinese-date
)。
calendar-print-coptic-date
)。
calendar-print-ethiopic-date
)。
calendar-print-persian-date
)。
calendar-print-mayan-date
)。
XウィンドウシステムでEmacsを使っている場合には、 ある日付を他の暦での日付に変換する いちばん簡単な方法は、その日付をMouse-2でクリックし、 立ち上がったメニューからOther Calendarsを選びます。 対応する日付をEmacsが知っているすべての暦でメニューに表示します。 (このメニューは単なる表示用なので、項目を選んでも何も起こらない。)
グレゴリオ暦の目的の日付にポイントを動かして適切なキーを打ちます。 pはprintの意味で、 Emacsはその日を指定された暦でエコー領域に表示します。
Emacsが扱える暦で日付を指定して、カレンダーの対応する日に移動できます。 本節では、マヤ暦を除く暦でこれを行うコマンドを説明します。 マヤ暦については、これに続く節を参照してください。
calendar-goto-iso-date
)。
calendar-goto-julian-date
)。
calendar-goto-astro-day-number
)。
calendar-goto-hebrew-date
)。
calendar-goto-islamic-date
)。
calendar-goto-french-date
)。
calendar-goto-chinese-date
)。
calendar-goto-persian-date
)。
calendar-goto-coptic-date
)。
calendar-goto-ethiopic-date
)。
これらのコマンドは、それぞれの暦での日付を聞いてきて、 それに対応するグレゴリオ暦の日付にポイントを移動します。 また、エコー領域には指定した暦の日付を表示します。 Emacsは月の名前をユーザーに聞くときに強い補完(see Completion) を使うので、ヘブライ暦/イスラム暦/フランス革命暦などの月の名前の綴りを 気にする必要はないでしょう。
ヘブライ暦で問題となるのが追悼記念祭『ヤールツァイト』(yahrzeit)と 呼ばれる命日の計算です。 Emacsのカレンダーにはその計算機能があります。 カレンダー内にカーソルがあるときにM-x list-yahrzeit-datesコマンドを 実行すると年の範囲を聞いてきます。 そして、ポイントがある日付に対応した追悼記念祭の日付を指定した範囲の年に ついて一覧表示します。 カレンダー内にいないときにこのコマンドを使うと、 まず死亡年月日を聞いてから年の範囲を聞いてきます。 そして、追悼記念祭の日付の一覧を表示します。
以下はマヤ暦で日付を指定する方法です。
calendar-goto-mayan-long-count-date
)。
calendar-next-tzolkin-date
)。
calendar-previous-tzolkin-date
)。
calendar-next-haab-date
)。
calendar-previous-haab-date
)。
calendar-next-calendar-round-date
)。
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)を 使うので、綴りを気にする必要はありません。
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には、日誌の項目を眺めたり、追加したり、変更したりする コマンドが数多くあります。
いったん~/diary
ファイルを作成しておけば、
カレンダーを使ってこれを眺めることができます。
また、カレンダー(calendar)モードの外からでも、
今日の予定を参照できます。
view-diary-entries
)。
show-all-diary-entries
)。
mark-diary-entries
)。
calendar-unmark
)。
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
が日数を指定します。
個人の日誌ファイルは、用事と日付の対応付けを記録したファイルです。
日誌ファイルの名前は、変数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-f(forward-char
)コマンドで
表示上の行末にポイントを置けますが、
実際には隠された行の途中にいるのかもしれません。
日誌項目を編集するときには注意してください!
項目に余分な行を追加したり見えている行の途中に文字を追加/削除しても
問題は生じませんが、行末で編集すると予期しないことが起こる可能性があります。
行を削除すると今は見えていない後続の他の項目を
削除してしまうかもしれません。
日誌を編集するまえには、s(show-all-diary-entries
)で
ファイル全体を表示させるのが最良です。
以下は日誌項目の例で、 使用可能ないくつかの日付指定形式を示しています。 この例では日付をアメリカ形式(月、日、年)で指定していますが、 カレンダー(calendar)モードではオプションで ヨーロッパ形式(日、月、年)も使用できます。
4/20/93 新しい計算システムへ切換 apr. 25 年ごとの計算開始 4/30 4月分の処理完了〆切 */25 月ごとのサイクル完了 Friday ファイルのバックアップを忘れないこと
最初の項目は1993年4月20日に一度だけ表示されます。
2番目と3番目は毎年指定した日付に表示され、
4番目は月の指定にワイルドカード(アスタリスク、*
)を使っているため、
毎月25日に表示されます。
最後の項目は毎週金曜日に表示されます。
日付には、month/day
や
month/day/year
のように数字だけを使ってもかまいません。
この場合、あとに続く文字は数字であってはいけません。
日付自体のmonth(月)とday(日)は1桁か2桁の数字です。
year(年)は省いてもかまいませんが、これも数字で、
最後の2桁だけに省略してもかまいません。
つまり、11/12/1989
と書いても11/12/89
と書いても同じです。
日付を、monthname day
や
monthname day, year
と書くこともできます。
ここで、monthnameは英語の月の名前で
3文字の省略形(ピリオドがあってもなくてもよい)でもかまいません。
大文字小文字は区別しません。
日付の指定は総称的であってもかまいません。
つまり、特定しない部分があってもかまいません。
そうすると、その指定に一致するすべての日付にその項目が適用されます。
年を指定しなければ、それは総称的であり、その項目は毎年に適用されます。
あるいは、month、day、yearのそれぞれに
*
を指定できます。
これは、それぞれ、任意の月、任意の日、任意の年に一致します。
したがって、3/*/*
という日誌項目は、
任意の年の3月のどの日にも一致します。
march *
も同じことです。
もし、月のまえに日を書くヨーロッパ形式で日付を指定したいときには、
カレンダー中でM-x european-calendarと打ちます。
あるいは、カレンダー/日誌コマンドを使うまえに
変数european-calendar-style
にt
を設定します。
この状態では、日誌の中のすべての日付指定をヨーロッパ形式で解釈します。
また、日誌の日付を表示するときもヨーロッパ形式です。
(ヨーロッパ形式では、monthnameのあとにはコンマは付けない。)
(デフォルトの)アメリカ形式の日付に戻るには、
M-x american-calendarと打ちます。
ある曜日を指定する総称的な日付として曜日の名前を使えます。 曜日の名前は英語で綴り、3文字の省略形 (ピリオドがあってもなくてもよい)でもかまいません。 大文字小文字は問いません。
カレンダー(calendar)モードの中には、 日誌の項目を作成するコマンドがいくつかあります。
insert-diary-entry
)。
insert-weekly-diary-entry
)。
insert-monthly-diary-entry
)。
insert-yearly-diary-entry
)。
カレンダーウィンドウ内で日を選択してi dコマンドを打てば、 選択した日に日誌項目を作成できます。 このコマンドは、別のウィンドウに日誌ファイルの末尾を表示し、 日付を挿入します。 そうしたら、日誌項目の残りの部分を打ち込みます。
特定の曜日に日誌項目を作成したい場合には、 その曜日を選択して(どの場所でもよい)i wと打ちます。 これで、総称的な日付として曜日名が挿入されます。 そうしたら、日誌項目の残りの部分を打ち込みます。 同様にして、月の特定の日を選択してからi mコマンドを打って、 項目の残りの部分を打ち込みます。 同じように、i yコマンドで、 毎年の特定の日に項目を挿入できます。
これらのコマンドはすべて、デフォルトでは印付けされる項目を作成します。 印付け禁止の項目を作成するには、コマンドに数引数を指定します。 たとえば、C-u i wは毎週の印付け禁止項目を作ります。
日誌ファイルを修正したときには、 Emacsを終了するまえにファイルを必ず保存してください。
カレンダーの日付に基づいて項目を追加する以外に、
毎年の記念日などを表すS式項目(sexp entries)を
日誌ファイルに入れることができます。
これらの項目は、Emacsが日誌ファイルを読み込むときに
Lisp式(S式、sexp)を評価することに基づいています。
S式項目では日付のかわりに、%%
に続けて括弧で括ったLisp式があります。
Lisp式が項目を適用する日付を決定します。
カレンダー(calendar)モードには、 よく使われるS式項目を追加するコマンドがあります。
insert-anniversary-diary-entry
)。
insert-block-diary-entry
)。
insert-cyclic-diary-entry
)。
ある特定の日を毎年の記念日に指定したい場合には、 その日付にポイントを移動してからi aコマンドを使います。 このコマンドは、別のウィンドウに日誌ファイルの末尾を表示し、 記念日を指定するS式を挿入します。 そうしたら、日誌項目の残りの部分を打ち込みます。 以下はその例です。
%%(diary-anniversary 10 31 1948) アーサーの誕生日
この項目は、1948年以降の毎年10月31日に適用されます。
10 31 1948
は日付を指定します。
(ヨーロッパ形式の日付を使っている場合には、
31
と10
が入れ替わる。)
この式に開始年が必要なのは、日誌関数で経過年数の計算に使うからです。
ブロック日誌項目は、指定した期間に適用されます。 以下は、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。
日誌項目に約束が入っていて、 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-diary
にnil
を設定していない限り、
日誌用バッファにつぎの日の予定を表示します。
約束の警告表示を目覚し時計として利用することもできます。 コマンドM-x appt-addは、個人の日誌ファイルを変更せずに 約束リストに項目を追加します。 M-x appt-deleteは、約束リストから項目を削除します。
変数appt-issue-message
にnil
を設定すれば、
約束の警告表示はいつでもオフにできます。
Emacsは標準時と夏時間の違いを理解していて、 日出入、夏至、冬至、春分、秋分、朔弦望の時刻ではこれを補正しています。 夏時間の規則は、地域によっても、また、歴史的にもさまざまです。 補正を正しく行うには、使用する規則をEmacsに与えておく必要があります。
オペレーティングシステムのなかには、
その設置場所で適用する規則を記録しているものもあります。
このようなシステムでは、Emacsは自動的に必要な情報をシステムから取得します。
情報の一部や全部が欠けている場合には、現在マサチューセッツ州ケンブリッジで
使われている規則でEmacsは欠落部分を補おうとします。
その結果が正しくないならば、
変数calendar-daylight-savings-starts
と
calendar-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(分)です。
gnusは主にネットニュースを読んだり投稿するためのEmacsパッケージです。 電子メイル、リモートディレクトリ、ダイジェストなどの ネットニュース以外のメッセージを読んだりそれらに応答するのにも使えます。
以下ではgnusについて紹介し、いくつかの基本的な機能について説明します。
gnusを起動するには、M-x gnus <RET>と打ちます。
ふつうのEmacsのパッケージと違って、 gnusは多数の異なるバッファを使って情報を提示したり ユーザーのコマンドを受け取ります。 ユーザーがもっとも多くの時間を使うことになるバッファは、 グループバッファ、サマリバッファ、 記事バッファの3つです。
グループバッファはニュースグループの一覧です。 gnusが起動すると、まずこのバッファが表示されます。 通常はユーザーが購読していて、かつ、 未読記事が存在するグループだけが表示されます。 このバッファでグループを選択します。
サマリバッファは選択したグループ内の1つの記事につき 1行の情報を表示します。 デフォルトでは、各記事の投稿者、題目、行数が表示されますが、 gnusのほとんどの表示内容と同様にこの表示内容はカスタマイズできます。 グループバッファでグループを選択するとサマリバッファが作られ、 グループから出ると削除されます。 サマリバッファを使って記事を選択します。
記事バッファは記事を表示します。 gnusの普通の使い方では、このバッファを選択することはありません。 記事を操作対象とするコマンド群はサマリバッファで動作します。 しかし、望むなら、記事バッファに切り替えて、 そこでgnusのコマンドを実行することも可能です。
gnusが起動すると、個人のニュース初期化ファイル.newsrc
を読み込み、
ニュース記事を蓄えているローカルのニュースサーバーと通信しようとします。
ニュースサーバーは、
ユーザーがログインしているマシンと同じである必要はありません。
gnusを起動してニュースサーバーと通信したあとでも グループバッファにグループが1つも表示されないときは、 LやA kと打ってすべてのグループを表示させます。 つぎに各グループの行でuと打って 個々のグループの購読/非購読を切り替えます。
初めてgnusを起動したときは、ごく少数の選ばれたグループのみが 購読状態にあります。 他のグループは非購読グループ(killed groups)になっていて、 A kを使うと表示されます。 最初の起動以後にニュースサーバー上に追加されたグループはすべて、 ゾンビグループ(zombie groups)になっていて、 A zを使うと表示されます。 uを使えばこれらのグループを購読状態にできます。
qでgnusを終了すると、初期化ファイル.newsrc
と
.newsrc.eld
にすべてのグループの購読/非購読を自動的に記録します。
通常はこれらのファイルを手で編集すべきではありませんが、
やりかたがわかっているならかまいません。
ニュースを読むにはつぎの2つの段階を踏みます。
gnusの各バッファにはそれぞれ独自のコマンドがあります。 しかし、gnusのさまざまなバッファのどんなキーの意味も、 等価ではないにせよ、だいたい同じです。 以下は、グループバッファとサマリバッファのコマンドです。
.newsrc
を更新してgnusを終了する。
サマリバッファでは、
カレントグループから抜け出てグループバッファに戻る。
したがって、qを2回打つとgnusを終る。
.newsrc
ファイルに記録する。
gnusは、通常、購読グループのみを表示するため、
つぎにgnusを起動したときには非購読にしたグループは表示されない。
.newsrc
にも現れなくなる。
このコマンドの効果は、現在のgnusセッションだけでなく
将来のgnusセッションにも影響する。
qでgnusを終了すると、
gnusはファイル.newsrc
に
抹消したグループを除くすべてのグループの情報を書き出す。
サマリバッファでは、つぎのようになる。
すなわち、繰り返し<SPC>を打と、すべての記事を順に見ていくことができる。
サマリバッファでは、記事のテキストを1画面分戻す。
Emacsには、
1つのコマンド行を下位のシェルプロセスに渡して実行させる機能があります。
また、入出力を*shell*
という名前のEmacsバッファに接続して
対話的にシェルを実行する機能もあります。
shell-command
)。
shell-command-on-region
)。
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
に指定されているディレクトリ群を探索します。
exec-path
の値は、Emacs起動時の環境変数PATH
を
もとに初期設定されます。
個人のファイル.emacs
で
これらの変数の初期値を自由に変更してかまいません。
M-!もM-|もシェルコマンドの実行完了を待ち合わせます。
待つのをやめたい場合は、C-gで中断できます。
この場合、シェルコマンドはシグナルSIGINT
で終了させられます。
このシグナルは、シェルを使用中にC-cが普通に送るシグナルと同じです。
Emacsはシェルコマンドが実際に終了するまで待ちます。
シェルコマンドが(シグナルSIGINT
を無視して)停止しない場合は、
再度C-gを打ちます。
すると、無視できないシグナルSIGKILL
をシェルコマンドに送ります。
M-!やM-|で使用するコーディングシステムを指定するには、 これらのコマンドの直前にコマンドC-x <RET> cを使います。 See Specify Coding。
コマンドからのエラー出力は、通常、普通の出力と混ざり合ってしまいます。
変数shell-command-default-error-buffer
に
バッファ名の文字列を設定すると、
その名前のバッファのポイント位置のまえにエラー出力が挿入されます。
サブシェルを対話的に実行し、その対話記録をEmacsバッファに残すには、
M-x shellを使います。
このコマンドは、*shell*
という名前のバッファを作成(または再使用)し、
このバッファに入出力するサブシェルを実行します。
つまり、サブシェルの『端末出力』はバッファに挿入されポイントを進め、
サブシェルの『端末入力』はバッファから取られます。
サブシェルに入力を与えるには、バッファの末尾へ移動して
入力を打ち込み最後に<RET>を打ちます。
Emacsはサブシェルが何かするのを待つことはしません。 シェルが待っていようがシェルコマンドを実行していようが、 ウィンドウやバッファを切り替えて編集できます。 サブシェルからの出力は、 Emacsがそれを取り込む処理を実行できるまで待たされます。 取り込み処理は、Emacsがキーボード入力を待ったり、 時間待ちに入ったときに行われます。
複数のサブシェルを使うには、バッファ*shell*
の名前をコマンド
M-x rename-uniquelyで別のものに変更します。
そうしてから、再度M-x shellと打ち込んで、
新しいサブシェルを持つバッファ*shell*
を新たに作ります。
このバッファの名前も同じように変えれば、さらに新しく作れます。
すべてのサブシェルは独立かつ並行に実行されます。
サブシェルとして実行するファイル名は、変数explicit-shell-file-name
の値がnil
以外ならば、この変数の値で指定します。
nil
のときは、環境変数ESHELL
の値が使われますが、
これが存在しない場合は環境変数SHELL
の値が使われます。
指定されたファイル名が相対名の場合は、
exec-path
に指定されているディレクトリ群を探索します。
変数exec-path
は、
Emacs起動時の環境変数PATH
をもとに初期設定されます。
個人のファイル.emacs
でこれらの変数を自由に変更してかまいません。
シェルに対するコーディングシステムを指定するには、 M-x shellの直前にコマンドC-x <RET> cを使います。 または、シェルを開始したあとにシェルバッファでC-x <RET> pを 使っても指定できます。 See Specify Coding。
shellnameをシェルのファイル名として、
ファイル~/.emacs_shellname
が存在すると、
Emacsはサブシェルを実行開始した直後に初期設定のために、
このファイルの内容をシェルへの入力として送り込みます。
たとえば、bashを使っているのならファイル~/.emacs_bash
の内容が送られます。
Emacsは、シェルコマンド、cd
、pushd
、popd
が
シェルへの入力として送られるのを監視し、
バッファ*shell*
のデフォルトディレクトリと
シェルのカレントディレクトリが一致するようにします。
これらのシェルコマンドは、送られる入力行の文字列を構文的に調べて識別します。
これらのシェルコマンドに別名を付けるのなら、
Emacsにもその別名について教えておくことができます。
たとえば、変数shell-pushd-regexp
の値がシェルへの入力行の先頭に
一致する場合は、その行はpushd
コマンドであるとみなされます。
pushd
に別名を付けたら、この変数の値を変更します。
同様に、shell-popd-regexp
とshell-cd-regexp
は、
popd
とcd
を識別するのに使われます。
これらのコマンドはシェルへの入力行の先頭部分にあるときだけ
正しく認識されます。
Emacsは、cd
、pushd
、popd
のシェルコマンドだと
思われるものを処理中にエラーに遭遇すると、
フックshell-set-directory-err-hook
を実行します
(see Hooks)。
Emacsがサブシェルのカレントディレクトリを正しく追従できていない場合は、 コマンドM-x dirsを使ってシェルにカレントディレクトリを問い合わ せてください。 このコマンドは一般的なコマンドの構文を持つシェルでは動作します。 ですが、とても変わったシェルでは動かないかもしれません。
M-x dirtrackを使うと、 別のもっと積極的なやり方でカレントディレクトリの変更に 追従する(しない)ようにもできます。
Emacsは、サブシェルの環境変数EMACS
にt
を設定します。
シェルスクリプトでこの変数を検査すれば、
Emacsのサブシェルとして動いているかどうか判定できます。
シェルバッファではシェル(shell)モードが使われ、 プレフィックスキーC-cを持つ特別なキーをいくつか定義しています。 これらは、まずC-cを打つことを除けば、 Emacsの外でシェルを使うときの通常のコマンド行編集や ジョブ制御のキーに似せて定義してあります。 以下は、シェル(shell)モードでの特別なバインディングの一覧です。
comint-send-input
)。
行をコピーするとき、行の先頭部分の文字列で
変数shell-prompt-pattern
に一致する部分はコピーしない。
この変数の値は、ユーザーのシェルがプロンプトとして用いる
文字列に一致する正規表現であること。
comint-dynamic-complete
)。
<TAB>は、履歴参照(see History References)や
環境変数名も補完できる。
変数shell-completion-fignore
には、
シェル(shell)モードでの補完において
無視したいファイル名の拡張子のリストを指定する。
デフォルトの設定では、名前が、~
、#
、%
で
終るファイルを無視する。
関連する他のcomintモードではかわりに
変数comint-completion-fignore
を使う。
comint-dynamic-list-filename-completions
)。
comint-delchar-or-maybe-eof
)。
シェルバッファの末尾でC-dを打つとサブシェルにEOFを送る。
バッファのそれ以外の位置では、C-dを打つと通常どおり1文字削除する。
comint-bol
)。
同じ行でこのコマンドを2回繰り返すと、2回目ではプロセスマークへ戻る。
プロセスマークとは、サブシェルへまだ送っていない入力の開始位置のこと。
(通常、これは同じ場所であり、
プロセスマークはその行のプロンプトの終りにある。
ただし、C-c <SPC>のあとでは、
プロセスマークはまえの行にあるかもしれない。)
comint-kill-input
)。
backward-kill-word
)。
comint-interrupt-subjob
)。
また、このコマンドは
シェルバッファ内のまだシェルに送っていないテキストもキルする。
comint-stop-subjob
)。
また、このコマンドは
シェルバッファ内のまだシェルに送っていないテキストもキルする。
comint-quit-subjob
)。
また、このコマンドは
シェルバッファ内のまだシェルに送っていないテキストもキルする。
comint-kill-output
)。
シェルコマンドが大量の出力を出してしまったときなどに有効。
comint-show-output
)。
comint-show-maximum-output
)。
shell-forward-command
)。
変数shell-command-regexp
には、
シェルコマンドの終りの探し方(正規表現)を指定する。
shell-backward-command
)。
comint-dynamic-list-input-ring
)。
かわりに、つぎのようにして、 Emacsにパスワードプロンプトを認識させてエコーバックを抑制する方法もある。
(add-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt)
(add-hook 'comint-output-filter-functions 'comint-strip-ctrl-m)
comint-buffer-maximum-size
で指定した大きさに
シェルバッファの行数を切り詰める。
サブシェルから出力を受け取るたびに
これを自動的に行うにはつぎのようにする。
(add-hook 'comint-output-filter-functions 'comint-truncate-buffer)
シェル(shell)モードでは段落コマンドにも修正を加えてあり、 シェルプロンプトでのみ新しい段落が始まるようになっています。 つまり、シェルバッファでは、 1つの段落はシェルコマンドとその出力から成るのです。
シェル(shell)モードは、対話的なサブプロセスと通信するための汎用モードである comintモードからの派生です。 ここまでにあげてきたコマンドの名前からもわかるように、 シェル(shell)モードの数多くの機能は、実は、comintモードからきています。 シェル(shell)モードに固有な特別な機能は、正規表現に基づくプロンプトの認識、 カレントディレクトリの追跡、および、少数のユーザーコマンドに限られます。
comintモードから派生したEmacsのほかの機能としては、 GUD(see Debuggers)と M-x run-lisp(see External Lisp)があります。
M-x comint-runを使うと、 シェル(shell)モード固有の機能を持たないcomintモードで、 任意のプログラムをサブプロセスとして実行できます。
シェルバッファでは、以前に使ったシェルコマンドを再実行する方法が3つあります。
1つめは、ミニバッファと同じキーを使う方法です。
すなわち、ミニバッファの場合と同様に、
ポイントはつねにバッファの末尾にある状態で、
以前に使ったシェルコマンドをバッファに挿入できます。
2つめは、バッファ内で以前のシェルコマンドの箇所に移動して、
それをそのまま再実行するかバッファの末尾にコピーします。
3つめは、!
形式の履歴参照を使うことです。
!
-style history references.
シェルバッファには、それまでに入力したシェルコマンドの履歴があります。 この履歴からシェルコマンドを再利用するには、編集コマンド、 M-p、M-n、M-r、M-sを使います。 これらはミニバッファの履歴コマンドと同様に働きますが、 (普通はシェルに送るテキストを挿入する) シェルバッファの末尾にあるテキストに作用する点が異なります。
M-pは、1つまえのシェルコマンドをシェルバッファの末尾に持ってきます。 M-pを連続して使うと、次々にそれよりまえに実行したシェルコマンドを 持ってきて、それまでのシェルへの入力用テキストを置き換えます。 M-nも同様ですが、 次々にそれよりあとのシェルコマンドを持ってくる点が異なります。
履歴探索コマンドM-rとM-sは、 正規表現を読み取り、それに一致するシェルコマンドを履歴の中から探します。 どのシェルコマンドを持ってくるかという点を除けば、 それらの働きはM-pやM-nと同じです。 正規表現として空文字列を入力すると、直前に使用した正規表現を再使用します。
再使用したいシェルコマンドを探したならば、 <RET>を打ってそのシェルコマンドを再実行するか、 必要なら編集してから実行します。
以前に連続して実行した一連のシェルコマンドをまとめて再実行できると便利な ことがあります。 それには、まず、一連のシェルコマンドの最初のものを探して再実行します。 そうしてからC-c C-xと打ちます。 これは、直前に再実行したシェルコマンドの(履歴内で) つぎにあるシェルコマンドを持ってきます。 <RET>と打って再実行します。 このように、C-c C-x <RET>を繰り返し打てば一連のシェルコマンドを 再実行できます。
これらのコマンドは過去に実行したシェルコマンドを専用の履歴リストから 持ってくるのであって、シェルバッファからとってくるのではありません。 したがって、シェルバッファを編集したり、その大部分をキルしたとしても、 これらのコマンドが参照する履歴には影響しません。
いくつかのシェルは、コマンド履歴をファイルに保管して
以前のセッションの履歴を引き継げるようになっています。
Emacsは、自分の履歴リストを初期設定するために、
ユーザーが使うシェルの履歴ファイルを読み込みます。
ファイル名は、bashであれば~/.bash_history
、
kshであれば~/.sh_history
、
その他のシェルであれば~/.history
です。
comint-previous-prompt
)。
comint-next-prompt
)。
comint-copy-old-input
)。
このコマンドはポイントを古いシェルコマンドへ移動したときに役立つ。
シェルコマンドをコピーしたら、<RET>でそれを(シェルへ)送る。
必要ならシェルコマンドを修正してから送ってもよい。
ポイントをまえの入力箇所に移動してからC-c <RET>でコピーしても、 M-pを必要な回数使って履歴リストからまえのコマンドを持ってきたのと (バッファの内容が同じという意味で)同じ結果になります。 ただし、C-c <RET>はバッファからテキストをコピーするので、 シェルへ送ったあとでそれをバッファ上で編集した場合には、 履歴リストにあるものとは異なることもあります。
cshやbashをはじめ多くのシェルは、
!
や^
で始まる履歴参照の機能を提供しています。
シェル(shell)モードでもこれらの指定を理解し、履歴置換を行えます。
履歴参照を入力して<TAB>を打つと、
履歴リストから一致するシェルコマンドを探し、
必要なら置換を行い、履歴参照をその結果で置き換えます。
たとえば、mv
で始まるいちばん最近のシェルコマンドを持ってくるには
! m v <TAB>と打ちます。
必要ならシェルコマンドを編集し、<RET>と打ってシェルへ送ります。
履歴参照は、シェルプロンプトのあとでのみ効果を持ちます。
変数shell-prompt-pattern
でシェルプロンプトと認識するものを指定します。
comintモード一般には、変数comint-promt-regexp
で
プロンプトの探し方を指定します。
シェル(shell)モードでは、shell-prompt-pattern
を使って
comint-prompt-regexp
のローカルな値を設定します。
シェル(shell)モードでは、シェルに送る際にバッファ内で履歴参照を
展開するようにも指定できます。
それには、変数compint-input-autoexpand
にinput
を設定します。
<SPC>をコマンドcomint-magic-space
にバインドすれば、
<SPC>で履歴展開が行えるようになります。
変数comint-scroll-to-bottom-on-input
がnil
以外の場合には、
挿入およびヤンクコマンドは、
選択されているウィンドウを末尾までスクロールしてから挿入します。
comint-scroll-show-maximum-output
がnil
以外の場合、
出力に伴うスクロールでは、
最後の行ができるだけウィンドウのいちばん下にくるようにし、
なるべく多くの有用なテキストが見えるようにします
(これは多くの端末のスクロール動作の真似)。
デフォルトはnil
です。
comint-scroll-to-bottom-on-output
を設定すると、
ポイントがどこにあろうと、
出力が到着するたびにバッファの末尾へポイントがジャンプするように設定できます。
この変数の値がthis
であれば、
ポイントは選択されたウィンドウでジャンプします。
値がall
であれば、comintバッファを表示している各ウィンドウで
ポイントはジャンプします。
値がother
であれば、カレントバッファを表示しているすべての
選択されていないウィンドウでポイントはジャンプします。
デフォルトはnil
ですから、ポイントはジャンプしません。
変数comint-input-ignoredups
は、
連続する同一の入力を履歴に格納するかどうかを制御します。
値がnil
以外のときは、直前の入力と同じ入力は履歴に格納しません。
デフォルトはnil
ですから、直前と同じ入力でもすべて履歴に格納します。
3つの変数でファイル名の補完をカスタマイズします。
変数comint-completion-addsuffix
は、
ファイル名やディレクトリ名を補完するとき、
名前を完全に補完できたことを示すために
末尾に空白やスラッシュを挿入するかどうかを指定します
(nil
以外のとき、空白やスラッシュを挿入)。
comint-completion-recexact
は、
その値がnil
以外の場合、Emacsの通常の補完アルゴリズムで1文字も
追加できないときには<TAB>で可能なもっとも短い補完文字列を
挿入するようにします。
comint-completion-autolist
は、その値がnil
以外の場合、
補完が完全でないときに可能な補完候補の一覧を表示することを指定します。
コマンドcomint-dynamic-complete-variable
は、
Emacs中で設定されている環境変数を用いて変数名の補完を行います。
ファイル名の補完を制御する上述の変数群も変数名の補完を制御します。
このコマンドは、通常、メニューバーから使えます。
コマンド補完は、通常、実行可能なファイルだけを対象とします。
shell-command-execonly
をnil
にすると、
実行可能でないファイルも対象となります。
pushd
の動作をカスタマイズできます。
引数が与えられないとcd
と同様にふるまう
(shell-pushd-tohome
)、
数引数を指定するとpop
ではなく巡回する
(shell-pushd-dextract
)、
ディレクトリスタックにないディレクトリだけを
ディレクトリスタックに加える
(shell-pushd-dunique
)
を制御できます。
これらの値は当然、使っているシェルの動作と一致するように設定すべきです。
Emacsには、他のホストにログインしてEmacsバッファ経由で通信するコマンドが 2つあります。
他のホストにtelnet経由で接続するには、M-x telnetを使います (telnetはリモートログイン用のInternetの標準プロトコル)。 このコマンドは、接続先のホスト名を引数としてミニバッファで読みます。 いったん接続が確立すると、他のホストとのやりとりはサブシェルとのやりとり と同様にして行えます。 通常のEmacsコマンドで入力を編集でき、<RET>で相手側に送信します。 相手側からの出力は(同じ)Telnetバッファに挿入されます。
rlogin接続を行うには、M-x rloginを使います。
rloginは本質的にはtelnetプロトコルとよく似た
リモートログイン用の通信プロトコルですが、
telnetとの互換性はなく、ある種のシステムでだけ使えます。
rloginの利点は、2つのマシン間で頻繁に通信する場合に
ユーザー名やパスワードを毎回打ち込まないですむように設定できることと、
8ビットを透過的に使う接続が可能なことです。
(Emacsでこれを行うには、
rloginを開始するまえにrlogin-explicit-args
に("-8")
を
設定する。)
M-x rloginは、相手側とFTP経由でファイルをやりとりするために Emacsバッファのデフォルトディレクトリを設定し(see File Names)、 シェル(shell)モードと同様にカレントディレクトリを変更する シェルコマンドを監視します。
rloginバッファでディレクトリを追跡する方法は2つあります。
リモートディレクトリ名/host:dir/
を使うか、
ローカルファイル名を使います。
(後者は『相手側のホスト』がローカルホストと
ファイルシステムを共有している場合にのみ使える)。
コマンドrlogin-directory-tracking-mode
を使って、
これらの2つのモードを相互に切り替えられます。
引数なしではリモートディレクトリ名を使う状態にし、
正の数を引数にするとローカル名を使う状態にします。
負の数を引数にするとディレクトリの追跡機能を止めます。
mail
を始めとする多くのプログラムは、
送信メッセージなどのテキストを編集するために
ユーザーが指定したエディタを起動します。
これらのプログラムは、
習慣として、環境変数EDITOR
で指定されたエディタを起動します。
EDITOR
にemacs
を設定しておけばEmacsが起動しますが、
新たに別のEmacsプロセスが開始されるので不便です。
というのは、新しいEmacsプロセスは既存のEmacsプロセスとバッファを
共有しないからです。
EmacsクライアントとEmacsサーバーを用いて、
mail
などのプログラムが既存のEmacsプロセスを
エディタとして使うようにできます。
以下のようにします。
まずは準備です。
Emacsの中で関数server-start
を呼び出します。
(個人のファイル.emacs
に式(server-start)
を書いておけば、
これを自動的に行える。)
つぎに、Emacsの外で環境変数EDITOR
にemacsclient
を設定します。
(プログラムによっては別の環境変数を使う。
たとえば、TeXにemacsclient
を使わせるには、
環境変数TEXEDIT
にemacsclient +%d %s
と設定する。)
こうすると、どのプログラムがEDITOR
に指定されたプログラムをエディタ
として起動しても、結果としては、訪れるべきファイルを伝える
メッセージが現在動いているEmacsに送られます。
(これがemacsclient
の役割。)
Emacsはただちにバッファを表示し、ユーザーはすぐに編集を開始できます。
そのバッファの編集が終ったら、C-x #と打ちます(server-edit
)。
これにより、ファイルが保存され、
終了せよとのメッセージをemacslient
に送り返します。
EDITOR
を参照したプログラムは
『エディタ』(実際にはemacsclient
)が終了するのを待ちます。
C-x #は複数のファイルに対する外部からの編集要求で
他に残っているものがないかどうかも検査し、
もしあればつぎのファイルを訪問します。
望むなら手でサーバーバッファに切り替えてもかまいません。 必ずC-x #を使わなければならないということはありません。 ただし、C-x #はサーバーバッファの編集が終ったということを 告げる唯一の方法です。
変数server-window
にウィンドウやフレームを設定してあれば、
C-x #はサーバーバッファをそのウィンドウやフレームに表示します。
mail
やその他のアプリケーションがemacsclient
の終了を
待っているあいだ、emacsclient
は端末入力を読みません。
したがって、mail
が使っている端末は、そのあいだ実質的に
ブロックされた状態にあります。
サーバーとして使うEmacsで編集をするためには、
その(ブロックしている)端末を使わずに行う必要があります。
それには2つの方法があります。
mail
とEmacsとを別のウィンドウで動かす。
mail
がemacsclient
を待っているあいだ、
mail
が動いてるウィンドウはブロックされるが、
他のウィンドウに切り替えればEmacsを使える。
mail
などのプログラムを動かす。
こうすれば、emacsclient
はEmacsの下で動いている
サブシェルのみをブロックするので、
Emacsを使ってファイルを編集するのは通常どおり行える。
プログラムによっては、エディタで編集するための作業ファイルを作成します。
ユーザーが作業ファイルを編集し終ると、
プログラムはそのファイルを読み込んでから消去します。
Emacsサーバーがあとで同じ名前のファイルを編集するように告げられた場合、
それはたまたまファイル名が一致しただけで、
内容はまえのファイルと何ら関係ないものと考えなければなりません。
このため、サーバーはファイルを編集し終ると作業ファイルのバッファを削除します。
変数server-temp-file-regexp
を使って、
どのようなファイルがここでいう意味での作業ファイルであるか指定します。
この変数の値は、作業ファイルであるようなファイルの名前に
一致する正規表現である必要があります。
オプション--no-wait
を指定してemacsclient
を起動すると、
Emacs上でバッファを編集し終るのを待たずにただちに終了します。
印刷用のEmacsコマンドには、バッファ全体ないしその一部を、 ページヘッダ付き/なしのどちらででも出力する機能があります。 dired(see Misc File Ops)とdiary(see Diary Commands)の 印刷機能についても参照してください。
print-buffer
と同様だが、現在のリージョンのみを印刷する。
lpr-buffer
と同様だが、現在のリージョンのみを印刷。
(Postscriptコマンドを除く)印刷コマンドは、
lpr-switches
の値をもとに追加オプションをlpr
に渡します。
この変数の値は文字列のリストであり、
各文字列は-
で始まるオプションである必要があります。
たとえば、Emacsから行う印刷で1行を80文字に設定するには、
lpr-switches
をつぎのように設定します。
(setq lpr-switches '("-w80"))
変数printer-name
を設定すれば、使うプリンタを指定できます。
変数lpr-command
は、実行すべきプリンタプログラムを指定します。
デフォルトの値はオペレーティングシステムに依存します。
多くのシステムでは、デフォルトは"lpr"
です。
変数lpr-headers-switches
も同様に、
ページヘッダを作るための追加オプションを指定します。
変数lpr-add-switches
は、
プリンタプログラムに(lpr
には適した)
オプション-T
とオプション-J
を指定するかどうか制御します。
この変数の値がnil
ならこれらのオプションを指定しません。
プリンタプログラムがlpr
と互換性がないなら、
変数lpr-add-switches
はnil
にすべきです。
これらのコマンドは、バッファの内容をPostscriptに変換し、 プリンタへ送るか他のEmacsバッファに入れます。
Postscriptコマンドps-print-buffer
およびps-print-region
は
バッファの内容をPostscript形式で出力します。
前者はバッファ全体を出力しますが、後者はリージョンのみです。
これらに対応した-with-faces
コマンドである
ps-print-buffer-with-faces
およびps-print-region-with-faces
は、
出力するテキストのテキスト属性のフェイス(フォントと表示色)を
Postscriptの機能を用いて再現します。
カラーディスプレイを使っている場合、
バッファでフォントロック(font-lock)モードを使って色付けしたプログラムコードを
ps-print-buffer-with-faces
で(そのまま)印刷できます。
コマンド名がprint
のかわりにspool
であるものは、
変換したPostscript出力をプリンタに送るかわりにEmacsバッファに置きます。
すべてのPostscriptの印刷コマンドは、出力をどのように印刷するかを
変数ps-lpr-command
とps-lpr-switches
で指定できます。
ps-lpr-command
には印刷のため実行するシェルコマンド、
ps-lpr-switches
にはそのシェルコマンドに指定するオプション、
ps-printer-name
にはプリンタを指定します。
始めの2つの変数を設定しなかった場合は、
lpr-command
とlpr-switches
に基づいて初期値が設定されます。
ps-printer-name
がnil
だとprinter-name
を使います。
変数ps-print-header
は、これらのコマンドが
各ページにヘッダをつけるかどうかを制御します。
nil
だとヘッダを付けません。
ps-print-color-p
をnil
にするとカラー処理を行いません。
変数ps-paper-type
は、印刷用紙サイズを指定します。
指定できる値は、a4
、a3
、a4small
、
b4
、b5
、executive
、ledger
、legal
、
letter
、letter-small
、statement
、tabloid
です。
デフォルトはletter
です。
変数ps-page-dimensions-database
を変更すれば
別の用紙サイズを定義できます。
変数ps-landscape-mode
は用紙の向きを指定します。
デフォルトはnil
で、『縦づかい』(ポートレート)です。
nil
以外の値を指定すると『横づかい』(ランドスケープ)です。
変数ps-number-of-columns
は段数を指定します。
縦づかいでも横づかいでも有効で、デフォルトは1です。
変数ps-font-family
は、
通常のテキストの印刷に使うフォントファミリを指定します。
指定できる値は、Courier
、Helvetica
、
NewCenturySchlbk
、Palatino
、Times
です。
変数ps-font-size
は、
通常のテキスト印刷に使うフォントのサイズを指定します。
デフォルトは8.5ポイント54です。
これらのコマンドには他にも多くのカスタマイズ可能な変数があり、
それらはLispファイルps-print.el
で定義されています。
Emacsには、バッファ中のテキストをソートするコマンドがいくつかあります。 すべてはリージョン(ポイントとマークのあいだのテキスト)に働きます。 これらのコマンドは、リージョン中のテキストを 多数のソートレコードにわけ、 各レコードについてソートキーを識別し、 一連のレコードをソートキーによって定まる順序に並べ替えます。 レコードはキーのアルファベット(辞書)順にも、 また数値に基づく数値順にも並べられます。 アルファベット順の場合は、ASCII文字の順序に基づいて すべての大文字「A」〜「Z」は小文字「a」よりまえにきます。
各種のソートコマンドの違いは、テキストをソートレコードに分ける方法と、 各レコードのどの部分をソートキーに使うかです。 ほとんどのコマンドは各行をソートレコードとして扱いますが、 段落やページをソートレコードとして扱うコマンドもあります。 ほとんどのソートコマンドは各ソートレコード全体を それ自身のソートキーとして扱いますが、 ソートレコードの一部分だけをソートキーとして扱うコマンドもあります。
どの欄をキーとしてソートするかは、
1を指定すれば第1欄、というように数引数で指定する。
負の値を指定したときは左からでなく右から欄を数える。
つまり、-1は最後の欄でソートする。
複数の行において欄の値が同一の場合、
バッファ上のもとの順序が保存される。
10
はアルファベット順では2
よりまえにくるが、
数値として見れば2
よりあとにくる。
たとえば、バッファにつぎのような内容が入っていたとします。
On systems where clash detection (locking of files being edited) is implemented, Emacs also checks the first time you modify a buffer whether the file has changed on disk since it was last visited or saved. If it has, you are asked to confirm that you want to change the buffer.
バッファ全体にM-x sort-linesを適用すると、 つぎのようになります。
On systems where clash detection (locking of files being edited) is implemented, Emacs also checks the first time you modify a buffer saved. If it has, you are asked to confirm that you want to change the buffer. whether the file has changed on disk since it was last visited or
ここで、O
は大文字なのですべての小文字よりまえにきます。
上記のかわりにC-u 2 M-x sort-fileldsを使ったとすると、
結果はつぎのようになります。
implemented, Emacs also checks the first time you modify a buffer saved. If it has, you are asked to confirm that you want to change the buffer. On systems where clash detection (locking of files being edited) is whether the file has changed on disk since it was last visited or
この例ではソートキーは、Emacs
、If
、buffer
、
systems
、the
だったわけです。
M-x sort-columnsには少々説明が必要です。 文字位置の範囲を指定するには、ポイントを文字位置の一方に、 マークを他方の文字位置に置きます。 このため、ポイントやマークをソートしたい最初の行の先頭に 置くことができませんから、このコマンドでは変わった 「リージョン」の定義を用います。 ポイントがある行全体はリージョンに含まれ、 同様に、マークがある行全体もリージョンに含まれ、 この2つの行のあいだにある行はすべてリージョンに含まれるとみなすのです。
たとえば、ある表を10文字目から15文字目までの情報をもとにソートする場合、
表の最初の行の10文字目にマークを置き、
表の最後の行の15文字目にポイントを置き、
そしてsort-column
を実行します。
あるいは、マークを最初の行の15文字目、
ポイントを最後の行の10文字目に置いても同じことです。
これは、ポイントとマークで指定された矩形領域をソートするものと考えられます。 ただし、矩形領域の右側や左側にある各行のテキストも一緒に移動します。
sort-fold-case
がnil
以外の場合、
ソートコマンドのほとんどは比較に際して大文字小文字を区別しません。
ナロイング(narrowing)とは、バッファのある部分だけに焦点を当て、 残りの部分を一時的に参照できなくすることです。 扱える部分のことを参照可能範囲と呼びます。 ナロイングを取り消して、バッファ全体を参照できるように戻すことを ワイドニング(widening)と呼びます。
ナロイングすると、他の部分に煩わされることなく、 1つのサブルーチンや段落などに集中できます。 また、置換コマンドやキーボードマクロの適用範囲を制限するのにも利用できます。
narrow-to-region
)。
widen
)。
narrow-to-page
)。
narrow-to-defun
)。
バッファの一部分へナロイングすると、その部分だけしかないように見えます。
残りの部分は見えませんし、そこへポイントを移動することもできません
(移動コマンドは参照可能範囲から外へ出られない)し、
見えない部分はどのようにしても変更できません。
しかし、その部分がなくなったわけではないので、
ファイルに保存すれば参照できないテキストも保存されます。
ナロイングしているあいだは、モード行にNarrow
と表示されます。
主要なナロイングコマンドはC-x n n(narrow-to-region
)です。
現在のリージョンだけが参照可能で、その前後のテキストは参照できないように
カレントバッファに制限を課します。
ポイントとマークは変化しません。
別のやり方として、C-x n p(narrow-to-page
)は現在のページ
だけが見えるようにナロイングします。
ページの定義については、See Pages。
C-x n d(narrow-to-defun
)はポイントを含む関数定義の範囲に
ナロイングします(see Defuns)。
ナロイングを取り消すには、C-x n wでワイドニングします。 これによってバッファ中の全テキストが再度参照可能になります。
バッファ中のどの部分にナロイングしているかは、 コマンドC-x =で調べることができます。 See Position Info。
ナロイングは、それについて知らないユーザーを簡単に混乱させますので、
narrow-to-region
は、通常、使用禁止コマンドになっています。
このコマンドを使おうとすると、Emacsは確認を求めてきて、
コマンドを使えるようにするかどうか問い合わせてきます。
コマンドを利用可能にすると、それ以後は確認は必要なくなります。
See Disabling。
2段組み(two-column)モードは、左右の段に分けたテキストを編集するのに便利です。 このモードでは、左右に並んだ2つのウィンドウを使用し、 それぞれに別のバッファを表示します。
2段組み(two-column)モードに入るには、3つの方法があります。
2C-two-columns
)。
右側のバッファがまだ存在しなければ空のバッファで始まり、
カレントバッファの内容は変化しない。
このコマンドはカレントバッファが空か、または1段目の内容だけを持っていて、
これから2段目を作成しようとするときに使う。
2C-split
)。
カレントバッファは左側のバッファになるが、
右側の段の内容は右側のバッファに移される。
分割位置はポイントのある文字位置で指定する。
現在行からバッファの末尾を分割する。
このコマンドはバッファにすでに2段組みのテキストが入っていて、
一時的に左右の段を分けて編集したいときに用いる。
2C-associate-buffer
)。
<F2> sとC-x 6 sは、 各行を2つの段に分ける文字列である「段区切り文字列」を探します。 段区切り文字列の文字数は、<F2> sへの数引数で指定できます。 ポイントの直前のその文字数分の文字列が段区切り文字列になります。 デフォルトでは幅は1ですから、ポイントの直前の文字が段区切り文字列になります。
各行の正しい位置に段区切り文字列があれば、 <F2> sは各行の段区切り文字列のうしろの文字列を右側のバッファに移し、 段区切り文字列を削除します。 段区切り文字列が正しい位置にない行は分割されずに左側のバッファに残り、 対応する右側のバッファの内容は空行になります。 (これは、『2段組み(two-column)モードで両側の段にまたがった行』の書き方。 つまり、左側のバッファにそのような行を書き、 右側のバッファは空行にしておく)。
コマンドC-x 6 <RET>や<F2> <RET>
(2C-newline
)は、
左右の2つのバッファの対応する位置に改行を挿入します。
バッファを分割して編集しているときに2段組みテキストに
新しい行を追加するにはこれがもっとも簡単な方法です。
左右のバッファを望むように編集し終えたら、
それらを<F2> 1またはC-x 6 1(2C-merge
)で
再度併合します。
右側バッファの内容を左側バッファに第2段目としてコピーします。
再度2段組み編集に戻るには、<F2> sを使います。
2つのバッファ間の関連を解消するには、
<F2> dまたはC-x 6 d(2C-dissociate
)を使います。
コマンドを入力したときにカレントバッファでない側のバッファが空であれば、
そのバッファは削除します。
バイナリファイルを編集するための特別なメジャーモード、 hexlモードがあります。 このモードを使うには、ファイルを訪問するC-x C-fのかわりに M-x hexl-find-fileを使います。 このコマンドはファイルの内容を16進数表現に変換し、 変換したものを編集するようにします。 ファイルを保存すると自動的にバイナリに戻されます。
M-x hexl-modeを使えば、既存のバッファを16進数表現に変換できます。 普通にファイルを訪問してみたら、実はバイナリファイルだとわかった場合に便利です。
hexlモードでは通常のテキスト文字は上書きします。 これはファイル中のデータの配置をまちがって壊してしまう危険を減らすためです。 特別な挿入コマンドがあります。 以下は、hexlモードで使えるコマンドの一覧です。
hexl-mode
実行前のこのバッファのメジャーモードに戻る。
デスクトップ(desktop)ライブラリを使うと、 セッションからセッションへEmacsの状態を保存できます。 状態を保存するというのは、 以前のEmacsセッションで使っていたのと同じバッファ群、メジャーモード、 バッファ内の位置の状態でEmacsが始まるという意味です。
デスクトップ機能を使うには、カスタマイズバッファ
(see Easy Customization)を使って
desktop-enable
にnil
以外の値を設定するか、
個人の.emacs
ファイルの末尾に以下のような行を追加します。
(desktop-load-default) (desktop-read)
ユーザーが最初にEmacsセッションの状態を保存するときは、 M-x desktop-saveで陽に状態を保存する必要があります。 一度これを行っておけば、Emacsを終わるときに (現在のセッションだけでなく、それ以降のセッションでも) 自動的に状態を保存します。 また、Emacsを終わらせることなく任意の時点で状態を保存するには、 M-x desktop-saveを使います。
Emacsがまえのセッションの状態を引き継ぐためには、
まえのセッションを開始したときと同じカレントディレクトリで
Emacsを起動する必要があります。
これは、desktop-read
が読み込むファイルをカレントディレクトリで
探すからです。
つまり、異なるディレクトリごとに別のセッションを保存できることを意味します。
Emacsを起動するディレクトリで、
保存したどのセッションを使うか制御できます。
変数desktop-files-not-to-save
は、
状態保存から除外するファイルを制御します。
この変数の値は、除外したいファイルに一致する正規表現です。
デフォルトでは、(ftpで取ってきた)リモートファイルを除外します。
これはリモートファイルを再度取ってくるとセッションの開始が遅くなるからです。
リモートファイルも状態保存に含めるには、
desktop-files-not-to-save
に
"^$"
と設定します。
See Remote Files。
再帰編集とは、あるEmacsコマンドの実行途中で
任意のEmacsコマンドを使って編集を行う状況をいいます。
たとえば、query-replace
の途中でC-rを打つと、
再帰編集に入りカレントバッファを自由に変更できます。
再帰編集から抜けると、query-replace
の続きに戻ります。
再帰編集から脱出するとは、
実行途中のコマンドに戻ってその続きを行うことを意味します。
脱出のためのコマンドはC-M-c(exit-recursive-edit
)です。
再帰編集をアボートすることもできます。
これは脱出と似ていますが、実行途中だったコマンドも一緒に中断します。
アボートするには、
C-](abort-recursive-edit
)を使います。
See Quitting。
再帰編集中は、モード行のメジャー/マイナモード名を
囲む丸括弧の外側に中括弧[...]
が表示されます。
各ウィンドウのモード行すべてにこのように表示されます。
というのは、特定のウィンドウやバッファではなくEmacs全体が再帰編集に
入っているからです。
再帰編集中にさらに再帰編集に入ることもできます。
たとえば、query-replace
の途中でC-rを打ってから
デバッガを起動するコマンドを打ったとします。
すると、C-rによる再帰編集の中でさらにデバッガのための再帰編集に
入ることになります。
モード行には、現在の再帰編集レベルの数だけ中括弧の対が表示されます。
内側の再帰編集を(たとえばデバッガのコマンドcで)脱出すると、 1つ上のレベルでのコマンドが再開されます。 そのコマンドが終わったところでC-M-cを使うと そのレベルの再帰編集を脱出する、 というようにして再帰編集を終わらせていくことができます。 脱出はつねにもっとも内側のレベルに対して起こります。 また、アボートも1つのレベルの再帰編集から脱出し、 1つまえの再帰編集のコマンドレベルに戻ります。 必要ならそこでつぎの再帰編集レベルをアボートする、 というように続けることができます。
あるいは、 コマンドM-x top-levelですべてのレベルの再帰編集をアボートし、 ただちにトップレベルのコマンド入力に戻ることができます。
再帰編集の中で編集しているテキストは トップレベルで編集しているテキストと同じであるとは限りません。 再帰編集の目的によって変わってきます。 再帰編集を起動するコマンドがまず別のバッファに切り替えるものなら、 そのバッファを再帰的に編集することになるでしょう。 いずれにせよ、再帰編集の内側でも (バッファを切り替えるキーが再定義されていない限り) 通常どおりバッファを切り替えることができます。 残りの編集作業をすべて再帰編集の内側でやってしまい、 別のファイルを訪問したりもできます。 しかしそのようなことをすると、 ときどき(スタックオーバーフローなどの)痛い目に合う可能性があります。 ですから、再帰編集が不要になったら忘れずに脱出かアボートしてください。
一般に、GNU Emacsでは再帰編集レベルを最小限に抑えるように努めています。 というのは、再帰編集では特定の順、つまり、 最内側レベルからトップレベルに向かう順で戻るように強いられるからです。 このため、別の作業は別のバッファでするようにして、 ユーザーがそれらの間を自由に行き来できるようにしています。 たとえば、あるコマンドは新しいメジャーモードに切り替えますが、 もとのモードに戻るコマンドを用意しておきます。 このようにしたほうが、やりかけの作業に戻る順番を自由に選べ、 柔軟性を提供できます。
GNU Emacsは、他のほとんどのエディタの(程度の差はありますが) エミュレート(真似を)するようにプログラムできます。 標準の機能では、以下のものをエミュレートできます。
EDTエミュレーションコマンドの大部分はキーパッドのキーであり、
大部分のEmacsのキーバインディングはそのまま使える。
EDTエミュレーションのバインディング変更はグローバルキーマップに対して行われ、
EDTエミュレーションの状態でバッファやメジャーモードを切り替えても問題ない。
viエミュレーションはメジャーモードとして動くので、 エミュレーション中にバッファを切り替えることはできない。 バッファを切り替えたければ、まず通常のEmacsに戻る。
viエミュレーションを多用するつもりなら、
vi-mode
コマンドにキーをバインドしたほうがよいだろう。
このエミュレータはメジャーモードとして動くのではないので、
エミュレータを動かしたままさまざまな方法でバッファを切り替えることができる。
vi-mode
のようにコマンドvi-mode
で
入力モードを終了するのではないので、
vip-mode
にキーを割り当てる必要はない。
より詳しくはsee VIP。
M-x dissociated-pressはテキストを、単語単位、または、文字単位で
混ぜ合わせるコマンドです。
普通の英語をバッファに入れた状態でこれを実行すると、
きわめておもしろい結果が生成されます。
入力はカレントバッファから取り、
出力は*Dissociation*
というバッファに書き込みます
(およそ2、3行生成するごとにバッファが再表示されるので、
生成内容を順次読めます)。
M-x dissociated-pressは定期的にもっと出力を続けるかどうか聞いてきます。
nと答えると生成をやめます。
また、C-gを打てばいつでも止められます。
出力はバッファ*Dissociation*
に残っていますから、
必要ならどこへでもコピーできます。
M-x dissociated-pressはバッファ中のある箇所からランダムに 別の箇所にジャンプすることを繰り返していきます。 ただのゴミではなくおもしろい出力が得られるように、 ある一連の単語列からつぎの一連の単語列に移る際に、 それらのあいだに一定の重複があるようにします。 つまり、たとえばpresidentと出力したところで別の場所にジャンプすることに 決めたら、最後にあったentと同じ文字列のある単語、 たとえばpentagonのところに飛んでそこから続けるので、 結果としてpregidentagon 55 というのが生成されるわけです。 元テキストが長いとたいへんおもしろい結果を得られます。
M-x dissociated-pressに正の数引数を渡すと
文字単位で動作し、その数値は重複する文字数を指定します。
また、負の数引数を渡すと単語単位で動作し、その数値(の絶対値)で重複する
単語数を指定します。
引数を指定しないと「2」を指定したのと同じになります。
繰り返しますが、出力はつねにバッファ*Dissociation*
に現れます。
もとのバッファは変更されません。
M-x dissociated-pressは、入力テキストから頻度表を作って マルコフ連鎖を適用したのに近い結果をもたらしますが、 それ自体はきわめてオリジナルな発明です。 というのは、マルコフ連鎖では単に乱数に基づいて文字や語を選ぶだけなのに対し、 このコマンドでは乱数に基づいて連続した文字や語をコピーしてくるからです。 このため、より高速な実行が可能ですし、読んでおもしろい結果が得られます。
M-x dissociated-pressの使いすぎは仕事に差し支え、 場合によっては重大な障碍となりますから注意しましょう。 また、ユーザーに受け入れてもらうためにも、 マニュアルにこのコマンドの出力を利用するのはやめたほうがよいです。 でも、せいぜい楽しんで、よかったらバグの提案もよろしく。 56
退屈なときは、M-x hanoiを試してください。 ひどく退屈なら、数引数を指定してください。 ものすごく、ひどく退屈なら、「9」を指定するとよいでしょう。 まあやってみてください。
もう少し積極的に何かしたいなら、M-x gomokuを試してください。 これは五目並べのプログラムです。
M-x blackboxとM-x mpuzは2種類のパズルです。
blackbox
は箱の中の物の位置を当てるゲームです。
mpuz
は掛け算の覆面算で、英字に対応している数字を当てるゲームです。
英字を打ってからその英字に対応していると思う数字を打ち込みます。
M-x dunnetはアドベンチャー風の探検ゲームで、 大きなパズルだと思えばよいでしょう。
いらいらするときは、有名なElizaプログラムを試してみてください。 M-x doctorと打つだけです。 1つの入力の終りには<RET>を2回打ちます。
奇妙な感じがするときは、M-x yowと打ってみてください。
本章では、Emacsの動作を(あまり大幅でなく)カスタマイズする方法に ついて説明します。 もっと大幅な変更を行いたい場合には The Emacs Lisp Reference Manualを参照してください。
カスタマイズは、Emacsの1つのセッションの中だけで効果を持ちます。
Emacsを終了するとカスタマイズの効果は失われますし、
同時にあるいはあとで別のEmacsを立ち上げた場合にも何の影響も及ぼしません。
あるEmacsのセッションがセッションを超えて影響するためには、
ファイルに書くしかありません。
特に、カスタマイズを『恒久化』したい場合には、
個人の.emacs
ファイルや
その他の関連するファイルに適切な内容を書き込んでおき、
セッションごとにカスタマイズが行われるようにします。
See Init File。
.emacs
file.
マイナモードは、個別にオン/オフ可能な機能です。
たとえば、マイナモードである自動詰め込み(auto-fill)モードをオンにすると、
<SPC>で自動的に(単語の切れ目で)行分けします。
すべてのマイナモードは互いに独立ですし、
どのメジャーモードとも独立です。
ほとんどのマイナモードは、それがオンであることをモード行に表示します。
たとえば、モード行にFill
と表示されていれば、
自動詰め込み(auto-fill)モードがオンであることを意味します。
マイナモード名のうしろに-mode
を付け加えると、
そのモードをオン/オフするコマンド関数の名前になります。
したがって、自動詰め込み(auto-fill)モードをオン/オフするコマンドは
M-x auto-fill-modeということになります。
これらのコマンドは通常M-xを使って起動しますが、
どれかのキーにバインドすることもできます。
引数を指定しないと、これらのコマンドはモードがオフのときはオンに、
オンのときはオフに切り替えます。
これをトグルすると呼びます。
これに対し、正の引数を指定するとつねにモードをオンにしますし、
明示的に0の引数を指定するか、または負の引数を指定すると
つねにモードをオフにします。
いくつかのマイナモードのオン/オフは、カレントバッファに対してのみ適用され、 他のバッファには影響しません。 つまり、あるバッファであるモードをオンにし、 別のバッファではそのモードをオフにできるわけです。 このような、バッファごとにオン/オフできるマイナモードとしては、 略語(abbrev)モード、自動詰め込み(auto-fill)モード、 自動保存(auto-save)モード、フォントロック(font-lock)モード、 ISOアクセント(iso-sccents)モード、アウトライン(outline)マイナモード、 上書き(overwrite)モード、バイナリ上書き(binary-overwrite)モードがあります。
略語(abbrev)モードでは、
略語を打ち込むと自動的に展開されるような略語を定義できます。
たとえば、amd
をabbrev mode
と展開させます。
詳しくは、See Abbrevs。
自動詰め込み(auto-fill)モードでは、いちいち改行で行分けしなくても テキストを詰め込んで入力できます。 行が長くなりすぎないようにEmacsが適宜改行を挿入します。 See Filling。
自動保存(auto-save)モードはバッファの内容を定期的に保存することで、 システムクラッシュが起きたとき紛失してしまう作業の量を少なくします。 See Auto Save。
エンリッチ(enriched)モードは、整形済みテキストの編集を可能にします。 See Formatted Text。
フライスペル(flyspell)モードは、 綴りに誤りのある単語を自動的に強調表示します。
フォントロック(font-lock)モードは、コメント、文字列、定義中の関数名などの プログラム中の決まった単位を自動的に強調表示します。 これには、複数のフォントを表示できるウィンドウシステムが必要です。 See Faces。
水平スクロール(hscroll)モードは、ポイントが画面内に留まるように、 自動的に水平スクロールを行います。 See Horizontal Scrolling。
ISOアクセント(iso-accents)モードは、`
、'
、 "
、
^
、/
、~
とこれらに続くつぎの文字を結合して、
ISO Latin-1文字集合のアクセント付き文字を作り出します。
See Single-Byte European Support。
アウトラインマイナ(outline-minor)モードは、メジャーモードである アウトライン(outline)モードと同じ機能を提供します。 しかし、マイナモードなので任意のメジャーモードと一緒に使えます。 See Outline Mode。
上書き(overwrite)モードでは、入力された図形文字は既存の文字を右に押しやる
かわりにその文字を置き換えます。
たとえば、ポイントがFOOBAR
のB
のまえにあるときに
Gを打つとFOOGAR
となります。
通常のモードであればFOOGBAR
となります。
上書き(overwrite)モードでコマンドC-qを打つと、
そのつぎの文字が何であっても(数字であっても)その文字を挿入します。
つまり、上書き(overwrite)モードの中で文字を挿入するには
この方法を使います。
バイナリ上書き(binary-overwrite)モードは上書き(overwrite)モードの変形で、 バイナリファイル編集用です。 このモードでは、改行やタブも他の文字と同じに扱われるので、 他の文字をこれらの文字で上書きすることも、 これらの文字を他の文字で上書きすることもできます。
以下で説明するマイナモードは、すべてのバッファに一斉に適用されます。 ただし、これらは変数の値に応じてオン/オフされますから、 その変数をバッファにローカルな変数にすれば、 バッファごとに独立にオン/オフすることも可能です。 See Locals。
補完示唆(icomplete)モードは、ミニバッファで入力中に補完機能が働いているとき、 どのような補完候補があるかを表示します。 See Completion Options。
行番号(line-number)モードは、 ポイントのある行の行番号を絶えずモード行に表示します。 See Mode Line。
ミニバッファリサイズ(resize-minibuffer)モードは、 打ち込んだテキスト量に応じて自動的にミニバッファを広げます。 See Minibuffer Edit。
スクロールバー(scroll-bar)モードは、各ウィンドウにスクロールバーを付けます (see Scroll Bars)。 メニューバー(menu-bar)モードは、各フレームにメニューバーを付けます (see Menu Bars)。 どちらのモードも、Xウィンドウシステムを使っているときは デフォルトでオンになっています。
暫定マーク(transient-mark)モードでは、 バッファの内容を変更するとマークは『不活性』になるので、 そのあとでリージョンを対象とするコマンドを使うとエラーになります。 つまり、リージョンを対象とするコマンドを使うまえに、 改めてマークを設定するか、不活性になったマークを『再度活性』にします。 暫定マーク(transient-mark)モードの利点は、 (今のところXウィンドウシステムを使っているときのみ) Emacsがリージョンを強調表示することです。 See Setting Mark。
ほとんどのマイナモードには、コマンド名と同じ名前の変数があり、
その変数でモードを直接制御しています。
つまり、その変数の値がnil
以外ならモードはオンであり、
各マイナモードコマンドは変数の値を設定する動作をします。
たとえば、コマンドoutline-minor-mode
は、
変数outline-minor-mode
の値を設定する動作を行います。
つまり、この変数が、直接、上書き(overwrite)モードをオン/オフしているのです。
あるマイナモードがこのように動作するかどうかは、
C-h vを使ってその変数の説明文字列を参照してください。
これらのマイナモード変数は、Lispプログラムからモードを オン/オフするのに有用です。 また、ファイルのローカル変数リストとして指定するのも便利です。 ただし、ローカル変数リストで設定する場合には、よく考えてください。 というのは、ほとんどのマイナモードはユーザーの好みの問題であり、 同じファイルを編集する別のユーザーは好みが違うかもしれません。
変数は値を持つLispシンボル(記号)です。 そのシンボルの名前のことを、変数名とも呼びます。 変数名はファイルに入れられるどのような文字でも含むことができますが、 習慣的には、変数名は英単語をハイフンでつなげたものです。 変数には、その変数がどのような値を持ち、 どのように使われるかを記述した説明文字列を持たせることができます。
Lispではどの変数にどのような値でも格納できますが、
Emacsの中ではほとんどの変数はどのような値を持つかが決まっています。
たとえば、ある変数はつねに文字列である、別の変数は数値であるといった具合です。
また、「これこれの機能はこの変数がnil
以外のときにオンになる」
といういい方もします。
その場合は、その変数にnil
が格納されているときはその機能はオフですが、
それ以外のどんな値が格納されているときでもその機能はオンになります。
ですが、ある機能をオンにするために使う値として
何か選ばなければなりませんから、t
という値を使うのが習慣です。
Emacsは一般のLispプログラムと同様、 内部で情報を保持するために数多くの変数を使いますが、 ユーザーにとって特に興味深い変数というのは、 もっぱらカスタマイズ向けに用意された変数だといえます。 Emacsは(通常は)そのような変数の値を変更しません。 かわりに、ユーザーが値を設定すると、 その値に応じてさまざまなEmacsコマンドのふるまいを 変更したり制御したりできるのです。 これらの変数のことをユーザーオプションといいます。 ほとんどのユーザーオプションはこのマニュアルに記載してありますし、 変数索引(see Variable Index)にも記載してあります。
ユーザーオプションであるような変数の例としてfill-column
があります。
この変数は、詰め込みコマンド(see Filling)が使う
右端の桁位置を(左端から何文字右かを表す数値として)保持します。
describe-variable
)。
特定の変数の値を見るには、C-h v(describe-variables
)を使います。
このコマンドは、ミニバッファで補完機能付きで変数名を読み取ります。
変数の値と説明文字列の双方を表示します。
たとえば、
C-h v fill-column <RET>
とすると、つぎのように表示されます。
fill-column's value is 75 Documentation: *Column beyond which automatic line-wrapping should happen. Automatically becomes buffer-local when set in any fashion.
説明文の先頭にある*は、 この変数がユーザーオプションであることを示します。 C-h vは、ユーザーオプションに限らず任意の変数を扱えます。
ユーザーオプションを設定するいちばん簡単な方法はM-x set-variableを 使うことです。 このコマンドは、まずミニバッファで(補完機能付きで)変数名を読み取り、 つぎにミニバッファで変数に設定するLisp式を読み取ります。 たとえば、
M-x set-variable <RET> fill-column <RET> 75 <RET>
とすると、fill-column
に75を設定します。
M-x set-variableはユーザーオプションに対してだけ使えます。
これに対し、setq
を使えばどの変数にでも値が設定できます。
たとえば、setq
を使ってfill-column
に
設定するにはつぎのようにします。
(setq fill-column 75)
このような式を実行するには、*scratch*
バッファにいき、
式を打ち込んでからC-jを打ちます。
See Lisp Interaction。
変数を設定することは、特記していない限り、 他のカスタマイズ方法と同様に、現在のEmacsセッションだけに影響します。
変更したいユーザーオプション変数をみつけて値を変更する便利な方法は、 M-x customizeを使うことです。 このコマンドはカスタマイズバッファを作成し、 そのバッファ内では論理的な順序に並べたEmacsのユーザーオプションを 眺めてまわることができますし、さらに値を編集して設定できます。 また、カスタマイズバッファを使えば設定を恒久的なものとして 保存もできます。 (まだこの機能で扱えないユーザーオプションもあるが、 それらも扱えるように現在作業中。)
カスタマイズのために、ユーザーオプションをグループに
まとめてみつけやすくしてあります。
グループはさらに大きなグループにまとめられていて、
いちばん大きな(すべてのグループを含む)グループは
Emacs
という名前です。
M-x customizeは、トップレベルのEmacs
グループ
およびその直下の(第2レベルの)グループを表示した
カスタマイズバッファを作成します。
その表示はつぎのようになります。
/- Emacs group: ---------------------------------------------------\ [State]: visible group members are all at standard settings. Customization of the One True Editor. See also [Manual]. Editing group: [Go to Group] Basic text editing facilities. External group: [Go to Group] Interfacing to external utilities. more second-level groups \- Emacs group end ------------------------------------------------/
この表示の先頭部分は、
このバッファがEmacs
グループの内容を表示していることを記しています。
残りのグループが表示されるのは、
それらがEmacs
グループに含まれているからです。
ただし、それらは字下げや「-」なしで表示されていて、
表示にはそれらのグループの内容が含まれてはいないことを示しています。
各グループの表示には1行の説明文字列が付随しています。
また、Emacs
グループについては[State]
行が付随しています。
カスタマイズバッファ内のテキストのほとんどは変更できませんが、 一部分は編集可能フィールドになっていて、変更できます。 また、アクティブフィールドという、 その場所を起動するとなんらかの動作を行うような場所もあります。 アクティブフィールドを起動するには、 Mouse-1でそこをクリックするか、 またはそこにポイントを持っていって<RET>を打ちます。
たとえば、第2レベルグループ中の[Go to Group]
と記された部分は
アクティブフィールドです。
[Go to Group]
のフィールドを起動すると、
そのグループとそのグループの内容を表示する
新しいカスタマイズバッファが作られ、
そのグループと中身が表示されます。
このフィールドは他のグループへのハイパーテキストリンクの一種です。
Emacs
グループそのものはユーザーオプションを1つも含んでいませんが、
他のグループにはあります。
さまざまなグループを眺めてみると、
興味を持ってカスタマイズしてみようと思うような機能に属する
オプションやフェイスをみつけることができるでしょう。
カスタマイズグループ群の構造を概観するには、 M-x customize-browseを使います。 このコマンドは、グループ名(とオプションやフェイス)と それらの構造だけを表示する特別なカスタマイズバッファを作ります。
このバッファ中では、グループの中身を見るには[+]
のところを起動します。
グループの中身が見えるようになると、このボタンは[-]
に変わります。
これを起動すると中身を(もとどおり)隠します。
各グループ、オプション、フェイスにはそれぞれ[Group]
、
[Option]
、[Face]
と記されたアクティブフィールドがあります。
それらを起動すると、そのグループ/オプション/フェイスのみを表示した
通常のカスタマイズバッファが作成されます。
そのバッファで値を設定します。
カスタマイズバッファでユーザーオプションがどのように見えるか、 例をあげましょう。
Kill Ring Max: [Hide] 30 [State]: this option is unchanged from its standard setting. Maximum length of kill ring before oldest elements are thrown away.
[Hide]
に続くテキスト、つまり、30
がオプションの現在の値を
示しています。
[Hide]
ではなく[Show]
と表示されていれば、
値は隠されています。
カスタマイズバッファでは、複数行にわたるような値は最初は隠されていて、
[Show]
を起動すると表示されます。
オプション名に続く行はオプションのカスタマイズ状態を示しています。
上の例では、まだ変更していないと表示されています。
行頭の[State]
のところがアクティブフィールドで、
ここをMouse-1か<RET>で起動するとさまざまな操作を
示すメニューが表示されます。
これらの操作は変数をカスタマイズするうえでとても重要です。
[State]
のつぎの行には、
そのオプションの説明文字列の先頭部分が表示されます。
1行に収まらない場合には、行末に[More]
と表示されます。
これを起動すると説明文字列全体が表示されます。
Kill Ring Max
に新しい値を設定するには、
ポイントを値の位置へ持っていって直接文字列を変更します。
たとえば、M-dで現在の値を削除してから、
設定する数値を打ち込めばよいのです。
文字列を変更し始めると、[State]
行の表示が変わって、
値が編集されていることを示すようになります。
[State]: you have edited the value as text, but not set the option.
文字列を変更しただけでは、まだオプション変数の値は設定されません。
値を設定するには、[State]
のところを起動して、
Set for Current Session
を選択します。
値を設定すると、オプションの状態表示も対応して変わります。
[State]: you have set this option, but not saved it for future sessions.
正しくない値を設定してしまう心配はありません。 というのは、オプションの設定時には、値の正しさを検査して、 正しくない値は設定できないようになっています。
ディレクトリ名、ファイル名、コマンド名である値やフィールドを編集するとき、
および、その他何であれ補完が定義されているものを編集するときは、
M-<TAB>(widget-complete
)を打てば補完できます。
いくつかのオプションでは、正しい値としては決まった少数のものだけを使えます。
そのようなオプションは、テキストとしては編集できません。
かわりに[Value Menu]
というアクティブフィールドが値のまえに現れます。
『オンかオフ』だけの真偽値を持つオプションでは、
アクティブフィールドは[Toggle]
と表示されていて、
そこを起動するたびに値を反転できます。
[Value Menu]
も[Toggle]
もバッファを変更するだけです。
値が実際に設定されるのはSet for Current Session
を起動したときです。
いくつかのオプションは、込み入った構造の値を持ちます。
たとえば、load-path
は値としてディレクトリのリストを持ちます。
これをカスタマイズバッファに表示すると、つぎのようになります。
Load Path: [INS] [DEL] [Current dir?]: /usr/local/share/emacs/20.3/site-lisp [INS] [DEL] [Current dir?]: /usr/local/share/emacs/site-lisp [INS] [DEL] [Current dir?]: /usr/local/share/emacs/20.3/leim [INS] [DEL] [Current dir?]: /usr/local/share/emacs/20.3/lisp [INS] [DEL] [Current dir?]: /build/emacs/e20/lisp [INS] [DEL] [Current dir?]: /build/emacs/e20/lisp/gnus [INS] [State]: this item has been changed outside the customization buffer. List of directories to search for files to load....
リスト中の各ディレクトリがそれぞれ別の行に表示され、 各行にはいくつかの編集可能/アクティブフィールドがあります。
どのディレクトリ名も直接編集できます。
リストからディレクトリを削除するには、
その行の[DEL]
を起動します。
リストに新しいディレクトリを追加するには、
挿入したい箇所の[INS]
を起動します。
[Current dir?]
を起動すると、パスに特定のディレクトリを含めるのか、
または、nil
を含めるのかを切り替えられます。
(探索パスにおけるnil
は、
『カレントディレクトリを探せ』という意味。)
2つの特別なコマンド、<TAB>とS-<TAB>は、
カスタマイズバッファ内での移動に役立ちます。
<TAB>(widget-forward
)はつぎの
アクティブ/編集可能フィールドへ移動します。
S-<TAB>(widget-backward
)は、
1つまえのアクティブ/編集可能フィールドへ移動します。
編集可能フィールドで<RET>を打つと、 <TAB>と同様につぎのフィールドへ進みます。 なぜそうなっているかというと、編集可能フィールドを 編集し終えると最後に<RET>を打つ人が多いからです。 編集可能フィールドに改行文字を入るには、 C-oかC-q C-jと打ちます。
オプションを設定すると、その値は現在のEmacsセッションだけに有効です。
その値を保存すると、将来のセッションでも有効になります。
保存を行うと、個人の~/.emacs
ファイルにコードが追加されて、
つぎにEmacsを起動したときにオプション変数の値を設定するようになります。
オプションを保存するには、[State]
を起動して
Save for Future Sessions
を選びます。
オプションを標準値に戻したければ、[State]
を起動して
Reset to Standard Settings
を選びます。
実際にはつぎの3種類のリセット操作があります。
Reset
Reset to Saved
Reset to Standard Settings
グループの[State]
はそのグループに属するもののどれかが
編集された/設定された/保存されたことを示します。
Set for Current Session
、Save for Future Sessions
、
および各種のReset
をグループ全体に対して適用できます。
これらの操作はグループおよびそのサブグループに属するすべての
オプションに対して適用されます。
カスタマイズバッファの先頭付近には、 いくつかのアクティブフィールドを含んだつぎのような行があります。
[Set for Current Session] [Save for Future Sessions] [Reset] [Reset to Saved] [Reset to Standard] [Bury Buffer]
[Bury Buffer]
を起動すると、カスタマイズバッファを消します。
他のフィールドは、そのバッファに含まれている項目それぞれについてそれぞれ、
設定、保存、リセットを(それらの操作が適用可能なら)実行します。
いくつかのカスタマイズグループは、 ユーザーオプションに加えてフェイスも含みます。 グループの内容を表示したとき、 オプションとフェイスの両方がカスタマイズバッファに現れます。 フェイスの見え方は、たとえばつぎのようになります。
Custom Changed Face: (sample) [State]: this face is unchanged from its standard setting. Face used when the customize item has been changed. Attributes: [ ] Bold: [toggle] off [X] Italic: [toggle] on [ ] Underline: [toggle] off [ ] Inverse-Video: [toggle] on [ ] Foreground: black (sample) [ ] Background: white (sample) [ ] Stipple:
フェイスの各属性はそれぞれが1行を占めます。
属性のまえの[x]
というフィールドは、
その属性がオンになっているかどうかを表示しています。
X
が表示されていればオンになっています。
そのフィールドを起動することでオン/オフを反転できます。
属性がオンになっている場合は、
その属性の値をオプションと同様にして変更できす。
白黒ディスプレイでは、背景に設定可能な表示色はblack
、
white
、gray
、gray1
、gray3
のいずれかです。
Emacsは表示色のかわりにドットパターンで灰色の階調を表します。
フェイスを設定/保存/リセットするのは、オプションと同様にしてできます (see Changing an Option)。
フェイスでは、ディスプレイの種別ごとに異なる見え方を指定できます。
たとえば、あるフェイスをカラーディスプレイでは赤で表示し、
白黒ディスプレイではかわりにボールド体で表示するようにできます。
あるフェイスに複数の見え方を指定するには、
[State]
メニューを表示させてShow Display Types
を選びます。
フェイスの属性を設定するもっと基本的な方法は、
M-x modify-faceを使うことです。
このコマンドは、まずフェイスの名前を聞いてきて、
続いて属性を1つずつ順に聞いてきます。
表示色やパターンの属性では、その属性の現在の値がデフォルトになっています。
これらを変更したくなければ、単に、<RET>を打てばよいのです。
属性を空にしたければnone
と打ちます。
グループ構造を1段ずつ降りていって目指すオプションを探すかわりに、 カスタマイズしたいオプション/フェイス/グループの名前を 直接に指定することもできます。
名前のわかっているオプション変数をカスタマイズバッファで変更したい場合は、 コマンドM-x customize-optionで直接名前を指定します。 これにより、そのオプションだけを含むカスタマイズバッファが現れます。 編集/設定/保存はこれまで説明したとおりに行いますが、 設定の対象になるのは指定したオプションだけです。
同様にして、M-x customize-faceではフェイス名を指定して変更できます。
同様に、M-x customize-groupではグループ名を指定して
カスタマイズバッファを開くことができます。
そのカスタマイズバッファには、指定したグループに直接含まれているオプション、
フェイス、他の(下位の)グループが現れます。
ただし、サブグループの内容は最初は隠されています。
それらを表示したい場合は、通常どおり[Show]
を起動します。
M-x customize-aproposを使うと、 カスタマイズするものをもっと細かく制御できます。 このコマンドでは引数として正規表現を指定し、 それに一致するすべてのオプション/フェイス/グループを 含んだカスタマイズバッファが現れます。 空の正規表現を指定すると、すべてのオプション/フェイス/グループを 含むカスタマイズバッファができます (ただしすごく時間がかかる)。
Emacsの新版へ更新したときには、新しいオプション、 意味やデフォルト値が変更されたオプションをカスタマイズしたいはずです。 それには、M-x customize-changed-optionsを使い、 ミニバッファで以前の版のEmacsのバージョン番号を指定します。 すると、指定したバージョン以降に定義が変更された すべてのオプション(とグループ)を含んだカスタマイズバッファを作ります。
オプションを変更したあとでまちがったと気づいたときは、 変更したものを再検討するために2つのコマンドが使えます。 保存してしまったオプションについてはcustomize-savedを、 変更したけれどまだ保存していないオプションについては M-x customize-customizedを使います。
フックとはある特定の状況で既存のプログラムから呼び出される 関数/関数群を格納しておく変数をいいます。 Emacsには、カスタマイズ用のフックが数多くあります。
Emacs中のほとんどのフックはノーマルフックです。
これらの変数は、引数なしで呼び出される関数のリストを保持します。
ほとんどのフックがノーマルフックなのは、それらを統一的に扱えるからです。
Emacsでは、-hook
で終わる名前の変数はすべてノーマルフックです。
ほとんどのメジャーモードは初期設定の最終段階でフックを実行します。
モードが設定したローカル変数をフックで変更すればよいので、
モードのふるまいをユーザーがカスタマイズすることが容易になります。
しかし、フックはそれ以外の場面でも使われます。
たとえば、suspend-hook
は、Emacsが休止する直前に実行されます
(see Exiting)。
ノーマルフックにフック関数を追加するお勧めのやり方は、
add-hook
を呼ぶことです。
フック関数としては任意のLisp関数を使えます。
たとえば、テキスト(text)モードやテキスト(text)モードを
基にしているモードにおいて、
自動的に自動詰め込み(auto-fill)モードをオンにするにはつぎのようにします
(add-hook 'text-mode-hook 'turn-on-auto-fill)
つぎの例は、Cコードの字下げをカスタマイズするのにフックを 使う方法を示します。 (誰でも字下げには独自の好みがある)。 ここでは、フック関数は名前のないラムダ式です。
(setq my-c-style '((c-comment-only-line-offset . 4) (c-cleanup-list . (scope-operator empty-defun-braces defun-close-semi)) (c-offsets-alist . ((arglist-close . c-lineup-arglist) (substatement-open . 0))))) (add-hook 'c-mode-common-hook (function (lambda () (c-add-style "my-style" my-c-style t))))
どの順番で実行されても大丈夫なようにフック関数を設計するのが最良です。 実行順序に依存するのは、『事故を呼び込む』ようなものです。 しかし、順番は予測できます。 もっとも最近に追加したフック関数ほど先に実行されます。
ほとんどの変数はEmacsバッファに対してローカルにできます。 つまり、その変数のバッファ中での値は他のバッファでの値とは 独立になります。 いくつかの変数はつねにすべてのバッファにおいてローカルです。 それ以外の変数はすべて、グローバルな値、 つまりその変数をローカルにしていないすべてのバッファにおいて 共有される値を持ちます。
M-x make-local-variableは変数名を受け取り、 その変数をカレントバッファにおいてローカルにします。 それ以降、このバッファ内でその変数を変更しても 他のバッファには影響しませんし、 その変数のグローバルな値を変更してもこのバッファ内での値には影響しません。
M-x make-variable-buffer-localは、変数名を受け取り、
値が設定されるとその変数が自動的にローカルになるようにします。
もっと正確にいえば、このように特別な印を変数に付けておくと、
通常の方法で変数に値を設定するときにはつねにまず
make-local-variable
が実行されるようになるのです。
このような変数をバッファごとの変数と呼びます。
メジャーモード(see Major Modes)では、
変数を設定するまえにつねにローカルにします。
このため、あるバッファでメジャーモードを変更しても
他のバッファには影響が及びません。
マイナモード(see Minor Modes)も同様で、通常、
マイナモードごとにオン/オフを制御する変数があり、
その変数がnil
以外のときにそのマイナモードはオンになります。
ほとんどのマイナモードでは、その制御用変数はバッファごとの変数です。
Emacsには、つねにバッファごとの変数であるような変数が数多くあります。
abbrev-mode
、auto-fill-function
、case-fold-search
、
comment-column
、ctl-arrow
、fill-column
、
fill-prefix
、indent-tabs-mode
、left-margin
、
mode-line-format
、overwrite-mode
、
selective-display-ellipses
、selective-display
、
tab-width
、truncate-lines
がそのような変数です。
これ以外にもつねに各バッファでローカルな変数はありますが、
それらは内部作業用の変数です。
いくつかの変数はディスプレイに対してローカルになっているため、 バッファに対してローカルにはできません (see Multiple Displays)。 これらの変数をバッファにローカルにしようとすると、 エラーメッセージが表示されます。
M-x kill-local-variableは、変数名を受け取り、 その変数をカレントバッファに対してローカルでなくします。 それ以降そのバッファでは、その変数のグローバルな値が使われます。 メジャーモードを設定すると、つねにローカルと印が付いた少数の特別な 変数を除いて、そのバッファにローカルなすべての変数をローカルでなくします。
ある変数がカレントバッファでローカルか否かに係わらず
その変数のグローバルな値を設定したければ、setq-default
を使います。
これはsetq
のように使われますが、
(たとえローカルな値があったとしても)つねにグローバルな値のほうを設定します。
その変数がローカルな値を持っている場合、
新たに設定したグローバルな値は別のバッファに切り替えるまでは参照できません。
以下に例をあげます。
(setq-default fill-column 75)
setq-default
は、
make-variable-buffer-local
で印を付けた変数の
グローバルな値を設定する唯一の方法です。
Lispプログラム中では、変数のデフォルト値を参照するためには
default-value
を使えます。
この関数はシンボルを引数とし、その変数のデフォルト値を返します。
引数は評価されるので、普通は引数をクォートします。
たとえば、fill-column
のデフォルト値を取得するにはつぎのようにします。
(default-value 'fill-column)
Emacsでファイルを編集する際に、そのファイルに対応したローカル変数と その値を指定することができます。 Emacsはファイルを訪問すると、ローカル変数指定の有無を検査し、 あれば指定された変数を自動的にバッファにローカルにして、 その値をファイルで指定された値に設定します。
ローカル変数とその値を設定するには2つの方法があります。 1つはファイルの先頭行に書くことで、 もう1つはローカル変数リストを書くことです。 先頭行に書く場合は、たとえばつぎのようにします。
-*- mode: modename; var: value; ... -*-
変数とその値を「:」で区切った対を「;」で区切って並べ、
いくつでも指定できます。
mode: modename;
はメジャーモードを指定するもので、
行の最初にある必要があります。
valueは評価されずに書かれているとおりのまま使われます。
以下は、Lispモードで2つの変数に数値を設定する例です。
;; -*-mode: Lisp; fill-column: 75; comment-column: 50; -*-
この方法では、ファイルのコーディングシステムも指定できます。
つまり、coding
という名前の『変数』に値を指定すればよいのです。
『値』は、Emacsが認識できるコーディングシステム名である必要があります。
See Coding Systems。
一方、ローカル変数リストはファイルの末尾(最後のページ)に置きます。
(最後のページにはローカル変数リストだけを置くというのを勧めます。)
ローカル変数リストはLocal Variables:
という内容を含む行で始まり、
End:
という内容を含む行で終ります。
これらの行のあいだに、1つの変数につき1行ずつ、
variable: value
という形で変数の名前と値を指定します。
valueは評価されずにファイルに書かれたとおりにそのまま使われます。
ファイルにローカル変数リストと-*-
の行が両方含まれていた場合には、
Emacsはまず-*-
の行をすべて処理してから、
続いてローカル変数リストの内容をすべて処理します。
以下にローカル変数リストの例を示します:
;;; Local Variables: *** ;;; mode:lisp *** ;;; comment-column:0 *** ;;; comment-start: ";;; " *** ;;; comment-end:"***" *** ;;; End: ***
上の例では、各行は;;;
で始まり***
で終っています。
Emacsはこれらの接頭辞と接尾辞をリストの最初の内容に基づいて認識します。
つまり、特別な文字列Local Variables:
の前後の文字列を、
それぞれ、接頭辞、接尾辞とみなし、
それ以降の行についてはこの接頭辞と接尾辞を無視します。
接頭辞と接尾辞を使う主な理由は、
ローカル変数リストをコメントの中に入れることで、
そのファイルを読み込む他のプログラムを困惑させないようにすることです。
上の例では、コメントが;;;
で始まり***
で終るような言語を
想定しています。
変数comment-start
とcomment-end
のローカルな値で、
このような変な構文に対処するようにEmacsをカスタマイズするのです。
必要ないのであれば、接頭辞(と接尾辞)は使わないでください。
ローカル変数リストにおいては、2つの変数名が特別な意味を持ちます。
変数mode
に対する値は、実際にはメジャーモードを設定します。
変数eval
に対する値は、式として評価されますが、
その結果は捨てられます。
mode
とeval
は本当の変数ではなく、他の状況で
これらの名前の変数に値を設定してもなんら特別な意味を持ちません。
メジャーモードを設定するためにmode
を指定する場合は、
ローカル変数リストの先頭に書く必要があります。
仮想的な『変数』mode
は、メジャーモードだけでなくマイナモードを
設定するのにも使えます。
実は、この指定は2回以上使うことができて、
最初はメジャーモードを設定し、
それ以降は(それぞれ)マイナモードを設定します。
しかし、マイナモードはユーザーの好みに応じて選ぶものですから、
普通はファイルでマイナモードを指定するべきではないでしょう。
たとえば、ローカル変数リストで自動詰め込み(auto-fill)モードをオンにしたいと
思うかもしれませんが、それはまちがいです。
自動詰め込みにするかどうかは、個人の好みの問題であり、
ファイルの中身によって決まるものではないからです。
ある種別のファイルでいつも自動詰め込みにしたければ、
個人の.emacs
ファイルで(状況に応じて)自動詰め込み(auto-fill)モードを
オンにするようなメジャーモードのフックを設定してください
(see Init File)。
ローカル変数リストで他人に好みを押し付けてはいけません。
ローカル変数リストは、ファイルの末尾から3000文字以内にある必要があり、
ファイルがページに分かれている場合には最後のページにある必要があります。
これらが守られていないと、
Emacsはローカル変数リストがあることを認識しません。
これらの規則の目的は、最後ではないページに偶然
Local Variables:
があってもEmacsが誤認しないようにすることと、
全体が1ページでローカル変数リストを持たない長いファイルを訪問するときでも
ファイル全体を探さなくてもすむようにするためです。
バッファのローカル変数やメジャーモードを、
ローカル変数リストがあるときにはそれによる指定も含めて、
ファイル名とファイルの内容に基づいたものにリセットしたければ、
normal-mode
コマンドを使ってください。
See Choosing Modes。
変数enable-local-variables
は、
ファイル中のローカル変数指定を処理するか否かを制御します。
つまり、ローカル変数指定を無視するようにもできます。
デフォルトはt
で、ファイル中のローカル変数指定を処理します。
値をnil
にすると、ファイル中のローカル変数指定を無視します。
これら以外の値の場合は、ファイル中にローカル変数指定があると、
その内容を表示して処理するかどうか問い合わせます。
仮想的な『変数』eval
といくつかの(実在する)変数に対する指定は、
ある種の危険性をもたらします。
他人のファイルを訪問したとき、そこに書かれているローカル変数指定に
よってあなたが使っているEmacsのふるまいがどのようにでも変更できるからです。
このため、オプションenable-local-eval
により、
変数eval
、さらに、-hook
、-hooks
、-function
、
-functions
という名前で終る変数、および、他のいくつかの変数に
対するローカル変数指定を処理するかどうか制御できるようになっています。
enable-local-variables
と同じように指定できる値は3種類あって、
t
、nil
、これら以外です。
デフォルトはmaybe
で、これはt
でもnil
でもありませんから、
Emacsはこれらのローカル変数指定があるときは確認を求めてきます。
キーボードマクロは、 ユーザーが一連のキー操作に基づいて定義したコマンドです。 たとえば、C-n C-dという打鍵を40回繰り返す必要があるとわかったら、 C-n C-dを実行するキーボードマクロを定義し、 それを40回繰り返す指定をして呼び出すと迅速に作業できます。
start-kbd-macro
)。
end-kbd-macro
)。
call-last-kbd-macro
)。
kbd-macro-query
)。
edit-kbd-macro
)。
キーボードマクロは、それがLispではなくEmacsのコマンド言語で 記述されているという点で、通常のEmacsコマンドとは違っています。 このため、キーボードマクロは初心者でも簡単に作れ、 間に合わせとして定義するのにも向いています。 しかし、Emacsのコマンド言語は、 プログラム言語として知的で汎用的な動作を記述できるほど強力ではありません。 そういう場合には、Lispを使ってください。
キーボードマクロは、定義内容のコマンド列を実際に実行しながら定義できます。 いいかえれば、キーボードマクロを定義しているときに、 その定義の第1回目の実行が行われることになります。 ですから、コマンドがどのように動作するかを目で見ながら確認でき、 頭の中だけで動作を考えるよりも楽に定義できます。 コマンド列の最後まできてキーボードマクロを定義し終ると、 第1回目の実行も終ったことになります。 そのあとは、マクロを呼び出すことで何回でもそのコマンド列全体を実行できます。
キーボードマクロの定義を開始するには、C-x (コマンド
(start-kbd-macro
)を打ってください。
それ以降打鍵するものは通常どおり実行されますが、
それと同時にキーボードマクロの定義として取り込まれます。
モード行にもそのことを表すDef
という表示が現れます。
定義の終りまできたら、C-x )(end-kbd-macro
)を打ち込むと
キーボードマクロの定義が完了します
(C-x )はマクロの内容には含まれません!)。
たとえば、
C-x ( M-f foo C-x )
のように打鍵すると、
1単語分ポイントを前進させ文字列foo
をバッファに挿入する、
キーボードマクロを定義できます。
定義し終えたキーボードマクロは、
コマンドC-x e(call-last-kbd-macro
)で再実行できますし、
数引数として反復回数を指定することで多数回実行することもできます。
C-x )にも引数として反復回数を指定でき、
その場合は定義完了とともにただちに指定した回数だけ
キーボードマクロを実行しますが、
定義しているとき(実行しているので)を1回目の実行として数えます。
ですから、C-u 4 C-x )と打つと、キーボードマクロをただちに3回実行します。
C-x eやC-x )に反復回数0を指定すると、
キーボードマクロを無限回、つまり、エラーが発生するか、
C-g(MS-DOSではC-<BREAK>)が打鍵されるまで、
繰り返し実行します。
テキスト上の規則的にとびとびの位置に対して操作を行いたい場合には、 キーボードマクロを定義するときに、つぎに適用したい位置までポイントを 移動するコマンドを含めておきます。 たとえば、各行について変更を行いたければ、 ポイントを行頭に置いてからキーボードマクロを定義し始め、 最後にポイントをつぎの行の行頭に置いたところで定義を終えます。 キーボードマクロを繰り返し実行すると、 次々と連続する行に対して操作を実行できます。
キーボードマクロの定義を完了してしまったあとでも、 C-u C-x (を打ち込めば、その定義の末尾に内容を追加できます。 このコマンドは、C-x (に続いて現在のキーボードマクロの 定義内容全体を打鍵したのと同じ効果を持ちます。 その結果、定義されたとおりにマクロを再実行します。
キーボードマクロの中で、通常のキーと同様にファンクションキーを 使うこともできます。 マウスイベントを使うことさえできますが、その場合は注意してください。 キーボードマクロはマウスイベントを再現しますが、 マウス位置としては最初にキーボードマクロを定義したときの位置が そのまま使われます。 その結果は予想し難いものになります。 (現在のマウス位置を使っても、結果はさらに予想し難いものになる。)
キーボードマクロの中で必ずうまくいくとは限らないことの1つに、
C-M-c(exit-recursive-edit
)コマンドがあります。
このコマンドがマクロの中で開始させた再帰編集を終らせる場合には、
期待どおりに動くでしょう。
しかし、このコマンドがキーボードマクロを起動するまえに入っていた再帰編集を
終らせるとすると、
その終了処理の過程でキーボードマクロの実行も終らせてしまいます。
定義済みのキーボードマクロを編集するには、
C-x C-k(edit-kbd-macro
)と打ちます。
このコマンドに続けてマクロを起動する打鍵、つまり、
C-x eやM-x nameなどのキー列を入れます。
すると、キー列に対応するキーボードマクロの内容が整形されて
特別な編集用メジャーモードのバッファに入ります。
そのバッファ中でC-h mと打つと編集方法が表示されます。
編集し終えたらC-c C-cと打ちます。
コマンドM-x apply-macro-to-region-linesは最後に定義された キーボードマクロを現在のリージョンの各行に対して実行します。 つまり、各行について、行頭にポイントを置いてからキーボードマクロを実行します。
新たにつぎのキーボードマクロを定義したあとでも
現在のキーボードマクロを使いたいなら、
M-x name-last-kbd-macroでキーボードマクロに名前を
付けておく必要があります。
このコマンドは、ミニバッファで名前を読み取り、
その名前でキーボードマクロを実行できるように定義します。
マクロ名はLispシンボルであり、このように定義されているので、
M-xで呼び出したりglobal-set-key
(see Keymaps)でキーに対応付けたりできる有効なコマンド名になります。
その名前にキーボードマクロ以外のものがすでに定義されていると、
エラーメッセージが表示され何の変更も起こりません。
キーボードマクロにコマンド名を付けると、その定義をファイルに保存できます。 そうすると、別の編集セッションで使えるようになります。 まず、定義を保存したいファイルを訪問してから、 つぎのコマンドを使ってください。
M-x insert-kbd-macro <RET> macroname <RET>
このコマンドは、実行するとそのキーボードマクロと
同じ動作を行うLispコードをバッファに挿入します。
(insert-kbd-macro
がLispコードの生成を代行するので、
Lispコードを理解する必要はない。)
そうしたら、このファイルを保存します。
load-file
(see Lisp Libraries)でファイルをロードできます。
保存するファイルとして~/.emacs
(see Init File)を使えば、
Emacsを起動するとつねにそのマクロが定義されます。
insert-kbd-macro
に数引数を指定すると、
さらに(もしあれば)キーボードマクロに割り当てたキーを
記録するLispコードが追加されるので、
ファイルをロードしたときに同じキーがマクロに割り当てられます。
C-x q(kbd-macro-query
)を使うと、
query-replace
と同様に変更するかどうか尋ねてくる
キーボードマクロを作れます。
キーボードマクロを定義しているときに、問い合わせが起きてほしい箇所で
C-x qを打ちます。
マクロの定義中はC-x qは何の動作もしませんが、
あとでマクロを実行させたときにはC-x qの箇所で処理を
続けるかどうか尋ねてくるようになります。
C-x qの問い合わせに対する有効な応答は、<SPC>(またはy)、
<DEL>(またはn)、<RET>(またはq)、C-l、
C-rです。
これらの意味はquery-replace
と同じですが、
query-replace
のすべての応答が意味を持つとは限りません。
<SPC>は続行、<DEL>はこの回の反復の残りを飛ばしてただちにつぎの 反復に進むという意味になります。 <RET>ではこの回の反復の残りも以後の反復もすべて取り消します。 C-lは画面を再描画し、再度どうするかを問い合わせてきます。
C-rで再帰編集レベルに入るので、そこでキーボードマクロにはない 編集を行えます。 C-M-cで再帰編集から抜けると、再度どうするかを聞いてきます。 ここで<SPC>を打つと、キーボードマクロの残りの部分が実行されます。 キーボードマクロの残りの部分が望みどおりの動作をする状態に ポイントやテキストを保っておくのは、ユーザーの責任です。
C-u C-x q、つまり、数引数を指定したC-x qは、 まったく違った動作をします。 キーボードマクロの定義中でも実行中でも、 キーボードから入力を受け付ける再帰編集に入ります。 定義中の場合、再帰編集の中で行った操作はマクロの一部にはなりません。 実行中の場合、再帰編集の中で各反復ごとに個別の編集を行う機会が得られます。 See Recursive Edit。
本節では、コマンドをキーに対応付けるキーバインディングと、 キーバインディングを記録するキーマップについて説明します。 また、キーバインディングをカスタマイズする方法についても説明します。
コマンドとは、対話利用向けに定義されたLisp関数で あることを思い出してください。 コマンドには、他のLisp関数と同様、通常、英小文字とハイフンから成る 関数名前が付いています。
.emacs
.
キー列とコマンド関数との対応はキーマップと呼ばれる データ構造に保持されています。 Emacsには数多くのキーマップがあり、それぞれが特定の場面で使われます。
キー列(または単にキー)とは、 ひとまとまりの意味を持つ入力イベントの並びをいいます。 入力イベントは、文字、ファンクションキー、マウスボタン、 つまり、端末から計算機に送ることができるすべての入力から成ります。 キー列の意味付けは、どのコマンドを実行するかを表す バインディングによって決まります。 キーマップの役割は、これらのバインディングを保持することです。
グローバルキーマップはもっとも重要なキーマップですが、 それはグローバルキーマップがつねに有効だからです。 グローバルキーマップは基本(fundamental)モードのキーを定義します。 つまり、そこに含まれる定義の大部分は、ほとんどまたはすべての メジャーモードに共通のものです。 各メジャー/マイナモードは、グローバルキーマップの定義の一部を 置き換えるような独自のキーマップを持つことができます。
たとえば、gのような自己挿入文字を打つとその文字がバッファに
挿入されるのは、グローバルキーマップでこれらのキーが
self-insert-command
に対応付けられているからです。
また、C-aのような標準の編集コマンドも、
その意味付けはグローバルキーマップに書かれています。
M-x global-set-keyのようなバインディングを変更するコマンド群は、
グローバルキーマップの適切な箇所に新しいバインディングを書き込みます。
メタ文字はやや違った動作になります。 Emacsでは、メタ文字は<ESC>で始まる文字列に変換されます。 ですから、M-aという入力はつねにEmacsの中では <ESC> aに置き換えられて処理されます。 つまり、メタ文字は単一の入力イベントですが、 キーバインディングの観点では2つのイベントとして扱われます。 こうなっている理由は歴史的なもので、将来は変わる可能性もあります。
最近のほとんどのキーボードには、 文字キーの他にファンクションキーがあります。 ファンクションキーは文字キーと同様に入力イベントを送出し、 キーマップはそれに対応するバインディングを保持することができます。
多くの端末では、ファンクションキーを打つとコンピュータには 一連の文字列が送られます。 具体的にどのファンクションキーが どんな文字列を送るかは端末によってまちまちです。 (多くの場合、文字列は<ESC> [で始まる。) Emacsが使用中の端末種別を正しく認識していれば、 キー列(の先頭でだけでなく)に現れるファンクションキーに対応した 文字列を正しく判別できます。 ですから、多くの場合、ファンクションキーの打鍵も 1つの入力イベントとして直接Emacsに送られているとみなして、 文字列としての表現形式は無視してかまいません。
マウスボタンも入力イベントを発生させます。 これらのイベントには、追加データ、つまり、 ボタンを押したり放したりしたときのウィンドウとその中での位置、時刻 が付属しています。 ただし、キーバインディングに関しては、 どのボタンが使われたかだけが問題となります。 残りの情報は、コマンドがこれらの情報を参照する場合だけ意味を持ちます。 (通常、マウスから起動できるコマンドは、これらの情報を参照する。)
キーマップは1つのイベントに対する定義のみを保持します。 複数キーの列から成る複数のイベントの解釈には、 キーマップの連鎖が使われます。 最初のキーマップが最初のイベントの定義を保持し、 その定義がつぎのキーマップになっていて、 2番目のイベントの定義を保持し、というようになっています。
キー列にはファンクションキーと文字キーとが混ざっていてもかまいません。 たとえば、C-x <SELECT>というのも許されます。 <SELECT>をプレフィックスキーとして定義しておけば、 <SELECT> C-nというのも許されます。 マウスイベントとキーボードイベントを混ぜることさえ可能ですが、 そうすると打ち込むのが面倒ですからお勧めしません。
ユーザーはどんなキー列でも再定義して利用できますが、 C-cに続けて1文字というキー列だけを使うのが最善です。 このキー列は『ユーザー定義のために予約』されていて、 正しく設計されたEmacsの各種拡張とは衝突しないようになっているからです。 <F5>から<F9>までのファンクションキーも ユーザー定義のために予約してあります。 これ以外のキー列を再定義すると、 同じキーを再定義する拡張やメジャーモードによって あなたの定義が上書きされてしまう可能性があります。
C-xや<ESC>のようなプレフィックスキーは それぞれ専用のキーマップを持っていて、 そこにはそのプレフィックスキーに続くイベントの定義が保持されています。
プレフィックスキーの定義は、通常、それに続くイベントの定義を検索するための
キーマップです。
あるいは、プレフィックスキーの定義がLispシンボルであって、
その関数の定義がキーマップというのもあります。
どちらでも効果は同じですが、
後者では、プレフィックスキーにコマンド名を与えてその用途を示すことができます。
このため、C-xにバインドされているのは
シンボルCtl-X-Prefix
であり、
その関数定義はC-xコマンド群に対応するキーマップです。
C-c、C-x、C-h、<ESC>は
グローバルマップでプレフィックスキーとして定義されていますから、
これらはつねにプレフィックスキーとして使用できます。
通常のプレフィックスキーに加えて、 メニューバーを表す『仮想的なプレフィックスキー』があります。 メニューバーのキーバインディングに関する特別な点については Menu Barを参照してください。 ポップアップメニューを表示させるマウスボタンイベントもまた、 プレフィックスキーです。 こちらの詳細については Menu Keymapsを参照してください。
決まった変数に格納されているプレフィックスキーマップもあります。
ctl-x-map
はC-xに続くキーを探すためのマップを納めた変数名。
help-map
はC-hに続くキーを探すためのマップを納めた変数名。
esc-map
は<ESC>に続くキーを探すためのマップを納めた変数名。
つまり、すべてのメタ文字は実際にはこのマップで定義されている。
ctl-x-4-map
はC-x 4に続くキーを探すためのマップを納めた変数名。
mode-specific-map
はC-cに続くキーを探すためのマップを納めた変数名。
これまではグローバルキーマップの諸側面について説明しました。 メジャーモード固有のキーバインディングを ローカルキーマップに定義することで、 各メジャーモードはEmacsの動作を変更します。 たとえば、Cモードでは、 <TAB>をCのコードの現在行を字下げする機能に差し替えます。 バッファ内の一部のテキストで、 そのバッファのメジャーモードのかわりとなる固有のキーマップを 指定することもできます。
マイナモードもローカルキーマップを持てます。 その場合、マイナモードが生きているときには、 そのキーマップがメジャーモードのローカルキーマップ やグローバルキーマップに優先します。
Lispモードおよびその他のいくつかのメジャーモードの
ローカルキーマップは、そのモードを使っていないときでもつねに存在します。
これらのキーマップは、lisp-mode-map
などの変数に格納されています。
さほど頻繁に使われないメジャーモードの場合は、
そのモードがセッションの中で初めて起動されたときに
ローカルキーマップが作られます。
これは、メモリを節約するためです。
このようなモードのキーマップを変更したい場合には、
当該メジャーモードのモードフックを使う必要があります(以下を参照)。
すべてのマイナモードのキーマップは、あらかじめ作られています。 マイナモードのキーマップ作成を そのマイナモードが最初に起動されるまで遅延させる方法はありません。
ローカルキーマップでは、その中のあるキーの定義をプレフィックスキーマップと することで、そのキーをローカルなプレフィックスキーとして再定義できます。 そのキーがグローバルにもプレフィックスキーであると定義されているなら、 ローカルキーマップとグローバルキーマップの内容は実質的に統合され、 プレフィックスキーに続くイベントは両方のキーマップで検索されます。 したがって、あるモードのローカルキーマップがC-cを 別のキーマップとして定義し、 そのキーマップではC-zをコマンドとして定義すると、 これらによってC-c C-zのローカルな意味が与えられます。 しかし、これはC-cで始まる他のキー列には影響しません。 あるキー列が独自のローカルなバインディングを持たなければ、 グローバルなバインディングが意味を持つからです。
いいかえれば、Emacsが複数イベントから成るキー列を扱う方法は、 複数のキーマップから1つずつ、キー列全体に一致するバインディングを探すのです。 まず、マイナモードが生きていればそのキーマップを検索し、 つぎにメジャーモードのキーマップを検索し、 最後にグローバルキーマップを検索します。 これは厳密にはキーの検索動作とは違いますが、 通常の状況でどうなるか理解するには十分です。
メジャーモードのローカルバインディングを変更するには、
そのモードのローカルキーマップを変更する必要があります。
通常、そのためにはそのモードが最初に使われるまで待つ必要があります。
というのは、ほどんどのメジャーモードは
使われるまでキーマップを作成しないからです。
ですから、個人の~/.emacs
ファイルで
メジャーモードのバインディングを変更したければ、
そのモードのモードフックを使ってそのモードが最初に使われるまで
(変更を)遅らせる必要があります。
たとえば、texinfoモードを選択するtexinfo-mode
コマンドは
フックtexinfo-mode-hook
を実行します。
このフックを使ってC-c nとC-c pに対する
(有益ではないですが)ローカルバインディングを
texinfoモードに追加するには、つぎのようにします。
(add-hook 'texinfo-mode-hook '(lambda () (define-key texinfo-mode-map "\C-cp" 'backward-paragraph) (define-key texinfo-mode-map "\C-cn" 'forward-paragraph) ))
See Hooks。
ミニバッファも一群の専用ローカルキーマップを持っています。 それらには各種の補完や脱出コマンドが定義されています。
minibuffer-local-map
は通常の入力に使われる(補完なし)。
minibuffer-local-ns-map
も同様。
ただし、<SPC>は、<RET>と同様に、脱出動作である。
これは主にMocklispとの互換性のために使われる。
minibuffer-local-completion-map
は弱い補完に使われる。
minibuffer-local-must-match-map
は強い補完と慎重な補完に使われる。
Emacsのキーを再定義するには、キーマップの対応する項目を 変更すればよいのです。 グローバルキーマップを変更すると、その変更は (同じキーに対して独自のローカルな定義をしているメジャーモードを除く) すべてのメジャーモードに影響します。 あるいは、カレントバッファのローカルマップを変更すると、 同じメジャーモードを使っているすべてバッファに影響が及びます。
たとえば、Emacsを休止してログインシェルでコマンドを実行するかわりに、
Emacsバッファ内のサブシェルでコマンドを実行したいとします。
通常、(Xウィンドウシステムを使っていない場合)C-zは
関数suspend-emacs
にバインドされていますが、
つぎのようにこのキーをshell
にバインドすれば、
このキーでEmacs内の対話的サブシェルを起動するように変更できます。
M-x global-set-key <RET> C-z shell <RET>
global-set-key
はキー列に続けてコマンド名を読み取ります。
使いたいキーを打鍵すると、どのキーをバインドしたいのかを
確認するつぎのようなメッセージが表示されます。
Set key C-z to command:
同じ手順で、ファンクションキーやマウスイベントを再定義できます。 バインドすべきキーを指定するときに、 キーのかわりにファンクションキーを押したりマウスボタンをクリックしてください。
複数イベントから成るキーも単一イベントのキーと同様にして再定義できます。 Emacsは再定義すべきキー列が完成するまで(つまりプレフィックスキーではない キーが出てくるまで)イベントを読み続けます。 たとえば、keyとしてC-fを打てばそれで終りですから、 ミニバッファはただちにcmdを読む状態になります。 一方、C-xを打つとさらにその先のキーを読みます。 そこで4を打つと、さらにその先のキーが読まれる、というようになります。 たとえば、
M-x global-set-key <RET> C-x 4 $ spell-other-window <RET>
では、C-x 4 $を(実在しない)コマンドspell-other-window
に
バインドします。
C-cに続けて英字という2文字のキー列は、 ユーザーのカスタマイズ用に予約されています。 Lispプログラムはこれらのキー列を定義しないことになっていますから、 これらのキー列のバインディングはどのメジャーモードでも使え、 いかなる機能とも干渉しないはずです。
global-unset-key
でキーのグローバルな定義を取り除けます。
そのキーは未定義になります。
未定義のキーを打つと、Emacsはベルを鳴らします。
同様に、local-unset-key
は現在のメジャーモードでキーを
未定義にしますから、グローバルな定義(あるいはグローバルでの未定義状態)が
現在のメジャーモードでふたたび有効になります。
キーを再定義(または未定義に)して、あとでもとに戻したいと思った場合、 キーを未定義にしてももとには戻りません。 キーの標準定義を設定し直す必要があります。 キーの標準定義を調べるには、基本(fundamental)モードのバッファに いってC-h cを使います。 本書のキーの説明にもコマンド名を掲載してあります。
まちがって、あるコマンドを実行することを防ぎたければ、 キーを未定義にするのでなく、コマンドを使用禁止にするのがよいでしょう。 必要になったときに使用禁止コマンドを起動するのは造作もありません。
いつでもあるキーバインディングを設定しておきたければ、
その指定を個人の.emacs
ファイルにLispのコードとして書いておきます。
これを行うもっとも簡単な方法は、
ASCII文字とメタ修飾付きのASCII文字に対してのみ使えます。
たとえば、C-zをshell
にバインドするにはつぎのようにします。
(global-set-key "\C-z" 'shell)
この例では1つの文字C-zから成る文字列定数を指定しています。
コマンド名shell
のまえのクォート「'」は、
shell
を変数ではなく定数シンボルとして扱う印です。
クォートがないと、Emacsはshell
を変数として
その値をただちに評価しようとします。
すると、望んでいることではなく、エラーになります。
つぎは、2文字のキー列をバインドする例です。
(global-set-key "\C-xl" 'make-symbolic-link)
キー列にファンクションキーやマウスボタンイベントが含まれていたり、
C-=
やH-a
などの非ASCII文字が含まれているなら、
文字列よりもっと一般的な指定方法であるベクタを使った指定を使う必要があります。
Emacs Lispでのベクタの書き方は、その要素を中括弧([...]
)で
囲みます。
要素は空白で区切ります。
要素がシンボルであれば、単にその名前だけを書けばよく、
区切り記号などは不要です。
要素が文字であれば、Lispの文字定数として、
つまり?
に続けてその文字が文字列中に現れるのと同じ書き方で、
書いてください。
ベクタを使ってC-=(ASCIIの範囲にないコントロール文字)、 H-a(ハイパー文字。ASCIIにはハイパー文字は含まれない)、 <F7>(ファンクションキー)、 C-Mouse-1(キーボード修飾付きのマウスボタン)を バインドする例を示します。
(global-set-key [?\C-=] 'make-symbolic-link) (global-set-key [?\H-a] 'make-symbolic-link) (global-set-key [f7] 'make-symbolic-link) (global-set-key [C-mouse-1] 'make-symbolic-link)
単純な(文字列ですむ)場合にベクタを使ってもかまいません。 先の2つの例をベクタを使うように書き直すとつぎのようになります。
(global-set-key [?\C-z] 'shell) (global-set-key [?\C-x ?l] 'make-symbolic-link)
キー列には通常の文字以外にもファンクションキーを含めることができます。 キーボードの文字がLispの文字(実は整数です)で表されるのに対し、 ファンクションキーはLispシンボルで表されます。 ファンクションキーに単語のラベルが付いているなら、 その単語が対応するLispシンボルの名前になります。 たとえば普通に見られるファンクションキーとLispシンボルの対応はつぎのとおりです。
left
, up
, right
, down
begin
, end
, home
, next
, prior
select
, print
, execute
, backtab
insert
, undo
, redo
, clearline
insertline
, deleteline
, insertchar
, deletechar
f1
, f2
, ... f35
kp-add
, kp-subtract
, kp-multiply
, kp-divide
kp-backtab
, kp-space
, kp-tab
, kp-enter
kp-separator
, kp-decimal
, kp-equal
kp-0
, kp-1
, ... kp-9
kp-f1
, kp-f2
, kp-f3
, kp-f4
これらの名前は習慣的なものですが、システムによっては (とりわけXウィンドウシステムを使っている場合は)、 別の名前になっている場合があります。 あるファンクションキーにどのシンボルが対応しているか調べるには、 C-h cに続いてそのキーを打鍵してください。
ファンクションキーのシンボルを含むキー列(あるいは、
ASCII以外の文字を含むもの)は文字列ではなくベクタで指定してください。
ベクタの構文では要素と要素のあいだは空白で区切り、
全体を中括弧
で囲みます。
たとえば、ファンクションキー[...]
f1
をコマンドrmail
にバインドするには、
つぎのようにします。
(global-set-key [f1] 'rmail)
右矢印キーをコマンドfowared-char
にバインドするには、
つぎのようにします。
(global-set-key [right] 'forward-char)
これは、シンボルright
を要素とするベクタのLisp構文です。
(このバインディングはEmacsのデフォルト設定に入っている。)
ベクタを用いたキーの再定義ついてより詳しくは、See Init Rebinding。
キー列の中でファンクションキーと文字を混ぜることができます。
以下の例は、
C-x <NEXT>をコマンドforward-page
にバインドしています。
(global-set-key [?\C-x next] 'forward-page)
ここで、?\C-x
はLispの文字定数で、文字C-xを表します。
ベクタのもう1つの要素であるnext
は、シンボルですから?
は不要です。
ファンクションキーに対して、修飾キー<CTRL>、<META>、<HYPER>、
<SUPER>、<ALT>、<SHIFT>を指定できます。
これらの修飾キーを指定するには、シンボル名のまえにC-
、
M-
、H-
、s-
、A-
、S-
を付けてください。
たとえば、Hyper-Meta-<RIGHT>で
1語先へ移動するにはつぎのように指定します。
(global-set-key [H-M-right] 'forward-word)
<TAB>、<RET>、<BS>、<LFD>、<ESC>、<DEL>は もともとASCIIの特定のコントロール文字に対応していたのですが、 よく使われるため別にそれ専用のキーを持つようになりました。 のちに人々はEmacsでこれらのキーとそれらと『同じ』文字を <CTRL>キーと組み合わせて打鍵した場合とを区別できると 便利だと気がつきました。
EmacsではXウィンドウシステムを使っている場合、
これら2種類の入力を区別します。
つまり、キーボード上の特殊キーの方はtab
、return
、
backspace
、linefeed
、escape
、
delete
という名前のファンクションキーとして扱うのです。
これらのファンクションキーは、もしそれ固有のバインディングが
指定されていなければ、自動的に対応するASCII文字に変換されます。
その結果、特にこの2種類を区別したいと思わない限りは、
ユーザーもLispプログラムもこれらの区分について気にする必要はありません。
(たとえば)<TAB>とC-iを区別したくないなら、
ASCII文字<TAB>(8進コード011)に対応するバインディング1つだけを
指定してください。
区別したいのなら、このASCII文字に対するバインディングに加えて、
『ファンクションキー』tab
に対するバインディングも指定します。
通常のASCII端末では、<TAB>とC-i (および上記の対応する組のそれぞれ)を区別する方法はありません。 というのは、端末はどちらが押されても同じ文字を送出するからです。
アクセント付き文字などの非ASCII文字を送出するキーがあるキーボードでは、
それらのキーの再定義には、少々トリックが必要です。
2つの解決方法があります。
1つめは、set-keyboard-coding-system
(see Specify Coding)を
使って、キーボードのコーディングシステムを指定することです。
そうすれば、つぎのように書いて、
通常の方法でそれらのキーを再定義できます。
(global-set-key [?char] 'some-function)
ただし、charを挿入するには、定義したいキーを打ちます。
キーボードのコーディングシステムを指定しないと、 上のようにはできません。 そのかわりに、端末が実際に送出するコードを調べる必要があります。 Emacsでこれを簡単に行うには、 C-x b temp <RET>で空バッファを作成し、 M-x toggle-enable-multibyte-characters <RET>でユニバイトに してから、このバッファに文字を挿入するキーを打ちます。
文字のまえにポイントを移動して、C-b C-x =と打ちます。 8進数、10進数、16進数の3通りで表した文字コードを括弧で括った メッセージがミニバッファに表示されます。 定義するには、3つの数字の2番目、つまり、10進数を ベクタの中に書きます。
(global-set-key [decimal-code] 'some-function)
Emacsではマウスボタンを表すのにもLispシンボルを使います。 Emacsのもっとも一般的なマウスイベントはクリック(click)イベントです。 これはマウスボタンを押して、マウスを移動せずにボタンを放したときに発生します。 ボタンを押した状態でマウスを移動すると ドラッグ(drag)イベントになります。 そして最後にマウスボタンを放したときにも、 やはりドラッグイベントが発生します。
基本的なクリックイベントに対応するシンボルは、
左ボタンに対してはmouse-1
、
左から2番目のボタンに対してはmouse-2
、などとなっています。
2番目のボタンをクリックしたときカレントウィンドウを分割するには、
つぎのように設定します。
(global-set-key [mouse-2] 'split-window-vertically)
ドラッグイベントについても同様ですが、
イベント名のmouse
のまえにdrag-
が付きます。
たとえば、第1ボタンを押したままドラッグすると
drag-mouse-1
イベントが発生します。
マウスボタンが押されたときに発生するイベントに対して
バインディングを指定することもできます。
これらのイベントはdrag-
のかわりにdown-
で始まります。
これらのイベントはキーバインディングが定義されているときだけ生成されます。
down-
イベントのあとには、必ず、
対応するクリック/ドラグッイベントが発生します。
必要ならば、シングルクリック/ダブルクリック/トリプルクリックを
区別することもできます。
ダブルクリックとは、ほぼ同じ位置でマウスボタンを2回クリックすることです。
最初のクリックで通常のクリックイベントが発生します。
最初のクリックから十分短い時間内に2回目のクリックが起こると、
クリックイベントではなくダブルクリックイベントが発生します。
ダブルクリックイベントは、double-
で始まります。
たとえば、double-mouse-3
です。
つまり、同じ場所で2回クリックがあったとき、 2回目のクリックに特別な意味を与えることはできますが、 ただし最初のクリックで発生する通常のシングルクリックに 対して定義された動作も実行されることを前提としなければなりません。
このような制限のため、ダブルクリックで行えることが制約されますが、 ユーザーインターフェイスデザイナは、よいユーザーインターフェイスが つねにそのような制約に従うべきだとの考えを述べています。 つまり、ダブルクリックはシングルクリックと類似した動作をすべきであり、 『それよりいくらか多く』の動作をするのがよい、ということです。 そして、ダブルクリックイベントに対応するコマンドがその 「いくらか多く」のぶんの動作を行うべきだということです。
ダブルクリックイベントに対してバインディングが定義されていなければ、 ダブルクリックは2つのシングルクリックとして扱われます。 その結果、シングルクリックに対応するコマンドが2回実行されることになります。
Emacsではさらにトリプルクリックイベントも使えます
(その場合、名前はtriple-
で始まる)。
しかし4重クリックをイベントタイプとして区別しません。
ですから、3回目以降の連続したクリックは、
すべてトリプルクリックイベントとして報告されます。
ただし、連続したクリックの回数はイベントリストに記録されていますから、
本当に4重以上のクリックを区別したければそうすることもできます。
4重以上のクリックに特別な意味を与えるのはお勧めできませんが、
4回だと1回と同じ、5回だと2回と同じというように3つの選択肢のあいだで
巡回できるようにするのは場合によっては有効かもしれません。
Emacsはまた、ドラッグやボタンイベントでも複数回の押し下げを記録します。
たとえば、ボタンを2回押してからそのままマウスを移動した場合、
Emacsはdouble-drag-
で始まるイベントを生成します。
ドラッグでなくボタンを押し下げただけの場合は同様に、
double-down-
で始まるイベントを生成します
(ただし、他のボタンイベントと同様に、そのイベントに対する
バインディングがなければ無視される)。
変数double-click-time
は、どれくらいの時間間隔内であれば
2つの隣接するクリックをダブルクリックとみなすかを指定します。
単位はミリ秒です。
値がnil
であれば、ダブルクリックを検出しません。
値がt
であれば、時間間隔の上限はないものとして扱います。
マウスイベントに対応するシンボルにはさらに、
C-
、M-
、H-
、s-
、A-
、
S-
の各プレフィックスで、修飾キーの情報も組み込めます。
順番は、プレフィックスに続いてdouble-
やtriple-
があり、
そのあとがdrag-
やdown-
ということになります。
フレームには、モード行やスクロールバーなどの
バッファ中のテキストを表示する以外の部分もあります。
マウスイベントがこれらの特別な部分で発生したものかどうかを調べるために、
ダミーの「プレフィックスキー」があります。
たとえば、マウスがモード行でクリックされた場合、
まずmode-line
というプレフィックスキーが送られ、
続いて通常のマウスボタンに対応したイベントが送られます。
ですから、モード行で第1ボタンがクリックされたときに
scroll-up
を実行するにはつぎのようにします。
(global-set-key [mode-line mouse-1] 'scroll-up)
ダミーのプレフィックスキーとその意味はつぎのとおりです。
mode-line
vertical-line
vertical-scroll-bar
1つのキー列の中に2つ以上のマウスボタンイベントを含めることもできますが、 普通はあまりしないでしょう。
コマンドを使用禁止にすると、コマンドの実行にはユーザーの確認が必要になります。 コマンドを使用禁止にする目的は、 初心者がそのコマンドをまちがって実行してしまい、混乱するのを防ぐためです。
Emacs上で使用禁止コマンドを対話的に実行しようとすると、
コマンド名、説明文、とりあえずどうすべきかの指示を
表示したウィンドウが現れます。
つぎにEmacsはコマンドを実行するか、使用禁止を解除してから実行するか、
実行を取り消すかを問い合わせてきます。
コマンドの使用禁止を解除することを選ぶと、
Emacsさらに、以後恒久的にそうするのか、
または現在のセッション内だけそうするのかも問い合わせてきます。
恒久的に使えるようにすると、
自動的に個人の.emacs
ファイルを編集します。
コマンドを使用禁止にする機構は、
コマンドに対応するLispシンボルの属性disabled
に
nil
以外の値を設定することです。
これを行うLispプログラムはつぎのようになります。
(put 'delete-region 'disabled t)
属性disabled
の値が文字列であれば、
コマンドを使用しようとしたときに表示される
メッセージにその文字列も含まれるようになります。
(put 'delete-region 'disabled "It's better to use `kill-region' instead.\n")
コマンドを使用禁止にするには、.emacs
ファイルを直接編集するか、
かわってこのファイルを編集するコマンドM-x disable-commandを使います。
同様に、コマンドM-x enable-commandは、
.emacs
ファイルを編集してコマンドを恒久的に使える状態にします。
See Init File。
コマンドが使用禁止であるかどうかは、 そのコマンドを起動するキー列には無関係です。 したがって、M-xでそのコマンドを起動しても Emacsはその可否を問い合わせてきます。 Lispプログラムからコマンドを関数として呼び出す場合には 使用禁止にしても何の効果もありません。
キーボードの機種によっては、Emacsが使用するすべての特殊文字を 送ってくれないものがあります。 もっともよくある問題は、<DEL>文字に関するものです。 いくつかのキーボードでは、 このきわめて重要な文字を簡単に打ち込む手段がありません。 それは、削除にはC-hを使うことを前提としているからです。 そのようなキーボードで削除のためのキーを打つと、 Emacsはそれをプレフィックス文字C-hとして解釈し、 どのヘルプ機能を使うか問い合わせてきてしまいます。 それはユーザーがしたかったことではありません。
Emacs内でこの問題を回避するには、C-hを<DEL>に、 <DEL>をC-hに変換するキーボード変換を 以下のように 設定することで回避できます。
;; C-hを<DEL>に変換する。 (keyboard-translate ?\C-h ?\C-?) ;; <DEL>をC-hに変換する。 (keyboard-translate ?\C-? ?\C-h)
キーボード変換はキーマップによるキーバインディング(see Keymaps)と 同じではありません。 Emacsには状況ごとに使い分けられる多数のキーマップがあるのに対し、 キーボード変換は一式だけしかなく、 Emacsが端末から読むすべての文字に対してその変換が適用されます。 キーボード変換は入力処理のいちばん下位のレベルで行われ、 キーマップ上の検索はキーボード変換を施した結果に対して行われます。
Xウィンドウシステムでは<DELETE>というキーはファンクションキーであり、 ASCII文字<DEL>とは別ものです。 See Named ASCII Chars。 キーボード変換はASCII文字入力だけに適用され、 ファンクションキーとは無関係ですから、 Xウィンドウシステムでは上の例は<DELETE>キーに対して効果をもたらしません。 しかし、Xウィンドウシステムでは上のようなキーボード変換そのものが不要です。 というのは、EmacsはXウィンドウシステムでは <BACKSPACE>キーとC-hも区別でき、 通常、<BAKSPACE>を<DEL>として扱うからです。
キーボード変換の使い方に関する詳しい情報は、 Translating Inputを 参照してください。
単語や対応した括弧の対を認識するEmacsコマンドはすべて、 構文テーブル(syntax table)によって制御されます。 構文テーブルは、どの文字が開き括弧で、どの文字が単語の中身で、 どの文字がシングルクォートかといったことを記述しています。 各メジャーモードにはそれぞれ専用の構文テーブルがあり (ただし、互いに関係のあるメジャーモードが 1つの構文テーブルを共用することはある)、 各バッファごとにそのときのメジャーモードの構文テーブルが使われます。 カレントバッファに設定されている構文テーブルはすべてのコマンドが使うので、 以下ではこれを『現在の』構文テーブルと呼びます。 構文テーブルは文字テーブル(char-table)型のLispオブジェクトであり、 その要素は数値です。
現在の構文テーブルの内容に関する記述を表示するには、
C-h s(descirbe-syntax
)を使います。
記述の表示には各文字ごとに、
その文字の現在の構文を設定するためにmodify-syntax-entry
に
渡すべき文字列、および、その文字列の英語での説明が含まれます。
構文テーブルに関する詳しい情報については、 Syntax Tablesを 参照してください。
~/.emacs
Emacsが実行を開始するとき、通常はユーザーのホームディレクトリにある
ファイル.emacs
や.emacs.el
からLispプログラムをロードします。
このファイルがEmacsの初期化の仕方を指定するので、
このファイルのことを初期化ファイル(init file)と呼びます。
コマンド行オプション-q
で、
Emacsに初期化ファイルを読まないことを指示したり、
-u
(あるいは--user
)で、
別のユーザーの初期化ファイルを指定できます
(see Entering Emacs)。
デフォルトの初期化ファイルもあります。
これはdefault.el
という名前のライブラリファイルで、
Emacsはライブラリ探索パスをとおしてその場所を探します。
Emacsの配布にはdefault.el
は含まれていません。
ローカルなカスタマイズのためにサイトでdefault.el
を
用意することもあります。
このファイルがあれば(-q
を指定したときを除いて)
Emacsを開始するときつねにロードされます。
しかし、あるならば個人の初期化ファイルが最初にロードされます。
その中でinhibit-default-init
にnil
以外の値を設定すると、
default.el
はロードされません。
各サイトにはサイトスタートアップファイルがあるかもしれません。
あるならば、このファイルの名前はsite-start.el
です。
Emacsはユーザーの初期化ファイルを読むまえにこのファイルもロードします。
このファイルのロードを抑止するには、
オプション-no-site-file
を指定します。
.emacs
に大量のコードがある場合には、
~/.emacs.el
と改名してバイトコンパイルしておくべきです。
Emacs Lispプログラムのコンパイルについてより詳しくは、
See Byte Compilation。
単なるカスタマイズを超えるような実際のEmacsプログラムを書くのであれば、 The Emacs Lisp Reference Manual57を読むべきです。
ファイル.emacs
にはLispの関数呼び出し式を書きます。
関数呼び出しは、関数名に続けて引数リストを並べ、全体を括弧で囲みます。
たとえば、(setq fill-column 60)
は、
関数setq
によって、変数fill-column
(see Filling)に
60を設定します。
setq
の2番目の引数は変数の新しい値を表す式です。
これは、定数でも、変数でも、関数呼び出し式でもかまいません。
.emacs
ファイルでは定数を使うことがもっとも多いでしょう。
定数にはつぎのものがあります。
文字列の中には、改行や特殊文字をそのまま入れることができる。
しかし、バックスラッシュで始まる形式、つまり、
改行は\n
、バックスペースは\b
、
復帰は\r
、タブは\t
、ページ送りは\f
(コントロールL)、
エスケープは\e
、バックスラッシュは\\
、
ダブルクォートは\"
、8進コードoooの文字は\ooo
で
表すことができ、そのほうが読みやすい。
バックスラッシュとダブルクォートの2つだけは、
文字列に含めるのに必ずこのような形で書き表す必要がある。
\C-
はコントロール文字を表すプレフィックスとして使用できる。
たとえば、\C-s
でASCIIのコントロールSを表す。
同様に、\M-
はメタ文字を表すプレフィックスとして使用できる。
たとえば、\M-a
でMeta-A、
\M-\C-a
でControl-Meta-Aを表す。
?
に続けて文字または\
で始まる
エスケープシーケンスを書いたもの。
たとえば、?x
、?\n
、?\)
などは文字定数。
Lispでは文字と文字列は別ものなので注意すること。
ある場面では文字列が必要であり、別の場面では文字が必要である。
t
は「真」を表す。
nil
は「偽」を表す。
以下にはよく使われるLispの式の例をあげておきます。
(setq c-tab-always-indent nil)
変数の値を「真」にするにはt
を設定し、
逆に「偽」にするにはnil
を設定する。
(setq-default case-fold-search nil)
ここではsetq-default
で変数のデフォルト値を設定し、
その変数に対してローカルな値を設定していないすべてのバッファで有効である。
setq
でcase-fold-search
に値を設定すると、
カレントバッファのローカルな値だけに影響し、
初期化ファイルで記述したいこととは異なるだろう。
(setq user-mail-address "coon@yoyodyne.com")
メイルアドレスを必要とする多くのEmacsパッケージは、
user-mail-address
の値を使う。
(setq default-major-mode 'text-mode)
text-mode
を指定しているのは、
これがテキストモードに入るためのコマンドだから。
コマンド名のまえのシングルクォートは、シンボルを定数として扱うため。
さもないとtext-mode
という変数を参照することになってしまう。
(set-language-environment "Latin-1")
(add-hook 'text-mode-hook '(lambda () (auto-fill-mode 1)))
これはノーマルフック変数(see Hooks)にフック関数を追加する例。
ここでは関数としてlambda
で始まるリストを指定し、
シングルクォートを前置して式ではなく定数として扱わせる。
Lispの関数について説明するのは本書の範囲外だが、
この例を理解するには、テキストモードに入るときに
(auto-fill-mode 1)
が実行されるのだと考えておけば十分。
この式を別の式に変えたり、式を複数並べてもかまわない。
Emacsにはturn-on-auto-fill
という関数が用意されており、
その定義は(lambda () (auto-fill-mode 1))
になっている。
したがって、上の例をもっと簡単に書くとつぎのようになる。
(add-hook 'text-mode-hook 'turn-on-auto-fill)
foo
(実際には標準Emacsディレクトリに置かれたファイルfoo.elc
またはfoo.el
)をロードする。
(load "foo")
load
に渡す引数が相対ファイル名、つまり、
/
や~
で始まらない場合には、
load
はload-path
(see Lisp Libraries)の
ディレクトリ群を順に探索する。
foo.elc
を
ロードする。
(load "~/foo.elc")
ここでは絶対ファイル名が使われているので、探索は行わない。
make-symbolic-link
が実行されるように
バインディングを設定する。
(global-set-key "\C-xl" 'make-symbolic-link)
または
(define-key global-map "\C-xl" 'make-symbolic-link)
ここでもシンボルmake-symbolic-link
を変数としての値ではなく
定数とするためにシングルクォートが使われていることに注意。
(define-key lisp-mode-map "\C-xl" 'make-symbolic-link)
next-line
を
実行するようになっているすべてのキーを、
かわりにforward-line
を実行するように直す。
(substitute-key-definition 'next-line 'forward-line global-map)
(global-unset-key "\C-x\C-v")
キーを未定義にする必要のある場合の1つとして、 そのキーをプレフィックスにしたい場合がある。 たとえば、C-x C-v anythingを定義すると、 C-x C-vは自動的プレフィックスになるが、 しかしそのまえにC-x C-vの通常の(プレフィックスではない)定義を 未定義に戻しておく必要がある。
$
をテキスト(text)モードでの区切り文字にする。
$
を文字定数として指定していることに注意。
(modify-syntax-entry ?\$ "." text-mode-syntax-table)
narrow-to-region
を確認なしに使えるようにする。
(put 'narrow-to-region 'disabled nil)
各端末種別ごとに、Emacsがその端末で動くときにロードするライブラリを
指定できます。
つまり、termtypeという名前の端末でEmacsを起動するときには、
term/termtype
というライブラリがロードされます。
ライブラリの探索は通常どおり
load-path
の各ディレクトリに対して行われ、
ファイルの拡張子は.elc
か.el
です。
通常、これらのライブラリはほとんどの
Emacsライブラリを収めたディレクトリの下のterm
という
サブディレクトリに置かれます。
端末固有のライブラリの普通の用途は、端末のファンクションキーによって
送出されるエスケープシーケンスをfunction-key-map
を使って意味の
ある名前に対応付けることです。
このような設定を行うファイルの例として、たとえば
ファイルterm/kl201.el
を見てみてください。
多くのファンクションキーはtermcapデータベースの情報に
基づいて自動的に対応付けがなされます。
端末固有ライブラリでは、termcapで指定されていないファンクションキー
だけを対応付ければよいのです。
端末種別にハイフンが含まれている場合は、
ライブラリ名の選択には最初のハイフンよりまえの部分だけが使われます。
つまり、端末種別aaa-48
とaaa-30-rv
では、
どちらもterm/aaa
をロードします。
ライブラリ中のコードでは(getenv "TERM")
を
使って必要なら完全な端末種別名を取得できます。
端末ライブラリの名前は、変数term-file-prefix
と端末種別とを
連結して作られます。
ファイル.emacs
中でterm-file-prefix
を
nil
に設定すると端末ライブラリのロードを抑止できます。
Emacsは.emacs
と端末ライブラリを読んだあと、
初期化の最後にフックterm-setup-hook
を実行します。
端末ライブラリによる指定を一部変更したり、
端末ライブラリがない端末の初期設定を行いたければ、
このフックにフック関数を追加してください。
See Hooks。
通常、Emacsは環境変数HOME
に基づいて.emacs
を探し、
ファイル名の~
の意味を定めます。
しかし、su
を実行したあとでは、Emacsは(su実行前の)
もとのユーザーの.emacs
を読もうとし、
suした先のユーザーのではありません。
これは、たとえスーパーユーザーになっているとしても、
本来のユーザー独自のエディタのカスタマイズを使うべきだと考えるからです。
より正確には、Emacsはまずどのユーザーの初期化ファイルを使うかを決めます。
それにはまず環境変数LOGNAME
およびUSER
からユーザー名を取得します。
これらの環境変数がみつからなければ、Emacsは実効ユーザーIDを参照します。
ユーザー名と実ユーザーIDが一致すれば、EmacsはHOME
を利用します。
一致しない場合は、システムのユーザーデータベースから
そのユーザー名に対応するホームディレクトリを探して使用します。
abort-recursive-edit
)。
keyboard-escape-quit
)。
undo
)。
実行を完了していないコマンドを取り消すには、2つの方法があります。 1つはC-gで中断すること、 もう1つはC-]やM-x top-levelで アボートすることです。 中断とは、打鍵途中のコマンドや動作中のコマンドを取り消すことをいいます。 アボートとは、再帰編集レベルから抜け出し、かつ、 その再帰編集レベルを起動したコマンドを取り消すことをいいます (see Recursive Edit)。
C-gでの中断は、打鍵途中のコマンドや 不要な数引数を打ってしまったときにとりやめるのに使います。 また、実行途中のコマンドを比較的安全な方法で止めますから、 長時間かかるコマンドをうっかり始めてしまったときにも使えます。 特に、キル操作を中断しても安全です。 テキストは、まだすべてバッファ内にあるか、 または、すべてキルリングに入っている (あるいは、その両方に入っている)からです。 なお、インクリメンタルサーチを中断する場合には、 文字列探索のところで説明してあるように、特別な動作を行います。 一般には、サーチから抜け出すにはC-gを2回連打する必要があります (see Incremental Search)。
MS-DOSでは、C-<BREAK>はC-gと同様に中断として働きます。 MS-DOSでは、コマンドの実行中にユーザーとのやりとりを行う状態にないときには、 C-gを検出できないからです。 これに対して、C-<BREAK>はつねに認識できます。 See MS-DOS Input。
C-gはつぎのように動作します。
C-gが打鍵されると変数quit-flag
にt
が設定されます。
Emacs Lispはこの変数を頻繁に調べ、値がnil
以外だと中断処理を行います。
C-gが実際にコマンドとして実行されるのは、
Emacsが入力待ち状態にあるときにC-gを打った場合だけです。
最初のC-gが認識されないうちに2つめのC-gを打って中断すると、 『緊急脱出』機能を発動したことになりシェルに戻ります。 See Emergency Escape。
中断できない場合もありえます。 Emacsがオペレーティングシステムに何かを頼んで待っているときには、 待ち状態を起こしたシステムコールを使ったEmacs側で特別な手当てをしない限り 中断できません。 Emacsでは、ユーザーが中断しそうなシステムコールには 手当てを施してありますが、手当てしていない場所を叩く可能性はあります。 よくあるのは、NFS経由の入出力を待っているときです。 Emacs側ではこれを中断する方法はわかっているのですが、 多くのNFSの実装では、NFSサーバーが固まったときにユーザープログラムが NFSの待ちを中断することを許していないのです。
C-]によるアボート(abort-recursive-edit
)は、
再帰編集レベルから脱出し、かつ、その再帰編集レベルを
起動したコマンドを取り消すのに使います。
C-gによる中断はこのような目的には使えませんし、
このようなことはできません。
というのは、C-gは、ある再帰編集レベルの中で
打ちかけたコマンドを取り消すのに使うからです。
どちらの操作も必要なものです。
たとえば、再帰編集中に数引数を入力しようとしてC-u 8と打鍵した場合、
C-gで数引数を取り消しても再帰編集に留まったままです。
コマンド<ESC> <ESC> <ESC>
(keyboard-escape-quit
)は、中断かアボートのいずれかを行います。
このキーを使うのは、多くのPCのソフトで<ESC>が
『抜け出す』の意味に使われているからです。
C-gと同様に、数引数を取り消したり、
選択したリージョンをクリアしたり、問い合わせ型置換操作から抜け出します。
C-]と同様に、ミニバッファや再帰編集から抜け出します。
また、C-x 1のように、フレームを複数ウィンドウに分割しているのを
やめることもできます。
しかしながら、実行中のコマンドを止めることはできません。
なぜなら、このコマンドは普通のコマンドとして実行されるので、
Emacsがコマンドを読み込む状態にならないとこのコマンドを認識しないからです。
コマンドM-x top-levelは、現在入っているすべての再帰編集レベルから 抜け出すのに『十分な』数のC-]と同等です。 C-]は一度に1レベルだけ抜け出すのに対し、 M-x top-levelはすべてのレベルを一気に抜け出します。 C-]もM-x top-levelも他のコマンドと同様の普通のコマンドですから、 C-gとは違って、Emacsがコマンドを受け付ける状態のときだけ動作します。 C-]は普通のキーであり、キーマップにそのバインディングがあるので そのように動作するのです。 See Recursive Edit。
C-x u(undo
)は、正確にいえばコマンドを
取り消すわけではありませんが、
動作を完了してしまったコマンドを取り消すものと考えることができます。
See Undo。
本節では、Emacsが正常に動作し損なうさまざまな条件と、それらの見分け方、 直し方について説明します。
<DEL>が文字を削除するかわりにControl-hのように ヘルプに入ってしまう場合には、 使っている端末が<DEL>に対してまちがった文字コードを送出しています。 この問題に対処するには、キーボード変換表を変更します (see Keyboard Translations)。
再帰編集レベルはEmacsの重要で有用な機能ですが、 それについて理解していない人にとっては、誤動作に見える可能性があります。
モード行のメジャー/マイナモード名を囲む丸括弧の周囲に中括弧
[...]
が表示されているときは、再帰編集レベルに入っています。
意図してそうしたのでなかったり、
再帰編集レベルの意味を理解していないのであれば、
再帰編集レベルから抜け出すべきです。
それにはM-x top-levelと打ちます。
これをトップレベルへの抜け出しと呼びます。
See Recursive Edit。
画面上のデータがまちがっているように見えたら、まず最初にすべきことは、 テキストが本当にまちがっているのかどうか調べることです。 C-lと打って画面全体を再描画します。 これで画面が正しそうになるのなら、問題は画面更新にあったのです。 (そうでない場合は、see Text Garbled)。
画面更新の問題は、
使っている端末に対応するtermcapの定義がまちがっている場合が多いです。
Emacsの配布に含まれるファイルetc/TERMS
には、
この種の問題で既知のものに対する修正が入っています。
ファイルINSTALL
には、
この種の問題に対する一般的なアドバイスの節があります。
いちばんありがちなのは、
ある種の画面操作に対するパディング
59
が不足している場合です。
この種の問題があるかどうか調べるには、
他のメーカ製の別の端末でEmacsを動かしてみてください。
ある機種の端末では頻繁に問題が起きるのに別の機種の端末では問題がないなら、
termcapの定義がまちがっている可能性があります。
しかし、ある種の機能を有するか欠如している端末で現れる
Emacsのバグである可能性もあります。
C-lを実行してもテキストが変ならば、 正しいと思われる状態になるまで、 C-x uを使って変更をもとに戻してみてください。 また、どのコマンドで変になったのか調べるために、 C-h lを試してみてください。
バッファの先頭や末尾で大量のテキストが失われているようなら、
モード行に単語Narrow
が表示されていないか確認してください。
もしそうなら、おそらくテキストは失われているのではなく、
一時的に見えなくなっているのでしょう。
見えるようにするには、C-x n wと打ってください。
See Narrowing。
Emacsが画面の最下行に自発的にI-search:
と表示するようなら、
劣悪なxon/xoffの『フロー制御プロトコル』に従って
端末がC-sとC-qを送っているためでしょう。
もしこの状態が起きたら、もっともよいのは端末をフロー制御なしに設定するか、
または、パディングを十分に増やして端末がけっしてC-sを
送らないようにすることです。
(パディングを増やす1つの方法は、
より大きい値を変数baud-rate
に設定すること。
この値はボーという単位で表した端末の出力速度。)
フロー制御を止められない場合の次善の策は、
Emacsにフロー制御を処理させることです。
それには、関数enable-flow-control
を呼び出してください。
典型的な場合、
ある種の端末タイプに限ってフロー制御を使う必要があります。
enable-flow-control-on
を使って、
そのような種類の端末に限ってフロー制御を行うようにできます。
たとえば、VT-100端末とH19端末にはフロー制御を行う必要があるのなら、
ファイル.emacs
につぎのものを入れます。
(enable-flow-control-on "vt100" "h19")
フロー制御を使っている場合には、C-sのかわりにC-\、 C-qのかわりにC-^を使う必要があります。 (これらの割り当てはキーボード変換によって行われる。 see Keyboard Translations。)
Virtual memory exceeded
というエラーメッセージが出たら、
変更したバッファをC-x sで保存してください。
この方法で保存する場合、必要なメモリは最小限ですみます。
Emacsは上記のエラーが起きたときでも使える予備のメモリを確保していますから、
C-x sを完了するのには十分なはずです。
変更済みのバッファを保存したら、 Emacsを終了して別のEmacsを起動してもよいですし、 M-x kill-some-bufferを使って 現在動いているEmacsのメモリを解放してもよいです。 大量のテキストが入っているバッファを消せば、 安全に編集を続行できます。 空きメモリが十分な量になると予備のメモリを自動的に確保し直し、 再度メモリ不足になったときに備えます。
メモリ不足になったときには、M-x buffer-menuを使って バッファを保存したり消したりしないでください。 このコマンドはけっこうメモリを必要とするので、 確保した予備のメモリだけでは十分でない可能性があるからです。
Emacsやコンピュータがクラッシュしても、 クラッシュ時に編集していたファイルは自動保存ファイルから回復できます。 それには、Emacsを再度起動してから、コマンドM-x recover-sessionを 入力してください。
このコマンドは、まず、中断されたセッションファイルの一覧を日付とともに バッファに表示します。 その中からどのセッションを回復するか選んでください。 通常は、最新のセッションを選べばよいでしょう。 望みのセッションの行にポイントを動かして、C-c C-cと打ちます。
すると、recover-session
は、そのセッションで編集中だった
各ファイルについて回復するかどうか問い合わせてきます。
yと答えると、そのファイルと自動保存ファイルの日付を表示してから、
回復するかどうか再度問い合わせてきます。
再問い合わせに対してはyesで答える必要があります。
そうすると、Emacsはそのファイルを訪れますが、
テキストは自動保存ファイルから持ってきます。
recover-session
が完了すると、
回復を指定したファイルはEmacsバッファに入っています。
そうしたらこれらのバッファを保存してください。
保存して始めてもとのファイルが更新されます。
バグのために、Emacsがquit-flag
を検査しないループに入ってしまうことも
ありえます。
このため、このフラグが設定されている状態で再度C-gが打たれると
ただちに実行を休止する特別な機能がEmacsにはあり、
いつでもGNU Emacsから抜け出すことができます。
通常、Emacsはすみやかにquit-flag
を認識し(中断し)ますから、
この特別な機能が使われることはまずありません。
(MS-DOSや互換システムでは、C-<BREAK>を2回連打する。)
C-gの連打によって休止したEmacsを再開すると、 Emacsは休止直前に実行していた動作に戻るまえに、 つぎの2つの質問をしてきます。
Auto-save? (y or n) Abort (and dump core)? (y or n)
それぞれの質問に対し、yかnに続けて<RET>で答えてください。
Auto-save?
にyと答えると、
自動保存を行う設定になっている変更されたバッファすべてに対して
ただちに自動保存を実行します。
Abort (and dump core)?
にyと答えると、
Emacsは不正命令を実行してコアダンプを作ります。
コアダンプがあると、Emacsが中断できなかった理由をウィザード
60
が追究できます。
コアダンプを作り終えるとEmacsの実行は終了します。
nと答えると実行は継続します。
運がよければ、Emacsが最終的にはquit-flag
を検査して
正常に中断できるでしょう。
運が悪ければ、またループに入ったままになりますから、
再度C-gを打ってEmacsをまた休止します。
本当はEmacsが固まったのではなく単に遅いだけの場合には、 意図せずにC-gを連打してしまうことがあります。 その場合には、再開して2つの質問にnと答えればもとの状態に戻れます。 中断要求はすぐに受け付けられるでしょう。
XウィンドウシステムのもとでEmacsが動作している場合には、 C-g連打の機能は切ってあります。 というのは、ウィンドウマネージャを使ってEmacsを終了させたり、 別のウィンドウを開いて別のプログラムを動かせるからです。
MS-DOSや互換システムでは、 (MS-DOSやBIOSの)システムコールが固まっている場合や Emacsが非常にきつい(LispコードではなくCのコードで) 無限ループに入っている場合には、 C-<BREAK>を2回打っても緊急脱出の機能を使えない場合があります。
Emacsを使うこと(や、その他のこと)がきわめて不愉快になったり、 ここまでにあげたどの方法でも問題が解決しない場合でも、 Emacsはまだ手助けができます。
まず、Emacsがコマンドに応答しないようなら、 C-g C-gと打ってEmacsから抜け出し、 新たに別のEmacsを起動してください。
つぎに、M-x doctor <RET>と打ってください。
doctorプログラムがあなたのいらいらを鎮めてくれるでしょう。 doctorに何かを話すときには、<RET> <RET>と打っていい終える 必要があります。 こうすると、doctorは患者が話し終えたことを認識します。
Emacsのバグに出会うこともあるでしょう。 バグを修正する/できるとは約束できませんし、 そもそもバグだと認めないかもしれませんが、 読者が遭遇した問題については知らせてほしいと考えています。 たしかにそれをバグだと認めて修正しようということになる場合も多いのです。
バグを修正するには、まず、報告してもらう必要があります。 効果的に報告してもらうためには、報告の仕方を知っていただく必要があります。
Emacsが不正命令を実行したり、 (『ディスクが満杯』などの外部の問題ではなく)プログラムに問題が あるというオペレーティングシステムのメッセージを表示して止まった場合には、 たしかにバグがあるといえます。
Emacsの画面の更新結果がバッファの内容に対応していないなら、 それもたしかにバグです。 コマンドの実行が思わしくなくてもC-lで再表示させると正しくなる場合には、 画面更新がまちがっているのです。
あるコマンドを実行するのに無限に時間がかかるというのはバグの可能性が ありますが、たしかにEmacsの責任かどうかを確認する必要があります。 コマンドによってはとても時間がかかるものもあります。 C-g(MS-DOSではC-<BREAK>)を打ってから C-h lを打つことで、Emacsが受け付けた入力がたしかに 読者が意図したものだったかどうか確認できます。 すぐに処理されるコマンドだという確信があるなら、 バグを報告してください。 そのコマンドがすごく時間のかかるものかどうかわからないなら、 マニュアルで調べるか知っている人に聞いてください。
よく知っているコマンドであって、普通なら問題なく結果が得られるはずなのに、 かわりにEmacsがエラーメッセージを出すようなら、恐らくそれはバグでしょう。
コマンドが正しくない動作をするのなら、それはバグです。 ただし、コマンドが本当は何をするのが正しいか確認してください。 そのコマンドに馴染みがないとか、 そのコマンドがどう動作するはずなのか確信が持てない場合は、 コマンドは実際には正しく動作しているのかもしれません。 バグという結論に飛びつくまえに、よく知っている人に見てもらってください。
最後に、コマンドの意図された定義が編集操作に対して最良でない可能性があります。 これは重要な問題ではありますが、ユーザーがどう判断するかの問題でもあります。 既存の機能について無知なために、 まちがっていると結論を出してしまうのも簡単です。 まずドキュメントをひととおり調べて、十分に納得し、 それでもなお自分にとって必要な機能がない、と断言できるまでは、 コマンドの定義が悪いなどとはいわないほうがよいでしょう。 マニュアルを熟読してもコマンドが何をするのかよくわからなければ、 索引や用語集を活用してよくわからない単語について調べましょう。
十分熟読しても、なおコマンドが何をするのかわからないなら、 それは「マニュアルのバグ」として報告すべきでしょう。 マニュアルは、読者を含めて、Emacsの専門家でない人が読んでも すべてのことが明らかになるようなものであるべきです。 ドキュメントのバグを報告することも、 プログラムのバグを報告することと同じくらい重要なことです。
関数や変数のオンラインの説明文がマニュアルと一致しない場合は、 どちらかがまちがっていますから、これもバグです。
バグがあると確信したら、それを報告すること、 しかも、役立つ形で報告することが重要です。 もっとも有用なのは、どのようなコマンドを打ち込んだかを、 Emacsを起動するシェルのコマンドから始めて 問題が起きるところまですべて正確に記述することです。
バグを報告するときもっとも重要なことは事実を報告することです。 仮説や口頭説明は、詳細な生データのかわりにはなりません。 事実を報告することは単純なはずなのに、 多くの人はかわりに説明をでっちあげてそれを報告したがります。 その説明がEmacsの実装方式の想像に基づいたものであるならば、 その説明はまったく役に立たないでしょう。 事実が欠けていたらバグに関する真の情報を得られません。
たとえば、ユーザーがとても大きなファイルを訪れるために
C-x C-f /glorp/baz.ugh <RET>と打ち込んだら、
EmacsがI feel pretty today
と表示したとしましょう。
もっともよいバグレポートは、まさにこの文のように報告することです。
すべての事実だけを報告できるからです。
問題はファイルの大きさにあると仮定して、
「大きなファイルを訪問したら、EmacsがI feel pretty today
と表示した」
などと書いてはいけません。
これが『説明をでっちあげた』報告です。
問題はファイル名にz
が含まれていたために生じたのかもしれないのです。
もしそうだとしたら、報告に基づいて適当な「大きなファイル」を訪問してみても、
そのファイル名にz
が含まれていなければ何も悪いところが
みつからないでしょう。
報告の文面からは、名前にz
を含んだファイルを
試しに訪問してみるべきだとはわかりません。
あるいは、ファイルがちょうど25個の空白文字で始まっているために
問題が起きたのかもしれません。
ですから、報告に際しては、そのバグを再現させるのに必要なファイルがあれば、
それらのファイルの正確な内容も教えてください。
その問題は、たまたま、C-x C-aと打った直後にのみ
発生するのだとしたらどうでしょう?
ですから、Emacsを起動してから問題に遭遇するまでに
打ち込んだものすべてを教えてほしいのです。
どの訪問コマンドを使っても同じように問題が発生すると知っている のでない限り、C-x C-fと打ったと報告するかわりに 「ファイルを訪問した」というのさえいけません。 同様に、「1行に3文字入っているとき」ではなく、 「<RET> A B C <RET> C-pと打ち込んだあとで」のように、 あなたがテキストを入れたやり方そのものを報告してください。
このように、バグを報告するときには、いかなる説明も推測しないでください。 問題を実際にデバッグして憶測ではない説明を報告してもらえるなら、 それは有益ですが、事実も含めてください。
バグレポートを送る最良の方法は、電子メイルでEmacs保守チーム
bug-gnu-emacs@gnu.org
に送ることです。
(重要な改良の提案などもここに送ってください)。
他から出されたバグレポートが読みたければ、
ニュースグループgnu.emacs.bug
で読めます。
ただし、傍観者として見る場合には、見たものについて批判するべきではない、
ということを承知しておいてください。
バグレポートの目的はEmacs保守チームに情報を提供することです。
傍観者は、この目的に干渉しない限りは、歓迎します。
特に、大量のデータが添付されているバグレポートもありますので、
傍観者はそのことを非難すべきではありません。
ネットニュース経由でバグレポートを投稿しないでください。 ネットニュースよりもメイルのほうが送り手のメイルアドレスが確実にわかり 信頼できます。 もっと情報が必要なときには、メイルで問い合わせる必要があるかも知れません。
電子メイルを送れない場合には、 紙や他の機械可読な媒体で下記へ送ってください。
GNU Emacs Bugs Free Software Foundation 59 Temple Place, Suite 330 Boston, MA 02111-1307 USA
バグを修正するとは約束できません。 しかし、重大なバグや、醜いバグや、簡単に直せるバグなら、直したいと思います。
Emacsのバグレポートを送るのに便利な方法の1つは、 コマンドM-x report-emacs-bugsを使うことです。 このコマンドはメイルバッファ(see Sending Mail)を開いて、 自動的に重要な情報の一部を書き込みます。 しかし、必要な情報をすべて入れられるわけではありませんから、 以下の指針を読んでそれに従い、 メッセージを送るまえに重要な情報を自分で打ち込んでください。
保守チームがバグの調査を開始するためには、 以下のすべてがバグレポートに含まれている必要があります。
バージョン番号を調べるには、M-x emacs-version <RET>と打つ。 このコマンドが動作しないようなら、 GNU Emacsではないエディタを使っているようなので、 どこか別のところへバグを報告する。
*Messages*
バッファからその出力をコピーすれば、
すべての情報をまちがいなく送れる。
configure
コマンドの引数。
これらの変更については正確に記してほしい。 英語での説明では不十分。 ソースのコンテキストdiffを送ること。
独自のファイルを追加したり、別のマシンに移植するのも、 ソースの変更にあたる。
ファイルをまったく訪問せずに問題が再現可能なら、ぜひ教えてほしい。 そのほうがデバッグがずっと楽になる。 どうしてもファイルが必要なら、必ずその内容が正確にわかるようにすること。 たとえば、行末に空白文字が付いているかどうかとか、 バッファの最終行に改行文字があるかどうかが 問題になることは頻繁にある (最終行に改行があるかどうかで何か違いがあるべきではないのだが、 もし違いが生じるようならそれもバグといえる)。
Emacsへの入力を正確に記録する簡単な方法は、
ドリブルファイルに書くことである。
ドリブルファイルを開始するには、
Emacsを実行開始した直後に、M-:か
バッファ*scratch*
でつぎのLisp式を実行する。
(open-dribble-file "~/dribble")
それ以降はEmacsプロセスが終了するまで、 Emacsはすべての入力をドリブルファイルにコピーする。
TERM
の値)、
(すべてのマシンで同じとは限らないので)
/etc/termcap
ファイル中の当該端末のtermcapの定義すべて、
および、Emacsが実際に端末に送った出力。
端末への出力を収集するには、Emacsを実行開始した直後に、M-:か
バッファ*scratch*
でつぎのLisp式を実行する。
(open-termscript "~/termscript")
それ以降、Emacsはプロセスが終了するまでのすべての端末出力の写しを
指定されたtermscriptファイルに書き出す。
Emacsが起動するときに問題が起きるのなら、
上の式を.emacs
ファイルに入れて、
Emacsが最初に画面を開くときに一緒にtermscriptファイルも
書き始めるようにする。
ただし、端末に依存したバグは、 そのバグの出る端末なしで直すことは難しいことが多く、 ときとして不可能であることも承知しておいてほしい。
もちろん、Emacsが致命的なシグナルを受け取るのなら、それは誰にでもわかる。 しかし、バグが正しくないテキストだとすると、 保守チームにはどこが正しくないのかわからない可能性がある。 そういう可能性のある書き方はやめてほしい。
遭遇する問題が致命的なシグナルだとしても、はっきりとそう書くべきである。 たとえば、Emacsのソースが一部違っている版だったとか、 システムのCライブラリのバグに遭遇したといった 奇妙なことに出会ったとしよう(実話!)。 あなたが使っているEmacsはクラッシュするが、保守チームのほうでは何ともない。 クラッシュするといってもらえれば、 保守チームのほうで実行してクラッシュしなければバグが再現しないとわかる。 しかしそういってもらえないと、 バグが再現したのかどうかさえわからずに、 試してみた結果からは何の結論も得られない。
エラーメッセージの文面を正確に報告するには、
*Message*
バッファからメッセージをバグレポートにコピーする。
一部ではなく、全体をコピーしてほしい。
エラーのバックトレースを取得するには、エラーが発生するよりまえにLisp式
(setq debug-on-error t)
を評価する
(つまり、まずこのLisp式を実行して、それからエラーを再現させる)。
すると、エラーが起きたときにLispデバッガが実行され、
デバッガがバックトレースを表示する。
このデバッガのバックトレース出力を、バグレポートにコピーする。
このやり方は、バグを再現できるときだけ使える。 再現できない場合は、最低限、エラーメッセージだけでもすべてコピーする。
.emacs
を含めてロードしたLispコードのどれかが、
Emacsの動作に影響するような変数設定を行っていないか確認する。
また、(オプション-q
を指定して初期化ファイルのロードを抑制して)
個人のファイル.emacs
をロードせずに起動したEmacsでも
エラーが再現するかどうか調べる。
これでエラーが再現しないなら、
エラーの再現に必要なので、ロードしたすべてのプログラムの内容を正確に報告する。
開発中のソースの行番号とユーザーが入手するソースの行番号とは同じではない。 あなたが使っているバージョンのソースの何行目が、 開発中のソースの何行目に対応しているか調べるのは余分な手間であり、 正確にはわからないかもしれない。
src
に移動してから、
gdb emacs
を行う必要がある。
GDBがディレクトリsrc
にあるファイル.gdbinit
を読めるように、
このディレクトリがカレントディレクトリであることが重要。
ただし、バグの原因を示すために追加情報を集める場合には、 追加情報をいつ集めるかをよく考える必要がある。
たとえば、多くの人はバックトレースだけを送ってくるが、 それ単体ではあまり役に立たない。 引数の記録つきの単純なバックトレースでは、 GNU Emacsの内部で何が起きているかについての情報はほとんどない。 というのは、バックトレースに表示される引数のほとんどは Lispオブジェクトへのポインタだから。 それらのポインタの値そのものは、なんら重要ではない。 重要なのは、ポインタが指している先のオブジェクトの内容 (そしてその内容もまたポインタであることが多い)。
役に立つ情報を提供するには、 Lispオブジェクトの値をLispの記法で示す必要がある。 スタックの底付近にある数個のフレームについて、 Lispオブジェクトであるような各変数に対してこれを行ってほしい。 デバッガは単なる整数だと思うので、 どの変数がLispオブジェクトであるかはソースを見てほしい。
変数の値をLispの記法で示すには、まず、その値をプリントしてから、
GDBのユーザー定義コマンドpr
を使ってLispオブジェクトをLispの記法で
表示させる。
(別のデバッガを使わなければならない場合は、
オブジェクトを引数として関数debug_print
を呼び出す)。
コマンドpr
は、ファイル.gdbinit
で定義されており、
(コアダンプではなく)実行中のプロセスをデバッグするときだけ使える。
Lispでエラーが発生したときにEmacsを中断してGDBに戻るようにするには、
Fsignal
にブレークポイントを設定する。
実行中のLisp関数の簡素な一覧を表示するには、
GDBのコマンドxbacktrace
を打つ。
Lisp関数の引数を調べたい場合には、
スタック上を上に移動していき関数Ffuncall
のフレームに到達するごとに、
つぎのようなGDBコマンドを打つ。
p *args pr
関数が受け取った最初の引数を出力するには、つぎのようにする。
p args[1] pr
2番目以降の引数でも同様に出力できる。
Ffuncall
の引数nargs
は、
Ffuncall
が受け取った引数の個数を表す。
この個数は、Lisp関数自身とその関数に対する引数とを合わせた数。
ファイル.gdbinit
は、
データタイプやLispオブジェクトの中身を調べるのに役立つコマンド類を定義する。
それらのコマンドの名前はx
で始まる。
これらのコマンドはpr
より下位のレベルで動作し使い難いが、
コアダンプをデバックしたり、
Emacsが致命的なシグナルを受理したときのように
pr
がうまく動かないときでも使える。
step
で1ステップずつ実行を試みる。
固まっているのならコマンドstep
から戻ってこない。
ループしているならstep
から戻ってくる。
こうして調べた結果、Emacsがシステムコールの中で固まっているとわかったら、 Emacsを再度止めて、システムコールの引数を調べる。 そしてバグレポートには、ソース中でのシステムコールの正確な位置と、 引数が何だったかを正確に記入する。
Emacsが無限ループしているのなら、ループの始まりと終りを調べる。
もっとも簡単にこれを調べるには、GDBのコマンドfinish
を使う。
このコマンドを使うたびに、1つのスタックフレームから抜けるまで
Emacsは実行を継続する。
戻ってこなくなるまで、繰り返しfinish
を打つ。
戻ってこないのは、そのフレームで無限ループが起こっているからである。
ここでEmacsを再度停止し、
戻ってこなくなったフレームにちょうど戻るまで、
繰り返しfinish
を使う。
つぎに、next
を使ってそのフレーム内で1ステップずつ実行する。
こうすれば、ループがどこで始まりどこで終るかわかる。
さらに、ループ内で使われているデータを調べて、
ループが終るべきところでなぜ終らないかを追求してみてほしい。
これらの情報すべてを、バグレポートに含める。
以下には、バグレポートに必要ないものをあげておきます。
バグに出会った人はしばしば、入力をどう変えるとバグが出なくなるとか、 あるいは、相変わらず出るといったことを探求するのに時間をかける。
これは時間がかかるわりには、役に立たない。 というのは、保守チームがデバッグを行うときには、 デバッガのもとでブレークポイントを設定しながらバグの出る1つの例を 実行するのであって、何通りもの例から帰納的に推論するわけではない。 だから、別の例を探すのに時間をかけたりしないでほしい。
もちろん、もとの例のかわりに使えるもっと簡単な例がみつかれば、 それは役に立つ。 簡単な例なら、出力中のエラーもみつけやすくなり、 デバッガを使って実行するにも短い時間ですむ。
ただし、単純化は必須ではない。 もし単純化できなかったり、単純化する時間がなければ、 もとの例のままでよいので、バグレポートを出してほしい。
ある特別な種類のバグについては、システムコールトレースは非常に役立つが、 多くの場合はほとんど有用な情報は得られない。 したがって、多くの人がシステムコールのトレースこそクラッシュに 関する情報を報告するのに欠かせないものだと思っているらしいのは、 不思議である。 これはたぶん、ソースコードやデバッグ用シンボルのないプログラムを デバッグした経験から生まれた習慣だろう。
ほとんどのプログラムでは、システムコールのトレースより、
バックトレースのほうがずっとずっと役に立つ。
Emacsでさえ、単純なバックトレースのほうが有用である。
しかし、十分な情報を提供するには、バックトレースの補記として、
変数の値を表示しpr
でLispオブジェクトとしても表示する(上記参照)。
バグに対する修正は、よい品質のものなら有用である。 しかし、修正が正しいことを示すテスト例などの バグレポートに必要な情報を省かないでほしい。 修正に問題があるとわかって別のやり方でバグをつぶすかもしれないし、 報告された修正がまったく理解できないこともありえる。 そして、どんなバグを修正しようとしているのかわからない、あるいは、 その修正がなぜ改良になるのかわからなければ、 その修正を採用するわけにいかない。
こういう予想は、たいていはまちがっている。 専門家でさえ、まずデバッガで事実を調べない限り、正しい予想はできない。
GNU Emacsに対する改良や虫取りのための修正を送ろうということであれば、 おおいに助かります。 修正を送るにあたっては、保守チームがそれを役立てやすいように、 以下の指針に従ってください。 さもないと、送られた情報は有用であっても、 役立てるには余分な作業が必要になります。 GNU Emacsの保守は最善の環境でやっても手間のかかる仕事ですから、 手助けしていただくにしても十分な配慮が必要なのです。
(バグレポートへのポインタを示すよりも、 バグレポートのコピーを含めるほうが望ましい。 というのは、ポインタだとバグレポートを探す必要があるし、 そのバグを直し終えていると、バグレポートを消してしまっているかもしれない。)
異なる理由に基づいて2つの変更を行った場合、 その両方を採用することはないだろう。 どちらか一方だけを採用するかもしれない。 もしそれらをいっしょくたに1つのdiffにしてしまうと、 それを分離するために余計な作業が必要になる。 どの部分の変更がどちらの目的に対応しているのか調べる必要がある。 その時間を割けないと、その変更をまったく 採用しないということにもなりかねない。
それぞれの変更を行ってすぐに、別個に、説明を付けて送ってもらえれば、 2つの変更が一緒になるなどということはないし、 それぞれの変更を分離するなどの余計な作業をせずに適切に考慮できる。
それぞれの変更は別個に送るべきなので、変更を行ったらすぐに送れるはず。 そうすれば、保守チームのほうでその変更が重要なものだと 判断したらすぐ取り入れることができる。
diff -c
を使う。
コンテキストdiffでないdiffファイルは正しく適用するのが難しい。
それ以上に、調べるのもたいへん。
必ず保守チームの人間が修正を適用するかどうか検討する。
-u
形式は行番号だけのdiffよりはましだが、
いちばん読みやすいのは-c
形式。
もしGNU diffを使っているのなら、Cのコードのdiffを作るときには
diff -c -F'^[_a-zA-Z0-9$]+ *('
を使う。
こうすると、変更される各関数の名前が一緒に表示される。
変更記録の目的は、人が読んでどこが変わったかわかるようにすること。 だから、どの関数を変更したか具体的に書く。 大きい関数の場合は、関数の中のどの箇所を変更したかも書いてあると助かる。
その反面、どこが変更されたかわかるようにさえなっていれば、 変更の目的は変更記録で説明する必要はない。 たとえば、新しい関数を追加したのであれば、 その関数が新しいということだけを書けば十分。 目的を説明したほうがよいと感じるなら、たぶんそのとおりだろう。 しかし、説明はコード中のコメントに書く。 そのほうが役に立つ。
ディレクトリsrc
とディレクトリlisp
の
ファイルChangeLog
を眺めて、どのような情報を入れるかとか、
どのようなスタイルで書くかの参考にしてほしい。
誰が変更したかわかるように自分の名前をヘッダの行に記録したいなら、
ヘッダ行も送ること。
ときどき、おおむね改良になるかもしれないが、 はっきり改良だとはいいがたいような変更を送ってくる人がいる。 そのような変更は、きわめて慎重に検討しなければならないので、 採用するのは難しい。 もちろん、あなたがどのような理由でその変更が正しいのかよい説明を 書いてくれれば、保守チームがそれを理解する助けになる。
もっとも安全な変更は、特定のマシンの構成ファイルに対する変更。 それが安全だという理由は、 その変更が他のマシンにおいて問題を引き起こすことはありえないから。
修正を採用しても安全だとはっきりわかる形に設計することで、 保守チームの労力を軽減できる。
Emacsのプレテスト版が正しく動作することの確認を手助けしたかったり、
Emacsの改良作業に加わりたければ、
bug-gun-emacs@gnu.org
の保守チームに連絡してください。
プレテスト参加者は、バグを報告するだけでなく、バグを探すことも要求されます。
Emacsの改良に加わりたければ、保守チームにプロジェクトの示唆を求めるか、
あなたのアイデアを提案してください。
すでに改良したコードを書いてしまったのなら、それについて教えてください。
まだ作業を始めていないのなら、始めるまえに
bug-gnu-emacs@gnu.org
に連絡したほうがよいです。
そうすれば、Emacsの残りの部分とよく適合する形で
拡張を行うにはどうしたらよいかのヒントがもらえるでしょう。
GNU Emacsをインストールしたり、使ったり、変更したりするうえで手助けが必要なら、 2つの方法があります。
help-gnu-emacs@gnu.org
にメッセージを送るか、
ニュースグループgnu.emacs.help
に投稿する。
(これらのメイリングリストとニュースグループは相互乗り入れしているので、
どちらを使ってもかまわない。)
etc/SERVICE
にある。
GNU Emacsでは、コマンド行引数によりEmacs起動時にさまざまな動作を指定できます。 これらは他のエディタとの互換性のためや 洗練されたふるまいを担うものです。 通常の編集作業にはそれらを使うことはお勧めしません。
-
で始まる引数はオプション(option)です。
それ以外の引数は訪れるべきファイルを指定します。
Emacsは、起動すると指定したファイルを読み込みます。
コマンド行のいちばん最後のファイル名がカレントバッファとなりますが、
それ以外のファイルも別々のバッファに入っています。
他のGNUのコマンドと同様に、
特殊な引数--
は、これよりあとの引数が-
で始まっている場合でも、
すべてファイル名であることを指定します。
Emacsのコマンドオプションでは、 Emacsが使用するXのウィンドウのサイズや位置、表示色などの さまざまなことを指定できます。 バッチモードでLisp関数を実行するなどの進んだ利用のための オプションも若干あります。 ここでは、目的別に利用可能なオプションを説明します。
オプションの書き方は2通りあります。
1文字の-
で始まる短い形式と、--
で始まる長い形式です。
たとえば、-d
は短い形式であり、
--display
はこれに対応した長い形式です。
--
で始まる長い形式のほうが覚えやすいですが、
打ち込むのは面倒です。
しかし、オプション名を完全にすべて入力する必要はありません。
曖昧でないように省略すれば十分です。
長いオプションが引数をとる場合には、
オプション名と引数のあいだに空白か等号を置きます。
つまり、
--display sugar-bombs:0.0
と書くか、
--display=sugar-bombs:0.0
と書きます。
関係が明瞭になることもあり、以下の例でもつねに等号を使っていますので、
等号を使うようお勧めします。
ほとんどのオプションは、Emacsをどう初期化するか、あるいは、 Emacsセッションのパラメータをどう設定するか指示します。 これらを初期化オプション(initial options)と呼びます。 動作を指定するオプションもいくつかあります。 たとえば、ライブラリをロードする、関数を呼び出す、Emacsを終了するなどです。 これらを動作オプション(action options)と呼びます。 これらとファイル名をあわせて動作引数(action arguments)と呼びます。 Emacsはすべての動作引数を書かれた順に処理します。
以下は、動作引数とオプションとその引数の一覧です。
file
find-file
を使ってファイルfileを訪れる。
see Visiting。
+linenum file
find-file
を使ってファイルfileを訪れ、
その中の行番号linenumの行に移動する。
-l file
--load=file
load
を使ってfileという名前のLispライブラリをロードする。
see Lisp Libraries。
ライブラリは、カレントディレクトリか
EMACSLOADPATH
(see General Variables)で指定された
Emacsのライブラリ探索パスから探す。
-f function
--funcall=function
--eval expression
--insert=file
--kill
初期化ファイルでは、変数command-line-args
内のリストの要素として
動作引数の値を参照できます。
初期化ファイルでは、この変数を読んだり設定することで、
動作引数の通常の処理を無効にしたり新たなものを定義したりできます。
初期化オプションはEmacsセッションのパラメータを指定します。 ここでは、より一般的な初期化オプションを説明します。 Xウィンドウシステムに関連する他のオプションはこのあとの節にあります。
初期化ファイルのロードに影響する初期化オプションもあります。
Emacsの通常の動作は、
まずsite-start.el
(が存在すればそれ)をロードし、
続いて個人用の~/.emacs
(が存在すればそれ)をロードし、
最後にdefault.el
(が存在すればそれ)をロードします。
これらのファイルのロードを抑制したり、
代替ファイルを指定するオプションがあります。
-t device
--terminal=device
-d display
--display=display
-nw
--no-windows
DISPLAY
が設定されている場合でもそれを無視し、
Xとは直接通信しない。
-batch
--batch
stderr
へ出力する。
バッチモードは、
シェルスクリプトやmakefileなどからEmacs Lispで書いたプログラムを
実行するために使う。
バッチ処理を行うLispプログラムを起動するために、通常、
オプション-l
や-f
も使われる。
-batch
は、(初期化ファイルをロードしない)-q
を含む。
また、すべてのコマンドオプションを処理し終えるとEamcsは終了する。
さらに、明示的に指定しない限りバッファを自動的に保存しない。
-q
--no-init-file
~/.emacs
もdefault.el
もロードしない。
--no-site-file
site-start.el
をロードしない。
オプション、-q
、-u
、-batch
は、
このファイルのロードには影響しない。
ファイルsite-start.el
のロードを抑止する唯一のオプションである。
-u user
--user=user
~user/.emacs
をロードする。
--debug-init
--unibyte
EMACS_UNIBYTE
を設定しても同じ効果になる。
--multibyte
EMACS_UNIBYTE
の効果を禁止し、
通常のように、Emacsはデフォルトでマルチバイト文字を使う。
以下は、引数やオプションを指定したEmacsの使用例です。
ファイルhack-c.el
にはLispプログラムが入っているものとします。
これをロードすると、Cのプログラムを内容とするカレントバッファに対して
なんらかの有用な操作を行うものとします。
emacs -batch foo.c -l hack-c -f save-buffer >& log
この意味は、foo.c
を訪れ、
(訪れたファイルを変更する)hack-c.el
をロードし、
foo.c
に保存し
(save-buffer
はC-x C-sにバインドされた関数)、
(-batch
があるので)終了してシェルへ戻ります。
また、-batch
によりEmacsは表示端末を利用できないと仮定するので、
出力をlog
へリダイレクトしても問題ないことが保証されます。
Emacsをいったん休止したあとで再開するときには動作引数を指定できます。
その準備として、
個人の.emacs
につぎのコードを入れておきます(see Hooks)。
(add-hook 'suspend-hook 'resume-suspend-hook) (add-hook 'suspend-resume-hook 'resume-process-args)
さらに、(cshを使っているなら)シェルスクリプトemacs.csh
か、
(bashを使っているなら)emacs.bash
を実行する必要があります。
これらのスクリプトはedit
という別名(エイリアス)を定義します。
この別名は、訪れるべきファイルなどのコマンド行引数を新たに与えて
Emacsを(休止状態から)再開します。
Emacsを再開する場合には動作引数しか使えません。 初期化引数は認識されません。 なぜなら、初期化を行うには遅すぎるのです。
(引数の有無に関わらず)
Emacsの再開はEmacsジョブの親であるシェルから行う必要があります。
edit
が、プログラムやシェルスクリプトではなく、
別名であるのはこのためです。
シェルの別のサブジョブから実行できる再開コマンドを実現することは不可能です。
たとえば、環境変数EDITOR
の値に指定できる
コマンドを定義する方法はありません。
したがって、
この機能でEmacsサーバーの機能(see Emacs Server)を
置き換えることはできません。
別名edit
は、Emacsサーバーが稼働中ならEmacsサーバーの機能を使います。
しかし、このことを完全に正確に調べる方法はありません。
実際にはEmacsが終了していても、ファイル/tmp/.esrv...
が存在すると
サーバーが稼働中であると誤認してしまいます。
そのような場合には、そのファイルを探して削除してください。
ここでは、Emacsがどうのように環境変数を使うか説明します。 環境変数とは、オペレーティングシステムからEmacsへ渡される文字列であり、 環境変数の集まりが環境です。 環境変数名では大文字小文字を区別し大文字だけを使う習慣があります。
環境変数はオペレーティングシステムが与えるものなので、
それらを設定する一般的な方法はありません。
設定方法は、オペレーティングシステム、特に、使用するシェルに依存します。
たとえば、bashを使って環境変数ORGANIZATION
に
not very much
を設定するにはつぎのようにします。
export ORGANIZATION="not very much"
cshやtcshの場合にはつぎのようにします。
setenv ORGANIZATION "not very much"
EmacsがXウィンドウシステムを使うようになっている場合には、 EmacsはXライブラリから非常に多数の環境変数を受け継ぎます。 詳しくはXのドキュメントを参照してください。
AUTHORCOPY
CDPATH
cd
コマンドが使う。
DOMAINNAME
EMACS_UNIBYTE
--unibyte
を使うのと等価である。
see Initial Options。
EMACSDATA
data-direcotry
の初期化に用いる。
Emacs作成時のpaths.h
での設定に優先する。
EMACSLOADPATH
paths.h
での設定に優先する。
EMACSLOCKDIR
paths.h
での設定に優先する。
EMACSPATH
paths.h
での設定に優先する。
ESHELL
SHELL
の設定に優先する。
HISTFILE
~/.history
、
bashの場合は~/.bash_history
、
kshの場合は~/.sh_history
、
その他の場合には~/.history
である。
HOME
~
)で始まるファイル名の展開に使われる。
MS-DOSでは、Emacsが起動されたディレクトリがデフォルトであるが、
/bin
で終る場合には/bin
は取り除く。
HOSTNAME
INCPATH
complete
パッケージがファイルを探すために使う。
INFOPATH
paths.h
での設定に優先する。
LANG
LC_ALL
LC_CTYPE
8859-n
、8859_n
、8859n
が
含まれると、自動的にLatin-n
をEmacs起動時の言語環境に指定する。
nが9であるとLatin-5
を指定する。
LOGNAME
USER
も参照。
MAIL
MAILRC
~/.mailrc
。
MH
~/.mh_profile
。
NAME
NNTPSERVER
ORGANIZATION
PATH
exec-path
の設定に使われる。
Emacsの中ではこのLisp変数の値を使うことになる。
PWD
REPLYTO
mail-default-reply-to
の初期値を指定する。
see Mail Headers。
SAVEDIR
SHELL
TERM
internal
であり、
マシン固有の画面を扱う内蔵の端末エミュレータを意味する。
TERMCAP
TERM
で指定した端末をどのように制御するか記述した
termcapライブラリファイルの名前。
デフォルトは/etc/termcap
。
TMPDIR
TZ
msdos.c
を参照。
USER
LOGNAME
も参照。
MS-DOSではデフォルトはroot
。
VERSION_CONTROL
version-control
(see Backup Names)の初期化に使う。
これらの変数は特定の場合に限って使われます。
COMSPEC
SHELL
のデフォルト値になる。
NAME
USER
のデフォルト値になる。
TEMP
TMP
EMACSTEST
EMACSCOLORS
PCの画面では、通常、8色の背景色しか扱えない。
しかし、EmacsはDOSの画面を16色の背景色のモードに切り替えるので、
背景色の下位4bitすべてが実際に使われる。
WINDOW_GFX
環境変数DISPLAY
は、Emacsを含むすべてのXクライアントに
ウィンドウをどこに表示するかを教えます。
普通の状況では、
Xサーバーを起動してローカルでジョブを走らせると、
この変数の値はデフォルトで設定されます。
場合によっては、自分でディスプレイを指定する必要があるでしょう。
たとえば、リモートログインしてリモート側でクライアントプログラムを実行し、
表示はローカルの画面にする場合です。
Emacsを使う場合、デフォルトのディスプレイを変更する主な理由は、 他のシステムにログインしてそのシステム上でEmacsを実行し、 ウィンドウはローカルの画面に表示するためです。 他のシステムにログインするのは、そのシステム上に編集したいファイルがあるか、 あるいは、 実行したいEmacsの実行ファイルがそのシステムにあるからでしょう。
環境変数DISPLAY
の書式は
host:display.screen
です。
hostはXウィンドウシステムのサーバーマシンの名前、
displayは同じマシンの別のサーバーと読者のサーバー(X端末)を
区別するために任意に割り振られた番号、
screenは稀にしか使いませんが
1つのXサーバーで複数の端末画面を制御する場合に使います。
ピリオドとscreenは省いてかまいません。
指定する場合、screenは普通はゼロです。
たとえば、読者のホストの名前はglasperle
であり、
読者のサーバーは使用できるサーバーのうちで最初(でたぶん唯一)のもので
あるとすれば、DISPLAY
はglasperle:0.0
となります。
Emacsを実行するときに明示的にディスプレイ名を指定できます。
変数DISPLAY
を変更する、あるいは、オプションの-d display
や
--display=display
を指定します。
たとえばつぎのようにします
emacs --display=glasperle:0 &
オプション-nw
を指定するとXを直接使用することを禁止できます。
これも初期化オプションです。
Emacsに対して制御端末に通常のASCII文字を表示するように指示します。
セキュリティの設定によっては、リモートシステムのプログラムから 読者のローカルのシステムに表示するのが禁止されます。 この場合、Emacsを走らせるとつぎのようなメッセージが出力されます。
Xlib: connection to "glasperle:0.0" refused by server
この問題は、xhost
コマンド
61
を用いて、ローカルマシンにリモートシステムからのアクセス許可を
与えれば解決できます。
デフォルトでは、Emacsは9x15
という名前のフォントでテキストを表示します。
この場合、各文字の幅は9ピクセル、高さは15ピクセルです。
コマンド行のオプション-fn name
で別のフォントを指定できます。
-fn name
--font=name
--font
は、-fn
の別名。
Xにおいては、各フォントは
ダッシュで区切った11個の単語や数字からなる長い名前を持ちます。
短い愛称を持つフォントもあり、9x15
はそのような愛称です。
どちらの名前を用いてもかまいません。
フォント名にはワイルドカードパターンを使えますが、
その場合には、EmacsはXにパターンに一致するフォントを1つ選ばせます。
以下の例は、6x13
という愛称を持つフォントを指定することになります。
emacs -fn "-misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1" &
個人のファイル.Xdefaults
でもフォントを指定できます。
emacs.font: -misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1
長いフォント名はつぎのような形式です。
-maker-family-weight-slant-widthtype-style... ...-pixels-height-horiz-vert-spacing-width-charset
courier
。
bold
、medium
、light
のいずれか。
フォントによっては他の単語もありえる。
r
(roman)、i
(italic)、o
(oblique)、
ri
(reverse italic)、ot
(other)のいずれか。
condensed
、extended
、semicondensed
、
normal
のいずれか。
フォントによっては他の単語もありえる。
*
を用いるのが一般的である。
*
を指定する。
m
(monospace)、p
(proportional)、
c
(character cell)のいずれか。
Emacsではm
とc
のフォントを利用できる。
iso8859-1
を使うであろう。
62
固定幅フォント、つまり、すべての文字が同じ幅のフォントだけを使ってください。
Emacsはまだ可変幅のフォントを正しく表示できません。
長いフォント名のspacing欄がm
やc
のフォントは
固定幅フォントです。
読者のシステムで利用可能な固定幅フォントをすべて表示するには、
プログラムxlsfotns
を用いてつぎのようにします。
xlsfonts -fn '*x*' | egrep "^[0-9]+x[0-9]+" xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-m*' xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-c*'
特定のフォントの字形を見るにはコマンドxfd
を使います。
たとえば、
xfd -fn 6x13
とするとフォント6x13
全体を表示します。
Emacsが動作中のときは、カレントフレーム(see Frame Parameters)、 あるいは、特定の種類のテキスト(see Faces)のフォントを設定できます。
カラーディスプレイでは、Emacsの表示画面のさまざまな部分に
使う表示色を指定できます。
システムで利用可能な表示色を調べるには
ファイル/usr/lib/X11/rgb.txt
63を見ます。
表示色を指定しないと、
背景色のデフォルトは白、それ以外の表示色のデフォルトは黒です。
モノクロディスプレイでは、前景色は黒、背景色は白、
ディスプレイで表示できるなら境界部分は灰色です。
以下は、表示色を指定するオプションの一覧です。
-fg color
--foreground-color=color
-bg color
--background-color=color
-bd color
--border-color=color
-cr color
--cursor-color=color
-ms color
--mouse-color=color
-r
--reverse-video
たとえば、珊瑚色のマウスカーソルと青石板色のテキストカーソルを用いるには、 つぎのように入力します。
emacs -ms coral -cr 'slate blue' &
オプション-r
かXリソースのreverseVideo
で
前景色と背景色を入れ替えられます。
オプション-geometry
は、Emacsの初期フレームのサイズと位置を制御します。
ウィンドウのジオメトリ(サイズと位置)を指定する書式はつぎのとおりです。
-g widthxheight{+-}xoffset{+-}yoffset
--geometry=widthxheight{+-}xoffset{+-}yoffset
{+-}
はプラス記号かマイナス記号のいずれかを意味します。
xoffsetのまえのプラス記号で画面左端からの距離を、
マイナス記号で右端からの距離を意味します。
yoffsetのまえのプラス記号で画面上端からの距離を、
マイナス記号で下端からの距離を意味します。
xoffsetとyoffsetの値自体は正でも負でもよいのですが、
その意味は変わらずに方向を変えるだけです。
Emacsがジオメトリを解釈する単位は、xterm
と同じ単位です。
widthとheightは文字数で数えますから、
大きなフォントでは小さいフォントよりも大きなフレームになります。
xoffsetとyoffsetはピクセル単位で数えます。
モード行とエコー領域はフレームの最後の2行を占めるので、 初期のテキストウィンドウの高さは ジオメトリで指定した高さより2だけ小さくなります。 Xツールキット版でないEmacsでは、 指定した数からさらに1行をメニューバーに利用します。
ジオメトリ指定のすべての部分を指定する必要はありません。
xoffsetとyoffsetの両方を省くと
ウィンドウマネージャがEmacsのフレームの位置を決めますが、
マウスで置き場所を指定できる場合もあります。
たとえば、164x55
は
(普通の幅のウィンドウを横に並べて2つ置けるサイズの)
164桁で55行のウィンドウを指定します。
デフォルトではEmacsの幅は80文字で高さは40行です。
いずれか一方、あるいは、両方を省略できます。
ジオメトリを数で始めると幅であると解釈します。
x
で始まり数が続けば高さであると解釈します。
したがって、81
は幅だけを指定し、
x45
は高さだけを指定します。
+
か-
で始まれば位置指定となり、
幅と高さの両方を省いたことを意味します。
したがって、-3
はxoffsetのみを指定します。
(位置指定の要素が1つだけの場合にはつねにxoffsetです。)
+3-3
はxoffsetとyoffsetを指定し、
画面の左底近くにフレームを置きます。
ファイル.Xdefaults
ですべての部分か一部分のデフォルトを指定し、
オプション--geometry
で特定の部分を上書きできます。
Emacsのフレームには内部境界と外部境界があります。 内部境界はフレームの4辺の周りに付いた背景色の縁取りです。 Emacs自身が内部境界を付加します。 外部境界は、内部境界の外側にウィンドウマネージャが付加します。 これには、ウィンドウを移動したりアイコン化するためにクリックできる さまざまな箱が付く場合もあります。
-ib width
--internal-border=width
-bw width
--border-width=width
フレームのサイズ指定には境界は含みません。 フレームの位置は外部境界の外側から測ります。
内部境界の幅をnピクセルにするには、
オプション-ib n
を使います。
デフォルトは1です。
外部境界の幅を指定するには、
(ウィンドウマネージャが指定を無視するかもしれませんが)
-bw n
を使います。
外部境界のデフォルトの幅は2です。
Emacsのフレームには、指定したタイトルがあるかもしれないし、ないかもしれません。 フレームタイトルを指定すると、 ウィンドウの装飾部分やアイコンにフレーム名として表示されます。 Emacsのフレームにタイトルが指定されていなければ、 デフォルトのタイトルは、 (フレームが1つしかない場合には)実行プログラムの名前、あるいは、 (複数のフレームがあれば)選択したウィンドウのバッファの名前になります。
コマンド行オプションでEmacsの初期フレームのタイトルを指定できます。
-title title
--title=title
-T title
オプション--name
(see Resources X)も
Emacsの初期フレームのタイトルを指定します。
ほとんどのウィンドウマネージャは、 フレームを『アイコン化』することを許しています。 つまり、フレームを見えなくしてから、その場所に 小さな識別しやすい『アイコン』を置きます。 アイコンウィンドウをクリックするとフレーム自体が再度表示されます。 一度にたくさんのクライアントを動かしておく場合、 クライアントのほとんどをアイコンにしておけば画面が乱雑にならずにすみます。
-i
--icon-type
-iconic
--iconic
オプション-i
や--icon-type
は、
GNUのヌーの絵を表示したアイコンウィンドウを使う指定です。
省略すると、Emacsは使用するアイコンの種類をウィンドウマネージャに選ばせます。
これは、通常、フレームのタイトルを含んだ小さな長方形のウィンドウです。
64
オプション-iconic
は、すぐにはフレームを開かずに
アイコンで始めるようにEmacsを起動します。
この場合、アイコンウィンドウはEmacsが起動したことだけを教えてくれます。
アイコンを開くまで通常のテキストフレームは表示されません。
Xウィンドウシステムで動いているプログラムでは、
クラスとリソースの階層によってユーザーのオプションを取りまとめます。
これらのオプションのデフォルト値は、
~/.Xdefaults
という名前の個人のXリソースファイルで指定できます。
ファイル内の各行は、1つのオプション、関連したオプション群、 1つのプログラム、あるいは、複数(または全部)のプログラムの 値を指定します。
プログラムは特定の意味を持ったリソース名を定義します。
リソースをどのようにクラス名にグループ化するかも定義します。
たとえば、Emacsでは、
リソースinternalBorder
は内部境界の幅を制御し、
リソースborderWidth
は外部境界の幅を制御します。
どちらのリソースもクラスBorderWidth
の一部です。
これらの名前では大文字小文字を区別します。
~/.Xdefaults
では、以下のように1行に1つのリソースを指定します。
emacs.borderWidth: 2
あるいは、クラス内のすべてのリソースに同じ値を指定するには クラス名を使います。 たとえば、つぎのようにします。
emacs.BorderWidth: 2
クラスに値を指定すると、 それはそのクラス内のすべてのリソースのデフォルト値になります。 個別にリソースの値を指定することもできます。 その場合、特定のリソースの値はクラスの値に優先します。 したがって、つぎの例では、 すべての境界のデフォルトの幅として2を指定しますが、 外部境界の値は4になります。
emacs.Borderwidth: 2 emacs.borderwidth: 4
ファイル内での行の順番は関係ありません。 また、コマンド行オプションはつねにXリソースファイルに優先します。
上の例の文字列emacs
もリソース名です。
この名前は、Emacsを起動するために指定した実行ファイルの名前を表します。
Emacsを別の名前でインストールしたならば、
emacs
のかわりにその名前のリソースを探します。
-name name
--name=name
このオプションを指定しないと、
デフォルトではEmacsの実行ファイル名をリソース名として使う。
-xrm resource-values
--xrm=resource-values
整合性のために、-name
は、
どの特定のフレームにも属さないリソースの値を探すときの名前も指定します。
Emacsを起動するコマンド名と同じ名前のリソースはクラスにも属します。
その名前はEmacs
です。
emacs
のかわりにEmacs
と書けば、
実行ファイルの名前やフレームタイトルに関わらず、
すべてのEmacsジョブのすべてのフレームにリソースが適用されます。
たとえば、つぎのようにします。
Emacs.BorderWidth: 2 Emacs.borderWidth: 4
コマンド行オプション-xrm resources
を使えば、
追加のリソースの値をEmacsに指定できます。
テキストresourcesは、Xリソースファイルの中で使うものと同じ書式です。
dataで複数のリソースを指定するには、
ファイルの場合と同様に、そのあいだに改行を置きます。
また、#include "filename"
を使えば、
ファイル内のリソース指定を取り込めます。
-xrm
で指定したリソースの値は、これ以外のリソース指定に優先します。
以下は、Emacsのオプションを指定するリソース名とそれが属するクラスの一覧です。
background
(クラスBackground
)
bitmapIcon
(クラスBitmapIcon
)
on
ならば(ヌーの絵の)ビットマップアイコンを使う。
off
ならばウィンドウマネージャにアイコンを選ばせる。
borderColor
(クラスBorderColor
)
borderWidth
(クラスBorderWidth
)
cursorColor
(クラスForeground
)
font
(クラスFont
)
foreground
(クラスForeground
)
geometry
(クラスGeometry
)
emacs*geometry
とは指定しないように注意すること。
このリソースで指定した位置は、Emacsの初期フレーム
(あるいは、特定のフレーム名を指定したリソースはそのフレーム)
だけに適用される。
しかし、サイズはすべてのフレームに適用される。
iconName
(クラスTitle
)
internalBorder
(クラスBorderWidth
)
menuBar
(クラスMenuBar
)
on
ならばフレームにメニューバーを付ける。
off
ならばメニューバーを付けない。
minibuffer
(クラスMinibuffer
)
none
ならばこのフレームにミニバッファを付けない。
かわりに、独立したミニバッファフレームを使う。
paneFont
(クラスFont
)
pointerColor
(クラスForeground
)
reverseVideo
(クラスReverseVideo
)
on
ならば前景色と背景色を入れ替え、
off
ならば指定された表示色を用いる。
verticalScrollBars
(クラスScrollBars
)
on
ならばフレームにスクロールバーを付ける。
off
ならばスクロールバーを付けない。
selectionFont
(クラスFont
)
title
(クラスTitle
)
以下は、特定のフェイス(see Faces)の見え方を制御するリソースです。
face.attributeFont
face.attributeForeground
face.attributeBackground
face.attributeUnderline
on
かtrue
を指定する。
Lucidメニューウィジェットを含めたXツールキットを使う
Emacsがインストールされている場合には、
メニューバーは別のウィジェットであり独自のリソースを持ちます。
リソース名には
(Emacsの起動名かすべてのEmacsの起動を意味するEmacs
に続けて)
pane.menubar
が含まれます。
これらはつぎのように指定します。
Emacs.pane.menubar.resource: value
たとえば、メニューバーの項目に8x16
フォントを指定するには、
つぎのように書きます。
Emacs.pane.menubar.font: 8x16
メニューバーを使わないツールキットのポップアップメニューの項目の
リソースには、同様に、menu*
があります。
たとえば、ポップアップメニューに8x16
のフォントを指定するには、
つぎのように書きます。
Emacs.menu*.font: 8x16
対話ボックスのフォントを指定するには、
menu
のかわりにdialog
を使ってつぎのように書きます。
Emacs.dialog*.font: 8x16
経験によれば、pane.menubar
やmenu*
のまえに
shell.
を付ける必要があるシステムもあります。
他のシステムではshell.
を付加してはいけません。
以下は、メニューバーとポップアップメニューのリソースの一覧です。
font
foreground
background
buttonForeground
horizontalSpacing
verticalSpacing
arrowSpacing
shadowThickness
Motifウィジェットを含めたXツールキットを使う
Emacsがインストールされている場合には、
メニューバーは別のウィジェットであり独自のリソースを持ちます。
リソース名には
(Emacsの起動名かすべてのEmacsの起動を意味するEmacs
に続けて)
pane.menubar
が含まれます。
これらはつぎのように指定します。
Emacs.pane.menubar.subwidget.resource: value
メニューバーの個々の文字列はサブウィジェットです。
サブウィジェットの名前はメニュー項目の文字列と同じです。
たとえば、メニューバーの中の単語Files
は
emacs.pane.menubar.Files
という名前のサブウィジェットの一部です。
ほとんどの場合、メニューバー全体に同じリソースを指定するでしょう。
それには、特定のサブウィジェット名のかわりに*
を使います。
たとえば、8x16
フォントをメニューバーの項目に使うには、
つぎのようにします。
Emacs.pane.menubar.*.fontList: 8x16
これは、サブメニューのリソース値も指定します。
メニューバー内のサブメニューの各項目には、
それぞれ独自のXリソース名があります。
たとえば、Files
サブメニューには項目Save Buffer
があります。
サブメニューの項目のリソース指定はつぎのようになります。
Emacs.pane.menubar.popup_*.menu.item.resource: value
たとえば、Save Buffer
のフォントを指定するには、
つぎのようにします。
Emacs.pane.menubar.popup_*.Files.Save Buffer.fontList: 8x16
Edit
の下のSpell
の下にある
Check Message
のような2段下のサブメニューの項目では、
リソースの雛型はつぎのようになります。
Emacs.pane.menubar.popup_*.popup_*.menu.resource: value
たとえば、つぎのようになります。
Emacs.pane.menubar.popup_*.popup_*.Spell.Check Message: value
サブメニューのリソースを指定せずに、 すべてのメニューバーの項目のリソースを指定することは不可能です。 サブメニューの項目をメニューバー自体とは異なる見え方にするには、 2段階の指定が必要です。 まずメニューバーのリソースを指定し、 そのあとでサブメニューの値だけを上書きします。 たとえば、つぎのようにします。
Emacs.pane.menubar.*.fontList: 8x16 Emacs.pane.menubar.popup_*.fontList: 8x16
ツールキットのポップアップメニューでは、
pane.menubar
のかわりにmenu*
を使います。
たとえば、ポップアップメニューの項目に8x16
フォントを指定するには、
つぎのように書きます。
Emacs.menu*.fontList: 8x16
以下は、メニューバーとポップアップメニューのリソース指定の一覧です。
armColor
fontList
marginBottom
marginHeight
marginLeft
marginRight
marginTop
marginWidth
borderWidth
shadowThickness
bottomShadowColor
topShadowColor
過去に暮す方々のために、Emacsバージョン19への格下げ情報です。 Emacs 20のある種の機能の欠落による大いなる簡潔さを甘受されることを願って。
Emacs
と表示する。
enable-recursive-minibuffers
がnil
であっても、
ミニバッファを再帰的に利用する賢い方法がある。
ミニバッファ以外のウィンドウに切り替えてから、
ミニバッファコマンドを使うだけでよい。
このようにすれば何段でもミニバッファのレベルを積み重ねられるが、
M-x top-levelでもとに戻ってしまう。
compose-mail
はなくなった。
現在、C-x mはmail
を直接実行する。
grep
がなくなることはないので、M-x grep-findは除去した。
dired-mark-executables
は*
dired-mark-directories
は/
dired-mark-symlinks
は@
dired-change-marks
はc
dired-unmark-all-files
はC-M-?
dired-unmark-all-marks
はC-M-? <RET>
ただし、dired-flag-garbage-files
は&と打つので、
この場合には過去にひたっていられなくなる。
/* blah blah */
というスタイルを利用するには、
変数c-block-comments-indent-p
をt
にする。
font-lock-face-attributes
を使う。
詳しくは、この変数の説明文字列を参照。
set-frame-font
はset-default-font
と改名した。
tex-main-file
はなくなった。
もちろん、値を設定すればこの変数を作成できるが、特に何をするわけでもない。
scroll-preserve-screen-position
と
この変数で制御していた機能は除去した。
add-untranslated-filesystem
と
関数remove-untranslated-filesystem
は除去し、
より簡潔な関数using-unix-filesystems
で置き換えた。
ここでは、(『MS-DOG』とも呼ばれる)MS-DOS『オペレーティングシステム』で 稼働するEmacsの癖について簡単にふれます。 MS-DOS用に作成したEmacsのバイナリは、 Windows 3.x、Windows NT、Windows 9X、OS-2上で DOSアプリケーションとしても動作します。 MS-DOS用に作成したEmacsを使っている限り、 本章の情報はこれらすべてのシステムにあてはまります。
Windows NTやWindows 9Xに専用のEmacsを作ることも可能です。 その場合には、本章のほとんどは関係ありません。 長いファイル名、複数のフレーム、スクロールバー、マウスメニュー、 サブプロセスの利用を含めて、本書の他の部分で説明した動作に 近い動作をします。 しかし、テキストファイルとバイナリファイルに関する節は適用できます。 また、本章の最後の2つの節は、Windows NTと9Xだけに適用できます。
PCのキーボードの左側の<ALT>キーは、<META>キーに割り当てられます。
<SUPER>キーと<HYPER>キーのエミュレーションには、選択肢が2つあります。
変数dos-hyper-key
とdos-super-key
を1にすれば、
右側の<CTRL>キーを選びます。
変数dos-hyper-key
とdos-super-key
を2にすれば、
右側の<ALT>キーを選びます。
dos-super-key
とdos-hyper-key
のいずれも1でなければ、
デフォルトで右側の<ALT>キーも<META>に割り当てられます。
しかし、MS-DOSの国際化キーボード用プログラム
KEYB.COM
をインストールしてある場合は、
右側の<ALT>を<META>には割り当てません。
というのは、米国配列のキーボードでない場合、
右側の<ALT>は~や@として使われるからです。
この場合には、左側の<ALT>のみを<META>として使えます。
変数dos-keypad-mode
は、
数字キーパッド上のキーが返すキーコードを制御する変数です。
ファイル_emacs
につぎの行を入れておけば、
<ENTER>キーがC-jとして働くように定義できます。
;; 数字キーパッドのEnterキーをC-jとして動作させる。 (define-key function-key-map [kp-enter] [?\C-j])
(ほとんどのワークステーションでの呼称から) Emacsで<DEL>と呼ばれるキーは、PCでは<BS>(バックスペース)です。 このため、PC特有の端末初期化においては、 <BS>キーは<DEL>として動作するようにしています。 同じ理由から、<DEL>キーは <C-d>として動作するようにしてあります。
MS-DOS用のEmacsでは、 C-<BREAK>をC-gのような中断文字として認識します。 これは、Emacsが入力を読もうとしないと C-gが打鍵されたことを検出できないからです。 そのため、動作中のコマンドを止めるためにC-gを使えません (see Quitting)。 対照的に、C-<BREAK>は (他のシステムでのC-gのように)打鍵するとすぐに検出されるので、 動作中のコマンドを停止したり緊急脱出したりするために使えます (see Emergency Escape)。
MS-DOS用Emacsは、(デフォルトの端末だけで)マウスを使えます。 メニューやメニューバー(see Menu Bar)の利用を含めて、 マウスコマンドはドキュメントどおりに動作します。 MS-DOS用Emacsではスクロールバーは使えません。 PCのマウスには、通常、2つのボタンしかありません。 これらはMouse-1とMouse-2として動作しますが、 2つのボタンを同時に押せばMouse-3として動作します。
MS-DOS用EmacsがWindows上で動作している場合には、 クリップボードの操作を利用できます。 キルリングにテキストを置いたり、 キルリングからテキストをヤンクしたりするコマンドでは、 Xウィンドウシステムの場合と同様に、 まずWindowsのクリップボードを調べます(see Mouse Commands)。 Windows上のMS-DOS用Emacsは、 一次セレクションとカットバッファのみを利用し、 二次セレクションはつねに空です。
Windowsで実装されているクリップボードの参照方法のため、 クリップボードに置けるテキストの長さは、 Emacsが利用できるDOSの空きメモリ量に制限されます。 通常、620Kバイトまでのテキストをクリップボードに置けますが、 この上限はシステムの設定に依存し、 他のプログラムのサブプロセスとしてEmacsを実行しているときには少なくなります。 削除したテキストがクリップボードに入りきらなければ、 Emacsはその旨のメッセージを出力して、 テキストをクリップボードへ置きません。
Windowsのクリップボードにはナル文字を入れられません。 キルしたテキストにナル文字が含まれる場合には、 Emacsはそのようなテキストをクリップボードへ置きません。 さらに、エコー領域には、その旨、メッセージを表示します。
変数dos-display-scancodes
の値がnil
以外のときには、
キーを打つたびに、Emacsは各キーのASCII(コードの)値と
キーボードスキャンコードを出力します。
この機能は、デバッグ用のコマンドview-lossage
を補佐します。
MS-DOSの画面では、ボールド体(太字体)やイタリック体(斜体)などの
フォントの変種を使えませんが、
個々に前景色と背景色を指定できるフェイスを複数個使えます。
したがって、関連するフェイスに異なる表示色を定義すれば、
(font-lock
、エンリッチ(enriched)モードなどの)
フォントを用いるEmacsのパッケージの全機能を利用できます。
コマンドlist-colors-display
(see Frame Parameters)と
コマンドlist-faces-display
(see Faces)を使えば、
利用可能なフェイスと表示色、それらの見え方を知ることができます。
本章のMS-DOS and MULEでは、 DOSの画面に組み込まれたフォントでは表せない 字形や文字をEmacsがどのように表示するかを説明します。
MS-DOSでも複数のフレーム(see Frames)を利用できます。 しかし、それらはすべて重なっているので、 一度には1つのフレームしか見ることができません。 見えている1つのフレームが画面全体を覆います。 MS-WindowsのDOSボックスでEmacsを実行しているときには、 見えているフレームを画面全体より小さくはできますが、 それでも、一度に1つのフレームしか表示できません。
コマンドmode4350
は43行表示と50行表示を切り替えますが、
ハードウェアに依存します。
コマンドmode25
は、デフォルトの80x25の画面サイズに切り替えます。
デフォルトでは、Emacsは80桁で、25行、28行、35行、40行、43行、50行の
画面サイズしか知りません。
しかし、ビデオアダプタに別の画面サイズに切り替える特別な
ビデオモードがあれば、Emacsでもそれらを利用できます。
Emacsにフレームサイズをn行m桁に切り替える指示をすると、
screen-dimensions-nxm
という変数があるかどうか調べます。
変数があれば、その値(整数である必要がある)を
切り替え先のビデオモードとして使います。
(Emacsは、
screen-dimensions-nxm
の値をレジスタAL
に入れ、
BIOSの関数Set Video Mode
を呼び出し、ビデオモードを切り替えます。)
たとえば、ビデオモードを85にすると66x80の画面に切り替わるアダプタがあるとします。
_emacs
につぎの行を加えれば、
Emacsでこの画面サイズを使えるようになります。
(setq screen-dimensions-66x80 85)
MS-DOS用Emacsでは、 フレームサイズは利用可能な特定のサイズにしか設定できませんから、 フレームサイズの変更要求すべてに答えられるわけではありません。 使えないサイズが要求されると、 Emacsは指定されたサイズのつぎに大きいサイズを選びます。 たとえば、36x80のフレームを要求すると、かわりに、40x80になります。
変数screen-dimensions-nxm
は、
指定サイズに正確に一致するときだけ使われます。
利用可能なつぎに大きなサイズの候補を探すときには無視します。
上述の例では、VGAで38x80を使えて、
変数screen-dimensions-38x80
に適切な値を定義したとしても、
36x80のフレームを要求した場合には、40x80の画面になってしまいます。
このような場合に38x80のサイズにしたければ、
変数screen-dimensions-36x80
にも
screen-dimensions-38x80
と同じビデオモードの値を入れます。
MS-DOSでは、フレームサイズを変更すると、 他のすべてのフレームのサイズも変更してしまいます。
他のシステムではファイル名の構成要素の区切りにはスラッシュを使いますが、
MS-DOSでは、普通、バックスラッシュ\
を使います。
MS-DOS用Emacsでは、スラッシュもバックスラッシュも使えて、
さらに、ファイル名に含まれるドライブ名も理解します。
MS-DOSでは、ファイル名に大文字小文字の区別はなく
8文字に制限されますが、ピリオドとさらに3文字を付加できます。
Emacsは他のシステム向けのファイル名を扱ううえで、
これらの制限を熟知しています。
たとえば、ドット.
で始まるファイル名は、
MS-DOSでは正しくないので、Emacsはそれを透過的に下線_
に変換します。
したがって、デフォルトの初期化ファイル(see Init File)は、
MS-DOSでは_emacs
と呼ばれます。
ピリオドの前後の文字数制限を越えた部分は、
通常、MS-DOSが無視します。
したがって、ファイルLongFileName.EvenLongerExtension
を訪れると、
実際にはlongfile.eve
を訪れることになりますが、
モード行にはもとの長い名前が表示されます。
これ以外には、MS-DOSにおいて正しいファイル名を指定するのは、
ユーザーの責任です。
上述した透過的な変換は、Emacsに組み込まれたファイル名にのみに作用します。
MS-DOSでの上述のファイル名の制限のために、
もとのファイル名の文字をいくつか捨てずに
バックアップファイル(see Backup Names)の名前を構成することは不可能です。
たとえば、バックアップを1つしか使っていなくても、
docs.txt
のバックアップファイルの名前は
docs.tx~
となります。
Windows 9x上のDOSアプリケーションとしてEmacsを実行する場合には、
長いファイル名の使用を有効にできます。
そうすると、Emacsは、ファイル名を切り詰めたり小文字に変換したりせずに、
指定したとおりのファイル名をそのまま使います。
長いファイル名の使用を有効にするには、
Emacsを起動するまえに、環境変数LFN
にy
と設定します。
残念ながら、Windows NTではDOSプログラムから長いファイル名を使えませんので、
MS-DOS用Emacsからは短い8+3の別名しか見えません。
MS-DOSにはホームディレクトリという概念がないので、
MS-DOS用Emacsでは、Emacsをインストールしてあるディレクトリを
環境変数HOME
の値であるということにします。
つまり、Emacsのバイナリemacs.exe
が
ディレクトリc:/utils/emacs/bin
に置いてあるとすれば、
Emacsは、環境変数HOME
がc:/utils/emacs
と
設定されているかのようにふるまいます。
特に、ここが初期化ファイル_emacs
を探す場所となります。
このことを心に留めておけば、UNIXでのように、
ホームディレクトリの別名としてファイル名に~
を使えます。
Emacsを起動するまえに環境変数HOME
を設定することもでき、
その場合には、上述のデフォルトのふるまいに優先します。
DJGPPのエミュレーションライブラリの機能では
入出力装置はディレクトリ/dev
に置かれていると仮定するので、
MS-DOS用Emacsはディレクトリ名/dev
を特別扱いします。
いかなるディスク上でも/dev
というディレクトリ名を使わないように
忠告しておきます。
GNU Emacsでは、テキスト行の区切りとして改行文字を使います。 これは、GNU Emacsが開発されたUNIXでの習慣であり、 UNIXをモデルとしたGNUシステムでの習慣でもあります。
MS-DOSとMS-Windowsでは、テキスト行の区切りとして、 通常、復帰・行送りの2文字列を使います。 (行送りは改行と同じ文字です。) したがって、Emacs において典型的なファイルを便利に編集するには、 これらの行末(end-of-line、EOL)文字列を変換する必要があります。 Emacsは通常つぎのようにします。 ファイルを読み込むときには復帰・行送りを改行に変換し、 ファイルを書き出すときには改行を復帰・行送りに変換します。 国際文字コードの変換を扱う機構でもこの変換を行います (see Coding Systems)。
ほとんどのファイルにおけるこの特別な書式変換のために、 Emacsが報告する文字位置(see Position Info)は、 オペレーティングシステム上でのファイルサイズ情報と食い違います。
内容がテキストではないある種のファイルは、変換すべきではありません。
したがって、MS-DOS用Emacsは、
ある種のファイルをバイナリファイルとして区別して、
そのまま読み書きします。
(この区別はMS-DOSのものではなく、Emacsがもたらすものです。)
これらには、実行プログラム、圧縮したアーカイブなどが含まれます。
Emacsはファイル名を用いて、バイナリファイルとして扱うべきかどうか決定します。
変数file-name-buffer-file-type-alist
には、
バイナリファイルを表すファイル名のパターンを定義しておきます。
file-name-buffer-file-type-alist
に指定したバイナリファイルの
パターンにファイル名が一致すると、
Emacsは行末変換だけでなくすべての符号変換を抑制する
コーディングシステム(see Coding Systems)no-conversion
を使います。
さらに、Emacsは、ファイルの内容から行区切りとして 復帰・行送りでなく改行を用いていると判断すると、 ファイルの読み書きにおいて変換を行いません。 したがって、特に努力しなくても、 UNIXやGNUシステムからのファイルをMS-DOS上で読んだり編集でき、 それらのファイルの行末はUNIX流の行末のままです。
コマンドfind-file-text
やコマンドfind-file-binary
を用いると、
ファイルをテキストとして扱うか
バイナリとして扱うかを指定して訪れることができます。
行末変換はコーディングシステムの一般的な変換機構の一部なので、
コーディングシステムを指定するコマンド(see Specify Coding)によって
ファイルをテキストとして扱うかバイナリとして扱うかを指定することもできます。
たとえば、C-x <RET> c undecided-unix <RET> C-x C-f foobar.txt
とすれば、行末変換をせずにファイルfoobar.txt
を訪れることができます。
モード行にはカレントバッファで行末変換を行ったかどうか表示されます。 モード行の始めのほうにあるコーディングシステムを表す文字のうしろには、 通常、コロンが表示されます。 バッファでMS-DOSの行末変換を使っている場合には、 この文字はバックスラッシュに変わります。
NFSやSambaを用いてUNIXやGNUシステムを使った
コンピュータ上のファイルシステムを参照するとき、
これらのファイルシステム上のどのファイルに対しては、
新規作成時でなくても、Emacsは行末変換を行うべきではありません。
こうするためには、
該当するファイルシステムを無変換の
ファイルシステムと指定するために、
関数add-untranslated-filesystem
を呼びます。
この関数は、ファイルシステム名である引数を1つとりますが、
これにはドライブ名やディレクトリ名を含めることもできます。
たとえば、
(add-untranslated-filesystem "Z:")
は、ドライブZを無変換のファイルシステムとして指定しますし、
(add-untranslated-filesystem "Z:\\foo")
は、ドライブZ上のディレクトリ\foo
を
無変換のファイルシステムとして指定します。
個人の_emacs
ファイルや
サイトの全ユーザーに便利なようにsite-start.el
の中で、
add-untranslated-filesystem
を使うことが多いでしょう。
add-untranslated-filesystem
の効果を取り消すには、
関数remote-untranslated-filesystem
を使います。
この関数は、まえにadd-untranslated-filesystem
に使ったのと
同じ文字列を引数としてとります。
lpr-buffer
(see Hardcopy)や
ps-print-buffer
(see Postscript)のような印刷コマンドは、
UNIX流のプログラムlpr
がない場合には、
プリンタポートに直接出力を送ればMS-DOSやMS-Windowsでも動作します。
このふるまいは、UNIX上のlpr
での印刷
(see Hardcopy、see Postscript Variables)
を制御する変数と同じ変数で制御されますが、
MS-DOSやMS-Windows上でのこれらの変数のデフォルト値は、
UNIX上での値と同じではありません。
DOS流の通常の印刷のように、ローカルのプリンタを使いたい場合には、
Lisp変数lpr-command
に""
(デフォルト値)を設定し、
printer-name
にはプリンタポートの名前を設定します。
たとえば、ローカルのプリンタポートならば(デフォルト値の)"PRN"
や
"LPT2"
、シリアルプリンタならば"COM1"
です。
printer-name
にはファイル名も設定できます。
その場合には、『印刷』結果は、そのファイルに追加書きされます。
printer-name
に"NUL"
を設定すると、
印刷結果は(システムの空デバイスに送られて)黙って捨てられます。
MS-Windowsでは、Windowsのネットワークソフトウェアをインストールしてあれば、
printer-name
に、他のマシンとの共用プリンタのUNC共用名
(たとえば"//joes_pc/hp4si"
)を設定すれば、
そのプリンタを利用することもできます。
(スラッシュでもバックスラッシュでもかまいません。)
共用プリンタの名前を調べるには、
DOSコマンドプロンプトでnet view
を実行してサーバー一覧を取得してから、
net view server-name
を実行して
サーバーが共有するプリンタ(とディレクトリ)の名前を調べます。
printer-name
にファイル名を設定するときには、
絶対ファイル名を使うのが最良です。
Emacsは、カレントバッファのデフォルトディレクトリに応じて
作業ディレクトリを変更します。
printer-name
のファイル名が相対的であると、
印刷を行ったバッファのディレクトリごとに、
そのような名前のファイルができてしまいます。
コマンドprint-buffer
やprint-region
は、
各印刷ページに見出しを付けるために、
pr
プログラムを呼び出したり、
lpr
プログラムに対して特別なフラグを使います。
MS-DOSやMS-Windowsには、通常、これらのコマンドはありませんから、
デフォルトでは、変数lpr-headers-switches
は、
ページ見出しを付ける要求を無視するように設定してあります。
したがって、print-buffer
やprint-region
は、
それぞれ、lpr-buffer
やlpr-region
と同じ出力になります。
(たとえばGNU Textutilsなどの)適当なpr
プログラムがあるならば、
lpr-headers-switches
にnil
を設定します。
すると、Emacsはページ見出しを付けるためにpr
を呼び出し、
printer-name
の指定に従って出力結果を印刷します。
lpr
と同じ動作をするlpr
がある場合には、
変数lpr-command
に"lpr"
と設定できます。
すると、他のシステムと同様に、Emacsはlpr
を使って印刷します。
(プログラム名がlpr
でない場合には、
lpr-command
にはプログラムを探す場所を設定する。)
lpr-command
が""
以外の場合には、
変数lpr-switches
には標準的な意味があります。
変数printer-name
の値が文字列である場合には、
UNIXの場合と同様に、lpr
のオプション-P
の値として使われます。
同様の一連の変数、ps-lpr-command
、ps-lpr-switches
、
ps-printer-name
(see Postscript Variables)は、
PostScriptファイルの印刷方法を定義します。
これらの変数は、上に述べた非PostScript印刷用の対応する変数と
同じように使われます。
つまり、ps-printer-name
の値は、
非PostScript印刷でのprinter-name
の使い方と同様に、
PostScript出力の送り先の装置(やファイル)の名前として使われます。
(つまり、別々の2つのポートに2台のプリンタを接続してあり、
その一方がPostScriptプリンタの場合、異なる2組の変数群を使える。)
変数ps-lpr-command
のデフォルト値は""
であり、
PostScript出力をps-printer-name
で指定するプリンタポートへ
送ることを意味します。
しかし、ps-lpr-command
には、PostScriptファイルを受理する
プログラムの名前を設定してもかまいません。
つまり、非PostScriptプリンタがある場合、
この変数に(Ghostscriptなどの)PostScriptインタープリタプログラムの
名前を設定できます。
インタープリタプログラムに渡す必要があるオプションは、
ps-lpr-switches
を用いて指定します。
(ps-printer-name
の値が文字列の場合、その値は、
オプション-P
の値として、オプション列に付加される。
これは、lpr
を使う場合にだけ有用であろう。
というのは、インタープリタを使う場合、典型的には、
ps-printer-name
には文字列以外を設定して無視させる。)
たとえば、ポートLPT2
に接続したEpsonプリンタに印刷するために
Ghostscriptを使うには、つぎの内容を個人のファイル_emacs
に入れます。
(setq ps-printer-name t) ; Ghostscriptは -P を理解しない (setq ps-lpr-command "c:/gs/gs386") (setq ps-lpr-switches '("-q" "-dNOPAUSE" "-sDEVICE=epson" "-r240x72" "-sOutputFile=LPT2" "-Ic:/gs"))
(この例では、
ディレクトリ"c:/gs"
にGhostscriptをインストールしてあると仮定。)
MS-DOSとMS-Windowsでは、後方互換のために、
dos-printer
(やdos-ps-printer
)の値を設定してあると、
printer-name
(やps-printer-name
)の値を上書きします。
MS-DOS上のEmacsは、UNIXや他のプラットフォーム上と同じ 国際化文字集合を扱えます(see International)。 これには、異なる文字集合のあいだの変換を行うコーディングシステムも含みます。 しかしながら、MS-DOS/MS-WindowsとUNIXとの非互換性に起因する DOSに固有な特色があり、ユーザーは理解しておく必要があります。 本節では、これらの特色について述べます。
MS-DOSは、一度には256文字から成る単一の文字集合を扱えるように 設計されていますが、さまざまな文字集合から選択できます。 代替文字集合は、DOSコードページと呼ばれます。 各コードページは、128個の全ASCII文字を含みますが、 残りの128文字(コード128〜255)は、コードページごとに異なります。 各DOSコードページは、850や862などの3桁の数字で識別します。
同時に複数のフォントを使えるXウィンドウに比べると、 MS-DOSでは1つのセッションでは複数のコードページを使えません。 MS-DOSはシステムブート時に単一のコードページをロードします。 コードページを変更するにはMS-DOSをリブートする必要があります 65。 MS-Windowsなどの他のシステムでDOSプログラムを実行する場合にも、 同様の制約が課せられます。
MS-DOS上でオプション--unibyte
(see Initial Options)を指定してEmacsを起動すると、
Emacsは、いかなる変換も非ASCII文字には行いません。
非ASCII文字はそのまま読み書きし、
画面には8ビットコードをそのまま送ります。
つまり、MS-DOS上のユニバイトEmacsは、
なんであれカレントコードページを使いますが、
それ以外の文字を表現することはできません。
MS-DOS上でのマルチバイト操作には、
Emacsは、選択されているDOSコードページで表示できる文字群を
知っておく必要があります。
そのため、起動後、選択しているコードページ番号をシステムに問い合わせ、
変数dos-codepage
にその番号を保存します。
実際に使っているコードページとは異なっていても、
カレントコードページのデフォルト値437を返すシステムもあります。
(典型的には、ディスプレイ装置に組み込まれたコードページを使用すると
発生する。)
個人の初期化ファイルで変数dos-codepage
を設定すれば、
Emacsが使うコードページ(番号)を別のものに指定できる。
マルチバイトEmacsは、特定のDOSコードページだけを扱えます。 これらには、日本語用コードページ932のような極東の文字を表示できものや、 単一のISO 8859文字集合を符号化できるものが含まれます。
極東用コードページは、 それらの国々用のMULE文字集合の1つを直接表示できますから、 Emacsは、コードページで扱える 適切な端末コーディングシステムを設定するだけです。 本節の残りで述べる特別な機能は、 ISO 8859文字集合を符号化するコードページに関することです。
ISO文字集合の1つに対応したコードページに対しては、
Emacsはコードページ番号に基づいた文字集合名を知っています。
Emacsは、カレントコードページを用いたファイルの読み書きを扱う
コーディングシステムを自動的に作成し、
デフォルトでこのコーディングシステムを使います。
コードページ番号をnnnとすると、このようなコーディングシステムの
名前はcpnnn
です。
66
すべてのcpnnn
コーディングシステムは、
モード行の表示に(『DOS』の)文字D
を使います。
端末コーディングシステムとファイル入出力用のデフォルトの
コーディングシステムは、起動時に、
正しくcpnnn
コーディングシステムに設定されますから、
MS-DOSでは、モード行は普通-DD\-
で始まります。
See Mode Line。
極東用DOS端末は、cpnnn
コーディングシステムを使用せず、
そのため、初期のモード行はUNIXのようになります。
コードページ番号は、使用する文字群を指定しますから、
Emacsは、その文字群用の言語環境を選択するために
set-language-environment
を自動的に実行します
(see Language Environments)。
バッファ内に異なるISO 8859文字集合に属する文字、
すなわち、選択しているDOSコードページで扱えない文字が含まれる場合、
Emacsはその文字をASCII文字の列で表示します。
たとえば、カレントコードページに文字ò
(アクサングレーブ付きの小文字のo
)の字形がないときには、
中括弧で囲って1文字であることを表して、
{`o}
と表示します。
(このようにすると、ギリシャ文字やヘブライ文字などの非Latin文字のなかには、
とても見難くなるのもがあるが、その言語を知っている人には
少なくとも読める。)
1文字でも画面上は数桁を占めますが、
実際には単一の文字であり、Emacsのすべてのコマンドも1文字として扱います。
DOSコードページ内のすべての文字がISO 8859文字に対応するわけではなく、
箱を描くための文字や他の図形用文字もあります。
Emacs内部ではこれらの文字を表現できませんので、
これらの文字を含んだファイルを読み込むと、
これらの文字は、変数dos-unsupported-character-glyph
で指定した
特定の文字コードに変換されます。
Emacsは、ISO 8859以外の他の多く文字集合を扱えますが、
それらをMS-DOS上では表示できません。
そのようなマルチバイト文字がバッファ内にあると、
MS-DOS上のEmacsは、変数dos-unsupported-character-glyph
の
指定どおりに表示します。
デフォルトでは、その字形は、白抜きの三角形です。
コマンドC-u C-x =を使って、そのような文字の
実際の文字コードと文字集合を表示してください。
See Position Info。
デフォルトでは、Emacsはカレントコードページを扱えるコーディングシステムを 定義します。 (他国のDOSマシンで書いたファイルを訪問するなどの) 他のコードページ用のコーディングシステムを定義するには、 コマンドM-x codepage-setupを使います。 これは、3桁のコードページ番号を問い合わせてきますが、補完を使えます。 そして、指定したコードページ用のコーディングシステムを作成します。 これで、新たなコーディングシステムを使ってファイルを読み書きできますが、 このコーディングシステムを使うには、 ファイルコマンドで明示する必要があります(see Specify Coding)。
これらのコーディングシステムは、 DOSコードページで符号化したファイルを 他のオペレーティングシステム上のEmacsで訪問する場合にも利用できます。
MS-DOSはシングルプロセスの『オペレーティングシステム』なので、 非同期なサブプロセスは利用できません。 特に、シェル(shell)モードやその派生モードは動きません。 綴りの修正やGUDなどの非同期のサブプロセスを用いたEmacsの機能のほとんどは、 MS-DOSでは動きません。 疑うならば試してみてください。 動作不能なコマンドは、「非同期サブプロセスを使えない」旨の エラーメッセージを出力します。
MS-DOS用Emacsでも、 M-x compileによるコンパイル、 M-x grepによるファイルの探索、 M-x diffによるファイルの比較は動作しますが、 これらは下位プロセスを同期して走らせます。 つまり、下位プロセスが終了するまではいっさい編集はできません。
対照的に、Windows専用にコンパイルしたEmacsでは、 非同期プロセスを使えます。 See Windows Processes。
lpr-buffer
(see Hardcopy)や
ps-print-buffer
(see Postscript)のような印刷コマンドは、
MS-DOSではプリンタポートの1つに出力を送ることで動作します。
See MS-DOS Printing。
MS-DOSで同期的にサブプロセスを動かす場合には、 プログラムが確実に終了し、しかも、キーボードからまったく入力しないことを 確認してください。 MS-DOSにはプロセスを終了させる一般的な方法がないので、 プログラムがみずから終了できない場合には、 それを終了させることができなくなります。 このような場合、 C-cやC-<BREAK>を押すと助かる場合もあります。
MS-DOSでは、他のマシンのファイルを参照することはできません。 MS-DOSにネットワーク機能が組み込まれていなければ、 メイルの送信、Webの閲覧、リモートログインなどの ネットワーク向けのコマンドも使えません。
MS-DOSでのdiredは、
他のシステムではシステムのls
コマンドを使う場面で
パッケージls-lisp
を使います。
したがって、MS-DOSのdiredでは
変数dired-listing-switches
に設定できるオプションは限られます。
使えるオプションは、
-A
、-a
、-c
、-i
、-r
、-S
、
-s
、-t
、-u
です。
(DOS版と対比して)Windows専用にコンパイルしたEmacsでは、 非同期のサブプロセスを完全に使えます。 Windows版では、32ビットのWindowsアプリケーションを実行している限りは、 同期であれ非同期であれサブプロセスはうまく動作します。 しかし、サブプロセスでDOSアプリケーションを実行すると、 アプリケーションの実行に問題を生じたり実行できなかったりします。 さらに、2つのDOSアプリケーションを同時に2つのサブプロセスで実行すると、 システムをリブートしなければならなくなります。
Windows 95の標準のコマンドインタープリタ (および、ほとんどのコマンド行ユーティリティ)はDOSアプリケーションなので、 この種のシステムを使う場合には上記の問題は重要になります。 しかし、これに関してわれわれにできることは何もなく、 Microsoftだけが修正できるのです。
DOSアプリケーションのサブプロセスを1つだけ実行するならば、 『行儀がよく』て、しかも、画面を直接操作するなどの 非標準的な動作をしない限りは、サブプロセスは予想どおりに動作するはずです。 CPUモニタ(監視)アプリケーションを使うと、 DOSアプリケーションが停止しているときでさえも、 マシンは100%ビジーになりますが、 これはCPUモニタがプロセッサの負荷を調べる方法に起因します。
別のサブプロセスでDOSアプリケーションを実行する場合には、 まえもってDOSアプリケーションを終了しておく必要があります。 Emacsは、DOSのサブプロセスに割り込んだり停止させることができません。 このようなサブプロセスを終了する唯一の方法は、 そのプログラムに終了を指示するコマンドを与えることです。
別々のサブプロセスにおいて2つのDOSアプリケーションを同時に実行しようとすると、 一方あるいは両方が非同期であるとしても、 2番目に起動したものは最初のものが終了するまで休止してしまいます。
最初のサブプロセスを操作できて終了を指示できるならば、 2番目のサブプロセスは正常に実行を継続するはずです。 しかし、2番目が同期サブプロセスであれば、 最初のサブプロセスが終了するまではEmacs自体が固まってしまいます。 ユーザー入力なしに終了できない場合には、 Windows 95を使っている限りリブート以外の選択はありません。 Windows NTであれば、プロセスを調べるアプリケーションを使って、 適当なntvdmを終了させます(するとDOSの2つのサブプロセスも終了します)。
このような状況でWindows 95をリブートすることが必要になったときには、
Start
メニューの中のShutdown
コマンドを使ってはいけません。
たいていの場合、システムが固まってしまいます。
かわりに、CTL-ALT-<DEL>を打鍵してShutdown
を選びます。
処理に数分かかる場合もありますが、多くの場合、機能してくれます。
Windows専用にコンパイルしたEmacsでは、 <ALT>キーを押してWindowsのメニューを立ち上げる機能を切ってあります。 これは、Emacsでは<ALT>は<META>の働きをするからです。 Emacsを利用しているときには、 ユーザーはしばしばいったん<META>キーを押してから何もせずに放します。 この動作でWindowsのメニューが立ち上がってしまうと、 以降のコマンドの意味が変ってしまいます。 多くのユーザーにはこれでは邪魔でしょう。
w32-pass-alt-to-system
にnil
以外の値を設定すれば、
<ALT>キーを押したときの処理はWindowsのデフォルトに戻ります。
GNU宣言(GNU Manifesto)(以下参照)は、GNUプロジェクトの初期の頃に、 Richard Stallmanが参加とサポートを求めるために書いたものである。 当初2〜3年間は、開発について説明するために参考として用いつつ更新していたが、 現在では、人々がよく目にするので変更しないでおくことが最善であると考えている。その時以来、我々は、いくつかの表現をわかりやすくしたつもりだが よく誤解を招く点があることがわかった。 そこで、そのような点を明確にするべく、1993年に脚注として追記した。
現在配布可能なGNUソフトウェアに関する最新情報は、 GNU's Bulletin([訳注]日本語版であれば「GNUダイジェスト」)の最新号を ご覧いただきたい。 ここに引用するには情報量が多すぎるので。
GNUとはGnu's Not Unixの略であり、誰もがフリーに使えるよう67、 私が今作成しているUnixと完全互換のソフトウェア・システムの名称である。 何人ものプログラマが私を手伝ってくれている。 時間やお金、プログラム、機器の寄付を大いに必要としている。
既に我々のもとには、エディタ・コマンド記述用のLispを備えている Emacsというテキスト・エディタや、ソース・レベル・デバッガ、 yacc互換の構文解析部生成ツール、リンカ、その他約35個のユーティリティがある。 シェル(コマンド・インタープリタ)はほぼ完成している。 移植性の良い新しい最適化Cコンパイラは自分自身をコンパイルできるようになり、 今年中にはリリースできるだろう。 初期段階のカーネルはあるが、Unixをエミュレートするためには もっと多くの機能が必要である。 カーネルとコンパイラが完成すれば、 プログラム開発にふさわしいGNUシステムを配布できるだろう。 テキスト処理にはTeXを採用するつもりだが、nroff関連の作業も進行中である。 また、フリーで移植性の良いX Window Systemも採用する。 そのあとは、移植性の良いCommon Lispや、Empireゲーム、スプレッドシート、 その他数多くのものを、オンライン・ドキュメントと共に追加していく。 最終的には、Unixシステムに標準で付いている有用なツール全てに加えて、 さらにはそれ以上のものを提供したいと考えている。
GNUは、Unixのプログラムを実行できるようにするつもりだが、 Unixとは同一のものにはならない。 他のオペレーティング・システムでの我々の経験を基に、 より使いやすくなるよう、全面的に改良していくからである。 特に、長いファイル名の使用やファイルのバージョン番号、 耐クラッシュ性に優れたファイル・システム、 ファイル名の補完機能([訳注]ファイル名を途中まで指定しただけで そのあとはシステムが完全なファイル名を追加してくれる機能)、 端末に依存しない表示のサポート、おそらく最終的には、 いくつかのLispプログラムと通常のUnixプログラムが1つの画面を 共有できるようなLispベースのウィンドウ・システムを作る予定である。 システム・プログラミング言語としては、C言語とLispの両方が使用可能になるだろう。 通信用には、UUCP、MIT Chaosnet、Internetの各プロトコルを サポートしようと考えている。
GNUでは、最初は68000/16000([訳注]モトローラ68000とナショナル・ セミコンダクタの16000)クラスの仮想記憶を備えたマシンを対象とする。 というのは、GNUを最も実行しやすいマシンだからである。 もっと能力の小さなマシン上でGNUを動作させるための努力は、 そのマシン上で使いたい人の手に委ねることにする。
とんでもない誤解を避けるために、このプロジェクトの名称としての 「GNU」の場合は、「G」を発音していただきたい。 ([訳注]もともと普通名詞のGnuはヌーという動物であり、 その発音を採用するとGNU projectはヌー・プロジェクトになり new projectと間違われる可能性もある。)
もし私の好きなプログラムを他の人も好きであれば、 私はその人とプログラムを分かち合わなくてはならない、 という黄金律([訳注]自分の欲することは他の人にも為すという考え方)を考案した。 ソフトウェア販売会社は、ユーザ1人1人に他人と共有しない契約を させることによって、ユーザを分離し支配しようとしている。 そのような方法で他のユーザとの連帯意識を壊すことは私は嫌である。 機密保持契約やソフトウェア・ライセンス契約へのサインは良心からできない。 何年もの間、私はそういった傾向やその他の冷遇に抵抗するために、 AIラボ内で活動してきたが、最後にはその傾向や冷遇は度を越していった。 私に対してAIラボが行なった事は私の意志に反するので、 そこに留まることができなくなった。
信念を曲げることなくコンピュータを使い続けるために、 フリーでないソフトウェアがなくてもうまくやっていけるような フリー・ソフトウェアのしっかりした団体を組織することを決意した。 私がGNUを配布することをMITが合法的に阻止するのを拒否するために、 私はAIラボを辞職した。
Unixは私の理想とするシステムではないが、それほど悪いシステムでもない。 Unixの基本的な機能は良いものなので、それらを生かしつつ、 Unixに欠けているものを補っていけるだろうと考えている。 また、Unix互換のシステムであれば、 GNUを採用する他の多くの人々にとっても有用であろう。
GNUはパブリック・ドメインには置かない。 それにより、誰もがGNUを修正して再配布でき、 配布者が再配布することを禁止されることもない。 つまり、独占的な修正はできないのである。 私は、あらゆるバージョンのGNU ([訳注]誰でもソース・コードをアクセスできるという意味で)が 確実にフリーであり続けて欲しいのである。
私は、他の数多くのプログラマがGNUに熱狂し、 そして協力したがっていることを知った。
多くのプログラマが、システム・ソフトウェアの営利化に不満を抱いている。 その営利化とは、プログラマに金儲けをさせる代わりに、 他の一般のプログラマを仲間ではなく競争相手として見るよう仕向けるからである。 プログラマ間の友情を示す基本的な行為は、プログラムの共有である。 現在の典型的な市場の取り決めは、 プログラマが他のプログラマを友人として接することを根本的に禁じてしまっている。 ソフトウェアの購入者は、友情をとるか、法律に従うかを選択しなくてはならない。 当然、友情のほうが大切であると考える人のほうが多いだろう。 しかし、法律に従うべきであると考える人のなかには、 このようなことが簡単に選択できない人が多い。 そういう人は人の誠意を信じない人間になっており、 プログラミングは単なる金儲けの一手段でしかないと考えているからである。
独占的なプログラムではなくGNUに関する作業を行ない、GNUを使っていれば、 誰に対しても排斥的ではなくなり法を守ることもできる。 さらに、GNUは共有という点において、激励するための一例となり、 人々が我々に参加すべく結集するための旗印となる。 これにより、もし我々がフリーでないソフトウェアを使っていては 得られないある種の和の感情を抱くことができる。 私が対話したプログラマのうちの約半数が、 これはお金には換えられない大切な幸福であると言っている。
私は、コンピュータ・メーカにはマシンとお金の寄付を求めている。 個人に対してはプログラムと労働の寄付を求めている。
マシンの寄付を受けた場合は、その見返りの1つとして、 GNUが近いうちにそのマシン上で動作するようになるだろう。 マシンは完成していてシステムが使える状態であり、 住宅区域で使用可能で、特殊な冷却や電力を必要としないものでなくてはならない。
私は非常に多くのプログラマがGNUのためにパートタイムで作業する 熱意があることを知った。 ほとんどのプロジェクトでは、 そういったパートタイムでの分散した作業をまとめていくことは非常に困難だろう。 しかし、Unixを置き換えるというこの特定の作業に関しては、そのような問題はない。 完全なUnixシステムには数百ものユーティリティ・プログラムがあり、 その1つ1つには別個にドキュメントが付いている。 たいていのインタフェース仕様は、Unixとの互換性の観点から決定されている。 プログラマ各人が単一のUnixユーティリティと互換の代替品を作成できれば、 そのようなユーティリティをひとまとめにしても正しく動作するはずである。 マーフィーの例で言えば、いくつか予期せぬ問題が生じたとしても、 これらの構成要素をまとめることは可能な作業であろう。 (カーネル作業には、より緊密なコミュニケーションが必要なので、 少人数で密接なグループでの作業となる。)
お金の寄付を受けた場合は、フルタイムかパートタイムで2〜3人を雇えるだろう。 給料はプログラマの標準収入ほど高くはないが、お金を稼ぐことと同じように 共同体精神を築くことは重要だと考えている人を私は捜している。 私は、この給料とは、プログラマが別の方法で生計を立てなくても、 GNU作業に全力投球できるようにするための一手段としてとらえている。
いったんGNUが作成されれば、誰もが良質のシステム・ソフトウェアを無料で 入手できるようになる。68
これは、Unixライセンスの価格を誰もが節約できることだけではなく 多くのことを意味する。 つまり、非常に無駄となるシステム・プログラミングの重複を避けることができる。 代わりに、その労力は現在の技術水準の進歩に向けることができる。
完全なシステム・ソースは誰に対しても配布可能になる。 そのため、システムに変更を施さなくてはならないユーザは、 自分でいつでも自由にそれを行なったり、あるいは、 自分の代わりにそれを行なってくれるプログラマや企業を 雇うことができるようになる。 ユーザはもはや、ソース・コードを所有するプログラマや企業のなすがままに なることはなく、変更を施すことに関しては独立した存在でいられる。
大学側は、学生にシステム・コードを学習し、改良するよう奨めることにより、 はるかに良い教育環境の提供が可能になる。 ハーバード大学のコンピュータ研究所では、 ソース・コードを公開して見れないようなプログラムは一切、 システムにインストールしないという方針が習慣であり、 特定のプログラムをインストールすることを実際に拒否することを支持した。 このことに私は非常に勇気づけられた。
最後に、システム・ソフトウェアを誰が所有しているのかを、 それを使ってやっていいことといけないことを考慮することの オーバーヘッドが解消されるだろう。
人々にプログラムの使用料を支払わせる契約(複製のライセンスを含む)は 常に、人がいくら(つまり、どのプログラムに)支払わなくてはならないかを 理解するのに欠くことのできない厄介な機構を通じて、 社会は多大なコストを被っている。 そして、警察国家でもなければ、 そのような機構に全ての人を従わせることはできない。 例えば、多大なコストをかけて空気を製造しなくてはならない 宇宙ステーションのことを考えてみよう。 空気1リットルごとの息継ぎに課金すれば公平かもしれないが、 たとえ皆が空気料金を支払う余裕があったとしても、 そのために一日中メータ付きの空気マスクを付けるとなれば耐え難いことである。 まして、マスクを外したかどうかをTVカメラが至る所で見張っているなどというのは、 全くとんでもないことである。 それよりは、料金を頭割りにした税金で空気工場を維持して、 マスクを外すほうがましである。
プログラムの一部または全てを複写することは、 プログラマにとって呼吸するのと同じくらい自然なことであり生産的なものである。 だから、プログラムはフリーであるべきである。
『プログラムがフリーであれば誰もそれを使わないだろう。 なぜならば、無料ということは、サポートを当てにできないからである。』『サポートを提供するために料金をプログラムに課す必要がある。』
人々が、サービスのない無料のGNUよりも、 サービス付きの有料のGNUのほうに支払うというのであれば、 GNUを無料で入手した人々に対して、 サービスだけを提供する企業は利益を得て当然である。69
本当のプログラミング作業を行なうサポートと、 単なる支援とは区別すべきである。 前者は、ソフトウェア業者からのサポートを当てにできない種類のものである。 もしあなたの問題が多くの人々の問題になっていなかった場合には、 ソフトウェア業者は邪魔しないでほしいと言うだろう。
あなたのビジネスがサポートに頼らざるをえない場合は、 必要なソース・コードとツールを全て自分で抱えるしかない。 そうすれば、あなたの問題点を直してもらうための人を雇うことができる。 人に翻弄されることはない。 Unixを使う場合、ソース・コードが高価なので、 ほとんどのビジネスではこのようなことはできない。 GNUを使えば、これは簡単に実現する。 有能な人材がいなかったとしても可能であり、しかも、 問題点を修正できないのは配布規定のせいでは断じてない。 GNUは、世界中の全ての問題ではなく、その一部のみを取り除いている。
一方、コンピュータについて何も知らないユーザには支援が必要である。 自分で容易に処理できる範疇であっても、 その方法を知らない場合に支援が必要なのである。
そのようなサービスは、単なる指導や修理サービスだけを行なっている 企業が請け負うことができるだろう。 ユーザがお金を支払ってもサービス付きの製品を購入するほうが良いと 考えているのであれば、無料の製品に対するサービスにも喜んでお金を払うだろう。 サービス会社は、品質と価格の面で競争することになり、 ユーザは特定のサービス会社にこだわる必要がなくなる。 一方、サービスを必要としない我々等などであれば、 サービスへの対価を支払わなくても、プログラムを使うことができる。
『広告なしでは多くの人々に知らせることは無理であり、 その費用だけでもプログラムに料金を課すべきである。』『誰もが無料で入手できるようなプログラムを宣伝しても仕方がない。』
GNU等の情報を、多くのコンピュータ・ユーザに知らせられるような 無料またはきわめて安価な広告媒体がいろいろとある。 しかし、宣伝すれば、より多くのマイクロコンピュータ・ユーザに 知らせられるというのも事実かもしれない。 本当にそうであれば、GNUを無料で複写したり配布するサービスを 宣伝するビジネスは、その広告費用にかかった以上の成功をおさめるはずである。 この方法は、宣伝によって利益を得るユーザだけが広告料を払うものである。
他方では、多くの人々が友人からGNUを入手するので、 上記のような企業が成功しないというのであれば、その宣伝がGNUを広める上で、 本当に必要なものではないということである。 なぜ自由市場擁護者は、 このことを自由市場に決めさせたくないのだろうか?70
『私の会社は、競争の頂点に立つために独占的なオペレーティング・ システムが必要である。』
GNUにより、オペレーティング・システム・ソフトウェアは競争の世界から 取り除かれることになるだろう。 このオペレーティング・システム・ソフトウェアの分野では、 あなたは競争の頂点に立つことはできないし、競争相手もそうなることはできない。 この分野では、あなたとその競争相手は互いに利益を受け、 競い合うのは他の分野でということになる。 あなたのビジネスがオペレーティング・システムの販売であった場合には、 GNUは好ましくなく、あなたにとって厳しい状況になるだろう。 あるいは他の種類のビジネスならば、オペレーティング・システムの販売といった 高価なビジネスにあなたが強要されないよう、GNUがあなたを救うことができる。
私は、多くのメーカやユーザからの寄付に支えられてGNUが発展し、 そのような人々の個々のコストが軽減されていくのを この目で見たいと思う。71
『プログラマは自分の創造性に対して報酬を受けるに値しないのではないか?』
何事にも報酬があるとしたら、それは社会的貢献である。 創造性は社会的貢献となりうるが、 それは社会がその成果を自由に使用できる場合に限られる。 もしプログラマが、革新的なプログラムを作成したことで報酬を得るとしたら、 そのようなプログラムの利用を制限した場合にも同じ理由で罰に値する。
『プログラマは、自分の創造性に対して報酬を要求してはいけないのではないか?』
仕事に対して支払いを求めたり、自分の収入を最大に増やすよう求めることは、 破壊的な手段を使わない限り、何ら悪いことではない。 しかし、今日のソフトウェア分野で習慣となっている手段は、 破壊的行為に基づいている。
プログラムの使用を制限してプログラムのユーザからお金をとることは、 その制限のせいで、使用できるプログラムの種類や方法が減ってしまうので、 破壊的行為となる。 これは、人類がプログラムから得られる富の量を減らしてしまう。 故意に制限すると決定したときには、 意図的な破壊という有害な結果をもたらすだろう。
善良な市民がそのような破壊的手段を用いないのは、 そうしないことこそが裕福であると思っているからである。 もし誰もが破壊的手段を用いたとしたら、 我々は互いの破壊行為によってさらに貧しくなっていくばかりであろう。 これがカント哲学の倫理、または黄金律である。 皆が情報を隠し持った結果として生じる結末を私は好まないので、 そうすることは悪いことであると考えざるを得ない。 明確に言えば、自分の創造性が報われたいという欲望は、 その創造性の全部または一部を、一般の世の中から奪う言い訳にはならない。
『プログラマは飢えてしまわないだろうか?』
プログラマに強要できる者はいないということは言える。 我々の大半は、街に立ってしかめ面をしてもどうにもお金を稼ぐことはできない。 しかし、結果的には、我々がしかめ面をしながらひもじい思いをしつつ街に立って 一生を過ごすことになったとしても、それを厳しく非難されはしない。 我々には他にすることがあるからである。
しかし、これは、質問者の暗黙の仮定、つまり、ソフトウェアの所有権がなければ、 プログラマは一銭たりとも収入を得ることはできないという仮定を 受け入れているので間違った答えである。 おそらく、一か八かということなのだろう。
プログラマが飢えてしまわない本当の理由は、単に今ほどの額ではないだけであって、 プログラミングに対しては支払われる可能性が依然としてあるからである。
複写を制限することだけが、ソフトウェアにおけるビジネスの唯一の基礎ではない。 それが最も多くのお金をもたらすので、一番の共通基盤になっているだけである。 もし顧客のほうから複写の制限を禁じたり拒絶すれば、 ソフトウェア・ビジネスの組織の土台は、 今ではあまり多くは使用されていないような別の種類ものへと変わるだろう。
おそらく、新しい基盤のもとではプログラミングは 現在と同じくらいの利益にしかならないだろう。 しかし、それだからといって変化に反対する理由にはならない。 販売員が今と同じ給料を得ることが不公平だというのではない。 プログラマも同様に今と同じ給料を得たとしても、不公平にはならないだろう。 (実際、プログラマは給料以上のことを行なうだろうから。)
『人々には自分の創造性がどのように使用されるのかを 制御する権利があるのではないか?』
『自分のアイデアの使用を制御すること』は実は、他人の人生を制御し、 一般にその人の人生をもっと困難にするために用いられる性質のものである。
(弁護士のように)知的所有権の問題を勉強した人によれば、 知的所有物には本来の権利もないと言っている。 政府が認めている推定上の知的所有権の類は、 特定の目的のための特定の法律によって作り出されたものである。
例えば、特許制度は、発明家がその発明の細部を公開するよう 促進するために制定された。 その目的は、発明家を保護するというよりは、社会を保護することにあった。 当時、17年という特許の保護期間は、技術水準の進歩に比べて短いものであった。 特許は製造業者の間だけの問題なので、ライセンス契約のコストや手間が 製品作りの準備に比べれば少ないような人々にとっての特許とは、 さほどの損害にはならない場合が多い。 特許製品を使用するたいていの個人を妨害してはいない。
著作権という概念は、著者がノンフィクション作品の中に他の著者から長々と 頻繁に真似ていた古代には存在しなかった。 この習慣は役に立っていたし、 現在でも多くの著者の作品に部分的に生き続けている習慣である。 著作権制度は、著述業を明白に促進するために作られた。 その制度が作られた分野として本があるが、 これは印刷するだけで安く複製できるのでほとんど損害を与えることはなく、 何よりも本を読む個人を妨害することはなかった。
全ての知的所有権は、社会が認めるライセンスにすぎない。 というのは、良きにつけ悪しきにつけ、 知的所有権を認めることにより社会全体が利益を得ると考えられたからである。 しかし、どのような特殊な状況においても、 我々には問直さなければならないことがある。 「我々はそのようなライセンスを認めることで本当により裕福になるのか?」、 「我々はどのような種類の行為を人に許可しているというだろうか?」と。
今日のプログラム事情は、100年前の書物のときとは全く異なっている。 例えば、プログラムを複写するときの最も簡単な方法は、 隣の人からさらに隣の人へと順にまわしていくという事実や、 プログラムにはソース・コードとオブジェクト・コードがあって それぞれ別のものであるという事実、プログラムは読んだり楽しむものではなく 使用されるものであるという事実が混ぜ合わされて、著作権を押し通す人が、 物質的にも精神的にも社会全体に害を及ぼしている状況を作り出しているのである。 つまり、法的に著作権の強要が可能かどうかにかかわらず、 人はそのようなことをすべきではないということである。
『競争が物事をより良くしていく。』
競争の典型はレースである。 勝者には報酬が与えられるので、誰もがもっと速く走ろうと努力する。 資本主義が本当にこの方法で機能すればよいが、資本主義の擁護者は、 この方法で常に機能することを前提としている点が間違っている。 例えば、なぜ報酬が与えられるのかを走者が忘れてしまい、 手段を選ばず勝つことのみに執着したとすれば、 他の走者を攻撃するといった他の作戦をとるかもしれない。 走者達が真っ先に殴り合いをしてしまえば、皆のゴールインが遅れてしまうだろう。
ソフトウェアの占有と秘密は、真っ先に殴り合う走者と道義的には同じである。 悲しいことに、我々の唯一の審判でさえ、殴り合いに反対していないように見える。 ただ走者を(『10ヤード走るごとに1発殴ってもよい』というふうにして) 規制するだけである。 審判は本来、そのような走者達の中に分け入って、 暴力を働こうとした走者を罰してしかるべきである。
『金銭的な刺激がなくなっては誰もプログラミングなどしないのではないか?』
実際には、多くの人々が金銭的刺激が皆無であってもプログラムを書いているだろう。 プログラミングには、一部の人にとってはたまらないほどの魅力があり、 そういう人こそプログラミングに最も向いている。 音楽で生計を立てる望みがないからといって、プロの音楽家がいなくなることはない。
しかし、この疑問は実際、よく提起されるのだが、現実に即してはいない。 プログラマへの支払いは少なくなっても、無くなることはない。 したがって、正しい質問は、 『金銭的な魅力が減っても人はプログラムを書くか?』となる。 私の経験がそれを語っている。
10年以上もの間、世界中の多くの最優秀プログラマが、 よそでならもっと収入を得られたはずにも関わらず、AIラボで働いてきた。 彼らは、金銭ではない報酬、例えば、名声や感謝といったものを得てきた。 そして、創造は楽しくもあり、それ自体が自分への報償であった。
やがて、彼らの大半は、多くの給料をもらいながら引き続き興味ある 同じ仕事ができる機会を与えられて去っていった。
この事実は、人は金持ちになること以外の理由でもプログラムを 書くということを示している。 しかし、より多くのお金を得る機会があれば、人はそれを期待し求めもするだろう。 給料が少ない組織は、多いところと競争すれば劣勢にはなるが、 給料の多い組織が息詰まっても、少ないほうまで悪くなるわけではない。
『我々は絶望的になってプログラマを必要としているのではないか。 我々の隣人を助けるのをやめるようプログラマが我々に要求すれば、 我々はそれに従わざるを得ない。』
あなたは、そういった要求に従うほど決して絶望的ではない。 忘れないでいただきたい。 そのような要求に従わなければ数百万ドルの価値となるが、 従えば1セントもの賛辞には値しないのである!
『プログラマは何とかして生計を立てなくてはならない。』
短い目で見ればこれは当てはまる。 だが、プログラマが、プログラムの使用権を売らずに生計を立てていける方法は いくらでもある。 この方法は、他に生計を立てる手立てがないからではなく、 プログラマやビジネスマンに多額のお金をもたらすので、今では慣習的となっている。 他の方法を見つけようと思えば簡単に見つかる。 その例をいくつか示しておく。
新しいコンピュータを導入している製造業者は、 新しいハードウェアにオペレーティング・システムを 移植する作業に対して支払うだろう。
プログラミングに関する教育や指導、保守といったサービスを ビジネスとする場合にもプログラマを雇うことができるだろう。
新しいアイデアを持った人は、プログラムをフリーウェアとして配布し、 それに満足したユーザに寄付を求めたり、簡単な指導サービスを ビジネスにすることができるだろう。 私は、この方法を既に実践して成功した人々を知っている。
似たような要求があるユーザ同士は、ユーザ・グループを組織し、会費を払う。 グループでは、ソフトウェア業者と契約して、 メンバーが使いたいプログラムを作成してもらう。
あらゆる種類の開発が、以下に示す「ソフトウェア税」で積み立てることができる。
コンピュータを買う人は誰でも、ソフトウェア税として、 その価格のxパーセントを支払うようにする。 政府は、これを、ソフトウェア開発のためにNSF ([訳注]米国科学財団、National Science Foundation)のような機関に与える。ただし、コンピュータの購入者がソフトウェア開発に寄付する場合には、 相当額の税金控除となる。 自分で選んだプロジェクトへ寄付することができる。 ほとんどは、プロジェクトの成果を利用したいような所を選ぶだろう。 本来支払うべき税金の合計を上限として、寄付金の額に応じて控除することができる。
全体の税率は、課税額に応じて重み付けをし、納税者の投票によって決定可能とする。
その結果、
- コンピュータを使用するコミュニティはソフトウェア開発を支援する。
- そのコミュニティは、どの程度のサポートが必要なのかを決定する。
- 自分達の負担したものがどのプロジェクトに費されるかに関心のあるユーザは、 自分で([訳注]立ち上げて欲しい)プロジェクトを選ぶことができる。
長い目で見た場合には、プログラムをフリーにすることは、 欠乏の無い世界への第一歩であり、 そこでは誰も生計を立てるためだけにあくせく働く必要はないだろう。 人々は、週に10時間の課せられた仕事、例えば、法律の制定や、家族との相談、 ロボットの修理、小惑星の試掘といった必要な仕事をこなしたあとは、 プログラミングといった楽しめる活動に自由に専念することになるだろう。 もはやプログラミングで生計を立てる必要はなくなる。
我々は既に、社会全体が実質的生産のためにしなければならない作業量を 大幅に減らしてきたが、そのうちのほんのわずかが労働者の娯楽に 変わっただけである。 というのは、生産活動に伴い多くの非生産活動が必要とされるからである。 その主な原因は、官僚主義と競争に対する差の無い骨折りである。 フリー・ソフトウェアは、ソフトウェア生産の分野でこれらの乱費流出を 大幅に減らすだろう。 生産における技術的利得が我々にとっての労働の軽減になるよう、 我々はこれを行なっていかなければならないのである。
!@#$%^& *()_-+=|\~` {}[]:;"' <>,.?/
などの区切り文字が含まれる。
@[\]^_?
のコントロール版のいずれかである。
GNUプロジェクトで用いているcopyleftは、
GNU一般公有使用許諾書(GNU General Public License)と呼ばれる。
see Copying。
Emacsのキルコマンドは、一次セレクションを設定し、
ヤンクコマンドは、適切ならば、一次セレクションを用いる。
see Killing。
*Messages*
に保存されるので、
あとから見ることもできる。
see Echo Area。
X
を挿入するコマンドにバインドされている。
C-x mは、通常、メイルメッセージを作成するコマンドにバインドされている。
see Keys。
next-line
にバインド(束縛)する。
see Keymaps。
[
と]
)で再帰編集レベルが示される。
see Recursive Edit。
RMAIL
という
名前のファイルである。
別のファイル名を指定しない限り、
rmailが届いたメイルを保存する場所である。
see Rmail。
l[0-9]+
は、
l
のうしろに1個以上の数字が続いた文字列に一致する。
see Regexps。
load-path
は、
Lispのライブラリファイルを探すための探索パスを保持する。
see Lisp Libraries。
/
や~
で始まらないファイル名を指定すると、
それはカレントバッファのデフォルトディレクトリ相対に解釈される。
see Default Directory。
~/
や~user/
で始まる。
ファイル名のかわりに『パス名』という用語を使う人もいるが、
本書では使わない。
単語『パス』は『探索パス』《参照》という用語にしか使わない。
$
、~
、:
などの構成要素の特別な意味を抑える。
see Quoted File Names。
foo/bar
は2つの構成要素、foo
とbar
から成り、
カレントディレクトリ内のfoo
という名前のディレクトリ内の
bar
というファイルを指す。
"
があり、
文字列の終りに"
がある。
文字列に"
を含めるには\"
と書き、
文字列に\
を含めるには\\
と書く。
改行を含む他のすべての文字は、文字列に含めて書けばよい。
なお、改行を表す\n
、8進文字コードを表す\241
のような
Cのバックスラッシュ表現も許される。
!
(dired)
: Shell Commands in Dired
"
(TeXモード)
: TeX Editing
#
(dired)
: Flagging Many Files
$
(dired)
: Hiding Subdirectories
% C
(dired)
: Transforming File Names
% d
(dired)
: Flagging Many Files
% H
(dired)
: Transforming File Names
% l
(dired)
: Transforming File Names
% m
(dired)
: Marks vs Flags
% R
(dired)
: Transforming File Names
% S
(dired)
: Transforming File Names
% u
(dired)
: Transforming File Names
&
(dired)
: Flagging Many Files
* !
(dired)
: Marks vs Flags
* %
(dired)
: Marks vs Flags
* *
(dired)
: Marks vs Flags
* /
(dired)
: Marks vs Flags
* ?
(dired)
: Marks vs Flags
* @
(dired)
: Marks vs Flags
* c
(dired)
: Marks vs Flags
* C-n
(dired)
: Marks vs Flags
* C-p
(dired)
: Marks vs Flags
* DEL
(dired)
: Marks vs Flags
* m
(dired)
: Marks vs Flags
* s
(dired)
: Marks vs Flags
* t
(dired)
: Marks vs Flags
* u
(dired)
: Marks vs Flags
+
(dired)
: Operating on Files
.
(dired)
: Flagging Many Files
.
(rmail)
: Rmail Scrolling
.
(カレンダーモード)
: Specified Dates
<
(dired)
: Subdirectory Motion
<
(rmail)
: Rmail Motion
<TAB>
(ヘルプモード)
: Help Mode
=
(dired)
: Comparison in Dired
>
(dired)
: Subdirectory Motion
>
(rmail)
: Rmail Motion
A
(dired)
: Operating on Files
a
(rmail)
: Rmail Labels
a
(カレンダーモード)
: Holidays
B
(dired)
: Operating on Files
b
(rmail)
: Rmail Basics
BS
(MS-DOS)
: MS-DOS Input
C
(dired)
: Operating on Files
c
(rmail)
: Rmail Reply
C-@
: Setting Mark
C-\
: Select Input Method
C-]
: Quitting
C-_
: Undo
C-_
(dired)
: Marks vs Flags
C-a
: Moving Point
C-a
(カレンダーモード)
: Move to Beginning or End
C-b
: Moving Point
C-b
(カレンダーモード)
: Calendar Unit Motion
C-BREAK
(MS-DOS)
: MS-DOS Input
C-c '
(ピクチャーモード)
: Insert in Picture
C-c .
(ピクチャーモード)
: Insert in Picture
C-c /
(ピクチャーモード)
: Insert in Picture
C-c :
(Cモード)
: Electric C
C-c ;
(Fortranモード)
: Fortran Comments
C-c <
(GUD)
: Commands of GUD
C-c <
(ピクチャーモード)
: Insert in Picture
C-c >
(GUD)
: Commands of GUD
C-c >
(ピクチャーモード)
: Insert in Picture
C-c @
(アウトラインマイナモード)
: Outline Mode
C-c \
(ピクチャーモード)
: Insert in Picture
C-c ^
(ピクチャーモード)
: Insert in Picture
C-c `
(ピクチャーモード)
: Insert in Picture
C-c C-\
(Cモード)
: Other C Commands
C-c C-\
(シェルモード)
: Shell Mode
C-c C-a
(Cモード)
: Electric C
C-c C-a
(アウトラインモード)
: Outline Visibility
C-c C-a
(シェルモード)
: Shell Mode
C-c C-a
(メイルモード)
: Mail Aliases
C-c C-b
(TeXモード)
: TeX Print
C-c C-b
(アウトラインモード)
: Outline Motion
C-c C-b
(シェルモード)
: Shell Mode
C-c C-b
(ピクチャーモード)
: Insert in Picture
C-c C-c
(アウトラインモード)
: Outline Visibility
C-c C-c
(シェルモード)
: Shell Mode
C-c C-c
(タブストップの設定)
: Tab Stops
C-c C-c
(メイルモード)
: Mail Sending
C-c C-c
(略語編集)
: Editing Abbrevs
C-c C-d
(Cモード)
: Hungry Delete
C-c C-d
(GUD)
: Commands of GUD
C-c C-d
(アウトラインモード)
: Outline Visibility
C-c C-d
(ピクチャーモード)
: Basic Picture
C-c C-e
(Cモード)
: Other C Commands
C-c C-e
(LaTeXモード)
: LaTeX Editing
C-c C-e
(アウトラインモード)
: Outline Visibility
C-c C-e
(シェルモード)
: Shell Mode
C-c C-f C-b
(メイルモード)
: Header Editing
C-c C-f C-c
(メイルモード)
: Header Editing
C-c C-f C-f
(メイルモード)
: Header Editing
C-c C-f C-s
(メイルモード)
: Header Editing
C-c C-f C-t
(メイルモード)
: Header Editing
C-c C-f
(GUD)
: Commands of GUD
C-c C-f
(TeXモード)
: TeX Print
C-c C-f
(アウトラインモード)
: Outline Motion
C-c C-f
(シェルモード)
: Shell Mode
C-c C-f
(ピクチャーモード)
: Insert in Picture
C-c C-i
(GUD)
: Commands of GUD
C-c C-i
(アウトラインモード)
: Outline Visibility
C-c C-i
(メイルモード)
: Mail Mode Misc
C-c C-k
(TeXモード)
: TeX Print
C-c C-k
(アウトラインモード)
: Outline Visibility
C-c C-k
(ピクチャーモード)
: Rectangles in Picture
C-c C-l
(GUD)
: Commands of GUD
C-c C-l
(TeXモード)
: TeX Print
C-c C-l
(アウトラインモード)
: Outline Visibility
C-c C-l
(カレンダーモード)
: General Calendar
C-c C-l
(シェルモード)
: Shell Mode
C-c C-n
(Cモード)
: Motion in C
C-c C-n
(Fortranモード)
: Fortran Motion
C-c C-n
(GUD)
: Commands of GUD
C-c C-n
(アウトラインモード)
: Outline Motion
C-c C-n
(シェルモード)
: Shell History Copying
C-c C-o
(Cモード)
: Changing Indent Style
C-c C-o
(LaTeXモード)
: LaTeX Editing
C-c C-o
(アウトラインモード)
: Outline Visibility
C-c C-o
(シェルモード)
: Shell Mode
C-c C-p
(Cモード)
: Motion in C
C-c C-p
(Fortranモード)
: Fortran Motion
C-c C-p
(TeXモード)
: TeX Print
C-c C-p
(アウトラインモード)
: Outline Motion
C-c C-p
(シェルモード)
: Shell History Copying
C-c C-q
(Cモード)
: C Indent
C-c C-q
(TeXモード)
: TeX Print
C-c C-q
(アウトラインモード)
: Outline Visibility
C-c C-q
(メイルモード)
: Citing Mail
C-c C-r
(Fortranモード)
: Fortran Columns
C-c C-r
(GUD)
: Commands of GUD
C-c C-r
(TeXモード)
: TeX Print
C-c C-r
(シェルモード)
: Shell Mode
C-c C-r
(メイルモード)
: Citing Mail
C-c C-s
(Cモード)
: Other C Commands
C-c C-s
(GUD)
: Commands of GUD
C-c C-s
(アウトラインモード)
: Outline Visibility
C-c C-s
(メイルモード)
: Mail Sending
C-c C-t
(Cモード)
: Hungry Delete
C-c C-t
(GUD)
: Commands of GUD
C-c C-t
(アウトラインモード)
: Outline Visibility
C-c C-t
(メイルモード)
: Mail Mode Misc
C-c C-u
(Cモード)
: Motion in C
C-c C-u
(アウトラインモード)
: Outline Motion
C-c C-u
(シェルモード)
: Shell Mode
C-c C-v
(TeXモード)
: TeX Print
C-c C-w
(Fortranモード)
: Fortran Columns
C-c C-w
(シェルモード)
: Shell Mode
C-c C-w
(ピクチャーモード)
: Rectangles in Picture
C-c C-w
(メイルモード)
: Mail Mode Misc
C-c C-x
(ピクチャーモード)
: Rectangles in Picture
C-c C-y
(ピクチャーモード)
: Rectangles in Picture
C-c C-y
(メイルモード)
: Citing Mail
C-c C-z
(シェルモード)
: Shell Mode
C-c RET
(シェルモード)
: Shell History Copying
C-c TAB
(TeXモード)
: TeX Print
C-c TAB
(ピクチャーモード)
: Tabs in Picture
C-c {
(TeXモード)
: TeX Editing
C-c }
(TeXモード)
: TeX Editing
C-d
: Deletion
C-d
(rmail)
: Rmail Deletion
C-d
(シェルモード)
: Shell Mode
C-e
: Moving Point
C-e
(カレンダーモード)
: Move to Beginning or End
C-f
: Moving Point
C-f
(カレンダーモード)
: Calendar Unit Motion
C-g
: Quitting
C-g
(MS-DOS)
: MS-DOS Input
C-h
: Help
C-h a
: Apropos
C-h b
: Misc Help
C-h C
: Coding Systems
C-h c
: Key Help
C-h C-\
: Select Input Method
C-h C-c
: Misc Help
C-h C-d
: Misc Help
C-h C-f
: Misc Help
C-h C-h
: Help
C-h C-i
: Documentation
C-h C-k
: Misc Help
C-h C-p
: Misc Help
C-h C-w
: Misc Help
C-h F
: Misc Help
C-h f
: Name Help
C-h h
: International Intro
C-h I
: Select Input Method
C-h i
: Misc Help
C-h k
: Key Help
C-h L
: Language Environments
C-h l
: Misc Help
C-h m
: Misc Help
C-h n
: Misc Help
C-h p
: Library Keywords
C-h s
: Syntax
C-h t
: Basic
C-h w
: Name Help
C-j
: Basic Indent
C-j
(Fortranモード)
: ForIndent Commands
C-j
(MS-DOS)
: MS-DOS Input
C-j
(TeXモード)
: TeX Editing
C-j
(とメジャーモード)
: Major Modes
C-k
: Killing by Lines
C-k
(gnus)
: Summary of Gnus
C-l
: Scrolling
C-M-%
: Query Replace
C-M-.
: Find Tag
C-M-/
: Dynamic Abbrevs
C-M-@
: List Commands
C-M-\
: Indentation Commands
C-M-a
: Defuns
C-M-a
(Fortranモード)
: Fortran Motion
C-M-b
: List Commands
C-M-c
: Recursive Edit
C-M-d
: List Commands
C-M-d
(dired)
: Subdirectory Motion
C-M-DEL
: List Commands
C-M-e
: Defuns
C-M-e
(Fortranモード)
: Fortran Motion
C-M-f
: List Commands
C-M-h
: Defuns
C-M-h
(Cモード)
: Other C Commands
C-M-h
(Fortranモード)
: Fortran Motion
C-M-j
: Multi-Line Comments
C-M-j
(Fortranモード)
: ForIndent Commands
C-M-k
: List Commands
C-M-l
: Scrolling
C-M-l
(rmail)
: Rmail Make Summary
C-M-l
(シェルモード)
: Shell Mode
C-M-n
: List Commands
C-M-n
(dired)
: Subdirectory Motion
C-M-n
(rmail)
: Rmail Labels
C-M-o
: Indentation Commands
C-M-p
: List Commands
C-M-p
(dired)
: Subdirectory Motion
C-M-p
(rmail)
: Rmail Labels
C-M-q
: Multi-line Indent
C-M-q
(Cモード)
: C Indent
C-M-q
(Fortranモード)
: ForIndent Commands
C-M-r
: Regexp Search
C-M-r
(rmail)
: Rmail Make Summary
C-M-s
: Regexp Search
C-M-t
: List Commands, Transpose
C-M-t
(rmail)
: Rmail Make Summary
C-M-u
: List Commands
C-M-u
(dired)
: Subdirectory Motion
C-M-v
: Other Window
C-M-w
: Appending Kills
C-M-x
(emacs-lispモード)
: Lisp Eval
C-M-x
(lispモード)
: External Lisp
C-Mouse-2
(スクロールバー)
: Split Window
C-Mouse-3
: Menu Mouse Clicks
C-n
: Moving Point
C-n
(dired)
: Dired Commands
C-n
(gnusグループモード)
: Summary of Gnus
C-n
(gnusサマリモード)
: Summary of Gnus
C-n
(カレンダーモード)
: Calendar Unit Motion
C-o
: Blank Lines
C-o
(dired)
: Dired Visiting
C-o
(rmail)
: Rmail Output
C-p
: Moving Point
C-p
(dired)
: Dired Commands
C-p
(gnusグループモード)
: Summary of Gnus
C-p
(gnusサマリモード)
: Summary of Gnus
C-p
(カレンダーモード)
: Calendar Unit Motion
C-q
: Inserting Text
C-r
: Incremental Search
C-s
: Incremental Search
C-SPC
: Setting Mark
C-t
: Transpose
C-u
: Arguments
C-u - C-x ;
: Comment Commands
C-u C-@
: Mark Ring
C-u C-SPC
: Mark Ring
C-u C-x u
: Undo
C-u TAB
: Multi-line Indent
C-v
: Scrolling
C-v
(カレンダーモード)
: Scroll Calendar
C-w
: Other Kill Commands
C-x #
: Emacs Server
C-x $
: Selective Display
C-x (
: Basic Kbd Macro
C-x )
: Basic Kbd Macro
C-x +
: Change Window
C-x -
: Change Window
C-x .
: Fill Prefix
C-x 0
: Change Window
C-x 1
: Change Window
C-x 2
: Split Window
C-x 3
: Split Window
C-x 4
: Pop Up Window
C-x 4 .
: Find Tag
C-x 4 0
: Change Window
C-x 4 a
: Change Log
C-x 4 b
: Select Buffer
C-x 4 d
: Dired Enter
C-x 4 f
: Visiting
C-x 4 m
: Sending Mail
C-x 5
: Creating Frames
C-x 5 .
: Find Tag
C-x 5 0
: Misc X
C-x 5 2
: Creating Frames
C-x 5 b
: Select Buffer
C-x 5 d
: Dired Enter
C-x 5 f
: Visiting
C-x 5 m
: Sending Mail
C-x 5 o
: Misc X
C-x 5 r
: Creating Frames
C-x 6 1
: Two-Column
C-x 6 2
: Two-Column
C-x 6 b
: Two-Column
C-x 6 d
: Two-Column
C-x 6 RET
: Two-Column
C-x 6 s
: Two-Column
C-x 8
: Single-Byte European Support
C-x ;
: Options for Comments
C-x <
: Horizontal Scrolling
C-x <
(カレンダーモード)
: Scroll Calendar
C-x =
: Position Info
C-x >
: Horizontal Scrolling
C-x >
(カレンダーモード)
: Scroll Calendar
C-x [
: Pages
C-x [
(カレンダーモード)
: Calendar Unit Motion
C-x ]
: Pages
C-x ]
(カレンダーモード)
: Calendar Unit Motion
C-x ^
: Change Window
C-x `
: Compilation Mode
C-x a g
: Defining Abbrevs
C-x a i g
: Defining Abbrevs
C-x a i l
: Defining Abbrevs
C-x a l
: Defining Abbrevs
C-x b
: Select Buffer
C-x C-<SPC>
: Global Mark Ring
C-x C-a
(GUD)
: Commands of GUD
C-x C-b
: List Buffers
C-x C-c
: Exiting
C-x C-d
: Directories
C-x C-e
: Lisp Eval
C-x C-f
: Visiting
C-x C-k
: Basic Kbd Macro
C-x C-l
: Case
C-x C-n
: Moving Point
C-x C-o
: Blank Lines
C-x C-p
: Pages
C-x C-q
: Misc Buffer
C-x C-q
(VC、版管理)
: Basic VC Editing
C-x C-r
: Visiting
C-x C-s
: Saving
C-x C-t
: Transpose
C-x C-u
: Case
C-x C-v
: Visiting
C-x C-w
: Saving
C-x C-x
: Setting Mark
C-x C-z
: External Lisp
C-x d
: Dired Enter
C-x DEL
: Sentences
C-x e
: Basic Kbd Macro
C-x ESC ESC
: Repetition
C-x f
: Fill Commands
C-x h
: Marking Objects
C-x k
: Kill Buffer
C-x l
: Pages
C-x m
: Sending Mail
C-x n d
: Narrowing
C-x n d
(Fortranモード)
: Fortran Misc
C-x n n
: Narrowing
C-x n p
: Narrowing
C-x n w
: Narrowing
C-x o
: Other Window
C-x q
: Kbd Macro Query
C-x r +
: RegNumbers
C-x r b
: Bookmarks
C-x r d
: Rectangles
C-x r f
: RegConfig
C-x r i
: RegText
C-x r j
: RegPos
C-x r k
: Rectangles
C-x r l
: Bookmarks
C-x r m
: Bookmarks
C-x r n
: RegNumbers
C-x r o
: Rectangles
C-x r r
: RegRect
C-x r s
: RegText
C-x r SPC
: RegPos
C-x r t
: Rectangles
C-x r w
: RegConfig
C-x r y
: Rectangles
C-x RET
: International Intro
C-x RET c
: Specify Coding
C-x RET C-\
: Select Input Method
C-x RET f
: Specify Coding
C-x RET k
: Specify Coding
C-x RET p
: Specify Coding
C-x RET t
: Specify Coding
C-x RET X
: Specify Coding
C-x RET x
: Specify Coding
C-x s
: Saving
C-x SPC
: Commands of GUD
C-x TAB
: Indentation Commands
C-x TAB
(エンリッチモード)
: Format Indentation
C-x u
: Undo
C-x v =
: Old Versions
C-x v a
: Change Logs and VC
C-x v c
: VC Undo
C-x v d
: VC Dired Mode
C-x v g
: Old Versions
C-x v h
: Version Headers
C-x v i
: Registering
C-x v l
: VC Status
C-x v m
: Merging
C-x v r
: Making Snapshots
C-x v s
: Making Snapshots
C-x v u
: VC Undo
C-x v v
: Basic VC Editing
C-x v ~
: Old Versions
C-x z
: Repeating
C-x }
: Change Window
C-y
: Kill Ring
C-z
: Exiting
C-z
(Xウィンドウシステム)
: Misc X
D
(dired)
: Operating on Files
d
(dired)
: Dired Deletion
d
(rmail)
: Rmail Deletion
d
(カレンダーモード)
: Diary Commands
DEL
: Deletion
DEL
(dired)
: Dired Deletion
DEL
(gnus)
: Summary of Gnus
DEL
(MS-DOS)
: MS-DOS Input
DEL
(rmail)
: Rmail Scrolling
DEL
(とメジャーモード)
: Major Modes
DEL
(プログラミングモード)
: Program Modes
DELETE
: Mouse Commands
DOWN
: Moving Point
e
(rmail)
: Rmail Editing
ESC a
: Motion in C
ESC e
: Motion in C
ESC ESC ESC
: Quitting
f
(dired)
: Dired Visiting
f
(rmail)
: Rmail Reply
F1
: Help
F10
: Menu Bar
F2 1
: Two-Column
F2 2
: Two-Column
F2 b
: Two-Column
F2 d
: Two-Column
F2 RET
: Two-Column
F2 s
: Two-Column
g char
(カレンダーモード)
: From Other Calendar
g d
(カレンダーモード)
: Specified Dates
g m
(カレンダーモード)
: Mayan Calendar
g
(dired)
: Dired Updating
G
(dired)
: Operating on Files
g
(rmail)
: Rmail Files
H
(dired)
: Operating on Files
h
(rmail)
: Rmail Make Summary
h
(カレンダーモード)
: Holidays
Help
: Help
i a
(カレンダーモード)
: Special Diary Entries
i b
(カレンダーモード)
: Special Diary Entries
i c
(カレンダーモード)
: Special Diary Entries
i d
(カレンダーモード)
: Adding to Diary
i m
(カレンダーモード)
: Adding to Diary
i w
(カレンダーモード)
: Adding to Diary
i y
(カレンダーモード)
: Adding to Diary
i
(dired)
: Subdirectories in Dired
i
(rmail)
: Rmail Files
j
(rmail)
: Rmail Motion
k
(dired)
: Dired Updating
k
(rmail)
: Rmail Labels
l
(dired)
: Dired Updating
L
(dired)
: Operating on Files
l
(gnusグループモード)
: Summary of Gnus
L
(gnusグループモード)
: Summary of Gnus
l
(rmail)
: Rmail Make Summary
LEFT
: Moving Point
M
(dired)
: Operating on Files
m
(dired)
: Marks vs Flags
m
(rmail)
: Rmail Reply
m
(カレンダーモード)
: Diary Commands
M
(カレンダーモード)
: Lunar Phases
M-!
: Single Shell
M-$
: Spelling
M-$
(dired)
: Hiding Subdirectories
M-%
: Query Replace
M-'
: Expanding Abbrevs
M-(
: Balanced Editing
M-)
: Balanced Editing
M-*
: Find Tag
M-,
: Tags Search
M--
: Arguments
M-- M-c
: Fixing Case
M-- M-l
: Fixing Case
M-- M-u
: Fixing Case
M-.
: Find Tag
M-/
: Dynamic Abbrevs
M-1
: Arguments
M-:
: Lisp Eval
M-;
: Comment Commands
M-<
: Moving Point
M-<
(カレンダーモード)
: Move to Beginning or End
M-=
: Position Info
M-=
(dired)
: Comparison in Dired
M-=
(カレンダーモード)
: Counting Days
M->
: Moving Point
M->
(カレンダーモード)
: Move to Beginning or End
M-?
(nroffモード)
: Nroff Mode
M-?
(シェルモード)
: Shell Mode
M-@
: Words
M-\
: Deletion
M-^
: Indentation Commands
M-^
(Fortranモード)
: ForIndent Commands
M-`
: Menu Bar
M-a
: Sentences
M-a
(カレンダーモード)
: Move to Beginning or End
M-b
: Words
M-c
: Case
M-d
: Words
M-DEL
: Words
M-Drag-Mouse-1
: Secondary Selection
M-e
: Sentences
M-e
(カレンダーモード)
: Move to Beginning or End
M-f
: Words
M-g b
(エンリッチモード)
: Format Faces
M-g d
(エンリッチモード)
: Format Faces
M-g i
(エンリッチモード)
: Format Faces
M-g l
(エンリッチモード)
: Format Faces
M-g M-g
: Font Lock
M-g o
(エンリッチモード)
: Format Faces
M-g u
(エンリッチ)
: Format Faces
M-h
: Paragraphs
M-i
: Tab Stops
M-j c
(エンリッチモード)
: Format Justification
M-j f
(エンリッチモード)
: Format Justification
M-j l
(エンリッチモード)
: Format Justification
M-j r
(エンリッチモード)
: Format Justification
M-j u
(エンリッチモード)
: Format Justification
M-k
: Sentences
M-l
: Case
M-m
: Indentation Commands
M-m
(rmail)
: Rmail Reply
M-Mouse-1
: Secondary Selection
M-Mouse-2
: Secondary Selection
M-Mouse-3
: Secondary Selection
M-n
(nroffモード)
: Nroff Mode
M-n
(rmail)
: Rmail Motion
M-n
(シェルモード)
: Shell Ring
M-n
(ミニバッファ履歴)
: Minibuffer History
M-p
(nroffモード)
: Nroff Mode
M-p
(rmail)
: Rmail Motion
M-p
(シェルモード)
: Shell Ring
M-p
(ミニバッファ履歴)
: Minibuffer History
M-q
: Fill Commands
M-q
(Cモード)
: Other C Commands
M-r
: Moving Point
M-r
(シェルモード)
: Shell Ring
M-r
(ミニバッファ履歴)
: Minibuffer History
M-s
(gnusサマリモード)
: Summary of Gnus
M-s
(rmail)
: Rmail Motion
M-S
(エンリッチモード)
: Format Justification
M-s
(シェルモード)
: Shell Ring
M-s
(テキストモード)
: Fill Commands
M-s
(ミニバッファ履歴)
: Minibuffer History
M-SPC
: Deletion
M-t
: Words, Transpose
M-TAB
: Symbol Completion
M-TAB
(カスタマイズバッファ)
: Changing an Option
M-TAB
(テキストモード)
: Text Mode
M-TAB
(ピクチャーモード)
: Tabs in Picture
M-TAB
(メイルモード)
: Header Editing
M-u
: Case
M-v
: Scrolling
M-v
(カレンダーモード)
: Scroll Calendar
M-w
: Kill Ring
M-x
: M-x
M-y
: Earlier Kills
M-z
: Other Kill Commands
M-{
: Paragraphs
M-{
(カレンダーモード)
: Calendar Unit Motion
M-|
: Single Shell
M-}
: Paragraphs
M-}
(カレンダーモード)
: Calendar Unit Motion
M-~
: Saving
Mouse-1
: Mouse Commands
Mouse-2
: Mouse Commands
Mouse-2
(セレクション)
: Mouse References
Mouse-3
: Mouse Commands
n
(gnus)
: Summary of Gnus
n
(rmail)
: Rmail Motion
NEXT
: Scrolling
O
(dired)
: Operating on Files
o
(dired)
: Dired Visiting
o
(rmail)
: Rmail Output
o
(カレンダーモード)
: Specified Dates
p d
(カレンダーモード)
: General Calendar
P
(dired)
: Operating on Files
p
(gnus)
: Summary of Gnus
p
(rmail)
: Rmail Motion
p
(カレンダーモード)
: To Other Calendar
PRIOR
: Scrolling
Q
(dired)
: Operating on Files
q
(gnusグループモード)
: Summary of Gnus
q
(rmail)
: Rmail Basics
q
(rmailサマリ)
: Rmail Summary Edit
Q
(rmailサマリ)
: Rmail Summary Edit
q
(カレンダーモード)
: General Calendar
R
(dired)
: Operating on Files
r
(rmail)
: Rmail Reply
RET
: Inserting Text
RET
(dired)
: Dired Visiting
RET
(シェルモード)
: Shell Mode
RET
(出現モード)
: Other Repeating Search
RIGHT
: Moving Point
s
(dired)
: Dired Updating
S
(dired)
: Operating on Files
s
(gnusサマリモード)
: Summary of Gnus
s
(rmail)
: Rmail Basics
s
(カレンダーモード)
: Diary Commands
S
(カレンダーモード)
: Sunrise/Sunset
S-<TAB>
(ヘルプモード)
: Help Mode
S-TAB
(カスタマイズバッファ)
: Changing an Option
SPC
: Completion Commands
SPC
(dired)
: Dired Commands
SPC
(gnus)
: Summary of Gnus
SPC
(rmail)
: Rmail Scrolling
SPC
(カレンダーモード)
: General Calendar
t
(rmail)
: Rmail Display
t
(カレンダーモード)
: LaTeX Calendar
TAB
: Indentation
TAB
(GUD)
: Commands of GUD
TAB
(とメジャーモード)
: Major Modes
TAB
(カスタマイズバッファ)
: Changing an Option
TAB
(シェルモード)
: Shell Mode
TAB
(テキストモード)
: Text Mode
TAB
(プログラミングモード)
: Basic Indent
TAB
(補完)
: Completion Example
u
(dired)
: Marks vs Flags
u
(diredの削除)
: Dired Deletion
u
(gnusグループモード)
: Summary of Gnus
u
(rmail)
: Rmail Deletion
u
(カレンダーモード)
: Holidays
UP
: Moving Point
v
(dired)
: Dired Visiting
w
(rmail)
: Rmail Output
x
(dired)
: Dired Deletion
x
(rmail)
: Rmail Deletion
x
(カレンダーモード)
: Holidays
Z
(dired)
: Operating on Files
~
(dired)
: Flagging Many Files
2C-associate-buffer
: Two-Column
2C-dissociate
: Two-Column
2C-merge
: Two-Column
2C-newline
: Two-Column
2C-split
: Two-Column
2C-two-columns
: Two-Column
abbrev-mode
: Abbrev Concepts
abbrev-prefix-mark
: Expanding Abbrevs
abort-recursive-edit
: Quitting
add-change-log-entry-other-window
: Change Log
add-global-abbrev
: Defining Abbrevs
add-mode-abbrev
: Defining Abbrevs
add-name-to-file
: Misc File Ops
add-untranslated-filesystem
: Text and Binary
american-calendar
: Date Formats
append-next-kill
: Appending Kills
append-to-buffer
: Accumulating Text
append-to-file
: Accumulating Text
apply-macro-to-region-lines
: Basic Kbd Macro
appt-add
: Appointments
appt-delete
: Appointments
appt-make-list
: Appointments
apropos
: Apropos
apropos-command
: Apropos
apropos-documentation
: Apropos
apropos-value
: Apropos
apropos-variable
: Apropos
ask-user-about-lock
: Interlocking
auto-compression-mode
: Compressed Files
auto-fill-mode
: Auto Fill
auto-lower-mode
: Frame Parameters
auto-raise-mode
: Frame Parameters
auto-save-mode
: Auto Save Control
back-to-indentation
: Indentation Commands
backward-char
: Moving Point
backward-delete-char-untabify
: Program Modes
backward-kill-sentence
: Sentences
backward-kill-sexp
: List Commands
backward-kill-word
: Words
backward-list
: List Commands
backward-page
: Pages
backward-paragraph
: Paragraphs
backward-sentence
: Sentences
backward-sexp
: List Commands
backward-text-line
: Nroff Mode
backward-up-list
: List Commands
backward-word
: Words
balance-windows
: Change Window
beginning-of-buffer
: Moving Point
beginning-of-defun
: Defuns
beginning-of-fortran-subprogram
: Fortran Motion
beginning-of-line
: Moving Point
binary-overwrite-mode
: Minor Modes
blackbox
: Amusements
bookmark-delete
: Bookmarks
bookmark-insert
: Bookmarks
bookmark-insert-location
: Bookmarks
bookmark-jump
: Bookmarks
bookmark-load
: Bookmarks
bookmark-save
: Bookmarks
bookmark-set
: Bookmarks
bookmark-write
: Bookmarks
buffer-menu
: Several Buffers
c-add-style
: C Indent Styles
c-backslash-region
: Other C Commands
c-backward-conditional
: Motion in C
c-backward-into-nomenclature
: Motion in C
c-beginning-of-statement
: Motion in C
c-end-of-statement
: Motion in C
c-fill-paragraph
: Other C Commands
c-forward-conditional
: Motion in C
c-forward-into-nomenclature
: Motion in C
c-indent-command
: C Indent
c-indent-defun
: C Indent
c-indent-exp
: C Indent
c-indent-line
: Basic Indent
c-macro-expand
: Other C Commands
c-mark-function
: Other C Commands, Defuns
c-scope-operator
: Electric C
c-set-offset
: Changing Indent Style
c-set-style
: C Indent Styles
c-show-syntactic-information
: Other C Commands
c-toggle-auto-hungry-state
: Hungry Delete
c-toggle-auto-state
: Electric C
c-toggle-hungry-state
: Hungry Delete
c-up-conditional
: Motion in C
calendar
: Calendar/Diary
calendar-backward-day
: Calendar Unit Motion
calendar-backward-month
: Calendar Unit Motion
calendar-backward-week
: Calendar Unit Motion
calendar-beginning-of-month
: Move to Beginning or End
calendar-beginning-of-week
: Move to Beginning or End
calendar-beginning-of-year
: Move to Beginning or End
calendar-count-days-region
: Counting Days
calendar-cursor-holidays
: Holidays
calendar-end-of-month
: Move to Beginning or End
calendar-end-of-week
: Move to Beginning or End
calendar-end-of-year
: Move to Beginning or End
calendar-forward-day
: Calendar Unit Motion
calendar-forward-month
: Calendar Unit Motion
calendar-forward-week
: Calendar Unit Motion
calendar-forward-year
: Calendar Unit Motion
calendar-goto-astro-day-number
: From Other Calendar
calendar-goto-chinese-date
: From Other Calendar
calendar-goto-coptic-date
: From Other Calendar
calendar-goto-date
: Specified Dates
calendar-goto-ethiopic-date
: From Other Calendar
calendar-goto-french-date
: From Other Calendar
calendar-goto-hebrew-date
: From Other Calendar
calendar-goto-islamic-date
: From Other Calendar
calendar-goto-iso-date
: From Other Calendar
calendar-goto-julian-date
: From Other Calendar
calendar-goto-mayan-long-count-date
: Mayan Calendar
calendar-goto-persian-date
: From Other Calendar
calendar-goto-today
: Specified Dates
calendar-next-calendar-round-date
: Mayan Calendar
calendar-next-haab-date
: Mayan Calendar
calendar-next-tzolkin-date
: Mayan Calendar
calendar-other-month
: Specified Dates
calendar-phases-of-moon
: Lunar Phases
calendar-previous-haab-date
: Mayan Calendar
calendar-previous-tzolkin-date
: Mayan Calendar
calendar-print-astro-day-number
: To Other Calendar
calendar-print-chinese-date
: To Other Calendar
calendar-print-coptic-date
: To Other Calendar
calendar-print-day-of-year
: General Calendar
calendar-print-ethiopic-date
: To Other Calendar
calendar-print-french-date
: To Other Calendar
calendar-print-hebrew-date
: To Other Calendar
calendar-print-islamic-date
: To Other Calendar
calendar-print-iso-date
: To Other Calendar
calendar-print-julian-date
: To Other Calendar
calendar-print-mayan-date
: To Other Calendar
calendar-print-persian-date
: To Other Calendar
calendar-sunrise-sunset
: Sunrise/Sunset
calendar-unmark
: Holidays
call-last-kbd-macro
: Basic Kbd Macro
capitalize-word
: Case
cd
: File Names
center-line
: Fill Commands
change-log-mode
: Change Log
choose-completion
: Completion Commands
clean-buffer-list
: Kill Buffer
clear-rectangle
: Rectangles
codepage-setup
: MS-DOS and MULE
column-number-mode
: Optional Mode Line
comint-bol
: Shell Mode
comint-continue-subjob
: Shell Mode
comint-copy-old-input
: Shell History Copying
comint-delchar-or-maybe-eof
: Shell Mode
comint-dynamic-complete
: Shell Mode
comint-dynamic-complete-variable
: Shell Options
comint-dynamic-list-filename...
: Shell Mode
comint-dynamic-list-input-ring
: Shell Mode
comint-get-next-from-history
: Shell Ring
comint-interrupt-subjob
: Shell Mode
comint-kill-input
: Shell Mode
comint-kill-output
: Shell Mode
comint-magic-space
: History References
comint-next-input
: Shell Ring
comint-next-matching-input
: Shell Ring
comint-next-prompt
: Shell History Copying
comint-previous-input
: Shell Ring
comint-previous-matching-input
: Shell Ring
comint-previous-prompt
: Shell History Copying
comint-quit-subjob
: Shell Mode
comint-run
: Shell Mode
comint-send-input
: Shell Mode
comint-show-maximum-output
: Shell Mode
comint-show-output
: Shell Mode
comint-stop-subjob
: Shell Mode
comint-strip-ctrl-m
: Shell Mode
comint-truncate-buffer
: Shell Mode
comment-region
: Multi-Line Comments
compare-windows
: Comparing Files
compile
: Compilation
compile
(MS-DOS)
: MS-DOS Processes
compile-goto-error
: Compilation Mode
complete-symbol
: Symbol Completion
compose-mail
: Sending Mail
compose-mail-other-frame
: Sending Mail
compose-mail-other-window
: Sending Mail
copy-file
: Misc File Ops
copy-rectangle-to-register
: RegRect
copy-to-buffer
: Accumulating Text
copy-to-register
: RegText
count-lines-page
: Pages
count-lines-region
: Position Info
count-matches
: Other Repeating Search
count-text-lines
: Nroff Mode
cpp-highlight-buffer
: Other C Commands
create-fontset-from-fontset-spec
: Defining Fontsets
customize
: Easy Customization
customize-apropos
: Specific Customization
customize-browse
: Customization Groups
customize-changed-options
: Specific Customization
customize-customized
: Specific Customization
customize-face
: Specific Customization
customize-group
: Specific Customization
customize-option
: Specific Customization
customize-saved
: Specific Customization
dabbrev-completion
: Dynamic Abbrevs
dabbrev-expand
: Dynamic Abbrevs
dbx
: Starting GUD
debug_print
: Checklist
default-value
: Locals
define-abbrevs
: Saving Abbrevs
define-key
: Init Rebinding
define-mail-abbrev
: Mail Aliases
define-mail-alias
: Mail Aliases
delete-backward-char
: Deletion
delete-blank-lines
: Blank Lines
delete-char
: Deletion
delete-file
: Misc File Ops
delete-frame
: Misc X
delete-horizontal-space
: Deletion
delete-indentation
: Indentation Commands
delete-matching-lines
: Other Repeating Search
delete-non-matching-lines
: Other Repeating Search
delete-other-windows
: Change Window
delete-rectangle
: Rectangles
delete-whitespace-rectangle
: Rectangles
delete-window
: Change Window
describe-bindings
: Misc Help
describe-coding-system
: Coding Systems
describe-copying
: Misc Help
describe-distribution
: Misc Help
describe-function
: Name Help
describe-input-method
: Select Input Method
describe-key
: Key Help
describe-key-briefly
: Key Help
describe-language-environment
: Language Environments
describe-mode
: Misc Help
describe-no-warranty
: Misc Help
describe-project
: Misc Help
describe-syntax
: Syntax
desktop-save
: Saving Emacs Sessions
diary
: Diary Commands
diary-anniversary
: Special Diary Entries
diary-block
: Special Diary Entries
diary-cyclic
: Special Diary Entries
diary-float
: Special Diary Entries
diary-mail-entries
: Diary Commands
diff
: Comparing Files
diff-backup
: Comparing Files
digit-argument
: Arguments
dired
: Dired Enter
dired-backup-diff
: Comparison in Dired
dired-change-marks
: Marks vs Flags
dired-clean-directory
: Flagging Many Files
dired-create-directory
: Operating on Files
dired-diff
: Comparison in Dired
dired-display-file
: Dired Visiting
dired-do-byte-compile
: Operating on Files
dired-do-chgrp
: Operating on Files
dired-do-chmod
: Operating on Files
dired-do-chown
: Operating on Files
dired-do-compress
: Operating on Files
dired-do-copy
: Operating on Files
dired-do-copy-regexp
: Transforming File Names
dired-do-delete
: Operating on Files
dired-do-hardlink
: Operating on Files
dired-do-hardlink-regexp
: Transforming File Names
dired-do-kill-lines
: Dired Updating
dired-do-load
: Operating on Files
dired-do-print
: Operating on Files
dired-do-query-replace
: Operating on Files
dired-do-redisplay
: Dired Updating
dired-do-rename
: Operating on Files
dired-do-rename-regexp
: Transforming File Names
dired-do-search
: Operating on Files
dired-do-shell-command
: Shell Commands in Dired
dired-do-symlink
: Operating on Files
dired-do-symlink-regexp
: Transforming File Names
dired-do-toggle
: Marks vs Flags
dired-downcase
: Transforming File Names
dired-expunge
: Dired Deletion
dired-find-file
: Dired Visiting
dired-find-file-other-window
: Dired Visiting
dired-flag-auto-save-files
: Flagging Many Files
dired-flag-backup-files
: Flagging Many Files
dired-flag-file-deletion
: Dired Deletion
dired-flag-files-regexp
: Flagging Many Files
dired-flag-garbage-files
: Flagging Many Files
dired-hide-all
: Hiding Subdirectories
dired-hide-subdir
: Hiding Subdirectories
dired-mark
: Marks vs Flags
dired-mark-directories
: Marks vs Flags
dired-mark-executables
: Marks vs Flags
dired-mark-files-containing-regexp
: Marks vs Flags
dired-mark-files-regexp
: Marks vs Flags
dired-mark-subdir-files
: Marks vs Flags
dired-mark-symlinks
: Marks vs Flags
dired-maybe-insert-subdir
: Subdirectories in Dired
dired-mouse-find-file-other-window
: Dired Visiting
dired-next-dirline
: Subdirectory Motion
dired-next-marked-file
: Marks vs Flags
dired-next-subdir
: Subdirectory Motion
dired-other-frame
: Dired Enter
dired-other-window
: Dired Enter
dired-prev-dirline
: Subdirectory Motion
dired-prev-marked-file
: Marks vs Flags
dired-prev-subdir
: Subdirectory Motion
dired-sort-toggle-or-edit
: Dired Updating
dired-tree-down
: Subdirectory Motion
dired-tree-up
: Subdirectory Motion
dired-undo
: Marks vs Flags
dired-unmark
: Marks vs Flags
dired-unmark-all-files
: Marks vs Flags
dired-unmark-all-files-no-query
: Marks vs Flags
dired-unmark-backward
: Marks vs Flags
dired-upcase
: Transforming File Names
dired-view-file
: Dired Visiting
dirs
: Interactive Shell
dirtrack-mode
: Interactive Shell
disable-command
: Disabling
display-time
: Optional Mode Line
dissociated-press
: Dissociated Press
do-auto-save
: Auto Save Control
doctor
: Total Frustration
down-list
: List Commands
downcase-region
: Case
downcase-word
: Case
dunnet
: Amusements
edit-abbrevs
: Editing Abbrevs
edit-kbd-macro
: Basic Kbd Macro
edit-picture
: Picture
edit-tab-stops
: Tab Stops
edit-tab-stops-note-changes
: Tab Stops
edt-emulation-off
: Emulation
edt-emulation-on
: Emulation
eldoc-mode
: Documentation
electric-nroff-mode
: Nroff Mode
emacs-lisp-mode
: Lisp Eval
emacs-version
: Understanding Bug Reporting
emerge-auto-advance-mode
: Submodes of Emerge
emerge-buffers
: Overview of Emerge
emerge-buffers-with-ancestor
: Overview of Emerge
emerge-files
: Overview of Emerge
emerge-files-with-ancestor
: Overview of Emerge
emerge-skip-prefers-mode
: Submodes of Emerge
enable-command
: Disabling
enable-flow-control
: Unasked-for Search
enable-flow-control-on
: Unasked-for Search
enable-local-eval
: File Variables
enable-local-variables
: File Variables
end-kbd-macro
: Basic Kbd Macro
end-of-buffer
: Moving Point
end-of-defun
: Defuns
end-of-fortran-subprogram
: Fortran Motion
end-of-line
: Moving Point
enlarge-window
: Change Window
enlarge-window-horizontally
: Change Window
enriched-mode
: Requesting Formatted Text
european-calendar
: Date Formats
eval-current-buffer
: Lisp Eval
eval-defun
: Lisp Eval
eval-expression
: Lisp Eval
eval-last-sexp
: Lisp Eval
eval-region
: Lisp Eval
exchange-point-and-mark
: Setting Mark
execute-extended-command
: M-x
exit-calendar
: General Calendar
exit-recursive-edit
: Recursive Edit
expand-abbrev
: Expanding Abbrevs
expand-mail-aliases
: Mail Aliases
expand-region-abbrevs
: Expanding Abbrevs
facemenu-remove-all
: Editing Format Info
facemenu-remove-props
: Editing Format Info
facemenu-set-background
: Format Colors
facemenu-set-bold
: Format Faces
facemenu-set-bold-italic
: Format Faces
facemenu-set-default
: Format Faces
facemenu-set-face
: Format Faces
facemenu-set-foreground
: Format Colors
facemenu-set-italic
: Format Faces
facemenu-set-underline
: Format Faces
fast-lock-mode
: Fast Lock Mode
fill-individual-paragraphs
: Fill Prefix
fill-nonuniform-paragraphs
: Fill Prefix
fill-paragraph
: Fill Commands
fill-region
: Fill Commands
fill-region-as-paragraph
: Fill Commands
find-alternate-file
: Visiting
find-dired
: Dired and Find
find-file
: Visiting
find-file-binary
: Text and Binary
find-file-literally
: Visiting
find-file-other-frame
: Visiting
find-file-other-window
: Visiting
find-file-read-only
: Visiting
find-file-read-only-other-frame
: Creating Frames
find-file-text
: Text and Binary
find-grep-dired
: Dired and Find
find-name-dired
: Dired and Find
find-tag
: Find Tag
find-tag-other-frame
: Find Tag
find-tag-other-window
: Find Tag
find-tag-regexp
: Find Tag
finder-by-keyword
: Library Keywords
flush-lines
: Other Repeating Search
flyspell-mode
: Spelling
font-lock-add-keywords
: Font Lock
font-lock-fontify-block
: Font Lock
font-lock-mode
: Font Lock
format-find-file
: Forcing Enriched Mode
fortran-auto-fill-mode
: Fortran Autofill
fortran-column-ruler
: Fortran Columns
fortran-comment-region
: Fortran Comments
fortran-indent-line
: ForIndent Commands
fortran-indent-new-line
: ForIndent Commands
fortran-indent-subprogram
: ForIndent Commands
fortran-join-line
: ForIndent Commands
fortran-mode
: Fortran
fortran-narrow-to-subprogram
: Fortran Misc
fortran-next-statement
: Fortran Motion
fortran-previous-statement
: Fortran Motion
fortran-split-line
: ForIndent Commands
fortran-window-create
: Fortran Columns
forward-char
: Moving Point
forward-list
: List Commands
forward-page
: Pages
forward-paragraph
: Paragraphs
forward-sentence
: Sentences
forward-sexp
: List Commands
forward-text-line
: Nroff Mode
forward-word
: Words
frame-configuration-to-register
: RegConfig
gdb
: Starting GUD
global-font-lock-mode
: Font Lock
global-set-key
: Rebinding
global-unset-key
: Rebinding
gnus
: Gnus
gnus-group-exit
: Summary of Gnus
gnus-group-kill-group
: Summary of Gnus
gnus-group-list-all-groups
: Summary of Gnus
gnus-group-list-groups
: Summary of Gnus
gnus-group-next-group
: Summary of Gnus
gnus-group-next-unread-group
: Summary of Gnus
gnus-group-prev-group
: Summary of Gnus
gnus-group-prev-unread-group
: Summary of Gnus
gnus-group-read-group
: Summary of Gnus
gnus-group-unsubscribe-current-group
: Summary of Gnus
gnus-summary-isearch-article
: Summary of Gnus
gnus-summary-next-subject
: Summary of Gnus
gnus-summary-next-unread-article
: Summary of Gnus
gnus-summary-prev-page
: Summary of Gnus
gnus-summary-prev-subject
: Summary of Gnus
gnus-summary-prev-unread-article
: Summary of Gnus
gnus-summary-search-article-forward
: Summary of Gnus
gomoku
: Amusements
goto-char
: Moving Point
goto-line
: Moving Point
grep
: Grep Searching
grep
(MS-DOS)
: MS-DOS Processes
grep-find
: Grep Searching
gud-cont
: Commands of GUD
gud-def
: GUD Customization
gud-down
: Commands of GUD
gud-finish
: Commands of GUD
gud-gdb-complete-command
: Commands of GUD
gud-next
: Commands of GUD
gud-refresh
: Commands of GUD
gud-remove
: Commands of GUD
gud-step
: Commands of GUD
gud-stepi
: Commands of GUD
gud-tbreak
: Commands of GUD
gud-up
: Commands of GUD
hanoi
: Amusements
help-command
: Help
help-for-help
: Help
help-next-ref
: Help Mode
help-previous-ref
: Help Mode
help-with-tutorial
: Basic
hide-body
: Outline Visibility
hide-entry
: Outline Visibility
hide-leaves
: Outline Visibility
hide-other
: Outline Visibility
hide-sublevels
: Outline Visibility
hide-subtree
: Outline Visibility
highlight-changes-mode
: Highlight Changes
holidays
: Holidays
hscroll-mode
: Horizontal Scrolling
iconify-or-deiconify-frame
: Misc X
ielm
: Lisp Interaction
increase-left-margin
: Format Indentation
increment-register
: RegNumbers
indent-for-comment
: Comment Commands
indent-new-comment-line
: Multi-Line Comments
indent-region
: Indentation Commands
indent-relative
: Indentation Commands
indent-rigidly
: Indentation Commands
indent-sexp
: Multi-line Indent
info
: Misc Help
Info-goto-emacs-command-node
: Misc Help
Info-goto-emacs-key-command-node
: Misc Help
info-lookup-file
: Documentation
info-lookup-symbol
: Documentation
insert-abbrevs
: Saving Abbrevs
insert-anniversary-diary-entry
: Special Diary Entries
insert-block-diary-entry
: Special Diary Entries
insert-cyclic-diary-entry
: Special Diary Entries
insert-diary-entry
: Adding to Diary
insert-file
: Misc File Ops
insert-kbd-macro
: Save Kbd Macro
insert-monthly-diary-entry
: Adding to Diary
insert-parentheses
: Balanced Editing
insert-register
: RegText
insert-weekly-diary-entry
: Adding to Diary
insert-yearly-diary-entry
: Adding to Diary
inverse-add-global-abbrev
: Defining Abbrevs
inverse-add-mode-abbrev
: Defining Abbrevs
isearch-backward
: Incremental Search
isearch-backward-regexp
: Regexp Search
isearch-forward
: Incremental Search
isearch-forward-regexp
: Regexp Search
ispell-buffer
: Spelling
ispell-complete-word
: Spelling
ispell-kill-ispell
: Spelling
ispell-message
: Mail Mode Misc
ispell-region
: Spelling
ispell-word
: Spelling
jdb
: Starting GUD
jump-to-register
: RegPos
just-one-space
: Deletion
kbd-macro-query
: Kbd Macro Query
keep-lines
: Other Repeating Search
keyboard-escape-quit
: Quitting
keyboard-translate
: Keyboard Translations
kill-all-abbrevs
: Defining Abbrevs
kill-buffer
: Kill Buffer
kill-buffer-and-window
: Change Window
kill-comment
: Comment Commands
kill-compilation
: Compilation
kill-line
: Killing by Lines
kill-local-variable
: Locals
kill-rectangle
: Rectangles
kill-region
: Other Kill Commands
kill-ring-save
: Kill Ring
kill-sentence
: Sentences
kill-sexp
: List Commands
kill-some-buffers
: Kill Buffer
kill-word
: Words
latex-mode
: TeX Mode
lazy-lock-mode
: Lazy Lock Mode
line-number-mode
: Optional Mode Line
lisp-complete-symbol
: Symbol Completion
lisp-eval-defun
: External Lisp
lisp-indent-line
: Basic Indent
lisp-interaction-mode
: Lisp Interaction
lisp-mode
: External Lisp
list-abbrevs
: Editing Abbrevs
list-bookmarks
: Bookmarks
list-buffers
: List Buffers
list-calendar-holidays
: Holidays
list-coding-systems
: Coding Systems
list-command-history
: Repetition
list-directory
: Directories
list-faces-display
: Faces
list-holidays
: Holidays
list-input-methods
: Select Input Method
list-matching-lines
: Other Repeating Search
list-tags
: List Tags
list-text-properties-at
: Editing Format Info
list-yahrzeit-dates
: From Other Calendar
load
: Lisp Libraries
load-file
: Lisp Libraries
load-library
: Lisp Libraries
local-set-key
: Rebinding
local-unset-key
: Rebinding
lpr-buffer
: Hardcopy
lpr-region
: Hardcopy
mail-attach-file
: Mail Mode Misc
mail-bcc
: Header Editing
mail-cc
: Header Editing
mail-complete
: Header Editing
mail-fcc
: Header Editing
mail-fill-yanked-message
: Citing Mail
mail-interactive-insert-alias
: Mail Aliases
mail-send
: Mail Sending
mail-send-and-exit
: Mail Sending
mail-signature
: Mail Mode Misc
mail-subject
: Header Editing
mail-text
: Mail Mode Misc
mail-to
: Header Editing
mail-yank-original
: Citing Mail
mail-yank-region
: Citing Mail
make-frame-command
: Creating Frames
make-frame-on-display
: Multiple Displays
make-indirect-buffer
: Indirect Buffers
make-local-variable
: Locals
make-symbolic-link
: Misc File Ops
make-variable-buffer-local
: Locals
Man-fontify-manpage
: Documentation
manual-entry
: Documentation
mark-calendar-holidays
: Holidays
mark-defun
: Defuns
mark-diary-entries
: Diary Commands
mark-fortran-subprogram
: Fortran Motion
mark-page
: Pages
mark-paragraph
: Paragraphs
mark-sexp
: List Commands
mark-whole-buffer
: Marking Objects
mark-word
: Words
minibuffer-complete
: Completion Example
minibuffer-complete-word
: Completion Commands
mode25
: MS-DOS Display
mode4350
: MS-DOS Display
modify-face
: Face Customization
mouse-choose-completion
: Completion Commands
mouse-save-then-click
: Mouse Commands
mouse-secondary-save-then-kill
: Secondary Selection
mouse-set-point
: Mouse Commands
mouse-set-region
: Mouse Commands
mouse-set-secondary
: Secondary Selection
mouse-start-secondary
: Secondary Selection
mouse-yank-at-click
: Mouse Commands
mouse-yank-secondary
: Secondary Selection
move-past-close-and-reindent
: Balanced Editing
move-to-window-line
: Moving Point
mpuz
: Amusements
name-last-kbd-macro
: Save Kbd Macro
narrow-to-defun
: Narrowing
narrow-to-page
: Narrowing
narrow-to-region
: Narrowing
negative-argument
: Arguments
newline
: Inserting Text
newline-and-indent
: Basic Indent
next-completion
: Completion Commands
next-error
: Compilation Mode
next-history-element
: Minibuffer History
next-line
: Moving Point
next-matching-history-element
: Minibuffer History
normal-mode
: Choosing Modes
not-modified
: Saving
nroff-mode
: Nroff Mode
number-to-register
: RegNumbers
occur
: Other Repeating Search
open-dribble-file
: Checklist
open-line
: Blank Lines
open-rectangle
: Rectangles
open-termscript
: Checklist
other-frame
: Misc X
other-window
: Other Window
outline-backward-same-level
: Outline Motion
outline-forward-same-level
: Outline Motion
outline-minor-mode
: Outline Mode
outline-mode
: Outline Mode
outline-next-visible-heading
: Outline Motion
outline-previous-visible-heading
: Outline Motion
outline-up-heading
: Outline Motion
overwrite-mode
: Minor Modes
paragraph-indent-text-mode
: Text Mode
pdb
: Starting GUD
perldb
: Starting GUD
phases-of-moon
: Lunar Phases
picture-backward-clear-column
: Basic Picture
picture-backward-column
: Basic Picture
picture-clear-column
: Basic Picture
picture-clear-line
: Basic Picture
picture-clear-rectangle
: Rectangles in Picture
picture-clear-rectangle-to-register
: Rectangles in Picture
picture-forward-column
: Basic Picture
picture-motion
: Insert in Picture
picture-motion-reverse
: Insert in Picture
picture-move-down
: Basic Picture
picture-move-up
: Basic Picture
picture-movement-down
: Insert in Picture
picture-movement-left
: Insert in Picture
picture-movement-ne
: Insert in Picture
picture-movement-nw
: Insert in Picture
picture-movement-right
: Insert in Picture
picture-movement-se
: Insert in Picture
picture-movement-sw
: Insert in Picture
picture-movement-up
: Insert in Picture
picture-newline
: Basic Picture
picture-open-line
: Basic Picture
picture-set-tab-stops
: Tabs in Picture
picture-tab
: Tabs in Picture
picture-tab-search
: Tabs in Picture
picture-yank-rectangle
: Rectangles in Picture
picture-yank-rectangle-from-register
: Rectangles in Picture
plain-tex-mode
: TeX Mode
point-to-register
: RegPos
pop-global-mark
: Global Mark Ring
pop-tag-mark
: Find Tag
prefer-coding-system
: Recognize Coding
prepend-to-buffer
: Accumulating Text
previous-completion
: Completion Commands
previous-history-element
: Minibuffer History
previous-line
: Moving Point
previous-matching-history-element
: Minibuffer History
print-buffer
: Hardcopy
print-buffer
(MS-DOS)
: MS-DOS Printing
print-region
: Hardcopy
print-region
(MS-DOS)
: MS-DOS Printing
ps-print-buffer
: Postscript
ps-print-buffer
(MS-DOS)
: MS-DOS Printing
ps-print-buffer-with-faces
: Postscript
ps-print-region
: Postscript
ps-print-region-with-faces
: Postscript
ps-spool-buffer
: Postscript
ps-spool-buffer
(MS-DOS)
: MS-DOS Printing
ps-spool-buffer-with-faces
: Postscript
ps-spool-region
: Postscript
ps-spool-region-with-faces
: Postscript
pwd
: File Names
quail-set-keyboard-layout
: Select Input Method
query-replace
: Query Replace
query-replace-regexp
: Query Replace
quietly-read-abbrev-file
: Saving Abbrevs
quoted-insert
: Inserting Text
re-search-backward
: Regexp Search
re-search-forward
: Regexp Search
read-abbrev-file
: Saving Abbrevs
recenter
: Scrolling
recover-file
: Recover
recover-session
: Recover
redraw-calendar
: General Calendar
remove-untranslated-filesystem
: Text and Binary
rename-file
: Misc File Ops
repeat
: Repeating
repeat-complex-command
: Repetition
replace-regexp
: Unconditional Replace
replace-string
: Unconditional Replace
report-emacs-bug
: Checklist
reposition-window
: Scrolling
resize-minibuffer-mode
: Minibuffer Edit
revert-buffer
: Reverting
revert-buffer
(dired)
: Dired Updating
rlogin
: Remote Host
rlogin-directory-tracking-mode
: Remote Host
rmail
: Rmail
rmail-add-label
: Rmail Labels
rmail-beginning-of-message
: Rmail Scrolling
rmail-bury
: Rmail Basics
rmail-continue
: Rmail Reply
rmail-delete-backward
: Rmail Deletion
rmail-delete-forward
: Rmail Deletion
rmail-edit-current-message
: Rmail Editing
rmail-expunge
: Rmail Deletion
rmail-first-message
: Rmail Motion
rmail-forward
: Rmail Reply
rmail-get-new-mail
: Rmail Files
rmail-input
: Rmail Files
rmail-kill-label
: Rmail Labels
rmail-last-message
: Rmail Motion
rmail-mail
: Rmail Reply
rmail-mode
: Rmail
rmail-next-labeled-message
: Rmail Labels
rmail-next-message
: Rmail Motion
rmail-next-undeleted-message
: Rmail Motion
rmail-output
: Rmail Output
rmail-output-body-to-file
: Rmail Output
rmail-output-to-rmail-file
: Rmail Output
rmail-previous-labeled-message
: Rmail Labels
rmail-previous-message
: Rmail Motion
rmail-previous-undeleted-message
: Rmail Motion
rmail-quit
: Rmail Basics
rmail-reply
: Rmail Reply
rmail-resend
: Rmail Reply
rmail-retry-failure
: Rmail Reply
rmail-save
: Rmail Basics
rmail-search
: Rmail Motion
rmail-show-message
: Rmail Motion
rmail-summary
: Rmail Make Summary
rmail-summary-by-labels
: Rmail Make Summary
rmail-summary-by-recipients
: Rmail Make Summary
rmail-summary-by-topic
: Rmail Make Summary
rmail-summary-quit
: Rmail Summary Edit
rmail-summary-wipe
: Rmail Summary Edit
rmail-toggle-header
: Rmail Display
rmail-undelete-previous-message
: Rmail Deletion
rot13-other-window
: Rmail Rot13
run-lisp
: External Lisp
save-buffer
: Saving
save-buffers-kill-emacs
: Exiting
save-some-buffers
: Saving
scroll-bar-mode
: Scroll Bars
scroll-calendar-left
: Scroll Calendar
scroll-calendar-left-three-months
: Scroll Calendar
scroll-calendar-right
: Scroll Calendar
scroll-calendar-right-three-months
: Scroll Calendar
scroll-down
: Scrolling
scroll-left
: Horizontal Scrolling
scroll-other-window
: Other Window
scroll-right
: Horizontal Scrolling
scroll-up
: Scrolling
sdb
: Starting GUD
search-backward
: Nonincremental Search
search-forward
: Nonincremental Search
select-frame-by-name
: Non-Window Terminals
self-insert
: Inserting Text
send-invisible
: Shell Mode
server-edit
: Emacs Server
set-background-color
: Frame Parameters
set-border-color
: Frame Parameters
set-buffer-file-coding-system
: Specify Coding
set-buffer-process-coding-system
: Specify Coding
set-comment-column
: Options for Comments
set-cursor-color
: Frame Parameters
set-fill-column
: Fill Commands
set-fill-prefix
: Fill Prefix
set-foreground-color
: Frame Parameters
set-frame-font
: Frame Parameters
set-frame-name
: Non-Window Terminals
set-goal-column
: Moving Point
set-input-method
: Select Input Method
set-justification-center
: Format Justification
set-justification-full
: Format Justification
set-justification-left
: Format Justification
set-justification-none
: Format Justification
set-justification-right
: Format Justification
set-keyboard-coding-system
: Specify Coding
set-language-environment
: Language Environments
set-mark-command
: Setting Mark
set-mouse-color
: Frame Parameters
set-next-selection-coding-system
: Specify Coding
set-rmail-inbox-list
: Rmail Files
set-selection-coding-system
: Specify Coding
set-selective-display
: Selective Display
set-terminal-coding-system
: Specify Coding
set-variable
: Examining
set-visited-file-name
: Saving
setq-default
: Locals
shell
: Interactive Shell
shell-backward-command
: Shell Mode
shell-command
: Single Shell
shell-command-on-region
: Single Shell
shell-forward-command
: Shell Mode
show-all
: Outline Visibility
show-all-diary-entries
: Diary Commands
show-branches
: Outline Visibility
show-children
: Outline Visibility
show-entry
: Outline Visibility
show-paren-mode
: Matching
show-subtree
: Outline Visibility
shrink-window-if-larger-than-buffer
: Change Window
slitex-mode
: TeX Mode
sort-columns
: Sorting
sort-fields
: Sorting
sort-lines
: Sorting
sort-numeric-fields
: Sorting
sort-pages
: Sorting
sort-paragraphs
: Sorting
split-line
: Indentation Commands
split-window-horizontally
: Split Window
split-window-vertically
: Split Window
spook
: Distracting NSA
standard-display-8bit
: Single-Byte European Support
start-kbd-macro
: Basic Kbd Macro
string-rectangle
: Rectangles
substitute-in-file-name
: File Names
substitute-key-definition
: Init Rebinding
sunrise-sunset
: Sunrise/Sunset
suspend-emacs
: Exiting
switch-to-buffer
: Select Buffer
switch-to-buffer-other-frame
: Select Buffer
switch-to-buffer-other-window
: Select Buffer
switch-to-completions
: Completion Commands
tab-to-tab-stop
: Tab Stops
tabify
: Just Spaces
tags-apropos
: List Tags
tags-loop-continue
: Tags Search
tags-query-replace
: Tags Search
tags-search
: Tags Search
telnet
: Remote Host
tex-bibtex-file
: TeX Print
tex-buffer
: TeX Print
tex-close-latex-block
: LaTeX Editing
tex-file
: TeX Print
tex-insert-braces
: TeX Editing
tex-insert-quote
: TeX Editing
tex-kill-job
: TeX Print
tex-latex-block
: LaTeX Editing
tex-mode
: TeX Mode
tex-print
: TeX Print
tex-recenter-output-buffer
: TeX Print
tex-region
: TeX Print
tex-show-print-queue
: TeX Print
tex-terminate-paragraph
: TeX Editing
tex-validate-region
: TeX Editing
tex-view
: TeX Print
text-mode
: Text Mode
tmm-menubar
: Menu Bar
toggle-input-method
: Select Input Method
top-level
: Quitting
transient-mark-mode
: Transient Mark
transpose-chars
: Transpose
transpose-lines
: Transpose
transpose-sexps
: List Commands, Transpose
transpose-words
: Words, Transpose
turn-on-font-lock
: Font Lock
undigestify-rmail-message
: Rmail Digest
undo
: Undo
unexpand-abbrev
: Expanding Abbrevs
unforward-rmail-message
: Rmail Reply
universal-argument
: Arguments
universal-coding-system-argument
: Specify Coding
unrmail
: Out of Rmail
untabify
: Just Spaces
up-list
: TeX Editing
upcase-region
: Case
upcase-word
: Case
vc-annotate
: Old Versions
vc-cancel-version
: VC Undo
vc-create-snapshot
: Making Snapshots
vc-diff
: Old Versions
vc-directory
: VC Dired Mode
vc-dired-mark-locked
: VC Dired Commands
vc-dired-toggle-terse-mode
: VC Dired Commands
vc-insert-headers
: Version Headers
vc-merge
: Merging
vc-next-action
: Basic VC Editing
vc-print-log
: VC Status
vc-register
: Registering
vc-rename-file
: Renaming and VC
vc-resolve-conflicts
: Merging
vc-retrieve-snapshot
: Making Snapshots
vc-revert-buffer
: VC Undo
vc-toggle-read-only
: Misc Buffer, Basic VC Editing
vc-update-change-log
: Change Logs and VC
vc-version-other-window
: Old Versions
vi-mode
: Emulation
view-buffer
: Misc Buffer
view-diary-entries
: Diary Commands
view-emacs-FAQ
: Misc Help
view-emacs-news
: Misc Help
view-file
: Misc File Ops
view-hello-file
: International Intro
view-lossage
: Misc Help
view-register
: Registers
vip-mode
: Emulation
viper-mode
: Emulation
visit-tags-table
: Select Tags Table
what-cursor-position
: Position Info
what-line
: Position Info
what-page
: Position Info
where-is
: Name Help
which-function-mode
: Which Function
widen
: Narrowing
widget-backward
: Changing an Option
widget-complete
: Changing an Option
widget-forward
: Changing an Option
window-configuration-to-register
: RegConfig
word-search-backward
: Word Search
word-search-forward
: Word Search
write-abbrev-file
: Saving Abbrevs
write-file
: Saving
write-region
: Misc File Ops
xdb
: Starting GUD
yank
: Kill Ring
yank-pop
: Earlier Kills
yank-rectangle
: Rectangles
yow
: Amusements
zap-to-char
: Other Kill Commands
abbrev-all-caps
: Expanding Abbrevs
abbrev-file-name
: Saving Abbrevs
abbrev-mode
: Abbrev Concepts
adaptive-fill-first-line-regexp
: Adaptive Fill
adaptive-fill-function
: Adaptive Fill
adaptive-fill-mode
: Adaptive Fill
adaptive-fill-regexp
: Adaptive Fill
ange-ftp-default-user
: Remote Files
appt-display-diary
: Appointments
appt-issue-message
: Appointments
apropos-do-all
: Apropos
auto-coding-alist
: Recognize Coding
auto-mode-alist
: Choosing Modes
auto-save-default
: Auto Save Control
auto-save-interval
: Auto Save Control
auto-save-list-file-prefix
: Recover
auto-save-timeout
: Auto Save Control
auto-save-visited-file-name
: Auto Save Files
backup-by-copying
: Backup Copying
backup-by-copying-when-linked
: Backup Copying
backup-by-copying-when-mismatch
: Backup Copying
backup-enable-predicate
: Backup
baud-rate
: Display Vars
blink-matching-delay
: Matching
blink-matching-paren
: Matching
blink-matching-paren-distance
: Matching
bookmark-save-flag
: Bookmarks
bookmark-search-size
: Bookmarks
buffer-file-coding-system
: Recognize Coding
buffer-read-only
: Misc Buffer
c-basic-offset
: Variables for C Indent
c-comment-only-line-offset
: Comments in C
c-comment-start-regexp
: Comments in C
c-default-style
: C Indent Styles
c-hanging-comment-ender-p
: Comments in C
c-hanging-comment-starter-p
: Comments in C
c-hungry-delete-key
: Hungry Delete
c-mode-hook
: Program Modes
c-mode-map
: Local Keymaps
c-offsets-alist
: Variables for C Indent
c-special-indent-hook
: Variables for C Indent
c-strict-syntax-p
: Indentation Calculation
c-style-alist
: Variables for C Indent
c-syntactic-context
: Syntactic Analysis
calendar-daylight-savings-ends
: Daylight Savings
calendar-daylight-savings-ends-time
: Daylight Savings
calendar-daylight-savings-starts
: Daylight Savings
calendar-daylight-time-offset
: Daylight Savings
calendar-daylight-time-zone-name
: Sunrise/Sunset
calendar-latitude
: Sunrise/Sunset
calendar-location-name
: Sunrise/Sunset
calendar-longitude
: Sunrise/Sunset
calendar-standard-time-zone-name
: Sunrise/Sunset
calendar-time-zone
: Sunrise/Sunset
calendar-week-start-day
: Move to Beginning or End
case-fold-search
: Search Case
case-replace
: Replacement and Case
change-major-mode-with-file-name
: Choosing Modes
coding
: Recognize Coding
colon-double-space
: Fill Commands
comint-completion-addsuffix
: Shell Options
comint-completion-autolist
: Shell Options
comint-completion-fignore
: Shell Mode
comint-completion-recexact
: Shell Options
comint-input-autoexpand
: History References
comint-input-ignoredups
: Shell Options
comint-prompt-regexp
: History References
comint-scroll-show-maximum-output
: Shell Options
comint-scroll-to-bottom-on-input
: Shell Options
comint-scroll-to-bottom-on-output
: Shell Options
command-history
: Repetition
command-line-args
: Action Arguments
comment-column
: Options for Comments
comment-end
: Options for Comments
comment-indent-function
: Options for Comments
comment-line-start
: Fortran Comments
comment-line-start-skip
: Fortran Comments
comment-multi-line
: Options for Comments
comment-padding
: Multi-Line Comments
comment-start
: Options for Comments
comment-start-skip
: Options for Comments
compare-ignore-case
: Comparing Files
compilation-scroll-output
: Compilation
compile-command
: Compilation
completion-auto-help
: Completion Options
completion-ignored-extensions
: Completion Options
ctl-arrow
: Display Vars
ctl-x-4-map
: Prefix Keymaps
ctl-x-map
: Prefix Keymaps
current-input-method
: Select Input Method
dabbrev-abbrev-char-regexp
: Dabbrev Customization
dabbrev-abbrev-skip-leading-regexp
: Dabbrev Customization
dabbrev-case-fold-search
: Dabbrev Customization
dabbrev-case-replace
: Dabbrev Customization
dabbrev-check-all-buffers
: Dynamic Abbrevs
dabbrev-limit
: Dynamic Abbrevs
dbx-mode-hook
: GUD Customization
default-buffer-file-coding-system
: Specify Coding
default-directory
: File Names
default-enable-multibyte-characters
: Enabling Multibyte
default-input-method
: Select Input Method
default-justification
: Format Justification
default-major-mode
: Choosing Modes
delete-auto-save-files
: Auto Save Files
delete-old-versions
: Backup Deletion
desktop-enable
: Saving Emacs Sessions
desktop-files-not-to-save
: Saving Emacs Sessions
diary-file
: Format of Diary File
diary-hook
: Appointments
diary-mail-days
: Diary Commands
diff-switches
: Comparing Files
dired-chown-program
: Operating on Files
dired-copy-preserve-time
: Operating on Files
dired-garbage-files-regexp
: Flagging Many Files
dired-kept-versions
: Flagging Many Files
dired-listing-switches
: Dired Enter
dired-listing-switches
(MS-DOS)
: MS-DOS Processes
display-time-24hr-format
: Optional Mode Line
dos-codepage
: MS-DOS and MULE
dos-display-scancodes
: MS-DOS Input
dos-hyper-key
: MS-DOS Input
dos-keypad-mode
: MS-DOS Input
dos-printer
: MS-DOS Printing
dos-ps-printer
: MS-DOS Printing
dos-super-key
: MS-DOS Input
dos-unsupported-character-glyph
: MS-DOS and MULE
double-click-time
: Mouse Buttons
echo-keystrokes
: Display Vars
emacs-lisp-mode-hook
: Program Modes
emerge-combine-versions-template
: Combining in Emerge
emerge-startup-hook
: Fine Points of Emerge
enable-multibyte-characters
: Single-Byte European Support, Enabling Multibyte
enable-recursive-minibuffers
: Minibuffer Edit
enriched-fill-after-visiting
: Requesting Formatted Text
enriched-translations
: Requesting Formatted Text
eol-mnemonic-dos
: Mode Line
eol-mnemonic-mac
: Mode Line
eol-mnemonic-undecided
: Mode Line
eol-mnemonic-unix
: Mode Line
esc-map
: Prefix Keymaps
european-calendar-style
: Date Formats
exit-language-environment-hook
: Language Environments
explicit-shell-file-name
: Interactive Shell
fast-lock-cache-directories
: Fast Lock Mode
fast-lock-minimum-size
: Fast Lock Mode
fast-lock-save-others
: Fast Lock Mode
file-coding-system-alist
: Recognize Coding
file-name-buffer-file-type-alist
: Text and Binary
file-name-coding-system
: Specify Coding
file-name-handler-alist
: Remote Files
fill-column
: Fill Commands
fill-prefix
: Fill Prefix
find-file-existing-other-name
: File Aliases
find-file-hooks
: Visiting
find-file-not-found-hooks
: Visiting
find-file-run-dired
: Visiting
find-file-visit-truename
: File Aliases
find-ls-option
: Dired and Find
find-tag-marker-ring-length
: Find Tag
font-lock-beginning-of-syntax-function
: Font Lock
font-lock-mark-block-function
: Font Lock
font-lock-maximum-decoration
: Font Lock
font-lock-maximum-size
: Font Lock
font-lock-support-mode
: Fast or Lazy
fortran-analyze-depth
: ForIndent Cont
fortran-break-before-delimiters
: Fortran Autofill
fortran-check-all-num...
: ForIndent Vars
fortran-column-ruler
: Fortran Columns
fortran-comment-indent-char
: Fortran Comments
fortran-comment-indent-style
: Fortran Comments
fortran-comment-line-extra-indent
: Fortran Comments
fortran-comment-region
: Fortran Comments
fortran-continuation-indent
: ForIndent Vars
fortran-continuation-string
: ForIndent Cont
fortran-do-indent
: ForIndent Vars
fortran-electric-line-number
: ForIndent Num
fortran-if-indent
: ForIndent Vars
fortran-line-number-indent
: ForIndent Num
fortran-minimum-statement-indent...
: ForIndent Vars
fortran-structure-indent
: ForIndent Vars
fortran-tab-mode-default
: ForIndent Cont
gdb-mode-hook
: GUD Customization
gud-xdb-directories
: Starting GUD
help-map
: Prefix Keymaps
highlight-nonselected-windows
: Transient Mark
highlight-wrong-size-font
: Fontsets
history-length
: Minibuffer History
indent-tabs-mode
: Just Spaces
indent-tabs-mode
(Fortranモード)
: ForIndent Cont
inferior-lisp-program
: External Lisp
inhibit-eol-conversion
: Recognize Coding
initial-major-mode
: Entering Emacs
input-method-highlight-flag
: Input Methods
input-method-verbose-flag
: Input Methods
insert-default-directory
: File Names
interpreter-mode-alist
: Choosing Modes
inverse-video
: Display Vars
isearch-mode-map
: Incremental Search
ispell-dictionary
: Spelling
jdb-mode-hook
: GUD Customization
kept-new-versions
: Backup Deletion
kept-old-versions
: Backup Deletion
kill-buffer-hook
: Kill Buffer
kill-ring
: Earlier Kills
kill-ring-max
: Earlier Kills
kill-whole-line
: Killing by Lines
latex-block-names
: LaTeX Editing
latex-mode-hook
: TeX Print
latex-run-command
: TeX Print
lazy-lock-defer-contextually
: Lazy Lock Mode
lazy-lock-defer-on-scrolling
: Lazy Lock Mode
lazy-lock-defer-time
: Lazy Lock Mode
lazy-lock-minimum-size
: Lazy Lock Mode
lazy-lock-stealth-lines
: Lazy Lock Mode
lazy-lock-stealth-time
: Lazy Lock Mode
lazy-lock-stealth-verbose
: Lazy Lock Mode
line-number-display-limit
: Optional Mode Line
lisp-body-indent
: Lisp Indent
lisp-indent-offset
: Lisp Indent
lisp-interaction-mode-hook
: Program Modes
lisp-mode-hook
: Program Modes
lisp-mode-map
: Local Keymaps
list-directory-brief-switches
: Directories
list-directory-verbose-switches
: Directories
load-path
: Lisp Libraries
lpr-add-switches
: Hardcopy
lpr-command
(MS-DOS)
: MS-DOS Printing
lpr-commands
: Hardcopy
lpr-headers-switches
: Hardcopy
lpr-headers-switches
(MS-DOS)
: MS-DOS Printing
lpr-switches
: Hardcopy
lpr-switches
(MS-DOS)
: MS-DOS Printing
mail-abbrevs
: Mail Aliases
mail-aliases
: Mail Aliases
mail-archive-file-name
: Mail Headers
mail-default-reply-to
: Mail Headers
mail-from-style
: Mail Headers
mail-mode-hook
: Mail Mode Misc
mail-personal-alias-file
: Mail Aliases
mail-self-blind
: Mail Headers
mail-setup-hook
: Mail Mode Misc
mail-signature
: Mail Mode Misc
mail-user-agent
: Mail Methods
mail-yank-prefix
: Citing Mail
make-backup-files
: Backup
Man-fontify-manpage-flag
: Documentation
mark-even-if-inactive
: Transient Mark
mark-ring
: Mark Ring
mark-ring-max
: Mark Ring
message-log-max
: Echo Area
midnight-hook
: Kill Buffer
midnight-mode
: Kill Buffer
minibuffer-local-completion-map
: Minibuffer Maps
minibuffer-local-map
: Minibuffer Maps
minibuffer-local-must-match-map
: Minibuffer Maps
minibuffer-local-ns-map
: Minibuffer Maps
minibuffer-scroll-overlap
: Minibuffer Edit
mode-line-inverse-video
: Display Vars
mode-specific-map
: Prefix Keymaps
mouse-scroll-min-lines
: Mouse Commands
mouse-yank-at-point
: Mouse Commands
muddle-mode-hook
: Program Modes
next-line-add-newlines
: Moving Point
next-screen-context-lines
: Scrolling
no-redraw-on-reenter
: Display Vars
nroff-mode-hook
: Nroff Mode
outline-level
: Outline Format
outline-minor-mode-prefix
: Outline Mode
outline-mode-hook
: Outline Mode
outline-regexp
: Outline Format
page-delimiter
: Pages
paragraph-separate
: Paragraphs
paragraph-start
: Paragraphs
parens-require-spaces
: Balanced Editing
pdb-mode-hook
: GUD Customization
perldb-mode-hook
: GUD Customization
picture-mode-hook
: Picture
picture-tab-chars
: Tabs in Picture
plain-tex-mode-hook
: TeX Print
print-region-function
(MS-DOS)
: MS-DOS Printing
printer-name
: Hardcopy
printer-name
(MS-DOS)
: MS-DOS Printing
ps-font-family
: Postscript Variables
ps-font-info-database
: Postscript Variables
ps-font-size
: Postscript Variables
ps-landscape-mode
: Postscript Variables
ps-lpr-command
: Postscript Variables
ps-lpr-command
(MS-DOS)
: MS-DOS Printing
ps-lpr-switches
: Postscript Variables
ps-lpr-switches
(MS-DOS)
: MS-DOS Printing
ps-number-of-columns
: Postscript Variables
ps-page-dimensions-database
: Postscript Variables
ps-paper-type
: Postscript Variables
ps-print-color-p
: Postscript Variables
ps-print-header
: Postscript Variables
ps-printer-name
: Postscript Variables
ps-printer-name
(MS-DOS)
: MS-DOS Printing
read-quoted-char-radix
: Inserting Text
require-final-newline
: Saving
revert-without-query
: Reverting
rlogin-explicit-args
: Remote Host
rmail-decode-mime-charset
: Recognize Coding
rmail-delete-after-output
: Rmail Output
rmail-delete-message-hook
: Rmail Deletion
rmail-dont-reply-to-names
: Rmail Reply
rmail-edit-mode-hook
: Rmail Editing
rmail-file-coding-system
: Recognize Coding
rmail-file-name
: Rmail Basics
rmail-highlighted-headers
: Rmail Display
rmail-ignored-headers
: Rmail Display
rmail-mail-new-frame
: Rmail Reply
rmail-mode-hook
: Rmail
rmail-movemail-flags
: Movemail
rmail-output-file-alist
: Rmail Output
rmail-pop-password
: Movemail
rmail-pop-password-required
: Movemail
rmail-preserve-inbox
: Movemail
rmail-primary-inbox-list
: Rmail Inbox
rmail-redisplay-summary
: Rmail Summary Edit
rmail-retry-ignored-headers
: Rmail Reply
rmail-secondary-file-directory
: Rmail Files
rmail-secondary-file-regexp
: Rmail Files
rmail-summary-line-count-flag
: Rmail Make Summary
rmail-summary-window-size
: Rmail Make Summary
same-window-buffer-names
: Force Same Window
same-window-regexps
: Force Same Window
save-abbrevs
: Saving Abbrevs
scheme-mode-hook
: Program Modes
scroll-conservatively
: Scrolling
scroll-margin
: Scrolling
scroll-preserve-screen-position
: Scrolling
sdb-mode-hook
: GUD Customization
search-slow-speed
: Incremental Search
search-slow-window-lines
: Incremental Search
selective-display-ellipses
: Selective Display
sendmail-coding-system
: Mail Sending, Recognize Coding
sentence-end
: Sentences
sentence-end-double-space
: Fill Commands
server-temp-file-regexp
: Emacs Server
server-window
: Emacs Server
set-language-environment-hook
: Language Environments
shell-cd-regexp
: Interactive Shell
shell-command-default-error-buffer
: Single Shell
shell-command-execonly
: Shell Options
shell-command-regexp
: Shell Mode
shell-completion-fignore
: Shell Mode
shell-file-name
: Single Shell
shell-input-ring-file-name
: Shell Ring
shell-popd-regexp
: Interactive Shell
shell-prompt-pattern
: History References
shell-pushd-dextract
: Shell Options
shell-pushd-dunique
: Shell Options
shell-pushd-regexp
: Interactive Shell
shell-pushd-tohome
: Shell Options
shell-set-directory-error-hook
: Interactive Shell
slitex-mode-hook
: TeX Print
slitex-run-command
: TeX Print
sort-fold-case
: Sorting
special-display-buffer-names
: Special Buffer Frames
special-display-frame-alist
: Special Buffer Frames
special-display-regexps
: Special Buffer Frames
split-window-keep-point
: Split Window
standard-fontset-spec
: Defining Fontsets
standard-indent
: Format Indentation
suggest-key-bindings
: M-x
tab-stop-list
: Tab Stops
tab-width
: Display Vars
tags-file-name
: Select Tags Table
tags-table-list
: Select Tags Table
term-file-prefix
: Terminal Init
term-setup-hook
: Terminal Init
tex-bibtex-command
: TeX Print
tex-default-mode
: TeX Mode
tex-directory
: TeX Print
tex-dvi-print-command
: TeX Print
tex-dvi-view-command
: TeX Print
tex-main-file
: TeX Print
tex-mode-hook
: TeX Print
tex-run-command
: TeX Print
tex-shell-hook
: TeX Print
tex-show-queue-command
: TeX Print
tex-start-options-string
: TeX Print
text-mode-hook
: Text Mode
track-eol
: Moving Point
truncate-lines
: Continuation Lines
truncate-partial-width-windows
: Split Window
undo-limit
: Undo
undo-strong-limit
: Undo
unibyte-display-via-language-environment
: Single-Byte European Support
user-mail-address
: Init Examples
vc-command-messages
: VC Command Execution
vc-comment-alist
: Version Headers
vc-consult-headers
: VC Status Retrieval
vc-default-back-end
: Registering
vc-default-init-version
: Registering
vc-directory-exclusion-list
: VC Dired Mode
vc-dired-recurse
: VC Dired Mode
vc-dired-terse-display
: VC Dired Mode
vc-follow-symlinks
: VC Workfile Handling
vc-handle-cvs
: Backend Options
vc-header-alist
: Version Headers
vc-initial-comment
: Registering
vc-keep-workfiles
: VC Workfile Handling
vc-log-mode-hook
: Log Buffer
vc-make-backup-files
: VC Workfile Handling, Backup
vc-mistrust-permissions
: VC Status Retrieval
vc-path
: VC Command Execution
vc-static-header-alist
: Version Headers
vc-suppress-confirm
: VC Command Execution
version-control
: Backup Names
visible-bell
: Display Vars
w32-pass-alt-to-system
: Windows System Menu
which-func-modes
: Which Function
window-min-height
: Change Window
window-min-width
: Change Window
x-cut-buffer-max
: Mouse Commands
xdb-mode-hook
: GUD Customization
*Messages*
バッファ: Echo Area
.mailrc
ファイル: Mail Aliases
complete
: Completion Options
DISPLAY
(環境変数): Display X
EDITOR
(環境変数): Emacs Server
emacsclient
: Emacs Server
ESHELL
(環境変数): Interactive Shell
etags
プログラム: Create Tags Table
find
とdired: Dired and Find
gzip
: Compressed Files
iso-ascii
ライブラリ: Single-Byte European Support
iso-transl
ライブラリ: Single-Byte European Support
ispell
プログラム: Spelling
MAILHOST
(環境変数): Movemail
MAIL
(環境変数): Rmail Inbox
movemail
: Movemail
movemail
プログラム: Movemail
region
フェイス: Faces
REPLYTO
(環境変数): Mail Headers
SHELL
(環境変数): Interactive Shell
TERM
(環境変数): Checklist
TEXEDIT
(環境変数): Emacs Server
TEXINPUTS
(環境変数): TeX Print
VERSION_CONTROL
(環境変数): Backup Names
region
: Faces
DISPLAY
: Display X
EDITOR
: Emacs Server
ESHELL
: Interactive Shell
MAIL
: Rmail Inbox
MAILHOST
: Movemail
REPLYTO
: Mail Headers
SHELL
: Interactive Shell
TERM
: Checklist
TEXEDIT
: Emacs Server
TEXINPUTS
: TeX Print
VERSION_CONTROL
: Backup Names
【訳注】日本語訳はあくまで『参考』である。 正式な許諾書は英文のGNU General Public Licenseであることに 注意してほしい。
【注意】
現在、このバージョン2の発行者(FSF)住所は、正式に新しい住所の
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
に変わっている。
【注意】現在、このバージョン2の発行者(FSF)住所は、 正式に新しい住所の 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA に変わっている。
【訳注】日本語訳: 『Emacs Lispプログラミング入門』、アスキー出版局、ISBN 4-7561-1805-4
【訳注】同じ意味で、改行(newline)も使う。
【訳注】これは、画面端末を使っている場合の話。
【訳注】 簡単に終了してしまっては、困るので。
【訳注】Emacsが専用のXのウィンドウを使っている場合は関係ない。
【訳注】Emacsのインストールの仕方によっては、 きちんと日本語のチュートリアルが表示される。 そうでなければ、 M-x set-language-environment <RET> Japanese <RET>(あるいは、 C-x <RET> l Japanese <RET>)と打ってから、 改めてControl-h tと打つ。 日本語以外にもいくつかの言語のチュートリアルがある。
【訳注】なんらの解釈もせずに、単なる文字として扱う。
Latin-1文字を表示できる端末であれば、
Char:
のあとに表示される文字は、実際に、
アクサングレーブ付きの文字Aになる。
【訳注】履歴として残っている文字列データの 最後尾よりさらに先に移動すること。
エディタの中には、テキストに1か所の修正を加える場合でさえ、 探索置換操作が唯一の手段であるものもある。
【訳注】進行中の動作が完了するまでは、 つぎの動作を開始させないようにすること。
【訳注】Emacsが同時編集を防ぐためのロックとは別のロック。
ファイル名をクォートする/:
の機能もオフになる。
いくつかのシステムでは、Mouse-3をモード特有のメニューに使う。 ユーザーを調査した結果、Mouse-3をリージョンの選択とキルに 使い続けることが好まれていることが判明した。 ゆえに、このメニューに対してC-Mouse-3を使うことにした。
【訳注】GNU Emacsをインストールする時点で、 対応する版のLEIM(Library of Emacs Input Method)のソースを GNU Emacsのソースディレクトリに展開しておくと、 自動的にインストールされる。
【訳注】言語環境がJapanese
のときに
デフォルトで使用されるLEIMに含まれているもの。
「ローマ字→ひらがな→漢字」と変換するが、あまい使いやすくはない。
WNN、かんな、SKKなどを使うには、Emacsの配布とは別の非公式パッチを
自前で当てる必要がある。
ただし、これらを用いた場合、日本語を入力できない場面もあることを
承知しておく必要がある。
MIMEの「text/*」の本体や、 他のネットワーク転送の場面でも指定される。 Emacsが直接には扱えない SGMLの参照構文であるrecord-start/record-end書式とは異なる。
【訳注】なお、移動方向に単語構成文字がない場合には、 それらを飛び越えてポイントを移動します。
【訳注】
言語環境をJapanese
にすると、変数sentence-end
は
"[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*\\|[。?!]"となっている。 追加部分は、日本語の文末に対応する文字集合。
【訳注】段落に1行しかなければ、 詰め込み接頭辞を切り出す必要はないと思うかもしれないが、 たとえば、その行が詰め込み桁より長かったり、 新たな入力によって複数行の段落になったときのことを考えてみてほしい。
【訳注】ポイントが本体行にあっても動作する。
【訳注】ポイントが本体行にあっても動作し、結果も同じ。
【訳注】抜けると、また不可視にもどってしまう。
【訳注】実際にはC-j。
【訳注】
メニューにはNone
ではなくUnfilled
が表示される。
【訳注】詰め込まないことを指定するシンボルは
none
。Unfilled
ではない。
【訳注】Other Properties
ではなく、
Special Properties
と表示される。
【訳注】 ここでは、Lispの「リスト」ではなく、 単に括弧で括った一塊のこと。
【訳注】 プログラムのソースコードを美しく清書するプログラムを 一般にプリティプリンタ(pretty-printer)と呼ぶ。
【訳注】#elif
のところで止まってしまう。
【訳注】 入力と出力をすべて記録した対話記録
【訳注】 この拡張子はlexやflexのソースファイルにも使われる。
【訳注】 展開を引き起こした<SPC>も挿入されることに注意。
【訳注】文字数を指定する。
【訳注】これは欧文用のコマンドで、 日本語で入力する場合にはあまり関係ない。
【訳注】NSAとはNational Security Agency (合衆国国家安全保障局)の略。 合衆国の公益に基づいて必要により、 電話やInternetなどの盗聴を行っていると噂されている。 この部分は日本国内だけでメイルをやりとりする限りにおいては あまり関係はないだろう。
【訳注】 システムが到着メイルを格納するファイルのこと。 実際のファイル名はシステムに依存する。
【訳注】 あとで説明されるように、 「削除」といっても実際には「削除印」を付けるだけ。
【訳注】 メッセージに付けた削除印を消すこと。
【訳注】数種類の形式のdiff
の出力を解釈して、
テキストファイルを更新するためのプログラム
【訳注】 この変数はどの曜日を週の始めにするかを示しており、 5を設定すると金曜日から始まる。
【訳注】 主に高緯度地域で夏期に時計を進める習慣。 日本でも戦後すぐに一度使われた。 現在、省エネルギーなどを名目に再導入が検討されているようだが…。
【訳注】 グリニッジ標準時と呼称していたものに相当。
【訳注】 蛇足ですが、クリスマスは本来ユダヤ教の祝祭日で、 12月24日の日没から始まる。 これがクリスマスイブを祝う本当の理由。
【訳注】 ペルシアの数学者・天文学者・詩人
【訳注】十干。 五行(木、火、土、金、水)に兄、弟を付け加えた 甲(きのえ)、乙(きのと)、丙(ひのえ)、 丁(ひのと)、戊(つちのえ)、己(つちのと)、 庚(かのえ)、辛(かのと)、壬(みずのえ)、癸(みずのと)からなる。
【訳注】十二支。 子(ね)、丑(うし)、寅(とら)、卯(う)、辰(たつ)、巳(み)、 午(うま)、未(ひつじ)、申(さる)、 酉(とり)、戌(いぬ)、亥(い)からなる。
【訳注】 甲子(きのえね)、乙丑、丙寅、…、癸亥(みずのとい)までの 60通り(12と10の最小公倍数)になる。 辛亥革命の辛亥、壬申の乱の壬申などは年を表している。
【訳注】この日は西暦1年1月1日で、 Emacsのカレンダーは紀元前を扱えない。
シェルプロセスを休止すべきではない。 シェルのサブジョブを休止するのとはまったく別のことであり、 こちらは普通に行ってよい。 ただし、休止したサブジョブはシェルで再開させる必要がある。 このコマンドでは再開できない。
【訳注】 印刷機の長さの単位。 1ポイントは約1/72インチ(0.35mm)
この合成語は、 ベトナム戦争中にまさにそれにぴったりの意味で実際に使われたことがある。
【訳注】 この段落自体、M-x dissociated-pressで生成したような
ものなので、原文を掲載しておく。
It is a mustatement that too much use of Dissociated Press can be a
developediment to your real work. Sometimes to the point of outragedy.
And keep dissociwords out of your documentation, if you want it to be well
userenced and properbose. Have fun. Your buggestions are welcome.
【訳注】日本語訳: 『Emacs Lispリファレンスマニュアル』、アスキー出版局、ISBN4-7561-3414-9
【訳注】日本語環境を設定するには、
(set-language-environment "Japanese")とする。
【訳注】端末にとっては無意味で無害な文字を、 (動作が完了するまでの)時間稼ぎのために送出すること。
【訳注】「名人、熟練者、魔術師」の意味だが、 特定のコンピュータや(特に)ソフトウェアに精通した人を指す。
【訳注】ホスト単位でアクセスを制御するxhost
コマンドより、
ユーザー単位でアクセスを制御するxauth
のほうが望ましいだろう。
【訳注】日本語の場合は、通常、jisx0208.1983-0
などを使うであろう。
【訳注】
表示色として指定できる『名前』がわかるだけ。
どのような色に表示されるかはxcolors
などのコマンドで調べるとよい。
【訳注】uwm、twmなど古典的なウィンドウマネージャのふるまい。
通常、1つの特定のコードページはディスプレイメモリに組み込んであり、
他のコードページは、CONFIG.SYS
などの
システム設定ファイルを変更してリブートするとインストールできる。
ISO 8859用のEmacsの標準コーディングシステムは、
この目的には正しくない。
というのは、典型的なDOSコードページは、標準のISO文字集合に一致しない。
たとえば、文字ç
(セディーユ付きのc
)は、
標準のLatin-1文字集合ではコード231であるが、
対応するDOSコードページ850ではこの文字はコード135である。
ここの言葉遣いは不注意であった。 意図することは、誰もGNUシステムを使う許可のために支払う必要はない、 という意味である。 しかし、これでも明確になっていないし、 GNUの複写は常にほとんどまたは全くの無料で配布されるべきであると 言われていると解釈している人が多い。 後述で、この宣言では、利益のために配布サービスを提供している 企業の可能性について述べているように、これは意図した意味では決してない。 その後、私は、自由という意味の『フリー』と価格という意味の『無料』を 注意深く区別するようになった。 フリー・ソフトウェアとは、配布する自由と変更する自由をユーザが持っている ソフトウェアのことである。 無料でコピーを入手するかもしれないユーザもいれば、 コピーの入手に支払うユーザもいるかもしれない。 また、集まったお金がソフトウェアの改良支援となればますます良いことである。 重要なことは、コピーを持っている人は誰でも、そのコピーの使用にあたり、 他人と協力するための自由があるという点である。
これは、2種類の意味を持つ『フリー』について私が注意深く区別するのを 怠ったもう1つの箇所である。 この文は文字どおりの意味である。 つまり、GNUソフトウェアのコピーを友人やネット経由で無料で入手することができる、 という意味である。 ただし、間違った考え方を提示してしまっている。
そのような企業は現に数社存在する。
Free Software Foundationは企業ではなく慈善団体ではあるが、 配布サービスで資金の大半を調達している。 FSFへの注文によってコピーを入手する人がいなくなると、 作業ができなくなるだろう。 しかし、これは独占的制限によってユーザに支払いを強要することが 正しいという意味ではない。 たとえ小さな注文であってもユーザ全てがFSFへコピーを発注してくれれば、 それだけでFSFは借金をしないで済む。 あなたなりに何か貢献しているのか?
コンピュータ企業が数社集まって、GNU Cコンパイラの保守を サポートするための資金を最近共同出資した。
【訳注】Muleでは、quailマイナモードを起動する quail-modeにバインドされていた。