Go to the first, previous, next, last section, table of contents.


その他のコマンド

本章では他の章に入れるのが適当でなかったいくつかの話題を取り上げます。 具体的には、ネットニュースを読む、 シェルコマンドやシェルサブプロセスを動かす、 エディタをサブプロセスとして起動するプログラム間で1つの Emacsプロセスを共同利用する、印刷する、テキストをソートする、 バッファの一部だけを表示するように制限する、 2段組みファイルやバイナリファイルを編集する、 Emacsセッションの状態を保存してあとでその状態に復帰する、 他のエディタのエミュレーション、いろいろなお遊びです。

gnus

gnusは主にネットニュースを読んだり投稿するためのEmacsパッケージです。 電子メイル、リモートディレクトリ、ダイジェストなどの ネットニュース以外のメッセージを読んだりそれらに応答するのにも使えます。

以下ではgnusについて紹介し、いくつかの基本的な機能について説明します。 gnusについて詳しく知るには、 M-x infoと打ってからgnusのマニュアルを選んでください。

gnusを起動するには、M-x gnus RETと打ちます。

gnusのバッファ

ふつうのEmacsのパッケージと違って、 gnusは多数の異なるバッファを使って情報を提示したり ユーザーのコマンドを受け取ります。 ユーザーがもっとも多くの時間を使うことになるバッファは、 グループバッファサマリバッファ記事バッファの3つです。

グループバッファはニュースグループの一覧です。 gnusが起動すると、まずこのバッファが表示されます。 通常はユーザーが購読していて、かつ、 未読記事が存在するグループだけが表示されます。 このバッファでグループを選択します。

サマリバッファは選択したグループ内の1つの記事につき 1行の情報を表示します。 デフォルトでは、各記事の投稿者、題目、行数が表示されますが、 gnusのほとんどの表示内容と同様にこの表示内容はカスタマイズできます。 グループバッファでグループを選択するとサマリバッファが作られ、 グループから出ると削除されます。 サマリバッファを使って記事を選択します。

記事バッファは記事を表示します。 gnusの普通の使い方では、このバッファを選択することはありません。 記事を操作対象とするコマンド群はサマリバッファで動作します。 しかし、望むなら、記事バッファに切り替えて、 そこでgnusのコマンドを実行することも可能です。

gnusの起動時の動作

gnusが起動すると、個人のニュース初期化ファイル`.newsrc'を読み込み、 ニュース記事を蓄えているローカルのニュースサーバーと通信しようとします。 ニュースサーバーは、 ユーザーがログインしているマシンと同じである必要はありません。

gnusを起動してニュースサーバーと通信したあとでも グループバッファにグループが1つも表示されないときは、 LA kと打ってすべてのグループを表示させます。 つぎに各グループの行でuと打って 個々のグループの購読/非購読を切り替えます。

初めてgnusを起動したときは、ごく少数の選ばれたグループのみが 購読状態にあります。 他のグループは非購読グループ(killed groups)になっていて、 A kを使うと表示されます。 最初の起動以後にニュースサーバー上に追加されたグループはすべて、 ゾンビグループ(zombie groups)になっていて、 A zを使うと表示されます。 uを使えばこれらのグループを購読状態にできます。

qでgnusを終了すると、初期化ファイル`.newsrc'`.newsrc.eld'にすべてのグループの購読/非購読を自動的に記録します。 通常はこれらのファイルを手で編集すべきではありませんが、 やりかたがわかっているならかまいません。

gnusコマンドのまとめ

ニュースを読むにはつぎの2つの段階を踏みます。

  1. グループバッファでグループを選択する。
  2. サマリバッファで記事を選択する。 記事を選択すると、サマリバッファの小さなウィンドウの下の 大きめのウィンドウの中の記事バッファに選択した記事が表示される。

gnusの各バッファにはそれぞれ独自のコマンドがあります。 しかし、gnusのさまざまなバッファのどんなキーの意味も、 等価ではないにせよ、だいたい同じです。 以下は、グループバッファとサマリバッファのコマンドです。

q
グループバッファでは、初期化ファイル`.newsrc'を更新してgnusを終了する。 サマリバッファでは、 カレントグループから抜け出てグループバッファに戻る。 したがって、qを2回打つとgnusを終る。
L
グループバッファでは、 ニュースサーバーにある(非購読にしたもの以外の) すべてのグループを表示する。 すごく長いリストになるかもしれないので注意!
l
グループバッファでは、購読中で未読記事があるグループのみを表示する。
u
グループバッファでは、ポイントのある行のグループの購読/非購読を切り替える。 qでgnusを終ると、gnusはこの状態を`.newsrc'ファイルに記録する。 gnusは、通常、購読グループのみを表示するため、 つぎにgnusを起動したときには非購読にしたグループは表示されない。
C-k
グループバッファでは、ポイントのある行のグループを「抹消」する。 すなわち、そのグループは以後`.newsrc'にも現れなくなる。 このコマンドの効果は、現在のgnusセッションだけでなく 将来のgnusセッションにも影響する。 qでgnusを終了すると、 gnusはファイル`.newsrc'に 抹消したグループを除くすべてのグループの情報を書き出す。
SPC
グループバッファでは、ポイントのある行に対応するグループを選択し、 そのグループの最初の未読記事を表示する。 サマリバッファでは、つぎのようになる。 すなわち、繰り返しSPCを打と、すべての記事を順に見ていくことができる。
DEL
グループバッファでは、ポイントを未読記事がある1つまえのグループに移動する。 サマリバッファでは、記事のテキストを1画面分戻す。
n
ポイントをつぎの未読グループに進めるか、 または、つぎの未読記事を選択する。
p
ポイントをまえの未読グループへ戻すか、 または、まえの未読記事を選択する。
C-n
C-p
既読であってもポイントを1つあと/まえの項目に移動する。 ポイントがある行の記事やグループを選択することはしない。
s
サマリバッファでは、記事バッファに切り替えてC-sを打ったかのように、 記事バッファのテキストに対してインクリメンタルサーチを行う。
M-s regexp RET
サマリバッファでは、 regexpに一致する記事がみつかるまで前向きに探索する。

