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

27. 暦と日誌

Emacsには、過去や将来の予定を記録する日誌の機能を持つ カレンダー機能があります。 カレンダーに入るにはM-x calendarと打ちます。 すると、今月を中央月として3か月分のカレンダーが表示され、 ポイントは今日の日付に置かれます。 C-u M-x calendarのように数引数を指定すると、 3か月分のカレンダーの中央に表示する月と年を聞いてきます。 カレンダーは専用のバッファを使い、 そのメジャーモードはカレンダー(calendar)モードです。

カレンダー内でMouse-2をクリックすると、 その日付で使用できる機能のメニューが表示されます。 C-Mouse-3をクリックすると、 特定の日付に関わらずに使える機能のメニューが表示されます。 カレンダーから抜けるにはqと打ちます。 カレンダーと日誌のカスタマイズに関しては、 See (elisp)Calendar section `カレンダーと日誌のカスタマイズ' in Emacs Lisp リファレンスマニュアル


27.1 カレンダー内の移動

カレンダー(calendar)モードでは、 日、週、月、年といった論理的単位で移動します。 始めに表示された3か月の外に移動すると、 カレンダーは自動的に『スクロール』して 指定された日付の箇所が表示されるようにします。 ある日付へ移動すると、祝祭日の名称や日誌記録を見たり、 その日付を別の暦に変換したりできます。 カレンダーを単にスクロールすれば、大きな時間単位での移動に便利です。


27.1.1 日/週/月/年単位の移動

カレンダー内を移動するコマンドはテキスト内を移動するコマンドに対比できます。 日、週、月、年を単位として前後に移動できます。

C-f

1日後にポイントを進める(calendar-forward-day)。

C-b

1日前にポイントを戻す(calendar-backward-day)。

C-n

1週間後にポイントを進める(calendar-forward-week)。

C-p

1週間前にポイントを戻す(calendar-backward-week)。

M-}

1か月後にポイントを進める(calendar-forward-month)。

M-{

1か月前にポイントを戻す(calendar-backward-month)。

C-x ]

1年後にポイントを進める(calendar-forward-year)。

C-x [

1年前にポイントを戻す(calendar-backward-year)。

日や週を単位とした移動は、Emacsの通常の文字単位や行単位の移動の類推です。 C-nは通常はつぎの行の同じ桁に移動しますが、 カレンダー(calendar)モードでは つぎの週の同じ曜日に移動します。 また、C-pはまえの週の同じ曜日に移動します。

矢印キーは他のモードと同様に、それぞれ、 C-fC-bC-nC-pに等価です。

月単位や年単位の移動コマンドは週単位の移動と同じように働きますが、 より大きな単位での移動です。 月単位の移動コマンドM-}M-{は、それぞれ、 翌月、前月に移動します。 年単位の移動コマンドC-x ]C-x [は、 それぞれ、1年後、1年前に移動します。

これらのコマンドを簡単に覚えるには、それぞれ、 月と年を段落とページに対比させることです。 しかし、コマンド自体は同じではありません。 Emacsの通常の段落移動コマンドは段落の先頭か末尾に移動しますが、 月単位や年単位の移動コマンドは1か月分や1年分で移動しますから、 月や年の区切りを普通は飛び越します。

これらのコマンドはすべて数引数を反復回数として扱います。 簡単のために、カレンダー(calendar)モードでは Meta修飾なしでも数字とマイナス記号で数引数を指定できます。 たとえば、100 C-fは100日後の日付にポイントを進めます。


27.1.2 週/月/年の始めと終り

週(または、月、年)というのは、単に1日1日が集まったものではありません。 週(月、年)は特定の日で始まると考えます。 そこで、カレンダー(calendar)モードには、 週、月、年の始めや終りに移動するコマンドがあります。

C-a

週の始めにポイントを移動する(calendar-beginning-of-week)。

C-e

週の終りにポイントを移動する(calendar-end-of-week)。

M-a

月の始めにポイントを移動する(calendar-beginning-of-month)。

M-e

月の終りにポイントを移動する(calendar-end-of-month)。

M-<

年の始めにポイントを移動する(calendar-beginning-of-year)。

M->

年の終りにポイントを移動する(calendar-end-of-year)。

これらのコマンドは数引数を反復回数と扱い、 何週、何か月、何年だけ前後に移動するのかを指定します。

デフォルトでは、週は日曜から始まります。 月曜から始めるには、変数calendar-week-start-dayに1を設定します。 (44)


27.1.3 特定の日付

カレンダー(calendar)モードには、 さまざまな方法で指定した特定の日付へ移動するコマンドがあります。

g d

指定した日付へポイントを移動する(calendar-goto-date)。

o

指定した月をカレンダーの中央月にする(calendar-other-month)。

.

ポイントを今日の日付に移動する(calendar-goto-today)。

g dcalendar-goto-date)は、 年、月、日を読み取ってその日付に移動します。 カレンダーには西暦紀元がすべて含まれているため、 西暦年を略さずに打つ必要があります。 つまり、`90'ではなく`1990'です。

ocalendar-other-month)は、 月と年を読み取って、その月を中央月として3か月分のカレンダーを表示します。

.calendar-goto-today)で、今日の日付に戻ることができます。


27.2 カレンダーのスクロール

見えている範囲を越えて移動するとカレンダーは自動的にスクロールします。 手動でスクロールすることもできます。 カレンダーを表示しているウィンドウでは、 長い長い紙に月を印刷したものの一部が見えているのだと考えてください。 カレンダーをスクロールするとは、 新しい月が見えるようにこの紙を動かすことに相当します。

