本章では他の章に入れるのが適当でなかったいくつかの話題を取り上げます。 具体的には、ネットニュースを読む、 シェルコマンドやシェルサブプロセスを動かす、 エディタをサブプロセスとして起動するプログラム間で1つの Emacsプロセスを共同利用する、印刷する、テキストをソートする、 バッファの一部だけを表示するように制限する、 2段組みファイルやバイナリファイルを編集する、 Emacsセッションの状態を保存してあとでその状態に復帰する、 他のエディタのエミュレーション、いろいろなお遊びです。
gnusは主にネットニュースを読んだり投稿するためのEmacsパッケージです。 電子メイル、リモートディレクトリ、ダイジェストなどの ネットニュース以外のメッセージを読んだりそれらに応答するのにも使えます。
以下ではgnusについて紹介し、いくつかの基本的な機能について説明します。 gnusについて詳しく知るには、 M-x infoと打ってから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のさまざまなバッファのどんなキーの意味も、 等価ではないにせよ、だいたい同じです。 以下は、グループバッファとサマリバッファのコマンドです。
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 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は、シェルコマンド、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 section フック)。
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 section シェル履歴の参照)や
環境変数名も補完できる。
変数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
)。
(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 section Emacs下でのデバッガの実行)と M-x run-lisp(see section 外部Lispの実行)があります。
M-x comint-runを使うと、 シェル(shell)モード固有の機能を持たないcomintモードで、 任意のプログラムをサブプロセスとして実行できます。
シェルバッファでは、以前に使ったシェルコマンドを再実行する方法が3つあります。 1つめは、ミニバッファと同じキーを使う方法です。 すなわち、ミニバッファの場合と同様に、 ポイントはつねにバッファの末尾にある状態で、 以前に使ったシェルコマンドをバッファに挿入できます。 2つめは、バッファ内で以前のシェルコマンドの箇所に移動して、 それをそのまま再実行するかバッファの末尾にコピーします。 3つめは、`!'形式の履歴参照を使うことです。
シェルバッファには、それまでに入力したシェルコマンドの履歴があります。 この履歴からシェルコマンドを再利用するには、編集コマンド、 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 section ファイル名)、 シェル(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 section その他のファイル操作)とdiary(see section 日誌項目の表示コマンド)の 印刷機能についても参照してください。
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ポイント(57)です。
これらのコマンドには他にも多くのカスタマイズ可能な変数があり、 それらはLispファイル`ps-print.el'で定義されています。
Emacsには、バッファ中のテキストをソートするコマンドがいくつかあります。 すべてはリージョン(ポイントとマークのあいだのテキスト)に働きます。 これらのコマンドは、リージョン中のテキストを 多数のソートレコードにわけ、 各レコードについてソートキーを識別し、 一連のレコードをソートキーによって定まる順序に並べ替えます。 レコードはキーのアルファベット(辞書)順にも、 また数値に基づく数値順にも並べられます。 アルファベット順の場合は、ASCII文字の順序に基づいて すべての大文字「A」〜「Z」は小文字「a」よりまえにきます。
各種のソートコマンドの違いは、テキストをソートレコードに分ける方法と、 各レコードのどの部分をソートキーに使うかです。 ほとんどのコマンドは各行をソートレコードとして扱いますが、 段落やページをソートレコードとして扱うコマンドもあります。 ほとんどのソートコマンドは各ソートレコード全体を それ自身のソートキーとして扱いますが、 ソートレコードの一部分だけをソートキーとして扱うコマンドもあります。
たとえば、バッファにつぎのような内容が入っていたとします。
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 section ページ。
C-x n d(narrow-to-defun
)はポイントを含む関数定義の範囲に
ナロイングします(see section 関数定義(defun))。
ナロイングを取り消すには、C-x n wでワイドニングします。 これによってバッファ中の全テキストが再度参照可能になります。
バッファ中のどの部分にナロイングしているかは、 コマンドC-x =で調べることができます。 See section カーソル位置の情報。
ナロイングは、それについて知らないユーザーを簡単に混乱させますので、
narrow-to-region
は、通常、使用禁止コマンドになっています。
このコマンドを使おうとすると、Emacsは確認を求めてきて、
コマンドを使えるようにするかどうか問い合わせてきます。
コマンドを利用可能にすると、それ以後は確認は必要なくなります。
See section 使用禁止コマンド。
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 section 簡便なカスタマイズ方法)を使って
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 section リモートファイル。
再帰編集とは、あるEmacsコマンドの実行途中で
任意のEmacsコマンドを使って編集を行う状況をいいます。
たとえば、query-replace
の途中でC-rを打つと、
再帰編集に入りカレントバッファを自由に変更できます。
再帰編集から抜けると、query-replace
の続きに戻ります。
再帰編集から脱出するとは、
実行途中のコマンドに戻ってその続きを行うことを意味します。
脱出のためのコマンドはC-M-c(exit-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は、他のほとんどのエディタの(程度の差はありますが) エミュレート(真似を)するようにプログラムできます。 標準の機能では、以下のものをエミュレートできます。
vi-mode
コマンドにキーをバインドしたほうがよいだろう。
vi-mode
のようにコマンドvi-mode
で
入力モードを終了するのではないので、
vip-mode
にキーを割り当てる必要はない。
より詳しくはSee Info file `vip', node `Top'。
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 blackboxとM-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.