Emacsからシェルコマンドを実行する

Emacsには、 1つのコマンド行を下位のシェルプロセスに渡して実行させる機能があります。 また、入出力を`*shell*'という名前のEmacsバッファに接続して 対話的にシェルを実行する機能もあります。

M-! cmd RET
シェルコマンドcmdを実行し、その結果を表示する (shell-command)。
M-| cmd RET
リージョンの内容を入力としてシェルコマンドcmdを実行する。 場合によっては、リージョンをシェルコマンドの出力で置き換える。 (shell-command-on-region)。
M-x shell
入出力をEmacsバッファに接続してサブシェルを実行する。 すると、対話的にコマンドを入力できる。

単一のシェルコマンド

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 section コーディングシステムの指定

コマンドからのエラー出力は、通常、普通の出力と混ざり合ってしまいます。 変数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 section コーディングシステムの指定

shellnameをシェルのファイル名として、 ファイル`~/.emacs_shellname'が存在すると、 Emacsはサブシェルを実行開始した直後に初期設定のために、 このファイルの内容をシェルへの入力として送り込みます。 たとえば、bashを使っているのならファイル`~/.emacs_bash'の内容が送られます。

Emacsは、シェルコマンド、cdpushdpopdが シェルへの入力として送られるのを監視し、 バッファ`*shell*'のデフォルトディレクトリと シェルのカレントディレクトリが一致するようにします。 これらのシェルコマンドは、送られる入力行の文字列を構文的に調べて識別します。 これらのシェルコマンドに別名を付けるのなら、 Emacsにもその別名について教えておくことができます。 たとえば、変数shell-pushd-regexpの値がシェルへの入力行の先頭に 一致する場合は、その行はpushdコマンドであるとみなされます。 `pushd'に別名を付けたら、この変数の値を変更します。 同様に、shell-popd-regexpshell-cd-regexpは、 `popd'`cd'を識別するのに使われます。 これらのコマンドはシェルへの入力行の先頭部分にあるときだけ 正しく認識されます。

Emacsは、`cd'`pushd'`popd'のシェルコマンドだと 思われるものを処理中にエラーに遭遇すると、 フックshell-set-directory-err-hookを実行します (see section フック)。

Emacsがサブシェルのカレントディレクトリを正しく追従できていない場合は、 コマンドM-x dirsを使ってシェルにカレントディレクトリを問い合わ せてください。 このコマンドは一般的なコマンドの構文を持つシェルでは動作します。 ですが、とても変わったシェルでは動かないかもしれません。

M-x dirtrackを使うと、 別のもっと積極的なやり方でカレントディレクトリの変更に 追従する(しない)ようにもできます。

Emacsは、サブシェルの環境変数EMACStを設定します。 シェルスクリプトでこの変数を検査すれば、 Emacsのサブシェルとして動いているかどうか判定できます。

シェルモード(Shellモード)

シェルバッファではシェル(shell)モードが使われ、 プレフィックスキーC-cを持つ特別なキーをいくつか定義しています。 これらは、まずC-cを打つことを除けば、 Emacsの外でシェルを使うときの通常のコマンド行編集や ジョブ制御のキーに似せて定義してあります。 以下は、シェル(shell)モードでの特別なバインディングの一覧です。

RET
バッファの末尾で打つと、1行分を入力としてシェルに送る。 バッファの末尾以外では、現在行をバッファの末尾にコピーしてから、 それを入力としてシェルに送る(comint-send-input)。 行をコピーするとき、行の先頭部分の文字列で 変数shell-prompt-patternに一致する部分はコピーしない。 この変数の値は、ユーザーのシェルがプロンプトとして用いる 文字列に一致する正規表現であること。
TAB
シェルバッファでポイントの直前にあるコマンド名やファイル名を補完する (comint-dynamic-complete)。 TABは、履歴参照(see section シェル履歴の参照)や 環境変数名も補完できる。 変数shell-completion-fignoreには、 シェル(shell)モードでの補完において 無視したいファイル名の拡張子のリストを指定する。 デフォルトの設定では、名前が、`~'`#'`%'で 終るファイルを無視する。 関連する他のcomintモードではかわりに 変数comint-completion-fignoreを使う。
M-?
シェルバッファのポイントの直前にあるファイル名の可能な補完内容を 一時的に表示する(comint-dynamic-list-filename-completions)。
C-d
文字を削除するか、または、 EOFを送る(comint-delchar-or-maybe-eof)。 シェルバッファの末尾でC-dを打つとサブシェルにEOFを送る。 バッファのそれ以外の位置では、C-dを打つと通常どおり1文字削除する。
C-c C-a
行の先頭に行く。 ただし、プロンプトがある場合にはプロンプトの直後に行く (comint-bol)。 同じ行でこのコマンドを2回繰り返すと、2回目ではプロセスマークへ戻る。 プロセスマークとは、サブシェルへまだ送っていない入力の開始位置のこと。 (通常、これは同じ場所であり、 プロセスマークはその行のプロンプトの終りにある。 ただし、C-c SPCのあとでは、 プロセスマークはまえの行にあるかもしれない。)
C-c SPC
複数の入力行を溜めておき、まとめて送る。 このコマンドは、ポイントのまえに改行を挿入するが、 少なくともまだ、その行を入力としてサブシェルへ送らない。 RETを打つと、 改行のまえの1行とあとの1行を(区切りの改行を含めて)まとめて送る。
C-c C-u
バッファの末尾にある、まだシェルに送っていないテキストをすべてキルする (comint-kill-input)。
C-c C-w
ポイントの直前の1語をキルする(backward-kill-word)。
C-c C-c
シェル、または、あればサブジョブに割り込む (comint-interrupt-subjob)。 また、このコマンドは シェルバッファ内のまだシェルに送っていないテキストもキルする。
C-c C-z
シェル、または、あればサブジョブを中断する (comint-stop-subjob)。 また、このコマンドは シェルバッファ内のまだシェルに送っていないテキストもキルする。
C-c C-\
シェル、または、あればサブジョブにシグナルQUITを送る (comint-quit-subjob)。 また、このコマンドは シェルバッファ内のまだシェルに送っていないテキストもキルする。
C-c C-o
直前のシェルコマンドからのひとまとまりの出力をキルする (comint-kill-output)。 シェルコマンドが大量の出力を出してしまったときなどに有効。
C-c C-r
C-M-l
直前のひとまとまりの出力がウィンドウの先頭にくるようにスクロールする。 また、ポイントもそこへ動かす(comint-show-output)。
C-c C-e
バッファの末尾がウィンドウの下端にくるようにスクロールする (comint-show-maximum-output)。
C-c C-f
シェルコマンド1つ分だけ先へ進めるが、現在行の末尾より先へはいかない (shell-forward-command)。 変数shell-command-regexpには、 シェルコマンドの終りの探し方(正規表現)を指定する。
C-c C-b
シェルコマンド1つ分だけ手前へ戻るが、現在行の先頭よりまえへはいかない (shell-backward-command)。
C-c C-l
バッファのシェルコマンド履歴を別のウィンドウに表示する (comint-dynamic-list-input-ring)。
M-x dirs
シェルにカレントディレクトリを問い合わせ、 Emacs側のものをシェルに合わせる。
M-x send-invisible RET text RET
textをエコーバックせずに読み取り、 入力としてシェルへ送る。 パスワードを問い合わせるようなプログラムを起動する シェルコマンドで役立つ。 かわりに、つぎのようにして、 Emacsにパスワードプロンプトを認識させてエコーバックを抑制する方法もある。
(add-hook 'comint-output-filter-functions
          'comint-watch-for-password-prompt)
M-x comint-continue-subjob
シェルプロセスを継続させる。 これはまちがってシェルプロセスを休止させてしまった場合に役立つ。 (56)
M-x comint-strip-ctrl-m
現在の一群のシェルの出力から復帰(コントロールM)文字を削除する。 このコマンドのもっとも便利な使い方の1つは、 サブシェルの出力を受け取ると自動的にこのコマンドが実行されるように 設定しておくことである。 そのためには、つぎのLisp式を評価すればよい。
(add-hook 'comint-output-filter-functions
          'comint-strip-ctrl-m)
M-x comint-truncate-buffer
このコマンドは、変数comint-buffer-maximum-sizeで指定した大きさに シェルバッファの行数を切り詰める。 サブシェルから出力を受け取るたびに これを自動的に行うにはつぎのようにする。
(add-hook 'comint-output-filter-functions
          'comint-truncate-buffer)

シェル(shell)モードでは段落コマンドにも修正を加えてあり、 シェルプロンプトでのみ新しい段落が始まるようになっています。 つまり、シェルバッファでは、 1つの段落はシェルコマンドとその出力から成るのです。

シェル(shell)モードは、対話的なサブプロセスと通信するための汎用モードである comintモードからの派生です。 ここまでにあげてきたコマンドの名前からもわかるように、 シェル(shell)モードの数多くの機能は、実は、comintモードからきています。 シェル(shell)モードに固有な特別な機能は、正規表現に基づくプロンプトの認識、 カレントディレクトリの追跡、および、少数のユーザーコマンドに限られます。

comintモードから派生したEmacsのほかの機能としては、 GUD(see section Emacs下でのデバッガの実行)と M-x run-lisp(see section 外部Lispの実行)があります。

M-x comint-runを使うと、 シェル(shell)モード固有の機能を持たないcomintモードで、 任意のプログラムをサブプロセスとして実行できます。

シェルコマンド履歴

シェルバッファでは、以前に使ったシェルコマンドを再実行する方法が3つあります。 1つめは、ミニバッファと同じキーを使う方法です。 すなわち、ミニバッファの場合と同様に、 ポイントはつねにバッファの末尾にある状態で、 以前に使ったシェルコマンドをバッファに挿入できます。 2つめは、バッファ内で以前のシェルコマンドの箇所に移動して、 それをそのまま再実行するかバッファの末尾にコピーします。 3つめは、`!'形式の履歴参照を使うことです。