C-x <

カレンダーを1か月後にスクロールする(scroll-calendar-left)。

C-x >

カレンダーを1か月前にスクロールする(scroll-calendar-right)。

C-v
NEXT

カレンダーを3か月後にスクロールする (scroll-calendar-left-three-months)。

M-v
PRIOR

カレンダーを3か月前にスクロールする (scroll-calendar-right-three-months)。

カレンダーをスクロールするもっとも基本的なコマンドは、 一度に1か月分スクロールします。 つまり、コマンドの実行前後の表示を比べると、2か月分重複しています。 C-x <はカレンダーを1か月分左にスクロールします。 つまり、時間的に1か月後を表示します。 C-x >コマンドはカレンダーを右にスクロールし、 時間的に1か月前に戻します。

コマンドC-vM-vは、 カレンダーを『1画面分』、つまり、3か月分スクロールします。 これは、通常のモードでのこれらのコマンドと意味的に同じになっています。 C-vは将来の日付を見えるようにし、 M-vは過去の日付を見えるようにします。 これらのコマンドは数引数を反復回数として扱います。 たとえば、C-uは後続のコマンドを4回反復するので、 C-u C-vと打てば1年分先へカレンダーをスクロールし、 C-u M-vと打てば1年分前へカレンダーをスクロールします。

ファンクションキーNEXTPRIORは、 他のモードと同様に、それぞれ、C-vM-vに等価です。


27.3 日数計算

M-=

カレントリージョン内の日数を表示する (calendar-count-days-region)。

リージョン内の日数を調べるには、 M-=calendar-count-days-region)と打ちます。 このコマンドで表示される日数は、 マークとポイントで指定した両日を含んだ日数です。


27.4 その他のカレンダーコマンド

p d

通年日(1年のうちの何日目の日か)を表示する (calendar-print-day-of-year)。

C-c C-l

カレンダーを表示しているウィンドウを再表示する(redraw-calendar)。

SPC

別のウィンドウをスクロールする (scroll-other-window)。

q

カレンダーから抜ける(exit-calendar)。

年始から数えた日数、あるいは、1年の残り日数を表示するには、 p dcalendar-print-day-of-year)コマンドを打ちます。 すると、上の2つの日数をエコー領域に表示します。 年始からの日数には指定した日が含まれます。 また、残りの日数には指定した日は含まれません。

カレンダーのウィンドウのテキストが壊れた場合には、 C-c C-lredraw-calendar)と打って再表示させます。 (カレンダー(calendar)モード以外の編集用コマンドを使った場合に限り、 表示がおかしくなる。)

カレンダー(calendar)モードでは、 SPCscroll-other-window)を使って 別のウィンドウをスクロールできます。 このコマンドは、 別のウィンドウに祝祭日や日誌記録の一覧を表示しているときに便利です。

カレンダーから抜けるには、 qexit-calendar)と打ちます。 このコマンドはカレンダーに関係したすべてのバッファを閉じ、 別のバッファを選択します。 (カレンダー関連のウィンドウ専用のフレームであった場合には、 カレンダーを終了するとそのフレームをアイコン化する。)


27.5 LaTeXカレンダー

カレンダーLaTeXコマンドは、 カレンダーを印刷するLaTeXコードのバッファに作成します。 使用するコマンドに依存して、ポイント位置の日、週、月、年の いずれかを含んだカレンダーを印刷できます。

t m

1か月分のカレンダーを生成する(cal-tex-cursor-month)。

t M

横づかいで1か月分のカレンダーを生成する (cal-tex-cursor-month-landscape)。

t d

1日分のカレンダーを生成する(cal-tex-cursor-day)。

t w 1

1週間分の1ページのカレンダーを生成する(cal-tex-cursor-week)。

t w 2

1週間分の2ページのカレンダーを生成する(cal-tex-cursor-week2)。

t w 3

1週間分のISOスタイルのカレンダーを生成する(cal-tex-cursor-week-iso)。

t w 4

月曜から始まる1週間分のカレンダーを生成する (cal-tex-cursor-week-monday)。

t f w

ファイロファックス(システム手帳)スタイルの見開き2週間分のカレンダーを生成する (cal-tex-cursor-filofax-2week)。

t f W

ファイロファックス(システム手帳)スタイルの見開き1週間分のカレンダーを生成する (cal-tex-cursor-filofax-week)。

t y

1年分のカレンダーを生成する(cal-tex-cursor-year)。

t Y

横づかいで1年分のカレンダーを生成する (cal-tex-cursor-year-landscape)。

t f y

ファイロファックス(システム手帳)スタイルの1年分のカレンダーを生成する (cal-tex-cursor-filofax-year)。

これらのコマンドのいくつかは、横づかい(つまり、『ランドスケープ』)の カレンダーを印刷し、横長になります。 いくつかのコマンドでは、ファイロファックス(システム手帳) サイズ(3.75インチ×6.75インチ、約95.25mm×171.45mm)を使います。 これらのコマンドはすべて、印刷する日数、週数、月数、年数を 数引数で指定できます(つねに選択した日から始まる)。

変数cal-tex-holidaysnil以外(デフォルト)ならば、 印刷されるカレンダーにはcalendar-holidaysの祝祭日が表示されます。 変数cal-tex-diarynil以外 (デフォルトはnil)ならば、 日誌記録も一緒に印刷されます(週間および月間カレンダーの場合だけ)。


27.6 祝祭日

Emacsのカレンダーはすべての祝祭日を把握しており、 それらをカレンダーに表示できます。

h