シェル履歴リング

M-p
今のものより1つまえの古いシェルコマンドを持ってくる。
M-n
今のものより1つあとの古いシェルコマンドを持ってくる。
M-r regexp RET
M-s regexp RET
regexpに一致する古いシェルコマンドを後向きまたは前向きに探索する。
C-c C-x (Shell mode)
履歴からつぎのコマンドを持ってくる。

シェルバッファには、それまでに入力したシェルコマンドの履歴があります。 この履歴からシェルコマンドを再利用するには、編集コマンド、 M-pM-nM-rM-sを使います。 これらはミニバッファの履歴コマンドと同様に働きますが、 (普通はシェルに送るテキストを挿入する) シェルバッファの末尾にあるテキストに作用する点が異なります。

M-pは、1つまえのシェルコマンドをシェルバッファの末尾に持ってきます。 M-pを連続して使うと、次々にそれよりまえに実行したシェルコマンドを 持ってきて、それまでのシェルへの入力用テキストを置き換えます。 M-nも同様ですが、 次々にそれよりあとのシェルコマンドを持ってくる点が異なります。

履歴探索コマンドM-rM-sは、 正規表現を読み取り、それに一致するシェルコマンドを履歴の中から探します。 どのシェルコマンドを持ってくるかという点を除けば、 それらの働きはM-pM-nと同じです。 正規表現として空文字列を入力すると、直前に使用した正規表現を再使用します。

再使用したいシェルコマンドを探したならば、 RETを打ってそのシェルコマンドを再実行するか、 必要なら編集してから実行します。

以前に連続して実行した一連のシェルコマンドをまとめて再実行できると便利な ことがあります。 それには、まず、一連のシェルコマンドの最初のものを探して再実行します。 そうしてからC-c C-xと打ちます。 これは、直前に再実行したシェルコマンドの(履歴内で) つぎにあるシェルコマンドを持ってきます。 RETと打って再実行します。 このように、C-c C-x RETを繰り返し打てば一連のシェルコマンドを 再実行できます。

これらのコマンドは過去に実行したシェルコマンドを専用の履歴リストから 持ってくるのであって、シェルバッファからとってくるのではありません。 したがって、シェルバッファを編集したり、その大部分をキルしたとしても、 これらのコマンドが参照する履歴には影響しません。

いくつかのシェルは、コマンド履歴をファイルに保管して 以前のセッションの履歴を引き継げるようになっています。 Emacsは、自分の履歴リストを初期設定するために、 ユーザーが使うシェルの履歴ファイルを読み込みます。 ファイル名は、bashであれば`~/.bash_history'、 kshであれば`~/.sh_history'、 その他のシェルであれば`~/.history'です。

シェル履歴のコピー

C-c C-p
ポイントを1つまえのプロンプトへ移動する(comint-previous-prompt)。
C-c C-n
ポイントを1つあとのプロンプトへ移動する(comint-next-prompt)。
C-c RET
ポイントがあるところの入力コマンドをバッファの末尾にコピーする (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-autoexpandinputを設定します。

SPCをコマンドcomint-magic-spaceにバインドすれば、 SPCで履歴展開が行えるようになります。

シェルモードのオプション

変数comint-scroll-to-bottom-on-inputnil以外の場合には、 挿入およびヤンクコマンドは、 選択されているウィンドウを末尾までスクロールしてから挿入します。

comint-scroll-show-maximum-outputnil以外の場合、 出力に伴うスクロールでは、 最後の行ができるだけウィンドウのいちばん下にくるようにし、 なるべく多くの有用なテキストが見えるようにします (これは多くの端末のスクロール動作の真似)。 デフォルトは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-execonlynilにすると、 実行可能でないファイルも対象となります。

`pushd'の動作をカスタマイズできます。 引数が与えられないと`cd'と同様にふるまう (shell-pushd-tohome)、 数引数を指定するとpopではなく巡回する (shell-pushd-dextract)、 ディレクトリスタックにないディレクトリだけを ディレクトリスタックに加える (shell-pushd-dunique) を制御できます。 これらの値は当然、使っているシェルの動作と一致するように設定すべきです。

リモートホストのシェル

Emacsには、他のホストにログインしてEmacsバッファ経由で通信するコマンドが 2つあります。

M-x telnet RET hostname RET
ホストhostnameにtelnet経由で接続する。
M-x rlogin RET hostname RET
ホストhostnameにrlogin経由で接続する。

他のホストに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 section ファイル名)、 シェル(shell)モードと同様にカレントディレクトリを変更する シェルコマンドを監視します。

rloginバッファでディレクトリを追跡する方法は2つあります。 リモートディレクトリ名`/host:dir/'を使うか、 ローカルファイル名を使います。 (後者は『相手側のホスト』がローカルホストと ファイルシステムを共有している場合にのみ使える)。 コマンドrlogin-directory-tracking-modeを使って、 これらの2つのモードを相互に切り替えられます。 引数なしではリモートディレクトリ名を使う状態にし、 正の数を引数にするとローカル名を使う状態にします。 負の数を引数にするとディレクトリの追跡機能を止めます。

Emacsをサーバーとして使う

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つの方法があります。

プログラムによっては、エディタで編集するための作業ファイルを作成します。 ユーザーが作業ファイルを編集し終ると、 プログラムはそのファイルを読み込んでから消去します。 Emacsサーバーがあとで同じ名前のファイルを編集するように告げられた場合、 それはたまたまファイル名が一致しただけで、 内容はまえのファイルと何ら関係ないものと考えなければなりません。 このため、サーバーはファイルを編集し終ると作業ファイルのバッファを削除します。 変数server-temp-file-regexpを使って、 どのようなファイルがここでいう意味での作業ファイルであるか指定します。 この変数の値は、作業ファイルであるようなファイルの名前に 一致する正規表現である必要があります。

オプション`--no-wait'を指定してemacsclientを起動すると、 Emacs上でバッファを編集し終るのを待たずにただちに終了します。

印刷

印刷用のEmacsコマンドには、バッファ全体ないしその一部を、 ページヘッダ付き/なしのどちらででも出力する機能があります。 dired(see section その他のファイル操作)とdiary(see section 日誌項目の表示コマンド)の 印刷機能についても参照してください。