選択された日付の祝祭日を表示する(calendar-cursor-holidays)。

Mouse-2 Holidays

マウスでクリックした日付の祝祭日を表示する。

x

カレンダーウィンドウの祝祭日に印を付ける (mark-calendar-holidays)。

u

カレンダーウィンドウの印を消す(calendar-unmark)。

a

表示中の3か月分のカレンダーの すべての祝祭日を別のウィンドウに表示する (list-calendar-holidays)。

M-x holidays

今日を中心とした3か月間のすべての祝祭日を別のウィンドウに表示する。

M-x list-holidays

指定した範囲の年の祝祭日を別のウィンドウに表示する。

カレンダー上のある日付が祝祭日かどうかを知るには、 その日付にポイントを動かしhコマンドを使います。 あるいは、その日付をMouse-2でクリックし、 立ち上がったメニューからHolidaysを選択します。 いずれの方法でも、その日付に関する祝祭日情報が、 エコー領域に収まればエコー領域に、あるいは、別のウィンドウに表示されます。

カレンダーに表示されている期間内にどれだけの祝祭日があるかを知るには、 xコマンドを使います。 祝祭日である日を異なるフェイスで(複数のフェイスを使えなければ、 日付のあとに`*'を付けて)表示します。 このコマンドは、画面に見えている期間だけでなく、 スクロールすると見えてくる期間にも適用されます。 印を消してもとの状態に戻るにはuコマンドを使いますが、 日誌の印も同時に消えます。 (see section 日誌)。

より詳しい情報を得るには、aコマンドを使います。 これは、現在の3か月間に含まれるすべての祝祭日の一覧を別のバッファに表示します。 カレンダーのウィンドウでSPCを使うと、 その一覧をスクロールできます。

コマンドM-x holidaysは、今月を中央月として前後1か月に含まれる 祝祭日の一覧を表示します。 カレンダーウィンドウがなくてもこのコマンドを使えます。 別の月を中央月とした祝祭日の一覧が必要な場合は、 C-u M-x holidaysを使います。 (中央月の)月と年を聞いてきます。

Emacsが知っている祝祭日は、 アメリカ合衆国の祝祭日、キリスト教の祝祭日、 ユダヤ教の祝祭日、イスラム教の祝祭日、夏至、冬至、春分、秋分です。

コマンドM-x list-holidaysは、 指定した数年間の祝祭日の一覧を表示します。 始めの年と終りの年を聞いてくるので、 すべての祝祭日、ある特定の種類の祝祭日を選べます。 カレンダーウィンドウがなくてもこのコマンドを使えます。

Emacsが祝祭日を決定するために用いる暦は、 歴史的な事実に基づくものではなく、 現在用いているものです。 たとえば、歴史的には夏時間 (45) (daylight savings time)を始める時期や施行するかどうかは、 年ごとにばらばらでした。 現在の合衆国の法律では4月の最初の日曜から始めると定めています。 合衆国の夏時間を適用するかどうかを Emacsは現在の定義に基づいて決定しますので、 昔の年代については誤りである場合もあります。


27.7 日出入時刻

カレンダーの特別なコマンドで、 任意の日付の日出入時刻を2分以内の精度で調べられます。

S

選択した日付の日出入時刻を表示する (calendar-sunrise-sunset)。

Mouse-2 Sunrise/Sunset

クリックした日付の日出入時刻を表示する。

M-x sunrise-sunset

今日の日出入時刻を表示する。

C-u M-x sunrise-sunset

指定した日付の日出入時刻を表示する

カレンダー内で地方時(local times)で日出入時刻を表示するには、 目的の日付にポイントを移動してからSと打ちます。 あるいは、目的の日付をMouse-2でクリックすると メニューが立ち上がるのでその中からSunrise/Sunsetを選びます。 カレンダーの外からでも、 今日や指定した日付の日出入時刻を M-x sunrise-sunsetコマンドで調べられます。 今日以外の日付を指定するには、 C-u M-x sunrise-sunsetコマンドを使います。 すると、年月日を聞いてきます。

C-u C-u M-x sunrise-sunsetで、 任意の場所の任意の日付の日出入時刻を表示できます。 経度、緯度、協定世界時(46) からの分単位のずれ、日付の指定を聞いてきます。 すると、その場所でのその日付の日出入時刻が表示されます。

日出入時刻は、地球上の場所に依存しますので、 これらのコマンドを使うまえにEmacsに現在いる場所の緯度/経度と土地の名前を 教えなければなりません。 これにはつぎのようにします。

 
(setq calendar-latitude 40.1)
(setq calendar-longitude -88.2)
(setq calendar-location-name "Urbana, IL")

変数calendar-latitudecalendar-longitudeの値には、 小数点以下1桁まで指定します。

タイムゾーンは、地方時で表した日出入時刻に影響します。 通常、Emacsはオペレーティングシステムからタイムゾーンを取得しますが、 それがまちがっている場合(あるいは、オペレーティングシステムが その情報を与えない場合)には、自分で設定する必要があります。 つぎは設定例です。

 
(setq calendar-time-zone -360)
(setq calendar-standard-time-zone-name "CST")
(setq calendar-daylight-time-zone-name "CDT")

calendar-time-zoneの値は、協定世界時(グリニッジ標準時)と 地方標準時との差を分単位で表したものです。 calendar-standard-time-zone-namecalendar-daylight-time-zone-nameは、 現在いる場所のタイムゾーンの省略名称です。 Emacsは夏時間を補正して日出入時刻を表示します。 夏時間をどのように決定するかは、 See section 夏時間

ユーザーとしては、個人の`.emacs'ファイルで カレンダーの位置関連の変数に普段いる場所の値を設定すると便利でしょう。 あるいは、Emacsをマシンにインストールするときに、 そのマシンの大部分のユーザー用に典型的な場所に関する 情報を`default.el'ファイルに設定してもかまいません。 See section 初期化ファイル`~/.emacs'


27.8 朔弦望(新月、上弦、満月、下弦)

以下のコマンドは、朔弦望(新月、上弦、満月、下弦)の日付と時刻を表示します。 これらの機能は、『朔弦望に依存する』問題をデバッグするときに重宝します。

M

表示してある3か月間の朔弦望の日付/時刻の一覧を表示する (calendar-phases-of-moon)。

M-x phases-of-moon

今日を中央にした3か月間の朔弦望の日付/時刻の一覧を表示する。

カレンダー内でMコマンドを使うと、 現在の3か月間の朔弦望の日付/時刻を別のバッファに表示します。 一覧内の日付/時刻は数分以内の精度です。

カレンダーの外からでも、 M-x phases-of-moonコマンドを使って、 今月を中央月として前後1か月の朔弦望の日付/時刻を 表示できます。 別の期間に関して調べるにはC-u M-x phases-of-moonを使います。 すると、月と年を聞いてきます。

朔弦望の日付/時刻は(必要ならば夏時間を補正して)地方時で与えられます。 しかし、変数calendar-time-zoneが設定されていなければ、 協定世界時(グリニッジ標準時)が使われます。 See section 夏時間


27.9 他の暦との相互変換

Emacsのカレンダーはつねに グレゴリオ暦(Gregorian calendar)で表示します。 この暦は『新暦』とも呼ばれ、今日では世界の大部分で使われています。 しかし、この暦は16世紀以前には存在せず、 18世紀になるまでは普及していませんでした。 ユリウス暦(Julian calendar)に置き替って 世界的に受け入れられたのは20世紀初頭になってからです。 Emacsのカレンダーは西暦1年1月以降の任意のカレンダーを表示できますが、 グレゴリオ暦が存在しなかった時代に関しても グレゴリオ暦に基づいた暦を表示します。

Emacsは他の暦を表示することはできませんが、 指定した日付と他の暦の日付とを相互に変換できます。


27.9.1 参照可能な暦

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)


27.9.2 他の暦への変換

以下のコマンドは選択した日(ポイントがある日)を他の暦で表示します。

Mouse-2 Other Calendars

クリックした日が、他のさまざまな暦ではどうなるかを表示する。

p c

選択した日をISO商用暦の日付で表示する (calendar-print-iso-date)。

p j

選択した日をユリウス暦の日付で表示する (calendar-print-julian-date)。

p a

選択した日を天文通算日(ユリウス日)で表示する (calendar-print-astro-day-number)。

p h

選択した日をヘブライ暦の日付で表示する (calendar-print-hebrew-date)。

p i

選択した日をイスラム暦の日付で表示する (calendar-print-islamic-date)。

p f

選択した日をフランス革命暦の日付で表示する (calendar-print-french-date)。

p C

選択した日を中国暦の日付で表示する (calendar-print-chinese-date)。

p k

選択した日をコプト暦の日付で表示する (calendar-print-coptic-date)。

p e

選択した日をエチオピア暦の日付で表示する (calendar-print-ethiopic-date)。

p p

選択した日をペルシア暦の日付で表示する (calendar-print-persian-date)。

p m

選択した日をマヤ暦の日付で表示する(calendar-print-mayan-date)。

XウィンドウシステムでEmacsを使っている場合には、 ある日付を他の暦での日付に変換する いちばん簡単な方法は、その日付をMouse-2でクリックし、 立ち上がったメニューからOther Calendarsを選びます。 対応する日付をEmacsが知っているすべての暦でメニューに表示します。 (このメニューは単なる表示用なので、項目を選んでも何も起こらない。)

グレゴリオ暦の目的の日付にポイントを動かして適切なキーを打ちます。 pはprintの意味で、 Emacsはその日を指定された暦でエコー領域に表示します。


27.9.3 他の暦からの変換

Emacsが扱える暦で日付を指定して、カレンダーの対応する日に移動できます。 本節では、マヤ暦を除く暦でこれを行うコマンドを説明します。 マヤ暦については、これに続く節を参照してください。

g c

ISO商用暦で指定した日付に移動する(calendar-goto-iso-date)。

g j

ユリウス暦で指定した日付に移動する(calendar-goto-julian-date)。

g a

天文通算日(ユリウス日)で指定した日付に移動する (calendar-goto-astro-day-number)。

g h

ヘブライ暦で指定した日付に移動する(calendar-goto-hebrew-date)。

g i

イスラム暦で指定した日付に移動する(calendar-goto-islamic-date)。

g f

フランス革命暦で指定した日付に移動する(calendar-goto-french-date)。

g C

中国暦で指定した日付に移動する(calendar-goto-chinese-date)。

g p

ペルシア暦で指定した日付に移動する(calendar-goto-persian-date)。

g k

コプト暦で指定した日付に移動する(calendar-goto-coptic-date)。

g e

エチオピア暦で指定した日付に移動する(calendar-goto-ethiopic-date)。

これらのコマンドは、それぞれの暦での日付を聞いてきて、 それに対応するグレゴリオ暦の日付にポイントを移動します。 また、エコー領域には指定した暦の日付を表示します。 Emacsは月の名前をユーザーに聞くときに強い補完(see section 補完) を使うので、ヘブライ暦/イスラム暦/フランス革命暦などの月の名前の綴りを 気にする必要はないでしょう。

ヘブライ暦で問題となるのが追悼記念祭『ヤールツァイト』(yahrzeit)と 呼ばれる命日の計算です。 Emacsのカレンダーにはその計算機能があります。 カレンダー内にカーソルがあるときにM-x list-yahrzeit-datesコマンドを 実行すると年の範囲を聞いてきます。 そして、ポイントがある日付に対応した追悼記念祭の日付を指定した範囲の年に ついて一覧表示します。 カレンダー内にいないときにこのコマンドを使うと、 まず死亡年月日を聞いてから年の範囲を聞いてきます。 そして、追悼記念祭の日付の一覧を表示します。


27.9.4 マヤ暦からの変換

以下はマヤ暦で日付を指定する方法です。

g m l

ロングカウント暦で指定した日付に移動する (calendar-goto-mayan-long-count-date)。

g m n t

ゾルキン暦のつぎの周期の日に進む (calendar-next-tzolkin-date)。

g m p t

ゾルキン暦のまえの周期の日に戻る (calendar-previous-tzolkin-date)。

g m n h

ハアブ暦のつぎの周期の日に進む (calendar-next-haab-date)。

g m p h

ハアブ暦のまえの周期の日に戻る (calendar-previous-haab-date)。

g m n c

マヤのカレンダーラウンドのつぎの周期の日に進む (calendar-next-calendar-round-date)。

g m p c

マヤのカレンダーラウンドのまえの周期の日に戻る (calendar-previous-calendar-round-date)。

これらのコマンドを理解するには、 マヤ暦を理解しておく必要があります。 ロングカウントは以下の単位に基づいて日付を計算したものです。

 
1キン(kin) = 1日   1ユイナル(uinal) = 20キン
1タン(tun) = 18ユイナル   1カタン(katun) = 20タン
1バクタン(baktun) = 20カタン

したがって、ロングカウントの12.16.11.16.6は、 12バクタン、16カタン、11タン、16ユイナル、6キンを表しています。 Emacsのカレンダーはマヤ暦ロングカウント7.17.18.13.1 (52) まで遡ることができますが、 それ以前は扱えません。 g m lコマンドを使ってマヤ暦ロングカウントの日付を入力するときには、 バクタン、カタン、タン、ユイナル、キンをピリオドで区切ってください。

マヤ暦ゾルキンは、独立した13日と20日の周期からなる260日周期です。 この周期が永遠に繰り返されるため、 Emacsには、つぎの周期へ進んだりまえの周期へ戻るコマンドがあります。 g m p tと打つと、ゾルキン暦のまえの周期の日に戻ります。 このコマンドは、ゾルキン暦の日付を聞いてきて、 その日付のまえの周期の日にポイントを戻します。 同様に、g m n tは、ゾルキン暦のつぎの周期の日に進めます。

マヤ暦ハアブは365日の周期で、20日からなる18個の月と 月に属さない5日間からなっています。 ゾルキン暦の周期と同様に、この周期が永遠に繰り返されるため、 Emacsにはつぎの周期の日へ進んだりまえの周期の日に戻るコマンドがあります。 g m p hと打つと、ハアブ暦のまえの周期に日に戻ります。 このコマンドは、ハアブ暦の日付を聞いてきて、 その日付のまえの周期の日にポイントを戻します。 同様に、g m n hは、ハアブ暦のつぎの周期の日に進めます。

マヤではゾルキン暦とハアブ暦を組み合わせた暦も使われていました。 組み合わせの1周期は約52年でカレンダーラウンドと呼ばれます。 g m p cと打つと、 Emacsはハアブ暦の日付とゾルキン暦の日付を聞いてきます。 そして、まえの組み合わせ周期の日にポイントを戻します。 つぎの組み合わせ周期の日にポイントを進めるには g m n cを使います。 これらのコマンドは、指定したハアブ暦/ゾルキン暦の日付の組み合わせが不可能であると エラーを通知します。

Emacsはマヤ暦の名前の入力では強い補完(see section 強い補完)を 使うので、綴りを気にする必要はありません。


27.10 日誌

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には、日誌の項目を眺めたり、追加したり、変更したりする コマンドが数多くあります。


27.10.1 日誌項目の表示コマンド

いったん`~/diary'ファイルを作成しておけば、 カレンダーを使ってこれを眺めることができます。 また、カレンダー(calendar)モードの外からでも、 今日の予定を参照できます。

d

選択した日付のすべての日誌項目を表示する(view-diary-entries)。

Mouse-2 Diary

クリックした日付のすべての日誌項目を表示する。

s

日誌ファイル全体を表示する(show-all-diary-entries)。

m

日誌項目が登録されているすべての日付に印を付ける (mark-diary-entries)。

u

カレンダーウィンドウの印を消す(calendar-unmark)。

M-x print-diary-entries

現在表示している日誌項目をそのまま印刷する。

M-x diary

今日の日付の日誌項目すべてを表示する。

M-x diary-mail-entries

これからの予定を自分自身にメイルする。

dで日誌項目を表示すると、 別のウィンドウに選択した日付の日誌項目が表示されます。 新しいウィンドウのモード行には、 日誌項目の日付とその日付の祝祭日情報が表示されます。 dに数引数を指定すると、指定した日数の期間の日誌項目を表示します。 したがって、2 dは、選択した日とそのつぎの日のすべての項目を表示します。

ある日付の日誌項目を表示する別の方法として、 日付をMouse-2でクリックし、 立ち上がったメニューから項目Diaryを選ぶことです。

日誌が記載されている日付を知るにはmコマンドを使います。 このコマンドは、日誌が記載されている日付を別のフェイスで (複数のフェイスを使えなければ、 日付のあとに`+'を付けて)表示します。 このコマンドは、画面に見えている期間だけでなく、 スクロールすると見えてくる期間にも適用されます。 印を消してもとの状態に戻るにはuコマンドを使いますが、 祝祭日の印も同時に消えます。 (see section 祝祭日)。

日誌ファイル内の数項目ではなく全体を見るには、 sコマンドを使います。

選択した日誌項目だけを表示するには、 選択表示機能を用いて他の項目を隠します。

画面で見ている日誌用バッファは幻でしかありません。 そのため、単純にバッファを印刷しても 画面に表示されているようには印刷できません。 画面に表示されている日誌項目をあるがままに印刷するには専用のコマンド M-x print-diary-entriesを使う必要があります。 このコマンドはデータをプリンタに直接送ります。 lpr-regionのようにカスタマイズできます (see section 印刷)。

コマンドM-x diaryは、現在のカレンダー表示とは関係なしに、 場合によっては数日後までを含めて今日の日誌を表示します。 変数number-of-diary-entriesには何日間まで含めるか指定します。 See (elisp)Calendar section `カレンダーと日誌のカスタマイズ' in Emacs Lisp リファレンスマニュアル

個人の`.emacs'ファイルに(diary)と書けば、 Emacsを実行すると自動的に当日の日誌項目をウィンドウに表示します。 そのウィンドウのモード行には、日付と祝祭日情報が表示されます。

多くのユーザーは、日誌に記載した予定を電子メイルで受け取ることを好みます。 自分自身にそのようなメイルを送るには、 コマンドM-x diary-mail-entriesを使います。 数引数で(今日から始めて)何日間を含めるか指定します。 数引数を指定しなければ、変数diary-mail-daysが日数を指定します。


27.10.2 日誌ファイル

個人の日誌ファイルは、用事と日付の対応付けを記録したファイルです。 日誌ファイルの名前は、変数diary-fileで指定します。 デフォルトは`~/diary'です。 calendarプログラムは、 Emacsの日誌機能が扱う形式を部分的に扱えます。 そのため、calendarプログラムでもそれなりに 日誌ファイルを眺められますが、正しく解釈されない項目もあるでしょう。

日誌ファイルの各項目は、1つの用事を表し、1行以上の行から成ります。 項目はつねに行頭の日付指定で始まります。 項目の残りの部分は用事を説明する単なるテキストです。 項目が1行に収まらないときには、後続行の行頭を白文字で始めて 直前の項目の続きであることを示します。 正しい日付指定で始まらない行や 直前の項目の続きの行でないものは無視されます。

カレンダーのウィンドウ内で特定の日誌項目に印を付けないようにできます。 それには、項目の日付指定のまえにアンパーサンド(`&')を付けます。 これは、日誌ウィンドウに項目を表示するのには影響ありません。 カレンダーウィンドウの日付の印だけに影響します。 印付けを禁止した項目は一般的な項目としては便利で、 こうしないと印が付いた日が多くなりすぎます。

項目の最初の行が日付指定や曜日だけの場合には、 最初の行は日誌ウィンドウに表示されません。 後続の行だけが表示されます。 たとえば、つぎの項目は、日誌ウィンドウでは先頭に日付の行は表示されません。

 
02/11/1989
     本日B. ビルがプリンストンに来る
     2pm 認知研究委員会の会合
     2:30-5:30 ローレンスビルにリズ
     4:00pm 歯医者予約
     7:30pm ジョージの所で夕食
     8:00-10:00pm コンサート

この流儀だと1日分の予定を表示する限りはきちんと見えるのですが、 2日分以上の場合には混乱しかねません。

ウィンドウに表示された日誌項目は編集できますが、 表示されたバッファには日誌ファイル全体が含まれていて、 ある部分が隠されいるのだということを忘れてはなりません。 たとえば、C-fforward-char)コマンドで 表示上の行末にポイントを置けますが、 実際には隠された行の途中にいるのかもしれません。

日誌項目を編集するときには注意してください! 項目に余分な行を追加したり見えている行の途中に文字を追加/削除しても 問題は生じませんが、行末で編集すると予期しないことが起こる可能性があります。 行を削除すると今は見えていない後続の他の項目を 削除してしまうかもしれません。 日誌を編集するまえには、sshow-all-diary-entries)で ファイル全体を表示させるのが最良です。


27.10.3 日付指定の形式

以下は日誌項目の例で、 使用可能ないくつかの日付指定形式を示しています。 この例では日付をアメリカ形式(月、日、年)で指定していますが、 カレンダー(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文字の省略形(ピリオドがあってもなくてもよい)でもかまいません。 大文字小文字は区別しません。

日付の指定は総称的であってもかまいません。 つまり、特定しない部分があってもかまいません。 そうすると、その指定に一致するすべての日付にその項目が適用されます。 年を指定しなければ、それは総称的であり、その項目は毎年に適用されます。 あるいは、monthdayyearのそれぞれに `*'を指定できます。 これは、それぞれ、任意の月、任意の日、任意の年に一致します。 したがって、`3/*/*'という日誌項目は、 任意の年の3月のどの日にも一致します。 `march *'も同じことです。

もし、月のまえに日を書くヨーロッパ形式で日付を指定したいときには、 カレンダー中でM-x european-calendarと打ちます。 あるいは、カレンダー/日誌コマンドを使うまえに 変数european-calendar-styletを設定します。 この状態では、日誌の中のすべての日付指定をヨーロッパ形式で解釈します。 また、日誌の日付を表示するときもヨーロッパ形式です。 (ヨーロッパ形式では、monthnameのあとにはコンマは付けない。) (デフォルトの)アメリカ形式の日付に戻るには、 M-x american-calendarと打ちます。

ある曜日を指定する総称的な日付として曜日の名前を使えます。 曜日の名前は英語で綴り、3文字の省略形 (ピリオドがあってもなくてもよい)でもかまいません。 大文字小文字は問いません。


27.10.4 日誌への追加コマンド

カレンダー(calendar)モードの中には、 日誌の項目を作成するコマンドがいくつかあります。

i d

選択した日に日誌項目を追加する(insert-diary-entry)。

i w

選択した曜日に日誌項目を追加する(insert-weekly-diary-entry)。

i m

選択した月の日に日誌項目を追加する(insert-monthly-diary-entry)。

i y

選択した年の日に日誌項目を追加する(insert-yearly-diary-entry)。

カレンダーウィンドウ内で日を選択してi dコマンドを打てば、 選択した日に日誌項目を作成できます。 このコマンドは、別のウィンドウに日誌ファイルの末尾を表示し、 日付を挿入します。 そうしたら、日誌項目の残りの部分を打ち込みます。

特定の曜日に日誌項目を作成したい場合には、 その曜日を選択して(どの場所でもよい)i wと打ちます。 これで、総称的な日付として曜日名が挿入されます。 そうしたら、日誌項目の残りの部分を打ち込みます。 同様にして、月の特定の日を選択してからi mコマンドを打って、 項目の残りの部分を打ち込みます。 同じように、i yコマンドで、 毎年の特定の日に項目を挿入できます。

これらのコマンドはすべて、デフォルトでは印付けされる項目を作成します。 印付け禁止の項目を作成するには、コマンドに数引数を指定します。 たとえば、C-u i wは毎週の印付け禁止項目を作ります。

日誌ファイルを修正したときには、 Emacsを終了するまえにファイルを必ず保存してください。


27.10.5 特別な日誌項目

カレンダーの日付に基づいて項目を追加する以外に、 毎年の記念日などを表すS式項目(sexp entries)を 日誌ファイルに入れることができます。 これらの項目は、Emacsが日誌ファイルを読み込むときに Lisp式(S式、sexp)を評価することに基づいています。 S式項目では日付のかわりに、`%%'に続けて括弧で括ったLisp式があります。 Lisp式が項目を適用する日付を決定します。

カレンダー(calendar)モードには、 よく使われるS式項目を追加するコマンドがあります。

i a

指定した日付の毎年の記念日の日誌項目を追加する (insert-anniversary-diary-entry)。

i b

カレントリージョンに対してブロック日誌項目を追加する (insert-block-diary-entry)。

i c

指定した日から始まる定期的に巡ってくる日誌項目を追加する (insert-cyclic-diary-entry)。

ある特定の日を毎年の記念日に指定したい場合には、 その日付にポイントを移動してからi aコマンドを使います。 このコマンドは、別のウィンドウに日誌ファイルの末尾を表示し、 記念日を指定するS式を挿入します。 そうしたら、日誌項目の残りの部分を打ち込みます。 以下はその例です。

 
%%(diary-anniversary 10 31 1948) アーサーの誕生日

この項目は、1948年以降の毎年10月31日に適用されます。 `10 31 1948'は日付を指定します。 (ヨーロッパ形式の日付を使っている場合には、 `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 (elisp)Sexp Diary Entries section `S式項目と装飾日誌表示' in Emacs Lisp リファレンスマニュアル


27.11 約束

日誌項目に約束が入っていて、 Emacsが認識可能な形で時刻が指定されている場合には、 その予定の何分かまえに「約束がありますよ。」と警告を出す機能があります。 Emacsはモード行に約束がある旨の警告メッセージを表示します。

約束の警告表示を行わせるには、 まずEmacsの時刻表示機能をオンにする必要があります。 M-x display-time(see section モード行)と打ちます。 さらに、関数appt-make-listを以下のようにして diary-hookに追加する必要があります。

 
(add-hook 'diary-hook 'appt-make-list)

個人の`.emacs'ファイルに以下のテキストを追加すれば、 これまでのことを行えます。

 
(display-time)
(add-hook 'diary-hook 'appt-make-list)
(diary 0)

このように準備しておくと、(カレンダーのウィンドウでdコマンドを使うか、 M-x diaryコマンドを使うかして) 日誌を表示したときに、Emacsが認識できる時刻指定のある約束をすべて取り込み、 それらのおのおのについて指定された時刻よりも少しまえに警告を表示します。

たとえば、日誌ファイルに以下のような項目があるとします。

 
Monday
  9:30am 休憩
 12:00pm 昼食

すると、毎週月曜には、日誌を表示していると午前9時20分に もうすぐ休憩だと表示を出し、午前11時50分には昼食時間だと表示を出します。

時刻指定は、`9:00am'のようにam/pmスタイルでも (`12:00am'は夜中の12時、`12:00pm'はお昼の12時を表す)、 ヨーロッパや軍隊流の24時間制でもかまいません。 また、一貫している必要もなく、 日誌ファイルにこれらが混在していてもかまいません。

Emacsはこれらの約束リストを夜中の12時過ぎに更新します。 変数appt-display-diarynilを設定していない限り、 日誌用バッファにつぎの日の予定を表示します。

約束の警告表示を目覚し時計として利用することもできます。 コマンドM-x appt-addは、個人の日誌ファイルを変更せずに 約束リストに項目を追加します。 M-x appt-deleteは、約束リストから項目を削除します。

変数appt-issue-messagenilを設定すれば、 約束の警告表示はいつでもオフにできます。


27.12 夏時間

Emacsは標準時と夏時間の違いを理解していて、 日出入、夏至、冬至、春分、秋分、朔弦望の時刻ではこれを補正しています。 夏時間の規則は、地域によっても、また、歴史的にもさまざまです。 補正を正しく行うには、使用する規則をEmacsに与えておく必要があります。

オペレーティングシステムのなかには、 その設置場所で適用する規則を記録しているものもあります。 このようなシステムでは、Emacsは自動的に必要な情報をシステムから取得します。 情報の一部や全部が欠けている場合には、現在マサチューセッツ州ケンブリッジで 使われている規則でEmacsは欠落部分を補おうとします。 その結果が正しくないならば、 変数calendar-daylight-savings-startscalendar-daylight-savings-endsを設定し、 規則をEmacsに与える必要があります。

これらの変数の値は、変数yearを参照するLisp式である必要があり、 評価すると、グレゴリオ暦での夏時間の開始日や終了日を表す (month day year)という形のリストになる必要があります。 在住地方で夏時間を採用していない場合には、 これらの値はnilにしておきます。

Emacsはこれらの式を用いて夏時間の開始日を決定し、 祝祭日一覧や太陽や月に関する計算の時刻補正に使います。

マサチューセッツ州ケンブリッジの値は以下のとおりです。

 
(calendar-nth-named-day 1 0 4 year)
(calendar-nth-named-day -1 0 10 year)

yearで指定される年の4月の最初の日曜日(0番目)から始まり、 その年の10月の最後の月曜まで続くことを表します。 夏時間の開始日が10月1日に変更されたならば、 変数calendar-daylight-savings-startsには以下のように設定します。

 
(list 10 1 year)

読者の地方で夏時間を採用していなかったり、 すべての時刻を標準時で扱いたい場合には、 変数calendar-daylight-savings-startsと 変数calendar-daylight-savings-endsにはnilを設定してください。

変数calendar-daylight-time-offsetは、 夏時間と標準時の差を分単位で指定します。 マサチューセッツ州ケンブリッジでは60(分)です。

2つの変数calendar-daylight-savings-starts-timeと 変数calendar-daylight-savings-ends-timeは、 夏時間の開始/終了が地方時の真夜中の0時から何分ずれるかを指定します。 マサチューセッツ州ケンブリッジではどちらも120(分)です。


27.13 gnus

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

以下ではgnusについて紹介し、いくつかの基本的な機能について説明します。

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


27.13.1 gnusのバッファ

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

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

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

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


27.13.2 gnusの起動時の動作

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

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

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

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


27.13.3 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に一致する記事がみつかるまで前向きに探索する。


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

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

M-! cmd RET

シェルコマンドcmdを実行し、その結果を表示する (shell-command)。

M-| cmd RET

リージョンの内容を入力としてシェルコマンドcmdを実行する。 場合によっては、リージョンをシェルコマンドの出力で置き換える。 (shell-command-on-region)。

M-x shell

入出力をEmacsバッファに接続してサブシェルを実行する。 すると、対話的にコマンドを入力できる。


27.14.1 単一のシェルコマンド

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に バッファ名の文字列を設定すると、 その名前のバッファのポイント位置のまえにエラー出力が挿入されます。


27.14.2 対話的な下位のシェル

サブシェルを対話的に実行し、その対話記録を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のサブシェルとして動いているかどうか判定できます。


27.14.3 シェルモード(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

シェルプロセスを継続させる。 これはまちがってシェルプロセスを休止させてしまった場合に役立つ。 (53)

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モードで、 任意のプログラムをサブプロセスとして実行できます。


27.14.4 シェルコマンド履歴

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


27.14.4.1 シェル履歴リング

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'です。


27.14.4.2 シェル履歴のコピー

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はバッファからテキストをコピーするので、 シェルへ送ったあとでそれをバッファ上で編集した場合には、 履歴リストにあるものとは異なることもあります。


27.14.4.3 シェル履歴の参照

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で履歴展開が行えるようになります。


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

変数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) を制御できます。 これらの値は当然、使っているシェルの動作と一致するように設定すべきです。


27.14.6 リモートホストのシェル

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つのモードを相互に切り替えられます。 引数なしではリモートディレクトリ名を使う状態にし、 正の数を引数にするとローカル名を使う状態にします。 負の数を引数にするとディレクトリの追跡機能を止めます。


27.15 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上でバッファを編集し終るのを待たずにただちに終了します。


27.16 印刷

印刷用の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にすべきです。


27.17 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バッファに置きます。


27.18 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ポイント(54)です。

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


27.19 テキストのソート

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


27.20 ナロイング

ナロイング(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 使用禁止コマンド


27.21 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)を使います。 コマンドを入力したときにカレントバッファでない側のバッファが空であれば、 そのバッファは削除します。


27.22 バイナリファイルの編集

バイナリファイルを編集するための特別なメジャーモード、 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実行前のこのバッファのメジャーモードに戻る。


27.23 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 リモートファイル


27.24 再帰編集レベル

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


27.25 エミュレーション

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 Viper: (viper)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 VIP: (vip)Top


27.26 まぜこぜ新聞(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 (55) というのが生成されるわけです。 元テキストが長いとたいへんおもしろい結果を得られます。

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

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

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


27.27 その他の娯楽

退屈なときは、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と打ってみてください。


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

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.