M-x print-buffer
カレントバッファの内容を、ファイル名とページ番号を 記したページヘッダ付きで印刷する。
M-x lpr-buffer
カレントバッファの内容を、ページヘッダなしで印刷する。
M-x print-region
print-bufferと同様だが、現在のリージョンのみを印刷する。
M-x lpr-region
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-switchesnilにすべきです。

Postscriptの印刷

これらのコマンドは、バッファの内容をPostscriptに変換し、 プリンタへ送るか他のEmacsバッファに入れます。

M-x ps-print-buffer
カレントバッファをPostscript形式で印刷する。
M-x ps-print-region
現在のリージョンをPostscript形式で印刷する。
M-x ps-print-buffer-with-faces
カレントバッファをPostscript形式で印刷するが、 テキストで用いているフェイスをPostscriptの機能で表示する。
M-x ps-print-region-with-faces
現在のリージョンをPostscript形式で印刷するが、 テキストで用いているフェイスも表示する。
M-x ps-spool-buffer
カレントバッファのテキストをPostscriptに変換する。
M-x ps-spool-region
現在のリージョンをPostscriptに変換する。 カレントバッファをPostscriptに変換するが、使われているフェイスも表示する。
M-x ps-spool-region-with-faces
現在のリージョンをPostscriptに変換するが、使われているフェイスも表示する。

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の印刷を制御する変数

すべてのPostscriptの印刷コマンドは、出力をどのように印刷するかを 変数ps-lpr-commandps-lpr-switchesで指定できます。 ps-lpr-commandには印刷のため実行するシェルコマンド、 ps-lpr-switchesにはそのシェルコマンドに指定するオプション、 ps-printer-nameにはプリンタを指定します。 始めの2つの変数を設定しなかった場合は、 lpr-commandlpr-switchesに基づいて初期値が設定されます。 ps-printer-namenilだとprinter-nameを使います。

変数ps-print-headerは、これらのコマンドが 各ページにヘッダをつけるかどうかを制御します。 nilだとヘッダを付けません。 ps-print-color-pnilにするとカラー処理を行いません。

変数ps-paper-typeは、印刷用紙サイズを指定します。 指定できる値は、a4a3a4smallb4b5executiveledgerlegalletterletter-smallstatementtabloidです。 デフォルトはletterです。 変数ps-page-dimensions-databaseを変更すれば 別の用紙サイズを定義できます。

変数ps-landscape-modeは用紙の向きを指定します。 デフォルトはnilで、『縦づかい』(ポートレート)です。 nil以外の値を指定すると『横づかい』(ランドスケープ)です。

変数ps-number-of-columnsは段数を指定します。 縦づかいでも横づかいでも有効で、デフォルトは1です。

変数ps-font-familyは、 通常のテキストの印刷に使うフォントファミリを指定します。 指定できる値は、CourierHelveticaNewCenturySchlbkPalatinoTimesです。 変数ps-font-sizeは、 通常のテキスト印刷に使うフォントのサイズを指定します。 デフォルトは8.5ポイント(57)です。

これらのコマンドには他にも多くのカスタマイズ可能な変数があり、 それらはLispファイル`ps-print.el'で定義されています。

テキストのソート

Emacsには、バッファ中のテキストをソートするコマンドがいくつかあります。 すべてはリージョン(ポイントとマークのあいだのテキスト)に働きます。 これらのコマンドは、リージョン中のテキストを 多数のソートレコードにわけ、 各レコードについてソートキーを識別し、 一連のレコードをソートキーによって定まる順序に並べ替えます。 レコードはキーのアルファベット(辞書)順にも、 また数値に基づく数値順にも並べられます。 アルファベット順の場合は、ASCII文字の順序に基づいて すべての大文字「A」〜「Z」は小文字「a」よりまえにきます。

各種のソートコマンドの違いは、テキストをソートレコードに分ける方法と、 各レコードのどの部分をソートキーに使うかです。 ほとんどのコマンドは各行をソートレコードとして扱いますが、 段落やページをソートレコードとして扱うコマンドもあります。 ほとんどのソートコマンドは各ソートレコード全体を それ自身のソートキーとして扱いますが、 ソートレコードの一部分だけをソートキーとして扱うコマンドもあります。

M-x sort-lines
リージョンを行の並びとみなし、行全体のテキストを比較して(昇順に)ソートする。 数引数を指定すると降順にソートする。
M-x sort-paragraphs
リージョンを段落の並びとみなし、(先頭の空行を除く) 段落全体のテキストを比較して(昇順に)ソートする。 数引数を指定すると降順にソートする。
M-x sort-pages
リージョンをページの並びとみなし、(先頭の空行を除く) ページ全体のテキストを比較して(昇順に)ソートする。 数引数を指定すると降順にソートする。
M-x sort-fields
リージョンを行の並びとみなし、 行の1つの欄を比較して(昇順に)ソートする。 欄は白文字で区切られる。 つまり、行の始めにある白文字でない文字の並びが第1欄、 そのつぎの空白でない文字の並びが第2欄、というようになる。 どの欄をキーとしてソートするかは、 1を指定すれば第1欄、というように数引数で指定する。 負の値を指定したときは左からでなく右から欄を数える。 つまり、-1は最後の欄でソートする。 複数の行において欄の値が同一の場合、 バッファ上のもとの順序が保存される。
M-x sort-numeric-fields
M-x sort-fieldsと同様だが、 指定した欄を行ごとに数値に変換し、その数値同士を比較する。 `10'はアルファベット順では`2'よりまえにくるが、 数値として見れば`2'よりあとにくる。
M-x sort-columns
M-x sort-fieldsと同様だが、行の比較に使うテキストは 固定文字位置からとる。 以下の説明を参照のこと。
M-x reverse-region
リージョン内の行の順番を逆にする。 欄や文字位置でソートするコマンドは降順にはソートできないので、 昇順にソートしたあと降順に並べ替えるのに役立つ。

たとえば、バッファにつぎのような内容が入っていたとします。

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-casenil以外の場合、 ソートコマンドのほとんどは比較に際して大文字小文字を区別しません。

ナロイング

ナロイング(narrowing)とは、バッファのある部分だけに焦点を当て、 残りの部分を一時的に参照できなくすることです。 扱える部分のことを参照可能範囲と呼びます。 ナロイングを取り消して、バッファ全体を参照できるように戻すことを ワイドニング(widening)と呼びます。

ナロイングすると、他の部分に煩わされることなく、 1つのサブルーチンや段落などに集中できます。 また、置換コマンドやキーボードマクロの適用範囲を制限するのにも利用できます。

C-x n n
ポイントとマークのあいだにナロイングする(narrow-to-region)。
C-x n w
再度バッファ全体を参照可能にする(widen)。
C-x n p
現在のページにナロイングする(narrow-to-page)。
C-x n d
現在の関数定義にナロイングする(narrow-to-defun)。

バッファの一部分へナロイングすると、その部分だけしかないように見えます。 残りの部分は見えませんし、そこへポイントを移動することもできません (移動コマンドは参照可能範囲から外へ出られない)し、 見えない部分はどのようにしても変更できません。 しかし、その部分がなくなったわけではないので、 ファイルに保存すれば参照できないテキストも保存されます。 ナロイングしているあいだは、モード行に`Narrow'と表示されます。

主要なナロイングコマンドはC-x n nnarrow-to-region)です。 現在のリージョンだけが参照可能で、その前後のテキストは参照できないように カレントバッファに制限を課します。 ポイントとマークは変化しません。

別のやり方として、C-x n pnarrow-to-page)は現在のページ だけが見えるようにナロイングします。 ページの定義については、See section ページC-x n dnarrow-to-defun)はポイントを含む関数定義の範囲に ナロイングします(see section 関数定義(defun))。

ナロイングを取り消すには、C-x n wでワイドニングします。 これによってバッファ中の全テキストが再度参照可能になります。

バッファ中のどの部分にナロイングしているかは、 コマンドC-x =で調べることができます。 See section カーソル位置の情報

ナロイングは、それについて知らないユーザーを簡単に混乱させますので、 narrow-to-regionは、通常、使用禁止コマンドになっています。 このコマンドを使おうとすると、Emacsは確認を求めてきて、 コマンドを使えるようにするかどうか問い合わせてきます。 コマンドを利用可能にすると、それ以後は確認は必要なくなります。 See section 使用禁止コマンド

2段組み編集

2段組み(two-column)モードは、左右の段に分けたテキストを編集するのに便利です。 このモードでは、左右に並んだ2つのウィンドウを使用し、 それぞれに別のバッファを表示します。

2段組み(two-column)モードに入るには、3つの方法があります。

F2 2 または C-x 6 2
カレントバッファを左側に、カレントバッファの名前に基づいた名前の バッファを右側にして2段組み(two-column)モードに入る (2C-two-columns)。 右側のバッファがまだ存在しなければ空のバッファで始まり、 カレントバッファの内容は変化しない。 このコマンドはカレントバッファが空か、または1段目の内容だけを持っていて、 これから2段目を作成しようとするときに使う。
F2 s または C-x 6 s
2段組みテキストを含んでいるカレントバッファの内容を2つのバッファに分割し、 それらを左右に並べて表示する(2C-split)。 カレントバッファは左側のバッファになるが、 右側の段の内容は右側のバッファに移される。 分割位置はポイントのある文字位置で指定する。 現在行からバッファの末尾を分割する。 このコマンドはバッファにすでに2段組みのテキストが入っていて、 一時的に左右の段を分けて編集したいときに用いる。
F2 b buffer RET
C-x 6 b buffer RET
カレントバッファを左側のバッファ、bufferを右側のバッファとして 2段組み(two-column)モードに入る(2C-associate-buffer)。

F2 sC-x 6 sは、 各行を2つの段に分ける文字列である「段区切り文字列」を探します。 段区切り文字列の文字数は、F2 sへの数引数で指定できます。 ポイントの直前のその文字数分の文字列が段区切り文字列になります。 デフォルトでは幅は1ですから、ポイントの直前の文字が段区切り文字列になります。

各行の正しい位置に段区切り文字列があれば、 F2 sは各行の段区切り文字列のうしろの文字列を右側のバッファに移し、 段区切り文字列を削除します。 段区切り文字列が正しい位置にない行は分割されずに左側のバッファに残り、 対応する右側のバッファの内容は空行になります。 (これは、『2段組み(two-column)モードで両側の段にまたがった行』の書き方。 つまり、左側のバッファにそのような行を書き、 右側のバッファは空行にしておく)。

コマンドC-x 6 RETF2 RET2C-newline)は、 左右の2つのバッファの対応する位置に改行を挿入します。 バッファを分割して編集しているときに2段組みテキストに 新しい行を追加するにはこれがもっとも簡単な方法です。

左右のバッファを望むように編集し終えたら、 それらをF2 1またはC-x 6 12C-merge)で 再度併合します。 右側バッファの内容を左側バッファに第2段目としてコピーします。 再度2段組み編集に戻るには、F2 sを使います。

2つのバッファ間の関連を解消するには、 F2 dまたはC-x 6 d2C-dissociate)を使います。 コマンドを入力したときにカレントバッファでない側のバッファが空であれば、 そのバッファは削除します。

バイナリファイルの編集

バイナリファイルを編集するための特別なメジャーモード、 hexlモードがあります。 このモードを使うには、ファイルを訪問するC-x C-fのかわりに M-x hexl-find-fileを使います。 このコマンドはファイルの内容を16進数表現に変換し、 変換したものを編集するようにします。 ファイルを保存すると自動的にバイナリに戻されます。

M-x hexl-modeを使えば、既存のバッファを16進数表現に変換できます。 普通にファイルを訪問してみたら、実はバイナリファイルだとわかった場合に便利です。

hexlモードでは通常のテキスト文字は上書きします。 これはファイル中のデータの配置をまちがって壊してしまう危険を減らすためです。 特別な挿入コマンドがあります。 以下は、hexlモードで使えるコマンドの一覧です。

C-M-d
10数進で入力したコードのバイトを挿入する。
C-M-o
8数進で入力したコードのバイトを挿入する。
C-M-x
16数進で入力したコードのバイトを挿入する。
C-x [
1kバイト単位の『ページ』の先頭へ移動する。
C-x ]
1kバイト単位の『ページ』の末尾へ移動する。
M-g
16進数で指定したアドレス位置へ移動する。
M-j
10進数で指定したアドレス位置へ移動する。
C-c C-c
hexlモードを抜け、 hexl-mode実行前のこのバッファのメジャーモードに戻る。

Emacsセッションの保存

デスクトップ(desktop)ライブラリを使うと、 セッションからセッションへEmacsの状態を保存できます。 状態を保存するというのは、 以前のEmacsセッションで使っていたのと同じバッファ群、メジャーモード、 バッファ内の位置の状態でEmacsが始まるという意味です。

デスクトップ機能を使うには、カスタマイズバッファ (see section 簡便なカスタマイズ方法)を使って desktop-enablenil以外の値を設定するか、 個人の`.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 section リモートファイル

再帰編集レベル

再帰編集とは、あるEmacsコマンドの実行途中で 任意のEmacsコマンドを使って編集を行う状況をいいます。 たとえば、query-replaceの途中でC-rを打つと、 再帰編集に入りカレントバッファを自由に変更できます。 再帰編集から抜けると、query-replaceの続きに戻ります。

再帰編集から脱出するとは、 実行途中のコマンドに戻ってその続きを行うことを意味します。 脱出のためのコマンドはC-M-cexit-recursive-edit)です。

再帰編集をアボートすることもできます。 これは脱出と似ていますが、実行途中だったコマンドも一緒に中断します。 アボートするには、 C-]abort-recursive-edit)を使います。 See section 中断とアボート

再帰編集中は、モード行のメジャー/マイナモード名を 囲む丸括弧の外側に中括弧`[...]'が表示されます。 各ウィンドウのモード行すべてにこのように表示されます。 というのは、特定のウィンドウやバッファではなくEmacs全体が再帰編集に 入っているからです。

再帰編集中にさらに再帰編集に入ることもできます。 たとえば、query-replaceの途中でC-rを打ってから デバッガを起動するコマンドを打ったとします。 すると、C-rによる再帰編集の中でさらにデバッガのための再帰編集に 入ることになります。 モード行には、現在の再帰編集レベルの数だけ中括弧の対が表示されます。

内側の再帰編集を(たとえばデバッガのコマンドcで)脱出すると、 1つ上のレベルでのコマンドが再開されます。 そのコマンドが終わったところでC-M-cを使うと そのレベルの再帰編集を脱出する、 というようにして再帰編集を終わらせていくことができます。 脱出はつねにもっとも内側のレベルに対して起こります。 また、アボートも1つのレベルの再帰編集から脱出し、 1つまえの再帰編集のコマンドレベルに戻ります。 必要ならそこでつぎの再帰編集レベルをアボートする、 というように続けることができます。

あるいは、 コマンドM-x top-levelですべてのレベルの再帰編集をアボートし、 ただちにトップレベルのコマンド入力に戻ることができます。

再帰編集の中で編集しているテキストは トップレベルで編集しているテキストと同じであるとは限りません。 再帰編集の目的によって変わってきます。 再帰編集を起動するコマンドがまず別のバッファに切り替えるものなら、 そのバッファを再帰的に編集することになるでしょう。 いずれにせよ、再帰編集の内側でも (バッファを切り替えるキーが再定義されていない限り) 通常どおりバッファを切り替えることができます。 残りの編集作業をすべて再帰編集の内側でやってしまい、 別のファイルを訪問したりもできます。 しかしそのようなことをすると、 ときどき(スタックオーバーフローなどの)痛い目に合う可能性があります。 ですから、再帰編集が不要になったら忘れずに脱出かアボートしてください。

一般に、GNU Emacsでは再帰編集レベルを最小限に抑えるように努めています。 というのは、再帰編集では特定の順、つまり、 最内側レベルからトップレベルに向かう順で戻るように強いられるからです。 このため、別の作業は別のバッファでするようにして、 ユーザーがそれらの間を自由に行き来できるようにしています。 たとえば、あるコマンドは新しいメジャーモードに切り替えますが、 もとのモードに戻るコマンドを用意しておきます。 このようにしたほうが、やりかけの作業に戻る順番を自由に選べ、 柔軟性を提供できます。

エミュレーション

GNU Emacsは、他のほとんどのエディタの(程度の差はありますが) エミュレート(真似を)するようにプログラムできます。 標準の機能では、以下のものをエミュレートできます。

EDT(DECのVMSエディタ)
M-x edt-emulation-onでEDTエミュレーションに入る。 M-x edt-emulation-offで通常のEmacsのバインディングに戻る。 EDTエミュレーションコマンドの大部分はキーパッドのキーであり、 大部分のEmacsのキーバインディングはそのまま使える。 EDTエミュレーションのバインディング変更はグローバルキーマップに対して行われ、 EDTエミュレーションの状態でバッファやメジャーモードを切り替えても問題ない。
vi (バークレー エディタ)
viperは最新のviエミュレータである。 viperでは複数レベルのエミュレーションを実装している。 レベル1がもっともviに近く、レベル5はviといくらか違うところもあるが、 そのかわりEmacsの機能も活かせるようになっている。 viperを起動するには、M-x viper-modeと打つ。 すると、使い方のガイドを表示し、 どのレベルのエミュレーションにするかを尋ねてくる。 See Info file `viper', node `Top'。
vi (もう1つのエミュレータ)
M-x vi-modeはそれまでのメジャーモードにかわって viメジャーモードに入る。 viの『入力』モードに入るコマンドはすべて、 それまでのメジャーモードに戻る動作になっている。 つまり、viの『入力』モードとして普通のEmacsが使えるのである。 viエミュレーションはメジャーモードとして動くので、 エミュレーション中にバッファを切り替えることはできない。 バッファを切り替えたければ、まず通常のEmacsに戻る。 viエミュレーションを多用するつもりなら、 vi-modeコマンドにキーをバインドしたほうがよいだろう。
vi (また別のエミュレータ)
M-x vip-modeは、M-x vi-modeよりもっと viに酷似しているといわれる別のviエミュレータを起動する。 このエミュレータでは『入力』モードも通常のEmacsとは変わっていて、 ESCでviコマンドモードに戻る。 viコマンドモードのエミュレーションから通常のEmacsに戻るにはC-zと打つ。 このエミュレータはメジャーモードとして動くのではないので、 エミュレータを動かしたままさまざまな方法でバッファを切り替えることができる。 vi-modeのようにコマンドvi-modeで 入力モードを終了するのではないので、 vip-modeにキーを割り当てる必要はない。 より詳しくはSee Info file `vip', node `Top'。

まぜこぜ新聞(Dissociated Press)

M-x dissociated-pressはテキストを、単語単位、または、文字単位で 混ぜ合わせるコマンドです。 普通の英語をバッファに入れた状態でこれを実行すると、 きわめておもしろい結果が生成されます。 入力はカレントバッファから取り、 出力は`*Dissociation*'というバッファに書き込みます (およそ2、3行生成するごとにバッファが再表示されるので、 生成内容を順次読めます)。

M-x dissociated-pressは定期的にもっと出力を続けるかどうか聞いてきます。 nと答えると生成をやめます。 また、C-gを打てばいつでも止められます。 出力はバッファ`*Dissociation*'に残っていますから、 必要ならどこへでもコピーできます。

M-x dissociated-pressはバッファ中のある箇所からランダムに 別の箇所にジャンプすることを繰り返していきます。 ただのゴミではなくおもしろい出力が得られるように、 ある一連の単語列からつぎの一連の単語列に移る際に、 それらのあいだに一定の重複があるようにします。 つまり、たとえばpresidentと出力したところで別の場所にジャンプすることに 決めたら、最後にあったentと同じ文字列のある単語、 たとえばpentagonのところに飛んでそこから続けるので、 結果としてpregidentagon (58) というのが生成されるわけです。 元テキストが長いとたいへんおもしろい結果を得られます。

M-x dissociated-pressに正の数引数を渡すと 文字単位で動作し、その数値は重複する文字数を指定します。 また、負の数引数を渡すと単語単位で動作し、その数値(の絶対値)で重複する 単語数を指定します。 引数を指定しないと「2」を指定したのと同じになります。 繰り返しますが、出力はつねにバッファ`*Dissociation*'に現れます。 もとのバッファは変更されません。

M-x dissociated-pressは、入力テキストから頻度表を作って マルコフ連鎖を適用したのに近い結果をもたらしますが、 それ自体はきわめてオリジナルな発明です。 というのは、マルコフ連鎖では単に乱数に基づいて文字や語を選ぶだけなのに対し、 このコマンドでは乱数に基づいて連続した文字や語をコピーしてくるからです。 このため、より高速な実行が可能ですし、読んでおもしろい結果が得られます。

M-x dissociated-pressの使いすぎは仕事に差し支え、 場合によっては重大な障碍となりますから注意しましょう。 また、ユーザーに受け入れてもらうためにも、 マニュアルにこのコマンドの出力を利用するのはやめたほうがよいです。 でも、せいぜい楽しんで、よかったらバグの提案もよろしく。 (59)

その他の娯楽

退屈なときは、M-x hanoiを試してください。 ひどく退屈なら、数引数を指定してください。 ものすごく、ひどく退屈なら、「9」を指定するとよいでしょう。 まあやってみてください。

もう少し積極的に何かしたいなら、M-x gomokuを試してください。 これは五目並べのプログラムです。

M-x blackboxM-x mpuzは2種類のパズルです。 blackboxは箱の中の物の位置を当てるゲームです。 mpuzは掛け算の覆面算で、英字に対応している数字を当てるゲームです。 英字を打ってからその英字に対応していると思う数字を打ち込みます。

M-x dunnetはアドベンチャー風の探検ゲームで、 大きなパズルだと思えばよいでしょう。

いらいらするときは、有名なElizaプログラムを試してみてください。 M-x doctorと打つだけです。 1つの入力の終りにはRETを2回打ちます。

奇妙な感じがするときは、M-x yowと打ってみてください。


Go to the first, previous, next, last section, table of contents.