The Emacs Editor ディストリビューション イントロダクション 1 画面の構成 2 ユーザー入力の種類 3 キー 4 キーとコマンド 5 Emacsの起動 6 Emacsからのexit 7 基本的な編集コマンド 8 ミニバッファー 9 名前を指定してコマンドを実行する 10 ヘルプ 11 マークとリージョン 12 テキストのkillと移動 13 レジスター 14 ディスプレーの制御 15 検索と置換 16 タイプミスを訂正するコマンド 17 キーボードマクロ 18 ファイルの処理 19 複数バッファーの使用 20 複数ウィンドウ 21 フレームとグラフィカルなディスプレー 22 国際化文字セットのサポート 23 メジャーモードとマイナーモード 24 インデント 25 人間の言語のためのコマンド 26 プログラムの編集 27 プログラムのコンパイルとテスト 28 大きなプログラムの保守 29 abbrev(略語) 30 Dired (ディレクトリーエディター) 31 カレンダーとダイアリー 32 メールの送信 33 Rmailでメールを読む 34 GnusによるEメールとUsenetニュース 35 ホストのセキュリティ 36 ネットワークのセキュリティ 37 ドキュメントの閲覧 38 Emacsからのシェルコマンドの実行 39 サーバーとしてのEmacsの使用 40 ハードコピーの印刷 41 テキストのソート 42 ピクチャーの編集 43 バイナリーファイルの編集 44 Emacsセッションの保存 45 再帰編集レベル 46 ハイパーリンクとWebナビゲーション機能 47 ゲーム、その他の娯楽 48 Emacs Lispパッケージ 49 カスタマイズ 50 中止と中断 51 Emacsのトラブルへの対処 52 バグの報告 53 Emacs開発への貢献 54 GNU Emacsにたいして助けを得る方法 Appendix A GNU GENERAL PUBLIC LICENSE Appendix B GNU Free Documentation License Appendix C Emacs呼び出しにたいするコマンドライン引数 Appendix D Xのオプションとリソース Appendix E Emacs 25 アンチニュース Appendix F EmacsとmacOS / GNUstep Appendix G EmacsとMicrosoft Windows/MS-DOS The GNU Manifesto Glossary Acknowledgments Key (Character) Index Command-Line Options Index Command and Function Index Variable Index Concept Index The Emacs Editor ディストリビューション イントロダクション 1 画面の構成 1.1 ポイント 1.2 エコーエリア 1.3 モードライン 1.4 メニューバー 2 ユーザー入力の種類 3 キー 4 キーとコマンド 5 Emacsの起動 6 Emacsからのexit 7 基本的な編集コマンド 7.1 テキストの挿入 7.2 ポイント位置の変更 7.3 テキストの消去 7.4 変更のアンドゥ 7.5 ファイル 7.6 ヘルプ 7.7 空行 7.8 継続行 7.9 カーソル位置の情報 7.10 数引数 7.11 コマンドの繰り返し 8 ミニバッファー 8.1 ミニバッファーを使う 8.2 ミニバッファーでのファイル名 8.3 ミニバッファーでの編集 8.4 補完 8.4.1 補完の例 8.4.2 補完コマンド 8.4.3 補完の終了 8.4.4 補完候補が選択される方法 8.4.5 補完オプション 8.5 ミニバッファーヒストリー 8.6 ミニバッファーでのコマンドの繰り返し 8.7 パスワードの入力 8.8 Yes or No プロンプト 9 名前を指定してコマンドを実行する 10 ヘルプ 10.1 ヘルプの概要 10.2 キーのドキュメント 10.3 コマンドと変数名のヘルプ 10.4 Apropos(適切な) 10.5 ヘルプモードのコマンド 10.6 パッケージのキーワード検索 10.7 国際化言語のサポートに関するヘルプ 10.8 その他のヘルプコマンド 10.9 ヘルプファイル 10.10 アクティブテキストのヘルプとツールチップ 11 マークとリージョン 11.1 マークのセット 11.2 テキストオブジェクトをマークするコマンド 11.3 リージョンを操作する 11.4 マークリング 11.5 グローバルマークリング 11.6 シフト選択 11.7 Transient Markモードを無効にする 12 テキストのkillと移動 12.1 削除とkill 12.1.1 削除 12.1.2 行のkill 12.1.3 その他のkillコマンド 12.1.4 killのオプション 12.2 yank 12.2.1 killリング 12.2.2 過去にkillしたテキストをyankする 12.2.3 killしたテキストの追加 12.3 グラフィカルなディスプレーでのカットアンドペースト 12.3.1 クリップボードを使う 12.3.2 他のウィンドウアプリケーションにたいするカットアンドペースト 12.3.3 セカンダリー選択 12.4 テキストの追加 12.5 矩形領域(Rectangles) 12.6 CUAバインド 13 レジスター 13.1 レジスターに位置を保存する 13.2 レジスターにテキストを保存する 13.3 レジスターに矩形領域を保存する 13.4 レジスターにウィンドウ設定を保存する 13.5 レジスターに数字を保存する 13.6 レジスターにファイル名を保存する 13.7 キーボードマクロのレジスター 13.8 ブックマーク 14 ディスプレーの制御 14.1 スクロール 14.2 センタリング 14.3 自動スクロール 14.4 水平スクロール 14.5 ナローイング 14.6 Viewモード 14.7 Followモード 14.8 テキストのフェイス 14.9 フェイスのカラー 14.10 標準フェイス 14.11 テキストのスケール 14.12 Font Lockモード 14.13 インタラクティブなハイライト 14.14 ウィンドウのフリンジ 14.15 バウンダリーの表示 14.16 不要なスペース 14.17 選択的な表示 14.18 モードラインのオプション 14.19 テキストが表示される方法 14.20 カーソルの表示 14.21 行の切り詰め 14.22 Visual Lineモード 14.23 ディスプレーのカスタマイズ 15 検索と置換 15.1 インクリメンタル検索 15.1.1 インクリメンタル検索の基本 15.1.2 インクリメンタル検索の繰り返し 15.1.3 インクリメンタル検索でのyank 15.1.4 インクリメンタル検索でのエラー 15.1.5 インクリメンタル検索の特別な入力 15.1.6 インクリメンタル検索を終了させない 15.1.7 ミニバッファーの検索 15.2 非インクリメンタル検索 15.3 単語検索 15.4 シンボル検索 15.5 正規表現検索 15.6 正規表現の構文 15.7 正規表現でのバックスラッシュ 15.8 正規表現の例 15.9 検索中のLaxマッチング 15.10 置換コマンド 15.10.1 無条件の置換 15.10.2 正規表現の置換 15.10.3 置換コマンドとLaxマッチ 15.10.4 問い合わせつき置換 15.11 その他の検索およびループコマンド 15.12 必要に応じて検索を調整する 16 タイプミスを訂正するコマンド 16.1 Undo(取り消し) 16.2 テキストの入れ替え 16.3 大文字小文字の変換 16.4 スペルのチェックと訂正 17 キーボードマクロ 17.1 基本的な使い方 17.2 キーボードマクロリング 17.3 キーボードマクロカウンター 17.4 変化のあるマクロの実行 17.5 キーボードマクロの命名と保存 17.6 キーボードマクロの編集 17.7 キーボードマクロのステップ編集 18 ファイルの処理 18.1 ファイルの名前 18.2 ファイルのvisit(訪問) 18.3 ファイルの保存 18.3.1 ファイルを保存するコマンド 18.3.2 バックアップファイル 18.3.2.1 単一または番号つきバックアップ 18.3.2.2 バックアップの自動削除 18.3.2.3 コピー vs. リネーム 18.3.3 ファイル保存のカスタマイズ 18.3.4 同時編集からの保護 18.3.5 ファイルのシャドーイング 18.3.6 タイムスタンプの自動更新 18.4 バッファーのリバート 18.5 非ファイルバッファーの自動リバート 18.5.1 Buffer Menuの自動リバート 18.5.2 Diredバッファーの自動リバート 18.6 自動保存-災害にたいする防御 18.6.1 自動保存ファイル 18.6.2 自動保存の制御 18.6.3 自動保存からのデータ復旧 18.7 ファイルのエイリアス 18.8 ファイルディレクトリー 18.9 ファイルの比較 18.10 Diffモード 18.11 ファイルのコピー、命名、リネーム。 18.12 その他のファイル操作 18.13 圧縮ファイルへのアクセス 18.14 ファイルアーカイブ 18.15 リモートファイル 18.16 ファイル名のクォート 18.17 ファイル名キャッシュ 18.18 ファイル検索の便利な機能 18.19 ファイルセット 19 複数バッファーの使用 19.1 バッファーの作成と選択 19.2 既存のバッファーを一覧する 19.3 その他のバッファー操作 19.4 バッファーのkill 19.5 複数バッファーにたいする操作 19.6 インダイレクトバッファー 19.7 バッファー処理の便利な機能とカスタマイズ 19.7.1 バッファー名を一意にする 19.7.2 素早いミニバッファーの選択 19.7.3 バッファーメニューのカスタマイズ 20 複数ウィンドウ 20.1 Emacsウィンドウの概念 20.2 ウィンドウの分割 20.3 他のウィンドウの使用 20.4 他のウィンドウでの表示 20.5 ウィンドウの削除とリサイズ 20.6 ウィンドウでのバッファーの表示 20.6.1 ‘display-buffer’が機能する方法 20.6.2 編集不可バッファーの表示 20.7 ウィンドウ処理のための便利な機能 21 フレームとグラフィカルなディスプレー 21.1 編集のためのマウスコマンド 21.2 単語と行にたいするマウスコマンド 21.3 マウスで参照をフォローする 21.4 メニューにたいするマウスクリック 21.5 モードラインのマウスコマンド 21.6 フレームの作成 21.7 フレームコマンド 21.8 フォント 21.9 スピードバーフレーム 21.10 複数ディスプレー 21.11 フレームパラメーター 21.12 スクロールバー 21.13 ウィンドウdivider 21.14 ドラッグアンドドロップ 21.15 メニューバー 21.16 ツールバー 21.17 ダイアログボックスの使用 21.18 ツールチップ 21.19 マウスの回避 21.20 非ウィンドウ端末 21.21 テキスト端末でのマウスの使用 22 国際化文字セットのサポート 22.1 国際化文字セットのイントロダクション 22.2 言語環境 22.3 インプットメソッド 22.4 インプットメソッドの選択 22.5 コーディングシステム 22.6 コーディングシステムの認識 22.7 ファイルのコーディングシステムの指定 22.8 出力のためのコーディングシステムの選択 22.9 ファイルのテキストにたいするコーディングシステムの指定 22.10 プロセス間通信にたいするコーディングシステム 22.11 ファイル名にたいするコーディングシステム 22.12 端末入出力にたいするコーディングシステム 22.13 フォントセット 22.14 フォントセットの定義 22.15 フォントセットの修正 22.16 表示できない文字 22.17 Unibyte編集モード 22.18 文字セット 22.19 双方向の編集 23 メジャーモードとマイナーモード 23.1 メジャーモード 23.2 マイナーモード 23.3 ファイルのモードを選択する 24 インデント 24.1 インデントコマンド 24.2 タブストップ 24.3 タブ vs. スペース 24.4 インデントの便利な機能 25 人間の言語のためのコマンド 25.1 単語 25.2 センテンス 25.3 パラグラフ 25.4 ページ 25.5 クォーテーションマーク 25.6 テキストのフィル 25.6.1 Auto Fillモード 25.6.2 明示的なフィルコマンド 25.6.3 フィルプレフィクス 25.6.4 適応型フィル 25.7 大文字小文字変換コマンド 25.8 Textモード 25.9 Outlineモード 25.9.1 アウトラインのフォーマット 25.9.2 アウトライン移動コマンド 25.9.3 アウトライン表示コマンド 25.9.4 複数ビューによるアウトラインの閲覧 25.9.5 折り畳み編集 25.10 Orgモード 25.10.1 オーガナイザーとしてのOrg 25.10.2 オーサリングシステムとしてのOrg 25.11 TeXモード 25.11.1 TeX編集コマンド 25.11.2 LaTeX編集コマンド 25.11.3 TeX印刷コマンド 25.11.4 TeXモード、その 25.12 SGMLモードとHTMLモード 25.13 Nroffモード 25.14 Enrichedテキスト 25.14.1 Enrichedモード 25.14.2 ハード改行とソフト改行 25.14.3 フォーマット情報の編集 25.14.4 Enrichedテキストのフェイス 25.14.5 Enrichedテキストのインデント 25.14.6 Enrichedテキストの位置調整 25.14.7 その他のテキストプロパティーのセッティング 25.15 テキストベーステーブルの編集 25.15.1 テキストベーステーブルとは? 25.15.2 テーブルの作成 25.15.3 テーブルの認識 25.15.4 テーブルセルにたいするコマンド 25.15.5 セルの位置調整 25.15.6 テーブルの行と列 25.15.7 プレーンテキストとテーブルの変換 25.15.8 テーブル、その他 25.16 2列編集 26 プログラムの編集 26.1 プログラミング言語のためのメジャーモード 26.2 トップレベルの定義、またはdefun 26.2.1 左端の慣習 26.2.2 defunの移動 26.2.3 Imenuとは 26.2.4 Which Functionモード 26.3 プログラムのインデント 26.3.1 プログラムの基本的なインデントコマンド 26.3.2 複数行のインデント 26.3.3 Lispのインデントのカスタマイズ 26.3.4 Cのインデントのためのコマンド 26.3.5 Cのインデントのカスタマイズ 26.4 カッコに付随する編集のためのコマンド 26.4.1 対応が取れたカッコの式 26.4.2 カッコ構造の移動 26.4.3 マッチするカッコ 26.5 コメントの操作 26.5.1 コメントコマンド 26.5.2 複数行のコメント 26.5.3 コメントを制御するオプション 26.6 ドキュメントの照会 26.6.1 Infoドキュメントの照会 26.6.2 man-pageの照会 26.6.3 Emacs Lispドキュメントの照会 26.7 Hideshowマイナーモード 26.8 シンボル名の補完 26.9 大文字小文字の混ざった単語 26.10 Semanticとは 26.11 プログラムを編集するための他の便利な機能 26.12 Cおよび関連するモード 26.12.1 Cモードの移動コマンド 26.12.2 エレクトリックC文字 26.12.3 Cの欲張りな削除機能 26.12.4 Cモードのその他のコマンド 26.13 Asmモード 26.14 Fortranモード 26.14.1 移動コマンド 26.14.2 Fortranのインデント 26.14.2.1 Fortranのインデントおよびフィルコマンド 26.14.2.2 継続行 26.14.2.3 行番号 26.14.2.4 構文的な慣習 26.14.2.5 Fortranのインデントのための変数 26.14.3 Fortranのコメント 26.14.4 FortranモードでのAuto Fill 26.14.5 Fortranでの列のチェック 26.14.6 FortranキーワードのAbbrev 27 プログラムのコンパイルとテスト 27.1 Emacs下でのコンパイルの実行 27.2 Compilationモード 27.3 コンパイルのためのサブシェル 27.4 Emacs下でのGrepによる検索 27.5 オンザフライで構文エラーを見つける 27.6 Emacs下でのデバッガーの実行 27.6.1 GUDの開始 27.6.2 デバッガーの操作 27.6.3 GUDのコマンド 27.6.4 GUDのカスタマイズ 27.6.5 GDBのグラフィカルインターフェース 27.6.5.1 GDBのユーザーインターフェースのレイアウト 27.6.5.2 Sourceバッファー 27.6.5.3 Breakpointsバッファー 27.6.5.4 Threadsバッファー 27.6.5.5 Stackバッファー 27.6.5.6 その他のGDBバッファー 27.6.5.7 ウォッチ式 27.6.5.8 マルチスレッドのデバッグ 27.7 Lisp式の実行 27.8 EmacsのためのLispコードによるライブラリー 27.9 Emacs Lisp式の評価 27.10 Lisp Interactionバッファー 27.11 外部Lispの実行 28 大きなプログラムの保守 28.1 バージョンコントロール 28.1.1 バージョンコントロールの紹介 28.1.1.1 問題の背景を理解する 28.1.1.2 サポートされるバージョンコントロールシステム 28.1.1.3 バージョンコントロールの概念 28.1.1.4 バージョンコントロールにおけるマージベースとロックベース 28.1.1.5 バージョンコントロールに置ける変更セットベースとファイルベース 28.1.1.6 リポジトリーにおける分散型と集中型 28.1.1.7 ログファイルのタイプ 28.1.2 バージョンコントロールとモードライン 28.1.3 バージョンコントロール下での基本的な編集 28.1.3.1 マージでの基本的なバージョンコントロール 28.1.3.2 ロックでの基本的なバージョンコントロール 28.1.3.3 ‘C-x v v’の高度な制御 28.1.4 Log Entryバッファーの機能 28.1.5 バージョンコントロールへのファイルの登録 28.1.6 古いリビジョンの調査と比較 28.1.7 VC Change Log 28.1.8 バージョンコントロール操作のアンドゥ 28.1.9 バージョンコントロールファイルを無視する 28.1.10 VC Directoryモード 28.1.10.1 VC Directoryバッファー 28.1.10.2 VC Directoryコマンド 28.1.11 バージョンコントロールのブランチ 28.1.11.1 ブランチ間の切り替え 28.1.11.2 ブランチへ/からの変更のpull/push 28.1.11.3 ブランチのマージ 28.1.11.4 新しいブランチの作成 28.1.12 VCのその他のコマンドと機能 28.1.12.1 変更ログとVC 28.1.12.2 バージョンコントロールされたファイルの削除とリネーム 28.1.12.3 リビジョンタグ 28.1.12.4 バージョンコントロールヘッダーの挿入 28.1.13 VCのカスタマイズ 28.1.13.1 一般的なオプション 28.1.13.2 RCSとSCCSにたいするオプション 28.1.13.3 CVSに特有のオプション 28.2 変更ログ 28.2.1 変更ログコマンド 28.2.2 ChangeLogの書式 28.3 識別子のリファレンスを探す 28.3.1 識別子を探す 28.3.1.1 識別子の照合 28.3.1.2 ‘*xref*’バッファーで利用可能なコマンド 28.3.1.3 識別子の検索と置換 28.3.1.4 識別子の照会 28.3.2 tagsテーブル 28.3.2.1 ソースファイルタグの構文 28.3.2.2 タグテーブルの作成 28.3.2.3 etagsのregexp 28.3.3 タグテーブルの選択 28.4 Emacs開発環境 28.5 Emergeでのファイルのマージ 28.5.1 Emergeの概要 28.5.2 Emergeのサブモード 28.5.3 相違の状態 28.5.4 マージコマンド 28.5.5 Emergeの終了 28.5.6 2つのバージョンの合成 28.5.7 Emergeの細かい注意点 29 abbrev(略語) 29.1 abbrevの概念 29.2 abbrevの定義 29.3 abbrev展開の制御 29.4 abbrevのテストと編集 29.5 abbrevの保存 29.6 動的abbrev展開 29.7 動的abbrevのカスタマイズ 30 Dired (ディレクトリーエディター) 30.1 Diredの起動 30.2 Diredバッファーでの移動 30.3 Diredでのファイルの削除について 30.4 大量のファイルに一度にフラグをつける 30.5 Diredのファイルをvisitする 30.6 Diredでのマークとフラグ 30.7 ファイルにたいする操作 30.8 Diredでのシェルコマンド 30.9 Diredでのファイル名の変更 30.10 Diredでのファイル比較 30.11 Diredでのサブディレクトリー 30.12 Diredでのサブディレクトリーにたいするスイッチ 30.13 サブディレクトリー間の移動 30.14 サブディレクトリーを隠す 30.15 Diredバッファーの更新 30.16 Diredと‘find’ 30.17 Diredバッファーの編集 30.18 Diredでのイメージとサムネイルの閲覧 30.19 その他のDiredの機能 31 カレンダーとダイアリー 31.1 カレンダーでの移動 31.1.1 標準的な時間間隔での移動 31.1.2 週、月、年の開始と終了 31.1.3 日付の指定 31.2 カレンダーでのスクロール 31.3 日付のカウント 31.4 その他のカレンダーコマンド 31.5 カレンダーファイルの記述 31.6 休日 31.7 日の出と日の入りの時刻 31.8 月の位相 31.9 他のカレンダーとの間の変換 31.9.1 サポートされるカレンダーシステム 31.9.2 他のカレンダーへの変換 31.9.3 他のカレンダーからの変換 31.10 ダイアリー 31.10.1 ダイアリーファイル 31.10.2 ダイアリーの表示 31.10.3 日付のフォーマット 31.10.4 ダイアリーに追加するコマンド 31.10.5 特別なダイアリーエントリー 31.10.6 アポイントメント 31.10.7 ダイアリーエントリーのインポートとエクスポート 31.11 サマータイム 31.12 時間間隔の加算 31.13 カレンダーとダイアリーの上級な機能 31.13.1 カレンダーのカスタマイズ 31.13.2 休日のカスタマイズ 31.13.3 マヤ暦からの変換 31.13.4 日付の表示フォーマット 31.13.5 時刻の表示フォーマット 31.13.6 ダイアリーのカスタマイズ 31.13.7 非グレゴリオ暦を使用するカレンダーエントリー 31.13.8 ダイアリーの表示 31.13.9 Fancy Diary表示 31.13.10 sexpエントリーとFancy Diary表示 32 メールの送信 32.1 メールバッファーのフォーマット 32.2 メールヘッダーフィールド 32.3 メールエイリアス 32.4 メールコマンド 32.4.1 メールの送信 32.4.2 メールヘッダーの編集 32.4.3 メールの引用 32.4.4 メール、その他 32.5 メール署名 32.6 アミューズメント 32.7 メール作成方法 33 Rmailでメールを読む 33.1 Rmailの基本的な概念 33.2 メッセージのスクロール 33.3 メッセージ間の移動 33.4 メッセージの削除 33.5 Rmailファイルとinbox 33.6 複数のRmailファイル 33.7 外部ファイルへのメッセージのコピー 33.8 ラベル 33.9 Rmailの属性 33.10 返信の送信 33.11 サマリー 33.11.1 サマリーの作成 33.11.2 サマリーでの編集 33.12 Rmailファイルのソート 33.13 メッセージの表示 33.14 Rmailとコーディングシステム 33.15 メッセージの編集 33.16 ダイジェストメッセージ 33.17 Rot13メッセージを読む 33.18 ‘movemail’ program 33.19 リモートmailboxからのメールの取得 33.20 さまざまな形式のローカルmailboxからのメールの取得 34 GnusによるEメールとUsenetニュース 34.1 Gnusバッファー 34.2 Gnusを起動したとき 34.3 Gnus Groupバッファーの使用 34.4 Gnus Summaryバッファーの使用 35 ホストのセキュリティ 36 ネットワークのセキュリティ 37 ドキュメントの閲覧 37.1 DocViewの操作 37.2 DocViewの検索 37.3 DocViewのスライス 37.4 DocViewの変換 38 Emacsからのシェルコマンドの実行 38.1 単一のシェルコマンド 38.2 対話的なサブシェル 38.3 Shellモード 38.4 Shellプロンプト 38.5 Shellコマンドヒストリー 38.5.1 Shellヒストリーリング 38.5.2 Shellヒストリーのコピー 38.5.3 Shellヒストリーの参照 38.6 ディレクトリーの追跡 38.7 Shellモードのオプション 38.8 Emacsの端末エミュレーター 38.9 Termモード 38.10 リモートホストのシェル 38.11 シリアル端末 39 サーバーとしてのEmacsの使用 39.1 TCP Emacs server 39.2 ‘emacsclient’の呼び出し 39.3 ‘emacsclient’のオプション 40 ハードコピーの印刷 40.1 PostScriptのハードコピー 40.2 PostScriptハードコピーにたいする変数 40.3 印刷のためのパッケージ 41 テキストのソート 42 ピクチャーの編集 42.1 Pictureモードでの基本的な編集 42.2 挿入後の移動の制御 42.3 Pictureモードでのタブ 42.4 Pictureモードの矩形領域コマンド 43 バイナリーファイルの編集 44 Emacsセッションの保存 45 再帰編集レベル 46 ハイパーリンクとWebナビゲーション機能 46.1 EWWによるウェブブラウズ 46.2 埋め込みWebKitウィジェット 46.3 URLのフォロー 46.4 URLのアクティブ化 46.5 ポイント位置のファイルやURLを開く 47 ゲーム、その他の娯楽 48 Emacs Lispパッケージ 48.1 Package Menuバッファー 48.2 パッケージのインストール 48.3 パッケージのファイルとディレクトリー 49 カスタマイズ 49.1 Easy Customizationインターフェース 49.1.1 カスタマイズグループ 49.1.2 セッティングのブラウズと検索 49.1.3 変数の変更 49.1.4 カスタマイズの保存 49.1.5 フェイスのカスタマイズ 49.1.6 特定のアイテムのカスタマイズ 49.1.7 カスタムテーマ 49.1.8 カスタムテーマの作成 49.2 変数 49.2.1 変数の確認とセット 49.2.2 フック 49.2.3 ローカル変数 49.2.4 ファイル内のローカル変数 49.2.4.1 ファイル変数の指定 49.2.4.2 安全なファイル変数 49.2.5 ディレクトリーごとのローカル変数 49.3 キーバインディングのカスタマイズ 49.3.1 キーマップ 49.3.2 プレフィクスキーマップ 49.3.3 ローカルキーマップ 49.3.4 ミニバッファーキーマップ 49.3.5 対話的なキーバインディングの変更 49.3.6 initファイル内でのキーのリバインド 49.3.7 修飾キー 49.3.8 ファンクションキーのリバインド 49.3.9 名前のあるASCIIコントロール文字 49.3.10 マウスボタンのリバインド 49.3.11 コマンドの無効化 49.4 Emacs初期化ファイル 49.4.1 initファイルの構文 49.4.2 initファイルの例 49.4.3 端末固有の初期化 49.4.4 Emacsがinitファイルを探す方法 49.4.5 initファイル内の非ASCII文字 49.5 永続的に認証情報を保つ 50 中止と中断 51 Emacsのトラブルへの対処 51.1 で削除できない場合 51.2 再帰編集レベル 51.3 スクリーン上のゴミ 51.4 テキスト内のゴミ 51.5 メモリー不足 51.6 Emacsがクラッシュしたとき 51.7 クラッシュ後のリカバリー 51.8 緊急エスケープ 52 バグの報告 52.1 既存のバグレポートの既知の問題を読む 52.2 バグがあったとき 52.3 バグレポートの理解 52.4 バグレポートのためのチェックリスト 52.5 GNU Emacsへのパッチの送付 53 Emacs開発への貢献 53.1 コーディング規約 53.2 著作権の割り当て 54 GNU Emacsにたいして助けを得る方法 Appendix A GNU GENERAL PUBLIC LICENSE Appendix B GNU Free Documentation License Appendix C Emacs呼び出しにたいするコマンドライン引数 C.1 動作引数 C.2 初期化オプション C.3 コマンド引数の例 C.4 環境変数 C.4.1 一般的な変数 C.4.2 その他の変数 C.4.3 MS-Windowsのシステムレジストリー C.5 ディスプレー名の指定 C.6 フォント指定オプション C.7 ウィンドウカラーオプション C.8 ウィンドウのサイズと位置にたいするオプション C.9 内枠ボーダーと外枠ボーダー C.10 フレームタイトル C.11 アイコン C.12 その他のディスプレーオプション Appendix D Xのオプションとリソース D.1 Xリソース D.2 EmacsにたいするXリソースの表 D.3 Lucidのメニューとダイアログ D.4 MotifメニューのXリソース D.5 GTK+リソース D.5.1 GTK+ Resource Basics D.5.2 GTK+ウィジェット名 D.5.3 EmacsでのGTK+ウィジェット名 D.5.4 GTK+スタイル Appendix E Emacs 25 アンチニュース Appendix F EmacsとmacOS / GNUstep F.1 macOSおよびGNUstepでのEmacsの基本的な使い方 F.1.1 環境変数の取得 F.2 Mac/GNUstepでのカスタマイズ F.2.1 フォントパネル F.3 macOSおよびGNUstepでのウィンドウシステムイベント F.4 GNUstepにたいするサポート Appendix G EmacsとMicrosoft Windows/MS-DOS G.1 MS-WindowsでEmacsを開始する方法 G.2 テキストファイルとバイナリーファイル G.3 MS-Windowsのファイル名 G.4 MS-Windowsでの‘ls’のエミュレーション G.5 MS-WindowsでのHOMEディレクトリーと開始ディレクトリー G.6 MS-Windowsでのキーボードの使用方法 G.7 MS-Windowsでのマウスの使用方法 G.8 Windows 9X/MEおよびWindows NT/2000/XP/Vista/7/8/10でのサブプロセス G.9 MS-Windowsでの印刷 G.10 MS-Windowsでのフォント指定 G.11 その他のWindows固有の機能 G.12 EmacsとMS-DOS G.12.1 MS-DOSでのキーボードの使用方法 G.12.2 MS-DOSでびマウスの使用方法 G.12.3 MS-DOSでの表示 G.12.4 MS-DOSでのファイル名 G.12.5 印刷とMS-DOS G.12.6 MS-DOSでの国際化サポート G.12.7 MS-DOSでのサブプロセス The GNU Manifesto What’s GNU? Gnu’s Not Unix! Why I Must Write GNU Why GNU Will Be Compatible with Unix How GNU Will Be Available Why Many Other Programmers Want to Help How You Can Contribute Why All Computer Users Will Benefit Some Easily Rebutted Objections to GNU’s Goals Glossary Acknowledgments Key (Character) Index Command-Line Options Index Command and Function Index Variable Index Concept Index The Emacs Editor **************** Emacsは、拡張可能で、カスタマイズ可能な、セルフドキュメント方式のリアル タイム画面エディターです。このinfoファイルでは、Emacsでの編集方法や Emacsのカスタマイズ方法について説明します。GNU Emacs 26.2に対応します。 これをEmacsで読んでいる場合、Infoドキュメントシステムの基本的な手引き を読むには、‘h’とタイプします。 Emacsの拡張に関しては、*note Emacs Lisp: (elisp)Top.を参照してくださ い。 This is the ‘GNU Emacs Manual’, updated for Emacs version 26.2. Copyright © 2016–2019 ayatakesi Copyright © 1985–1987, 1993–2019 Free Software Foundation, Inc. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “The GNU Manifesto,” “Distribution” and “GNU GENERAL PUBLIC LICENSE,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.” (a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.” ディストリビューション ********************** GNU Emacsは“free software(フリーソフトウェアー、自由なソフトウェアー)”で す。これはすべての人が自由に使用でき、特定の条件の元に自由に再配布できる ことを意味します。GNU Emacsはパブリックドメイン(public domain: 特許権の 消滅状態)ではありません。copyright(版権)されており、配布については制限が あります。しかし、それらの制限は良き共同的な市民(good cooperating citizen)が行ないたいと欲するであろう、すべてのことを許すようデザインされ ています。なにが許されていないか、それはあなたから取得するかもしれない GNU Emacsの任意のバージョンの更なる共有を妨げる試みです。これの正確な条 件はEmacsのGNU General Public Licenseで見ることができ、このマニュアルに も記載されています(1)。 *note Copying::を参照してください。 GNU Emacsのコピーを入手する1つの方法は、それを所有する他の誰かから入 手する方法です。これを行なうための許可を求めたり、他の誰かに告げる必要は ありません。ただコピーするだけです。インターネットへアクセスできるなら、 匿名FTPからGNU NEmacsの最新のディストリビューションバージョンを入手でき ます。わたしたちのウェブサイトについての詳細は、 を参照してください。 コンピューターを購入したときに、GNU Emacsを入手するかもしれません。コ ンピューター業者は、他のすべての人に適用されるのと同じ条件で、コピーを自 由に配布できます。これらの条件は、コンピューター業者がソースにたいして行 なった変更を含む完全なソースをあなたに与えることと、General Public Licenseの通常の条件の下に、入手したGNU Emacsをあなたが再配布できることを 要求します。言い換えると、そのプログラムはあなたが入手したときはフリーで なければならず、業者にとっては単にフリーという訳ではありません。 GNU Emacsが有用だと思ったら、わたしたちの作業をサポートするために、ど うかFree Software Foundationに*寄付を送ってください*。合衆国ではFree Software Foundationへの寄付は、税金が控除されます。職場でGNU Emacsを使用 している場合は、どうかその企業に寄付を行なうよう提案してください。寄付を するには、を参照してください。あなたが手助け できる他の方法については、を参照して ください。 わたしたちは、このマニュアルと、Robert J. Chassellによる‘An Introduction to Programming in Emacs Lisp’のハードコピーも販売しています 。あなたは、わたしたちのオンラインショップを訪れ ることができます。販売による収益は、Free Software Foundationの目的 — す なわち新しいソフトウェアーの開発、GNU Emacsを含む既存のプログラムの改良 をサポートします。 Free Software Foundationに連絡する必要がある場合は、 を参照するか、下記に手紙を送ってくだ さい Free Software Foundation 51 Franklin Street, Fifth Floor Boston, MA 02110-1301 USA ---------- Footnotes ---------- (1) このマニュアル自身はGNU Free Documentation Licenseにより保護され ています。このライセンスの精神はGeneral Public Licenseと同様ですが、より ドキュメントに適したものです。*note GNU Free Documentation License::を参 照してください。 イントロダクション ****************** あなたはEmacsのマニュアル読んでいるところです。Emacsは、セルフドキュメン ト方式で、カスタマイズ可能で、拡張可能エディターであり、GNUの先進性を具 現化したものです( GNU (GNU’s Not Unix) の‘G’は発音します)。 Emacsは“先進的(advanced)”であるというのは、単純な挿入と削除だけでなく 、プロセスの制御、プログラムのインデントの自動化、複数ファイルの同時表示 、整形済みテキストの編集、文字、単語、行、文、段落、ページを扱うのと同様 に、異なるプログラミム言語の式やコメントを扱う機能なども提供するからです 。 “セルフドキュメント方式(Self-documenting)”とは、いつでも“ヘルプコマン ド”として知られる、特別なコマンドを使うことができることです。これはどの ようなオプションがあるのか、コマンドが何をするのかを見つけたり、与えられ たトピックと関連するすべてのコマンドを見つけることができるコマンドです。 *note Help::を参照してください。 “カスタマイズ可能(Customizable)”とは、シンプルな方法でEmacsコマンドの 動作を簡単に変更できるということです。たとえば、‘<**’で始まり‘**>’で終わ るようなコメントのプログラム言語を使っている場合は、Emacsのコメント操作 コマンドに、これらの文字列を使うように指示できます(*note Comments::を参 照してください)。別の例としては、カーソル動作(上下左右)を再編成して使い やすくカスタマイズできます。*note Customization::を参照してください。 “拡張可能(Extensible)”とは、単純なカスタマイズではなく、まったく新し いコマンドを作成できるということです。新しいコマンドは、Emacs自身の Lisp処理系で動作する、Lisp言語でプログラムを記述されます。既存のコマンド は、編集を行なっている最中でさえ、Emacsを再起動することなく再定義できま す。Emacsのほとんどの編集コマンドはLispで記述されています。Lispで記述す ることも可能ですが、効率のためにCで記述されているものもあります。拡張機 能の記述はプログラミングですが、プログラマーでない人も後でそれを使うこと ができます。もしあなたがEmacs Lispを学びたければ、*note Emacs Lisp Intro: (eintr)Top.を参照してください。 1 画面の構成 ************ Xウィンドウシステムを使うGNU/Linuxのようなグラフィカルなディスプレーの場 合、Emacsはグラフィカルなウィンドウに表示されます。テキスト端末の場合、 Emacsは端末スクリーン全体を表示領域として使います。Emacsが占有する画面ス クリーンや、グラフィカルなウィンドウを指して、“フレーム(frame)”という用 語を使用します。Emacsの振る舞いは、どちらのフレームでも同じです。通常は 1個のフレームだけで始まりますが、必要ならば新たにフレームを作れます (*note Frames::を参照)。 それぞれのフレームにはいくつかの領域が含まれています。いちばん上のフ レームは“メニューバー(menu bar)”で、メニューにある一連のコマンドにアクセ スできます。グラフィカルなディスプレーでは、メニューバーのすぐ下に“ツー ルバー(tool bar)”があり、アイコンをクリックすることにより編集コマンドを 実行できます。いちばん下のフレームは“エコーエリア(echo area)”で、メッセ ージが表示されたり、Emacsが入力を求める際に使用されます。 (もしあれば)ツールバーの下とエコーエリアの間の、フレームの主要な領域 の部分を、“ウィンドウ(the window)”といいます。このマニュアルでは“ウィン ドウ”という言葉を、上記のような場合に使います。グラフィカルなディスプレ ーのシステムでは、“ウィンドウ”という言葉を違う意味で用いますが、上述した とおり、そのようなグラフィカルなウィンドウのことは、“フレーム”と呼ぶこと にします。 Emacsのウィンドウには、“バッファー(buffer)” — 編集、または閲覧してい るテキストやグラフィック — が表示されます。グラフィカルなディスプレーで は、ウィンドウの片側に“スクロールバー(scroll bar)”あり、これを使ってバッ ファー内をスクロールできます。ウィンドウのいちばん下の行は、“モードライ ン(mode line)”です。これには保存されてない変更や、使用されている編集モー ド、現在のライン番号など、バッファーについての様々な情報が表示されます。 Emacsを起動すると、通常フレームには1つのウィンドウが表示されます。し かしこのウィンドウを水平方向、または垂直方向に分割して複数のウィンドウを 作成し、それぞれ異なるバッファーを表示することもできます(*note Windows::を参照)。 どんな時でも、1つのウィンドウが“選択されたウィンドウ(selected window)”となります。グラフィカルなディスプレーでは、選択されたウィンドウ には目立つカーソル(通常は塗りつぶされて点滅している)が表示され、他のウィ ンドウには目立たないカーソル(通常はぬりつぶされていない四角)が表示されま す。テキスト端末では、選択されたウィンドウのカーソルだけが表示されます。 選択されたウィンドウ上に表示されているバッファーを、“カレントバッファー (current buffer)”と呼び、それが編集が行われているバッファーとなります。 多くのEmacsコマンドはカレントバッファーに暗黙に適用され、選択されてない ウィンドウに表示されているテキストは参照用に使用します。もしグラフィカル なディスプレーで複数のフレームを使っている場合、特定のフレームを選択する と、そのフレームのウィンドウが選択されます。 1.1 ポイント ============ カーソルは、選択されたウィンドウで多くの編集コマンドが作用する場所を示し 、その場所を“ポイント(point)”(1)と呼びます。多くのEmacsコマンドはポイン トをテキスト中で移動し、テキスト中のさまざまな箇所で編集できるようにしま す。マウスのボタン1(通常は左ボタン)をクリックしても、ポイントを移動でき ます。 デフォルトでは、選択されたウィンドウ上にある、塗りつぶされたボックス のカーソルは文字の_上_に表示されますが、ポイントは2つの文字の_間_にある と考える必要があります。つまりポイントは、カーソルが重なっている文字の _前_にあります。たとえば、‘frob’というテキストで、‘b’にカーソルがある場 合、ポイントは‘o’と‘b’の間にあります。その位置に‘!’という文字を挿入する と、‘fro!b’という結果になり、ポイントは‘!’と‘b’の間にあります。つまりカ ーソルは‘b’の上にあり、実行前と同じです。 Emacsでいくつかのファイルを編集して、各ファイルがそれぞれ専用のバッフ ァーにある場合、各バッファには独自のポイント位置があります。バッファーが 表示されていなくても、後で表示されるときに備えて、ポイント位置を記録して います。1つのフレームに複数のウィンドウがある場合、各ウィンドウには独自 のポイント位置があります。 Emacsがカーソルをどのように表示するか制御する方法については、*note Cursor Display::を参照してください。 ---------- Footnotes ---------- (1) “point”という用語は、文字‘.’に由来します。この文字は、現在ポイン トと呼んでいる値を参照するためのTECO(オリジナルのEmacsを記述していた言語 )のコマンドです。 1.2 エコーエリア ================ フレームの1番下の行は、“エコーエリア(echo area)”です。ここは、いろいろな 目的向けの短いテキスト表示に使われます。 エコーエリアという名前は、あなたが打った文字が“エコーされる”ことが由 来で、これは複数の文字からなるコマンドが表示されることを意味します。1文 字のコマンドをエコーすることはありません。複数の文字からなるコマンド (*note Keys::を参照)の途中で、入力中に1秒以上間を置くとエコーされます。 Emacsはそれまでに入力されたコマンドの文字を表示し、ユーザーに残りの文字 の入力を促します。いったんエコーが始まると、コマンドの残りは、打つと同時 にただちにエコーされます。これは、タイプに自信のあるユーザーには速い応答 を提供する一方で、自信のないユーザーには最大限のフィードバックを与えるた めの機能です。 エコーエリアは、コマンドを実行できなかったときに、“エラーメッセージ (error message)”を表示するためにも使用されます。エラーメッセージと共に、 ビープ音が鳴ったり、画面が点滅する場合もあります。 エコーエリアに有用なメッセージを表示するコマンドもあります。これらの “有用”なメッセージは、エラーメッセージによく似ていますが、ビープ音を伴わ ず点滅もしません。たとえば、コマンド‘C-x =’(を押したまま‘x’をタイ プし、を離してから‘=’をタイプします)は、テキスト中のポイントの文字 位置と、ウィンドウの現在の列位置を示すメッセージを表示します。処理に時間 のかかるコマンドでは、実行中に‘...’(どの程度進行したかをパーセント表示で 示す場合もあります)で終わるメッセージをエコーエリアに表示し、完了時には ‘done’を最後に付け加えることがよくあります。 エコーエリアに表示される有益なメッセージは、‘*Messages*’と呼ばれる特 別なバッファーに保存されます(まだバッファーについては説明していませんが 、詳細は*note Buffers::を参照)。画面上に短時間しか表示されないメッセージ を見逃してしまった場合には、‘*Messages*’バッファーに切り替えて、もう一度 そのメッセージを見ることができます。‘*Messages*’のサイズは、ある行数に制 限されています。変数‘message-log-max’は、その行数を指定します(まだ変数に ついては説明していませんが、詳細は*note Variables::を参照)。いったんバッ ファーがこの行数を超えると、最後に1行加わるごとに先頭の1行を削除します。 Emacsがエコーエリアをどのように使用するか制御するオプションについては 、*note Display Custom::を参照してください。 エコーエリアは“ミニバッファー(minibuffer)”の表示にも使われます。これ は、編集しようとするファイル名のような、コマンドへの引数を読むのに使われ るウィンドウです。ミニバッファーが使用されているとき、エコーエリアには “プロンプト文字列(prompt string)”で始まるテキストが表示され、エコーエリ アが一時的に選択されたウィンドウとなり、カーソルもその行に表示されます。 ‘C-g’を打つと、いつでもミニバッファーから抜けられます。*note Minibuffer::を参照してください。 1.3 モードライン ================ ウィンドウの最後の行は“モードライン(mode line)”で、そのウィンドウで何が 進行しているか表示します。ウィンドウが1つしかない場合、モードラインはエ コーエリアのすぐ上に表示されます。フレームでは最後から2番目の行になりま す。グラフィカルなディスプレーでは、モードラインは立体的に描画されます。 通常、Emacsは目立つように選択されたウィンドウのモードラインを、選択され ていないウィンドウと異なるカラーで描画します。 モードラインに表示されるテキストは以下の書式です: CS:CH-FR BUF POS LINE (MAJOR MINOR) テキスト端末では、上記テキストの後ろからウィンドウの右端まで一連のダッシ ュ表示されます。これらのダッシュはグラフィカルなディスプレーでは省略され ます。 CSとその後ろのコロンは、カレントバッファーのキャラクターセットと改行 の規則を説明しています。通常Emacsはこれらの設定を自動的に処理しますが、 このメッセージが便利なときもあります。 CSはバッファーのキャラクターセットを説明します(*note Coding Systems::を参照)。もしこれがダッシュ(‘-’)の場合、特定のキャラクターセッ トの処理が行われていないことを意味します(例外として、以降で説明する行末 規則があります)。‘=’の場合は、変換が行われていないことを意味し、通常はテ キストに非テキストデータが含まれているときに使用されます。他の文字はさま ざまな“コーディングシステム(coding systems)” — たとえば‘1’はISO Latin-1を 表します。 テキスト端末ではCSの前に追加で2つの文字が表示され、それによりキーボー ド入力と端末出力のコーディングシステムが示されます。さらに何らかの入力メ ソッドを使用している場合は、CSの前に入力メソッドを識別する文字列が表示さ れます(*note Input Methods::を参照)。 CSの後ろの文字は、通常コロンです。もし違う文字が表示されている場合、 それはファイルのエンコーディングに特別な行末規則が使われていることを意味 します。通常ファイル内のテキストの各行は“改行文字(newline characters)”で 区切られていますが、他の2つの規則が使われる場合もあります。MS-DOSのファ イルを編集する場合にはキャリッジリターン(carriage-return)とラインフィー ド(linefeed)が使われ、コロンではなくバックスラッシュ(‘\’)または ‘(DOS)’(オペレーティングシステムに依存する)が表示されます。古いマッキン トッシュシステムのファイルでは、改行文字の代わりにキャリッジリターン (carriage-return)が使われ、そのような場合コロンではなくスラッシュ(‘/’)ま たは‘(Mac)’が表示されます。いくつかのシステムでは行の区切りとして改行文 字を使う場合、コロンではなく‘(Unix)’と表示されます。 ‘emacsclient’ (*note Invoking emacsclient::を参照)で作成されたフレー ムでは、次の文字に‘@’が表示されます。これは通常、デーモン(*note Emacs Server::を参照)として実行中のEmacsプロセスのフレームにたいして表示されま す。 モードラインの次の要素はCHで示される文字列です。2つのダッシュ(‘--’)が 表示されている場合、ウィンドウに表示されているバッファーとディスク上のフ ァイルの内容が同じことを意味し、たとえばバッファーが未変更(unmodified)の 場合です。バッファーが変更されている場合には2つの星印(‘**’)が表示されま す。読み出し専用のバッファーの場合には、バッファーが編集されている場合に は‘%*’になり、バッファーが編集されていない場合には‘%%’となります。 通常、CHの後ろの文字はダッシュ(‘-’)です。しかしカレントバッファーの ‘default-directory’ (*note File Names::を参照)がリモートマシン上(*note File Names::を参照)にある場合、かわりに‘@’が表示されます。 FRは選択されているフレームの名前です(*note Frames::を参照)。これはテ キスト端末でだけ表示されます。フレーム名の初期値は‘F1’です。 BUFは、ウィンドウに表示されているバッファーの名前です。通常は編集中の ファイル名と同じです。*note Buffers::を参照してください。 POSはウィンドウの上またはウィンドウの下に、まだテキストがあるかを知ら せます。もしバッファーが小さくてウィンドウに全体が表示されている場合、 POSには‘All’が表示されます。そうではなくバッファーの一部が表示されている ときには、バッファーの先頭が表示されている場合には‘Top’、バッファーの最 後が表示されている場合には‘Bot’、‘NN%’と表示されている場合、NNはウィンド ウの上部がバッファーのどこかをパーセント表示したものです。Size Indication(サイズ表示)モードでは、バッファー全体のサイズを表示できます。 LINEは、‘L’のあとに現在ポイントがある行の番号が続いたものです(Column Number(列番号)モードをオンにすると、現在の列番号も表示できます。*note Optional Mode Line::を参照)。 MAJORは、そのバッファの“メジャーモード(major mode)”の名前です。メジャ ーモードはバッファーを編集する際の主要なモードで、Textモード、Lispモード 、Cモードなどがあります。*note Major Modes::を参照してください。メジャー モード名の後ろに追加の情報を表示するメジャーモードもあります。たとえば Compilation buffer(コンパイルバッファー)やShell buffer(Shellバッファー )などは、サブプロセスの状態を表示します。 MINORは有効になっている“マイナーモード(minor modes)”の一覧で、上位の メジャーモードに追加の機能を提供するための編集モードです。*note Minor Modes::を参照してください。 いくつかの機能は、それらが本当はマイナーモードではなくても、有効にな っていればマイナーモードの一覧とともに表示されます。‘Narrow’は、表示中の バッファーが、そのテキストの一部のみを編集するように制限されていることを 示します(*note Narrowing::を参照)。‘Def’は、キーボードマクロを定義中であ ることを示します(*note Keyboard Macros::を参照)。 さらにEmacsが再帰編集(recursive edit)にあるときには、モードを囲んでい るカッコの周りに角カッコ(‘[...]’)が現れます。再帰編集中も別の再帰編集に 入ると、角カッコは2重になります。再帰編集は、特定のバッファにだけ関係す るものではなく、Emacs全体に影響するので、角カッコはすべてのウィンドウの モード行に表示されるか、まったく表示されないのどちらかです。*note Recursive Edit::を参照してください。 モードラインの外観は、その内容の書式と同様、変更できます。*note Optional Mode Line::を参照してください。さらにモードラインはマウスに反応 します。モードラインの違う部分をクリックすることでさまざまなコマンドを実 行できます。*note Mode Line Mouse::を参照してください。また、モードライ ンのマウス感応範囲上でマウスポインターをホバリングすると、モードライン上 でクリックして呼び出すことができるコマンドに関する情報を表示するツールチ ップ(*note Tooltips::を参照)が表示されます。また、モードラインのマウスセ ンシティブ(mouse-sensitive: マウス感応)な部分の上にマウスをホバリングす ると、モードライン上をクリックして呼び出せるコマンドに関する情報がツール チップ(*note Tooltips::を参照)が表示されます。 1.4 メニューバー ================ 各Emacsフレームには通常、最上部に“メニューバー(menu bar)”があり、よく使 われる操作を実行するために使用できます。これはあなた自身で簡単に確かめら れますから、ここではそれらを列挙する必要はないでしょう。 マウスをサポートするディスプレー上では、マウスを使ってメニューバーか らコマンドを選ぶことができます。メニューアイテムの後にある右矢印は、その アイテムに“サブメニュー(submenu)”があることを示します。アイテムの最後に ‘...’がある場合は、コマンドを実際に実行する前に、そのコマンドがキーボー ドから引数を読み取ることを意味します。 メニューのコマンドの中には、他のコマンドと同様、キーが割り当てられて いるものもあります。そのような場合、メニューのアイテムの後にキーバインデ ィングが表示されます。メニューアイテムの完全なコマンド名や説明文を見るに は、‘C-h k’とタイプしてから、通常どおりにマウスでメニューバーを選択して ください(*note Key Help::を参照)。 マウスを使う代わりに(コマンド‘menu-bar-open’を実行します)を押せ ば、メニューバーの最初のアイテムを呼び出すことができます。その後は矢印キ ー、または‘C-b’と‘C-f’(左右)、‘C-p’と‘C-n’(上下)でメニュー操作できます。 選択されたメニューアイテムを起動するときは、メニュー操作をキャンセ ルするときは‘C-g’か‘ ’を押します。(ただし、GUIツールキッ トとともにビルドされたEmacsでは、メニューはそのツールキットにより描画お よび制御され、メニュー操作をキャンセルするキーシーケンスは上記の説明とは 異なるかもしれません。) テキスト端末では、エコーエリアからメニューバーのメニューにアクセスす ることもできます。これを行うには、変数‘tty-menu-open-use-tmm’をカスタマ イズして、非‘nil’値にします。その後はをタイプするとメニューをドロッ プダウンせずに、コマンド‘tmm-menubar’が実行されます(‘M-`’は常に ‘tmm-menubar’を呼び出します)。‘tmm-menubar’では、キーボードでメニューア イテムを選択できます。暫定的な候補がエコーエリアに表示されるので、上矢印 か下矢印でメニューの異なるアイテムを表示し、を押せばアイテムを選択 できます。各メニューアイテムを文字か数字で指定することもできます(通常メ ニューアイテム名のイニシャル)。この文字または数字とアイテム名は‘==>’で区 切られています。アイテムの文字または数字を押せばアイテムを選択することが できます。 2 ユーザー入力の種類 ******************** GNU Emacsは、主にキーボードを使うようにデザインされています。マウスを使 ってメニューバーやツールバーの編集コマンドを実行することはできますが、キ ーボードを使う場合に比べて効率的ではありません。したがって、このマニュア ルには主にキーボードで編集する方法を記します。 Emacsにたいするキーボード入力は、ASCIIを大きく拡張したバージョンが基 本となっています。‘a’、‘B’、‘3’、‘=’や空白文字()と表記します)などの 単純な文字は、それぞれに対応するキーをタイプして入力します。などの制御文字なども、この方法 で入力できますし、非英語キーボードの特定の文字も同様です(*note International::を参照)。 Emacsは“修飾キー(modifier keys)”を用いて入力された制御文字も認識しま す。よく使用される修飾キーは、(通常)というラベル)と、 (通常(1)というラベル)の2つです。たとえば、‘Control-a’は を押したままで‘a’を押して入力しますが、これを短く‘C-a’と記します。 同様に、‘-a’または短く‘M-a’は、を押したまま‘a’を押すことです 。修飾キーは英数文字以外のキーにも適用できます。例: ‘C-’、‘M-で始まる2文字キーシーケンスを使って、Meta文字を入力することもで きます。したがって‘M-a’を‘ a’と入力することができます。 ‘C-M-a’(を両方押しながら‘a’を押下)は‘ C-a’と入力できま す。と違い、は切り離された文字です。次の文字を押すときを 押しっぱなしにするのではなく、を押して離してから次の文字を入力しま す。この機能はキーをあてにできない、一部のテキスト端末で有用です。 グラフィカルなディスプレーでは、ウィンドウマネージャーが‘M-’、 ‘M-’、‘C-M-d’、‘C-M-l’などのキーボード入力をブロックするかもしれま せん。このような問題がある場合、ウィンドウマネージャーがこれらのキーをブ ロックしないようにカスタマイズしたり、影響を受けるEmacsのコマンドをリバ インド(rebind)したりできます(*note Customization::を参照)。 単純な文字や制御文字、同様にマウスのクリックなどの非キーボード入力は 、総じて“入力イベント(input events)”と呼ばれます。Emacsが内部で入力イベ ントをどのように処理するかについての詳細は、*note (elisp)Input Events::を 参照してください。 ---------- Footnotes ---------- (1) 歴史的な理由により、のことをという名前で参照します。 3 キー ****** Emacsコマンドには、ただ1つの入力イベントで呼び出されるものが、いくつかあ ります。たとえば‘C-f’はバッファーを1文字前方に移動します。他のコマンドは 、‘C-x C-f’や‘C-x 4 C-f’のように、2つ以上の入力イベントにより呼び出され ます。 “キーシーケンス(key sequence)”、短く書くと“キー(key)”は、1つの単位と して考えることのできる、1つまたはそれ以上の一連の入力イベントの集まりの ことです。もし、あるキーシーケンスがコマンドを呼び出すような場合、それを “コンプリートキー(complete key)”と呼ぶことにします。たとえば‘C-f’、‘C-x C-f’、‘C-x 4 C-f’などはコンプリートキーです。もし、あるキーシーケンスが コマンドを呼び出すほど十分長くないとき、それを“プレフィクスキー(prefix key)”と呼ぶことにします。たとえば前の例でいうと、‘C-x’や‘C-x 4’はプレフ ィクスキーです。すべてのキーシーケンスは、コンプリートキーかプレフィクス キーのどちらかになります。 プレフィクスキーは、その後の入力イベントと組み合わせて、もっと長いキ ーシーケンスを作るためのものです。たとえば‘C-x’ はプレフィクスキーなので 、‘C-x’と入力しただけではコマンドは呼び出されません。かわりにEmacsは更な る入力を待ちます(もし1秒以上入力がない場合、入力を促すために‘C-x’がエコ ーされます。*note Echo Area::を参照)。‘C-x’は、それに続く次の入力イベン トと組み合わされる、2イベントのキーシーケンスで、それはプレフィクスキー (‘C-x 4’)など)のときもあれば、コンプリートキー(‘C-x C-f’など)のときもあ ります。キーシーケンスの長さに制限はありませんが、実際に3つ、4つ以上の入 力イベントの場合は、ほとんどありません。 コンプリートキーに入力イベントを付け加えることはできません。たとえば 、‘C-f’はコンプリートキーなので、2イベントのシーケンス‘C-f C-k’は、1つで はなく2つのキーシーケンスです。 デフォルトではEmacsのプレフィクスキーは‘C-c’、‘C-h’、‘C-x’、‘C-x ’、‘C-x @’、‘C-x a’、‘C-x n’、‘C-x r’、‘C-x v’、‘C-x 4’、‘C-x 5’、 ‘C-x 6’、、‘M-g’、‘M-o’です(は、‘C-h’と‘C-x 6’のエイリア スです)。このリストは不変のものではありません。Emacsをカスタマイズすれば 、新しいプレフィクスキーを作ることができます。標準のプレフィクスキーを無 効にすることさえできますが、これはほとんどのユーザーにたいして推奨はでき ません。たとえばプレフィクス定義‘C-x 4’を削除すると、‘C-x 4 C-f’は無効な キーシーケンスになります。*note Key Bindings::を参照してください。 プレフィックスキーのあとにヘルプ文字(‘C-h’や)を押すと、そのプレフ ィックスで始まるコマンド一覧を表示できます。唯一の例外はです。 ‘ C-h’は‘C-M-h’と同じで、これは何かまったく別のことを行うコマンドで す。しかしならば、で始まるコマンドの一覧を表示できます。 4 キーとコマンド **************** このマニュアルは、特定のキーが何を行うかを説明するページばかりです。しか し、Emacsは直接キーに意味を与えてはいません。そのかわりに、Emacsは名前を 付けた“コマンド(commands)”に意味を持たせ、キーとコマンドを“バインディン グ(binding)”することによって、キーに意味を与えています。 すべてのコマンドには、プログラマーが選んだ名前が付いています。名前は 、たとえば‘next-line’、‘forward-word’のように、いくつかの英単語をダッシ ュで区切って作られます。内部的には、それぞれのコマンドはLispの“関数 (function)”の特別な型で、コマンドに関連付けられたアクションは、関数を実 行することによって機能します。*note What Is a Function: (elisp)What Is a Function.を参照してください。 キーとコマンドの間のバインディングは、“keymaps”というテーブルに記憶さ れます。*note Keymaps::を参照してください。 “‘C-n’は下に1行動きます”という言い方は、通常の使用では関係ないものの 、Emacsをカスタマイズする上では重要になる点を隠蔽しています。1行下に移動 するコマンドは‘next-line’です。‘C-n’が‘next-line’にバインドされているか ら効果があるのです。もし‘C-n’をコマンド‘forward-word’にリバインドしたら 、‘C-n’で1語前方に動くことになります。 厳密に言えばキーはコマンドにバインドされているだけですが、このマニュ アルでは‘C-n’をコマンドであるかのような言い回しをするときがあります。そ のようなときは、処理を実行させるキーの後ろに、本当に処理を行うコマンドの 名前をカッコ内に記します。たとえば、“コマンド‘C-n’ (‘next-line’)は、ポイ ントを垂直下方に移動します”というときは、コマンド‘next-line’がポイントを 垂直下方に移動し、それは通常‘C-n’にバインドされている、ということを意味 します。 カスタマイズについて議論したので、“変数(variables)”にもふれておくべき でしょう。コマンドの説明で、“これを変更する場合、変数 ‘mumble-foo’をセッ トしてください”というときがあります。変数とは、値を保存するときに使用す る名前のことです。このマニュアルに記載されている変数は、ほとんどがカスタ マイズに関するものです。いくつかのコマンド、およびEmacsのある部分は、変 数を調べてその変数にセットされた値により、動作がかわります。カスタマイズ に興味がでるまでは、、変数に関する情報は無視してかまいません。その後で変 数(*note Variables::を参照)の基本を読めば、特定の変数についての情報に合 点がいくでしょう。 5 Emacsの起動 ************* Emacsを呼び出す通常の方法は、シェルコマンド‘emacs’です。GUI端末上で実行 されるUnixシェルからは、‘emacs &’によりEmacsをバックグラウンドで実行でき ます。この方法だとEmacsが端末ウィンドウに結びつけられないため、他のシェ ルコマンドを実行できます(MS-WindowsでEmacsを開始する方法については、 *note Windows Startup::を参照)。 Emacsを起動すると、初期フレームは‘*GNU Emacs*’という名前の特別なバッ ファーを表示します。この“スタートアップ画面(startup screen)”には、 Emacsについての情報と、初心者にとって便利な一般的タスクへのリンクが含ま れています。たとえば‘Emacs Tutorial’というリンクはEmacsのチュートリアル を開きます。これはコマンド‘C-h t’ (‘help-with-tutorial’)と同じです。リン クをアクティブにするには、ポイントをそこに動かして‘’をタイプするか 、‘mouse-1’(マウスの左ボタン)をクリックしてください。 コマンドライン引数を使うと、Emacsが起動直後に1つ以上のファイルをアク セスするよう指示できます。たとえば‘emacs foo.txt’は、‘foo.txt’の内容を表 示するバッファーとともにEmacsを起動します。これは他のエディターとの互換 性により存在する機能で、シェルから短い編集セッションを始めるときのために デザインされています。Emacsをこの方法で呼び出すと、初期フレームは2つのウ ィンドウに分割されます。1つは指定されたファイルで、もう1つはスタートアッ プ画面です。*note Windows::を参照してください。 一般的に、ファイルを編集するたびに新たにEmacsを起動するのは不必要で無 駄です。Emacsを使うときの推奨方法は、Emacsを1度だけ起動する方法で、ログ インしたら起動して、同じEmacsセッションですべての編集作業を行うのです。 1つ以上のファイルをアクセスする方法は、*note Files::を参照してください。 この方法でEmacsを使うと、Emacsのセッションはキルリング(kill ring)、レジ スター(registers)、アンドゥヒストリー(undo history)、マークリング(mark ring)などの、値をもつコンテキストを蓄積するので、これを共有すれば編集が より快適になります。これらの機能については、このマニュアルの後で説明しま す。 Emacsを実行中に、他のプログラムからファイルを編集する場合、既存の Emacsセッションのファイルを開くために、‘emacsclient’というヘルパープログ ラムを使うことができます。*note Emacs Server::を参照してください。 コマンドライン引数を使って、EmacsにLispファイルをロードして初期フレー ムに適用させたりできます。*note Emacs Invocation::を参照してください。 変数‘inhibit-startup-screen’が非‘nil’の場合、Emacsはスタートアップ画 面を表示しません。この場合、コマンドラインに1つ以上のファイルが指定され ていれば、Emacsは単にそれらのファイルを表示し、指定されていないときは Lispの式を対話的に評価できる、‘*scratch*’という名前のバッファーを表示し ます。*note Lisp Interaction::を参照してください。変数 ‘inhibit-startup-screen’のセットは、Emacsのカスタマイズ機能(*note Easy Customization::を参照してください)を使うか、初期設定ファイル(*note Init File::を参照してください)を編集して行うことができます。(1) 変数‘initial-buffer-choice’にファイルやディレクトリーの名前をセットす ることにより、Emacsのスタートアップ時にファイルやディレクトリーを表示さ せることもできます。‘initial-buffer-choice’の値に、その後に表示するバッ ファーを戻す関数(引数なし)をセットすることもできます。 ‘initial-buffer-choice’が非‘nil’の場合、コマンドラインにファイルを指定し ても、それらのファイルは表示されますが、初期画面としては表示されません。 ---------- Footnotes ---------- (1) ‘site-start.el’の中で‘inhibit-startup-screen’をセットしても機能し ません。なぜならスタートアップ画面は‘site-start.el’が読み込まれる前にセ ットアップされるからです。‘site-start.el’についての情報は、*note Init File::を参照してください。 6 Emacsからのexit ***************** ‘C-x C-c’ Emacsをkill(終了)します。(‘save-buffers-kill-terminal’)。 ‘C-z’ テキスト端末ではEmacsをサスペンドします。グラフィカルなディスプレー では選択されたフレームをアイコン化(または“最小化”)します (‘suspend-frame’)。 Emacsを“Kill”するというのは、Emacsプログラムを終了するという意味です 。これを行うには、‘C-x C-c’ (‘save-buffers-kill-terminal’)とタイプします 。2文字キーシーケンスが使われているのは、アクシデントにより間違ってタイ プしづらくするためです。もし変更されたファイルがある場合、‘C-x C-c’をタ イプすると、Emacsとそれらのバッファーを巡回して、バッファーを保存するか 問い合わせます。それらすべてを保存しない場合、未保存の変更が失われてしま う前に、もう一度問い合わせます。サブプロセスがまだ実行中の場合にも、 Emacsをkillするとサブプロセスもkillされるので、問い合わせを行います (*note Shell::を参照してください)。 もしEmacsをサーバーとして使っている場合、‘C-x C-c’は特別に振る舞いま す。もしクライアントフレームからタイプした場合は、クライアントのコネクシ ョンをクローズします。*note Emacs Server::を参照してください。 Emacsはオプションで、killしたときに表示していたファイルなどの、セッシ ョン情報を記録することができます。この情報は次回Emacsを起動するとき利用 可能です。*note Saving Emacs Sessions::を参照してください。 変数‘confirm-kill-emacs’の値が非‘nil’の場合、‘C-x C-c’はその値が関数 だとみなして、その関数を呼び出します。その関数呼び出しの結果が非‘nil’の 場合、セッションはkillされ、そうでない場合、Emacsは実行を続けます。 ‘confirm-kill-emacs’の値として使うのに適した関数の1つが、‘yes-or-no-p’で す。‘confirm-kill-emacs’のデフォルト値は‘nil’です。 変数‘confirm-kill-processes’の値が‘nil’の場合、‘C-x C-c’はEmacsにより 開始されたサブプロセスをkillする前に確認を求めません。デフォルトでは、こ の値は‘t’です。 Emacsをexitするとき何が起こるかさらにカスタマイズするには、*note (elisp)Killing Emacs::を参照してください。 保存の問い合わせを行わずにEmacsをkillするときは、‘M-x kill-emacs’とタ イプします。 ‘C-z’は、コマンド‘suspend-frame’を実行します。グラフィカルなディスプ レーでは、このコマンドは選択されたEmacsのフレームを後で戻れるように、“最 小化”(または“アイコン化”)して隠します(どのように隠されるかはウィンドウシ ステムに依存します)。テキスト端末では、‘C-z’はEmacsを“サスペンド(休止 )”します。プログラムは一時的に停止し、制御は親プロセス(通常はシェル)に戻 ります。ほとんどのシェルではシェルのコマンド‘%emacs’で、サスペンド中の Emacsを再開できます。 テキスト端末は、通常、実行中のプログラムをkillしたりサスペンドする、 特定の特殊文字を監視しています。この端末の機能は、Emacsではオフになって います。Emacsでの‘C-z’や‘C-x C-c’のキーの意味は、いくつかのオペレーティ ングシステムでプログラムを休止させたり終了させたりするために用いる文字、 ‘C-z’と‘C-c’にヒントを得たものですが、オペレーティングシステムとの関係は それだけです。これらのキーは、他のコマンドを実行するようにカスタマイズで きます(*note Keymaps::を参照してください)。 7 基本的な編集コマンド ********************** ここではテキストの入力、修正、ファイルへの保存といった基本操作について説 明します。これらに接するのが初めてなら、learn-by-doing(行ってみることで 学ぶ)形式のチュートリアルをやってみることを提案します。チュートリアルを 行うには‘C-h t’ (‘help-with-tutorial’)とタイプしてください。 7.1 テキストの挿入 ================== 普通の“グラフィック文字(graphic character)”(例 ‘a’、‘B’、‘3’、‘=’)は、対 応するキーをタイプして挿入することができます。これによりバッファーのポイ ント位置に文字が追加されます。挿入によりポイントは前方に移動するので、ポ イントは挿入された文字の直後になります。*note Point::を参照してください 。 行を終了して新しい行を開始するには(‘newline’)を入力します(キーボ ードでキーは、、もしくは↲のような奇妙な左矢印のラ ベルがついているかもしれませんが、このマニュアルではと呼ぶことにし ます)。このコマンドは改行文字をバッファーに挿入してから、メジャーモード に基づきインデント(*note Indentation::を参照してください)を行います。ポ イントが行末にある場合には、新しく空行を作成してから新しい行をインデント します。もしポイントが行の途中にある場合、行はその位置で分割されます。自 動インデントをオフにするには、Electric Indentモード(*note Indent Convenience::を参照してください)を無効にするか、自動インデントを行わず改 行だけを挿入する‘C-j’を入力します。 マニュアルの後ろで説明しますが、“マイナーモード(minor modes)”を利用す ることにより、Emacsが挿入を処理する方法を変更できます。たとえばAuto Fillモードというマイナーモードは行が長くなりすぎたとき自動的に行を分割し ます(*note Filling::)。Overwrite modeというマイナーモードは、既存の文字 を右方に押しやるかわりに、既存の文字を置き換え(上書き)ます。*note Minor Modes::を参照してください。 対応するキーを押して挿入できるのはグラフィック文字だけです。他のキー は編集コマンドとして動作し、文字自体の挿入はしません。たとえば、デフォル トではは、コマンド‘delete-backward-char’を実行します(違うコマンドに バインドされているモードもあります)。このキーはリテラルの‘DEL’(ASCIIの文 字コード127)を入力する訳ではありません。 非グラフィック文字や、キーボードがサポートしていない文字を挿入するに は、最初に‘C-q’ (‘quoted-insert’)で文字を“クォート(quote)”します。 ‘C-q’の使い方は2つあります: • ‘C-q’に続けて非グラフィック文字(‘C-g’でさえも)をタイプすると、その 文字が挿入されます。たとえば‘C-q ’は、リテラルの‘DEL’文字を挿 入します。 • ‘C-q’に続けて8進文字のシーケンスを入力すると、8進の文字コードに対応 する文字が挿入されます。任意の8進数字を使うことができます。非8進数 字により入力は終了します。もし終了文字がの場合、は入力の 終了だけに用いられます。他の非8進文字は入力を終了させてから、通常の 入力として扱われます。つまり‘C-q 1 0 1 B’は‘AB’を挿入します。 8進数字での入力は、通常の非バイナリーのOverwriteモードでは無効にな っています。それにより上書きすることなく数字を挿入する便利な方法が 提供されます。 8進のかわりに10進や16進を使うには、変数‘read-quoted-char-radix’に、10や 16をセットします。もし基数が16の場合、‘a’から‘f’は文字コードの一部として 扱われます。大文字小文字は区別されません。 数は多くありませんが、一般的なUnicode文字は、‘C-x 8’で始まるコマンド を通じて挿入できます。たとえば‘C-x 8 [’は、『‘』を挿入します。これは Unicodeコードポイント‘U+2018’のLEFT SINGLE QUOTATION MARK(単独の左 “curved quote”、または“curly quote”と呼ばれることもあります)を挿入します 。同様に、‘C-x 8 ]’は『’』、‘C-x 8 {’は『“』、‘C-x 8 }’は『”』を挿入しま す。また、Altキーも‘C-x 8’と同じように機能します。たとえば‘A-[’は‘C-x 8 [’と同様に、『‘』を挿入します。どの文字が‘C-x 8’による短縮入力をもつかを 確認するには、‘C-x 8 C-h’とタイプしてください。 かわりにコマンド‘C-x 8 ’ (‘insert-char’)を使うこともできます。こ れはミニバッファーを使って、Unicode名かコードポイント(code-point)の入力 を求めます。もし名前を入力する時、コマンドが補完機能を提供します(*note Completion::を参照してください)。コードポイントを入力する場合、それは 16進(Unicodeの規約による)、または指定した基数の数字(例 ‘#o23072’ (octal); *note (elisp)Integer Basics::を参照してください)であるべきです 。このコマンドは対応する文字をバッファーに挿入します。 たとえば以下はすべて同じ文字を挿入します: C-x 8 left single quotation mark C-x 8 left sin C-x 8 2018 C-x 8 [ A-[ (Altキーが機能する場合) ` (Electric Quoteモードの場合) ‘C-q’または‘C-x 8 ...’への数引数は、文字のコピーを何個挿入するかを指 定します(*note Arguments::を参照してください)。 さらに加えて、あるコンテキストにおいては、`like this'のようにクォート にgrave accentとapostropheを使用した場合は、たとえ‘C-x 8’コマンドを使用 していなくても、これは1つのクォーテーションマークを使用した形式‘like this’のように変換されます。同様に、``like this''のように2重のgrave accentとapostropheを使用した場合、これはダブルクォーテーションマークを使 用した形式“like this”のように変換されます。*note Quotation Marks::を参照 してください。 7.2 ポイント位置の変更 ====================== 文字の挿入以上のことを行うには、ポイントを移動する方法について知る必要が あります(*note Point::を参照してください)。キーボードのコマンド‘C-f’、 ‘C-b’、‘C-n’、‘C-p’は、それぞれ右・左・下・上にポイントを移動します。ほ とんどのキーボードにある矢印キー — でもポイ ントを移動できます。しかし多くのEmacsユーザーは矢印キーより、コントロー ルキーのほうが速いと考えています。なぜなら矢印キーを押すためにそれらが配 置されている領域に手を動かす必要があるからです。 ポイントを移動したい場所でマウスの左ボタンをクリックしてもポイントを 移動できます。Emacsは、さらに洗練された方法でポイントを移動する、さまざ まなキーボードコマンドを提供します。 ‘C-f’ 1文字前方(forward)に移動します (‘forward-char’)。 ‘’ このコマンド(‘right-char’)は‘C-f’と同様に振る舞います。例外はポイン トのあるパラグラフがright-to-leftの場合です。*note Bidirectional Editing::を参照してください。 ‘C-b’ 1文字後方(backward)に移動します (‘backward-char’)。 ‘’ このコマンド(‘left-char’)は‘C-b’と同様に振る舞います。例外は現在の パラグラフがright-to-leftの場合です。*note Bidirectional Editing::を 参照してください。 ‘C-n’ ‘’ スクリーンに表示された行で1行下に移動します(‘next-line’)。このコマ ンドは横方向の位置を変更しないよう試みます。そのため行の途中でコマ ンドを開始すると、次の行の途中に移動することになります。 ‘C-p’ ‘’ スクリーンに表示された行で1行上に移動します(‘previous-line’)。この コマンドは‘C-n’と同様、行内の位置を保ちます。 ‘C-a’ ‘’ 行の先頭に移動します(‘move-beginning-of-line’)。 ‘C-e’ ‘’ 行の最後に移動します(‘move-end-of-line’)。 ‘M-f’ 1単語前方に移動します(‘forward-word’)。*note Words::を最終してくだ さい。 ‘C-’ ‘M-’ このコマンド(‘right-word’)は‘M-f’と同様に振る舞います。例外は現在の パラグラフがright-to-leftの場合、1語_後方_に移動することになります 。*note Bidirectional Editing::を参照してください。 ‘M-b’ 1単語後方に移動します(‘backward-word’)。*note Words::を参照してくだ さい。 ‘C-’ ‘M-’ このコマンド(‘left-word’)は‘M-b’と同様に振る舞います。例外は現在の パラグラフがright-to-leftの場合、1語_前方_に移動することになります 。*note Bidirectional Editing::を参照してください。 ‘M-r’ スクリーン上のテキストを移動させることなく、ポイントの位置をウィン ドウ上で中央にもっとも近いテキスト行の左端に移動します。連続して呼 び出すと、最上行の左端、最下行の左端へと循環的にポイントを移動しま す(‘move-to-window-line-top-bottom’)。 数引数はスクリーンの行の何行目にポイントを移動するか指定します。数 値はウィンドウの最上行から数えた行数です(0は最上行を意味します)。負 の引数は最下行から数えた行数です(−1は最下行を意味します。数引数につ いては詳細は、*note Arguments::を参照してください。 ‘M-<’ バッファーの先頭に移動します(‘beginning-of-buffer’)。数引数Nが与え られた場合、最上行からN/10に移動します。グラフィカルなディスプレイ では、‘C-’で同じことを行うことができます。 ‘M->’ バッファーの最後に移動します(‘end-of-buffer’)。グラフィカルなディス プレイでは、‘C-’で同じことを行うことができます。 ‘C-v’ ‘’ ‘’ 画面を1画面前方にスクロールします。もし必要ならポイントをスクリーン 上の位置に移動します(‘scroll-up-command’)。*note Scrolling::を参照 してください。 ‘M-v’ ‘’ ‘’ 画面を1画面後方にスクロールします。もし必要ならポイントをスクリーン 上の位置に移動します(‘scroll-down-command’)。*note Scrolling::を参 照してください。 ‘M-g c’ 数値Nを読み取り、ポイントをバッファー位置Nに移動します。1を指定する とバッファーの先頭に移動します。 ‘M-g M-g’ ‘M-g g’ 数値Nを読み、ポイントをバッファーの先頭からN行目に移動します。行に 1を指定するとバッファーの先頭に移動します。もしポイントがバッファー の数字の上または直後にある場合、その数がNのデフォルトになります。ミ ニバッファーで単にを押すと、その数が使われます。数値のプレフィ クス引数でNを指定して‘M-g M-g’に与えることもできます。単にプレフィ クス引数を与えた場合の‘M-g M-g’の動作については、*note Select Buffer::を参照してください。 ‘M-g ’ 数値Nを読み取り、現在行のN列目に移動します。列0は最左列です。プレフ ィクス引数とともに呼び出された場合、引数で指定された数の列に移動し ます。 ‘C-x C-n’ カレントバッファー内の現在ポイントがある列を‘C-n’や‘C-p’の“半恒久的 な目標列(semipermanent goal column)”として使用します。目標列が有効 な場合、これらのコマンドで垂直に移動すると、その列もしくはできる限 り近い列に移動しようと試みます。目標列はキャンセルされるまで有効で す。 ‘C-u C-x C-n’ 目標列をキャンセルします。それ以降の‘C-n’や‘C-p’は通常どおり水平位 置を保とうと試みます。 バッファーのテキストがウィンドウの幅より長い場合、通常Emacsは2行以上 の“スクリーン行(screen lines)”で表示します。便宜上、‘C-n’と‘C-p’そして ‘’と‘’も、同様にスクリーン行にしたがってポイントを移動します。 これらのコマンドを“論理行(logical lines)”(たとえばバッファーのテキスト行 )にしたがって移動させるには、‘line-move-visual’に‘nil’をセットします。そ うすると論理行が複数のスクリーン行となるような場合、カーソルは追加された スクリーン行をスキップします。詳細は*note Continuation Lines::を参照して ください。‘line-move-visual’などの変数をセットする方法については、*note Variables::を参照してください。 ‘C-n’や‘C-p’と異なり、ほとんどのEmacsコマンドは_論理的_な行に作用しま す。たとえば‘C-a’ (‘move-beginning-of-line’)や‘C-e’ (‘move-end-of-line’)は、論理行の先頭もしくは最後に移動します。‘C-n’や ‘C-p’のようにスクリーン行に作用するコマンドの場合、わたしたちはそれを示 すようにします。 ‘line-move-visual’が‘nil’の場合、変数‘track-eol’にも非‘nil’値をセット できます。そうすると論理行の行末で‘C-n’や‘C-p’を開始すると、次の論理行の 行末に移動します。通常‘track-eol’は‘nil’です。 通常‘C-n’をバッファーの最後の行で使用した場合、バッファーの最後でスト ップします。しかし変数‘next-line-add-newlines’に非‘nil’値をセットした場 合、バッファーの最後の行で‘C-n’を押すと、行を追加してその行に移動します 。 7.3 テキストの消去 ================== ‘’ ‘’ ポイントの前の文字、またはリージョンがアクティブのときはリージョン を削除します(‘delete-backward-char’)。 ‘’ ポイントの後の文字、またはリージョンがアクティブのときはリージョン を削除します(‘delete-forward-char’)。 ‘C-d’ ポイントの後ろの文字を削除します(‘delete-char’)。 ‘C-k’ 行末までkillします(‘kill-line’)。 ‘M-d’ 次の単語(word)の末尾までを前方にkillします(‘kill-word’)。 ‘M-’ ‘M-’ 前の単語の先頭までを後方にkillします(‘backward-kill-word’)。 コマンド‘’ (‘delete-backward-char’)は、ポイントの前の文字を削除 して、カーソルと後ろの文字を後方に移動します。ポイントが行の先頭にある場 合、前の改行を削除して、その行を前の行と連結します。 しかしリージョンがアクティブのとき、‘’はリージョンのテキストを削 除します。リージョンの説明は、*note Mark::を参照してください。 ほとんどのキーボードでは、にはというラベルがついてい ますが、このマニュアルではと呼ぶことにします(と混同 しないでください。についてはこの後で議論します)。いくつかのテキ スト端末では、Emacsはを正しく認識しません。もしこの問題に遭遇したと きには、*note DEL Does Not Delete::を参照してください。 コマンド (‘delete-forward-char’)は、反対方向に削除します。こ れはポイントの後ろの文字、たとえばカーソルの下の文字を削除します。ポイン トが行末にある場合は、その行を次の行と連結します。‘’と同様、リージ ョンがアクティブのときはリージョンのテキストを削除します(*note Mark::を 参照してください)。 ‘C-d’ (‘delete-char’)は、と同じようにポイントの後ろの文字を削 除しますが、リージョンがアクティブかどうかは関係ありません。 上述した削除コマンドについての詳細な情報は、*note Deletion::を参照し てください。 ‘C-k’ (‘kill-line’)は行を一度に消去(kill)します。もし行頭または行の途 中で‘C-k’とタイプすると、行末までのすべてのテキストをkillします。行末で ‘C-k’とタイプすると、その行を次の行と連結します。 ‘C-k’と関連するコマンドについては、*note Killing::を参照してください 。 7.4 変更のアンドゥ ================== ‘C-/’ ‘C-x u’ ‘C-_’ undoレコードにあるエントリーをundoします。通常1つのコマンドを元に戻 す(‘undo’)ことに相当します(1つ目のキーはテキストモードのディスプレ イでは利用できないかもしれない)。 Emacsはバッファー内のテキストに行われた変更のリストを記録しているので 、最近の変更はundoできます。これは‘C-/’(および‘C-x u’と‘C-_’)にバインド されているコマンド‘undo’を使って行われます。通常このコマンドは最後の変更 をundoして、ポイントを変更前の位置に移動します。undoコマンドはバッファー への変更のみに適用されるので、カーソルの動きをundoすることはできません。 個々の編集コマンドは、通常undoレコードの個別のエントリーとなりますが 、とても単純なコマンドはグループ化される場合があります。1つのエントリー が、実は複雑なコマンドのほんの一部の場合もあります。 もし‘C-/’(またはそれの別名コマンド)を繰り返すと、undoされた箇所はさら にundoされ、初期の変更もundoされ、ついには利用可能なundo情報の限界に達し ます。もし記録された変更がすべてundoされている場合、undoコマンドはエラー メッセージを表示して、何も行いません。 ‘undo’コマンドについてさらに学ぶには、*note Undo::を参照してください 。 7.5 ファイル ============ Emacsのバッファーに挿入したテキストは、Emacsのセッションの間だけ存在しま す。テキストを永続化させるためには、それを“ファイル(file)”に保存しなけれ ばなりません。 ホームディレクトリーに、‘test.emacs’という名前のファイルがあるとしま しょう。このファイルをEmacsで編集するには、以下を入力します C-x C-f test.emacs ここでファイル名は、コマンド‘C-x C-f’ (‘find-file’)に与えられる、“引数 (argument)”です。このコマンドは引数を読み取るために“ミニバッファー (minibuffer)”を使い、は引数を終端させます(*note Minibuffer::を参照 してください)。 このコマンドに従うために、Emacsはそのファイルを“visit(訪問)”します: す なわちバッファーを作成し、ファイル内容をバッファーにコピーし、編集のため にバッファーを表示します。テキストを変更したら、‘C-x C-s’ (‘save-buffer’)と入力することにより、ファイルを“保存(save)”できます。こ れにより変更されたバッファー内容は、‘test.emacs’に書き戻され永続化されま す。保存するまでは、テキストへの変更はEmacs内部にだけ存在し、ファイル ‘test.emacs’は変更されません。 ファイルを作成するには、すでにファイルが存在するかのように‘C-x C-f’で ファイルをvisitするだけです。これはファイルに書き込みたいテキストを入力 できる、空のバッファーを作成します。最初にこのバッファーを‘C-x C-s’で保 存するとき、Emacsは実際にファイルを作成します。 Emacsでファイルを使うことについてさらに学ぶには、*note Files::を参照 してください。 7.6 ヘルプ ========== もしキーが何をするか忘れた場合、‘C-h k’ (‘describe-key’)と入力して、それ に続けて関心のあるキーを入力します。たとえば‘C-h k C-n’は、‘C-n’が何をす るか表示します。 プレフィクスキー‘C-h’は“ヘルプ(help)”が由来です。キーは‘C-h’の別 名です。‘C-h k’以外にも、異なる種類のヘルプを提供する多くのヘルプコマン ドがあります。 詳細については、*note Help::を参照してください。 7.7 空行 ======== 空行を挿入したり削除するための、特別なコマンドとテクニックがあります。 ‘C-o’ カーソルの後ろに空行を挿入します(‘open-line’)。 ‘C-x C-o’ 連続する空行を、1行残してすべて削除します(‘delete-blank-lines’)。 これまで‘’ (‘newline’)が、どうやってテキストの新しい行を開始する のか見てきました。しかし最初に空行を作ってからテキストを挿入するほうが、 何を行っているのかわかりやすいでしょう。これはキー‘C-o’ (‘open-line’)を 使えば、簡単に行うことができます。これはポイントの後ろに改行を挿入し、ポ イントを改行の前に維持します。‘C-o’の後に新しい行のためのテキストを入力 します。 複数の空行は‘C-o’を数回入力するか、何個の空行を作るのかを数引数で与え れば作れます。方法については、*note Arguments::を参照してください。もし フィルプレフィクスがあって、行頭で‘C-o’が入力された場合、新しい行にフィ ルプレフィクスを挿入します。*note Fill Prefix::を参照してください。 余分な空行を取り除く簡単な方法は、‘C-x C-o’ (‘delete-blank-lines’)で す。連続する空行の中にポイントがあるとき、‘C-x C-o’は1行残してすべての空 行を削除します。ポイントが単独の空行にある場合、‘C-x C-o’はその空行を削 除します。ポイントが空でない行にある場合、‘C-x C-o’は、後続する空行があ れば、それらすべてを削除します。 7.8 継続行 ========== バッファー内のテキストの行 — “論理行(logical line)” — がウィンドウに収ま らないほど長い場合、Emacsがそれを2行以上の“スクリーン行(screen lines)”で 表示するときがあります。これは“行の折り返し(line wrapping)”または“継続 (continuation)”と呼ばれ、論理行は“継続された行(continued line)”と呼ばれ ます。グラフィカルなディスプレーでは、Emacsは行の折り返しをウィンドウの 左右のフリンジ(fringes、縁)の小さな曲矢印で示します。テキスト端末では、 Emacsは右の余白に‘\’を表示して行の折り返しを示します。 ほとんどのコマンドは、スクリーン行ではなく論理行にたいして作用します 。たとえば‘C-k’は論理行をkillします。前に説明したように、‘C-n’ (‘next-line’)と‘C-p’ (‘previous-line’)は特別な例外です。これらはスクリー ン行にたいしてポイントを上下に移動させます(*note Moving Point::を参照し てください)。 Emacsはオプションで長い論理行を継続するかわりに、“切り詰める (truncate)”ことができます。これは論理行が1つのスクリーン行を占めることを 意味します。もし論理行がウィンドウ幅より長い場合、行の残りは表示されませ ん。グラフィカルなディスプレーでは切り詰められた行は、右フリンジの小さな 直矢印で示されます。テキスト端末では右余白の‘$’で示されます。*note Line Truncation::を参照してください。 デフォルトでは継続行はウィンドウの右端で折り返されます。折り返しが単 語の途中で発生すると、継続された行は読むのが難しくなります。普通の解決策 は、行が長くなりすぎる前に改行を挿入することです。もしお好みなら、行が長 くなりすぎたときにEmacsが自動的に改行を挿入するように、Auto Fillモードを 使うことができます。*note Filling::を参照してください。 多くの長い論理行を含むファイルを編集する必要があり、それらすべてを改 行で分割するのが実用的でない場合があります。そのようなケースでは“単語折 り返し(word wrapping)”が有効なVisual Lineモードを使うことができます。こ れは長い行を正確にウィンドウの右端で折り返すのではなく、ウィンドウの右端 に一番近い単語境界(スペースやタブなど)で折り返します。Visual Lineモード では、‘C-a’、‘C-n’、‘C-k’などの編集コマンドも、論理行ではなくスクリーン 行を処理するように再定義されます。*note Visual Line Mode::を参照してくだ さい。 7.9 カーソル位置の情報 ====================== バッファーのある部分にたいしてサイズや位置、単語数や行数についての情報を 得るためのコマンドがあります。 ‘M-x what-line’ ポイントの行番号を表示します。 ‘M-x line-number-mode’ ‘M-x column-number-mode’ 現在の行番号および列番号の自動表示を切り替えます。*note Optional Mode Line::を参照してください。各行の前に行番号を表示したい場合は、 *note Display Custom::を参照してください。 ‘M-=’ 現在のリージョンの行数、単語数、文字数を表示します (‘count-words-region’)。リージョンについては、*note Mark::を参照し てください。 ‘M-x count-words’ 現在のバッファーの行数、単語数、文字数を表示します。リージョン (*note Mark::を参照してください)がアクティブのときは、かわりにリー ジョンの数字を表示します。 ‘C-x =’ ポイントの後ろの文字の文字コード、ポイントの文字位置、ポイントの列 位置を表示します(‘what-cursor-position’)。 ‘M-x hl-line-mode’ 現在行のハイライト表示を有効または無効にします。*note Cursor Display::を参照してください。 ‘M-x size-indication-mode’ バッファーのサイズの自動表示を切り替えます。*note Optional Mode Line::を参照してください。 ‘M-x what-line’は、エコーエリアに現在の行番号を表示します。通常このコ マンドは不必要です。なぜならモードラインに現在の行番号が、すでに表示され ているからです (*note Mode Line::を参照してください)。しかしバッファーが ナロー(narrow: 制限)されている場合、モードラインはアクセスできる範囲につ いての行番号しか表示しません(*note Narrowing::を参照してください)。それ にくらべて‘what-line’は、制限されたリージョンとバッファー全体、両方の行 番号を表示します。 ‘M-=’ (‘count-words-region’)はリージョン内の行数、単語数、文字数を報 告するメッセージを表示します(リージョンについての説明は、*note Mark::を 参照してください)。プレフィクス引数‘C-u M-=’を指定すると、このコマンドは バッファー全体の数字を表示します。 ‘M-x count-words’は同じことを行いますが、呼び出し規約が異なります。も しリージョンがアクティブの場合はリージョン、そうでない場合はバッファーの 数字を表示します。 コマンド‘C-x =’ (‘what-cursor-position’)は現在のカーソル位置と、その 位置にあるバッファー内容についての情報を表示します。エコーエリアには、以 下のような行が表示されます: Char: c (99, #o143, #x63) point=28062 of 36168 (78%) column=53 ‘Char:’には、バッファー中のそのポイントにある文字が表示されます。カッ コ内にはその文字に対応する文字コードが10進、8進、16進で表示されます。 ‘C-x =’が文字の情報について表示する方法については、*note International Chars::を参照してください。‘point=’はポイント位置を文字数(バッファーの最 初の文字は1、次の文字は2、...)で表示します。その後ろの数字ではバッファー 内の文字数の合計が表示され、カッコ内にはその位置が全体から見て何パーセン トの位置なのかが表示されます。‘column=’にはポイントの水平位置、すなわち ウィンドウの左端から数えて何番目の列かが表示されます。 もしバッファーがナローされている場合、最初と最後の部分のテキストが一 時的にアクセス不能になります。‘C-x =’は現在アクセス可能な範囲についての 追加説明を表示します。たとえば以下のように表示します: Char: C (67, #o103, #x43) point=252 of 889 (28%) <231-599> column=0 ここで、新たに追加された2つの数字が、ポイントを設定できる文字位置の下限 と上限を示します。これら2つの位置のあいだの文字が参照可能な文字です。 *note Narrowing::を参照してください。 関連はあるものの異なる機能が‘display-line-numbers-mode’(*note Display Custom::を参照)です。 7.10 数引数 =========== 数学や計算機の用語では、引数(argument)という単語は、“関数や操作に与える データ”を意味します。Emacsのコマンドには、数引数(numeric argument)(プレ フィクス引数(prefix argument)とも呼ぶ)を指定できるものがあります。引数を 反復回数として解釈するコマンドもあります。たとえば、引数10を‘C-f’に指定 すると、カーソルを通常の1文字ではなく、10文字分前向きに移動します。これ らのコマンドでは、引数を指定しないと引数1を指定したのと同等になります。 この種のコマンドの多くでは、負の引数を指定すると、逆向きの移動や逆の操作 を指示することになります。 数引数を指定するもっとも簡単な方法は、キーを押しながら数字また はマイナス記号(と数字)を入力する方法です。以下はその例です: M-5 C-n これは5行下に移動します。キー‘M-1’、‘M-2’、...、同様に‘M--’は、次のコマ ンドへの引数をセットアップするコマンド、(‘digit-argument’と ‘negative-argument’)にバインドされています。数字をともなわない‘M--’は、 通常−1を意味します。 2桁以上の数字を入力したい場合、2文字目以降の数字を入力するときに を押しつづける必要はありません。つまり50行下に移動するときは、以下 のように入力します: M-5 0 C-n これは、(あなたが期待するように)‘0’を5つコピーして挿入してから1行下がる のでは_ない_ことに注意してください。‘0’はプレフィクス引数の一部として扱 われます。 (‘0’を5つコピーして挿入するときは、‘M-5 C-u 0’と入力します。ここで ‘C-u’はプレフィクス引数を終端させるので、次のキー入力はあなたが実行した いコマンドです。ここでの‘C-u’の意味はこのケースだけに適用される使い方で す。‘C-u’の通常の役割については以下を参照してください。) 数引数を指定する別の方法として、‘M-1’、‘M-2’、...と入力するかわりに、 ‘C-u’ (‘universal-argument’)のあとに数字(負の引数の場合はマイナス記号と 数字)を入力する方法があります。通常、数字をともなわないマイナス記号は −1を意味します。 単独の‘C-u’は、“4倍”という特別な意味をもち、次のコマンドの引数を4倍に します。‘C-u C-u’は16倍です。つまり‘C-u C-u C-f’は16文字前方に移動します 。その他に便利な使い方としては‘C-u C-n’、‘C-u C-u C-n’(適当な割り合いで 画面を下に移動する)や、‘C-u C-u C-o’(16個の空行を作る)、‘C-u C-k’(4行削 除する)、などがあります。 自分自身を挿入する文字の前に数引数を使えば、指定した分のコピーを挿入 できます。これは挿入したい文字が数字でないときは簡単です。たとえば ‘C-u 6 4 a’は、‘a’を64個コピーして挿入します。しかし数字を挿入したいとき は、これではうまくいきません。‘C-u 6 4 1’は引数に641を指定することになっ てしまいます。このようなときは引数と挿入したい数字を分けるために、他の ‘C-u’を使うことができます。たとえば‘C-u 6 4 C-u 1’とすれば、これは‘1’を 64個コピーして挿入します。 引数の有無は確認しても、その値は無視するコマンドもあります。たとえば コマンド‘M-q’ (‘fill-paragraph’)は、1行に収まるようできるだけテキストを フィルしますが、引数をともなうと、余分なスペースを挿入してテキストが正確 に1行の最大幅を使うよう均等に割り付けてフィルします(‘M-q’については、 *note Filling::を参照してください)。このようなコマンドは、引数として単に ‘C-u’を指定するだけで充分です。 引数の値を繰り返しの回数として使いますが、引数がないときは特別な処理 を行うコマンドもあります。たとえばコマンド‘C-k’ (‘kill-line’)に引数Nを指 定すると、これは行末の改行も含めてN行をkillします。しかし引数を指定しな いで‘C-k’した場合、ポイントから改行までのテキストをkillするか、ポイント が行末にある場合は改行をkillします。つまりコマンド‘C-k’を引数なしで2回呼 び出すと、‘C-k’に引数1を指定したのと同様、空でない行をkillできます (‘C-k’についての情報は、*note Killing::を参照してください)。 いくつかのコマンドは、‘C-u’だけの引数を通常の引数とは異なるものとして 扱います。また、マイナス記号のみの引数を、−1とは区別するコマンドもありま す。これらの例外については、必要になったときに説明します。これらの例外は 、それぞれのコマンドを使いやすくするためにあり、コマンドのドキュメント文 字列に記載されています。 コマンドの前に引数を入力するという点を強調するために、そしてコマンド が呼び出されてから入力されるミニバッファー引数(*note Minibuffer::を参照 してください)と区別するために、わたしたちは“プレフィクス引数(prefix argument)”という言葉を使います。 グラフィカルなディスプレイでは‘C-0’、‘C-1’、...は‘M-0’、‘M-1’、...と 同じように振る舞います。 7.11 コマンドの繰り返し ======================= 単純なキーで呼び出されるものや、‘M-x COMMAND-NAME ’で実行できるよう な多くのコマンドは、数引数で繰り返し回数(*note Arguments::を参照してくだ さい)を与えることで、その回数だけ繰り返すことができます。しかし、入力を 求めるものや数引数を別の目的に使うコマンドでは、この方法はうまくいきませ ん。 コマンド‘C-x z’ (‘repeat’)は、Emacsコマンドを何回も反復する別の方法で す。このコマンドは、直前のEmacsコマンドが何であっても、それを繰り返しま す。繰り返されるコマンドは、まえと同じ引数を使います。毎回新たに引数を読 み取ることはしません。 コマンドを2回以上繰り返すには‘z’を追加して入力します。1つの‘z’でコマ ンドを1回繰り返します。‘z’以外の文字を入力するか、マウスボタンを押すと繰 り返しを終了します。 たとえば、20文字削除するために‘C-u 2 0 C-d’と入力したとしましょう。 ‘C-x z z z’と入力すれば、(引数を含めて)削除コマンドをさらに3回繰り返し、 全部で80文字削除できます。始めの‘C-x z’でコマンドを1回繰り返し、そのあと のそれぞれの‘z’で1回ずつ繰り返します。 8 ミニバッファー **************** “ミニバッファー(minibuffer)”とは、Emacsのコマンドがファイル名、バッファ ー名、Emacsコマンド名、Lisp式といった、複雑な引数を読み取るための場所で す。なぜ“ミニバッファー”と呼ぶかというと、それがスクリーン上の小領域を占 める、特別な目的のためのバッファーだからです。ミニバッファーで引数テキス トを編集するために、通常のEmacs編集コマンドを使うことができます。 8.1 ミニバッファーを使う ======================== ミニバッファーを使用中、ミニバッファーはエコーエリアにカーソルとともに表 示されます。ミニバッファーは通常、コロンが最後についた“プロンプト (prompt)”から開始されます。プロンプトはどのような入力が期待されるか、そ してそれがどのように使われるのかを示します。プロンプトは、フェイス ‘minibuffer-prompt’を使ってハイライトされます。 ミニバッファーで入力するもっとも簡単な方法は、テキストを入力してから で引数入力を完了してミニバッファーを終了する方法です。かわりに ‘C-g’を入力して引数を求めているコマンドをキャンセルし、ミニバッファーを 終了することもできます(*note Quitting::を参照してください)。 コロンの前のカッコ内に“デフォルト引数(default argument)”を表示するプ ロンプトもあります。このデフォルト値は、だけを入力したときに、引数 として使用されます。たとえばバッファー名を読み取るコマンドは、通常デフォ ルト値としてバッファー名を表示します。を入力することでデフォルトの バッファーにたいして処理を行うことができます。 Minibuffer Electric Defaultモードというグローバルマイナーモードを有効 にしている場合、ミニバッファーの内容の変更を開始すると、Emacsはデフォル ト引数を非表示にします。ミニバッファーのテキストを元に戻せば、ふたたびプ ロンプトにデフォルト値が表示されます。さらに変数 ‘minibuffer-eldef-shorten-default’を非‘nil’値に変更すると、スクリーンの スペースを節約するために、‘(default DEFAULT-ARG)’のかわりに ‘[DEFAULT-ARG]’の形式でデフォルト値を表示します。このマイナーモードを有 効にするには、‘M-x minibuffer-electric-default-mode’とタイプしてください 。 エコーエリアにミニバッファーが表示されると、他のエコーエリアの使用と 競合するかもしれません。ミニバッファーがアクティブなとき、エラーメッセー ジや情報メッセージは一時的な表示となります。メッセージは数秒ミニバッファ ーを隠すように表示されるか、なにかタイプするまでのあいだ表示され、その後 ミニバッファーに戻ります。ミニバッファーの使用中、Emacsはキーストローク をエコーしません。 8.2 ミニバッファーでのファイル名 ================================ ‘C-x C-f’ (‘find-file’)のようなコマンドは、ミニバッファーを使ってファイ ル名引数を読み取ります。ファイル名を読み取るためにミニバッファーを使用し ているとき、通常は最後にスラッシュがついたテキストで開始されています。こ れは“デフォルトディレクトリー(default directory)”です。たとえば以下のよ うに開始されていたとします: Find file: /u2/emacs/src/ ここで‘Find file: ’はプロンプト、‘/u2/emacs/src/’はデフォルトディレクト リーです。ここで‘buffer.c’を入力すると‘/u2/emacs/src/buffer.c’を指定した ことになります。デフォルトディレクトリーについての情報は、*note File Names::を参照してください。 あなたが望むかもしれないファイル名のデフォルト候補は、‘M-n’とタイプす ることにより利用できます。*note Minibuffer History::を参照してください。 ‘..’で親ディレクトリー内のファイルを指定できます。つまり ‘/a/b/../foo.el’は‘/a/foo.el’と同じです。‘M-’を使えば、ディレクトリ ー名を後方にkillできます(*note Words::を参照してください)。 デフォルトディレクトリーとは無関係のファイルを指定する場合、デフォル ト値全部を‘C-a C-k’でkillできます。かわりにデフォルト値を無視することも できます。これはスラッシュで始まる絶対パスのファイル名か、チルダで始まる ファイル名をデフォルトディレクトリーに続けて入力します。たとえば以下のよ うにして‘/etc/termcap’を指定できます: Find file: /u2/emacs/src//etc/termcap ダブルスラッシュにより、Emacsは2番目のスラッシュより前のすべてを無視しま す。上の例では‘/u2/emacs/src/’は無視されるので、引数は‘/etc/termcap’とな ります。無視される部分のファイル名は、端末に可能なら目立たないような表示 になります(これを無効にするには、コマンド‘M-x file-name-shadow-mode’で File Name Shadowモードをオフにしてください)。 リモートファイルの名前(*note Remote Files::を参照)を補完する際、ダブ ルスラッシュは若干異なる挙動を示します。この場合のダブルスラッシュは、 Emacsがファイル名の部分だけを無視して、他の部分(method、host、username、 ...など)を手付かずのままにするようにします。3つのスラッシュを連続してタ イプすると、リモートファイル名の中のすべてを無視します。*note (tramp)File name completion::を参照してください。 Emacsは‘~/’をホームディレクトリーと解釈します。‘~/foo/bar.txt’はホー ムディレクトリーにある、‘foo’というディレクトリーの、‘bar.txt’という名前 のファイルを指定します。さらに‘~USER-ID/’はログイン名がUSER-IDというユー ザーの、ホームディレクトリーを意味します。‘~’の前のディレクトリー名は無 視されるので、‘/u2/emacs/~/foo/bar.txt’は‘~/foo/bar.txt’と同じです。 MS-WindowsとMS-DOSでは、ユーザーは常にホームディレクトリーを持つとは 限らないので、Emacsはいくつかの代替ディレクトリーを使います。 MS-Windowsについては*note Windows HOME::、MS-DOSについては *note MS-DOS File Names::を参照してください。 これらのシステムでは‘~USER-ID/’は現在の ユーザーの場合だけ、つまりUSER-IDが現在のユーザーのログイン名のときだけ がサポートされます。 Emacsがファイル名を読みとるとき、デフォルトディレクトリーを挿入しない ようにするには、変数‘insert-default-directory’を‘nil’に変更します。この 場合、ミニバッファーは空で開始されます。それでも相対パスでのファイル名引 数は、同じデフォルトディレクトリーにもとづいて解釈されます。 ミニバッファーにリモートファイル名を入力することもできます。 *note Remote Files::を参照してください。 8.3 ミニバッファーでの編集 ========================== ミニバッファーは一風変わっていますがEmacsのバッファーなので、引数テキス トを編集するための、通常のEmacsコマンドが利用可能です(しかしプロンプトは “読み取り専用(read-only)”なので変更できません)。 ミニバッファーでのは引数を完了させるので、これを使って改行を挿入 することはできません。‘C-q C-j’を使えば制御文字‘C-j’(改行文字と等しい)を 挿入できます(*note Inserting Text::を参照してください)。かわりに‘C-o’ (‘open-line’)を使うこともできます(*note Blank Lines::を参照してください )。 ミニバッファーの中では、‘?’は“補完コマンド(completion commands)”にバインドされている場合があります。これによりテキスト全部を入 力せずに、入力したいテキストを簡単に入力できます。*note Completion::を参 照してください。のときと同様、‘C-q’を使って、‘?’のよう な文字を入力できます。 便宜上ミニバッファーでの‘C-a’ (‘move-beginning-of-line’)は、プロンプ トの先頭ではなく引数テキストの先頭にポイントを移動します。これにより、た とえば‘C-a C-k’で引数全体をkillことができます。 ミニバッファーがアクティブのとき、エコーエリアは通常のEmacsウィンドウ のように扱われます。たとえば(‘C-x o’で)他のウィンドウに切り替えて、そこ でテキストを編集して、またミニバッファーのウィンドウにもどって引数の入力 を完了できます。ほかのウィンドウでテキストをkillしてからミニバッファーの ウィンドウにもどり、引数にテキストをyankすることさえ可能です。しかしミニ バッファーのウィンドウは分割(split)できないなどの制限もあります。*note Windows::を参照してください。 通常ミニバッファーのウィンドウは、スクリーン行で1行を占めます。しかし 2行以上のテキストをミニバッファーに追加すると、そのテキストに対応して自 動的に拡張されます。変数‘resize-mini-windows’は、ミニバッファーのサイズ 調整を制御します。デフォルト値は‘grow-only’で、これは今説明したとおりの 振る舞いを意味します。もし値が‘t’の場合、ミニバッファーから行を削除する と。ミニバッファーのウィンドウは自動的に縮小されて、スクリーン行で1行ま で小さくなります。値が‘nil’の場合、ミニバッファーのウィンドウは自動的に サイズを変更しません。しかし通常のウィンドウのサイズ調整コマンドは使用で きます(*note Windows::を参照してください)。 変数‘max-mini-window-height’は、ミニバッファーのウィンドウのサイズ変 更するときの、最大高さを制御します。浮動少数を指定した場合は、フレームの 高さにたいする比になります。整数を指定した場合は最大行数になります。 ‘nil’を指定すると、ミニバッファーのウィンドウの自動サイズ調整は行われま せん。デフォルト値は0.25です。 ミニバッファーでの‘C-M-v’コマンドは、他のウィンドウに表示されたコマン ドのヘルプテキストをスクロールします。‘M-’や‘M-’(また は‘M-’や‘M-’)でも、ヘルプテキストをスクロールできます。これ は長い補完候補のリストを選ぶときなどに便利です。*note Other Window::を参 照してください。 通常Emacsはミニバッファーがアクティブのときは、ミニバッファーにたいし て多くのコマンドを使用できないようにしています。ミニバッファーでこれらの コマンドを使えるようにするには、変数‘enable-recursive-minibuffers’に ‘t’をセットしてください。 アクティブでないとき、ミニバッファーは‘minibuffer-inactive-mode’にな っており、‘mouse-1’をクリックすると、‘*Messages*’バッファーを表示します 。ミニバッファー専用のフレームを使用している場合、Emacsはそこでのキー入 力も認識します。たとえば‘n’は新しいフレームを作成します。 8.4 補完 ======== 引数を入力する助けとなる、“補完(completion)”という機能が使えるときがあり ます。これは引数の一部を入力すると、それまでに何を入力したかにもとづいて 、Emacsが残りあるいは残りの一部を補完してくれることを意味します。 補完が利用可能なとき、特定のキー(通常は)が、ミニバ ッファーの特別な補完コマンド(*note Completion Commands::を参照してくださ い)にリバインドされています。これらのコマンドは、ミニバッファーのテキス トを完了させようと試みます。これは引数を要求したコマンドが提供する、“補 完候補(completion alternatives)”にもとづいています。通常‘?’を入力すると 、補完候補のリストを見ることができます。 補完は通常ミニバッファー内で行われますが、通常のバッファーないでもこ の機能を利用可能なときがあります。*note Symbol Completion::を参照してく ださい。 8.4.1 補完の例 -------------- ここでは簡単な例が理解しやすいでしょう。‘M-x’は、コマンド名を読み取るた めにミニバッファーを使います。補完はミニバッファーのテキストと、既存の Emacsコマンドの名前のマッチによって機能します。コマンドを ‘auto-fill-mode’を実行したいとします。‘M-x auto-fill-mode ’をタイプ すればよいのですが、補完を使えばもっと簡単になります。 ‘M-x a u ’とタイプすると、は‘au’で始まる補完候補(この例では コマンド名)を探します。‘auto-fill-mode’、‘autoconf-mode’などの候補がいく つかありますが、候補はすべて‘auto’で始まるので、ミニバッファーの‘au’は ‘auto’に補完されます(あなたのEmacsのセッションには、もっと多くのコマンド が定義されているかもしれません。たとえば‘authorize-me’というコマンドが定 義されている場合には、Emacsが補完できるのは‘aut’までです)。 もう一度をタイプしても、次の文字は‘-’、‘a’、‘c’のどれなのか決定 できません。そのため文字は追加されず、かわりには可能性のある補完候 補の一覧を別のウィンドウに表示します。 次に‘-f’と入力します。ミニバッファーには‘auto-f’が入力されました。こ の文字で始まるコマンド名は、‘auto-fill-mode’だけです。ここでを入力 すると、残りの部分が補完されて、ミニバッファーの引数は‘auto-fill-mode’に なります。 したがって‘a u - f ’と入力するだけで、‘auto-fill-mode’と入 力できるのです。 8.4.2 補完コマンド ------------------ 以下は補完が使えるときに、ミニバッファーで定義されている補完コマンドの一 覧です。 ‘’ 可能な限りミニバッファーのテキストを補完します。補完できないときは 、可能性のある補完候補のリストを表示します(‘minibuffer-complete’)。 ‘’ ミニバッファーのテキストを単語単位で補完します (‘minibuffer-complete-word’)。このコマンドは、引数にスペースが含ま れる可能性のあるファイル名などでは利用できません。 ‘’ 最初に可能な限り補完した後で、ミニバッファーのテキストを引数として 確定します。*note Completion Exit::を参照してください。 ‘?’ 補完候補の一覧を表示します(‘minibuffer-completion-help’)。 (‘minibuffer-complete’)は、もっとも基本的な補完コマンドです。こ れはミニバッファーのテキストとマッチする可能性のある、すべての補完候補を 検索して、できるかぎりの補完を試みます。補完候補が選択される方法について は、*note Completion Styles::を参照してください。 (‘minibuffer-complete-word’)は、と同じように補完をおこない ますが、次のハイフンまたは空白までしか補完しません。ミニバッファーが ‘auto-f’の場合、‘auto-fill-mode’まで補完できますが、‘ill-’しか挿入しない ので‘auto-fill-’となります。次にを入力すると‘auto-fill-mode’が補完 されます。 が補完できない場合、マッチする補完候補のリスト(複数ある場 合)を、別のウィンドウに表示します。同じリストは‘?’ (‘minibuffer-completion-help’)でも表示できます。以下は補完一覧で使うこと ができるコマンドです: ‘M-v’ ‘’ ‘’ ミニバッファーで‘M-v’を入力すると、候補リストを表示しているウィンド ウを選択します(‘switch-to-completions’)。以下のコマンドを使うには、 この方法がよいでしょう。は同じことをおこないます。 他の方法でもウィンドウを選択できます(*note Windows::を参照してくだ さい)。 ‘’ ‘mouse-1’ ‘mouse-2’ 補完候補リストのバッファー内では、ポイント位置の補完候補を選択しま す(‘choose-completion’)。 ‘’ 補完候補リストのバッファー内では、次の補完候補にポイントを移動しま す(‘next-completion’)。 ‘’ 補完候補リストのバッファー内では、前の補完候補にポイントを移動しま す(‘previous-completion’)。 8.4.3 補完の終了 ---------------- コマンドがミニバッファーの補完を使って引数を読みとる場合、引数を確定する ために (‘minibuffer-complete-and-exit’)をタイプしたときに、何が起こ るかも制御します。これには4種類の動作があります: • “強い補完(Strict completion)”は、正確にマッチする補完のみを許します 。でミニバッファーを抜けるのは、ミニバッファーのテキストが正確 にマッチしているか、1つに補完された場合だけです。それ以外の場合、 Emacsはミニバッファーからのexit(入力を完了してミニバッファーから抜 け出す)を拒絶します。かわりに補完を試み、補完できなかったときは、ミ ニバッファーのテキストの後ろに数秒‘[No match]’と表示します(‘C-g’を 使えばミニバッファーを離れることができます)。 この動作をおこなうコマンドの例は‘M-x’で、それは存在しないコマンド名 を受けとるのは無意味だからです。 • “慎重な補完(Cautious completion)”は強い補完と似ていますが、テキスト がすでに正確にマッチしているときだけexitできる点が異なります。テキ ストが正確なマッチに補完できるとき、は補完を行いますが、まだ exitしません。exitするには、もう一度を入力しなければなりません 。 慎重な補完は、たとえば存在しなければならないファイル名を読みとると きに使用されます。 • “寛大な補完(Permissive completion)”は、任意の入力を許容します。補完 候補はあくまでも提案です。では補完は行われず、単に入力された引 数を確定します。 • “確認付きの寛大な補完(Permissive completion with confirmation)”は、 寛大な補完と似ていますが例外があります。を入力して、テキストが ある中間的な状態まで補完されたとき(たとえばまだ正確なマッチに至らな いとき)、次にを入力しても引数は確定されません。かわりにEmacsは テキストの後ろに‘[Confirm]’を数秒表示して、確認を求めます。その次の は確認とみなされテキストが確定されます。これによりにより 希望するマッチまで補完されたと勘違いして、を押してしまうなどの 一般的な間違いを捕らえることができます。 変数‘confirm-nonexistent-file-or-buffer’をカスタマイズして、確認動 作を微調整できます。デフォルト値の‘after-completion’は、まさに説明 したとおりに動作します。これを‘nil’に変更すると、Emacsは確認を求め なくなり、寛大な補完にフォールバックします。他の非‘nil’値に変更した 場合、その前のコマンドがかどうかにかかわらず、Emacsは確認を求 めます。 この動作はファイル名を読みとる‘C-x C-f’や、バッファー名を読み取る ‘C-x b’など、多くのコマンドで使われています。 8.4.4 補完候補が選択される方法 ------------------------------ 補完コマンドは、たくさんの可能性のある補完候補を、ミニバッファーに入力し たものとマッチ(match)する、より少ないサブセットへと絞り込むことにより機 能します。*note Completion Example::では、そのようなマッチングの簡単な例 を紹介しました。どのような構成がマッチなのかを決定する手続きはとても複雑 です。Emacsは多くの状況下でもっとも妥当と思われる補完を試みます。 Emacsは1つ以上の“補完スタイル(completion styles)”を使って補完をおこな います。これはミニバッファーのテキストを補完候補とマッチングするための条 件のセットです。補完を行うとき、Emacsは補完スタイルを順番に試します。も しあるスタイルが1つ以上のマッチを獲得した場合、それらは補完候補リストの ために使用されます。もしあるスタイルがマッチを獲得できなかった場合、 Emacsは次のスタイルにフォールバックします。 リスト変数‘completion-styles’は、使用する補完スタイルを定義します。そ れぞれのリスト要素(list element)は、補完スタイルの名前(Lispシンボル)です 。デフォルトの補完スタイルは、リスト変数に以下の名前の要素が順番に並んで います。 ‘basic’ ミニバッファーのポイントより前のテキストと、補完候補の先頭が同じで なければなりません。さらにミニバッファーのポイントより後ろのテキス トがある場合、補完候補の残りそれが含まれていなければなりません。 ‘partial-completion’ このアグレッシブな補完スタイルは、ミニバッファーのテキストをハイフ ンまたは空白で区切り、各単語ごとに補完をおこないます(たとえばコマン ド名を補完する場合、‘em-l-m’は、‘emacs-lisp-mode’に補完されます)。 さらにミニバッファーのテキスト中の‘*’は、“ワイルドカード (wildcard)”として扱われます。これは補完候補の対応する位置にある文字 列の、任意の文字とマッチします。 ‘emacs22’ この補完スタイルは‘basic’とにていますが、ミニバッファーのポイントよ り後のテキストを無視します。この名前は補完の動作がEmacs 22と同じだ からです。 以下の追加の補完スタイルが定義されており、‘completion-styles’に追加する こともできます(*note Customization::を参照してください)。 ‘substring’ 補完候補は、ミニバッファーのポイントより前のテキストと、ポイントよ り後のテキストが同じ順番で含まれていなければなりません。 したがって、ミニバッファーのテキストが‘foobar’で、ポイントが‘foo’と ‘bar’の間にある場合、‘AfooBbarC’にマッチします。この場合A、B、Cは空 文字列を含む任意の文字列です。 ‘initials’ このとてもアグレッシブな補完スタイルは、頭文字とイニシャルで補完を 試みます。たとえばコマンド名の補完をする場合、‘lch’は ‘list-command-history’とマッチします。 ‘emacs21’と呼ばれる、とてもシンプルな補完スタイルもあります。このスタイ ルでは、ミニバッファーのテキストが‘foobar’の場合、‘foobar’で始まるものだ けにマッチします。 変数‘completion-category-overrides’を設定することにより、状況に応じて 異なる補完スタイルを使うことができます。たとえばバッファー名を補完すると きは、デフォルトで‘basic’と‘substring’だけを使うよう指定できます。 8.4.5 補完オプション -------------------- 大文字小文字の違いは、コマンド名のように大文字小文字を区別する (case-sensitive)引数では重要です。たとえばコマンド名の補完では、‘AU’では ‘auto-fill-mode’に補完されません。大文字小文字の違いは、それが問題になら ない引数の補完では無視されます。 ファイル名を補完するとき、変数 ‘read-file-name-completion-ignore-case’が非‘nil’なら、大文字小文字の違い は無視されます。GNU/Linuxのように、ファイル名の大文字と小文字を区別する システムでは、デフォルト値は‘nil’です。Microsoft Windowsのように、ファイ ル名の大文字と小文字を区別しないシステムでは、非‘nil’です。バッファー名 を補完するとき、‘read-buffer-completion-ignore-case’が非‘nil’なら、大文 字小文字の違いは無視されます。デフォルトは‘nil’です。 通常Emacsはファイル名を補完するとき、選ばれるべきではないと思われる、 特定の候補を無視します。これはリスト変数 ‘completion-ignored-extensions’により決定されます。リストの要素はに文字 列を指定します。それらの文字列で終わるファイル名は、補完候補としては無視 されます。スラッシュ(‘/’)で終わる要素は、ディレクトリー名を表します。 ‘completion-ignored-extensions’の標準的な値は‘".o"’、‘".elc"’、‘"~"’を含 むいくつかの要素です。たとえばディレクトリーに‘foo.c’、‘foo.elc’があると き、‘foo’は‘foo.c’に補完されます。しかし_すべて_の補完候補が無視すべき文 字列で終わるとき、これらの候補は無視されません。前の例でいうと‘foo.e’は ‘foo.elc’に補完されます。Emacsは補完候補リストで補完候補を表示するとき、 ‘completion-ignored-extensions’を無視します。 Shellでの補完は、ファイル名補完の拡張されたバージョンです。*note Shell Options::を参照してください。 ‘completion-auto-help’に‘nil’がセットされていると、補完コマンドは補完 リストバッファーを表示しません。表示するには‘?’を入力しなければなりませ ん。値が‘lazy’の場合、Emacsは2度目の補完を試みたときだけ、補完リストバッ ファーを表示します。もし補完すべきものがない場合、1度目のは‘Next char not unique’と表示し、2度目ので補完リストバッファーが表示されま す。 ‘completion-cycle-threshold’が非‘nil’のとき、補完コマンドは補完候補を 循環(cycle)することができます。ミニバッファーのテキストで1つ以上の補完 候補がある場合は通常、補完コマンドは補完できた文字までを表示します。 ‘completion-cycle-threshold’を‘t’に変更すると、補完コマンドは補完候補の 中から最初の候補を表示します。それ以降の補完コマンドの呼び出しでは、その 次の補完候補を循環的に表示します。‘completion-cycle-threshold’を数値Nに すると、補完候補がN以下のときだけ循環表示の動作をします。 8.5 ミニバッファーヒストリー ============================ ミニバッファーで入力したすべての引数は、“ミニバッファーヒストリーリスト (minibuffer history list)”に保存されているので、簡単に後でまた使うことが できます。以下のコマンドにより、前の引数をすばやく探してミニバッファーに 呼び出すことができます: ‘M-p’ ミニバッファーヒストリーの前のアイテム、つまり以前のアイテムに移動 します(‘previous-history-element’)。 ‘M-n’ ミニバッファーヒストリーの次のアイテムに移動します (‘next-history-element’)。 ‘’ ‘’ ‘M-p’や‘M-n’と同様ですが、前のヒストリーアイテムに移動する前に、複 数行アイテムの前、または次の行に移動します (‘previous-line-or-history-element’、および ‘next-line-or-history-element’)。 ‘M-r REGEXP ’ REGEXPにマッチする、ミニバッファーヒストリーの以前のアイテムに移動 します(‘previous-matching-history-element’)。 ‘M-s REGEXP ’ REGEXPにマッチする、ミニバッファーヒストリーの以降のアイテムに移動 します(‘next-matching-history-element’)。 ミニバッファーでの‘M-p’ (‘previous-history-element’)は、ミニバッファ ーのヒストリーリストのアイテムを1つずつ移動します。‘M-p’はヒストリーリス トの以前のアイテムを取り出して、ミニバッファーの既存の内容を置き換えます 。‘M-n’ (‘next-history-element’)は、ミニバッファーのヒストリーリストを反 対方向、つまり以降のエントリーを取り出してミニバッファーの既存の内容を置 き換えます。 ミニバッファーヒストリーに以降のエントリーがないとき(たとえば前に1回 も‘M-p’を入力していないとき)、Emacsはデフォルト引数のリストから、あなた が入力するだろうと思われる値を取り出します。これは“未来のヒストリー”を移 動すると考えることもできます。 ファイルにたいする“未来のヒストリー(future history)”には、カレントバ ッファー内のポイント位置にあるファイル名やURLのような、あなたが便利だと 思うかもしれないいくつかの候補が含まれます。この場合、“未来のヒストリー ”に配されるデフォルトは、オプション‘file-name-at-point-functions’の値に セットされた関数により制御されます。デフォルトでは、この値は‘ffap’パッケ ージ((*note FFAP::)を参照)を呼び出します。これはポイント周辺のテキストか らデフォルトとなるファイルやURLを推測します。この推測を無効にするには、 このオプションを‘nil’値にカスタマイズします。これにより“未来のヒストリー ”に含まれるのは、(もしあれば)カレントバッファーでvisitされたファイル、お よびデフォルトディレクトリーのファイルだけになります。 矢印キーの‘’と‘’は、‘M-p’や‘M-n’のように機能しますが、カレ ントヒストリーアイテムが複数行の場合には、前(または次)のヒストリーアイテ ムに移動する前に、前(または次)の行に移動します。 ミニバッファーコマンドの‘M-p’または‘M-n’で挿入されたテキストを編集し ても、ヒストリーリストのエントリーは変更されません。かわりに編集された引 数が確定されたとき、ヒストリーリストの最後に追加されます。 ‘M-r’ (‘previous-matching-history-element’)でヒストリーリストの古い要 素を、‘M-s’ (‘next-matching-history-element’)で新しいエントリーを探すこ とができます。これらのコマンドはどちらも引数として“正規表現(regular expression)”を要求し、それにマッチした最初のエントリーをミニバッファーに 取り出します。正規表現についての説明は、*note Regexps::を参照してくださ い。数引数Nを指定すると、それはN番目に一致したエントリーを取り出すことを 意味します。これらのコマンドはミニバッファーから呼び出されたとはいえ、ミ ニバッファーを使って正規表現を読みとるという点では、変わったコマンドです 。正規表現に大文字が含まれていると、大文字小文字を区別する検索(*note Lax Search::を参照してください)となります。 ヒストリーをインクリメンタルサーチすることもできます。*note Isearch Minibuffer::を参照してください。 Emacsは引数の種類ごとに個別のリストを保持します。たとえばファイル名の リストは、ファイル名を読みとるすべてのコマンドで使われたファイル名、とい った具合です。ほかのヒストリーリストとしてはバッファー名やコマンド名 (‘M-x’で使われたもの)、コマンド引数(‘query-replace’のような引数で使われ たもの)があります。 変数‘history-length’には、ミニバッファーのヒストリーリストの最大の長 さを指定します。リストが長くなりすぎたときは、一番古い要素を削除して新し い要素を追加します。‘t’を指定したときは、長さは無制限になります。 変数‘history-delete-duplicates’には、重複したヒストリーを削除するかを 指定します。非‘nil’の場合、新しい要素が追加されるとリストからそれと同じ 要素がすべて削除されます。デフォルトは‘nil’です。 8.6 ミニバッファーでのコマンドの繰り返し ======================================== ミニバッファーを使用したコマンドはすべて、“コマンドヒストリー(command history)”という特別なヒストリーリストに記録されます。これにはコマンドの 引数の値も記録されるので、コマンド全体を再実行できます。特に‘M-x’はコマ ンド名を読みとるので、‘M-x’を使用したものはすべてそこに記録されます。 ‘C-x ’ コマンドヒストリーから最近のミニバッファーのコマンドを再実行します (‘repeat-complex-command’)。 ‘M-x list-command-history’ コマンドヒストリー全体を表示します。表示されたすべてのコマンドは ‘C-x ’で再実行できます。一番最近のものが先頭に表示されま す。 ‘C-x ’は、ミニバッファーを使った最近のコマンドを再実行しま す。引数を与えないと、一番最近のコマンドを実行します。数引数で再実行した いコマンドを指定します。1は一番最近のコマンド、2はその前、といった具合で す。 ‘C-x ’は、前のコマンドをLisp式に変換して、その式でミニバッ ファーのテキストを初期化します。Lispを知らなくても、何のコマンドが再実行 用に表示されているか明白でしょう。単にを入力すると、コマンドを変更 せずに再実行します。実行する前にLisp式を編集して、コマンドを変更できます 。実行されたコマンドは、一番最近のコマンドと等しくなければ、コマンドヒス トリーの一番先頭に追加されます。 ‘C-x ’で一度ミニバッファーの中に入れば、通常のミニバッファ ーのヒストリーコマンド(*note Minibuffer History::を参照してください)を使 って、ヒストリーリスト中を移動できます。以前に実行したコマンドが見つけた ら、式を編集してにより実行できます。 厳密に言うとインクリメンタルサーチはミニバッファーを使いません。これ が複雑なコマンドのように振る舞うとしても、通常は‘C-x ’で表示 されるヒストリーリストに含まれません。ヒストリーにインクリメンタルサーチ コマンドを表示させるには、‘isearch-resume-in-command-history’に非‘nil’を セットしてください。*note Incremental Search::を参照してください。 ミニバッファーを使用した以前のコマンドのリストは、Lispのリスト値とし て‘command-history’に格納されています。Lisp式の各要素は、1つのコマンドと その引数をあらわしています。Lispプログラムは‘eval’に‘command-history’の 要素を使って呼び出すことで、コマンドを再実行できます。 8.7 パスワードの入力 ==================== Emacsでパスワードを入力したい場合があります。たとえばEmacsにFTPのような ネットワークプロトコルを介して他のマシンのファイルをvisitし、マシンへの アクセスのためにパスワードを与える場合などです(*note Remote Files::を参 照してください)。 パスワードの入力はミニバッファーの使用と似ています。Emacsは (‘Password: ’のような)プロンプトをエコーエリアに表示します。要求されたパ スワードを入力した後、それを確定するためにを押します。他の人がパス ワードを見るのを防ぐために、入力した文字は通常の形式ではなく、ドット (‘.’)で表示されます。 ミニバッファーに関連付けられた多くの機能およびコマンドは、パスワード 入力では使用_できません_。ヒストリーや補完はできず、ウィンドウの変更や Emacsでの他の処理も、パスワードをsubmitするまでは行うことができません。 パスワードのタイプ中は、を押して後方に、すなわち最後に入力した文 字から削除できます。‘C-u’で入力したすべての文字を削除できます。‘C-g’はパ スワードプロンプトを閉じます(*note Quitting::を参照してください)。 ‘C-y’は現在のkillリングからパスワードを挿入します(*note Killing::)。パス ワードを確定するには、またはを入力します。他の自己挿入文字は、 対応する文字をパスワードに入力します.それ以外の入力は無視されます。 8.8 Yes or No プロンプト ======================== Emacsのコマンドが実行の過程で、yes-or-no(はい/いいえ)形式で質問して答え を求めるかもしれません。これらの質問は大きく2つにわけることができます。 1番目のyes-or-no形式の質問は、‘(y or n)’で終わるプロンプトのものです 。このような質問は、実際のところミニバッファーを使用しません。プロンプト がエコーエリアに表示され、答えを‘y’または‘n’で入力すると、ただちにそれが 答えとなります。たとえばバッファーの保存で‘C-x C-w’ (‘write-file’)を入力 して既存のファイル名を入力すると、Emacsは以下のようなプロンプトを表示し ます: File ‘foo.el’ exists; overwrite? (y or n) この質問はミニバッファーを使用しないので、通常のミニバッファー編集コマン ドは使えません。しかしいくつかのウィンドウをスクロールする操作は行えます 。‘C-l’による選択されたウィンドウの再センタリング、‘C-v’(または )による前方へのスクロール、‘M-v’(または)による後方へのスクロール、‘C-M-v’による次のウィンドウの前方への スクロール、‘C-M-S-v’による次のウィンドウの後方へのスクロールができます 。‘C-g’は質問を打ちきり、質問を発したコマンドを終了します(*note Quitting::を参照してください)。 2番目のyes-or-no形式の質問は、間違った答えが深刻な事態を招くような場 合に使用されます。これはミニバッファーを使い、‘(yes or no)’で終わるプロ ンプトという特徴があります。たとえば変更が保存されていないファイルを visitしているバッファーで、‘C-x k’ (‘kill-buffer’)を呼び出すと、Emacsは ミニバッファーをアクティブにして以下のようなプロンプトを表示します: Buffer foo.el modified; kill anyway? (yes or no) これに答えるには、ミニバッファーに‘yes’または‘no’と入力してから、を 押さなければなりません。ミニバッファーは前のセクションで説明したように動 作します。‘C-x o’による他のウィンドウへのスイッチ、ヒストリーコマンドの ‘M-p’や‘M-n’などが使用できます。‘C-g’でミニバッファーを閉じて、質問を発 したコマンドを終了できます。 9 名前を指定してコマンドを実行する ********************************** すべてのEmacsコマンドは、それを使えば実行できるような名前を持っています 。使いやすいようにキーバインディングされているコマンドも、たくさんありま す。これらのコマンドはキーまたは名前で実行できます。キーがバインドされて いないコマンドもたくさんあり、そのようなコマンドは名前でしか実行できませ ん(キーバインドをセットアップする方法については、*note Key Bindings::を 参照してください)。 慣例によりコマンド名は‘auto-fill-mode’や‘manual-entry’のように、ハイ フンで区切られた、1つ以上の単語となっています。コマンド名は覚えやすいよ うに、略されていない英単語が主に使われます。 コマンドを名前で実行するには、最初に‘M-x’をタイプしてから、コマンド名 をタイプしてで実行します。‘M-x’はミニバッファーを使ってコマンド名を 読みとります。ミニバッファーの先頭には、実行のために名前の入力が必要なこ とを気付かせるため、‘M-x’という文字が“プロンプト”として表示されます。 でミニバッファーを抜けだしコマンドを実行します。ミニバッファーにつ いての詳細は、*note Minibuffer::を参照してください。 コマンド名の入力には補完が使用できます。たとえば‘forward-char’を呼び 出すには以下のように入力できます M-x forward-char または M-x forw c ‘forward-char’は、キー‘C-f’で呼び出されるのと同じコマンドであることに注 意してください。キーバインドの存在は、名前によるコマンドの実行を妨げませ ん。 ‘M-x’でコマンドを補完するとき、“obsolete(時代遅れ)”と宣言されたコマン ドは無視されます。これらのコマンドにたいしては、完全な名前をタイプする必 要があります。時代遅れのコマンドとは、もっと新しく、より良い代替が存在し ていて、将来のEmacsリリースにおいて廃止が予定されているコマンドのことで す。 ‘M-x’とコマンドの実行をキャンセルするには、コマンド名の入力のかわりに ‘C-g’を入力します。これによりコマンドを呼び出したレベルまで戻ります。 ‘M-x’で呼び出すコマンドに数引数を渡すには、‘M-x’の前に数引数を指定し ます。引数の値はコマンド名が読みとられるときにプロンプトとして表示され、 最終的に‘M-x’は引数をコマンドに渡します。たとえば、コマンド ‘forward-char’に数引数として42を渡すには、‘C-u 42 M-x forward-char ’とタイプできます。 ‘M-x’で実行するコマンドがキーバインディングを持つ場合、Emacsはコマン ド実行後にその旨をエコーエリアに表示します。たとえば‘M-x forward-word’と 入力すると、同じコマンドを‘M-f’で実行できるというメッセージが表示されま す。このメッセージは変数‘suggest-key-bindings’に‘nil’にセットすればオフ にできます。‘suggest-key-bindings’の値には数字も指定でき、この場合 Emaceは指定された秒数の間、キーバインドを表示します。バインディングを表 示するときのデフォルトは2秒です。 キーバインドをもたないコマンドも、‘M-x’のプロンプトで、完全な名前より 短くタイプして呼び出すことができます。Emacsは、短縮入力が完全なコマンド 名より明らかに短く、‘extended-command-suggest-shorter’が非‘nil’の場合は 、そのような短縮入力をエコーエリアに表示します。‘suggest-key-bindings’の セッティングは、そのようなヒントにも同様に効果を及ぼします。 このマニュアルではコマンドを名前で実行するとき、名前を終了させるため のを省くことがあります。つまり‘M-x auto-fill-mode ’ではなく ‘M-x auto-fill-mode’と表記します。はコマンドに引数がある場合に強調 させる意味で使用します。 ‘M-x’は‘execute-extended-command’を実行します。これは他のコマンドの名 前を読み取って実行するコマンドです。 10 ヘルプ ********* Emacsはバラエティに富んだヘルプコマンドを提供しており、それらにはプレフ ィクスキー‘C-h’(ファンクションキーでも可)からアクセスできます。以下 のセクションではこれらのコマンドについて説明します。‘C-h C-h’ (‘help-for-help’)と入力すれば、ヘルプコマンドの一覧を見ることもできます 。この一覧はでスクロールでき、それから見たいヘルプコマンドを 入力するか、‘C-g’でキャンセルできます。 多くのヘルプコマンドは、“ヘルプバッファー(help buffer)”という特別なバ ッファーに情報を表示します。このバッファーではによりスクロー ルし、でハイパーリンクをフォローすることができます。*note Help Mode::を参照してください。 特定の機能を探しているが、それが何と呼ばれているかわからない、どこを 見ればよいのかわからないときには、次の3つの方法を推奨します。まず最初に aproposコマンドを試してください。次にマニュアルのインデックスを探してく ださい。そしてFAQとパッケージのキーワードを探してください。 ‘C-h a TOPICS ’ 引数TOPICSと名前が一致するコマンドを検索します。引数にはキーワード 、キーワードのリスト、正規表現(*note Regexps::を参照してください)を 指定できます。*note Apropos::を参照してください。 ‘C-h i d m emacs i TOPIC ’ Emacsのinfoマニュアルのインデックスから、TOPICを検索して最初にマッ チしたものを表示します。‘,’を押すと次にマッチしたものを表示します。 TOPICには正規表現を指定できます。 ‘C-h i d m emacs s TOPIC ’ 同様ですが、インデックスではなくマニュアル本文の_テキスト_を検索し ます。 ‘C-h C-f’ Infoを使ってEmacs FAQを表示します。 ‘C-h p’ キーワードに基づいて、利用可能なEmacsパッケージを表示します。*note Package Keywords::を参照してください。 他のさまざまなコンテキストでも、‘C-h’やは“ヘルプ”を意味します。た とえばプレフィクスキーの後にこれらのキーを入力すると、プレフィクスキーに 続けて入力できるキーの一覧を表示することができます(このコンテキストでは ‘?’も使用できます。いくつかのプレフィクスキーは‘C-h’や‘?’に別の意味を持 たせているものがあるので使えませんが、それらのものでもはサポートされ ています)。 10.1 ヘルプの概要 ================= ここではビルトインのドキュメントにアクセスする、ヘルプコマンドの要約を記 します。これらの大部分については、以下のセクションで詳細を説明します。 ‘C-h a TOPICS ’ 名前がTOPICSにマッチするコマンドの一覧を表示します (‘apropos-command’)。 ‘C-h b’ 有効なキーバインディングをすべて表示します。最初はマイナーモード、 次にメジャーモード、それからグローバルのバインディングを表示します (‘describe-bindings’)。 ‘C-h c KEY’ キーシーケンスKEYがバインドされているコマンドの名前を表示します (‘describe-key-briefly’)。‘c’は“character”からきています。KEYについ てさらに詳しい情報を得るには、‘C-h k’を使います。 ‘C-h d TOPICS ’ TOPICSにマッチするドキュメントをもつ、コマンドまたは変数を表示しま す(‘apropos-documentation’)。 ‘C-h e’ バッファー‘*Messages*’を表示します(‘view-echo-area-messages’)。 ‘C-h f FUNCTION ’ FUNCTIONという名前の、Lisp関数のドキュメントを表示します (‘describe-function’)。コマンドもLisp関数なので、これはコマンドにも 使用できます。 ‘C-h h’ ファイル‘HELLO’を表示します。このファイルは様々な文字セットの例です 。 ‘C-h i’ GNUドキュメントブラウザー(‘info’)を実行します。Emacsのマニュアルは infoで利用できます。 ‘C-h k KEY’ KEYで実行されるコマンドの名前と、ドキュメントを表示します (‘describe-key’)。 ‘C-h l’ 最近のキーストローク300回分のの説明を表示します(‘view-lossage’)。 ‘C-h m’ カレントのメジャーモード、およびマイナーモードのドキュメントを表示 します(‘describe-mode’)。 ‘C-h n’ 最近のEmacsの変更に関するニュースを表示します(‘view-emacs-news’)。 ‘C-h o SYMBOL’ SYMBOLという名前のLispシンボルのドキュメントを表示します (‘describe-symbol’)。これはすべての種類のシンボル、すなわち関数、変 数、フェイスのドキュメントも表示します。 ‘C-h p’ トピックのキーワードでパッケージを見つけます(‘finder-by-keyword’)。 これはパッケージメニューバッファーを使ってパッケージを一覧します。 *note Packages::を参照してください。 ‘C-h P PACKAGE ’ 指定したパッケージのドキュメントを表示します(‘describe-package’)。 ‘C-h r’ Emacsのマニュアルをinfoで表示します(‘info-emacs-manual’)。 ‘C-h s’ 現在の“構文テーブル(syntax table)”を表示します(‘describe-syntax’)。 構文テーブルは、どの文字が開始デリミッターで、その文字が単語の一部 なのかを定義します。詳細については、*note Syntax Tables: (elisp)Syntax Tables.を参照してください。 ‘C-h t’ Emacsの対話的なチュートリアルを開始します(‘help-with-tutorial’)。 ‘C-h v VAR ’ Lisp変数VARのドキュメントを表示します(‘describe-variable’)。 ‘C-h w COMMAND ’ COMMANDという名前のコマンドを実行するキーを表示します(‘where-is’)。 ‘C-h C CODING ’ コーディングシステムCODINGを説明します(‘describe-coding-system’)。 ‘C-h C ’ 現在使用されているコーディングシステムを説明します。 ‘C-h F COMMAND ’ infoを開始して、EmacsコマンドCOMMANDのドキュメントのノードに移動し ます(‘Info-goto-emacs-command-node’)。 ‘C-h I METHOD ’ インプットメソッドMETHODを説明します(‘describe-input-method’)。 ‘C-h K KEY’ infoを開始して、キーシーケンスKEYのドキュメントのノードに移動します (‘Info-goto-emacs-key-command-node’)。 ‘C-h L LANGUAGE-ENV ’ 言語環境(language environment)LANGUAGE-ENVで使用される文字セット、 コーディングシステム、インプットメソッドに関する情報を表示します。 ‘C-h S SYMBOL ’ 編集中のプログラム言語に基づいて、シンボルSYMBOLのinfoドキュメント を表示します(‘info-lookup-symbol’)。 ‘C-h .’ ポイントが特別なテキスト領域のとき(これには、たとえば‘*Help*’のリン クなどが含まれます)、ヘルプメッセージを表示します (‘display-local-help’)。 10.2 キーのドキュメント ======================= キーシーケンスに関する情報を得るためのヘルプコマンドは、‘C-h c’ (‘describe-key-briefly’)と‘C-h k’ (‘describe-key’)です。 ‘C-h c KEY’は、KEYにバインドされているコマンドの名前を、エコーエリア に表示します。たとえば‘C-h c C-f’は、‘forward-char’と表示します。 ‘C-h k KEY’も同様ですが、さらに多くの情報が得られます。これはコマンド が何をするかが正確に説明する、“ドキュメント文字列(documentation string)”を含むヘルプバッファーを表示します。 ‘C-h K KEY’は、KEYに対応するコマンドが説明されている、Emacsマニュアル のセクションを表示します。 ‘C-h c’、‘C-h k’、‘C-h K’はファンクションキー、メニュー、マウスイベン ト(ただし‘C-h c’はマウス移動イベントを無視する)を含む、任意のキーシーケ ンスにたいして動作します。たとえば‘C-h k’の後で、メニューバーからメニュ ーアイテムを選択すれば、それにより実行されるコマンドのドキュメントが表示 されます。 ‘C-h w COMMAND ’は、COMMANDがバインドされているキーをリストしま す。リストはエコーエリアに表示されます。コマンドがキーにバインドされてい ないとき、それは‘M-x’を使って実行しなければならないことを意味します。 ‘C-h w’はコマンド‘where-is’を実行します。 10.3 コマンドと変数名のヘルプ ============================= ‘C-h f FUNCTION ’ (‘describe-function’)は、Lisp関数FUNCTIONのドキュ メントをウィンドウに表示します。コマンドもLisp関数なので、この方法を使え ば、名前を知っている任意のコマンドのドキュメントを閲覧できます。たとえば C-h f auto-fill-mode は‘auto-fill-mode’のドキュメントを表示します。これはキーにバインドされて いないコマンド(通常‘M-x’で実行する)のドキュメントを閲覧する、唯一の方法 です。 ‘C-h f’は、LispプログラムからLisp関数を使うときも便利です。たとえば式 ‘(make-vector len)’を書いたとしましょう。正しく‘(make-vector len)’を使っ ているかチェックしたいときは、‘C-h f make-vector ’と入力します。 ‘C-h f’はコマンド名だけでなくすべての関数名を許容するので、‘M-x’では機能 するいつもの補完による短縮形が、‘C-h f’では機能しないと気付くかもしれま せん。コマンド名では省略形が一意であっても、すべての関数名を含めたら一意 ではないかもしれないからです。 ‘C-h f ’を入力すると、バッファーのポイントがある位置の、一番内側 のLisp式で呼び出されている関数の名前が有効で、Lisp関数として定義されてい れば、その関数の説明が表示されます(引数を入力するときデフォルトとして関 数名が表示されます)。たとえばポイントが‘(make-vector (car x)’の後ろにあ るとき、ポイントを含む一番内側のリストは‘(make-vector’で始まっているので 、‘C-h f ’により関数‘make-vector’の説明が表示されます。 ‘C-h f’は、関数名を正しく記述しているか確かめたいときも便利です。‘C-h f’のミニバッファーのプロンプトで、編集中のバッファーの関数名がデフォルト として表示されるなら、それは定義されたLisp関数であることを意味します。本 当にドキュメントを見たい訳でなければ、‘C-g’を押してコマンド‘C-h f’をキャ ンセルできます。 ‘C-h v’ (‘describe-variable’)は、‘C-h f’と似ていますがLisp関数ではな く、Lisp関数の説明を表示します。ポイントの周囲または前にあるLispシンボル が、定義されたLisp変数名のときはそれがデフォルトとなります。*note Variables::を参照してください。 通常Emacsの変数または関数を説明するヘルプバッファーには、ソースファイ ルがインストールされていれば、対応するソースコードへのハイパーリンクが含 まれています(*note Hyperlinking::を参照してください)。 マニュアルからコマンドのドキュメントを探すには、‘C-h F’ (‘Info-goto-emacs-command-node’)を使います。これはEmacsのマニュアルだけ でなく、さまざまなマニュアルを認識するので、正しいものを見つけられるでし ょう。 ‘C-h o’ (‘describe-symbol’)は、‘C-h f’や‘C-h v’と似ていますが、これは 任意のシンボル(関数、変数、フェイス)を説明します。シンボルが複数の定義を もつ場合(たとえばシンボルが関数と変数の両方の定義をもつような場合)、この コマンドはそれらすべてのドキュメントを順に表示します。 10.4 Apropos(適切な) ==================== “apropos(折よい、適切な)”コマンドは、“What are the commands for working with files?(ファイルを処理するコマンドは?)”のような質問に答えるものです 。より正確に言うと単語、単語のリスト、正規表現によって、“aproposパターン ”を指定します。 以下の各aproposコマンドは、ミニバッファーでaproposパターンを読み取り 、パターンにマッチするアイテムを検索して、結果を別のウィンドウに表示しま す。 ‘C-h a’ コマンドを検索します(‘apropos-command’)。プレフィクス引数を指定する と、非インタラクティブな関数も検索します。 ‘M-x apropos’ 関数と変数を検索します。これを使えばインタラクティブな関数(コマンド )と非インタラクティブな関数の両方を検索できます。 ‘M-x apropos-user-option’ ユーザーがカスタマイズできる関数を検索します。プレフィクス引数を指 定すると、カスタマイズできない変数も検索します。 ‘M-x apropos-variable’ 変数を検索します。プレフィクス引数を指定すると、カスタマイズできる 変数だけを検索します。 ‘M-x apropos-local-variable’ バッファーローカル変数を検索します。 ‘M-x apropos-value’ 指定したパターンにマッチする値の変数を検索します。プレフィクス引数 を指定すると、定義がパターンにマッチする関数と、プロパティーリスト がパターンにマッチする、Lispシンボルも検索します。 ‘M-x apropos-local-value’ 値が指定されたパターンにマッチする、バッファーローカル変数を検索し ます。 ‘C-h d’ 指定されたパターンにマッチするドキュメント文字列の関数、または変数 を検索します(‘apropos-documentation’)。 最も簡単な種類のaproposパターンは単語です。その単語が含まれていれば、 パターンにマッチします。ファイルを処理するコマンドを探すには、‘C-h a file ’と入力します。これは‘copy-file’、‘find-file’などの、名前に ‘file’を含むすべてのコマンドの一覧を表示します。各コマンド名には簡単な説 明と、それを呼び出すためのキーの一覧が一緒に表示されます。この例だと、 ‘find-file’は‘C-x C-f’で呼び出せることがわかります。 aproposバッファーの関数定義、変数、シンボルの属性についてもっと情報が 欲しいときは、‘mouse-1’または‘mouse-2’でクリックするか、そこに移動して を押してください。 2つ以上の単語をaproposパターンに指定したときは、マッチするために少な くとも名前に2つの単語が含まれていなければなりません。たとえばポイントの 前のテキストをkillするコマンドを探すときは、‘C-h a kill back backward behind before ’などと試みることができます。これは実際のコマンド名 ‘kill-backward’にマッチするでしょう。もし‘kill-text-before’というコマン ドがあったなら、これも指定した単語を2つ含んでいるのでマッチします。 より一層フレキシビリティを高めるために、正規表現(*note Regexps::)を指 定できます。aproposパターンに正規表現の特殊文字‘^$*+?.\[’が含まれている と、それは正規表現として扱われます。 Emacsコマンド命名の慣習に従うと、aproposパターンとして便利な単語がい くつかあります。これらを‘C-h a’で使うことにより、命名の慣習の必要性を感 じることができるでしょう。 char、line、word、sentence、paragraph、region、page、sexp、list、 defun、rect、buffer、frame、window、face、file、dir、register、 mode、beginning、end、forward、backward、next、previous、up、down、 search、goto、kill、delete、mark、insert、yank、fill、indent、 case、change、set、what、list、find、view、describe、default 変数‘apropos-do-all’が非‘nil’の場合、ほとんどのaproposコマンドは、プ レフィクス引数が与えられたかのように振る舞います。例外が1つあります。プ レフィクス引数なしの‘apropos-variable’は、‘apropos-do-all’の値に関係なく 、常にすべての変数を検索します。 デフォルトでは、‘apropos-documentation’を除くすべてのaproposコマンド は、結果をアルファベット順に一覧します。変数‘apropos-sort-by-scores’が非 ‘nil’のときは、かわりに結果の関連度を推測して、一番関連度が高いと思われ るものを最初に表示します。‘apropos-documentation’コマンドは、デフォルト で結果を関連度順で一覧します。これをアルファベット順にするには、変数 ‘apropos-documentation-sort-by-scores’を‘nil’に変更してください。 10.5 ヘルプモードのコマンド =========================== ヘルプバッファーはViewモード(*note View Mode::を参照してください)と同じ コマンドを提供します。たとえば前方へのスクロールは、後方へのスクロ ールはか‘S-’です。他にも特別なコマンドをいくつか提供します: ‘’ ポイント位置のクロスリファレンス先をフォローします(‘help-follow’)。 ‘’ ポイントを次のハイパーリンクへ進めます(‘forward-button’)。 ‘S-’ ポイントを前のハイパーリンクへ戻します(‘backward-button’)。 ‘mouse-1’ ‘mouse-2’ クリックしたハイパーリンク先をフォローします。 ‘C-c C-c’ ポイント位置のシンボルに関する、すべてのドキュメントを表示します (‘help-follow-symbol’)。 ‘C-c C-f’ ‘r’ 次ののヘルプトピックに前方へ移動します(‘help-go-forward’)。 ‘C-c C-b’ ‘l’ 前のヘルプトピックに戻ります(‘help-go-back’)。 もし関数名、変数名、フェイス名(*note Faces::を参照してください)がヘル プバッファーのドキュメントにあると、通常はアンダーラインされた“ハイパー リンク(hyperlink)”として表示されます。関連するドキュメントを閲覧するには 、ポイントをそこに移動して (‘help-follow’)とタイプするか、ハイパー リンクを‘mouse-1’または‘mouse-2’でクリックします。するとヘルプバッファー の内容が入れ替わりますが、‘C-c C-b’、または‘l’ (‘help-go-back’)で元に戻 すことができます。元に戻る途中では、‘C-c C-f’または‘r’ (‘help-go-forward’)を使用して前に進むことができます。 ヘルプバッファーには、infoマニュアル、ソースコード定義、URL(ウェブペ ージ)へのハイパーリンクを含むこともできます。最初の2つはEmacs上で表示さ れ、3番目のURLはコマンド‘browse-url’により、ウェブブラウザーを使って表示 されます。 ヘルプバッファーでは、 (‘forward-button’)はポイントを次のハイパ ーリンクへ進め、‘S-’ (‘backward-button’)は前のハイパーリンクへ戻し ます。これらのコマンドは循環的です。たとえば最後のハイパーリンクで をタイプすると、最初のハイパーリンクに戻ります。 テキスト中のシンボルに関するすべてのドキュメントを閲覧するには、ポイ ントをシンボルに移動して‘C-c C-c’ (‘help-follow-symbol’)とタイプします。 これは変数、関数、および/またはフェイスとしての、そのシンボルが意味する 、すべてのドキュメントを表示します。 10.6 パッケージのキーワード検索 =============================== Emacsのたいていのオプション機能は、“パッケージ(packages)”にグループ化さ れています。Emacsには数百のビルトインパッケージが含まれており、ネットワ ークを通じて他のパッケージのインストールもできます(*note Packages::を参 照してください)。 あるトピックに関連するパッケージを探すのを簡単にするため、ほとんどの パッケージは、それが何をするかにもとづき、1つ以上の“キーワード (keywords)”に関連付けられています。‘C-h p’ (‘finder-by-keyword’)とタイプ すると、パッケージキーワードとキーワードの意味を説明するリストが表示され ます。キーワードに属するパッケージのリストを表示するには、そのキーワード の行でをタイプします。これによりパッケージメニューバッファー(*note Package Menu::を参照してください)で、パッケージの一覧が表示されます。 ‘C-h P’ (‘describe-package’)はパッケージ名(*note Packages::を参照)の 入力を求めて、パッケージの属性と、それが実装する機能をヘルプバッファーで 表示します。このバッファーは、ボタン形式で関連するパッケージのキーワード を一覧します。ボタン‘mouse-1’か‘mouse-2’をクリックすると、そのキーワード に関連する他のパッケージを見ることができます。 10.7 国際化言語のサポートに関するヘルプ ======================================= 特定の言語環境(language environment: *note Language Environments::を参照 してください)の情報を得るには、‘C-h L’とタイプします。これはヘルプバッフ ァーを開いて、言語環境でサポートされる言語の説明と、関連する文字セット、 コーディングシステム、インプットメソッド、およびその言語環境のサンプルテ キストを表示します。 コマンド‘C-h h’ (‘view-hello-file’)は、ファイル‘etc/HELLO’を表示しま す。このファイルはさまざまな言語で“hello”をどのように言うのかを、いろい ろな文字セットで表示するデモンストレーションです。 コマンド‘C-h I’ (‘describe-input-method’)は、指定されたインプットメソ ッド、または現在使われているインプットメソッド(デフォルト)の説明します。 *note Input Methods::を参照してください。 コマンド‘C-h C’ (‘describe-coding-system’)は、指定されたコーディング システム、または現在使われているものを説明します。*note Coding Systems::を参照してください。 10.8 その他のヘルプコマンド =========================== ‘C-h i’ (‘info’)は、infoプログラムを実行します。infoは構造化されたドキュ メントファイルを閲覧するものです。Emacsマニュアル全体は、GNUシステムのた めの他のマニュアルとともに、infoで利用可能です。infoを開始した後、‘h’を タイプすると、infoの使い方のチュートリアルが実行されます。 数引数Nを指定すると、‘C-h i’はinfoバッファー‘*info*’を選択します。 これは同時に複数のinfoマニュアルを閲覧するとき便利です。プレフィクス引数 ‘C-u’だけを指定した場合、‘C-h i’はドキュメントのファイル名を尋ねるので、 infoメニューのトップレベルにエントリーがないファイルでも閲覧できます。 上記で説明しているヘルプコマンド‘C-h F FUNCTION ’と‘C-h K KEY’は 、infoを実行して関数(FUNCTION)またはキー(KEY)に関するドキュメントを直接 開きます。 プログラムを編集しているとき、そのプログラム言語のinfo版のマニュアル を持っていれば、‘C-h S’ (‘info-lookup-symbol’)を使ってシンボル(キーワー ド、関数、変数)のエントリーを、適切なマニュアルから探すことができます。 コマンドがどのように動作するかの詳細は、メジャーモードに依存します。 何か予期しないことが起こって、何をタイプしたかわからなくなったときは 、‘C-h l’ (‘view-lossage’)を使います。‘C-h l’は最近の300回分のキーストロ ークと、それらが呼び出したコマンドを表示します。馴染みのないコマンドを見 つけたら、‘C-h k’や‘C-h f’を使用して、それらのコマンドが何を行なうか調べ ることができます。 最近のエコーエリアのメッセージを調べるには、‘C-h e’ (‘view-echo-area-messages’)を使います。これはそれらのメッセージを保持す るバッファー、‘*Messages*’を表示します。 Emacsの各メジャーモードでは、一般的にいくつかのキーが再定義されていて 、編集動作も異なります。‘C-h m’ (‘describe-mode’)は、現在のメジャーモー ドのドキュメントを表示します。これには通常このモードで変更されているコマ ンドや機能、およびそれらのキーバインドについても説明されています。 ‘C-h b’ (‘describe-bindings’)と‘C-h s’ (‘describe-syntax’)は、現在の Emacs環境に関する、それ以外の情報を表示します。最初は現在のマイナーモー ドのローカルバインディング、次に現在のメジャーモードで定義されているロー カルバインディング、最後にグローバルバインディングが表示されます。‘C-h s’は各文字の構文の説明とともに、構文テーブルの内容を表示します(*note Syntax Tables: (elisp)Syntax Tables.を参照してください)。 プレフィクスキーの後に‘C-h’、‘?’、をタイプすることにより、特定の プレフィクスキーにたいする、サブコマンドのリストを得ることができます(こ の方法が機能しないプレフィクスキーもあります。たとえばです。‘ C-h’は実際には‘C-M-h’と解釈され、これはdefunをマークするコマンドです。こ のような場合でも‘ ’や‘ ?’はうまく機能します)。 10.9 ヘルプファイル =================== ビルトインのドキュメントとマニュアル以外にも、Emacsにはコピー条件 (copying conditions)、リリースノート(release notes)、デバッグ説明書 (instructions for debugging)、バグ報告(reporting bugs)などのトピックを説 明する、いくつかのファイルが含まれています。これらのファイルは、以下のコ マンドで閲覧することができます。‘C-h g’をのぞき、これらはすべて、‘C-h C-CHAR’という形式になっています。 ‘C-h C-c’ Emacsをコピー、再頒布する場合の規則を表示します (‘describe-copying’)。 ‘C-h C-d’ Emacsをデバッグするためのヘルプを表示します (‘view-emacs-debugging’)。 ‘C-h C-e’ 外部のパッケージをどこで入手するかについての情報を表示します (‘view-external-packages’)。 ‘C-h C-f’ EmacsのFAQ(frequently-answered-questions: 頻繁に答えられる質問)のリ ストを表示します(‘view-emacs-FAQ’)。 ‘C-h g’ GNUプロジェクトに関する情報がある、ページ (http://www.gnu.org)を visitします(‘describe-gnu-project’)。 ‘C-h C-m’ Emacsマニュアルの印刷されたコピーの注文に関する情報を表示します (‘view-order-manuals’)。 ‘C-h C-n’ このバージョンの新しい機能の一覧が含まれるnewsファイルを表示します (‘view-emacs-news’)。 ‘C-h C-o’ Emacsおよび他のGNUソフトウェアーの最新バージョンを、注文またはダウ ンロードする方法を表示します(‘describe-distribution’)。 ‘C-h C-p’ Emacsの既知の問題(それにどう対処するかの提案がある場合もあります)を 表示します(‘view-emacs-problems’)。 ‘C-h C-t’ EmacsのTODOリストを表示します(‘view-emacs-todo’)。 ‘C-h C-w’ GNU Emacsが完全に無保証なことにたいする、すべての詳細を表示します (‘describe-no-warranty’)。 10.10 アクティブテキストのヘルプとツールチップ ============================================== Emacsでは拡大解釈される“アクティブテキスト”(active text: マウスのクリッ クやに特別な反応をするテキスト)は、しばしばヘルプテキストに関連付け られています。これにはEmacsのバッファーのハイパーリンク、同様にモードラ インの一部が含まれます。グラフィカルなディスプレー、同様にいくつかのテキ スト端末は、マウストラッキングをサポートしており、アクティブテキストの上 をマウスが通過することにより、ヘルプテキストを“ツールチップ(tooltip)”で 表示します。*note Tooltips::を参照してください。 マウストラッキングをサポートしない端末では、バッファーのアクティブテ キストにポイントを移動して、‘C-h .’ (‘display-local-help’)をタイプすれば 、ヘルプテキストを表示できます。これはヘルプテキストをエコーエリアに表示 します。ポイントがある場所のヘルプテキストが利用可能な場合に、常に表示さ せるには、変数‘help-at-pt-display-when-idle’に‘t’をセットしてください。 11 マークとリージョン ********************* Emacsのコマンドには、現在のバッファー内の、任意の連続する領域(region)を 操作するものがたくさんあります。そのようなコマンドが操作するテキストを指 定するには、領域の一方の端に“マーク(mark)”をセットし、もう一方の端にポイ ントを移動します。ポイントとマークの間のテキストを、“リージョン (region)”と呼びます。リージョンは常にポイントとマークの間で拡張され、そ れは一方がテキストの先頭にある場合も変わりません。ポイントを移動すれば、 常にリージョンは変化します。 テキストのある位置にマークをセットすると、マークは“アクティブ (active)”になります。マークがアクティブのときは、リージョンもアクティブ になります。Emacsはアクティブなリージョンの中にあるテキストを、フェイス ‘region’でハイライト表示します(*note Face Customization::を参照してくだ さい)。 バッファーのテキストを変更するコマンドを含む、特定の非移動系コマンド (non-motion commands)の後で、Emacsは自動的にマークを“非アクティブ (deactivates)”にし、これによりハイライトも解除されます。‘C-g’をタイプす れば、いつでも明示的に非アクティブにすることができます(*note Quitting::を 参照してください)。 上記のデフォルト動作は、Transient Markモード(暫定マークモード)という 名で知られています。Transient Markモードを無効にすると、Emacsは通常では リージョンをハイライトしなくなります。*note Disabled Transient Mark::を 参照してください。 あるバッファーでマークをセットしても、他のバッファーのマークは影響を 受けません。アクティブなマークがあるバッファーに戻ったとき、マークは以前 と同じ場所にあります。複数のウィンドウで同じバッファーを表示しているとき 、これらのウィンドウはそれぞれのポイント位置をもっているので、リージョン も異なります。しかしこれらのウィンドウでは、マークの位置は共通です。 *note Windows::を参照してください。通常、選択されたウィンドウのリージョ ンだけがハイライトされます。しかし変数‘highlight-nonselected-windows’が 非‘nil’の場合、各ウィンドウのリージョンがハイライトされます。 rectangular region(矩形リージョン)という、違う種類のリージョンもあり ます。*note Rectangles::を参照してください。 11.1 マークのセット =================== マークをセットするためのコマンドがいくつかあります: ‘C-’ ポイント位置にマークをセットしてアクティブにします (‘set-mark-command’)。 ‘C-@’ 同じです。 ‘C-x C-x’ ポイント位置にマークをセットしてアクティブにしてから、以前のマーク があった位置にポイントを移動します(‘exchange-point-and-mark’)。 ‘Drag-mouse-1’ ドラッグしたテキストの周りにポイントとマークをセットします。 ‘mouse-3’ ポイント位置にマークをセットしてから、クリックした場所にポイントを 移動します(‘mouse-save-then-kill’)。 ‘‘シフトを押したカーソル移動キー’’ マークが非アクティブなら、ポイント位置にマークをセットしてポイント を移動します。*note Shift Selection::を参照してください。 マークをセットするもっとも一般的な方法は、‘C-’ (‘set-mark-command’)です(1)。これはポイントがある位置にマークをセットし てから、アクティブにします。その後、マークをそこに残したままポイントを移 動できます。 たとえばバッファーの一部を大文字に変換したいとします。これを行うには 対象のテキストの一方の端に移動して、‘C-’をタイプし、対象のテキスト がハイライトされるまでポイントを移動します。そして‘C-x C-u’ (‘upcase-region’)をタイプすると、リージョンのテキストが大文字に変換され て、マークが非アクティブになります。 マークがアクティブなときに非アクティブにしたいときは、‘C-g’をタイプし ます(*note Quitting::を参照してください)。リージョンにたいして操作を行う ほとんどのコマンドは、上記の例の‘C-x C-u’のように、自動的にマークを非ア クティブにします。 リージョンにたいしての操作は行わず、バッファーの位置を覚えておくため にマークをセット(‘C- C-’とタイプ)して、後でそこに戻る(‘C-u C-’とタイプ)こともできます。詳細については、*note Mark Ring::を参照 してください。 コマンド‘C-x C-x’ (‘exchange-point-and-mark’)は、ポイントとマークの位 置を交換します。ポイントの位置に問題はないが、リージョンのもう一方の端に ポイントを移動したいとき‘C-x C-x’は便利です。2回目の‘C-x C-x’で、マーク を新しいポイント位置にマークをセットしてから、ポイントを元の位置に戻すこ とができます。このコマンドはマークが非アクティブのとき、最初にマークをア クティブにします。これはマークが最後にどこにセットされたかを明確にするた めに、リージョンをハイライトするためです。しかしプレフィクス引数とともに 呼び出せば、マークは非アクティブのままでリージョンもハイライトされません 。これを使えば‘C-u C-’と同様の方法で、マークの位置にジャンプできま す。 マウスでマークをセットすることもできます。マウスの左ボタン (‘down-mouse-1’)をクリックしてから、テキスト範囲をドラッグすると、最初に マウスボタンを押した位置にマークがセットされ、マウスボタンを話した位置に ポイントが置かれます。かわりにマウスの右ボタン(‘mouse-3’)をクリックすれ ば、ポイントのある位置にマークがセットされ、クリックした位置にポイントが 移動します。これらのマウスコマンドに関する詳細な説明は、*note Mouse Commands::を参照してください。 最後にシフトキーを押しながらカーソルを移動するコマンド(‘S-’、 ‘S-C-f’、‘S-C-n’など)でマークをセットできます。これは“シフト選択 (shift-selection)”と呼ばれ、以前にシフト選択やマウスコマンドでセットされ たアクティブなマークがないときに限り、ポイントを移動する前の位置にマーク をセットします。マウスコマンドやシフト選択によるマークのセットは、通常の マークとは少し異なります。続けてシフトを押さないカーソル移動コマンドを実 行するにより、マークは自動的に非アクティブになります。詳細は、*note Shift Selection::を参照してください。 ‘C-y’ (‘yank’)のようなテキストを挿入するコマンドの多くは、挿入された テキストの先頭に、非アクティブなマークをセットします。これにより簡単にそ の位置に戻ることができます(*note Mark Ring::を参照してください)。コマン ドがこれを行っていることは、エコーエリアに‘Mark set’が表示されることで見 分けることができます。 Xではアクティブなリージョンが変化するたびに、Emacsはリージョンのテキ ストを“プライマリー選択(primary selection)”に保存します。これにより ‘mouse-2’をクリックして、他のXアプリケーションへテキストを挿入することが できるようになります。*note Primary Selection::を参照してください。 ---------- Footnotes ---------- (1) ASCIIには、文字‘C-’はありません。テキスト端末で‘C-’をタ イプすると、通常は文字‘C-@’が与えられます。このキーも ‘set-mark-command’にバインドされているので、もし異なる挙動を示すテキスト 端末の場合は、‘C-’のかわりに‘C-@’を使うことを考えるのがよいかもしれ ません。 11.2 テキストオブジェクトをマークするコマンド ============================================= 単語(word)、リスト(list)、パラグラフ(paragraph: 段落)、ページ(page)など のテキストオブジェクトの周辺に、ポイントを配置してマークするコマンドがあ ります: ‘M-@’ 次の単語の末尾にマークをセットします(‘mark-word’)。ポイントは移動し ません。 ‘C-M-@’ 次の対応のとれた式の後にマークをセットします(‘mark-sexp’)。ポイント は移動しません。 ‘M-h’ ポイントを現在のパラグラフの先頭に移動して、パラグラフの最後にマー クをセットします(‘mark-paragraph’)。 ‘C-M-h’ ポイントを現在のdefunの先頭に移動して、defunの最後にマークをセット します(‘mark-defun’)。 ‘C-x C-p’ ポイントを現在のページの先頭に移動して、ページの最後にマークをセッ トします(‘mark-page’)。 ‘C-x h’ ポイントを現在のバッファーの先頭に移動して、バッファーの最後にマー クをセットします(‘mark-whole-buffer’)。 ‘M-@’ (‘mark-word’)は、次の単語の最後にマークをセットします(単語につ いての情報は、*note Words::を参照してください)。繰り返し呼び出されると、 マークを1度に1単語進めてリージョンを拡張します。例外として、マークがアク ティブでポイントの前にある場合、‘M-@’はマークを現在の位置から1単語後方に 移動します。 このコマンドに数引数Nを指定することにより、N単語進めてマークするよう 指定できます。負の引数はN単語後方にマークを移動します。 同様に‘C-M-@’ (‘mark-sexp’)は、対応のとれた式の最後にマークをセットし ます(*note Expressions::を参照してください)。繰り返し呼び出すことにより 、後続の式にリージョンを拡張します。正または負の数引数を指定するとその数 に応じて前方または後方にマークを移動します。 上記のリストの他のコマンドは、ポイントとマークの両方をセットするので 、バッファー内のオブジェクトを区切るコマンドです。‘M-h’ (‘mark-paragraph’)はパラグラフ(*note Paragraphs::を参照してください)、 ‘C-M-h’ (‘mark-defun’)はトップレベルの関数定義(*note Moving by Defuns::を 参照してください)、‘C-x C-p’ (‘mark-page’)はページ(*note Pages::を参照し てください)をマークします。繰り返して呼び出すと、同種の連続するオブジェ クトへと、リージョンを拡張します。数引数も同様で、マークを移動したいオブ ジェクトの数を指定します。 ‘C-x h’ (‘mark-whole-buffer’)はポイントをバッファーの先頭、マークを最 後にセットすることによりバッファー全体をリージョンとします。 11.3 リージョンを操作する ========================= 一度リージョンを設定すると、それを処理するいくつかの方法があります: • ‘C-w’ (*note Killing::)でkillします。 • ‘M-w’ でkillリングにコピーします(*note Yanking::を参照してください )。 • ‘C-x C-l’または‘C-x C-u’で、大文字小文字を変換します(*note Case::を 参照してください)。 • ‘C-u C-/’で変更をアンドゥ(undo)します(*note Undo::を参照してくださ い)。 • ‘M-%’でリージョンの中のテキストを置換します(*note Query Replace::を 参照してください)。 • ‘C-x ’または‘C-M-\’でインデントします(*note Indentation::を参 照してください)。 • ‘M-x fill-region’でテキストとしてフィルします(*note Filling::を参照 してください)。 • ‘M-$’で単語のスペルをチェックします(*note Spelling::を参照してくだ さい)。 • ‘M-x eval-region’でLispコードとして評価します(*note Lisp Eval::を参 照してください)。 • ‘C-x r s’でレジスターに保存します(*note Registers::を参照してくださ い)。 • バッファーまたはファイルに保存します(*note Accumulating Text::を参 照してください)。 マークが非アクティブのときにはデフォルトの動作をするが、マークがアク ティブのときはリージョンを処理するコマンドがいくつかあります。たとえば ‘M-$’ (‘ispell-word’)は、通常はポイントのある単語のスペルをチェックしま すが、マークがアクティブのときはリージョンの中のテキストをチェックします (*note Spelling::を参照してください)。通常そのようなコマンドはリージョン が空のとき(たとえばマークとポイントが同じ位置のとき)は、デフォルトの動作 をします。空のリージョンにたいして処理を行いたいときは、変数 ‘use-empty-active-region’を‘t’に変更してください。 *note Erasing::で説明したように、 (‘backward-delete-char’)と (‘delete-forward-char’)もこの方法で動作します。マークがアクティ ブのときはリージョンのテキストを削除します(例外として数引数Nに1以外が指 定されたとき、これらのコマンドはマークがアクティブか関係なく、N文字を削 除します)。変数‘delete-active-region’を‘nil’に変更すると、これらのコマン ドはマークがアクティブのとき異なる動作をしなくなります。これを‘kill’に変 更するとリージョンを削除するかわりに、“kill”するようになります(*note Killing::を参照してください)。 その他のコマンドにはデフォルトの動作はなく、常にリージョンを処理しま す。通常このようなコマンドには、‘C-w’ (‘kill-region’)や‘C-x C-u’ (‘upcase-region’)のように、名前に‘region’がついています。マークが非アク ティブのときは“非アクティブなリージョン”、すなわちポイントと最後にマーク をセットした位置の間にあるテキストにたいして処理を行います(*note Mark Ring::を参照してください)。この動作を無効にするには、変数 ‘mark-even-if-inactive’を‘nil’に変更してください。そうするとこれらのコマ ンドはマークが非アクティブのときエラーをシグナルします。 デフォルトでは、マークがアクティブでもテキストの挿入は普通に行われま す。たとえば‘a’をタイプすると、‘a’が挿入されてからマークが非アクティブに なります。マイナーモードのDelete Selectionモードは、この振る舞いを変更し ます。Delete Selectionモードが有効な場合、マークがアクティブなときは、最 初にリージョンのテキストを削除してから、テキストが挿入されます。Delete Selectionモードをオフにするには、‘M-x delete-selection-mode’とタイプして ください。 11.4 マークリング ================= 各バッファーは、“マークリング(mark ring)”の中に、以前のマークの位置を記 録しています。マークをセットするコマンドは、古いマークをこのリングに pushします。マークリングの1つの使い方として、後で戻りたい場所を記録させ る使い方があります。 ‘C- C-’ マークをアクティブにせずにマークをセットしてから、マークリングに pushします。 ‘C-u C-’ マークがあった場所にポイントを移動し、マークリングから1つ前のマーク を復元します。 コマンド‘C- C-’は、後で戻ってきたい位置をマークするときに便 利です。これは現在の位置をマークを(Emacsがリージョンをハイライト表示して しまう)アクティブにすることなく、マークリングにpushします。実際にこれは ‘C-’ (‘set-mark-command’)を連続して2回呼び出しています。最初の ‘C-’はマークをセットし、2回目の‘C-’はそれを非アクティブにして います(Transient Markモードがオフの場合、‘C- C-’は一時的に Transient Markモードを有効にします。*note Disabled Transient Mark::を参 照してください)。 マークした位置に戻るには、‘C-u C-’のようにプレフィクス引数を指定 して、‘set-mark-command’を使います。これはマークがあった場所にポイントを 移動して、もしマークがアクティブのときは非アクティブにします。‘C-u C-’を連続して呼び出すと、マークリングに保存された前の位置へジャンプ していきます。この方法で移動した位置の情報は失われません。それらはリング の最後に移動します。 ‘set-mark-command-repeat-pop’を非‘nil’にセットすると、‘C-u C-’の 後に続けて、‘C-u C-’ではなく、‘C-’でマークリングを巡回できます 。デフォルトでは‘set-mark-command-repeat-pop’は‘nil’です。 各バッファーは自身のマークリングを持ちます。すべての編集コマンドは現 在のバッファーのマークリングを使います。特に‘C-u C-’は常に同じバッ ファーに留まります。 変数‘mark-ring-max’は、マークリングに保持する最大のエントリー数を指定 します。デフォルトは16エントリーです。もしエントリー数が最大の場合、他の エントリーをpushするとリストの一番古いものが捨てられます。‘C-u C-’を 繰り返すと、リングの現在位置を巡回します。 もし何度も同じ場所に戻りたいときは、マークリングでは不十分でしょう。 そのような場合は後で使うために、その位置をレジスターに記録できます(*note Position Registers::を参照してください)。 11.5 グローバルマークリング =========================== 各バッファーに属する普通のマークリングに加えて、Emacsには“グローバルマー クリング(global mark ring)”が1つあります。以前マークをセットしてからバッ ファーを切り替えた場合、マークをセットすると、マークはカレントバッファー のマークリングに加えて、グローバルマークリングにも記録されます。その結果 、グローバルマークリングには訪れていたバッファーの系列が記録され、各バッ ファーではマークを設定した箇所が記録されます。グローバルマークリングの長 さは、‘global-mark-ring-max’で制御され、デフォルトは16です。 コマンド‘C-x C-’ (‘pop-global-mark’)は、グローバルリングの最新の バッファー位置にジャンプします。これもリングを巡回するので、連続して‘C-x C-’を使うことにより、古いバッファーのマーク位置に移動します。 11.6 シフト選択 =============== シフトキーを押しながらカーソル移動コマンドをタイプすると、ポイントを移動 する前の位置にマークをセットするので、リージョンが元のポイント位置から新 しいポイント位置に拡張されます。この機能は“シフト選択 (shift-selection)”と呼ばれます。これは他のエディターでテキストを選択する 方法と似ています。 シフト選択によるマークのセットは、これまでの説明とは少し異なる振る舞 いをします。最初に、マークを非アクティブにする通常の方法(バッファーのテ キストを変更したり‘C-g’をタイプするなど)に加え、_シフトキーを押さない (unshifted)_カーソル移動コマンドでも、マークが非アクティブになります。次 に、連続する_シフトキーを押した(shifted)_カーソル移動コマンドでは、マー クの更新はされません。つまりシフトキーを押しながらカーソル移動コマンドを 繰り返すと、リージョンは継続的に変更されます。 シフト選択は、シフトキーを押したカーソル移動キーが、別のコマンドにバ インドされていない場合のみ動作します(*note Customization::を参照してくだ さい)。たとえば‘S-C-f’を他のコマンドにバインドしていると、‘S-C-f’はシフ ト選択バージョンの‘C-f’ (‘forward-char’)ではなく、バインドされたコマンド を実行します。 マウスコマンドによるマークのセットも、シフト選択によるマークのセット と同様です(*note Setting Mark::を参照してください)。たとえばマウスをドラ ッグしてリージョンを指定すると、シフトキーを押したカーソル移動コマンドを 使って、そのリージョンの拡張を続けることができます。どちらのケースも、シ フトキーを押さないカーソル移動コマンドで、マークが非アクティブになります 。 シフト選択をオフにするには、‘shift-select-mode’を‘nil’にセットしてく ださい。これをセットしても、マウスコマンドによるマークのセッティングは無 効になりません。 11.7 Transient Markモードを無効にする ===================================== マークとリージョンのデフォルト動作では、マークをアクティブにセットすると 、リージョンがハイライトされます。これはTransient Markモードと呼ばれます 。これはデフォルトで有効になっているマイナーモードです。‘M-x transient-mark-mode’、または‘Options’メニューの‘Active Region Highlighting’で切り替えることができます。オフにすることによりEmacsの操作 モードは変更されます。 • ‘C-’や‘C-x C-x’のようなコマンドでマークをセットしても、リージ ョンはハイライトされません。そのためマークがどこにあるか見分けるこ とができないので、覚えている必要があります。 マークをセットしたらどこにセットしたか忘れる前にすぐ使うというのが 、この問題にたいする通常の解決策です。ポイントとマークの位置を交換 する‘C-x C-x’で、マークがどこかチェックすることもできます。 • 通常マークがアクティブのときリージョンにたいして処理を行ういくつか のコマンドは、そのような振る舞いをしなくなります。たとえば普通‘M-%’ (‘query-replace’)は、マークがアクティブのときはリージョンにたいして 置換を行います。Transient Markがオフだと、常にポイントからバッファ ーの最後までを処理します。このような方法で動作するコマンドは、コマ ンド自身のドキュメントにより識別できます。 Transient Markモードがオフのときは、‘C- C-’または‘C-u C-x C-x’を使って一時的にアクティブにすることができます。 ‘C- C-’ ポイント位置にマークをセット(普通の‘C-’と同様)して、マークが非 アクティブになるまでの間、1度だけTransient Markモードを有効にします (実際にはこれは独立したコマンドではなく‘C-’コマンドを2回行って います)。 ‘C-u C-x C-x’ ポイントとマークを交換してからマークをアクティブにして、次にマーク が非アクティブになるまでの間、Transient Markモードを一時的に有効に します(これはプレフィクス引数を指定した‘C-x C-x’ (‘exchange-point-and-mark’)コマンドです)。 これらのコマンドはマークをセットまたはアクティブにして、マークが非ア クティブになるまでの間Transient Markモードを有効にします。これらを使う 1つの理由は、いくつかのコマンドはTransient Markモードがオフのとき、リー ジョンにたいしてではなくバッファー全体を処理するからです。Transient Markモードを一時的に有効にできれば、これらのコマンドをリージョンにたいし て処理させることができます。 リージョンをマウス(*note Setting Mark::を参照してください)、またはシ フト選択(*note Shift Selection::を参照してください)で指定したときも、一 時的にTransient Markモードが有効になり、リージョンがハイライトされます。 12 テキストのkillと移動 *********************** Emacsで“kill”とはテキストを消去して、“killリング”にコピーすることを意味 します。“yank”とは、killリングからテキストを取り出して、バッファーに戻す ことを意味します(“cut(カット、切り取り)”と“paste(ペースト、貼り付け)”と いう用語を使うアプリケーションもあります)。これはテキストブロックのセッ トが、循環的にアクセスできるリングに格納されているイメージから、killリン グと名付けられました。*note Kill Ring::を参照してください。 killとyankは、Emacsでテキストを移動したりコピーするための、もっとも一 般的な方法です。これは用途が広いコマンドです。なぜなら、多くの異なる種類 の構文単位をkillするためのコマンドが存在するからです。 12.1 削除とkill =============== バッファーからテキストを消去するコマンドの多くは、それをkillリング(*note Kill Ring::を参照)に保存します。これらは“kill”コマンドとして知られており 、通常名前に‘kill’が含まれます(例 ‘kill-line’)。killリングには、最近 killしたものが、1つだけではなくいくつか格納されているので、killはとても 安全な操作と言えます。なぜなら、以前にkillしたテキストが失われる心配をす る必要がないからです。killリングは、すべてのバッファーで共有されているの で、あるバッファーでkillしたテキストを、別のバッファーにyankすることがで きます。 ‘C-/’ (‘undo’)を使うと、killコマンドはアンドゥ(*note Undo::を参照して ください)されるので、killしたテキストはバッファーに戻されますが、killリ ングからは削除されません。 グラフィカルなディスプレーでは、テキストをkillすると、それはシステム のクリップボードにもコピーされます。 *note Cut and Paste::を参照してくだ さい。 テキストを消去してkillリングに保存しないコマンドは、“削除(delete)”コ マンドとして知られており、名前に‘delete’が含まれています。これらは‘C-d’ (‘delete-char’)や (‘delete-backward-char’)のように、一度に1文字削除 するものや、スペースや改行だけを削除するものが含まれます。重要なデータの 有意な量を消去するコマンドには、一般的にkill操作が用いられます。 killとyankでマウスを使うこともできます。*note Cut and Paste::を参照し てください。 12.1.1 削除 ----------- 削除とは、テキストを消去してkillリングに保存しないという意味です。テキス トを削除するたいていのEmacsコマンドは、1文字または空白文字しか消去しませ ん。 ‘’ ‘’ 前の文字を削除します。リージョンがアクティブのときは、リージョンの テキストを削除します(‘delete-backward-char’)。 ‘’ 次の文字を削除します。リージョンがアクティブのときは、リージョンの テキストを削除します(‘delete-forward-char’)。 ‘C-d’ 次の文字を削除します(‘delete-char’)。 ‘M-\’ ポイントの周囲のスペースとタブを削除します (‘delete-horizontal-space’)。 ‘M-’ スペースを1つ残して、ポイントの周囲のスペースとタブを削除します (‘just-one-space’)。 ‘C-x C-o’ 現在行の周囲の空行を削除します(‘delete-blank-lines’)。 ‘M-^’ 行間にある改行をインデントと共に削除して2行を1行にします (‘delete-indentation’)。 基本的な削除コマンド (‘delete-backward-char’)、 (‘delete-forward-char’)、‘C-d’ (‘delete-char’)については既に説明しました 。*note Erasing::を参照してください。数引数を指定すると、指定した数の文 字を削除します。リージョンがアクティブのとき、数引数に1を指定するか省略 した場合、は、リージョンのすべてのテキストを削除します。 他の削除コマンドは、空白文字(スペース、タブ、改行)だけを削除するもの です。‘M-\’ (‘delete-horizontal-space’)は、ポイントの前後にあるすべての スペースとタブを削除します。プレフィクス引数を指定すると、ポイントの前に あるスペースとタブだけを削除します。‘M-’ (‘just-one-space’)も同様で すが、前にスペースが何個あるかに関係なく、ポイントの前に1つのスペースを 残します。数引数Nを指定すると、Nが正のときはポイントの前に、N個のスペー スを残します。Nが負の場合は、スペースとタブに加えて改行も削除し、ポイン トの前に-N個のスペースを残します。コマンド‘cycle-spacing’は、 ‘just-one-space’のようなコマンドで、よりフレキシブルな動作をします。これ は連続で呼び出すと異なる処理を行います。1番目の呼び出しでは ‘just-one-space’と同様の処理をし、2番目の呼び出しではすべての空白文字を 削除し、3番目の呼び出しでは元の空白文字を復元します。 ‘C-x C-o’ (‘delete-blank-lines’)は、現在行の下にあるすべての空行を削 除します。現在行が空行のときは、現在行の上にあるすべての空行も削除します (空行を1つ、つまり現在行は残します)。単独の空行で実行するとその行を削除 します。 ‘M-^’ (‘delete-indentation’)は、改行と周囲のスペース(通常1つのスペー スを残す)を削除することにより、現在行とその上の行を結合します。*note M-^: Indentation.を参照してください。 コマンド‘delete-duplicate-lines’は、リージョン内の重複した行を検索し て、それぞれ1行を残して削除します。通常は重複した行の最初の行を残します が、プレフィクス引数‘C-u’を指定すると、最後の行を残します。プレフィクス 引数‘C-u C-u’を指定すると、隣接した重複行だけを検索します。これは行がソ ート済みのとき効果的です。プレフィクス引数‘C-u C-u C-u’を指定すると、連 続する空行は残します。 12.1.2 行のkill --------------- ‘C-k’ 行の残り、または1行以上をkillします(‘kill-line’)。 ‘C-S-backspace’ 1度に行全体を削除します(‘kill-whole-line’)。 もっとも簡単なkillコマンドは、‘C-k’ (‘kill-line’)です。これを行末で使 うと、その行を終端している改行をkillして、現在行と次の行を継げます(空行 なら削除します)。そうでない場合、‘C-k’はポイントから行末までを削除します 。ポイントの元の位置が行頭の場合は、空行が残ります。 どちらのケースを適用するか決める際には、行末のスペースとタブは無視さ れます。ポイントが行の一番最後の非空白文字の後にあるとき、‘C-k’は改行を killすることに注意してください。空でない行全体をkillするときは、行頭で ‘C-k’を2回タイプしてください。 このコンテキストで“行”とは、スクリーン行ではなく論理行を意味します (*note Continuation Lines::を参照してください)。 ‘C-k’に正の数値Nを与えると、N行とそれに続く改行をkillします(現在行の ポイントの前にあるテキストはkillされません)。負の引数−Nを与えると、現在 行のポイントの前にあるテキストと、前のN行をkillします。‘C-k’に0を指定す ると、現在行のポイントの前にあるテキストをkillします。 変数‘kill-whole-line’が非‘nil’のときは、行頭での‘C-k’により行末の改行 も含めて行全体がkillされます。この変数は通常‘nil’です。 ‘C-S-backspace’ (‘kill-whole-line’)は行中のポイントの位置に関わらず、 改行を含めた行全体をkillします。キーシーケンス‘C-S-backspace’をタイプで きないテキスト端末がたくさんあることに注意してください。 12.1.3 その他のkillコマンド --------------------------- ‘C-w’ リージョンをkillします(‘kill-region’)。 ‘M-w’ リージョンをkillリングにコピーします(‘kill-ring-save’)。 ‘M-d’ 次の単語をkillします(‘kill-word’)。*note Words::を参照してください 。 ‘M-’ 後方に1単語killします(‘backward-kill-word’)。 ‘C-x ’ センテンスの先頭までを後方にkillします(‘backward-kill-sentence’)。 *note Sentences::を参照してください。 ‘M-k’ 文の末尾までをkillします(‘kill-sentence’)。 ‘C-M-k’ 後に続く対応のとれた式(balanced expressions)をkillします (‘kill-sexp’)。*note Expressions::を参照してください。 ‘M-z CHAR’ 次のCHARまでをkillします(‘zap-to-char’)。 一般によく使われるkillコマンドは‘C-w’ (‘kill-region’)で、これはリージ ョンのテキストをkillします(*note Mark::を参照してください)。同様に‘M-w’ (‘kill-ring-save’)は、バッファーからテキストを消去せずに、リージョンのテ キストをkillリングにコピーします。‘C-w’または‘M-w’をタイプしたとき、マー クが非アクティブの場合、これらのコマンドはポイントと最後にセットしたマー クの間にあるテキストにたいして処理を行います(*note Using Region::を参照 してください)。 Emacsは特定の構文単位にたいするkillコマンドを提供します。単語 (words)にたいしては‘M-’と‘M-d’(*note Words::を参照してください)、対 応のとれた式(balanced expressions)にたいしては‘C-M-k’(*note Expressions::を参照してください)、センテンス(sentences: 文)にたいしては ‘C-x ’‘M-k’(*note Sentences::を参照してください)です。 コマンド‘M-z’ (‘zap-to-char’)は、killと検索が組み合わされています。こ れは文字を読み取り、ポイントからバッファー内の次にその文字が現れる場所ま でをkillします。数引数は繰り返し回数です。負の引数の場合は後方に検索する ことを意味し、ポイントの前のテキストをkillします。 12.1.4 killのオプション ----------------------- いくつかの特別なバッファーは、“読み取り専用(read-only)のテキスト”を含ん でいて、それらは変更できないのでkillもできません。killコマンドは読み取り 専用のバッファーにたいして特別な動作をします。バッファーから実際にテキス トを削除せずに、killリングにコピーします。通常はビープ音をならし、その旨 のエラーメッセージを表示します。しかし変数‘kill-read-only-ok’を非‘nil’に セットすると、なぜテキストが消去されないのかをエコーエリアにメッセージ表 示します。 変数‘kill-do-not-save-duplicates’を非‘nil’に変更すると、同じものにた いするkillは重複なくkillリングの1つのエントリーとなります。 12.2 yank ========= “yank”するとは、以前killしたテキストを再び挿入するという意味です。テキス トを移動またはコピーする通常の方法は、それをkillしてからどこかにyankする 方法です。 ‘C-y’ 最後にkillしたものをポイント位置にyankします(‘yank’)。 ‘M-y’ yankしたテキストを、それより前にkillしたテキストに置き換えます (‘yank-pop’)。*note Earlier Kills::を参照してください。 ‘C-M-w’ 次のコマンドがkillコマンドのときは、killしたものを、以前にkillした ものに追加します(‘append-next-kill’)。*note Appending Kills::を参照 してください。 基本的なyankコマンドは、‘C-y’ (‘yank’)です。これはもっとも最近killさ れたものを挿入し、カーソルを挿入されたテキストの最後に移動します。また挿 入されたテキストの先頭にマークをセットして、それを非アクティブにします。 これにより‘C-u C-’で簡単にその位置にジャンプできます(*note Mark Ring::を参照してください)。 ‘C-u C-y’のようにプレフィクス引数を指定すると、カーソルを挿入されたテ キストの前に移動して、マークをテキストの最後にセットします。他のプレフィ クス引数は、何回前のkillかを指定します。たとえば‘C-u 4 C-y’は、もっとも 最近killされたものから4番目に古いものを挿入します。 グラフィカルなディスプレーでは、‘C-y’はまず最後にEmacsがkillした後に 、他のアプリケーションがシステムのクリップボードに、何らかのテキストをコ ピーしていないか調べます。もしコピーしていたなら、かわりにクリップボード のテキストを挿入します。このようにEmacsは効果的に“カット(cut)”や“コピー (copy)”などの、他のアプリケーションで処理されたクリップボード操作を、 Emacsのkillのように扱います(ただしkillリングには記録されません)。詳細に ついては、*note Cut and Paste::を参照してください。 12.2.1 killリング ----------------- “killリング(kill ring)”とは、以前にkillされたテキストブロックからなるリ ストです。すべてのバッファーにたいして、killリングは1つしかないので、あ るバッファーでkillしたテキストを、他のバッファーにyankすることができます 。これはバッファーから他のバッファーへテキストを移動する、通常の方法です (他の方法もいくつかあります。たとえばテキストをレジスターに格納すること もできます。*note Registers::を参照してください。テキストを移動する他の 方法については、*note Accumulating Text::を参照してください)。 killリングのエントリーの最大数は、変数‘kill-ring-max’で制御されます。 デフォルトは60です。エントリー数が制限に達しているとき新たにkillすると、 Emacsはkillリングの一番古いエントリーを削除して空きを作ります。 killリングの実際の内容は、‘kill-ring’という名前の変数に格納されていま す。killリングのエントリーの内容は、‘C-h v kill-ring’で見ることができま す。 12.2.2 過去にkillしたテキストをyankする --------------------------------------- *note Yanking::で説明したように、‘C-y’に数引数を指定して、最後にkillされ たものではないテキストをyankできます。これはkillリングのどのエントリーが 欲しいか覚えているとき便利です。もし覚えていないときは、‘M-y’ (‘yank-pop’)コマンドを使って、候補を探すことができます。 もし前のコマンドがyankコマンドのとき、‘M-y’はyankされたテキストを、 1つ前にkillされたテキストで置き換えます。つまり2番目に新しいkillされたテ キストを復元するには、最初に‘C-y’で最後にkillされたテキストをyankし、次 に‘M-y’でその1回前にkillされたテキストで置き換えます。‘M-y’は、‘C-y’また は他の‘M-y’の後しか使えません。 killリングのエントリーを指す(ポイントする)、last yankポインターという 概念で、‘M-y’を理解できるでしょう。なにかをkillする度に、last yankポイン ターはリングの先頭に新たに作られたエントリーを指すように移動します。 ‘C-y’は、last yankポインターが指すエントリーをyankします。‘M-y’はlast yankポインターが違うエントリーを指すように移動して、バッファーのテキスト をポインターが指すテキストに変更します。‘M-y’コマンドを繰り返すことによ り、リングの任意のエントリーにポインターを移動できるので、任意のエントリ ーをバッファーに取り込むことができます。やがてリングの最後に到達すると、 次の‘M-y’により再び最初のエントリーに戻ります。 ‘M-y’はリング内でlast yankポインターを移動させますが、リング内のエン トリーの順番は変更しません。リングのエントリーは、常に最後にkillされたも のを先頭に、記憶されているもので一番古いエントリーへと並んでいます。 last-yankポインターを何回進めるかを、‘M-y’に数引数で指定できます。負 の引数はリングの先頭に向かってポインターを移動させます。リングの先頭では 一番古いエントリーに戻り、そこから先頭へと移動します。 望むテキストを見つけてバッファーに取り込んだら、‘M-y’コマンドを止めれ ばそのテキストはそこに残ります。このテキストはkillリングのエントリーの単 なるコピーなので、それを編集してもリングの中のエントリーは変更されません 。新しく何かをkillしない限り、last-yankポインターは同じ位置に留まるので 、‘C-y’でそのテキストの別のコピーをyankできます。 ‘C-y’に数引数を指定するときも、yankするエントリーにlast-yankポインタ ーをセットします。 12.2.3 killしたテキストの追加 ----------------------------- 通常はkillコマンドを実行するごとに、新しいエントリーがkillリングにpushさ れます。しかし2回以上の連続するkillコマンドにより、killされたテキストを 1つのエントリーとしてまとめ、すべてのテキストを1単位として、あたかもそれ がkillされたかのように、1回の‘C-y’でyankできます。 つまりテキストを1つの単位としてyankしたいとき、そのテキストすべてを 1回でkillする必要はありません。すべてがkillされるまで行から行、単語から 単語へとkillを続け、それを一度に取得することができます。 ポイントから前方にkillするコマンドは、直前にkillされたテキストの最後 に追加します。ポイントから後方にkillするコマンドは、テキストの先頭に追加 します。この方法により前方と後方を併用した連続するkillコマンドは、すべて のkillされたテキストを再配置しなくてもよいように、1つのエントリーにまと めます。数引数を指定してもkillの連続性は途切れません。たとえば以下のよう なテキストを含むバッファーがあるとしましょう: This is a line ★of sample text. ポイントの位置は★で示された場所です。‘M-d M- M-d M-’とタイプし て、前方と後方へのkillを交互に行うと、最後にkillリングには‘a line of sample’という1つのエントリー、バッファーには‘This is text.’が残ります (‘is’と‘text’の間には2つのスペースがあることに注意してください。これは ‘M-’または‘M-q’で取り除くことができます)。 同じテキストをkillする別の方法は、‘M-b M-b’で単語2つ後方に移動してか ら、‘C-u M-d’で前方の単語4つをkillする方法です。これはバッファーとkillリ ングに、正確に同じ結果をもたらします。‘M-f M-f C-u M-’で後方に killしても結果は同じです。killリングのエントリーは、常にバッファーから killされる前と同じ順番になります。 killコマンドと最後のキルコマンドの間に、(単なる数引数ではない)他のコ マンドが入ると、killリングには新たなエントリーが作られます。しかし、あら かじめ‘C-M-w’ (‘append-next-kill’)とタイプすることにより、最後にkillされ たテキストに追加するように強制できます。‘C-M-w’は、後に続くコマンドが killコマンドであれば、killしたテキストを前にkillしたテキストに付け加える よう指示します。この方法でも、前方にkillするコマンドの場合は、前にkillさ れたテキストの最後に追加され、後方にkillするコマンドの場合は、先頭に追加 されます。この方法により、1ヶ所にyankするために離れた場所にあるいくつか のテキスト断片を、killして集めることができます。 ‘M-w’ (‘kill-ring-save’)の後のkillコマンドは、‘M-w’でkillリングにコピ ーされたテキストへの追加はしません。 12.3 グラフィカルなディスプレーでのカットアンドペースト ======================================================= ほとんどのグラフィカルなデスクトップ環境では、異なるアプリケーション間の データ転送(通常はテキスト)に、“クリップボード(clipboard)”と呼ばれるシス テム機能を使います。Xでは他にプライマリー選択(primary selection)とセカン ダリー選択(secondary selection)という、同様の機能が利用可能です。Emacsを グラフィカルなディスプレーで実行している場合、killとyankコマンドはこれら の機能に統合されているので、Emacsと他のグラフィカルアプリケーション間で 、簡単にテキストを転送できます。 デフォルトでは、Emacsはプログラム間テキスト転送のコーディングシステム として、UTF-8を使います。もしコピーしたテキストが期待したものでない場合 、‘C-x x’または‘C-x X’とタイプして、他のコーディングシステム を指定できます。‘x-select-request-type’をカスタマイズして、異なるデータ タイプを要求することもできます。*note Communication Coding::を参照してく ださい。 12.3.1 クリップボードを使う --------------------------- “クリップボード(clipboard)”とは、ほとんどのグラフィカルなアプリケーショ ンが、“カットアンドペースト”のために使う機能です。もしクリップボードが存 在する場合、Emacsのkillおよびyankコマンドもそれを使います。 何らかのテキストを、‘C-w’ (‘kill-region’)のようなコマンドでkillしたり 、‘M-w’ (‘kill-ring-save’)のようなコマンドでkillリングにコピーしたとき、 そのテキストはクリップボードにも転送されます。 Emacsのkillコマンドがテキストをクリップボードに転送すると、通常クリッ プボードの既存の内容は失われます。オプションとして、 ‘save-interprogram-paste-before-kill’を‘t’に変更できます。これにより、 Emacsは古いクリップボードのデータが失われることを防ぐために、最初にクリ ップボードのデータをkillリングに保存します。これにはデータが大きくなると 、メモリー消費が増えるというリスクがあります。 ‘C-y’ (‘yank’)のようなyankコマンドもクリップボードを使います。他のア プリケーションがクリップボードを“所有”する場合(たとえばEmacsで最後に killコマンドを実行した後に、他のアプリケーションでテキストをカットまたは コピーした場合)、Emacsはkillリングではなくクリップボードからyankします。 通常killリングを‘M-y’ (‘yank-pop’)で巡回することでは、クリップボード は変更されません。しかし‘yank-pop-change-selection’を‘t’に変更すると、 ‘M-y’は新しいyankをクリップボードに保存します。 killおよびyankコマンドがクリップボードにアクセスしないようにするには 、変数‘select-enable-clipboard’を‘nil’に変更してください。 多くのXデスクトップ環境は、“クリップボードマネージャー(clipboard manager)”と呼ばれる機能をサポートします。もしEmacsがクリップボードのデー タの現在の“持ち主”のときにEmacsを終了し、そのときクリップボードマネージ ャーが実行されていると、Emacsはクリップボードのデータをクリップボードマ ネージャーに転送するのでデータは失われません。ある状況において、これは Emacsが終了するが遅くなる原因となります。Emacsがクリップボードマネージャ ーにデータを転送しないようにするには、変数 ‘x-select-enable-clipboard-manager’を‘nil’に変更してください。 通常、クリップボードを通じて渡されるNULバイトを含む文字列は切り詰めら れるため、Emacsはシステムのクリップボードに転送する前に、そのような文字 を“\\0”に置き換えます。 Emacs 24以前は、killおよびyankコマンドは、クリップボードではなくプラ イマリー選択(*note Primary Selection::を参照してください)を使っていまし た。もしこのほうがよいなら、‘select-enable-clipboard’を‘nil’、 ‘select-enable-primary’を‘t’、‘mouse-drag-copy-region’を‘t’に変更してく ださい。この場合は、次のコマンドを使って、クリップボードに明示的にアクセ スできます。リージョンをkillしてクリップボードに保存するには ‘clipboard-kill-region’、リージョンをkillリングにコピーするとともにクリ ップボードに保存するには‘clipboard-kill-ring-save’、クリップボードの内容 をポイント位置にyankするには‘clipboard-yank’です。 12.3.2 他のウィンドウアプリケーションにたいするカットアンドペースト ------------------------------------------------------------------- Xウィンドウシステム下では、“プライマリー選択(primary selection)”に、Xア プリケーションで最後に選択されたテキスト(通常はマウスのドラッグで選択さ れる)が存在します。一般的に、このテキストは他のXアプリケーションに ‘mouse-2’をクリックして挿入することができます。プライマリー選択はクリッ プボードとは別のものです。プライマリー選択の内容は、より脆弱です。なぜな ら、クリップボードは明示的なカットまたはコピーだけにより上書きされるのに くらべ、プライマリー選択はマウスでテキストが選択される度に上書きされるか らです。 Xの下では、リージョンがアクティブ(*note Mark::を参照してください)にな ればいつでも、リージョンのテキストはプライマリー選択に保存されます。これ は、そのリージョンの選択がマウスでドラッグやクリック(*note Mouse Commands::を参照してください)されたのか、キーボードコマンド(たとえば ‘C-’をタイプしてからポイントを移動したなど。*note Setting Mark::を 参照してください)なのかによらず適用されます。 変数‘select-active-regions’を‘only’に変更すると、Emacsは一時的にアク ティブになったリージョン(たとえばマウスやシフト選択など。*note Shift Selection::を参照してください)だけをプライマリー選択に保存します。 ‘select-active-regions’を‘nil’に変更すると、Emacsはアクティブなリージョ ンをプライマリー選択に保存しません。 プライマリー選択をEmacsのバッファーに挿入するには、挿入したい場所で ‘mouse-2’ (‘mouse-yank-primary’)をクリックします。*note Mouse Commands::を参照してください。 MS-Windowsはプライマリー選択を提供しませんが、Emacsは単一のEmacsセッ ション内で選択されたテキストを内部に格納することにより、これをエミュレー トします。したがってWindowsでも、プライマリー選択に関するすべての機能と コマンドは、Xと同様に機能します。しかしこれは同一セッションにおけるカッ トやペーストなどの場合で、Emacsセッションと他のアプリケーション間では機 能しません。 12.3.3 セカンダリー選択 ----------------------- プライマリー選択に加えて、Xウィンドウシステムは“セカンダリー選択 (secondary selection)”として知られる、同様な第2の機能を提供します。最近 ではセカンダリー選択を使うXアプリケーションの数は多くありませんが、以下 のEmacsコマンドによりアクセスできます: ‘M-Drag-mouse-1’ ボタンを押した場所からボタンを話した場所までを、セカンダリー選択と してセットします(‘mouse-set-secondary’)。ドラッグして選択されたテキ ストは、フェイス‘secondary-selection’を使ってハイライトされます。ウ ィンドウの上端または下端を越えてマウスをドラッグすると、 ‘mouse-set-region’と同様にウィンドウは自動的にスクロールします (*note Mouse Commands::を参照してください)。 このコマンドはkillリングを変更しません。 ‘M-mouse-1’ “セカンダリー選択”の始点をセットします(‘mouse-start-secondary’)。 ‘M-mouse-3’ ‘M-mouse-1’で指定された位置から、クリックされた点を終点とするセカン ダリー選択をセットします(‘mouse-secondary-save-then-kill’)。これは 選択されたテキストをkillリングにも保存します。同じ場所での2回目の ‘M-mouse-3’は、作成されたセカンダリー選択をkillします。 ‘M-mouse-2’ クリックした場所にセカンダリー選択を挿入し、ポイントをyankしたテキ ストの最後に配します(‘mouse-yank-secondary’)。 ‘Mouse-1’と同様、‘M-mouse-1’のダブルクリックで単語、トリプルクリック で行を処理します。 ‘mouse-yank-at-point’が非‘nil’の場合、‘M-mouse-2’はポイント位置に yankします。どこをクリックしたか、さらにはフレームのどのウィンドウをクリ ックしたかは関係ありません。*note Mouse Commands::を参照してください。 12.4 テキストの追加 =================== テキストのコピーや移動は、それをkillしてyankすることにより通常行います。 しかし多くの箇所にあるテキストブロックをコピーしたり、たくさんのテキスト の断片を1ヶ所にコピーする便利な方法があります。ここではテキストの断片を 、バッファーやファイルに追加するコマンドを説明します。 ‘M-x append-to-buffer’ リージョンを指定したバッファーの内容の後に追加(append)します。 ‘M-x prepend-to-buffer’ リージョンを指定したバッファーの内容の前に追加(prepend)します。 ‘M-x copy-to-buffer’ リージョンを指定したバッファーにコピーして、バッファーの古い内容は 削除されます。 ‘M-x insert-buffer’ 指定したバッファーの内容を、現在のバッファーのポイント位置に挿入し ます。 ‘M-x append-to-file’ リージョンを指定したファイルの内容の最後に追加します。 テキストをバッファーに追加するには、‘M-x append-to-buffer’を使います 。これはバッファー名を読み取り、リージョンのコピーを指定したバッファーに 挿入します。存在しないバッファーを指定すると、‘append-to-buffer’はそのバ ッファーを作成します。テキストは、そのバッファーのポイント位置に挿入され ます。バッファーを編集用に使っていると、コピーされたテキストはその時ポイ ントがあった位置に挿入されます。 バッファーのポイントは、コピーされたテキストの最後に残ります。連続し て‘append-to-buffer’を使うと、テキストは指定したバッファーにコピーした順 番で追加されていきます。厳密に言うと‘append-to-buffer’は既存のバッファー のテキストにたいして、常に追加をする訳ではありません。これはポイントがバ ッファーの最後にあるときに追加をします。しかしバッファーを変更するのに ‘append-to-buffer’しか使わない場合、ポイントは常にバッファーの最後に位置 することになります。 ‘M-x prepend-to-buffer’も‘append-to-buffer’と同様ですが、他のバッファ ーのポイントはコピーされたテキストの前に置かれるので、連続してこのコマン ドを使用すると、テキストは逆の順番に追加されます。‘M-x copy-to-buffer’も 同様ですが、他のバッファーの既存の内容は削除されるので、バッファーの内容 は新しくコピーされたテキストだけになります。 コマンド‘M-x insert-buffer’は、追加するテキストを他のバッファーから取 得するために使われます。これはバッファー名の入力を求め、そのバッファーの すべてのテキストのコピーを、現在のバッファーのポイント位置に挿入します。 ポイントは挿入されたテキストの先頭になります。挿入されたテキストの最後の 位置もマークリングに追加されます。マークは非アクティブになります。バッフ ァーに関する背景情報は、*note Buffers::を参照してください。 バッファーのテキストを追加するかわりに、‘M-x append-to-file’でテキス トを直接ファイルに追加できます。これはファイル名の入力を求め、リージョン のテキストを指定されたファイルの最後に追加します。ディスク上のファイルは すぐに変更されます。 ‘append-to-file’は、Emacsがvisitして_いない_ファイルだけに使うべきで す。Emacsで編集中のファイルにたいして使用すると、それはEmacsの背後でファ イルが変更されることになるため、編集内容が失われる可能性があります。 テキストの移動に関する他の方法はレジスターに格納する方法です。*note Registers::を参照してください。 12.5 矩形領域(Rectangles) ========================= “矩形領域(rectangle)”コマンドは、テキストの矩形領域を操作します。矩形領 域のテキストとは、特定の行範囲内にある、特定の2つの列の間にある文字すべ ての文字です。Emacsには矩形領域にたいしてkill、yank、クリアー、スペース やテキストでフィル、削除を行うコマンドがあります。矩形領域コマンドは、複 数列のテキストを操作したり、テキストをそのように変更したり戻したりする場 合に便利です。 コマンドで操作する矩形領域を指定するには、一方の角にマークを設定し、 その対角にポイントを置きます。このように設定した矩形領域を矩形リージョン (region-rectangle)と呼びます。ポイントとマークが同じ列の場合、矩形リージ ョンは空になります。ポイントとマークが同じ行の場合、矩形リージョンの高さ は1行になります。 矩形リージョンは、リージョンの制御と大体同じ方法で制御できます。しか し、ポイントとマークの組がリージョンとして解釈されるのか、あるいは矩形領 域として解釈されるかは、それらを使うコマンドに依存することに注意してくだ さい。 ‘C-x r k’ 矩形リージョンをkillして、最後にkillされた矩形領域として、その内容 を保存します(‘kill-rectangle’)。 ‘C-x r M-w’ 矩形リージョンのテキストを、最後にkillされた矩形領域として保存しま す(‘copy-rectangle-as-kill’)。 ‘C-x r d’ 矩形リージョンのテキストを削除します(‘delete-rectangle’)。 ‘C-x r y’ 最後にkillされた矩形領域の左上隅がポイント位置になるようにyankしま す(‘yank-rectangle’)。 ‘C-x r o’ 矩形領域にスペースを挿入します(‘open-rectangle’)。これにより矩形リ ージョンの以前の内容は右にずれます。 ‘C-x r N’ 矩形リージョンの左端に行番号を挿入します (‘rectangle-number-lines’)。これにより矩形リージョンの以前の内容は 右にずれます。 ‘C-x r c’ 矩形リージョンの内容をスペースに置き換えてクリアーします (‘clear-rectangle’)。 ‘M-x delete-whitespace-rectangle’ 指定された矩形領域の各行で、矩形領域の左端の列から空白文字を削除し ます。 ‘C-x r t STRING ’ 矩形領域の各行にたいして、内容をSTRINGに置き換えます (‘string-rectangle’)。 ‘M-x string-insert-rectangle STRING ’ 矩形領域の各行にたいして、STRINGを挿入します。 ‘C-x ’ Rectangle Markモードを切り替えます(‘rectangle-mark-mode’)。このモー ドがアクティブのとき矩形領域はハイライトされ、拡大・縮小が可能にな ります。標準のkillおよびyankコマンドは、それにたいして操作を行いま す。 矩形領域の操作は2種類に分類できます。それは矩形領域を消去または挿入す るものと、空の矩形領域を作るものです。 矩形領域のテキストを消去するには2つの方法があります。‘C-x r d’ (‘delete-rectangle’)はテキストを無条件に削除します。‘C-x r k’ (‘kill-rectangle’)はテキストを取り除いて、それを“最後にkillされた矩形領 域”として保存します。両方とも矩形領域の各行の指定したテキストを消去する ように、矩形リージョンを消去します。その行の後に続くテキストがある場合、 削除による隙間を生めるために後方に移動されます。 矩形領域のkillは普通のkillとは異なります。矩形領域はkillリングには保 存されず、一番最後にkillされた矩形領域だけを記録する、特別な場所に保存さ れます。矩形領域のyankは線形テキストのyankとは大きく異なるので、異なる yankコマンドが使われるからです。矩形領域にたいしてyankのpopは定義されて いません。 ‘C-x r M-w’ (‘copy-rectangle-as-kill’)は矩形領域用の‘M-w’に相当します 。これはバッファーからテキストを削除することなく、最後にkillされた矩形領 域として、矩形領域を記録します。 killされた矩形領域をyankするには、‘C-x r y’ (‘yank-rectangle’)とタイ プします。矩形領域の最初の行はポイント位置に挿入されます。矩形領域の2行 目はポイントの1行下の位置に挿入され、以下同様に挿入されていきます。影響 を受ける行数は、保存された矩形領域の高さにより決定されます。 たとえば1列のリスト2つを2列のリストに変換できます。一方の1列リストを 矩形領域としてkillしてもう一方の1列リストの隣にyankすればよいのです。 ‘C-x r r R’と‘C-x r i R’で、矩形領域をレジスターにコピーしたり取り出 したりできます。*note Rectangle Registers::を参照してください。 空の矩形領域を作るために使うことのできるコマンドが2つあります。‘C-x r c’ (‘clear-rectangle’)は、矩形リージョンの既存のテキストを空白に置き換え ます。‘C-x r o’ (‘open-rectangle’)は空白の矩形領域を挿入します。 ‘M-x delete-whitespace-rectangle’は、指定した列を起点に水平方向の空白 文字を削除します。これは矩形領域の各行に適用され、開始列は矩形領域の左端 です。矩形領域の右端はこのコマンドに影響を及ぼしません。 コマンド‘C-x r N’ (‘rectangle-number-lines’)は、矩形領域の左端に行番 号を挿入します。通常は矩形領域の最初の行を1として番号が開始されます。プ レフィクス引数を指定すると、このコマンドは開始番号と、番号を出力する際の 書式文字列(*note (elisp)Formatting Strings::を参照してください)の入力を 求めます。 コマンド‘C-x r t’ (‘string-rectangle’)は、矩形リージョンの各行を文字 列で置き換えます。文字列の幅は矩形領域と同じ幅である必要はありません。矩 形領域の後ろのテキストは、文字列の幅が少ないときは左に、文字列の幅が大き いときは右にシフトされます。 コマンド‘M-x string-insert-rectangle’は、‘string-rectangle’と同様です が、各行に文字列を挿入し、元の文字列は右にシフトされます。 コマンド‘C-x ’ (‘rectangle-mark-mode’)は、矩形リージョンをハイラ イトするか、標準のリージョンをハイライトするかを切り替えます(最初にリー ジョンをアクティブにする必要があります)。このモードが有効な場合、‘C-f’、 ‘C-n’などのコマンドは矩形領域に合ったやり方でリージョンのサイズを変更し 、kill、yankは矩形領域を処理します。*note Killing::を参照してください。 このモードはリージョンがアクティブな間だけ持続します。 標準のリージョンとは異なり、バッファー終端を越えたり、TABのような伸長 された空白スペースの中間のような、通常はポイントを置けない場所にも矩形リ ージョンのコーナーを置くことができます。 そのリージョンがrectangle-mark-modeにある場合、‘C-x C-x’は、矩形リー ジョンの4隅のコーナーを巡回する、コマンド ‘rectangle-exchange-point-and-mark’を実行します。これはマークされたテキ ストにたいする処理を呼び出す前に、矩形リージョンをのサイズを変更したい場 合に便利です。 12.6 CUAバインド ================ コマンド‘M-x cua-mode’は、多くのアプリケーションで使われている、 CUA(Common User Access)互換のキーバンドをセットアップします。 CUAモードが有効な場合、‘C-x’、‘C-c’、‘C-v’、‘C-z’などのキーは、カット (kill)、コピー、ペースト(yank)、アンドウのコマンドを呼び出します。 ‘C-x’と‘C-c’によるカットとコピーは、リージョンがアクティブなときだけ処理 されます。リージョンが非アクティブのときはプレフィクスキーとして動作する ので、‘C-x C-c’のような標準のEmacsコマンドは正常に機能します。変数 ‘mark-even-if-inactive’は‘C-x’と‘C-c’に影響を及ぼさないことに注意してく ださい(*note Using Region::を参照してください)。 マークがアクティブのときに‘C-x C-f’のようなEmacsコマンドを入力するに は、‘Shift’を押しながらプレフィクスキーを押す(例 ‘S-C-x C-f’)か、プレフ ィクスキーを素早く2回タイプ(例 ‘C-x C-x C-f’)します。 CUAモードがEmacs標準のキーバインドをオーバーライドするのを無効にしつ つ、以下で説明するそれ以外のCUAモードの機能は使う場合は、変数 ‘cua-enable-cua-keys’に‘nil’をセットしてください。 CUA モードはデフォルトでDelete-Selectionモード(*note Mouse Commands::を参照してください)を有効にするので、アクティブなリージョンが あるときテキストをタイプすると、そのテキストで置き換えられます。CUAモー ドでこれを無効にするには、変数‘cua-delete-selection’を‘nil’にセットして ください。 CUAモードは矩形領域を明白にハイライトする、強化された矩形領域サポート を提供します。‘C-’を使うことにより矩形領域の選択が開始され、移動コ マンドを使って拡張したり、‘C-x’と‘C-c’で切り取りとコピーができます。 により、矩形領域の四隅に時計方向へカーソルを移動させるので、任意の 方向に簡単に領域を拡張できます。タイプされた通常のテキストは、矩形領域の 各行の左か右(カーソルのある側)に挿入されます。 この矩形領域サポートは、‘cua-rectangle-mark-mode’コマンドを呼び出すこ とにより、CUAモードを有効にせずに使うこともできます。標準コマンド ‘rectangle-mark-mode’もあります。*note Rectangles::を参照してください。 CUAモードでは、テキストや矩形領域を簡単にレジスターに保存したり、取り 出すことができます。これは1桁の数引数をkill、copy、yankコマンドに指定し ます。たとえば‘C-1 C-c’はリージョンをレジスター‘1’にコピーし、‘C-2 C-v’は レジスター‘2’の内容をyankします。 CUAモードは、バッファー間での簡単にテキストを移動したりコピーするため のグローバルマーク機能も提供します。‘C-S-’を使って、グローバルマー クのオンとオフが切り替えられます。グローバルマークがオンのときは、killま たはコピーされたすべてのテキストは自動的にグローバルマークの位置に挿入さ れ、タイプしたテキストも現在のカーソル位置ではなくグローバルマークに挿入 されます。 たとえば複数のバッファーから単語をコピーして単語リストを作るには、単 語リストを作るバッファーにグローバルマークをセットします。次にリストにし たい単語をマーク(‘S-M-f’など)してから、‘C-c’か‘M-w’でリストにコピーしま す。そしてでリストにコピーされた単語の後ろに改行を挿入すればよいの です。 13 レジスター ************* Emacsの“レジスター(registers)”は、テキストや矩形領域、位置、その他、後で 使うものを保存するための区画です。一度テキストや矩形領域をレジスターに保 存すれば、それをバッファーに何度もコピーできます。一度場所をレジスターに 保存すれば、何度でもその場所にジャンプして戻ることができます。 各レジスターは1文字からなる名前があり、ここではRと表記することにしま す。Rには、英字(‘a’など)または数字(‘1’など)を使用できます。大文字小文字 は区別されるので、レジスター‘a’とレジスター‘A’は同じではありません。たと えば‘*’や‘C-d’のような、非英数字にレジスターをセットすることもできます。 ‘C-g’と‘ESC’は対話的なコマンドを終了させるために予約済みなので、これらの キーにレジスターをセットすることはできないことに注意してください。 レジスターには位置、テキスト、矩形領域、数字、ウィンドウの設定、ファ イル名が保存できますが、一度に保存できるのは1つです。レジスターに何か保 存すると、他の何かをそのレジスターに保存するまで残ります。レジスターRに 何が含まれているのか見るには。‘M-x view-register’を使います: ‘M-x view-register R’ レジスターRに何が含まれるかの説明を表示します。 レジスター名の入力を求めるコマンドはすべて、既存のレジスターを一覧す るプレビュー(preview)ウィンドウを遅延表示します。遅延の長さは ‘register-preview-delay’でカスタマイズできます。遅延を無効にするには、 ‘nil’をセットしてください。この場合、‘C-h’かで、明示的にプレビューウ ィンドウを要求できます。 “ブックマーク(Bookmarks)”はファイルと位置を記録するので、ファイルを再 び見るときは記録された位置から閲覧できます。ブックマークも本質的にレジス ター同じなので、このチャプターに記載します。 13.1 レジスターに位置を保存する =============================== ‘C-x r R’ 現在のバッファーのポイント位置をレジスターRに記録します (‘point-to-register’)。 ‘C-x r j R’ レジスターRに記録されたバッファーの位置にジャンプします (‘jump-to-register’)。 ‘C-x r ’ (‘point-to-register’)と、それに続けて文字‘R’をタイプす ると、ポイント位置と現在のバッファーの両方をレジスターRも保存します。レ ジスターは他の何かが保存されるまでこの情報を保持します。 コマンド‘C-x r j R’は、Rに記録されたバッファーに切り替えて、記録され た位置にポイントを移動します。レジスターの内容は変わらないので、保存した 位置に何度でもジャンプできます。 ‘C-x r j’を使って保存した位置に移動するとき、保存されたバッファが killされていた場合、‘C-x r j’は同じファイルをvisitしてバッファーを生成し ようと試みます。もちろんこれはファイルをvisitしたバッファーだけの動作で す。 13.2 レジスターにテキストを保存する =================================== 同じテキストのコピーを何回も挿入したいとき、killリングからyankするのは不 便です。なぜなら何かkillするたびに、そのエントリーはリングの下の方へ移動 してしまうからです。代替として、テキストをレジスターに保存して、後で取り 出す方法があります。 ‘C-x r s R’ リージョンをレジスターRにコピーします(‘copy-to-register’)。 ‘C-x r i R’ レジスターRからテキストを挿入します(‘insert-register’)。 ‘M-x append-to-register R’ リージョンをレジスターRのテキストに追加します。 レジスターRの内容がテキストの場合、そのレジスターに追加するのに‘C-x r +’ (‘increment-register’)も使用できます。レジスターRに数値が含ま れている場合、コマンド‘C-x r +’は違う動作をすることに注意してくださ い。*note Number Registers::を参照してください。 ‘M-x prepend-to-register R’ リージョンをレジスターRの先頭に追加します。 ‘C-x r s R’は、リージョンのテキストのコピーを、Rという名前のレジスタ ーに保存します。マークが非アクティブのとき、Emacsはまず最後にセットされ たマークをアクティブにします。マークはこのコマンドの最後に非アクティブに なります。*note Mark::を参照してください。同じコマンドにプレフィクス引数 を指定した‘C-u C-x r s R’は、テキストのコピーをレジスターRに保存してから 、バッファーのテキストを削除します。これはリージョンのテキストを、レジス ターに移動したと考えることができます。 ‘M-x append-to-register R’は、リージョンのテキストのコピーを、 Rという名前のレジスターにすでに保存されているテキストに追加します。プレ フィクス引数を指定した場合、レジスターに追加した後にリージョンを削除しま す。コマンド‘prepend-to-register’も同様ですが、これはリージョンのテキス トをレジスターのテキストの_最後_ではなく_先頭_に追加します。 ‘append-to-register’と‘prepend-to-register’を使ってテキストを集める場 合、セパレーターを使って個々に集めたテキストを分割したい場合があります。 そのようなときは‘register-separator’を構成して、セパレーター文字列をその レジスターに保存します。たとえばテキストを収集する過程で、個々のテキスト を2つの改行で分けたい場合、以下の設定を使うことができます。 (setq register-separator ?+) (set-register register-separator "\n\n") ‘C-x r i R’は、レジスターRのテキストをバッファーに挿入します。通常は ポイントをテキストの後に置き、非アクティブのマークをテキストの前にセット します。数引数を指定したときは、ポイントをテキストの前、マークをテキスト の後にセットします。 13.3 レジスターに矩形領域を保存する =================================== レジスターには線形のテキストだけでなく、矩形領域も保存できます。バッファ ーで矩形領域を指定する方法は、*note Rectangles::を参照してください。 ‘C-x r r R’ 矩形リージョンをレジスターRにコピーします (‘copy-rectangle-to-register’)。数引数を指定するとコピー後に矩形リ ージョンを削除します。 ‘C-x r i R’ レジスターRに矩形リージョンが保存されている場合、それを挿入します (‘insert-register’)。 前に*note Text Registers::でも説明した‘C-x r i R’ (‘insert-register’)コマンドは、レジスターに矩形領域が保存されているとき はテキストではなく矩形領域を挿入します。 13.4 レジスターにウィンドウ設定を保存する ========================================= 選択されたフレームのウィンドウの設定や、すべてのフレームのすべてのウィン ドウの設定もレジスターに保存して、後で設定を復元することができます。ウィ ンドウの設定については、*note Windows::を参照してください。 ‘C-x r w R’ 選択されたフレームのウィンドウの設定を、レジスターRに保存します (‘window-configuration-to-register’)。 ‘C-x r f R’ すべてのフレームおよびフレームに含まれるすべてのウィンドウの状態を 、レジスターRに保存します(‘frameset-to-register’)。 ‘C-x r j R’を使うと、ウィンドウまたはフレームの設定を復元できます。こ れはカーソル位置を復元するコマンドと同じです。フレームの設定を復元すると き、設定に含まれていないフレームは非表示になります。もしこれらのフレーム を削除したいときは、かわりに‘C-u C-x r j R’を使います。 13.5 レジスターに数字を保存する =============================== 数字をレジスターに保存して、その数字(10進)をバッファーに挿入したり、増加 させるコマンドがあります。これらのコマンドはキーボードマクロで使うと便利 です(*note Keyboard Macros::を参照してください)。 ‘C-u NUMBER C-x r n R’ NUMBERをレジスターRに保存します(‘number-to-register’)。 ‘C-u NUMBER C-x r + R’ Rに数字が保存しているときは、レジスターの数字をNUMBERだけ増加させま す。コマンド‘C-x r +’ (‘increment-register’)は、Rにテキストが保存さ れているときは異なる動作をすることに注意してください。*note Text Registers::を参照してください。 ‘C-x r i R’ レジスターRの数字をバッファーに挿入します。 ‘C-x r i’は、他のレジスターの内容をバッファーに挿入するコマンドと同じ です。‘C-x r +’に数字の引数を与えない場合、レジスターの値は1増加します。 ‘C-x r n’に数字の引数を与えない場合、レジスターには0が保存されます。 13.6 レジスターにファイル名を保存する ===================================== 特定の名前のファイルを頻繁にvisitする場合、その名前をレジスターにセット しておけば、より便利にファイルをvisitすることができます。以下はNAMEとい うファイルをレジスターRにセットするLispコードです: (set-register R '(file . NAME)) たとえば、 (set-register ?z '(file . "/gd/gnu/emacs/19.0/src/ChangeLog")) はレジスター‘z’にファイル名をセットします。 レジスターRに名前がセットされているファイルをvisitするには、‘C-x r j R’とタイプします。これはある位置にジャンプしたり、フレームの設定を復元す るのと同じコマンドです。 13.7 キーボードマクロのレジスター ================================= あるキーボードマクロ(*note Keyboard Macros::を参照してください)を頻繁に 実行する必要がある場合、それをレジスターにセットしたり保存することができ ればより便利でしょう(*note Save Keyboard Macro::を参照してください)。 ‘C-x C-k x R’ (‘kmacro-to-register’)は、最後のキーボードマクロをレジスタ ーRに保存します。 レジスターRのキーボードマクロを実行するには、‘C-x r j R’とタイプしま す(これはある位置にジャンプしたりフレームを復元するのと同じコマンドです )。 13.8 ブックマーク ================= “ブックマーク(Bookmarks)”とは、ジャンプしたい位置を記録するレジスターの ようなものです。レジスターとの違いは、長い名前をもつことができ、次の Emacsセッションに自動的に引き継がれることです。ブックマークの典型的な使 い方は、さまざまなファイルのどこを読んでいたかを記録することです。 ‘C-x r m ’ visitしているファイルのポイント位置に、ブックマークをセットします。 ‘C-x r m BOOKMARK ’ ポイント位置に、BOOKMARKという名前のブックマークをセットします (‘bookmark-set’)。 ‘C-x r M BOOKMARK ’ ‘C-x r m’と同様ですが、既存のブックマークを上書きしません。 ‘C-x r b BOOKMARK ’ BOOKMARKという名前のブックマークにジャンプします(‘bookmark-jump’)。 ‘C-x r l’ すべてのブックマークを一覧します(‘list-bookmarks’)。 ‘M-x bookmark-save’ 現在のすべてのブックマークの値を、デフォルトのブックマークファイル に保存します。 visitしているファイル内のカレント位置を記録するには、コマンド‘C-x r m’を使用します。これは、ブックマーク名のデフォルトとしてファイル名を使い ます。ブックマークが指すファイルをもとにブックマークの名前を付ければ、 ‘C-x r b’で任意のファイルを再びvisitして、同時にブックマーク位置に移動す るという操作を楽に行えます。 コマンド‘C-x r M’ (‘bookmark-set-no-overwrite’)は‘C-x r m’と同じよう に機能しますが、指定されたブックマークがすでに存在する場合は、上書きする かわりにエラーをシグナルします。 すべてのブックマークのリストを別のバッファーに表示するには、‘C-x r l’ (‘list-bookmarks’)とタイプします。そのバッファーに切り替えて、ブックマー クの定義の編集やブックマークに注釈をつけることができます。ブックマークバ ッファーで‘C-h m’とタイプすれば、特別な編集コマンドに関する情報を見るこ とができます。 Emacsを終了するとき、もしブックマークの値を変更していたら、Emacsはブ ックマークを保存します。‘M-x bookmark-save’コマンドで、いつでもブックマ ークを保存できます。ブックマークは‘~/.emacs.d/bookmarks’というファイルに 保存されます(古いバージョンのEmacsとの互換性を保つため、もし ‘~/.emacs.bmk’というファイルがあればそのファイルに保存します)。ブックマ ークコマンドは、デフォルトのブックマークファイルを自動的にロードします。 この保存とロードにより、ブックマークの内容を次のEmacsセッションに引き継 ぐことができるのです。 ‘bookmark-save-flag’に1をセットすると、ブックマークをセットするコマン ドはブックマークの保存も行ないます。こうすることにより、Emacsがクラッシ ュしてもブックマークを失わずにすみます。この変数の値が数字の場合、それは ブックマークを何回変更したら保存するという意味です。この変数に‘nil’をセ ットすると、Emacsは明示的に‘M-x bookmark-save’を使ったときだけブックマー クを保存します。 変数‘bookmark-default-file’には、ブックマークを保存するデフォルトのフ ァイルを指定します。 ブックマークの位置は、周囲のコンテキストとともに保存されるので、ファ イルが少し変更されていても、‘bookmark-jump’は正確な位置を見つけることが できます。変数‘bookmark-search-size’は、ブックマーク位置のコンテキストの 前後何文字を記録するかを指定します。 以下はブックマークを処理する追加のコマンドです: ‘M-x bookmark-load FILENAME ’ ブックマークのリストを含む、FILENAMEという名前のファイルをロードし ます。このコマンドは‘bookmark-write’と同様に、デフォルトのブックマ ークファイルに加えて、他のファイルのブックマークを使うことができま す。 ‘M-x bookmark-write FILENAME ’ 現在のすべてのブックマークをファイルFILENAMEに保存します。 ‘M-x bookmark-delete BOOKMARK ’ BOOKMARKという名前のブックマークを削除します。 ‘M-x bookmark-insert-location BOOKMARK ’ ブックマークBOOKMARKが指すファイル名をバッファーに挿入します。 ‘M-x bookmark-insert BOOKMARK ’ ブックマークBOOKMARKが指すファイルの_内容_をバッファーに挿入します 。 14 ディスプレーの制御 ********************* ウィンドウに入りきらない大きなバッファーでは、Emacsはその一部しか表示で きません。このチャプターでは、見たい部分のテキストを指定するコマンドや変 数と、どのようにしてテキストが表示されるかを説明します。 14.1 スクロール =============== ウィンドウがバッファーのすべてのテキストを表示するには小さい場合、その一 部だけが表示されます。“スクロール”コマンドは、バッファーで表示される部分 を変更します。 前方(forward)または上(up)へのスクロールは、ウィンドウに表示される部分 を先に進めます。これはウィンドウに表示されるバッファーのテキストを、上に 移動させるのと同じです。後方(backward)または下(down)へのスクロールは、ウ ィンドウに表示される部分を前に戻します。これはウィンドウに表示されるバッ ファーのテキストを下に移動させます。 Emacsでのupとdownは、ウィンドウでテキストが移動する方向に基づいており 、テキストにたいしてウィンドウが移動する方向では_ありません_。この用語は 現在のscrolling upやscrolling downが広まる前に、Emacsで採用されました。 そのためは、Emacs的には上(up)にスクロールするという、奇妙な結 果となりました。 ウィンドウに表示されているバッファー部分には、常にポイントが含まれて います。もしウィンドウの下端か上端を越えてポイントを移動させると、ポイン トを画面に表示させるために自動的にスクロールが発生します(*note Auto Scrolling::を参照してください)。以下のコマンドで明示的にスクロールができ ます: ‘C-v’ ‘’ ‘’ ウィンドウのほぼ全画面分、前方にスクロールします (‘scroll-up-command’)。 ‘M-v’ ‘’ ‘’ 後方にスクロールします(‘scroll-down-command’)。 ‘C-v’ (‘scroll-up-command’)は、ウィンドウ全体の高さに近い量、前方にス クロールします。これにより下端の2行が上端になるようスクロールして、それ に続く表示されていなかった行を表示します。ポイントが上端より上になってし まう場合、ウィンドウの新たな上端の行に移動します。The (または )は、‘C-v’と同じです。 ‘M-v’ (‘scroll-down-command’)は、同様の方法で後方にスクロールします。 (または)は、‘M-v’と同じです。 スクロールコマンドでオーバーラップして表示される行数は、変数 ‘next-screen-context-lines’で制御され、デフォルトは2です。数引数Nを与え たときは、N行スクロールします。Emacsはポイントを変更しないよう試みるので 、テキストとポイントは一緒に上または下に動きます。‘C-v’に負の引数を与え ると、‘M-v’のように反対方向へスクロールします。 デフォルトでは、ウィンドウがバッファーの先頭または最後に到達していて 、これ以上スクロールできない場合、これらのコマンドは(beep音をならしたり 画面をフラッシュして)エラーをシグナルします。変数 ‘scroll-error-top-bottom’を‘t’に変更すると、コマンドは可能な限り、つまり バッファーの先頭の文字または最後の文字にポイントを移動します。ポイントが すでにそこにあるときは、エラーをシグナルします。 スクロールしたとき、ポイントが同じスクリーン位置に留まることを好むユ ーザーもいます。そうすれば同じスクリーンにスクロールして戻ったとき、ポイ ントが元の位置にあると便利だからです。この動作は変数 ‘scroll-preserve-screen-position’を通じて利用可能です。変数の値が‘t’のと き、スクロールコマンドによりポイントがウィンドウの外にでるような場合、 Emacsはポイントを先頭行または最終行に移動させるのではなく、同じスクリー ン位置にポイントを調整して、カーソルを維持します。その他の非‘nil’値の場 合、Emacsはスクロールコマンドによりポイントがウィンドウに残っている場合 にも、この方法でポイントを調整します。この変数はこのセクションで説明する すべてのスクロールコマンド、同様にマウスホイールによるスクロール(*note Mouse Commands::を参照してください)に影響を与えます。一般的にいうと、こ の変数は‘scroll-command’プロパティが非‘nil’のコマンドに影響を及ぼします 。*note (elisp)Property Lists::を参照してください。 ときどき、特に‘C-v’や‘M-v’のようなキーを押したままにすると、キーボー ドのオートリピートがアクティブになり、要求された高レートのスクロール要求 にEmacsが対応できなくなるときがあります。そのような場合、表示は更新され ず、かなり長時間の間、Emacsが応答しなくなる可能性があります。変数 ‘fast-but-imprecise-scrolling’を非‘nil’値にセットすることにより、この状 況に対処できます。これはスクロールコマンドにフォント表示化(*note Font Lock::を参照してください)を行なわないように指示します。スクロールされる テキストは、それらがデフォルトフェイスをもつと仮定されなくなり、フォント 表示化されなくなります。これにより、そのフェイスがすべて同じサイズのフォ ントを使用していない場合には、(たとえばオートリピートではない)1回のスク ロールでも、Emacsが誤ったバッファー位置にスクロールするかもしれません。 コマンド‘M-x scroll-up’および‘M-x scroll-down’は、 ‘scroll-up-command’および‘scroll-down-command’と同様に動作しますが、 ‘scroll-error-top-bottom’を考慮しません。これらのコマンドは、Emacs 24以 前ではスクロールアップおよびスクロールダウンのためのデフォルトでした。コ マンド‘M-x scroll-up-line’および‘M-x scroll-down-line’は、現在のウィンド ウを1行スクロールさせます。もしこれらのコマンドを使う場合は、それにキー バインドを割り当てたくなるでしょう(*note Init Rebinding::を参照してくだ さい)。 14.2 センタリング ================= ‘C-l’ 選択されているウィンドウで、現在行が中央になるようスクロールします 。連続して呼び出すと、次は現在行が上端になり、その次は現在行が下端 に、という順番で循環します。画面の再描画が行われる可能性があります (‘recenter-top-bottom’)。 ‘M-x recenter’ 選択されているウィンドウで、現在行が中央になるようにスクロールしま す。画面の再描画が行われる可能性があります。 ‘C-M-l’ 有用な情報が表示されるよう、発見的な手法でスクロールします (‘reposition-window’)。 ‘C-l’ (‘recenter-top-bottom’)コマンドは、選択されたウィンドウにたいし て“センタリング(recenters)”をします。これにより現在のスクリーン行がウィ ンドウの中央、または中央に一番近い行になります。 (‘C-l C-l’)のように‘C-l’を2回タイプすると、ポイントのある行が上端にな るようにスクロールします。‘C-l’を3回タイプするとポイントのある行が下端に なるようにスクロールします。連続して‘C-l’をタイプすることにより、上記の 3つの位置を循環してスクロールできます。 リスト変数‘recenter-positions’をカスタマイズすることにより、循環する 順序を変更できます。リスト要素にはシンボル‘top’、‘middle’、‘bottom’また は数値を指定します。数値に整数を指定すると、現在行が指定したスクリーン行 になるようスクロールします。数値に0.0から1.0の浮動小数点数は、ウィンドウ の上端から現在行までを割合で指定します。デフォルトは‘(middle top bottom)’で、これは上述した循環順序です。さらに変数‘scroll-margin’を、0以 外の値Nに変更すると、‘C-l’は常にウィンドウの上端または下端からスクリーン 行で、N行を残してスクロールします(*note Auto Scrolling::を参照してくださ い)。 ‘C-l’にプレフィクス引数を指定することもできます。‘C-u C-l’のようにプ レフィクス引数だけを指定すると、単にポイントのある行を中央にします。正の 引数Nは、ポイントのある行がウィンドウの上端からN行目になるようにスクロー ルします。0を指定すると、ポイントのある行が上端になるようにスクロールし ます。負の引数-Nは、ポイントのある行がウィンドウの下端からN行目になるよ うにスクロールします。引数を与えたときは、‘C-l’は画面をクリアーせず、異 なるスクリーン位置への循環もしません。 変数‘recenter-redisplay’が非‘nil’値の場合、‘C-l’はスクリーンのクリア ーと再描画を行います。特別な値‘tty’(デフォルト)は、これをテキスト端末上 のフレームだけに限定します。再描画はスクリーンが何らかの理由により文字化 けしてしまったときなどに便利です(*note Screen Garbled::を参照してくださ い)。 より原始的なコマンド‘M-x recenter’は、‘recenter-top-bottom’と同じよう に振る舞いますが、スクリーン位置を循環しません。 ‘C-M-l’ (‘reposition-window’)は、有用な情報がスクリーンに表示されるよ うに、現在のウィンドウを発見的な手法によりスクロールします。たとえば Lispファイルの場合、このコマンドは可能な限り現在のdefun全体がスクリーン 上に表示されるよう試みます。 14.3 自動スクロール =================== ポイントが表示されているテキスト部分から外に移動すると、Emacsは“自動スク ロール(automatic scrolling)”の処理を行います。通常自動スクロールは、ウィ ンドウの垂直方向の中央にポイントをセンタリングしますが、この振る舞いを変 えるいくつかの方法があります。 ‘scroll-conservatively’に小さい数字Nをセットすると、ポイントが少し (N行以下)スクリーンの外に出たら、Emacsはポイントがスクリーンに表示される のに充分なだけスクロールします。これでもしポイントの表示に失敗した場合、 Emacsはそのウィンドウの中央にポイント行が表示されるのに充分なだけのスク ロールをします。‘scroll-conservatively’に大きな数字(100より大)も数字をセ ットすると、どれだけポイントを移動させようと、自動スクロールはポイント行 を中央にセンタリングしなくなります。Emacsはポイントが表示されるように常 にテキストをスクロールします。ウィンドウの上端または下端かはスクロールの 方向に依存します。デフォルトでは‘scroll-conservatively’は 0で、これは常 にポイント行がウィンドウの中央にセンタリングされることを意味します。 自動スクロールを制御する他の方法は、変数‘scroll-step’をカスタマイズす ることです。この変数の値はポイントがスクリーンから外れたとき、何行を自動 スクロールさせるかを決定します。その行数スクロールしてもポイントが表示さ れない場合、かわりにポイント行が中央にきます。デフォルト値は0で、スクロ ール後は常にポイント行が中央にきます。 自動コントロールを制御する3番目の方法は、変数 ‘scroll-up-aggressively’と‘scroll-down-aggressively’をカスタマイズするこ とで、これは直接スクロール後のポイントの垂直位置を指定します。 ‘scroll-up-aggressively’の値には、‘nil’(デフォルト)、または0から1までの 浮動小数点数Fを指定します。ポイントがウィンドウの下端を越えたとき(たとえ ば前方にスクロールしたとき)、Emacsはウィンドウの高さとウィンドウの下端か らポイント行までの割合が、Fになるようスクロールします。つまりFを大きくす るとより積極的(aggressive)、つまり新しいテキストがより多く表示されること を意味します。デフォルト値‘nil’は0.5と同じです。 同様に‘scroll-down-aggressively’は、ポイントがウィンドウの上端を越え たとき(たとえば後方にスクロールしたとき)の振る舞いを設定します。値にはス クロール後のウィンドウの上端からポイント行までのマージンを指定します。つ まり‘scroll-up-aggressively’を大きくすると、より積極的になります。 変数‘scroll-conservatively’、‘scroll-step’、および ‘scroll-up-aggressively’と‘scroll-down-aggressively’は、互いに矛盾する方 法で自動スクロールを制御します。したがって自動スクロールをカスタマイズす る場合は、2つ以上の手法を選ぶべきではありません。もし2つ以上の変数をカス タマイズする場合は、‘scroll-conservatively’、次に‘scroll-step’、そして最 後に‘scroll-up-aggressively’と‘scroll-down-aggressively’という優先順でカ スタマイズしてください。 変数‘scroll-margin’は(たとえscroll-up-aggressivelyや scroll-down-aggressivelyに、上端または下端からのマージンがウィンドウにた いして占める割合より大きくなるようなFを指定していても)、ポイントがウィン ドウの上端または下端にどれだけ近づけるかを制限します。変数の値にはスクリ ーン行の行数です。もしポイントがウィンドウの上端または下端から指定した行 数の位置にくると、Emacsは自動的にスクロールします。デフォルトでは ‘scroll-margin’は0です。デフォルトではそのウィンドウの高さの1/4に制限さ れていますが、‘maximum-scroll-margin’をカスタマイズすることにより1/2まで 増加(または0まで減少)させることができます。 14.4 水平スクロール =================== “水平スクロール(Horizontal scrolling)”は、ウィンドウの行を右方向に移動さ せます。そのため左端の近くのテキストは表示されなくなります。ウィンドウの テキストが水平スクロールされると、テキスト行は折り返されるのではなく、切 り詰め(truncated)られます。ウィンドウが切り詰められた行を表示していると き、ポイントがスクリーンの左端か右端を越えて移動すると、Emacsは自動的に 水平スクロールを行います。デフォルトではそのウィンドウ内のすべての行は一 緒に水平スクロールされますが、変数‘auto-hscroll-mode’に特別な値 ‘current-line’をセットした場合は、カーソルを表示する行だけがスクロールさ れます。自動的な水平スクロールを完全に無効にするには、変数 ‘auto-hscroll-mode’に‘nil’をセットしてください。また自動的な水平スクロー ルがオフになっている場合、ポイントがスクリーンの端を越えると、それを知ら せるためにカーソルが表示されなくなることに注意してください(テキスト端末 の場合カーソルは端に残されます)。 変数‘hscroll-margin’は、自動的なスクロールが起こる前に、ポイントがウ ィンドウの左端または右端に、どれだけ近づけるかを制御します。変数の値は列 数で指定します。たとえば変数の値が5のときは、端から5列目にポイントが移動 すると、水平スクロールが発生します。 変数‘hscroll-step’はmポイントが端に近づきすぎたときに、何列スクロール するかを決定します。デフォルト値の0は、ポイントがウィンドウの中央になる ようにスクロールされることを意味します。正の整数はスクロールされる列数を 指定します。浮動小数点数(0から1の値であること)は、スクロールされる量を、 ウィンドウの幅にたいする割合で指定します。 以下のコマンドで明示的に水平スクロールすることもできます: ‘C-x <’ 現在のウィンドウのテキストを左にスクロールします(‘scroll-left’)。 ‘C-x >’ 右にスクロールします(‘scroll-right’)。 ‘C-x <’ (‘scroll-left’)は選択された、ウィンドウをウィンドウ幅から2列 少ない列数、左にスクロール(いいかえればウィンドウのテキストは左に移動)し ます。数引数Nを指定すると、N列スクロールします。 テキストが左にスクロールされて、ポイントがウィンドウの左端を越えると 、ポイントが表示されているテキストに戻るまで、カーソルはフリーズします。 これは‘auto-hscroll-mode’の設定とは独立しています(これはテキストを左にス クロールするときのウィンドウの右端での振る舞いだけに影響します)。 ‘C-x >’ (‘scroll-right’)は、同様に右にスクロールします。ウィンドウが 通常の表示(行の先頭がウィンドウの左端に表示されている状態)のときは、それ 以上スクロールできないので何も起こりません。これは‘C-x >’の引数を正確に 計算する必要がないことを意味します。充分に大きな引数を与えれば、通常の表 示が復元されます。 これらのコマンドでウィンドウを水平方向にスクロールすると、自動水平ス クロールの下限値がセットされます。自動スクロールはウィンドウのスクロール を続けますが、前に‘scroll-left’にセットされた値を越えて右にスクロールで きなくなります。‘auto-hscroll-mode’が‘current-line’にセットされていると きは、カーソルを表示する行以外の行は、最小限度だけスクロールされるでしょ う。 14.5 ナローイング ================= “ナローイング(Narrowing)”とはバッファーのある範囲にフォーカスを置き、他 の部分を一時的にアクセス不能にすることを意味します。扱うことのできる範囲 のことを、“アクセス可能範囲(accessible portion)”と呼びます。ナローイング を取り消すと、バッファー全体に再びアクセスできるようになります。これを “ワイドニング(widening)”と呼びます。バッファーにたいして、ナローイングに より境界を設けることを、バッファーの“制限(restriction)”と呼びます。 ナローイングにより、他の部分に気を取られずに、1つのサブルーチンやパラ グラフに集中することが容易になります。ナローイングは、置換コマンドやキー ボードマクロの繰り返しにより操作される範囲を制限するためにも使われます。 ‘C-x n n’ ポイントとマークの間にナローイングします(‘narrow-to-region’)。 ‘C-x n w’ バッファー全体をワイドニングして、再びアクセス可能にします (‘widen’)。 ‘C-x n p’ 現在のページにナローイングします(‘narrow-to-page’)。 ‘C-x n d’ 現在のdefunにナローイングします(‘narrow-to-defun’)。 バッファーをナローイングしているときは、表示されている範囲がすべてで す。残りの部分を見ることはできず、移動もできず(移動コマンドによりアクセ ス可能範囲の外に移動することはできません)、変更もできません。しかし残り の部分がなくなったわけではないので、ファイルを保存するとアクセス不能範囲 のテキストもすべて保存されます。ナローイングが有効なときは、モードライン に‘Narrow’という単語が表示されます。 主要なナローイングコマンドは、‘C-x n n’ (‘narrow-to-region’)です。こ れは現在のバッファーを制限するので、現在のリージョンだけがアクセス可能に なり、リージョンの前後のすべてのテキストはアクセス不能になります。ポイン トとマークは変化しません。 かわりに‘C-x n p’ (‘narrow-to-page’)を使うと、現在のページにナローイ ングされます。ページの定義については、*note Pages::を参照してください。 ‘C-x n d’ (‘narrow-to-defun’)は、ポイントを含むdefunにナローイングします (*note Defuns::を参照してください)。 ナローイングを取り消す方法は、‘C-x n w’ (‘widen’)です。これにより再び バッファーのテキストすべてにアクセス可能になります。 バッファーのどの範囲にナローイングされているかは、‘C-x =’コマンドを使 って情報を得ることができます。*note Position Info::を参照してください。 ナローイングは、それを理解していないユーザーを容易に混乱させるので、 通常‘narrow-to-region’コマンドは無効になっています。このコマンドを使おう とすると、Emacsは確認を求め、有効にするオプションを提供します。このコマ ンドを有効にすると、それ以降は確認を求められなくなります。*note Disabling::を参照してください。 14.6 Viewモード =============== Viewモードは、バッファーをスクリーン上でスキャンするためのマイナーモード です。このモードは、バッファーを変更せずにスクロールする、便利なコマンド を提供します。Emacsのカーソル移動コマンドとは別に、で前方にスクロー ル、‘S-’またはで後方にスクロール、‘s’でインクリメンタルサーチ ができます。 ‘q’ (‘View-quit’)とタイプするとViewモードが無効になり、Viewモードが有 効になる前のパッファーの位置に戻ります。‘e’ (‘View-exit’)とタイプすると Viewモードが無効になり、現在のバッファーと位置は維持されます。 ‘M-x view-buffer’は、既存のEmacsバッファー名を入力として求め、そのバ ッファーに切り替えてViewモードを有効にします。‘M-x view-file’はファイル 名を入力として求め、そのファイルをvisitしてViewモードを有効にします。 14.7 Followモード ================= “Followモード”は、同じバッファーを表示する2つのウィンドウを、1つの仮想ウ ィンドウとしてスクロールするマイナーモードです。Followモードを使うには、 ウィンドウが1つだけのフレームを選択して、それを‘C-x 3’を使って縦に並べて 2分割してから、‘M-x follow-mode’とタイプします。それ以降はバッファーをど ちらのウィンドウでも編集でき、どちらかのウィンドウをスクロールすると、他 方のウィンドウも追従してスクロールします。 Followモードでは、一方のウィンドウで表示されている部分の外にポイント を移動して、もう一方のウィンドウで表示されている部分にポイントを移動させ ると、そのウィンドウが選択されます。つまり2つのウィンドウを1つの大きなウ ィンドウとして扱えるのです。 Followモードをオフにするには、もう一度‘M-x follow-mode’とタイプしてく ださい。 14.8 テキストのフェイス ======================= Emacsは“フェイス(faces)”と呼ばれる仕組みを通じて、テキストをいくつかの異 なるスタイルで表示できます。フェイスにはfont(フォント)、height(高さ)、 weight(太さ)、slant(傾き)、foreground(前景)およびbackground(背景)、 underline(アンダーライン)、overline(オーバーライン)などの様々な“フェイス 属性(face attributes)”を指定できます。ほとんどのメジャーモードはFont Lockモードを通じて、テキストに自動的にフェイスを割り当てます。これらのフ ェイスを割り当てる方法については、*note Font Lock::を参照してください。 現在定義されているフェイスと、それがどのような外観なのかを見るには、 ‘M-x list-faces-display’とタイプします。プレフィクス引数を指定すると、こ のコマンドは正規表現の入力を求め、その正規表現にマッチするフェイスだけを 表示します(*note Regexps::を参照してください)。 あるフェイスが、フレームが異なると違って見えるのことがあり得ます。た とえばいくつかのテキスト端末ではすべてのフェース属性、特に特にfont、 height、widthはサポートされておらず、指定できるcolorも限られているものが あります。加えて、ほとんどのEmacsフェースは視認性をよくするために、フレ ームのバックグラウンドが明るい(light)か暗い(dark)かで属性が異なります。 デフォルトでは、Emacsはフレームの現在のバックグラウンドカラーに基づいて 、表示するフェイスの属性を自動的に選択します。しかし変数 ‘frame-background-mode’に非‘nil’値を与えると、これをオーバーライドできま す。値‘dark’ではすべてのフレームの背景色が暗い色であるかのように処理し、 値‘light’ではすべてのフレームの背景色が明るい色であるかのように処理させ ることができます。 フェイスの属性を変えてフェイスをカスタマイズして、将来のEmacsセッショ ン用にカスタマイズ結果を保存することができます。詳細については、*note Face Customization::を参照してください。 ‘default’フェイスはテキストを表示するデフォルトのフェイスで、そのすべ ての属性は指定されています。バックグラウンドカラーは、フレームのバックグ ラウンドカラーとしても使用されます。*note Colors::を参照してください。 他の特別なフェイスとしては、‘cursor’フェイスがあります。グラフィカル なディスプレーでは、このフェイスのバックグラウンドカラーは、テキストカー ソルを描画するのに使用されます。このフェイスで効果があるのはこの属性だけ です。カーソルの下のテキストのフォアグラウンドカラーには、そのテキストの バックグラウンドカラーが使われます。テキスト端末でのテキストカーソルの外 観は、‘cursor’フェイスではなく端末により決定されます。 特定のフェイスの属性を指定するのにXのリソースを使うこともできます。 *note Resources::を参照してください。 Emacsは可変幅フォント(variable-width fonts)を表示できますが、いくつか のコマンド、特にインデントを行うコマンドは、可変幅の文字幅の表示をうまく 処理できません。そのため、ほとんどのフェイスにたいして可変幅フォントを使 わないこと、特にそれがFont Lockモードに割り当てられている場合は、使わな いことを推奨します。 14.9 フェイスのカラー ===================== フェイスには、さまざまなフォアグラウンドカラーとバックグラウンドカラーを もたせることができます。フェイスにカラーを指定するとき、たとえばフェイス をカスタマイズ(*note Face Customization::を参照してください)するときは、 “カラーネーム(color name)”か、“RGBトリプレット(RGB triplet)”で指定するこ とができます。 カラーネームとは、‘dark orange’や‘medium sea green’のような、事前に定 義された名前です。カラーネームの一覧を見るには、‘M-x list-colors-display’とタイプします。表示されるカラーの順番を制御するには 、‘list-colors-sort’をカスタマイズします。このコマンドをグラフィカルなデ ィスプレーで実行すると、Emacsで既知のカラーネームのすべてが表示されます (これらは標準のX11のカラーネームで、Xの‘rgb.txt’で定義されています)。コ マンドをテキスト端末で実行すると、端末で安全に表示することができる一部の カラーだけが表示されます。フェイスには、さまざまなフォアグラウンドカラー とバックグラウンドカラーを持たせることができます。しかしEmacsは、テキス ト端末でもX11のカラーネームを理解できます。もしフェイスにX11のカラーネー ムが指定されている場合、最も近い端末の色で表示されます。 RGBトリプレットは、‘#RRGGBB’という形式の文字列で指定します。R、G、Bの 各コンポーネントは、そのそのコンポーネントに関連する色の強度を、1桁から 4桁(通常は2桁)の16進数で指定します。各コンポーネントは同じ桁数でなければ なりません。16進数のAからFは、大文字小文字を区別しません。 ‘M-x list-colors-display’は、カラーネームと、それに相当するRGBトリプ レットを表示します。たとえば‘medium sea green’は‘#3CB371’と同じです。 ‘M-x set-face-foreground’と‘M-x set-face-background’で、フェイスのフ ォアグラウンドとバックグラウンドのカラーを変更できます。これらのコマンド は、ミニバッファーでフェイス名とカラーの入力を求め(補完機能あり)、指定し たカラーをフェイスにセットします。フェイスのカラーは全フレームに影響しま すが、カスタマイズバッファーやXリソースを使うのとは異なり、将来のEmacsセ ッションには引き継がれません。フレームパラメーターを使って、特定のフレー ムのフォアグラウンドとバックグラウンドのカラーをセットすることもできます 。*note Frame Parameters::を参照してください。 14.10 標準フェイス ================== 以下はテキストの外見を指定する標準フェイスです。これらのフェイスの効果が 欲しい場合は、特定のテキストに適用することができます。 ‘default’ このフェイスは特定のフェイスをもたない普通のテキストに使われます。 フェイスのバックグラウンドカラーは、フレームのバックグラウンドカラ ーとして使用されます。 ‘bold’ このフェイスは、デフォルトフォントのbold(太字)バージョンです。 ‘italic’ このフェイスはデフォルトフォントのitalic(斜体)バージョンです。 ‘bold-italic’ このフェイスはデフォルトフォントのbold italic(太字斜体)バージョンで す。 ‘underline’ このフェイスはunderline(下線)のテキストです。 ‘fixed-pitch’ このフェイスはfixed-width font(固定幅フォント)の使用を強制します。 もし望むなら、このフェイスから他の固定幅フォントにカスタマイズする のは妥当ですが、可変幅フォントにするべきではありません。 ‘fixed-pitch-serif’ このフェイスは‘fixed-pitch’と似ていますが、フォントはセリフ(serif: HやIなどの上下のひげ飾り)をもち、伝統的なタイプライター文字に、より 似ています。 ‘variable-pitch’ このフェイスはvariable-width font(可変幅フォント)の使用を強制します 。 ‘shadow’ このフェースはまわりのテキストに比べて、そのテキストを目立たなくし ます。通常これはデフォルトの黒または白のフォアグラウンドカラーでは なく、グレーが使われます。 以下は特別な目的のために、一時的にテキストの一部をハイライトするのに 使われるフェイスの、不完全なリストです(他にも多くのモードが、そのモード の目的のために、独自のフェイスを定義しています)。 ‘highlight’ このフェイスはさまざまなコンテキスト、たとえばハイパーリンク上をマ ウスカーソルが通過したときなどに、テキストをハイライトするのに使わ れます。 ‘isearch’ このフェイスは、現在のIsearch(インクリメンタル検索)のマッチをハイラ イトするのに使われます(*note Incremental Search::を参照してください )。 ‘query-replace’ このフェイスは、現在の問い合わせ置換(Query Replace)のマッチをハイラ イトするのに使われます(*note Replace::を参照してください)。 ‘lazy-highlight’ このフェイスは、Isearchおよび問い合わせ置換で、カレントのマッチ(現 在カーソルがあるマッチ)以外のマッチ(lazy matches)をハイライトするの に使われます。 ‘region’ このフェイスは、アクティブなリージョンを表示するのに使われます (*note Mark::を参照してください)。EmacsをGTK+サポートつきでビルドし た場合、カラーは現在のGTK+のテーマから提供されます。 ‘secondary-selection’ このフェイスは、Xのセカンダリー選択(secondary X selection)を表示す るのに使われます(*note Secondary Selection::を参照してください)。 ‘trailing-whitespace’ このフェイスは、‘show-trailing-whitespace’は非‘nil’のとき、行末の余 分なスペースやタブをハイライトするためのものです(*note Useless Whitespace::を参照してください)。 ‘escape-glyph’ このフェイスは、制御文字やエスケープシーケンスを表示するためのもの です(*note Text Display::を参照してください)。 ‘homoglyph’ このフェイスは、類似文字(表示しようとする文字と似ているが異なる文字 )を表示するためのものです(*note Text Display::を参照)。 ‘nobreak-space’ このフェイスは、no-breakスペース文字を表示するためのものです(*note Text Display::を参照してください)。 ‘nobreak-hyphen’ このフェイスは、no-breakハイフン文字を表示するためのものです(*note Text Display::を参照してください)。 以下のフェイスは、Emacsフレームの一部の外見を制御します: ‘mode-line’ このフェイスは、現在選択されているウィンドウのモードラインと、ツー ルキットメニューが使われていないときのメニューバーに使われます。デ フォルトでは、グラフィカルなウィンドウではraised(浮き彫り)効果をだ すため影つきで描画され、非ウィンドウの端末ではデフォルトのフェイス を反転して描画されます。 ‘mode-line-inactive’ ‘mode-line’と似ていますが、選択されていないウィンドウのモードライン に使われます(‘mode-line-in-non-selected-windows’が非‘nil’のとき)。 このフェイスは‘mode-line’を継承するので、フェイスを変更するとすべて のウィンドウのモードラインが影響を受けます。 ‘mode-line-highlight’ ‘highlight’と似ていますが、モードライン上でマウスセンシティブ(マウ スに感応する)なテキスト範囲に使われます。通常このようなテキスト範囲 は上にマウスポインターがくると、ツールチップ(*note Tooltips::を参照 してください)をポップアップします。 ‘mode-line-buffer-id’ このフェイスは、モードライン上でバッファーを識別する部分に使われま す。 ‘header-line’ ‘mode-line’と似ていますが、ウィンドウのヘッダーラインのためのもので す。モードラインがウィンドウの一番下に表示されるように、ヘッダーラ インはウィンドウの一番上に表示されます。ほとんどのウィンドウはヘッ ダーラインを持ちません。Infoモードのような特別なモードだけがヘッダ ーラインを持ちます。 ‘header-line-highlight’ ‘highlight’や‘mode-line-highlight’と似ていますが、ヘッダー行のマウ スに感応する部分に使用されます。‘header-line’フェイスは ‘highlight’とは無関係にカスタマイズされるかもしれないので、このフェ イスが別に設けられています。 ‘vertical-border’ このフェイスは、テキスト端末上でウィンドウを縦に分割するとき使われ ます。 ‘minibuffer-prompt’ このフェイスは、ミニバッファーで入力を求めるプロンプトのテキストに 使われます。デフォルトでは、Emacsは自動的にプロンプトのテキストの、 テキストプロパティ(*note (elisp)Text Properties::を参照してください )のリスト‘minibuffer-prompt-properties’に、このフェイスを追加します (この変数はミニバッファーに入ったときに効果をあらわします)。 ‘fringe’ グラフィカルなウィンドウでの、左右のフリンジのためのフェイスです(フ リンジはEmacsフレームで、テキストエリアとウィンドウの左右の境界線の 間にある、狭い領域です)。*note Fringes::を参照してください。 ‘cursor’ このフェイスの‘:background’属性は、テキストカーソルのカラーを指定し ます。*note Cursor Display::を参照してください。 ‘tooltip’ このフェイスは、ツールチップのテキストに使われます。デフォルトでは 、EmacsがGTK+サポートつきでビルドされた場合、ツールチップはGTK+を通 じて描画されるので、このフェイスは効果がありません。*note Tooltips::を参照してください。 ‘mouse’ このファイスは、マウスポインターのカラーを決定します。 以下のフェイスは、Emacsフレームの一部の外見を制御するときと同様ですが 、テキスト端末またはEmacsをXサポートつき(ただしツールキットサポートなし )でビルドしたときだけ使われます(それ以外の場合、フレームの対応する各要素 は広義なシステム設定により決定されます)。 ‘scroll-bar’ このフェイスは、スクロールバーの外見を決定します。*note Scroll Bars::を参照してください。 ‘tool-bar’ このフェイスは、ツールバーのアイコンのカラーを決定します。*note Tool Bars::を参照してください。 ‘menu’ このフェイスはEmacsメニューのカラーとフォントを決定します。*note Menu Bars::を参照してください。 ‘tty-menu-enabled-face’ このフェイスは、テキスト端末で利用可能なメニューアイテムを表示する のに使われます。 ‘tty-menu-disabled-face’ このフェイスは、テキスト端末で利用不可なメニューアイテムを表示する のに使われます。 ‘tty-menu-selected-face’ このフェイスは、テキスト端末でマウスをクリックするか、を押せば 選択できるメニューアイテムを表示するのに使われます。 14.11 テキストのスケール ======================== 現在のバッファーのデフォルトフェイスを大きくするには、‘C-x C-+’または ‘C-x C-=’をタイプします。小さくするには、‘C-x C--’をタイプします。デフォ ルトのフェースの大きさ(グローバル)に復元するには、‘C-x C-0’とタイプしま す。これらのキーは、すべて同じコマンド‘text-scale-adjust’にバインドされ ており、このコマンドは最後のキーを判断して動作を決定します。 これらのコマンドの最後のキーは、‘C-x’を前置せずに繰り返すことができま す。たとえば‘C-x C-= C-= C-=’は、フェイスの大きさを3段階に大きくします。 各ステップで大きくなる倍率は1.2です。この倍率を変更するには、変数 ‘text-scale-mode-step’をカスタマイズします。‘text-scale-adjust’コマンド に数引数0を指定すると、‘C-x C-0’とタイプしたのと同様に、デフォルトの大き さに復元します。 コマンド‘text-scale-increase’および‘text-scale-decrease’は、‘C-x C-+’および‘C-x C--’と同様、デフォルトフェイスを大きくまたは小さくします 。キーをバインドする場合、これらのコマンドは、‘text-scale-adjust’より便 利でしょう。 コマンド‘text-scale-set’は、数引数で現在のバッファーのデフォルトフェ イスの大きさを、絶対倍率で指定します。 上記のコマンドは、現在のフォント倍率が1以外のときは、自動的にマイナー モード‘text-scale-mode’を有効にし、そうでない場合は無効にします。 14.12 Font Lockモード ===================== Font Lockモードはマイナーモードで、常に特定のバッファーにローカルで、バ ッファーのテキストにフェイスを割り当てます(または“フォント表示化 (fontifies)します”)。各バッファーのメジャーモードは、Font Lockモードにど のテキストをフォント表示可するか指示します。たとえばプログラム言語のモー ドは、コメントや文字列、関数名のような、構文に関連する構成をフォント表示 化します。 Font Lockモードはデフォルトで有効です。現在のバッファーでこれを切り替 えるには、‘M-x font-lock-mode’とタイプします。正の数引数は無条件にFont Lockモードを有効にし、負または0の数引数を指定すると無効になります。 ‘M-x global-font-lock-mode’とタイプすると、すべてのバッファーでFont Lockモードを切り替えます。このセッティングを将来のEmacsセッションに引き 継ぐには、変数‘global-font-lock-mode’をカスタマイズ(*note Easy Customization::を参照してください)するか、以下の行をinitファイルに追加し ます。 (global-font-lock-mode 0) Global Font Lockモードを無効にしていたとしても、モードフック(mode hooks)に関数を追加することにより、特定のメジャーモードでFont Lockモード を有効にできます。たとえばCファイルの編集でFont Lockモードを有効にするに は、以下のように記述します: (add-hook 'c-mode-hook 'font-lock-mode) Font Lockモードは、‘font-lock-string-face’、 ‘font-lock-comment-face’のような、いくつかの特別な名前のフェイスを使って 処理を行います。これらすべてを簡単に探す方法には、‘M-x customize-group font-lock-faces ’を使います。それからカスタマイズバッファーで それらのフェイスの外見をカスタマイズできます。*note Face Customization::を参照してください。 変数‘font-lock-maximum-decoration’をカスタマイズして、この機能をサポ ートするメジャーモードにたいして、Font Lockモードで適用されるフォント表 示化のレベルを変更できます。値には数字を指定します(1は最小限のフォント表 示化で、3という高いレベルのモードもあります)。‘t’は“可能な限り高く”とい う意味です(デフォルト)。効果を得るには、そのファイルがvisitされる_前_に ‘font-lock-maximum-decoration’をカスタマイズするべきです。この変数をカス タマイズする時点で、すでにそのファイルをバッファーでvisitしている場合は 、そのバッファーをkillしてから、スタマイズ後に再度そのファイルをvisitし てください。 特定のモードに異なる数字を指定することもできます。たとえばC/C++モード にはレベル1を指定して、他のモードにはデフォルトのレベルを適用するには、 以下の値を使います '((c-mode . 1) (c++-mode . 1))) コメントと文字列のフォント表示化(または“構文的”なフォント表示化)は、 バッファーのテキストの構文構造の解析に依存します。速度向上のため、Lispモ ードを含めたいくつかのモードでは、特別な慣習に依存しています。たとえば一 番左の列の開きカッコ(open-parenthesis)または開き大カッコ(open-brace)は常 にdefunの開始であり、すなわち常に文字列またはコメントの外部にあるとみな す、というように解析します。したがって文字列やコメントの中で、一番左の列 に開きカッコや開き大カッコを記述するのは避けるべきです。詳細については、 *note Left Margin Paren::を参照してください。 Font Lockは、ほとんどのモードで既存のパターンをハイライトしますが、追 加のパターンをフォント表示化したいときもあるでしょう。特定のモードでハイ ライトするパターンを追加するには、関数‘font-lock-add-keywords’を使うこと ができます。たとえばCコメント中の‘FIXME:’という単語をハイライトするには 、以下を使います: (add-hook 'c-mode-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(FIXME\\):" 1 font-lock-warning-face t))))) font-lockのハイライトパターンからキーワードを削除するには、関数 ‘font-lock-remove-keywords’を使います。*note (elisp)Search-based Fontification::を参照してください。 大きなバッファーのフォント表示化には、長い時間を要することもあります 。ファイルをvisitしたとき大きな遅延を避けるには、Emacsが最初はバッファー の表示された部分だけをフォント表示化するようにします。バッファーをスクロ ールすると、新たに表示される部分がフォント表示化されます。このタイプの Font Lockは、“Just-In-Time”(または“JIT”) Lockと呼ばれます。カスタマイズ グループ‘jit-lock’の値をカスタマイズすることにより、アイドル状態のときに フォント表示可を行うことも含めて、JIT Lockがどのように振る舞うか制御でき ます。*note Specific Customization::を参照してください。 14.13 インタラクティブなハイライト ================================== Highlight Changesモードは、最近変更されたバッファー部分のテキストに、異 なるフェイスを与えることにより“ハイライト”するマイナーモードです。 Highlight Changesモードを有効または無効にするには、‘M-x highlight-changes-mode’を使います。 Hi Lockモードは、指定した正規表現にマッチするテキストをハイライトする 、マイナーモードです。たとえば、プログラムのソースファイルで、特定の変数 へのすべての参照をハイライトしたり、何らかのプログラムの大量の出力の一部 をハイライトしたり、記事中の特定の名前をハイライトするために使用できます 。Hi Lockモードを有効または無効にするには、コマンド‘M-x hi-lock-mode’を 使います。すべてのバッファーでHi Lockモードを有効にするには、‘M-x global-hi-lock-mode’を使うか、‘.emacs’ファイルに‘(global-hi-lock-mode 1)’と記述してください。 Hi LockモードはFont Lockモード(*note Font Lock::を参照してください)と 同じように動作しますが、ハイライトするパターンを明示的に正規表現で指定し ます。これらは以下のコマンドで制御できます(‘C-x w’で始まるキーバインドは 、‘M-s h’で始まるグローバルなバインドが優先されるため推奨されておらず、 将来のEmacsのバージョンで廃止されるでしょう)。 ‘M-s h r REGEXP FACE ’ ‘C-x w h REGEXP FACE ’ REGEXPにマッチするテキストを、フェイスFACEを使ってハイライトします (‘highlight-regexp’)。ハイライトはバッファーがロードされている限り 残ります。たとえば単語“whim”をデフォルトのフェイス(黄色いバックグラ ウンドカラー)でハイライトするには、‘M-s h r whim ’とタイ プします。ハイライトには任意のフェイスを使うことができますが、Hi Lockモードはモード自身でいくつかのフェイスを提供しており、それらは デフォルト値のリストに事前ロードされています。フェイスの入力プロン プトで‘M-n’と‘M-p’を使うことにより、それらを巡回することができます 。 オプション‘hi-lock-auto-select-face’に非‘nil’値をセットすることによ り、このコマンド(およびその他のフェイスを読みとるHi Lockコマンド)は 、入力を求めることなく、デフォルト値のリストから次のフェイスを自動 的に選択します。 このコマンドを複数回使用して、さまざまな正規表現を指定し、それぞれ を異なる方法でハイライトできます。 ‘M-s h u REGEXP ’ ‘C-x w r REGEXP ’ REGEXPのハイライトを解除します(‘unhighlight-regexp’)。メニューから 呼び出した場合、ハイライト解除する正規表現をリストから選択します。 キーボードから呼び出した場合は、ミニバッファーを使います。一番最近 追加された正規表現を表示し、‘M-n’を使って次に古い正規表現、‘M-p’で 次に新しい正規表現を表示できます(手入力もでき、その場合は補完機能つ きです)。ハイライト解除したい正規表現がミニバッファーに表示されたら 、‘’を押してミニバッファーを抜けだし、ハイライトを解除できます 。 ‘M-s h l REGEXP FACE ’ ‘C-x w l REGEXP FACE ’ REGEXPとのマッチを含む行全体を、フェイスFACEを使ってハイライトしま す(‘highlight-lines-matching-regexp’)。 ‘M-s h p PHRASE FACE ’ ‘C-x w p PHRASE FACE ’ PHRASEにマッチするフレーズを、フェイスFACEでハイライトします (‘highlight-phrase’)。PHRASEには正規表現を指定できますが、スペース は空白文字にマッチする正規表現に置き換えられます。また、先頭に小文 字を使用することにより、大文字小文字を区別しなくなります。 ‘M-s h .’ ‘C-x w .’ ポイントの近くで見つかったシンボルを、次に利用可能なフェイスでハイ ライトします(‘highlight-symbol-at-point’)。 ‘M-s h w’ ‘C-x w b’ 現在ハイライトを行っている正規表現/フェイスのペアを、バッファーのポ イント位置に挿入します。挿入はプログラムを変更してしまわないように 、コメント文字列でコメント化されます(このキーバインドは ‘hi-lock-write-interactive-patterns’コマンドを実行します)。 これらのパターンは、コメントからも逆抽出されます。それは、コメント に記述されたテキストが適正で、‘M-x hi-lock-find-patterns’を呼び出し た、あるいはHi Lockモードが有効なときファイルをvisit(これは ‘hi-lock-find-patterns’を実行します)したときです。 ‘M-s h f’ ‘C-x w i’ 正規表現/フェイスのペアを、現在のバッファーのコメントから抽出します (‘hi-lock-find-patterns’)。これらのコマンドを使えば、 ‘highlight-regexp’でパターンを対話的に入力、 ‘hi-lock-write-interactive-patterns’でそれをファイルに保存、それら を編集(あるマッチのフェイスを別のフェイスにしたり)、そして最後にこ のコマンド(‘hi-lock-find-patterns’)で編集済みのパターンを、Hi Lockの ハイライトに適用することができます。 変数‘hi-lock-file-patterns-policy’はファイルをvisitしたとき、Hi Lockモードがパターンを探して、それを自動的に抽出するべきかを制御し ます。値には‘nil’(ハイライトしない)、‘ask’(ユーザーに尋ねる)、また は関数を指定します。関数の場合、‘hi-lock-find-patterns’はパターンを 引数としてその関数を呼び出します。関数が非‘nil’を返した場合、パター ンを使用します。デフォルトは‘ask’です。直接 ‘hi-lock-find-patterns’を呼び出した場合、この変数の値に関係なく、常 にパターンはハイライトされることに注意してください。 現在のメジャーモードのシンボルが、リスト‘hi-lock-exclude-modes’のメ ンバーの場合、‘hi-lock-find-patterns’は何もしません。 14.14 ウィンドウのフリンジ ========================== グラフィカルなディスプレーでは、通常Emacsの各ウィンドウの左右の端に、狭 い“フリンジ(fringes: 縁、へり)”があります。フリンジは、ウィンドウのテキ ストに関する情報を提供するシンボルの表示に使用されます。‘M-x fringe-mode’とタイプしてフリンジ表示を切り替えたり、幅を変更できます。こ のコマンドは全フレームのフリンジに影響します。選択されたフレームのフリン ジだけを変更するには、‘M-x set-fringe-style’を使います。変数 ‘fringe-mode’をカスタマイズして、フリンジへの変更を永続化できます。 フリンジのもっとも一般的な使われかたは、継続行の表示です(*note Continuation Lines::を参照してください)。テキストの1行が複数のスクリーン 行に分割されるとき、最初の行を除いた各行の左フリンジには曲矢印が表示され 、その行の先頭が実際の行頭ではないことを示します。そして、最後の行を除い た各行の右フリンジにも曲矢印が表示され、その行の最後が実際の行末ではない ことを示します。行の方向が右から左(*note Bidirectional Editing::を参照し てください)の場合、フリンジの曲矢印の意味は逆になります。 行が切り詰められているとき(*note Line Truncation::を参照してください )は水平方向の直矢印を表示して、この行には水平スクロールしなければ見るこ とのできないテキストがあることを示します。矢印の上でマウスをクリックすれ ば、矢印の指す方向に水平スクロールします。 フリンジはバッファーの境界(*note Displaying Boundaries::を参照してく ださい)や、デバッグ(*note Debuggers::を参照してください)しているプログラ ムが実行中であることを示すためにも使われます。 現在の行がウィンドウの幅と正確に一致して、ポイントがその行の行末にあ る場合、フリンジにはカーソルが描画されます。これを無効にするには、変数 ‘overflow-newline-into-fringe’を‘nil’に変更します。これによりEmacsはウィ ンドウ幅と同じ長さの行にたいしても、継続または切り詰めを行います。 表示されているウィンドウの片側、または両側のフリンジを削除するために ‘fringe-mode’をカスタマイズする場合、フリンジ上にに表示する機能は利用で きなくなりますが、行の継続と切り詰めの標識は例外です。フリンジが利用でき ない場合、Emacsは特別なASCII文字(*note Continuation Lines::、および*note Line Truncation::を参照してください)により、行の継続と切り詰めを示すため に、最左および最右の文字セルを使用します。行の継続と切り詰めの標識に使用 される文字セルは、この目的のために予約されるので、各行に表示するテキスト のための列数は減少します。バッファーのテキストには双方向のテキスト、およ びleft-to-right(左から右)とright-to-left(右から左)の両方のパラグラフ (*note Bidirectional Editing::を参照してください)が含まれるかもしれない ので、、片側のフリンジを削除しただけでは依然として2つの文字セルが予約さ れます。つまり行の継続と切り詰めの標識のために、ウィンドウの両側にそれぞ れ1つの文字セルが予約されます。なぜなら、right-to-leftのパラグラフでは、 これらの標識はウィンドウの反対側に表示されるからです。 14.15 バウンダリーの表示 ======================== グラフィカルなディスプレーでは、Emacsはバッファーのバウンダリー (boundary: 境界)を、フリンジに表示することもできます。この機能を有効にす ると、最初の行と最後の行ではフリンジに、かぎカッコが表示されます。上矢印 または下矢印の場合、それはウィンドウをその方向に、もっとスクロールできる ことを示します。 バッファーローカルな変数‘indicate-buffer-boundaries’は、バッファーの バウンダリーととウィンドウのスクロールが、フリンジでどのように表示される かを制御します。値が‘left’(または‘right’)の場合、かぎカッコと矢印のビッ トマップは、左フリンジ(または右フリンジ)に表示されます。 値がalist(association list: 連想リスト。*note (elisp)Association Lists::を参照してください)の場合、各要素の‘(INDICATOR . POSITION)’で、標 識(indicator)の位置(position)を指定します。INDICATORには‘top’、 ‘bottom’、‘up’、‘down’、または‘t’(指定されていない標識のデフォルト位置 )を指定します。POSITIONには‘left’、‘right’、または‘nil’(標識を表示しない )を指定します。 たとえば‘((top . left) (t . right))’は、最上行の左フリンジにかぎカッ コを表示し、右フリンジには最下行のかぎカッコとスクロール矢印を表示します 。左フリンジにかぎカッコだけを表示させる場合は、‘((top . left) (bottom . left))’を使います。 14.16 不要なスペース ==================== 意識せずに不必要なスペースを行末に残してしまったり、バッファーの最後に空 行を残してしまうことはよくあります。ほとんどの場合、そのような“行末の空 白文字(trailing whitespace)”は何の影響も及ぼしませんが、厄介物になる場合 もあります。 バッファーローカルな変数‘show-trailing-whitespace’を‘t’にセットするこ とにより、行末の空白文字を可視化できます。これによりEmacsはフェイス ‘trailing-whitespace’で、行末の空白文字を表示します。 この機能は行末に空白文字を含む行の、行末にポイントがあるときは適用さ れません。厳密にいえば、これも行末の空白文字なのですが、それを特別に表示 してしまうと、新しいテキストをタイプするとき面倒です。このような特別なケ ースでは、ポイントの位置に表示されるカーソルより、空白文字があることが自 明だからです。 ‘M-x delete-trailing-whitespace’とタイプすると、すべての行末の空白文 字を削除します。このコマンドは、バッファー内の各行の行末にあるすべての余 分なスペースと、バッファーの最後にある空行を削除します。バッファー内の空 行を削除しない場合は、変数‘delete-trailing-lines’を‘nil’に変更してくださ い。リージョンがアクティブのときは、リージョン内の各行の行末の余分なスペ ースを削除します。 グラフィカルなディスプレーでは、Emacsはウィンドウの最後の使われていな い行の左フリンジに小さなイメージを表示して、それを示すことができます。こ のイメージはバッファーのテキストが何も含まれていないスクリーン行に表示さ れるので、バッファーの最後にある空行は、このイメージが表示されないことで 見分けることができます。この機能を有効にするにはバッファーローカルな変数 ‘indicate-empty-lines’に非‘nil’値をセットします。すべての新しいバッファ ーでこの機能を有効または無効にするには、この変数のデフォルト値をセットし ます(例 ‘(setq-default indicate-empty-lines t)’) Whitespaceモードはバッファーローカルなマイナーモードで、バッファー内 にある多くの種類の空白文字を視覚化します。これは空白文字を特別なフェイス で描画するか、特別なグリフで表示することにより行われます。このモードを切 り替えるには、‘M-x whitespace-mode’とタイプします。視覚化される空白文字 の種類は、リスト変数‘whitespace-style’により決定されます。 ‘M-x whitespace-toggle-options’とタイプして、カレントバッファーでこのリ スト内の個々の要素のオンとオフを切り替えることができます。以下はリストに 指定できる要素の一部です(完全なリストは変数のドキュメントを参照してくだ さい)。 ‘face’ 特別なフェイスを使った視覚化をすべて有効にします。この要素には特別 な意味があります。もしこれがリストに含まれていない場合、 ‘space-mark’、‘tab-mark’、‘newline-mark’を除く他の視覚化は効果がな くなります。 ‘trailing’ 行末の空白文字をハイライトします。 ‘tabs’ タブ文字をハイライトします。 ‘spaces’ スペースおよびnon-breaking space文字をハイライトします。 ‘lines’ 80列以上の行をハイライトします。列の上限を変更するには、変数 ‘whitespace-line-column’をカスタマイズします。 ‘newline’ 改行をハイライトします。 ‘empty’ バッファーの先頭、および/または終端の空行をハイライトします。 ‘big-indent’ 非常に深いインデントをハイライトします。デフォルトでは、少なくとも 4個の連続するTAB文字と、32個の連続するスペースからなる、任意のシー ケンスがハイライトされます。これを変更するには、正規表現 ‘whitespace-big-indent-regexp’をカスタマイズしてください。 ‘space-mark’ スペースとnon-breaking文字を特別なグリフで描画します。 ‘tab-mark’ タブ文字を特別なグリフで描画します。 ‘newline-mark’ 改行文字を特別なグリフで描画します。 Global Whitespaceモードは、すべてのバッファーで空白文字を視覚化する、 グローバルなマイナーモードです。この機能を個別に切り替えるには、‘M-x global-whitespace-toggle-options’を使用してください。 14.17 選択的な表示 ================== Emacsには、与えられたレベルより多くインデントされた行を隠す機能がありま す。これをプログラムの概要を理解するのに使うことができます。 現在のバッファーの行を隠すには、数引数Nを指定して‘C-x $’ (‘set-selective-display’)をタイプします。すると少なくともN列のインデント をもつ行は、スクリーンに表示されなくなります。隠された行の存在を示すのは 、表示されている行末に表示された3つのドット(‘...’)だけで、これは1行以上 の行が後に隠されていることを意味します。 コマンド‘C-n’および‘C-p’は、隠された行が存在しないかのように、隠され た行をスキップして移動します。 隠された行は依然としてバッファーに存在し、ほとんどの編集コマンドはそ れらを見ることができるので、隠されな行にポイントを移動することもありえま す。これが起こるとカーソルは前の行の最後、つまり3つのドットの後ろに表示 されます。ポイントが表示されている行の行末、つまり改行の前にある場合、カ ーソルは3つのドットの前に表示されます。 隠された行のすべてを再び表示するには、引数を指定せずに‘C-x $’とタイプ してください。 変数‘selective-display-ellipses’に‘nil’をセットすると、隠された行があ ることを示す3つのドットは表示されなくなり、隠された行があることを示す視 覚的な表示はなくなります。変数がセットされると、それは自動的にローカルに なります。 バッファーのテキストの一部を隠す他の方法については、*note Outline Mode::を参照してください。 14.18 モードラインのオプション ============================== バッファーのパーセント表示POSは、ウィンドウの上端がバッファーのどの場所 にあるかを100分率で示します。‘M-x size-indication-mode’とタイプしてSize Indicationモードをオンにすることにより、バッファーのサイズを追加で表示で きます。サイズは以下のようにパーセント表示のすぐ後に表示されます: POS of SIZE SIZEは、バッファーの文字数を人間が理解しやすい形式(‘k’は10^3、‘M’は 10^6、‘G’は10^9などの短縮形が使用されます)で表示します。 Line Numberモードが有効なとき、ポイント位置の現在の行番号はモードライ ンに表示されます。‘M-x line-number-mode’コマンドを使って、Line Numberモ ードのオンとオフを切り替えることができます(通常はオンです)。行番号はそれ が何であるかを示す文字‘L’とともに、バッファーのパーセント表示POSの後ろに 表示されます。 同様に、‘M-x column-number-mode’でColumn Numberモードをオンにすること により、現在の列番号を表示できます。列番号は文字‘C’で示されます。しかし 両方のモードが有効になっているときは、行番号と列番号は‘L’や‘C’ではなく、 ‘(561,2)’のようにカッコつきで表示されます。マイナーモードとこれらのコマ ンドの使い方については、*note Minor Modes::を参照してください。 Column Numberモードでは、列番号はそのウィンドウの左マージンより0から カウントされます。1からカウントした列番号を表示したい場合は、 ‘column-number-indicator-zero-based’を‘nil’にセットしてください。 ナローイング(*note Narrowing::を参照してください)によりバッファーを制 限している場合、アクセスできる部分にもとづいた行番号が表示されます。その ため、これは‘goto-line’の引数として使用するには適しません(ファイル全体に たいする行番号を見るには、‘what-line’コマンドを使います)。 バッファーが非常に大きい場合(‘line-number-display-limit’の値より大)、 速度が遅くなるのでEmacsは行番号を計算しません。そのためモードラインに行 番号は表示されません。この制限を取り除くには、 ‘line-number-display-limit’に‘nil’をセットします。 バッファーの行が長いときも、行番号の計算が遅くなります。この理由によ り、Emacsはポイントの近くの行の幅の平均文字数が、 ‘line-number-display-limit-width’より大きいときは、行番号を表示しません 。デフォルト値は200文字です。 Emacsはオプションで、時刻とシステムロードを、すべてのモードラインで表 示できます。この機能を有効にするには、‘M-x display-time’とタイプするか、 オプション‘display-time-mode’をカスタマイズします。モードラインに追加さ れる情報は以下のような形式です: HH:MMPM L.LL ここでHHとMMは時間と分で、後ろに‘AM’と‘PM’がつきます。L.LLは、過去数分間 における、システム全体で実行中または実行準備ができている(例: 利用可能な プロセッサー待ち)プロセスの平均数です(オペレーティングシステムがサポート しないフィールドは表示されません)。時刻を24時間表示にしたいときは、変数 ‘display-time-24hr-format’に‘t’をセットしてください。 もし未読メールがある場合、ロードレベルの後ろに‘Mail’という単語が表示 されます。グラフィカルなディスプレーでは、‘display-time-use-mail-icon’を カスタマイズすることにより、‘Mail’のかわりにアイコンを使うことができます 。これによりモードラインのスペースが多少節約できます。 ‘display-time-mail-face’をカスタマイズして、メールの表示を目立たせること ができます。‘display-time-mail-file’を使ってチェックするメールファイルを 指定したり、‘display-time-mail-directory’で受信メールのディレクトリーを 指定できます(ディレクトリー内の空でない普通のファイルは、新しい受信メー ルと判断されます)。 Emacsをラップトップコンピューターで実行している場合、コマンド ‘display-battery-mode’を使うか、変数‘display-battery-mode’をカスタマイズ することにより、モードラインにバッテリー充電状況を表示できます。変数 ‘battery-mode-line-format’は、バッテリーの充電状況の表示方法を決定します 。モードラインに表示されるメッセージの正確さはオペレーティングシステムに 依存しており、通常はバッテリーの充電トータルにたいする現在のバッテリー充 電率が表示されます。 グラフィカルなディスプレーでは、モードラインは立体的に描画されます。 この効果が気に入らない場合は、‘mode-line’フェイスをカスタマイズして、 ‘box’属性に‘nil’をセットすることにより無効にできます。*note Face Customization::を参照してください。 デフォルトでは、選択されていないウィンドウのモードラインは、 ‘mode-line-inactive’と呼ばれる、別のフェイスで表示されます。選択されたウ ィンドウのモードラインだけが、‘mode-line’フェイスで表示されます。これに より、どのウィンドウが選択されているかがわかりやすくなります。モードライ ンがないミニバッファーが選択されているときは、ミニバッファーをアクティブ にしたウィンドウのモードラインが、‘mode-line’で表示されます。結果として 通常のミニバッファーの使用では、モードラインは変化しません。 変数‘mode-line-in-non-selected-windows’を‘nil’にセットすることにより 、‘mode-line-inactive’の使用を無効にできます。これによりすべてのモードラ インが、‘mode-line’フェイスで表示されます。 モードラインに表示される改行フォーマットは、変数‘eol-mnemonic-unix’、 ‘eol-mnemonic-dos’、‘eol-mnemonic-mac’、および‘eol-mnemonic-undecided’を セットすることにより、カスタマイズできます。 14.19 テキストが表示される方法 ============================== ほとんどの文字は、“印字文字(printing characters)”です。これらの文字がバ ッファーに存在すると、スクリーンにそのまま表示されます。印字文字には ASCIIの数字、文字、区切り文字、同様に多くの非ASCII文字が含まれます。 ASCII文字セットには、印字されない“制御文字(control characters)”が含ま れます。その中でも特別に表示されるものが2つあります。1つ目は改行文字 (Unicodeのコードポイント‘U+000A’)で、新しい行を開始するのに表示されます 。2つ目はタブ文字(‘U+0009’)で、次のタブストップ(通常は8文字ごと)までをス ペースで表示します。タブを何文字のスペースで表示するかは、バッファーロー カルな変数‘tab-width’で制御され、1から1000の整数で指定しなければなりませ ん。バッファーのタブ文字がどのように表示されるかは、コマンドとしての の定義には関係ないことに注意してください。 他のASCII制御文字としては、‘U+0020’(8進の40、10進の32)より下のコード があり、それらはカレット(‘^’)と、その後ろに非制御文字バージョンの文字を 続けて、‘escape-glyph’フェイスで表示されます。たとえば文字 ‘control-A’(‘U+0001’)は、‘^A’と表示されます。 コード‘U+0080’(8進の200)から‘U+009F’(8進の237)までのrawバイトは、 ‘escape-glyph’フェイスにより、“8進エスケープシーケンス(octal escape sequences)”で表示されます。たとえば文字コード‘U+0098’(8進の230)は、 ‘\230’と表示されます。バッファーローカルな変数‘ctl-arrow’を‘nil’に変更す ると、ASCII制御文字も、カレットエスケープシーケンスではなく、8進エスケー プシーケンスで表示されます。 非ASCII文字の中には、ASCIIのスペースやハイフン(マイナス記号)と同じ外 観を持つものがあります。そのような文字は、意識せずにバッファーに入力され たとき(たとえばyankなどで)、問題となることがあります。たとえばソースコー ドコンパイラーは通常、非ASCIIのスペースを、空白文字として扱いません。こ の問題に対処するため、Emacsはそのような文字を特別な方法 (‘U+00A0’(no-break space)は‘nobreak-space’フェイス、‘U+00AD’(soft hyphen)、‘U+2010’(hyphen)、‘U+2011’ (non-breaking hyphen)は ‘nobreak-hyphen’フェイス)で表示します。これを無効にするには、変数 ‘nobreak-char-display’を‘nil’に変更します。この変数に非‘nil’かつ非‘t’の 値を与えると、Emacsはハイライトされたバックスラッシュの後に、スペースま たはハイフンを表示します。 特定の文字コードの表示のカスタマイズは、ディスプレーテーブル(display table)によって行われます。*note Display Tables: (elisp)Display Tables.を 参照してください。 グラフィカルなディスプレーでは、Emacsが利用可能なフォントにグリフがな い文字がいくつかあります。これらの“グリフがない文字(glyphless characters)”は、通常16進文字を含むボックスで表示されます。テキスト端末で は、端末エンコーディング(*note Terminal Coding::を参照してください)で表 示できない文字は、通常クエスチョン記号で表示されます。表示方法は、変数 ‘glyphless-char-display-control’で制御できます。これらの文字の表示がより 目立つように、‘glyphless-char’フェイスをカスタマイズすることもできます。 詳細は、*note Glyphless Character Display: (elisp)Glyphless Chars.を参照 してください。 Emacsはカレントのディスプレイでcurved quotes(‘‘’と‘’’)が表示可能か判 断を試みます。デフォルトでは、表示可能ならEmacsはメッセージやヘルプテキ スト内のASCIIクォート(‘`’と‘'’)をcurved quotesに変換します。ユーザーオプ ション‘text-quoting-style’をカスタマイズすることにより、この変換を有効ま たは無効にできます(*note (elisp)Keys in Documentation::を参照)。 curved quotes(‘‘’、‘’’、‘“’、‘”’)をASCII文字と同様な外観で見ることが できる場合、それらは‘homoglyph’フェイスで表示されます。表示できないこと が既知のcurved quotesは、それらのASCIIによる代替である‘`’、‘'’、‘"’が ‘homoglyph’で表示されます。 14.20 カーソルの表示 ==================== テキスト端末では、カーソルの外見は端末により制御され、大部分はEmacsの制 御が及びません。いくつかの端末は、普通の固定的なカーソルと、目立つ点滅カ ーソルの2種類を提供します。デフォルトではEmacsは目立つカーソルを使い、 Emacsを開始または再開したときは、そのカーソルに切り替えます。変数 ‘visible-cursor’が‘nil’の場合、Emacsを開始または再開したとき、普通のカー ソルを使います。 グラフィカルなディスプレーでは、より多くのテキストカーソルのプロパテ ィを変更できます。カラーを変えるには、フェイス‘cursor’の、属性 ‘:background’を変更します(このフェイスの他の属性には、何を指定しても効果 はありません。カーソルの下にあるテキストはフレームのバックグラウンドカラ ーを使って描画されます)。外見を変更するには、バッファーローカルな変数 ‘cursor-type’をカスタマイズします。有効な値は、‘box’(デフォルト)、 ‘hollow’(中抜きのボックス)、‘bar’(垂直のバー)、‘(bar . N)’(幅がNピクセル の垂直バー), ‘hbar’(水平バー)、‘(hbar . N)’(高さがNピクセルの水平バー)、 または‘nil’(カーソルなし)です。 デフォルトでは、カーソルは10回点滅する間にEmacsに何も入力がないと、点 滅をストップします。そして何らかの入力イベントがあると、また0からカウン トを再開します。変数‘blink-cursor-blinks’をカスタマイズして、これを制御 できます。変数の値には、何の入力もないとき点滅をストップする点滅回数を指 定します。変数に0または負の値をセットすると、カーソルはずっと点滅したま まになります。カーソルの点滅を無効にするには、変数‘blink-cursor-mode’を ‘nil’に変更するか(*note Easy Customization::を参照してください)、initフ ァイルに以下の行を追加します: (blink-cursor-mode 0) リスト変数‘blink-cursor-alist’をカスタマイズして、カーソルが点滅をストッ プしたとき、どのように見えるかを変更できます。リストの各要素は、 ‘(ON-TYPE . OFF-TYPE)’という形式を指定します。ON-TYPEには、点滅している ときのカーソルを指定します(ON-TYPEには、上で説明したカーソルタイプを指定 します)。そしてOFF-TYPEには、点滅していないときのカーソルを指定します。 タブ文字のように、特別に幅が広い文字もあります。そのような文字上にカ ーソルがあるとき、通常はデフォルトの文字幅で描画されます。カーソルを文字 幅に伸ばすには、変数‘x-stretch-cursor’を非‘nil’値に変更してください。 選択されていないウィンドウのカーソルは、通常点滅していない中抜きのボ ックスで表示されます(カーソルにバーを使っている場合、より細いバーで表示 されます)。選択されていないウィンドウでカーソルを非表示にするには、変数 ‘cursor-in-non-selected-windows’を‘nil’に変更してください。 カーソルをよりはっきりと表示させるために、HL Lineモードを使用できます 。このモードでは、ポイントを含む行がハイライトされます。現在のバッファー で有効または無効にするには、‘M-x hl-line-mode’を使います。このモードをグ ローバルに有効または無効にするには、‘M-x global-hl-line-mode’を使用して ください。 14.21 行の切り詰め ================== Emacsは行を継続(*note Continuation Lines::を参照してください)するかわり に、長い行を“切り詰めて”表示できます。これは、スクリーンやウィンドウの幅 より長い行は、全体が表示されないことを意味します。グラフィカルなディスプ レーでは、行が切り詰められている場合、フリンジに小さな直矢印が表示されま す。テキスト端末では、右端および/または左端の列に‘$’が表示されます。 水平スクロールは、自動的に行の切り詰めを引き起こします(*note Horizontal Scrolling::を参照してください)。特定のバッファーにたいして行 の切り詰めを明示的に有効にするには、コマンド‘M-x toggle-truncate-lines’を 使います。これは変数‘truncate-lines’をローカルに変更することで機能します 。値が非‘nil’のときは、長い行は切り詰められ、‘nil’のときは複数のスクリー ン行に分けられます。変数‘truncate-lines’をセットすると、現在のバッファー にローカルに適用されます。値を変更するまでは、デフォルト値(‘nil’)が使わ れます。 ウィンドウを分割して狭くなりすぎたとき、Emacsは自動的に行の切り詰めを 有効にします。これを制御する変数‘truncate-partial-width-windows’について は、*note Split Window::を参照してください。 14.22 Visual Lineモード ======================= このモードでは、通常の行継続の代わりに、“単語での折り返し”が使われます。 通常の行継続のように、長い論理行は2行以上のスクリーン行に分割されます。 しかしEmacsはウィンドウの右端(RTL言語:Right-To-Leftlanguageでは左端)の近 くの、単語の境界で折り返すよう試みます。これは単語の途中で折り返さないこ とにより、可読性を高めるためです。 単語での折り返しは、オプションのマイナーモードである、Visual Lineモー ドで有効になります。現在のバッファーでVisual Lineモードの有効と無効を切 り替えるには、‘M-x visual-line-mode’とタイプします。メニューバーから Visual Lineモードを有効にすることもできます(Optionsメニューから、サブメ ニュー‘Line Wrapping in this Buffer’の、メニューアイテム‘Word Wrap (Visual Line Mode)’を選択します)。Visual Lineモードが有効なときは、モー ドラインのモード表示に‘wrap’という文字が表示されます。コマンド‘M-x global-visual-line-mode’は、全バッファーのVisual Lineモードを切り替えま す。 Visual Lineモードでは、いくつかのコマンドは論理行ではなくスクリーン行 に作用します。‘C-a’ (‘beginning-of-visual-line’)はスクリーン行の先頭に移 動し、‘C-e’ (‘end-of-visual-line’)はスクリーン行の最後に移動、‘C-k’ (‘kill-visual-line’)はテキストをスクリーン行の最後までkillします。 論理行単位で移動するには、コマンド‘M-x next-logical-line’または‘M-x previous-logical-line’を使います。これらのコマンドはVisual Lineモードが 有効であるかにかかわらず、次または前の論理行に移動します。これらのコマン ドを頻繁に使う場合は、キーを割り当てると便利でしょう。*note Init Rebinding::を参照してください。 デフォルトでは、単語の折り返し表示はフリンジに表示されません。Visual Lineモードは、長い論理行を含むファイルを編集するときに使われる場合があり 、折り返し行すべてにフリンジの表示をすると見にくくなるためです。これを変 更するには、変数‘visual-line-fringe-indicators’をカスタマイズしてくださ い。 14.23 ディスプレーのカスタマイズ ================================ このセクションでは、Emacsスクリーンの外観を制御するさまざまな変数を説明 します。初心者はスキップして構いません。 Emacsにバッファー内の各行にたいして行番号を表示させたい場合は、バッフ ァーローカルな変数‘display-line-numbers’(デフォルトは‘nil’)をカスタマイ ズします。この変数は行番号表示のさまざまなモードをサポートするために、い くつかの異なる値をもつことができます。 ‘t’ バッファーテキストを表示する継続行ではないスクリーン各行の前に、、 (絶対)行番号を表示します。その行が継続行の場合、またはスクリーン行 全体がディスプレイ文字列(display string)、またはオーバーレイ文字列 (overlay string)の場合、その行に番号は振られません。 ‘relative’ バッファーテキストを表示する非継続行の前に、相対行番号(relative line number)を表示します。行番号はポイントを表示する行にたいして相 対的なので、カレント行から遠ざかるにしたがって、行番号は増加または 減少します。 ‘visual’ この値により、Emacsにビジュアル的に行をカウントさせます。実際にディ スプレイに表示されている行だけがカウントされ、ラップして複数行を占 めるスクリーン行は、複数回番号付けされます。表示される番号は、上述 の値‘relative’のように相対的です。これはOutlineモード(*note Outline Mode::を参照)のような、テキストをフォールド(fold: 折り畳む)するモー ドで、正確なスクリーン行の番号により移動するときに役立つでしょう。 その他 その他の非‘nil’値は、‘t’として扱われます。 コマンド‘M-x display-line-numbers-mode’は、行番号表示を切り替える便利 な方法を提供します。このモードのグローバル版は、 ‘global-display-line-numbers-mode’です。ユーザーオプション ‘display-line-numbers-type’は、上述した行番号表示のサブモードのどのモー ドをアクティブにするかを制御します。 たとえグローバルに‘display-line-numbers-mode’をオンにしていても、ミニバ ッファーやツールチップ内に行番号は表示されないことに注意してください。 Emacsが相対行番号を表示しているとき、カレント行(ポイントを表示してい る行)の前に表示される番号を制御できます。デフォルトでは、Emacsはカレント 行にたいしては、他のすべての行が相対行番号であっても、絶対行番号を表示し ます。変数‘display-line-numbers-current-absolute’を‘nil’値にカスタマイズ した場合、カレント行に表示される番号は0になります。これはカレント行の番 号が重要ではなく、大きなバッファー内のテキストにたいして、より多くの水平 方向の空きを残したいとき便利でしょう。 ナロー(*note Narrowing::を参照)されたバッファーでは通常、ナローイング の先頭から番号が開始されます。しかし、変数‘display-line-numbers-widen’を 非‘nil’値にカスタマイズした場合、ナローイングは無視されて、そのバッファ ーの最初の文字から行番号が開始されます。 Selective Display(選択的表示)モード(*note Selective Display::を参照 )、およびその他の(OutlineモードやOrgモードのような)ディスプレイから多く の行を隠すモードでは、行番号のために予約済みのスペースにたいする法則性の ない計算ミスを避けるために、変数‘display-line-numbers-width-start’および ‘display-line-numbers-grow-only’のカスタマイズ、または ‘display-line-numbers-width’に十分大きな値をセットしたいと思うかもしれま せん。 行番号は、特別なフェイス‘line-number’で表示されます。カレント行番号は 異なるフェイス‘line-number-current-line’で表示されるので、ポイントを表示 する行を見つける助けとなるように、カレント行番号に異なる外観を与えること ができます。 変数‘visible-bell’が非‘nil’の場合、Emacsは通常ベルサウンドを鳴らす場 面で、スクリーン全体を点滅するよう試みます。端末がスクリーンを点滅させる 方法を持たないとき、この変数は効果がありません。 変数‘echo-keystrokes’は、複数文字キーのエコー表示を制御します。値には エコーが開始されるまでの秒数を指定します。0の場合、エコーされません。何 かエコーされるべきものがあるときは、この変数の値が効果をもちます。*note Echo Area::を参照してください。 グラフィカルなディスプレーでは、Emacsはビジーのときにマウスポインター を砂時計で表示します。この機能を無効にするには、変数 ‘display-hourglass’に‘nil’をセットします。変数‘hourglass-delay’は、砂時 計が表示されるまでのビジーな時間を、秒数で指定します。デフォルトは1です 。 マウスポインターがEmacsのフレーム内にある場合、文字をタイプしてテキス トを挿入するまでの間、テキストを隠さないよう、Emacsはマウスポインターを 非表示にします(正確に言うとマウスポインターの非表示は、自己挿入的 (self-inserting)な文字をタイプしたときです。*note Inserting Text::を参照 してください)。マウスポインターを動かすと、再び表示されます。この機能を 無効にするには、変数‘make-pointer-invisible’に‘nil’をセットしてください 。 グラフィカルなディスプレーでは、変数‘underline-minimum-offset’は、ア ンダーラインされたテキストの、アンダーラインから文字の基底線までの最小距 離を、ピクセルで決定します。デフォルトでは値は1です。この変数を増加させ ると、特定のフォントにおいて、アンダーラインされたテキストの可読性が向上 します(しかしEmacsは、カレント行にはアンダーラインを描画しません)。変数 ‘x-underline-at-descent-line’は、テキストにアンダーラインを引く方法を決 定します。デフォルトは‘nil’で、これはフォントの基底線と同じレベルに描画 されることを意味します。これを‘t’に変更すると、Emacsはフォントが同じ大き さになるよう、アンダーラインを少し下に描画します。(アンダーラインされる テキストにたいして非デフォルトの行間が指定された場合、Emacsは追加される 行間の下にアンダーラインを描画する。*note (elisp)Line Height::を参照され たい。) 変数‘overline-margin’は、テキストの上のオーバーラインの垂直位置を、オ ーバーライン自身の高さも含めて、ピクセルで指定します。デフォルトは2です 。 テキスト端末には、bold(太字)かつ反転されたテキストが読みにくいものが あります。関数‘tty-suppress-bold-inverse-default-colors’に、引数非 ‘nil’を与えて呼び出すと、このような場合のbold-faceの効果を抑制します。 デフォルトでは、rawバイトは8進形式で表示されます。たとえば10進値が 128のバイトは‘\200’のように表示されます。これを16進形式の‘\x80’で表示す るよう変更するには、変数‘display-raw-bytes-as-hex’を‘t’にセットしてくだ さい。 15 検索と置換 ************* 他のエディターと同様、Emacsには文字列を検索(search)するコマンドがありま す。Emacsには、文字列を違う文字列で置き換える(replace)コマンドもあります 。また、同じことを行いますが、固定文字列ではなくパターンを検索するコマン ドもあります。 ‘xref’の制御下にある複数ファイルにたいして検索したり((*note Identifier Search::を参照してください)、Diredの‘A’コマンドを通じて検索し たり(*note Operating on Files::を参照してください)、‘grep’コマンドを使っ た検索(*note Grep Searching::を参照してください)も可能です。 15.1 インクリメンタル検索 ========================= Emacsにおける重要な検索コマンドは、“インクリメンタル検索(isearch: incremental search)”です。これは検索する文字列の最初の文字をタイプすると 、すぐに検索が開始されます。検索文字列をタイプしていくにつれて、Emacsは その文字列(それまでに入力した文字列)がどこにあるかを表示します。望む場所 を特定するのに充分な文字列をタイプしたところで、検索をストップできます。 次に何をするかによって、明示的なにより検索を終えたり、続けることが できます。 ‘C-s’ 前方にインクリメンタル検索します(‘isearch-forward’)。 ‘C-r’ 後方にインクリメンタル検索します(‘isearch-backward’)。 メニューバーの‘Edit->Search’メニューからインクリメンタル検索を呼び出 すこともできます。 15.1.1 インクリメンタル検索の基本 --------------------------------- ‘C-s’ インクリメンタル検索を開始します(‘isearch-forward’)。 ‘C-r’ 逆向きのインクリメンタル検索を開始します(‘isearch-backward’)。 ‘C-s’ (‘isearch-forward’)は、前方へのインクリメンタル検索を開始します 。これはキーボードから文字を読み取り、タイプした文字が最初に出現するバッ ファーの位置に、ポイントを移動します。 たとえば‘C-s’とタイプした後に‘F’をタイプすると、検索を開始したバッフ ァーのポイント位置より前方にある、最初の‘F’にカーソルを移動します。つぎ に‘O’をタイプすると、前方にある最初の‘FO’にカーソルが移動します。この場 合、‘FO’の‘F’は、前に見つかった‘F’と同じ位置である必要はありません。もう 一度‘O’をタイプすると、カーソルは最初の‘FOO’に移動します。 各ステップでEmacsは“カレントマッチ(current match: 現在のマッチ)”(検索 文字列にマッチしたバッファーのテキスト)を、‘isearch’フェイス(*note Faces::を参照してください)でハイライトします。このハイライトをカスタマイ ズするさまざまなオプションについては、*note Search Customizations::を参 照してください。その時点での検索文字列はエコーエリアにも表示されます。 検索文字列のタイプ中に間違ったら、(‘isearch-delete-char’)とタイ プしてください。をタイプするたびに、検索の間にエンターした最後の入 力がキャンセルされます。検索文字列、ポイント位置、検索の成否、検索の方向 、カレント検索結果の他端位置、検索の“ラッピング”を変更するコマンドのタイ プ時、Emacsは常に新たな“入力アイテム(input item)”を記録します。失敗した 検索を処理するための詳細は、*note Error in Isearch::を参照してください。 検索により到達した位置に満足したら、 (‘isearch-exit’)をタイプし ます。これは検索をストップして、検索により移動した位置にカーソルを残しま す。検索とは関係ないコマンドも、検索をストップして、そのコマンドが実行さ れます。つまり‘C-a’は検索をexitして行の先頭に移動し、矢印キーをタイプす ると検索をexitして対応する移動コマンドが処理される、などとなります。 で検索を終える必要があるのは、次のコマンドが印字文字をタイプするコ マンドのときだけです。および他のいくつかの文字(‘C-q’、 ‘C-w’、‘C-r’、‘C-s’、‘C-y’、‘M-y’、‘M-r’、‘M-c’、‘M-e’、および以下で説明 する文字)は、検索で特別な意味を持っています。検索をexitするコマンドを微 調整できます。*note Not Exiting Isearch::を参照してください。 特別な例外として、検索文字列が空のときにを入力すると、非インクリ メンタル検索(*note Nonincremental Search::を開始します(これは"カスタマイ ズ可能"です。*note Search Customizations::を参照してください)。 検索を中止して検索を開始した位置に戻るには、‘ ’ (‘isearch-cancel’)、または‘C-g C-g’ (‘isearch-abort’)とタイプしてくださ い。 インクリメンタル検索を終了するとき、ポイントの元の位置をマークをアク ティブにせず(ただしマークがすでにアクティブではなかったときだけ)に、マー クリングに追加します。これにより、‘C-u C-’、または‘C-x C-x’を使って 、検索を開始する前の位置に戻ることができます。*note Mark Ring::を参照し てください(Emacsはマークがすでにアクティブでないときだけ、これを行ないま す。検索を開始したときにマークがアクティブな場合は、‘C-u C-’と‘C-x C-x’の両方とも、マークに戻ります)。 後方に検索するには、‘C-s’で検索を開始するかわりに、‘C-r’ (‘isearch-backward’)を使います。前方検索が検索を開始した位置より前方にあ る最初のマッチを探すように、後方検索は検索を開始した位置より後方にある最 後のマッチを探します。 15.1.2 インクリメンタル検索の繰り返し ------------------------------------- 前方に‘FOO’を検索してマッチしたが、それは探しているマッチではなく、探し ているのはバッファーのもっと前方に出現する‘FOO’だとしましょう。ここでも う1度‘C-s’ (‘isearch-repeat-forward’)をタイプすることにより、検索文字列 が次に出現する場所に移動します。これは何回でも繰り返すことができます。も しタイプしすぎたときは、‘C-s’コマンドをで取り消すことができます。同 様に後方へのインクリメンタル検索では、‘C-r’ (‘isearch-repeat-backward’)に より後方検索が繰り返されます。 インクリメンタル検索中に手を止めて眺めてみると、検索文字列にたいする カレントマッチ以外に、スクリーンに表示されている他のマッチもハイライトさ れていることがわかります。これは検索するために、何回‘C-s’または‘C-r’を繰 り返せばよいのか予測しやすくするためです。その他のマッチは、カスタマイズ 可能なフェイス‘lazy-highlight’ (*note Faces::を参照してください)を使って 、現在のマッチとは異なってハイライトされます。この機能を無効にするには、 ‘isearch-lazy-highlight’に‘nil’をセットしてください。マッチのハイライト に関連するその他のカスタマイズについては、*note Search Customizations::を 参照してください。 検索を終了した後、同じ文字列を再度検索するには、‘C-s C-s’とタイプしま す。最初の‘C-s’はインクリメンタル検索を呼び出し、2回目の‘C-s’は最後に検 索した文字列の再検索を意味します。同様に、‘C-r C-r’は最後に検索した文字 列を後方に検索します。最後に検索された文字列の決定では、その文字列が ‘C-s’で検索されたのか、‘C-r’で検索されたのかは問題ではありません。 前方に検索していて、検索している対象が検索開始点より後方にあるのに気 付いたときは、検索文字列を変更すること無く、‘C-r’で後方検索に切り替える ことができます。同様に後方検索で‘C-s’をタイプすると、前方検索に切り替わ ります。 検索が失敗したとき、バッファーの先頭から検索を再開するには、もう一度 ‘C-s’をタイプします。逆向きの繰り返し検索が失敗したときは、‘C-r’でバッフ ァーの最後から検索を再開します。これは“wrapping around(巻き直し)”と呼ば れ、これが発生すると、‘Wrapped’という単語が検索プロンプトに表示されます 。検索を続けて元の検索開始ポイントを通過すると、‘Overwrapped’に変化しま す。これはすでに見たマッチを再訪していることを意味します。 以前に検索した文字列を再利用するには、“サーチリング(search ring)”を使 います。コマンド‘M-p’ (‘isearch-ring-retreat’)または‘M-n’ (‘isearch-ring-advance’)で、リングを移動して再使用したい文字列を取り出し ます。これらのコマンドは、選択されたリング要素の文字列をミニバッファーに 残すので、それを編集することができます。‘C-s’と‘C-r’、またはとタイ プすると、その文字列を受け入れて、その文字列にたいする検索を開始します。 サーチリングの中に保存されている、最近使用された検索文字列の数は、変数 ‘search-ring-max’で指定され、デフォルトは16です。 ミニバッファーの現在の検索文字列を、サーチリングのアイテムで置き換え ずに編集するときは、‘M-e’ (‘isearch-edit-string’)とタイプするか、ミニバ ッファーを‘mouse-1’でクリックします。、‘C-s’、‘C-r’とタイプすれば、 編集を終了してそれを検索できます。バッファーの検索を開始したポイントの後 に続く文字を検索文字列に追加するには、‘C-f’または‘’とタイプしてく ださい。 15.1.3 インクリメンタル検索でのyank ----------------------------------- 多くのケースで、ポイントの近くにあるテキストを検索文字列として使いたいこ とがあるでしょう。このサブセクションで説明されているコマンドにより、これ を便利に行なえるようになります。 ‘C-w’ (‘isearch-yank-word-or-char’)は、検索された文字列のポイントの次 の文字または単語を、検索文字列に追加します。これはポイント位置にあるテキ ストを検索する、簡単な方法です(コピーする対象を文字または単語のどちらに するかの決定は、発見的に行われます)。 同様に‘M-s C-e’ (‘isearch-yank-line’)は、検索文字列にカレント行の残り の部分を追加します。ポイントが既に行末にある場合、次の行が追加されます。 プレフィクス引数Nを指定すると、次のN行を追加します。 インクリメンタル検索での‘C-y’ (‘isearch-yank-kill’)は、カレントkillを 検索文字列に追加します。‘C-y’の後に‘M-y’ (‘isearch-yank-pop’)が呼び出さ れると、追加するテキストを、もっと前にkillされたものに置き換えます。これ は通常の‘M-y’ (‘yank-pop’)コマンドと似ています(*note Yanking::を参照して ください)。エコーエリアで‘mouse-2’をクリックすることにより、はカレントの X選択(*note Primary Selection::を参照してください)を検索文字列に追加しま す(‘isearch-yank-x-selection’)。 ‘C-M-w’ (‘isearch-del-char’)は検索文字列の最後の文字を削除し、‘C-M-y’ (‘isearch-yank-char’)は検索されたポイントの後の文字を追加します。ポイン トの後ろの文字を追加する他の方法は、‘M-e’(*note Repeat Isearch::を参照し てください)でミニバッファーに移動してから、検索文字列の最後で‘C-f’か ‘’をタイプします。‘C-f’か‘’をタイプするたびに、ポイントの 後の文字が検索文字列に順次追加されます。 検索が大文字小文字を区別しない場合は通常、検索文字列にyankされるテキ ストは小文字に変換されるので、検索は大文字小文字を区別しないままです (*note case folding: Lax Search.を参照してください)。しかし、変数 ‘search-upper-case’ (*note search-upper-case: Lax Search.を参照してくだ さい)の値が‘not-yanks’以外の場合には、この小文字への変換は無効になります 。 15.1.4 インクリメンタル検索でのエラー ------------------------------------- 文字列が見つからなかった場合、エコーエリアに‘Failing I-Search’と表示され て、文字列とできるかぎりマッチした位置に、カーソルが移動します。つまり ‘FOOT’を検索して‘FOOT’がない場合、カーソルは‘FOOL’という文字列の‘FOO’の 後ろに移動します。エコーエリアではマッチに失敗した検索文字列の一部が、フ ェイス‘isearch-fail’を使ってハイライトされます。 その時に行うことができる、いくつかの選択肢があります。もし文字列が間 違っている場合は、文字列を訂正するために、で前の入力アイテム(*note Basic Isearch::を参照)を削除、一度に一文字削除するなら‘C-M-w’、編集する 場合は‘M-e’とタイプします。もし見つかった位置が望む位置なら、をタイ プしてその位置に留まることができます。または‘C-g’をタイプして、検索文字 列から検索できなかった文字(‘FOOT’の中の‘T’)を取り除き、検索された部分の 文字列(‘FOOT’の中の‘FOO’)を残します。その位置でもう1回‘C-g’をタイプする と、検索全体を取り消し、ポイントは検索を開始した位置に戻ります。 終了コマンドの‘C-g’は、検索において特別な処理を行います。このコマンド の動作は、検索の状況に依存します。もし指定した文字列の検索が成功して、さ らに検索文字の入力を待っているとき、‘C-g’は検索全体を取り消して、カーソ ルを検索を開始したときの位置に移動します。検索文字列に検索に失敗した文字 が含まれているときに、‘C-g’がタイプされたときは、検索文字列から検索に失 敗した文字が取り除かれます。後に残るのは検索に成功した文字列で、さらに検 索文字の入力を待っているので、先のケースと同様、2回目の‘C-g’で検索全体が 取り消されます。 15.1.5 インクリメンタル検索の特別な入力 --------------------------------------- 前のサブセクションで説明した文字に加えて、インクリメンタル検索のときにタ イプする文字列の中には、特別な効果をもつものがあります。ここではそれらに ついて説明します。 lax space matching(「だらしない、ゆるんだ、緩慢な、締まりのない」スペ ースのマッチング。*note lax space matching: Lax Search.を参照してくださ い)を切り替えるには、‘M-s ’とタイプします。 検索でcase sensitivity(大文字小文字を区別するか)を切り替えるには、 ‘M-c’または‘M-s c’とタイプします。*note case folding: Lax Search.を参照 してください。検索文字列が大文字を含む場合、デフォルトではその検索は case-sensitive(大文字小文字を区別)します。 検索が似ている文字、または等価な文字を考慮するかどうかを切り替えるに は、‘M-s '’とタイプします。*note character folding: Lax Search.を参照し てください。検索文字列にアクセント付きの文字が含まれる場合、その検索の間 、character foldingは無効になります。 非表示のテキストを検索するかしないかは、‘M-s i’ (‘isearch-toggle-invisible’)とタイプして切り替えることができます。*note Outline Search::を参照してください。 インクリメンタル検索で、非正規表現による検索と、正規表現による検索を 切り替えるには、‘M-r’、または‘M-s r’ (‘isearch-toggle-regexp’)とタイプし ます。*note Regexp Search::を参照してください。 シンボルモードを切り替えるには、‘M-s _’とタイプします。*note Symbol Search::を参照してください。 改行文字を検索するには、検索文字列の途中で‘C-j’とタイプします。 非ASCII文字を検索するには、以下の方法の1つを使います: • ‘C-q’ (‘isearch-quote-char’)に続けて、非グラフィック文字か8進数字を タイプします。これは‘C-q’を使ってバッファーに文字を挿入するのと同様 に、検索文字列にタイプする文字を追加します(*note Inserting Text::を 参照してください)。たとえばインクリメンタル検索で‘C-q C-s’をタイプ すると、検索文字列に文字‘control-S’が追加されます。 • ‘C-x 8 ’ (‘isearch-char-by-name’)に続けて、Unicode名か16進のコ ードポイントをタイプします。これは通常の‘insert-char’コマンドと同様 に、検索文字列に指定した文字を追加します(*note Inserting Text::を参 照してください)。 • 入力メソッド(IM: input method)を使います(*note Input Methods::を参 照してください)。検索を開始したとき、カレントバッファーで入力メソッ ドが有効の場合、ミニバッファーで検索もL字列をタイプするときにも、同 じメソッドがアクティブになるでしょう。検索文字列をタイプするとき、 ‘C-\\’ (‘isearch-toggle-input-method’)で、入力メソッドを切り替える ことができます。非デフォルトの入力メソッドに切り替えるには、‘C-^’ (‘isearch-toggle-specified-input-method’)を使います。これは入力メソ ッドの名前を尋ねます。インクリメンタル検索で入力メソッドがアクティ ブのとき、検索プロンプトには以下のようなニーモニックが含まれます。 I-search [IM]: IMはアクティブな入力メソッドのニーモニックです。インクリメンタル検 索で入力メソッドを有効にすると、カレントバッファーでも入力メソッド が有効のまま残ります。 インクリメンタル検索の中で‘M-s o’とタイプすることにより、カレントの検 索文字列で‘occur’を実行する、‘isearch-occur’が呼び出されます。*note occur: Other Repeating Search.を参照してください。 インクリメンタル検索で‘M-%’ (‘isearch-query-replace’)をタイプすると、 ‘query-replace’または‘query-replace-regexp’が呼び出され(検索モードに依存 します)、現在の検索文字が置換対象になります。負のプレフィクス引数は、後 方への置換を意味します。*note Query Replace::を参照してください。‘C-M-%’ (‘isearch-query-replace-regexp’)とタイプすることにより、カレント検索文字 列を置換すべき正規表現として‘query-replace-regexp’が呼び出されます。 インクリメンタル検索で‘M-’をタイプすると、‘isearch-complete’が呼 び出され、サーチリング(以前に使用された検索文字列)を補完リストとして使っ て、検索文字列の補完を試みます。*note Completion::を参照してください。多 くのオペレーティングシステムでは、キーシーケンス‘M-’はウィンドウマ ネージャーに捕えられます。その場合、これを使うには‘isearch-complete’を、 他のキーシーケンスに再バインドする必要があります(*note Rebinding::を参照 してください)。 ディスプレーで最後に検索した文字列にたいするマッチをハイライトしたま ま、検索をexitできます。これを行なうには、‘M-s h r’ (‘isearch-highlight-regexp’)とタイプします。これは最後の検索文字列を継承 するregexpと、ハイライトに表示するフェイスの入力を求めて、それらを引数と して‘highlight-regexp’ (*note Highlight Interactively::を参照してくださ い)を実行します。ハイライトを除去するには、‘M-s h u’ (‘unhighlight-regexp’)とタイプしてください。 インクリメンタル検索がアクティブのとき、‘C-h C-h’ (‘isearch-help-map’)とタイプすると、特別なキーバインドのリストを含む、対 話的なヘルプにアクセスできます。これらのキーバインドは、キーマップ ‘isearch-mode-map’の一部です(*note Keymaps::を参照してください)。 15.1.6 インクリメンタル検索を終了させない ----------------------------------------- このサブセクションでは、検索で特別な意味をもたないコマンドが、そのコマン ドを実行する前に、検索をexitするかどうかを制御する方法を説明します。また 、(たとえそれらがインクリメンタル検索の一部ではなくても)カレントのインク リメンタル検索をexitせずにタイプできる、2つのカテゴリーに属するコマンド を説明します。 インクリメンタル検索によりバインドされていないコマンドをタイプすると 通常、そのコマンドを実行する前に検索をexitします。したがって、そのコマン ドは検索を呼び出したときのバッファーにたいして処理を行なうことになります 。しかし、変数‘search-exit-option’を‘nil’にカスタマイズした場合、(インク リメンタル検索により解釈されないような)タイプした文字は、単に検索文字列 に追加されます。これにより、通常は検索をexitして、その文字にバインドされ ているコマンドをそのバッファーにたいして呼び出す、‘C-a’のような制御文字 を検索文字列に含めることができるようになります。 プレフィクス引数 インクリメンタル検索でプレフィクス引数を指定したコマンドをタイプす ると、デフォルトではその引数は次の検索アクションに適用されるか、検 索をexitするコマンドに渡されます。他の言い方をすると、プレフィクス 引数の入力自体は、検索を終了させません。 以前のバージョンのEmacsでは、プレフィクス引数の入力は常に検索を終了 させていました。この振る舞いに戻すには、変数 ‘isearch-allow-prefix’に‘nil’をセットしてください。 ‘isearch-allow-scroll’が非‘nil’のとき(以下を参照)、プレフィクス引数 は上で説明したようなデフォルト動作をします。つまり、たとえ ‘isearch-allow-prefix’が‘nil’でも、プレフィクス引数は検索を終了させ ません。 スクロールコマンド 通常スクロールコマンドは、インクリメンタル検索を終了させます。変数 ‘isearch-allow-scroll’を非‘nil’値に変更すると、スクロールバーや ‘C-v’、‘M-v’、‘C-l’のようなスクロールコマンド(*note Scrolling::を参 照してください)が利用可能になります。これは、これらのコマンドをバウ ンドされたキーシーケンスで呼び出したときだけ適用されます。つまり ‘M-x’は依然として検索を終了させます。これらのコマンドには、通常の方 法でプレフィクス引数を与えることができます。この機能ではカレントマ ッチが表示されない位置にスクロールすることはできません。 ‘isearch-allow-scroll’の機能は、正確にはスクロールではないが、テキ ストが表示されるスクリーン位置に影響する、‘C-x 2’ (‘split-window-below’)や‘C-x ^’ (‘enlarge-window’)のような、コマン ドにも効果を及ぼします。これはコマンド名の‘isearch-scroll’プロパテ ィが非‘nil’のコマンドに適用されます。そのため、どのコマンドが影響を 受けるかは、それらのプロパティを変更して制御できます。 たとえば将来のEmacsセッションも含めて、インクリメンタル検索中に‘C-h l’を使えれば便利だと思ったら、まず‘C-h c’で何のコマンドが実行される か調べて(*note Key Help::を参照してください)、それが ‘view-lossage’だとわかります。その後はinitファイルに以下を追加しま す(*note Init File::を参照してください)。 (put 'view-lossage 'isearch-scroll t) この機能はポイント、バッファー内容、マッチデータ、カレントバッファ ーや選択されているウィンドウ・フレームを変更しない任意のコマンドに 適用できます。そして、そのコマンド自体がインクリメンタル検索を行っ てはなりません。この機能は、‘isearch-allow-scroll’が‘nil’(デフォル ト)の場合は無効です。 15.1.7 ミニバッファーの検索 --------------------------- ミニバッファーがアクティブのときインクリメンタル検索を開始すると、 Emacsはミニバッファーの内容を検索します。通常のバッファーにたいする検索 とは異なり、エコーエリアはミニバッファーの表示に使われているので、検索文 字列はエコーエリアには表示されません。 ミニバッファーでのインクリメンタル検索が失敗すると、ミニバッファーヒ ストリーを検索します。*note Minibuffer History::を参照してください。ミニ バッファーとミニバッファーのヒストリーは、一番古いヒストリー要素が最初で 、カレントのミニバッファーが最後にある、一連のページとして視覚化すること ができます。前方検索の‘C-s’は前方、つまり新しいページを検索し、後方検索 の‘C-r’は後方、つまり古いページを検索します。普通のバッファーの検索と同 様、検索が失敗すると、最後から最初のページ、またはその逆に巻き直して検索 します。 カレントマッチがヒストリーの要素にあった場合、ヒストリーの要素はミニ バッファーに取り出されます。インクリメンタル検索を正常に終了(たとえば をタイプ)すれば、それはミニバッファーに残ります。検索を取り消すのは ‘C-g’で、これによりミニバッファーの内容は検索を開始したときのものに復元 されます。 15.2 非インクリメンタル検索 =========================== Emacsには、従来式の非インクリメンタル検索もあります。これは検索を開始す る前に、検索文字列全体を入力する必要があります。 ‘C-s STRING ’ STRINGを検索します。 ‘C-r STRING ’ 後方にSTRINGを検索します。 非インクリメンタル検索を開始するには、最初に‘C-s ’をタイプします 。これにより、検索文字列を読みとるために、ミニバッファーに移動します。検 索文字列の入力を終了して検索を開始するには、をタイプします。文字列 が見つからなかったとき、検索コマンドはエラーをシグナルします。 ‘C-s ’とタイプすると、‘C-s’は通常どおりインクリメンタル検索を呼 び出します。しかし、このコマンドは指定した文字列が空のとき、非インクリメ ンタル検索を行うコマンドを呼び出すよう、プログラムされています(そのよう な用途以外に空の引数は無意味です)。‘C-r ’も同様に、後方に非インクリ メンタル検索を行なうコマンドを呼び出します。 メニューバーの‘Edit->Search’メニューから非インクリメンタル検索を呼び 出すこともできます。 よりシンプルな2つのコマンド、‘M-x search-forward’と‘M-x search-backward’を使うこともできます。これらのコマンドは指定した文字をリ テラルとして検索し、case folding(検索で大文字小文字を区別するか)を除く lax-search機能(*note Lax Search::を参照してください)をサポートしません。 15.3 単語検索 ============= “単語検索(word search)”は、単語の並びを、その間にある区切り文字の種類と は無関係に検索します。たとえば検索文字列に、1つのスペースで区切られた2つ の単語を入力すると、2つの単語を区切るのが、1つまたはそれ以上のスペース、 改行文字、およびそれ以外の区切り文字の場合にもマッチします。これはテキス ト文書を検索するとき特に有用です。なぜなら検索する単語が改行で区切られて いるのか、スペースで区切られているのか考慮しなくてもよいからです。プログ ラミング言語のためのメジャーモード、およびその他の特別なメジャーモード、 そのモードの構文的なニーズに適合するように、単語の定義が変更されているか もしれないことに注意してください。 ‘M-s w’ インクリメンタル検索がアクティブのとき、単語検索モードに切り替えま す(‘isearch-toggle-word’)。非アクティブのときは、前方へのインクリメ ンタルな単語検索を開始します(‘isearch-forward-word’)。 ‘M-s w WORDS ’ 非インクリメンタルな単語検索を使って、WORDSを前方検索します。 ‘M-s w C-r WORDS ’ 非インクリメンタルな単語検索を使って、WORDSを後方検索します。 ‘M-s M-w’ リージョン内のテキストにたいして、Webを検索します。 前方へのインクリメンタルな単語検索を開始するには、‘M-s w’とタイプしま す。インクリメンタル検索が非アクティブの場合、これはコマンド ‘isearch-forward-word’を実行します。インクリメンタル検索がすでにアクティ ブの場合(前方か後方かにかかわらず)、‘M-s w’は検索の方向と現在の検索文字 列は変更せずに、単語検索に切り替えるコマンド‘isearch-toggle-word’を実行 します。単語検索をオフに切り替えるには、再度‘M-s w’をタイプしてください 。 非インクリメンタルな単語検索を開始する場合、前方検索は‘M-s w ’、 後方検索は‘M-s w C-r ’をタイプします。これらはコマンド ‘word-search-forward’、または‘word-search-backward’を実行します。 インクリメンタルな単語検索と、非インクリメンタルな単語検索では、マッ チを見つける方法に若干の違いがあります。非インクリメンタルな単語検索では 、検索文字列の各単語は、単語全体に厳密に一致しなければなりません。インク リメンタルな単語検索では、マッチの規則は緩くなります。検索文字列をタイプ するとき、最初と最後の単語は、単語全体にマッチする必要はありません。これ はタイプする度にマッチを処理するためです。これは(カーソルがある)カレント マッチ以外のマッチ(lazy matches。*note Incremental Search::を参照してく ださい)には適用されません。それらは単語全体がマッチしなければハイライト されません。検索文字列をタイプしている間は、‘C-s’のような検索繰り返しキ ーを使用するまで、検索プロンプトに‘Pending’が表示されます。 単語検索コマンドは、character foldingを処理せず、lax whitespace matching(*note lax space matching: Lax Search.を参照してください)が効果 をもたないように切り替えます。 リージョン内のテキストにたいしてWebを検索するには、‘M-s M-w’とタイプ します。このコマンドは、変数‘eww-search-prefix’により指定されたURLの検索 エンジンを使用して、リージョン内の単語にたいするインターネット検索を行な います(*note EWW: (eww)Basics.を参照)。リージョンがアクティブでない場合 、このコマンドはユーザーに検索するURL、またはキーワードの入力を求めます 。 15.4 シンボル検索 ================= “シンボル検索(symbol search)”は、通常の検索と似ていますが、検索の境界が シンボルの境界にマッチしていなければなりません。“シンボル”の意味は、メジ ャーモードのコンテキストに依存しており、Emacs LispモードでのLispシンボル のように、通常はソースコードのトークンを参照します。たとえばLispシンボル ‘forward-word’をインクリメンタルなシンボル検索すると、これは ‘isearch-forward-word’にはマッチしません。そのため、この機能は主にソース コードの検索に有用です。 ‘M-s _’ インクリメンタル検索がアクティブのとき、シンボル検索モードに切り替 えます(‘isearch-toggle-symbol’)。非アクティブのときは、前方へのイン クリメンタルなシンボル検索を開始します(‘isearch-forward-symbol’)。 ‘M-s .’ ポイントの近くにあるシンボルを、検索文字列の初期値に追加して、前方 へのインクリメンタルなシンボル検索を開始します。 ‘M-s _ SYMBOL ’ SYMBOLにたいして、前方への非インクリメンタルな検索をします。 ‘M-s _ C-r SYMBOL ’ SYMBOLにたいして、後方への非インクリメンタルな検索をします。 前方へのインクリメンタルなシンボル検索を開始するには、‘M-s _’(ポイン トの近くにシンボルがあるときは‘M-s .’)をタイプします。インクリメンタル検 索が非アクティブのときは、コマンド‘isearch-forward-symbol’が実行されます 。すでにインクリメンタル前方へのインクリメンタルなシンボル検索を開始する には、‘M-s _’(ポイントの近くにシンボルがあるときは‘M-s .’)をタイプします 。インクリメンタル検索が非アクティブのときは、コマンド ‘isearch-forward-symbol’が実行されます。すでにインクリメンタル検索がアク ティブのとき、‘M-s _’は検索方向と現在の検索文字列を維持した状態で、シン ボル検索に切り替えます(もう一度‘M-s _’をタイプすると、シンボル検索を無効 にできます)。インクリメンタルなシンボル検索では、検索み文字列をタイプす る間は、検索文字列の先頭がシンボルの先頭にマッチだけが必要であり、 ‘C-s’のような検索繰り返しキーを使用するまでは検索プロンプトに‘Pending’が 表示されます。 非インクリメンタルなシンボル検索は、前方への検索は‘M-s _ ’、後方 への検索は‘M-s _ C-r ’をタイプします。非インクリメンタル検索では、 文字列の先頭と最後が、シンボルの先頭と最後にマッチする必要があります。 シンボル検索コマンドは、character foldingを処理せず、lax whitespace matching(*note lax space matching: Lax Search.を参照してください)が効果 をもたないように切り替えます。 15.5 正規表現検索 ================= “正規表現”(regular expression: “regexp”と略します)とは、文字列にマッチさ せるための代替の文字列クラスを示すパターンです。Emacsはregexpにマッチす る検索を、インクリメンタル、非インクリメンタルの両方で提供します。正規表 現の構文は、次のセクションで説明します。 ‘C-M-s’ インクリメンタルなregexp検索を開始します (‘isearch-forward-regexp’)。 ‘C-M-r’ 逆方向のインクリメンタルなregexp検索を開始します (‘isearch-backward-regexp’)。 regexpにたいするインクリメンタル検索は、‘C-M-s’ (‘isearch-forward-regexp’をタイプするか、プレフィクス引数(引数の値は何で もよい)を指定して、‘C-s’を呼び出します。前方へのインクリメンタル検索中は 、‘M-r’をタイプします。このコマンドは‘C-s’と同様に、検索文字列をインクリ メンタルに読みとりますが、検索文字列に正確に一致するバッファーのテキスト を検索するのではなく、検索文字列をregexpとして扱います。検索文字列にテキ ストを追加する度に、regexpは長くなり、新しいregexpを検索します。後方への regexp検索には、‘C-M-r’(‘isearch-backward-regexp’)またはプレフィクス引数 を指定した‘C-r’を使います。後方へのインクリメンタル検索中は‘M-r’を使いま す。 通常のインクリメンタル検索の特別なキーシーケンス(*note Special Isearch::)は、インクリメンタルなregexp検索でも同じようなことを行います。 たとえば検索開始直後に‘C-s’をタイプすると、最後に行ったインクリメンタル 検索で使ったregexpで、前方検索を行います。インクリメンタルなregexpと非 regexp検索は、独立したデフォルトを持ちます。これらは別のサーチリングも持 っており、これには‘M-p’と‘M-n’でアクセスできます。サーチリングに保存され る検索regexpの最大数は、‘regexp-search-ring-max’の値により決定され、デフ ォルトは16です。 通常のインクリメンタル検索とは異なり、インクリメンタルregexp検索は、 デフォルトではlax space matchingを使いません。この機能を切り替えるには、 ‘M-s ’ (‘isearch-toggle-lax-whitespace’)を使います。そうするとイン クリメンタルregexp検索でのは、1つ以上の空白文字の並びにマッチするよ うになります。変数‘search-whitespace-regexp’は、lax space matchingにたい するregexpを指定します。*note Special Isearch::を参照してください。 通常のインクリメンタル検索とは異なり、インクリメンタルなregexp検索で はcharacter folding(*note Lax Search::を参照してください)を使用できませ ん(インクリメンタルregexp検索の途中で、‘M-s '’によりcharacter foldingを 切り替えた場合、検索は非regexp検索となり、タイプした検索パターンはリテラ ル文字列として解釈されます)。 インクリメンタルregexp検索では、検索文字列の追加によりカーソルが前に 戻され、最初から検索しなおされることがありえます。たとえば検索文字列 ‘foo’に‘\|bar’を追加すると、カーソルは‘foo’から、それより前にある最初の ‘bar’に戻ります。*note Regexps::を参照してください。 前方および後方へのregexp検索は、対照的ではありません。なぜならEmacsで のregexpに対するマッチは常に前方へ処理され、regexpの先頭から開始されるか らです。したがって前方へのregexp検索は前方にスキャンし、可能性のある開始 位置から前方へとマッチを試みます。後方へのregexp検索は後方へスキャンし、 可能性のある開始位置から前方へとマッチを試みます。これらの検索手法はミラ ーイメージではありません。 regexpにたいする非インクリメンタルな検索は、コマンド ‘re-search-forward’および‘re-search-backward’で行われます。これらのコマ ンドは‘M-x’から呼び出すか、インクリメンタルregexp検索からの‘C-M-s ’および‘C-M-r ’で呼び出します。‘M-x’を使用してこれらのコマンド を呼び出した場合は、指定したregexpを厳密に検索するので、case foldingを除 くlax-search機能(*note Lax Search::を参照してください)はサポートされませ ん プレフィクス引数を指定したインクリメンタルregexp検索は、 ‘isearch-forward’や‘isearch-backward’のような、通常の文字列を検索します 。*note Incremental Search::を参照してください。 15.6 正規表現の構文 =================== このセクション(および、マニュアル全般)では、ユーザーが通常使う正規表現の 機能を説明します。主にLispプログラムで使用される追加の機能については、 *note (elisp)Regular Expressions::を参照してください。 正規表現は、いくつかの特殊文字と、それ以外の“普通”の文字からなる構文 を持ちます。通常の文字はそれと同じ文字にマッチし、それ以外の文字にはマッ チしません。特殊文字は、‘$^.*+?[\’です。文字‘]’は、文字候補を終了させる 場合は特殊文字です(以下参照)。文字‘-’は、文字候補の中では特殊文字です。 正規表現の中に現れるその他の文字は、前に‘\’がついてない限り普通の文字で す(Lispプログラム内で正規表現を使う場合、‘\’は2つ記述しなければなりませ ん。このセクションの最後にある例を参照してください)。 たとえば‘f’は特殊文字ではなく普通の文字なので、正規表現中の‘f’は文字 列‘f’にマッチし、他の文字列にはマッチしません(文字列‘ff’にはマッチ_しま せん_)。同様に正規表現中の‘o’は、‘o’だけにマッチします(大文字小文字を区 別しない場合、これらのregexpは‘F’や‘O’にもマッチしますが、これを例外とし てではなく、“同じ文字列”を一般化したものと考えます)。 2つの正規表現AとBを結合できます。結合した結果は、Aが先頭の適当な部分 に一致して、Bが残りの部分に一致する正規表現となります。些細な例としては 、‘f’と‘o’という正規表現を結合すると、正規表現‘fo’となり、これは文字列 ‘fo’だけにマッチします。ここまでは普通です。これより複雑ことを行うには、 特殊文字を使う必要があります。以下にリストを示します。 ‘.’ (ピリオド) これは改行文字以外の任意の1文字にマッチする特殊文字です。たとえば正 規表現‘a.b’は、最初が‘a’で最後が‘b’の3文字の文字列にマッチします。 ‘*’ 単独では使用されません。これは接尾演算子で、前の正規表現の任意の回 数、可能な限り多くの回数を含めた繰り返しを意味します。したがって ‘o*’は任意の個数の‘o’にマッチし、‘o’がない場合(0個の場合)も含めてマ ッチします。 ‘*’は常に可能な限り_小さな_、前置表現に適用されます。したがって ‘fo*’は‘fo’の繰り返しではなく‘o’の繰り返しです。この正規表現は‘f’、 ‘fo’、‘foo’、...にマッチします。 マッチングにより構成される‘*’は、見つけられるだけの反復回数へと、直 ちに処理されます。その後でパターンの残りの部分の処理を続けます。こ れが失敗すると、バックトラッキングが発生します。‘*’の反復回数をいく つか捨てて、パターンの残りの部分がマッチするように構成を変更します 。たとえば文字列‘caaar’にたいして‘ca*ar’をマッチさせる場合、まず最 初に‘a*’を、3つすべての‘a’にマッチさせます。しかしパターンの残りの 部分は‘ar’ですが、マッチさせるために残っているのは‘r’だけなので、こ のマッチは失敗します。かわりに‘a*’を2つの‘a*’だけにマッチさせます。 この選択により、regexpの残りの部分のマッチが成功します。 ‘+’ これは‘*’と同様に接尾演算子ですが、前置表現に最低1回マッチしなけれ ばならない点が異なります。したがって‘ca+r’は‘car’、‘caaaar’にマッチ しますが、‘cr’にはマッチしません。一方‘ca*r’は、これら3つすべての文 字列にマッチします。 ‘?’ これは‘*’と同様に接尾演算子ですが、前置表現が1回出現するか、出現し ないかいずれかという点が異なります。したがって‘ca?r’は、‘car’または ‘cr’のいずれかになります。 ‘*?’, ‘+?’, ‘??’ これらは上述した演算子の、非“貪欲(greedy)”なタイプの演算子です。通 常の演算子‘*’、‘+’、‘?’は、regexpがマッチする、できる限り長いマッチ を行います。しかしこれらの演算子に‘?’を後置すると、できる限り短いマ ッチを行います。 したがって‘ab*’と‘ab*?’は、両方とも文字列‘a’と文字列‘abbbb’にマッチ しますが、文字列‘abbb’にマッチさせたとき、‘ab*’は文字列全体(有効な 最長マッチ)にマッチしますが、‘ab*?’は‘a’(有効な最短マッチ)だけにマ ッチします。 非貪欲な演算子は、与えられた開始位置から開始される、できるだけ短い 文字列にマッチします。前方検索では、利用できる一番最初の開始位置は 、常にカーソルの位置となります。したがって末尾が改行のテキスト ‘abbab’にたいして‘a.*?$’を検索すると、文字列全体にマッチします。こ れはマッチが最初の‘a’から開始されので、マッチさせることが_できる_の です。 ‘\{N\}’ これはN回の繰り返しを指定する接尾演算子です。つまり前置される正規表 現に、正確にN回連続でマッチしなければなりません。たとえば‘x\{4\}’は 、文字列‘xxxx’だけにマッチします。 ‘\{N,M\}’ これはN回からM回の繰り返しを指定する接尾演算子です。つまり前置され る正規表現が、最低N回、最大M回マッチしなければなりません。Mが省略さ れたときは、マッチ回数の上限はありませんが、前置される正規表現は少 なくともN回マッチしなければなりません。 ‘\{0,1\}’は、‘?’と同じです。 ‘\{0,\}’は、‘*’と同じです. ‘\{1,\}’は、‘+’と同じです。 ‘[ ... ]’ これは‘[’で始まり‘]’で終わる、“文字集合(character set)”です。 もっとも簡単なケースでは、2つのカッコの間に指定された文字が、マッチ できる文字集合となります。したがって‘[ad]’は1つの‘a’か1つの‘d’にマ ッチし、‘[ad]*’は‘a’と‘d’からなる任意の文字列にマッチします(空の文 字列を含む)。結果として‘c[ad]*r’は、‘cr’、‘car’、‘cdr’、‘caddaar’、 ...にマッチします。 文字集合には、開始文字と終了文字の間に‘-’を記述することにより、文字 の範囲を含めることもできます。したがって‘[a-z]’は、ASCII小文字とな ります。文字の範囲と特定の文字の指定を混ぜることもできます。 ‘[a-z$%.]’は任意のASCII小文字と‘$’、‘%’、‘.’にマッチします。別の例 としては、‘[α-ωί]’はギリシャ文字の小文字すべてにマッチします。 いくつかの特別な“文字クラス(character classes)”を、文字集合に含める こともできます。文字の候補を含む文字クラスを‘[:’と‘:]’で囲んで指定 します。たとえば‘[[:alnum:]]’は、任意のアルファベットと数字にマッチ します。文字クラスのリストは、*note (elisp)Char Classes::を参照して ください。 文字集合に‘]’を含めるには、それを最初に記述しなければなりません。た とえば‘[]a]’は、‘]’または‘a’にマッチします。文字集合に‘-’を含めるに は、‘-’を、文字集合の最初または最後に記述するか、文字範囲の外に記述 します。したがって‘[]-]’は、‘]’と‘-’の両方にマッチします。 文字集合に‘^’を含めるには、集合の最初以外に記述します(最初に記述し た場合、補集合を指定したことになります。以下を参照してください)。 大文字小文字を区別しない検索で文字の範囲を使う場合、範囲の先頭と最 後を、大文字だけ、または小文字だけで記述するか、先頭と最後をアルフ ァベット以外で記述するべきです。‘A-z’のような大文字小文字を混成した 範囲指定は不正な定義で、Emacsの将来のバージョンで変更されるかもしれ ません。 ‘[^ ... ]’ ‘[^’は“文字の補集合complemented character set”を開始します。つまり 指定された文字以外がマッチします。したがって‘[^a-z0-9A-Z]’は、 ASCII文字と数字_以外_にマッチします。 ‘^’は文字集合で最初以外で使用された場合、特別な意味をもちません。 ‘^’に続く文字は、先頭にあるものとして扱われます(いいかえると‘-’と ‘]’は、ここでは特別な意味をもちません)。 もしマッチしない文字として改行が記述されていなければ、文字の補集合 を改行にマッチさせることができます。これは‘grep’のようなプログラム における、regexpにたいする処理とは対照的です。 ‘^’ これは空文字列、ただしテキストの行頭だけにマッチする特殊文字です。 それ以外ではマッチに失敗します。したがって‘^foo’は行の先頭にある ‘foo’にマッチします。 歴史的な互換性により、この意味での‘^’の使用は、正規表現の先頭か、 ‘\(’または‘\|’の後に記述された場合に限ります。 ‘$’ ‘^’と似ていますが、行末だけにマッチします。したがって‘x+$’は、行末 にある1つ以上の‘x’にマッチします。 歴史的な互換性により、この意味での‘$’の使用は、正規表現の最後か、 ‘\)’または‘\|’の後に記述された場合に限ります。 ‘\’ これには2つの機能があります。まず特殊文字(‘\’を含む)をクォートする ことと、追加の特別な構成を導入することです。 ‘\’は特殊文字をクォートするので、正規表現中の‘\$’は‘$’だけにマッチ し、‘\[’は‘[’だけにマッチします。 ‘\’で始まる特別な構成については、以下のセクションを参照してください 。 注意: 歴史的な互換性から、特殊文字はそれが特殊な意味をもたないような コンテキストで使用された場合は、通常の文字として扱われます。たとえば ‘*foo’は、‘*’が特殊文字として動作するための前置された表現がないので、普 通の文字として扱われます。このような振る舞いに依存することは、よい習慣で はありません。特殊文字を記述する場合、それがどこに記述されようとクォート するべきです。 文字集合の候補中では‘\’は特別ではなく、‘-’と‘]’のもつ特別な意味を除去 することはありません。したがって、これらの文字が特別な意味をもたないよう な場所にあるときは、これらの文字をクォートすべきではありません。これでは 明確ではないかもしれません。これらの特殊文字が特別な意味を_もつ_場所にあ るとき、バックスラッシュを前置することによりクォートされるのです。たとえ ば‘[^\]’(Lispの文字記法では‘"[^\\]"’)は、バックスラッシュ以外の任意の一 文字にマッチします。 15.7 正規表現でのバックスラッシュ ================================= 多くの場合、任意の文字を伴う‘\’はその文字だけに一致します。しかしいくつ か例外があって、‘\’で始まる2文字のシーケンスが、特別な意味を持つ場合があ ります。シーケンス内の2文字目にくる文字は、単独で使った場合には普通の文 字として扱われるものです。以下は‘\’の構成の表です。 ‘\|’ 選択肢を指定します。2つの正規表現AとBの間に‘\|’を記述すると、それは AまたはBのいずれかにマッチする表現を形成します。これはまずAとのマッ チを試み、失敗した場合にBとのマッチを試みます。 したがって‘foo\|bar’は、‘foo’または‘bar’のいずれかにマッチし、それ 以外の文字列にはマッチしません。 ‘\|’は、周囲の一番大きな表現に適用されます。‘\|’のグループ化の能力 に制限をかけることができるのは、周囲の‘\( ... \)’によるグループ化だ けです。 複数の‘\|’使用を処理するための、完全なバックトラッキング能力が存在 します。 ‘\( ... \)’ 3つの目的のためのグループ化構成です: 1. 他の操作に使うために、一連の選択肢‘\|’を括ります。したがって ‘\(foo\|bar\)x’は、‘foox’または‘barx’のいずれかにマッチします 。 2. 接尾演算子‘*’、‘+’、‘?’を適用できるように、複雑な正規表現を括 ります。したがって‘ba\(na\)*’は、‘bananana’のように、(0個以上 の)文字列‘na’にマッチします。 3. あとで参照できるように、マッチした部分文字列を記録します。 この最後の使い方は、カッコでグループ化することが重要なのではありま せん。これは‘\\( ... \\)’構成の、2番目の意味とは異なる機能です。実 際には、これら2つの機能が衝突することは、通常はありません。もし衝突 するようなら、以下で説明する、shy(内気)なグループ化を使うことができ ます。 ‘\(?: ... \)’ マッチした部分文字列を記録しない、“shy(内気)なグループ化”を指定しま す。マッチした部分文字列は、‘\D’により後方参照できません(以下参照 )。この機能は正規表現を機械的にまとめるときに役立ちます。これにより 後方参照するためのグループにたいする番号づけに影響することなく、文 法的な目的によるグループ化を行うことができます。 ‘\D’ D番目に‘\( ... \)’構成にマッチしたテキストと同じテキストにマッチし ます。これは“後方参照(back reference)”と呼ばれます。 最後の‘\( ... \)’構成の後で、マッチ処理はこの構成にマッチしたテキス トの最初と最後を記録します。そして正規表現の後の部分で‘\’の後に数字 Dを使うことにより、D番目の‘\( ... \)’構成にマッチしたテキストと同じ テキストにマッチさせることができます。 正規表現に記述された最初の9つの‘\( ... \)’にマッチしたテキストは、 正規表現で開きカッコが出現した順に、1から9までの数字が割り当てられ ます。そのため‘\1’から‘\9’を使うことにより、‘\( ... \)’構成にマッチ した、対応するテキストを参照することができます。 たとえば‘\(.*\)\1’は改行を含まない、前半と後半が同一の文字列にマッ チします。‘\(.*\)’は、そのテキストが何であろうと前半にマッチします が、‘\1’は前半と正確に同じテキストにマッチしなければなりません。 もし特定の‘\( ... \)’構成が1回以上マッチする場合(これは‘*’が後置さ れているとき簡単に発生します)、最後のマッチだけが記録されます。 ‘\`’ 空の文字列にマッチしますが、文字列またはバッファー(またはアクセスで きる部分)の先頭に限定されます。 ‘\'’ 空の文字列にマッチしますが、文字列またはバッファー(またはアクセスで きる部分)の最後に限定されます。 ‘\=’ 空の文字列にマッチしますが、ポイント位置に限定されます。 ‘\b’ 空の文字列にマッチしますが単語の先頭または最後に限定されます。した がって‘\bfoo\b’は、区切られた単語‘foo’にマッチします。 ‘\bballs?\b’は、別々の単語‘ball’または‘balls’にマッチします。 ‘\b’は、そこにどんなテキストが出現しようと、バッファーの先頭または 最後にもマッチします。 ‘\B’ 空の文字列にマッチしますが、単語の最初と最後_以外_にマッチします。 ‘\<’ 空の文字列にマッチしますが、単語の先頭に限定されます。‘\<’は単語の 構成文字が続く場合に限り、バッファーの先頭にマッチします。 ‘\>’ 空の文字列にマッチしますが、単語の最後に限定されます。‘\<’は内容が 単語の構成文字で終わる場合に限りバッファーの最後にマッチします。 ‘\w’ 任意の単語構成文字にマッチします。どの文字が該当するかは、構文テー ブル(syntax table)により決定されます。*note Syntax Tables: (elisp)Syntax Tables.を参照してください。 ‘\W’ 単語構成文字以外の任意の文字にマッチします。 ‘\_<’ 空の文字列にマッチしますが、シンボルの先頭に限られます。シンボルは 1文字以上のシンボル構成文字からなります。シンボル構成文字は、‘w’と ‘_’の構文をもつ文字です。‘\_<’はシンボル構成文字が続く場合に限り、 バッファーの先頭にもマッチします。単語にたいしては、構文テーブル (syntax table)が、どの文字がシンボル構成文字かを判断します。 ‘\_>’ 空の文字列にマッチしますが、シンボルの最後に限定されます。‘\_>’は内 容がシンボル構成文字で終わる場合に限り、バッファーの最後にマッチし ます。 ‘\sC’ 構文がCである、任意の文字にマッチします。ここでCとは、特定の構文ク ラスを表す文字です。したがって‘w’は単語構成文字、‘-’または‘ ’は空白 文字、‘.’は通常の区切り文字、などとなります。*note Syntax Tables: (elisp)Syntax Tables.を参照してください。 ‘\SC’ 構文がC以外の、任意の文字にマッチします。 ‘\cC’ カテゴリーCに属する、任意の文字にマッチします。たとえば‘\cc’は中国 文字、‘\cg’はギリシャ文字にマッチします。既知のカテゴリーについての 説明は、‘M-x describe-categories ’をタイプしてください。 ‘\CC’ カテゴリーCに_属さない_、任意の文字にマッチします。 単語と構文に関係する構成は構文テーブルのセッティングにより制御されま す。*Note Syntax Tables: (elisp)Syntax Tables. 15.8 正規表現の例 ================= 以下にregexpの例を示します。これはEmacsがセンテンスの最後(末尾の空白は含 まない)を認識するために、デフォルトで使用するregexp(たとえば変数 ‘sentence-end-base’)と似ています。 [.?!][]\"')}]* これには2つの連続する部分があります。1つは‘.’、‘?’、‘!’にマッチする文字 です。もう1つは閉じカッコ、クォート、カッコの0回以上の繰り返しです。 15.9 検索中のLaxマッチング ========================== あなたは通常、タイプした文字と、検索されるテキストの間にある、特定の瑣末 な違いを、検索コマンドが無視することを望むでしょう。たとえば長さが異なる 空白文字シーケンスは通常、等しいとみなされ、大文字小文字の違いは通常問題 にならない、などです。これは“等価文字(character equivalence)”として知ら れています。 このセクションではEmacsのlax search(緩い検索)機能と、それを必要に応じ て調整する方法について説明します。 デフォルトでは、検索コマンドは“lax space matching(緩いスペースマッチ ング)”を行います。これはスペースおよび一連のスペースは、テキスト中の1つ またはそれ以上の空白文字にマッチします(インクリメンタルregexp検索は別の デフォルトをもちます。*note Regexp Search::を参照してください)。したがっ て‘foo bar’は‘foo bar’、‘foo bar’、‘foo bar’、...にマッチします (‘foobar’にはマッチしません)。正確にいうと、Emacsは検索文字列中の一連の スペースを、変数‘search-whitespace-regexp’で指定された正規表現にマッチさ せます。たとえばスペースを一連の改行とスペースにマッチさせるには、変数に ‘"[[:space:]\n]+"’をセットします。この変数のデフォルト値は、そのバッファ ーのメジャーモードに依存します。ほとんどのメジャーモードは、スペース、タ ブ、フォームフィード文字を空白文字としてクラス化します。 空白文字を正確にマッチさせたい場合は、インクリメンタル検索中に‘M-s ’ (‘isearch-toggle-lax-whitespace’)とタイプすることにより、lax space matchingをオフに切り替えることができます。もう1度‘M-s ’とタイ プすると、lax space matchingふぁオンに切り替わります。すべての検索でlax space matchingを無効にするには、‘search-whitespace-regexp’を‘nil’に変更 します。これにより検索文字列の中のスペースは、正確に1つのスペースにマッ チするようになります。 Emacsでの検索では、検索文字列を小文字で指定した場合、デフォルトでは検 索するテキストの大文字小文字は区別されません。したがって‘foo’を検索する と、‘Foo’や‘fOO’もマッチします。regexp、特に文字集合でも同様に振る舞いま す。つまり‘[ab]’は、‘a’、‘A’、‘b’、‘B’もマッチします。この機能は“case folding”として知られており、これはインクリメンタル検索と非インクリメンタ ル検索の両方でサポートされています。 検索文字列のどこかに大文字があると、検索はcase-sensitive(大文字小文字 を区別する)になります。したがって‘Foo’を検索すると、‘foo’や‘FOO’は検索さ れません。これは正規表現検索でもリテラル文字列検索と同様に適用されます。 検索文字列から大文字を削除すると、効果はなくなります。変数 ‘search-upper-case’がこれを制御します。この変数が非‘nil’(デフォルト)の場 合、検索文字列の中の大文字は、検索をcase-sensitiveにします。これを ‘nil’にセットすることにより、大文字によるこの効果は無効になります。 変数‘case-fold-search’に‘nil’をセットすると、すべての文字は大文字小文 字を含めて、完全にマッチしなければなりません。これはバッファーごとの変数 で、変数の変更はデフォルト値を変えない限り、通常はカレントバッファーだけ が影響を受けます。*note Locals::を参照してください。これは置換コマンド (*note Replace::を参照してください)や、ミニバッファーのヒストリー検索 (*note Minibuffer History::を参照してください)を処理する、非インクリメン タル検索にも適用されます。 インクリメンタル検索で‘M-c’、または‘M-s c’ (‘isearch-toggle-case-fold’)とタイプすると、検索が大文字小文字を区別する かが、切り替わります。この効果は、現在の検索を超えて引き継がれませんが、 カレントの検索にたいして大文字を追加・削除したときの効果をオーバーライド します. 特定のコマンドや操作にたいする検索やマッチングにおいて、大文字小文字 の区別を制御する変数がいくつかあります。たとえば ‘tags-case-fold-search’は、‘find-tag’での大文字小文字の区別を制御します 。これらの変数を探すには、‘M-x apropos-variable case-fold-search ’とタイプしてください。 case foldingでは、文字の大文字小文字の違いを無視するので、大文字は小 文字にマッチし、その逆もマッチします。case foldingを一般化したものが “character folding”で、これは類似した文字間の違いの、より広いクラスを無 視します。たとえばcharacter foldingでは、文字‘a’は‘ä’や‘á’のようなアクセ ント付きの類似文字にもマッチし、これらの変種を区別するための特殊記号も無 視します。加えて‘a’は、‘a’に似ている他の文字や、U+249C PARENTHESIZED LATIN SMALL LETTER Aや、U+2100 ACCOUNT OF(これは小さい‘c’の上に小さい ‘a’があるような外観をもちます)のような、文字のグラフィカルな外観の一部に ‘a’をもつ文字にもマッチします。同様にASCIIのダブルクォート文字‘"’は、ダ ブルクォートの変種としてUnicode標準で定義されている、他のすべての変種に マッチします。最後に、character foldingにより、1つ以上の文字シーケンスは 違う長さの他の文字にもマッチするようになります。たとえば2つの文字‘ff’は 、U+FB00 LATIN SMALL LIGATURE FFにマッチします。文字シーケンスはまったく 同じではありませんが、character foldingでのマッチは“equivalent character sequences(等価文字シーケンス)”として知られています。 一般的にEmacsの検索コマンドは、デフォルトでは等価な文字シーケンスのマ ッチのためにcharacter foldingを行ないません。変数‘search-default-mode’を ‘char-fold-to-regexp’にカスタマイズすることにより、この振る舞いを有効に できます。*note Search Customizations::を参照してください。インクリメン タル検索では、‘M-s '’ (‘isearch-toggle-char-fold’)とタイプすることにより character foldingが切り替わりますが、これはその検索だけです(置換コマンド は別のオプションによる異なるデフォルトをもちます。*note Replacement and Lax Matches::を参照してください)。 case foldingと同様に、検索文字列の一部として明示的に‘ä’のような文字の 変種をタイプすることにより、その検索でのcharacter foldingが無効になりま す。検索文字列からそのような文字を削除すると、この効果はなくなります。 15.10 置換コマンド ================== Emacsは検索と置換を行うコマンドをいくつか提供します。単純な‘M-x replace-string’コマンドに加えて、出現する検索パターンごとに置換するかを 問い合わせる‘M-%’ (‘query-replace’)も提供します。 置換コマンドは通常、ポイント位置からバッファーの最後までのテキストに たいして処理を行います。リージョンがアクティブのときは、リージョンにたい して処理を行います(*note Mark::を参照してください)。基本的な置換コマンド は1つの“検索文字列”(またはregexp)を、1つの“置換文字列”で置き換えます。コ マンド‘expand-region-abbrevs’を使用して、複数の置換を並行して処理するこ とが可能です(*note Expanding Abbrevs::を参照してください)。 15.10.1 無条件の置換 -------------------- ‘M-x replace-string STRING NEWSTRING ’ すべてのSTRINGをNEWSTRINGで置換します。 ポイントの後にある‘foo’のすべてのインスタンスを‘bar’に置換するには、 コマンド‘M-x replace-string’に2つの引数‘foo’と‘bar’を指定します。置換は ポイントの後だけで発生するので、バッファー全体を置換したい場合は、最初に バッファーの先頭に移動しなければなりません。バッファーの最後までのすべて が置換されます。置換をバッファーの一部に制限したいときは、そのリージョン 部分をアクティブにします。リージョンがアクティブのときは、置換はそのリー ジョンに制限されます(*note Mark::を参照してください)。 ‘replace-string’が終了したとき、ポイントは最後に置換された位置に留ま ります。以前のポイント位置(‘replace-string’コマンドを実行した場所)はマー クリングに追加されるので(マークは非アクティブ)、‘C-u C-’で戻ること ができます。*note Mark Ring::を参照してください。 プレフィクス引数を指定すると、置換対象は単語単位に制限されます。 置換コマンドでのcase-sensitivity(大文字小文字の区別)とcharacter foldingについては、*note Replacement and Lax Matches::を参照してください 。 15.10.2 正規表現の置換 ---------------------- ‘M-x replace-string’コマンドは、正確にマッチする単一の文字列を置換します 。同様なコマンド‘M-x replace-regexp’は、指定した正規表現パターン(*note Regexps::を参照してください)にマッチするすべてを置換します。 ‘M-x replace-regexp REGEXP NEWSTRING ’ REGEXPにマッチするすべてをNEWSTRINGで置換します。 ‘replace-regexp’では、NEWSTRINGが定数である必要はありません。REGEXPに マッチした全体、または部分を参照することができます。NEWSTRINGでの‘\&’は 、置換されるマッチ全体を表します。NEWSTRINGでの‘\D’(Dは1から始まる数字 )は、REGEXP内でカッコでグループ化されたものの、D番目にマッチします(これ は“後方参照(back reference)と呼ばれます”)。‘\#’は、このコマンドですでに 置換された件数を10進数で参照します。最初の置換では‘\#’は‘0’で、2番目の置 換では‘1’、...のようになります。たとえば、 M-x replace-regexp c[ad]+r \&-safe これは‘cadr’を‘cadr-safe’に、‘cddr’を‘cddr-safe’に置き換えます。 M-x replace-regexp \(c[ad]+r\)-safe \1 これは逆向きの置換をします。置換するテキストに‘\’を含めるときは、‘\\’と 入力しなければなりません。 置換する文字列の一部を毎回手入力したいときは、置換文字列で‘\?’を使用 します。すると置換ごとにミニバッファーで置換文字列を編集できます(ポイン ト位置は‘\?’を記述した場所です。) このサブセクションの残りの部分は、Lispの知識が必要となる特別な処理を 念頭に書かれています。大半の読者はスキップしても構いません。 置換文字列の一部を計算するために、Lisp式を使うことができます。これを 行うには、置換文字列の中で、‘\,’に続けてLisp式を記述します。各置換におい て式の値が計算され、それをクォートされていない文字列に変換します(もし文 字列の場合は、その文字列の内容が使われることを意味します)。そしてそれを 置換文字列内で、式が記述された場所に使用します。もし式がシンボルのときは 、シンボル名と、置換文字列中のシンボル名の後にあるの間に1つスペースは、 両方シンボルの値に置換されます。 このような式の中では、いくつかの特別なシーケンスを使うことができます 。式の中での‘\&’や‘\D’は、通常のようにマッチした文字列全体と、部分マッチ した文字列を参照します。Dには複数桁の数字を記述でき、カッコでグループ化 されたD番目の正規表現がマッチしなかったとき、‘\D’は‘nil’になります。 ‘\#&’と‘\#D’を使って、それらのマッチを数字で参照することもできます(これ はマッチまたは部分マッチが数字書式の場合に有効です)。ここでの‘\#’も、す でに置換された数を意味します。 ‘x’と‘y’の入れ替えは、以下の方法で行うことができます: M-x replace-regexp \(x\)\|y \,(if \1 "y" "x") ‘\,’により置換する文字列を計算するには、‘format’関数が便利なときがあ ります(*note (elisp)Formatting Strings::を参照してください)。たとえば 73列目から80列目(もしそこに何もなければ)に、‘ABC00042’のような連番を振り たいときは、以下を使うことができます。 M-x replace-regexp ^.\{0,72\}$ \,(format "%-72sABC%05d" \& \#) 15.10.3 置換コマンドとLaxマッチ ------------------------------- このサブセクションではlaxマッチに関する置換コマンドの振る舞いと、それを カスタマイズする方法を説明します。一般的には、ほとんどの置換は、それと同 等な検索コマンドに比べて、デフォルトではより厳密なマッチを行ないます。 インクリメンタル検索とは異なり、置換コマンドはデフォルトではlax space matching(緩いスペースマッチング)を行いません(*note lax space matching: Lax Search.を参照してください)。置換でlax space matchingを有効にするには 、変数‘replace-lax-whitespace’を非‘nil’に変更してください(これはEmacsが 置換文字列ではなく、置換するテキストを検索する方法だけに影響を与えます )。 ‘query-replace-regexp’がパターンを検索するときlax whitespace matchingを使うかどうかを制御するのは、それに対応する変数 ‘replace-regexp-lax-whitespace’です。 置換コマンドの最初の引数がすべて小文字の場合、置換のための検索におい て大文字小文字の違いを無視します。これは‘case-fold-search’が非‘nil’の場 合です。‘case-fold-search’を‘nil’にセットすると、すべての検索において常 に大文字小文字の違いが有効になります。 さらにNEWSTRINGのすべて、または一部が小文字の場合、置換コマンドは大文 字小文字が出現するパターンを維持しようと試みます。したがって以下のコマン ド、 M-x replace-string foo bar は小文字の‘foo’を小文字の‘bar’で置換し、すべて大文字の‘FOO’を‘BAR’、そし て最初が大文字の‘Foo’を‘Bar’に置換します。(これら3つの候補、すなわち小文 字、すべて大文字、先頭が大文字は、‘replace-string’が認識できる唯一のパタ ーンです)。 置換文字列に大文字が使われている場合、テキストが挿入されるときは、常 に大文字のままとなります。大文字が最初の引数で使用されている場合、大文字 小文字の変換なしで、2番目の引数に与えられたとおりに置換されます。同様に ‘case-replace’と‘case-fold-search’の両方が‘nil’にセットされている場合、 大文字小文字の変換なしで置換されます。 デフォルトでは置換コマンドは、置換するテキストを探すとき、character folding(*note character folding: Lax Search.を参照してください)を使用し ません。‘query-replace’と‘replace-string’でのマッチングでcharacter foldingを有効にするには、変数‘replace-char-fold’に非‘nil’値をセットしま す(このセッティングは、Emacsが置換するテキストを探す方法だけに影響し、置 換するテキストには影響を与えません。また、‘replace-regexp’にも影響を与え ません)。 15.10.4 問い合わせつき置換 -------------------------- ‘M-% STRING NEWSTRING ’ 任意のSTRINGをNEWSTRINGで置換します。 ‘C-M-% REGEXP NEWSTRING ’ REGEXPにたいする任意のマッチをNEWSTRINGで置換します。 ‘foo’を‘bar’に置換するとき、すべてではなく、そのうちのいくつかだけを 置換したいときは、‘M-%’ (‘query-replace’)を使います。このコマンドは ‘foo’を1つずつ検索して、それを置換するかを毎回尋ねます。この問い合わせを 別とすれば、‘query-replace’は‘replace-string’と同様に機能します(*note Unconditional Replace::を参照してください)。通常のように、 ‘case-replace’が非‘nil’のときは、大文字小文字を区別します(*note Replacement and Lax Matches::を参照してください)。数引数を指定すると、単 語区切り文字で区切られた単語だけを考慮します。負のプレフィクス引数は後方 に置換します。 ‘C-M-%’ (‘query-replace-regexp’)は、regexpの検索と置換を行います。こ れは‘query-replace’のように問い合わせを行う以外は、‘replace-regexp’と同 様に機能します。 これらのコマンドで行なった以前の置換を再利用できます。 ‘query-replace’や‘query-replace-regexp’が検索文字列の入力を求めるプロン プトを表示しているとき、‘M-p’と‘M-n’を使用することにより、‘FROM -> TO’と いう形式で、以前の置換を表示できます。ここでFROMは検索パターン、TOはそれ の置換、これらの間に表示されるセパレータは変数 ‘query-replace-from-to-separator’の値により決定されます。望む置換が表示 されたら、とタイプしてそれを選択します。この変数の値が‘nil’の場合、 置換はコマンドヒストリーに追加されず、再利用できません。 これらのコマンドは、カレントのマッチを、フェイス‘query-replace’を使っ てハイライトします。変数‘query-replace-highlight’を‘nil’にセットすること により、このハイライトを無効にできます。他のマッチのハイライトにはインク リメンタル検索(*note Incremental Search::を参照してください)と同様に、フ ェイス‘lazy-highlight’が使われます。変数‘query-replace-lazy-highlight’を ‘nil’にセットすることにより、このハイライトを無効にできます。デフォルト では‘query-replace-regexp’は、カレントマッチを置換する展開後の文字列を、 ミニバッファーに表示します。特別なシーケンス‘\&’および‘\N’を展開せずに維 持するには、‘query-replace-show-replacement’変数をカスタマイズしてくださ い。 変数‘query-replace-skip-read-only’に非‘nil’がセットされている場合、置 換コマンドはread-only(読み取り専用)のテキスト内のマッチを無視します。デ フォルトでは、それらを無視しません。 以下は文字列またはregexpにたいするマッチが表示されているときにタイプ できる文字です: ‘’ ‘y’ マッチをNEWSTRINGで置き換えます。 ‘’ ‘’ ‘’ ‘n’ カレントマッチを置換せずに次のマッチへスキップします。 ‘, (カンマ)’ カレントマッチを置換して、結果を表示します。そして次に何をするかを 文字入力するよう促します。置換がすでに行われているので、この状況で はは等価で、どちらも次のマッチへ移動します。 ここで‘C-r’(以下を参照)をタイプして、置換されたテキストを編集できま す。‘C-x u’をタイプして、置換を取り消すこともできます。これは ‘query-replace’を終了させるので、さらに置換を行う場合は、‘C-x ’で置換を再開しなければなりません(*note Repetition::を参 照してください)。 ‘’ ‘q’ これ以上の置換を行わずに終了します。 ‘. (ピリオド)’ カレントマッチを置換してから、これ以上の検索を行わずに終了します。 ‘!’ これ以上の問い合わせをせずに、残りのマッチをすべて置換します。 ‘^’ 前のマッチの位置に戻ります。これは間違えて変更したときや、再検証し たい場合に使います。 ‘u’ 最後の置換をアンドゥ(undo: 取り消し)して、その置換が行われた位置に 戻ります。 ‘U’ すべての置換をアンドゥして、最初の置換が行われた位置に戻ります。 ‘C-r’ 再帰編集レベル(recursive editing level)に入ります。これはマッチを NEWSTRINGで置換するだけでなく、編集したい場合に使用します。編集を終 えたら‘C-M-c’で再帰編集レベルを抜けて、次のマッチを処理します。 *note Recursive Edit::を参照してください。 ‘C-w’ マッチを削除してから、‘C-r’と同様に再帰編集レベルに入ります。これは STRINGを削除してから、テキストを挿入することにより置換を行う場合に 使用します。編集を終えたら‘C-M-c’で再帰編集レベルを抜けて、次のマッ チを処理します。 ‘e’ 置換文字列をミニバッファーで編集します。でミニバッファーを抜け ると、カレントマッチをミニバッファーの内容で置換します。この新しい 置換文字列は、残りのマッチにたいしても適用されます。 ‘C-l’ スクリーンを再描画します。その後でカレントマッチにたいして何を行う か、別の文字をタイプして指定しなければなりません。 ‘Y (大文字)’ 複数バッファーの置換で、残りのバッファーの、残りのマッチをすべて置 換します(これは選択したファイルにたいして問い合わせつきの置換を行う 、Diredの‘Q’コマンドと似ています)。これはすべての一連の問い合わせに たいして、これ以上のユーザーとの対話なしに“yes”を答えます。 ‘N (大文字)’ 複数バッファーの置換で、カレントバッファーの残りのマッチを置換せず に、次のバッファーへスキップします。これはカレントバッファーのマッ チにたいする問い合わせに“no”を答えて、次のバッファーへと処理を続け ます。 ‘C-h’ ‘?’ ‘’ 上述したオプションの要約を表示します。その後でカレントマッチにたい して何を行うか、別の文字をタイプして指定しなければなりません。 これらのエイリアス文字以外の文字は、‘query-replace’を終了してから、キ ーシーケンスの残りの部分を読みとります。したがって‘C-k’とタイプすると、 ‘query-replace’を終了してから、行末までをkillします。特に、‘C-g’は単に ‘query-replace’をexitします。 一度終了した‘query-replace’を再開するには、‘C-x ’を使いま す。‘query-replace’は引数の読み取りにミニバッファーを使っているので、こ のキーシーケンスで再開させることができます。*note C-x : Repetition.を参照してください。 オプション‘search-invisible’は、‘query-replace’が非表示のテキストを扱 う方法を決定します。*note Outline Search::を参照してください。 選択されたファイルにたいして問い合わせつきの置換を行う、Diredの‘Q’コ マンドについては、*note Operating on Files::を参照してください。regexpに マッチするファイル名にたいして、ファイル名の変更、ファイルのコピー、ファ イルのリンクを行うDiredのコマンドについては、*note Transforming File Names::を参照してください。 15.11 その他の検索およびループコマンド ====================================== ここでは正規表現にたいするマッチを検索する、その他のコマンドを説明します 。これらのコマンドは、パターンに大文字が含まれていないカ、 ‘case-fold-search’が非‘nil’のときは、マッチングで大文字小文字を区別しま せん。常にバッファー全体を検索する‘multi-occur’と ‘multi-occur-in-matching-buffers’をのぞき、これらはすべて、ポイント位置 からバッファーの最後まで、リージョンがアクティブなときはそのリージョンに たいして処理を行います。 ‘M-x multi-isearch-buffers’ 1つ以上のバッファー名の入力を求め(で終了)、それらのバッファー にたいして複数バッファーのインクリメンタル検索を開始します(あるバッ ファーでの検索に失敗すると、次の‘C-s’により、指定された次のバッファ ーへと検索を試みます)。プレフィクス引数を指定すると、regexpの入力を 求め、regexpにマッチするバッファーにたいして、複数バッファーでのイ ンクリメンタル検索を開始します。 ‘M-x multi-isearch-buffers-regexp’ このコマンドは‘multi-isearch-buffers’と同様ですが、インクリメンタル なregexp検索を行います。 ‘M-x multi-isearch-files’ 1つ以上のファイル名の入力を求め(で終了)、それらのファイルにた いして複数ファイルのインクリメンタル検索を開始します(あるファイルで 検索に失敗すると、次の‘C-s’により、指定された次のファイルへと検索を 試みます)。プレフィクス引数を指定すると、regexpの入力を求め、 regexpにマッチするファイルにたいして、複数ファイルでのインクリメン タル検索を開始します。 ‘M-x multi-isearch-files-regexp’ このコマンドは‘multi-isearch-files’と同様ですが、インクリメンタルな regexp検索を行います。 バッファーローカルな変数‘multi-isearch-next-buffer-function’をセッ トするいくつかのモード(たとえばChange Logモード)では、複数ファイル にたいするインクリメンタル検索は自動的にアクティブになります。 ‘M-x occur’ ‘M-s o’ regexpの入力を求め、それへのマッチを含むバッファー内の各行をリスト 表示します。プロンプトで‘M-n’をタイプした場合は、前のインクリメンタ ル検索から検索文字列を再利用できます。マッチするテキストは、 ‘match’フェイスを使用してハイライトされます。数引数Nを指定すると、 そのコンテキストでマッチした各行の、前後N行を表示します。 コンテキスト行のデフォルト行数は、変数 ‘list-matching-lines-default-context-lines’により指定されます。 ‘list-matching-lines-jump-to-current-line’が非‘nil’のとき、カレント 行はフェイス‘list-matching-lines-current-line-face’でハイライト表示 され、ポイントはその行の最初のマッチの後にセットされます。 インクリメンタル検索がアクティブのときは‘M-s o’を実行して、カレント のサーチリングを使うこともできます。 あなたがタイプしたregexpにたいするマッチは完全な行を含むように拡張 され、1つ前のマッチの終了の前から開始するマッチは考慮されないことに 注意してください。 ‘*Occur*’バッファーでは、エントリーをクリックするか、ポイントをそこ に移動してをタイプすることにより、検索されたバッファーの対応す る位置をvisitします。‘o’と‘C-o’はマッチを他のウィンドウに表示します (‘C-o’はそのウィンドウを選択しません)。かわりに‘C-x `’ (‘next-error’)コマンドを使うことにより、マッチした場所を1つ1つ visitできます(*note Compilation Mode::を参照してください)。 ‘*Occur*’バッファーで‘e’をタイプすることにより、Occur Editモードに 切り替えます。このモードではエントリーにたいする編集結果が、元のバ ッファーのテキストに適用されます。‘C-c C-c’とタイプすることにより、 Occurモードに戻ります。 コマンド‘M-x list-matching-lines’は、‘M-x occur’の別名です。 ‘M-x multi-occur’ このコマンドは‘occur’と同じですが、複数のバッファーを検索する点が異 なります。このコマンドは、1つずつバッファー名の入力を求めます。 ‘M-x multi-occur-in-matching-buffers’ このコマンドは‘multi-occur’と似ていますが、visitしているファイル名 にマッチする正規表現を指定することにより、検索するバッファーを指定 する点が異なります。プレフィクス引数を指定すると、正規表現にマッチ するバッファー名となります。 ‘M-x how-many’ regexpの入力を求め、バッファーのポイント位置以降に、何個のマッチが あるか表示します。リージョンがアクティブのときは、リージョンにたい して操作を行います。 ‘M-x flush-lines’ regexpの入力を求め、ポイント以降にあるテキストにたいして、マッチが 含まれている行を削除します。カレント行のポイント以降にマッチする文 字列が含まれているときは、カレント行を削除します。リージョンがアク ティブのときは、リージョンにたいして操作を行います。行の一部ににリ ージョンが含まれていて、さらにマッチの全体がリージョンに含まれてい るとき、その行は削除されます。 マッチが行をまたいでいる場合、‘flush-lines’はそれらの行すべてを削除 します。このコマンドは行を削除してから、次のマッチを検索します。し たがって、1行にマッチ全体と、次の行にまたがるマッチが両方含まれると き、次の行にまたがるマッチは無視されます。 ‘M-x keep-lines’ regexpの入力を求め、ポイント以降にあるテキストにたいして、マッチを _含まない_行を削除します。ポイントが行の先頭でない場合、このコマン ドは常にカレント行を維持します。リージョンがアクティブのときは、リ ージョンにたいして操作を行います。このコマンドは一部がリージョンに 含まれるだけの行は削除しません(行を終端する改行は、その行の一部と判 断します)。 マッチが行をまたぐ場合、このコマンドはそれらすべての行を維持します 。 15.12 必要に応じて検索を調整する ================================ このセクションでは、他では説明されていない、その他の検索に関連した機能を 説明します。 インクリメンタル検索にたいするデフォルトの検索モードは、変数 ‘search-default-mode’により指定されます。この変数には、‘nil’、‘t’、また は関数を指定できます。‘nil’の場合、デフォルトのモードはcharacter foldingなしのリテラル検索です。しかし、case foldingにたいしては ‘case-fold-search’、lax-whitespace matchにたいしては ‘search-whitespace-regexp’により決定されます(*note Lax Search::を参照し てください)。値が‘t’の場合、インクリメンタル検索のデフォルトはregexp検索 になります。デフォルト値には、case foldingとlax-whitespace matchingだけ を行なう関数が指定されています。 継続的なインクリメンタル検索でのカレントマッチは、‘isearch’フェイスで ハイライトされます。変数‘search-highlight’を‘nil’にセットすることにより 、このハイライトを無効にできます。 ディスプレーに表示されている、検索文字列にたいするその他のマッチは、 ‘lazy-highlight’フェイスを使用してハイライトされます。変数 ‘isearch-lazy-highlight’をセットして、このハイライトを無効にできます。以 下はlazy-highlightをカスタマイズする、その他の変数です: ‘lazy-highlight-initial-delay’ 表示されているマッチをハイライトするまでwaitする秒数です。 ‘lazy-highlight-interval’ マッチをハイライトする秒数です。 ‘lazy-highlight-max-at-a-time’ 入力をチェックする前にハイライトする、マッチの最大数です。大きな数 を指定するとハイライトに時間を要するかもしれず、その間に検索を継続 するために‘C-s’や‘C-r’をタイプしても、それらすべてのマッチのハイラ イトを終了するまで、Emacsは反応しないでしょう。したがって小さな数を 指定することにより、Emacsの反応を改善できます。 インクリメンタル検索で検索文字列が空のときにを入力すると、通常こ れは非インクリメンタル検索を開始します(実際には、これにより検索文字列の 編集が開始され、次ので検索を行ないます)。しかし、変数 ‘search-nonincremental-instead’を‘nil’にセットした場合、検索文字列が空で も、のタイプは常にインクリメンタル検索をexitします。 デフォルトではインクリメンタル検索および問い合わせ付き置換コマンドは 不可視のテキストにもマッチしますが、そのようなマッチは隠され、不可視のテ キストの外にできるだけ早くカレントマッチを移動させます。変数 ‘isearch-hide-immediately’を‘nil’にカスタマイズした場合、マッチが見つか った任意の不可視テキストは、検索または置換コマンドがexitするまで表示され 続けます。 遅い回線で接続されたリモートマシンのディスプレーなど、遅い端末でイン クリメンタルな検索をすると、検索によりディスプレーの大きな範囲を再描画し なければならないことが、煩わしくなるかもしれません。Emacsは、遅い端末に たいして特別なディスプレーモードを提供します。これは検索が別の小さなウィ ンドウをポップアップして、マッチの周辺テキストをそのウィンドウに表示しま す。小さいウィンドウは早く表示できるので、遅いスピードの影響による煩わし さは軽減されます。変数‘search-slow-speed’は、Emacsがこのディスプレーモー ドを使用する、ボーレートの下限値を決定します。変数 ‘search-slow-window-lines’は、Emacsがポップアップして検索結果を表示する ウィンドウの行数を制御します(デフォルトは1)。このウィンドウは通常、検索 を開始したバッファーを表示するウィンドウの下部にポップアップされますが、 ‘search-slow-window-lines’の値が負の場合、ウィンドウは上部に配され、 ‘search-slow-window-lines’の絶対値が表示される行数になります。 16 タイプミスを訂正するコマンド ******************************* このチャプターでは、編集中に間違いに気付いたときに便利なコマンドを説明し ます。これらのコマンドの中でもっとも基本的なのは、undoコマンド‘C-/’です (これは‘C-x u’と‘C-_’にもバインドされています)。これは1つのコマンドやコ マンドの一部(‘query-replace’の場合など)、または連続するいくつかの文字の 挿入を取り消します。連続して‘C-/’を繰り返すと、前へ前へと変更を取り消し 、undo情報が利用できる限界までさかのぼって、変更を取り消します。 ここで説明するコマンドとは別に、 (‘delete-backward-char’)のよう な削除コマンドでもテキストを消去できます。これらのコマンドは、このマニュ アルの前のチャプターで説明しています。*note Erasing::を参照してください 。 16.1 Undo(取り消し) =================== “undo(取り消し)”コマンドは、バッファーのテキストにたいする最後の変更を無 効にします。バッファーはそれぞれ変更を個別に記録しており、undoコマンドは 常にカレントバッファーに適用されます。バッファーのレコードにより、バッフ ァーにたいするすべての変更をundoできます。通常、個々の変種コマンドは、 undoレコードに個別のエントリーを作成しますが、‘query-replace’のようない くつかのコマンドは、undo操作に柔軟性をもたせるために、コマンドによる変更 を複数のエントリーに分割します。連続した文字の挿入コマンドは、undo操作の 冗長性をなくすために、通常1つのundoレコードにまとめられます。 ‘C-/’ ‘C-x u’ ‘C-_’ カレントバッファーのundoレコードの、1エントリーでundoします (‘undo’)。 undoを開始するには、‘C-/’(またはエイリアスの‘C-_’か‘C-x u’)をタイプし ます(1)。これは一番最近のバッファーにたいする変更を取り消して、バッファ ーが変更される前の位置にポイントを戻します。連続して‘C-/’(またはそれのエ イリアス)を繰り返すと、現在のバッファーにたいする変更を、前へ前へとさか のぼって取り消します。すでに記録されている変更がすべて取り消されていると き、undoコマンドはエラーをシグナルします。 undo以外のコマンドは、undoコマンドの順序性を損ないます。undo以外のコ マンドを開始した時点から、undoしてきた一連のundoコマンド全体が、undoレコ ードとして記録されます。したがってundoした変更を再適用するには、undoの順 序性を損なわないような‘C-f’のようなコマンドをタイプしてから、‘C-/’を1回 以上タイプして、undoコマンドをundoしていきます。 以前のundoコマンドを再実行せずにundoを再開したいときは、かわりに‘M-x undo-only’を使います。これは‘undo’と同様ですが、すでにundoした変更を再実 行しません。 バッファーをうっかり変更してしまったのに気付いたら、モードラインのア スタリスクが表示されなくなるまで‘C-/’を繰り返しタイプするのが、もっとも 簡単な復旧方法です。undoコマンドによりモードラインのアスタリスクが消えた とき、それはバッファーの内容がファイルを最後に読み込んだとき、または保存 したときと同じ内容だということを意味します。バッファーを意図して変更した か覚えていないときは、‘C-/’を1回タイプします。最後の変更がundoされたのを 確認して、それが意図した変更なのか確かめます。もしそれが意図しない変更だ ったならundoしたままにします。意図した変更だった場合、上で説明した方法で 変更を再実行します。 かわりに‘M-x revert-buffer’を使用して、そのバッファーが最後にvisitさ れたとき、または最後に保存されたとき以降のすべての変更を破棄できます (*note Reverting::を参照)。 アクティブなリージョンがあるとき、‘undo’は“選択的なundo(selective undo)”を行います。これはバッファー全体ではなく、リージョンにたいして一番 最近の変更をundoします。しかしTransient Markモードがオフのとき(*note Disabled Transient Mark::を参照してください)、‘C-/’は、リージョンではな く、常にバッファー全体を操作します。この場合‘undo’コマンドにプレフィクス 引数を指定(‘C-u C-/’)することにより、選択的なundoができます。同じリージ ョンにたいしてさらに変更をundoしたいときは、‘undo’コマンドを繰り返します (プレフィクス引数は必要ありません)。 undoレコードを作らない、特別なバッファーがいくつかあります。それは名 前がスペースで始まるバッファーです。これらのバッファーはEmacsにより内部 的に使用されており、通常ユーザーが閲覧したり編集しないテキストを保持しま す。 バッファーにたいするundo情報が大きくなりすぎたとき、Emacsは一番古いレ コードを、時々(“ガベージコレクション(garbage collection)の間”)廃棄します 。変数‘undo-limit’、‘undo-strong-limit’、‘undo-outer-limit’をセットする ことにより、どれだけのundo情報を保持するか指定することができます。これら の値はバイト数で指定します。 変数‘undo-limit’は、ソフトリミットをセットします。Emacsはこのサイズに 達するまでのコマンドのundoデータを保持します。制限を超えることもあり得ま すが、これを超える古いデータは保持しません。デフォルト値は80000です。変 数‘undo-strong-limit’は、厳密なリミット(stricter limit)をセットします。 この制限を超えるような以前のコマンド(一番最近のコマンドではない)は記憶さ れません。‘undo-strong-limit’のデフォルト値は120000です。 これらの変数の値にかかわらず、一番最近の変更はundo情報が ‘undo-outer-limit’(通常は12,000,000)より大きくならない限り、廃棄されるこ とはありません。もしこれを超えるような場合、Emacsはundoデータを廃棄して 、それにたいする警告を発します。これは一番最近のコマンドをundoできない唯 一の状況です。これが発生した場合、将来同じことが起こらないように ‘undo-outer-limit’の値を増やすことができます。しかしコマンドがそのような 大きなundoデータを作るとは考えられない場合、それは多分バグなので、それを 報告すべきです。*note Reporting Bugs: Bugs.を参照してください。 ---------- Footnotes ---------- (1) ‘C-/’以外に、‘undo’コマンドは‘C-x u’にもバインドされています。な ぜならこれは初心者が記憶するのが簡単だからです。‘u’は“undo”に由来してい ます。このコマンドは‘C-_’にもバインドされています。なぜならいくつかのテ キスト端末では、‘C-/’とタイプすることにより、‘C-_’が入力されるからです。 16.2 テキストの入れ替え ======================= ‘C-t’ 2つの文字を入れ替えます(‘transpose-chars’)。 ‘M-t’ 2つの単語を入れ替えます(‘transpose-words’)。 ‘C-M-t’ バランスのとれた2つの式を入れ替えます(‘transpose-sexps’)。 ‘C-x C-t’ 2つの行を入れ替えます(‘transpose-lines’)。 2つの文字を入れ違いに入力してしまう間違いはよくありますが、それらが隣 接しているときは‘C-t’(‘transpose-chars’)コマンドで訂正できます。通常 ‘C-t’はポイントの左右にある文字を入れ替えます。行末でこのコマンドを使う 場合、最後の文字と改行を入れ替えるのはおそらく無意味なので、‘C-t’は行末 の2文字を入れ替えます。このような入れ違いミスにすぐ気付いたときは、 ‘C-t’だけで訂正できます。すぐに間違いに気付かなかった場合、‘C-t’をタイプ する前に、入れ替えて入力してしまった文字の間にカーソルを移動しなければな りません。単語の最後の文字とスペースを入れ替えて入力してしまった場合、そ こに戻るには単語移動コマンド(‘M-f’、‘M-b’など)が良い方法です。それ以外で は、逆向きの検索(‘C-r’)が最善な方法の場合があります。*note Search::を参 照してください。 ‘M-t’は、ポイントの前にある単語と、後にある単語を入れ替えます (‘transpose-words’)。このコマンドはポイントより後方、またはポイントがあ る単語を前方に移動して、ポイントをその後に移動します。文字の間にある区切 り文字は移動しません。たとえば‘FOO, BAR’は、‘BAR FOO,’ではなく、 ‘BAR, FOO’に入れ替わります。 ‘C-M-t’ (‘transpose-sexps’)も似ていますが、これは2つの式(*note Expressions::を参照してください)を入れ替えます。そして‘C-x C-t’ (‘transpose-lines’)は、行を入れ替えます。これらは‘M-t’と同様に動作します が、入れ替えを行うテキスト単位が異なります。 入れ替えコマンドに数引数を指定すると、反復回数になります。これは入れ 替えコマンドに、ポイントより前(またはポイントがある)の移動させる文字(ま たは単語、式、行)を、何文字(または単語、式、行)後に移動させるか指示しま す。たとえば‘C-u 3 C-t’は、ポイントの前にある文字を3文字後ろに移動します 。つまり‘f★oobar’は‘oobf★ar’に変更されます。これは‘C-t’を3回繰り返したの と同じです‘C-u - 4 M-t’はポイントの前にある単語を、後方に単語4つ分移動し ます。‘C-u - C-M-t’は、引数を指定しない‘C-M-t’の効果を取り消します。 数引数0には特別な意味が割り当てられています(繰り返し回数としては、0に 意味がありません)。これはポイントの後ろで終わる文字(または単語、式、行 )を、マーク位置で終わる文字(または単語、式、行)と入れ替えます。 16.3 大文字小文字の変換 ======================= ‘M-- M-l’ 最後に入力した単語を小文字に変換します。‘Meta--’はメタとマイナスで あることに注意して下さい。 ‘M-- M-u’ 最後に入力した単語をすべて大文字に変換します。 ‘M-- M-c’ 最後に入力した単語の先頭を大文字、それ以外を小文字に変換します。 単語の大文字小文字を間違えてタイプするのは、とても一般的な間違えです 。そのため、単語の大文字小文字の変換コマンド‘M-l’、‘M-u’、‘M-c’に負の数 引数を指定すると、カーソルを移動しないという特性があります。最後に入力し た単語のタイプミスに気付いたら、単に大文字小文字を変換して、タイプを続け ることができます。*note Case::を参照してください。 16.4 スペルのチェックと訂正 =========================== このセクションでは、1つの単語、またはバッファーの一部のスペルをチェック するコマンドを説明します。これらのコマンドはHunspell、Aspell、Ispell、ま たはEnchantのうちのいずれかのスペルチェッカープログラムがインストールさ れている場合だけ機能します。これらのプログラムはEmacsの一部ではありませ んが、GNU/Linuxまたは他のフリーなオペレーティングシステムには、通常1つは インストールされています。 *note Aspell: (aspell)Top.を参照してください 。 ‘M-$’ ポイントがある単語スペルの、チェックと訂正をします(‘ispell-word’)。 リージョンがアクティブのときは、リージョンに含まれるすべての単語に たいして行います。 ‘M-x ispell’ バッファーにある単語スペルの、チェックと訂正をします。リージョンが アクティブのときは、リージョンに含まれるすべての単語にたいして行い ます。 ‘M-x ispell-buffer’ バッファーにある単語スペルの、チェックと訂正をします。 ‘M-x ispell-region’ リージョンにある単語スペルの、チェックと訂正をします。 ‘M-x ispell-message’ メールメッセージのドラフト(引用部分を除く)にたいして、単語スペルの チェックと訂正をします。 ‘M-x ispell-change-dictionary DICT ’ スペルチェッカーのプロセスを再起動して、DICTを辞書として使用させま す。 ‘M-x ispell-kill-ispell’ スペルチェッカーのサブプロセスをkillします。 ‘M-’ ‘ ’ ‘C-M-i’ ポイントの前にある単語を、スペル辞書をもとに補完します (‘ispell-complete-word’)。 ‘M-x flyspell-mode’ スペルミスした単語をハイライトする、Flyspellモードを有効にします。 ‘M-x flyspell-prog-mode’ コメントと文字列にたいして、Flyspellモードを有効にします。 ポイントの前または周囲にある単語スペルをチェックしたり訂正するには、 ‘M-$’ (‘ispell-word’)をタイプします。リージョンがアクティブのときは、リ ージョン内のすべての単語スペルをチェックします。*note Mark::を参照してく ださい(Transient Markモードがオフのとき、‘M-$’はリージョンを無視して、常 にポイントの前または周囲の単語にたいして動作します。*note Disabled Transient Mark::を参照してください)。 同様に、コマンド‘M-x ispell’はリージョンがアクティブのときはリージョ ン、それ以外のときはバッファー全体にたいして、スペルチェックを行います。 コマンド‘M-x ispell-buffer’および‘M-x ispell-region’は、スペルチェックを バッファー全体にたいして行うのか、リージョンにたいして行うかを明示します 。このコマンドはバッファー全体をチェックしますが、インデントされているテ キストと、以前のメッセージの引用と思われるテキストはチェックしません。 *note Sending Mail::を参照してください。 これらのコマンドは、正しくないと思われる単語に出会うと、それをどうす るかを尋ねます。通常は番号が振られた“近い単語(near-misses: 正しくないと 思われる単語に似た単語)”のリストを表示します。これにたいして1文字をタイ プして応答しなければなりません。以下は有効な応答文字です。 ‘数字’ 今回だけは近い単語の一覧で単語を置き換えます。近い単語には番号が振 られており、選択するにはその番号をタイプします。 ‘’ その単語を間違いと判断することは変更しませんが、その単語をここでは 変更せずスキップします。 ‘r NEW ’ 今回は単語をNEWで置き換えます(置換文字列にスペルエラーがないか再ス キャンされます)。 ‘R NEW ’ 単語をNEWで置き換え、‘query-replace’を実行します。これによりバッフ ァーの他の箇所の間違えを置換できます(置換にスペルエラーがないか再ス キャンされます)。 ‘a’ 正しくないと思われる単語を正しいものとして受け入れますが、それは今 回の編集セッションに限られます。 ‘A’ 正しくないと思われる単語を正しいものとして受け入れますが、それは今 回の編集セッションとそのバッファーに限られます。 ‘i’ この単語をプライベートな辞書ファイルに挿入するので、今後(将来のセッ ションを含めて)はその単語を正しいと認識します。 ‘m’ ‘i’と同様ですが、辞書の補完情報も指定できます。 ‘u’ この単語の小文字バージョンを、プライベートな辞書ファイルに挿入しま す。 ‘l WORD ’ WORDにマッチする単語を辞書から探します。これらの単語は近い単語の新 しいリストになるので、置換で数字をタイプして選択できるようになりま す。WORDにはワイルドカードとして‘*’を使うことができます。 ‘C-g’ ‘X’ 対話的なスペルチェックを終了します(ポイントはチェックされた単語の位 置に残されます)。‘C-u M-$’でチェックを再開できます。 ‘x’ 対話的なスペルチェックを終了します(ポイントはチェックを開始したとき の位置に戻ります)。 ‘q’ 対話的なスペルチェックを終了して、スペルチェッカーのサブプロセスを killします。 ‘?’ オプションの一覧を表示します。 Textモードおよびそれに関連するモードでは、‘M-’ (‘ispell-complete-word’)で、スペル訂正にもとづくバッファー内補完を行いま す。単語の最初の部分を入力してから‘M-’をタイプすると、補完一覧が表 示されます(ウィンドウマネージャーが‘M-’を横取りしてしまう場合は、 ‘ ’または‘C-M-i’をタイプします)。補完対象には番号か文字が振ら れているので、その番号か文字をタイプして選択します。 1度プロセスが開始されれば、スペルチェッカーのサブプロセスは待機状態で 実行を続けるので、一連のスペルチェックコマンドは素早く完了します。プロセ スを終了させたいときは‘M-x ispell-kill-ispell’を使います。スペルの訂正を 行うとき以外プロセスがCPU時間を使うことはないので、これは通常必要ありま せん。 スペルチェッカーは、スペルを2つの辞書から探します。それは標準辞書と個 人用辞書です。標準辞書は変数‘ispell-local-dictionary’で指定されます。こ れが‘nil’のときは、変数‘ispell-dictionary’で指定されます。両方が‘nil’の とき、スペルプログラムは既定の辞書を使います。コマンド‘M-x ispell-change-dictionary’は、バッファーにたいする標準辞書をセットしてか らサブプロセスを再起動することにより、これにより異なる標準辞書を使うこと ができます。個人用の辞書は、変数‘ispell-personal-dictionary’で指定します 。これが‘nil’のとき、スペルプログラムは個人辞書を、各スペルチェッカーが 指定する既定の場所から探します。 単語の補完には別の辞書が使われます。変数‘ispell-complete-word-dict’は 、この辞書のファイル名を指定します。補完辞書は、単語の変化形を検知するた めにスペルチェックが使用する、単語にたいするroot語(接辞を含まない語)と affix語(接辞語)に関する情報を使用できないので、、別の辞書でなければなり ません。補完辞書はもたないが、スペルチェック辞書はあもつ言語もいくつかあ ります。 Flyspellモードは、タイプしたテキストのスペルをタイプ時に自動的にチェ ックするマイナーモードです。認識できない単語を見つけると、その単語をハイ ライトします。‘M-x flyspell-mode’とタイプすると、カレントバッファーの Flyspellモードを切り替えます。すべてのTextバッファーでFlyspellモードを有 効にするには、‘text-mode-hook’に、‘flyspell-mode’を追加します。*note Hooks::を参照してください。Flyspellモードは、ユーザーの移動にしたがって 各単語をチェックする必要があるので、カーソル移動やスクロールコマンドによ り速度低下するかもしれないことに注意してください。タイプしていないテキス トや移動と関係ないテキストの自動チェックも行いません。それを行うためには 、‘flyspell-region’や‘flyspell-buffer’を使用してください。 Flyspellモードが間違ったスペルの単語をハイライトしているとき、それを ‘mouse-2’ (‘flyspell-correct-word’)でクリックして、可能な定性とアクショ ンを表示するメニューを表示できます。加えて‘C-.’、または‘-’ (‘flyspell-auto-correct-word’)はポイント位置の単語にたいする可能な訂正を 提案し、‘C-c $’ (‘flyspell-correct-word-before-point’)は可能な訂正のメニ ューをポップアップします。もちろん、間違ったスペルの単語を、常にお好みの 方法で手修正できます。 Flyspell Progモードは通常のFlyspellモードと同じように機能しますが、コ メントと文字列に含まれた単語だけをチェックします。この機能はプログラムを 編集する場合に便利です。‘M-x flyspell-prog-mode’をタイプして、現在のバッ ファーにたいするこのモードの有効と無効を切り替えます。すべてのプログラミ ングに関連したモードでこのモードを有効にするには、‘prog-mode-hook’に ‘flyspell-prog-mode’を追加します(*note Hooks::を参照してください)。 17 キーボードマクロ ******************* このチャプターでは一連の編集コマンドを記録して、後で簡単に繰り返す方法を 説明します。 “キーボードマクロ(keyboard macro)”とは、Emacsのユーザーにより定義され る、一連のキー入力からなるコマンドです。たとえば‘C-n M-d C-d’を40回繰り 返しタイプしていることに気付いたとしましょう。‘C-n M-d C-d’を行うキーボ ードマクロを定義して、それを39回以上繰り返すことにより、作業スピードをあ げることができます。 キーボードマクロは、コマンドを実行・記録することにより定義します。違 う言い方をすると、キーボードマクロの定義では、初回はマクロの定義が実行さ れるということです。この方法により、頭だけで考えるのではなく、コマンドの 影響を目で見ることができます。コマンド列の入力を終了して定義を終了すると きは、キーボードマクロが定義されるとともに、入力したコマンド列の影響とし てマクロが1回実行されたことになります。その後はマクロを呼び出すことによ り、コマンド列全体を実行することができます。 キーボードマクロは、LispではなくEmacsコマンド言語(Emacs command language)で記述されている点が、通常のEmacsコマンドと異なります。しかし Emacsコマンド言語は、高度なことや一般的なことを記述するプログラム言語と して、充分にパワフルとはいえません。そのような事項には、Lispを使わなけれ ばなりません。 17.1 基本的な使い方 =================== ‘’ ‘C-x (’ キーボードマクロの定義を開始します (‘kmacro-start-macro-or-insert-counter’)。 ‘’ ‘C-x e’ キーボードマクロを定義しているときは定義を終了します。それ以外の場 合は一番最近のキーボードマクロを実行します (‘kmacro-end-or-call-macro’)。 ‘C-u ’ ‘C-u C-x (’ 最後のキーボードマクロを再実行してから、キーをマクロ定義に追加しま す。 ‘C-u C-u ’ ‘C-u C-u C-x (’ 最後のキーボードマクロを再実行せずに、キーをマクロ定義に追加します 。 ‘C-x C-k r’ リージョンの中の各行の行頭にたいして、最後のキーボードマクロを実行 します(‘apply-macro-to-region-lines’)。 キーボードマクロの定義を開始するには、をタイプします。それからは キーを入力して実行を続けますが、それは同時にマクロ定義の一部になります。 その間は、モードラインに‘Def’が表示されて、マクロの定義中であることを示 します。終了するときは (‘kmacro-end-or-call-macro’)をタイプして、定 義を終了します。たとえば、 M-f foo これは1単語前方に移動してから、‘foo’を挿入するマクロを定義します。は、マクロの一部とはならないことに注意してください。 マクロを定義した後は、でそれを呼び出すことができます。上記の例で は、それは‘M-f foo’ againをタイプしたのと同じ効果をもちます(コマンド の2つの役割に注意してください。これはマクロを定義しているときはマクロの 定義を終了し、そうでないときは最後のマクロを呼び出します)。に数引数 ‘n’を与えることもできます。これはマクロを‘n’回呼び出すことを意味します。 引数に0を与えると、エラーになるか、‘C-g’(MS-DOSでは‘C-’)をタイプ するまで、マクロを永久に繰り返します。 上記の例は、キーボードマクロを使った便利なトリックをデモンストレイト する例です。テキストの一定間隔の位置にたいして繰り返し操作を行いたいとき は、マクロの一部に移動コマンドを含めます。この例ではマクロの繰り返しによ り、連続する単語の後ろに文字列‘foo’を挿入していきます。 キーボードマクロの定義を終了した後でも、‘C-u ’をタイプすることに より、マクロの定義にキーストロークを追加できます。これはに続けてマク ロの定義を再タイプするのと同じです。結果として、そのマクロの以前の定義が 再実行されることになります。変数‘kmacro-execute-before-append’を‘nil’に 変更すると、既存のマクロにキーストロークが追加されるまでは実行されません (デフォルトは‘t’)。最後に実行したキーボードマクロを再実行することなく、 定義の最後にキーストロークを追加するには、‘C-u C-u ’をタイプしてくだ さい。 コマンドがミニバッファーから引数を読みとる場合、ミニバッファーにたい する入力は、コマンドと一緒にマクロの一部となります。したがってマクロを再 生すると、そのコマンドの引数は入力されたのと同じになります。たとえば、 C-a C-k C-x b foo C-y C-x b これはカレント行をkillして、バッファー‘foo’にそれをyankした後、元のバッ ファーに戻ります。 ほとんどのキーボードコマンドは、キーボードマクロの定義で普通に機能し ますが、いくつか例外があります。‘C-g’ (‘keyboard-quit’)をタイプすると、 キーボードマクロの定義が終了します。‘C-M-c’ (‘exit-recursive-edit’)は信 頼できません。これはマクロの中で再帰編集(recursive edit)を開始したときは 期待通りに再帰編集から抜け出しますが、キーボードマクロの呼び出し前に開始 された再帰編集を抜け出すには、キーボードマクロからも抜け出す必要がありま す。同様に、マウスイベントもキーボードマクロで使用できますが。信頼はでき ません。マクロによりマウスイベントが再生されるときは、マクロを定義したと きのマウス位置が使用されます。この効果は予測が困難です。 コマンド‘C-x C-k r’ (‘apply-macro-to-region-lines’)は、リージョン内の 各行のにたいして、最後に定義されたキーボードマクロを繰り返します。これは 1行ずつポイントをリージョン内の行頭に移動してからマクロを実行します。 上記で説明したに加えて、Emacsはキーボードマクロを定義したり 実行するための、古いキーバインドもサポートします。と同様にマクロ定義 を開始するには、‘C-x (’ (‘kmacro-start-macro’)とタイプします。プレフィク ス引数を指定すると、最後のキーボードマクロの定義に追加します。マクロ定義 を終了するには‘C-x )’ (‘kmacro-end-macro’)とタイプします。一番最近のマク ロを実行するには、‘C-x e’ (‘kmacro-end-and-call-macro’)とタイプします。 マクロ定義中に‘C-x e’を入力すると、マクロ定義を終了してからすぐに実行さ れます。‘C-x e’をタイプした後すぐに‘e’をタイプすることにより、そのマクロ を1回以上繰り返すことができます。(マクロの実行に使用されるときの)と 同様、‘C-x e’には繰り返し回数を引数指定できます。 ‘C-x )’に、繰り返し回数を引数として与えることができます。これはマクロ を定義した後、すぐにマクロが繰り返されることを意味します。マクロの定義は 、定義することによりマクロが実行されるので、最初の1回として数えられます 。したがって‘C-u 4 C-x )’は、マクロを3回すぐに追加実行します。 17.2 キーボードマクロリング =========================== すべての定義されたキーボードマクロは、“キーボードマクロリング(keyboard macro ring)”に記録されます。キーボードマクロリングはすべてのバッファーで 共有され、1つだけしかありません。 ‘C-x C-k C-k’ リングの先頭にあるキーボードマクロを実行します (‘kmacro-end-or-call-macro-repeat’)。 ‘C-x C-k C-n’ キーボードマクロリングを、次のマクロ(古く定義されたもの)にローテー トします(‘kmacro-cycle-ring-next’)。 ‘C-x C-k C-p’ キーボードマクロリングを前のマクロ(新しく定義されたもの)にローテー トします(‘kmacro-cycle-ring-previous’)。 キーボードマクロリングを操作するすべてのコマンドは、同じ‘C-x C-k’を使 います。これらのコマンドでは、すぐ後にコマンドを実行して繰り返す場合には 、互いに‘C-x C-k’プレフィクスを必要としません。たとえば、 C-x C-k C-p C-p C-k C-k C-k C-n C-n C-k C-p C-k C-d これは、キーボードマクロリングを2つ前のマクロが先頭にくるようにローテー トして、3回実行します。次にキーボードマクロリングをローテートして、元は 先頭だったマクロを先頭に戻して1回実行します。次にキーボードマクロリング を1つ前のマクロが先頭にくるようにローテートして、それを実行します。そし て最後にそれを削除しています。 コマンド‘C-x C-k C-k’ (‘kmacro-end-or-call-macro-repeat’)は、マクロリ ングの先頭にあるキーボードマクロを実行します。もう一度すぐに‘C-k’をタイ プすると、マクロを繰り返すことができます。すぐに‘C-n’か‘C-p’をタイプすれ ば、マクロリングをローテートすることができます。 キーボードマクロを定義しているとき、‘C-x C-k C-k’はと同様に振る舞 いますが、すぐ後にタイプされた場合は異なります。このセクションで説明する ほとんどのキーバインドは、‘C-x C-k’プレフィクスが必要ない場合があります 。たとえば、すぐに‘C-k’をタイプした場合は、マクロを再実行します。 コマンド‘C-x C-k C-n’ (‘kmacro-cycle-ring-next’)および‘C-x C-k C-p’ (‘kmacro-cycle-ring-previous’)は、マクロリングをローテートして、次または 前のキーボードマクロをリングの先頭に移動させます。新しく先頭となったマク ロの定義は、エコーエリアに表示されます。お望みのマクロが先頭にくるまで、 すぐに‘C-n’または‘C-p’を繰り返しタイプすれば、マクロリングのローテートを 続けることができます。新しくマクロリングの先頭にきたマクロを実行するには 、単に‘C-k’をタイプします。 Emacsはマクロリングの先頭を、最後に定義されたキーボードマクロとして扱 います。たとえば、そのマクロはで実行でき、‘C-x C-k n’で名前をつける ことができます。 キーボードマクロリングに格納できるマクロの最大数は、カスタマイズ可能 な変数‘kmacro-ring-max’により決定されます。 17.3 キーボードマクロカウンター =============================== キーボードマクロには、それぞれカウンターが割り当てられています。これはマ クロの定義を開始したとき0に初期化されます。この“カレントカウンター (current counter)”の数値をバッファーに挿入することもできます。カレントカ ウンターの数値は、マクロが呼び出された回数にもとづきます。バッファーにカ ウンターの値が挿入される度に通常、カウンターは増加します。 カレントカウンターに加えて、前回カレントカウンターが増加またはセット されたときにもっていた値を記録する、“前回カウンター(previous counter)”も 保守します。‘C-u 0 C-x C-k C-i’により増分値0でカレントカウンターを増加さ せると、カレントカウンターの値も前回カウンターの値として記録されることに 注意してください。 ‘’ キーボードマクロの定義では、キーボードマクロカウンターの値をバッフ ァーに挿入します(‘kmacro-start-macro-or-insert-counter’)。 ‘C-x C-k C-i’ キーボードマクロカウンターの値をバッファーに挿入します (‘kmacro-insert-counter’)。 ‘C-x C-k C-c’ キーボードマクロカウンターをセットします(‘kmacro-set-counter’)。 ‘C-x C-k C-a’ プレフィクス引数をキーボードマクロカウンターに加えます (‘kmacro-add-counter’)。 ‘C-x C-k C-f’ 挿入するキーボードマクロカウンターの書式を指定します (‘kmacro-set-format’)。 キーボードマクロを定義しているとき、コマンド (‘kmacro-start-macro-or-insert-counter’)は、キーボードマクロカウンターの 現在の値をバッファーに挿入して、カウンターを1増加させます(マクロを定義し ていないとき、はマクロの定義を開始します。*note Basic Keyboard Macro::を参照してください)。異なる増分の指定には、数引数を使うことができ ます。単にプレフィクス‘C-u’を指定すると、前回カウンターの値を挿入して、 カレントカウンターの値は変化しません。 例として数字が振られたリストを構築するために、キーボードマクロカウン ターを使う方法を見てみましょう。以下のキーシーケンスを考えてください: C-a . マクロ定義の一部として、現在の行の先頭に文字列‘0. ’が挿入されます。バッ ファーの他の箇所ででマクロを呼び出すと、その行の先頭に文字列‘1. ’が 挿入されます。その後に呼び出すと‘2. ’、‘3. ’、...が挿入されます。 コマンド‘C-x C-k C-i’ (‘kmacro-insert-counter’)は、と同様のことを 行いますが、これはキーボードマクロの定義外でも使用できます。キーボードマ クロが定義中でなく実行もされていない場合、これはキーボードマクロリングの 先頭にあるマクロのカウンター値を挿入および増加します。 コマンド‘C-x C-k C-c’ (‘kmacro-set-counter’)は現在のマクロカウンター を、数引数の値にセットします。マクロ内で使用した場合、マクロ実行ごとに処 理します。プレフィクス引数に単に‘C-u’を指定した場合、マクロの現在の繰り 返し実行おいて、カウンターが最初にもっていた値に、カウンターをリセットし ます(この繰り返しにおける増加を取り消します)。 コマンド‘C-x C-k C-a’ (‘kmacro-add-counter’)は、プレフィクス引数を現 在のマクロカウンターに加えます。単に‘C-u’を引数に指定すると、任意のキー ボードマクロにより最後に挿入された値に、カウンターをリセットします(通常 これを使うときは、最後の挿入は同じマクロによる同じカウンターです)。 コマンド‘C-x C-k C-f’ (‘kmacro-set-format’)は、マクロカウンターを挿入 するときに使われる書式の入力を求めます。デフォルトの書式は‘%d’で、これは パディングなしの10進数字が挿入されることを意味します。ミニバッファーに何 も入力せずにexitすることにより、このデフォルト書式にリセットできます。 ‘format’関数(この関数はさらに1つの整数の引数をとります)が受け入れる書式 文字列を指定できます(*note (elisp)Formatting Strings::を参照してください )。ミニバッファーに書式文字列を入力するときは、書式文字列をダブルクォー テーションで括らないでください。 キーボードマクロの定義および実行がされていないときにこのコマンドを使 うと、新しい書式はそれ以降のマクロ定義すべてに影響を及ぼします。既存のマ クロは、それが定義されたときの書式を使いつづけます。キーボードマクロ定義 中に書式をセットすると、そのマクロが定義されている箇所に影響を及ぼします が、それ以降のマクロには影響を与えません。マクロの実行においては、そのマ クロ定義の時点の書式が使われます。マクロの実行中にマクロ書式を変更すると 、これは定義中における書式の変更と同様、それ以降のマクロに影響を与えませ ん。 ‘C-x C-k C-f’によりセットされた書式は、レジスターに格納された数字の挿 入には影響しません。 マクロの繰り返しにおいてレジスターを増加してカウンターとして使う場合 、これはキーボードマクロカウンターと同じことです。*note Number Registers::を参照してください。大抵の用途では、キーボードマクロカウンタ ーを使う方が単純です。 17.4 変化のあるマクロの実行 =========================== キーボードマクロで、‘query-replace’のように変更を行うか応答を求める効果 を作ることができます。 ‘C-x q’ マクロ実行中にこの箇所に到達すると確認を求めます (‘kbd-macro-query’)。 マクロ定義中に問い合わせを行いたい箇所で‘C-x q’をタイプします。マクロ 定義中は‘C-x q’は何も行いませんが、後でマクロを実行すると‘C-x q’は実行を 続けるか対話的に確認を求めます。 以下は‘C-x q’にたいする有効な応答です: (または‘y’) キーボードマクロの実行を続けます。 (または‘n’) マクロのこの繰り返しでの残りの部分をスキップして、次の繰り返しを開 始します。 (または‘q’) マクロのこの繰り返しでの残りの部分をスキップして、これ以上の繰り返 しを取り消します。 ‘C-r’ マクロの一部ではない編集を行うことができる、再帰編集レベル (recursive editing level)に入ります。‘C-M-c’を使って再帰編集を抜け ると、キーボードマクロを続行するか再び確認を求められます。ここで をタイプすると、マクロ定義の残りの部分が実行されます。マクロの 残りの部分が期待したように動作するためにポイントとテキストを残すの は、ユーザーの責任です。 ‘C-x q’に数引数を指定した‘C-u C-x q’は、完全に異なる関数を実行します 。これはマクロ定義中およびマクロ実行中の両方で、キーボード入力を読みとる 再帰編集に入ります。定義中のときは、再帰編集の中で行った編集はマクロの一 部とはなりません。マクロ実行中は、再帰編集により各繰り返しにおいて特別な 編集を行う機会が与えられます。*note Recursive Edit::を参照してください。 17.5 キーボードマクロの命名と保存 ================================= ‘C-x C-k n’ 一番最近定義したキーボードマクロに、名前(持続期間はEmacsセッション 中)を与えます(‘kmacro-name-last-macro’)。 ‘C-x C-k b’ 一番最近定義したキーボードマクロを、キーにバインド(持続期間は Emacsセッション中)します(‘kmacro-bind-to-key’)。 ‘M-x insert-kbd-macro’ キーボードマクロの定義を、Lispコードとしてバッファーに挿入します。 キーボードマクロを後で使うために保存するには、‘C-x C-k n’ (‘kmacro-name-last-macro’)を使って、それに名前を与えることができます。こ れはミニバッファーを使って名前を引数として読み取り、最後のキーボードマク ロの現在の定義を実行するための、名前を定義します(後でこのマクロの定義を 追加した場合、その名前のマクロ定義は変更されません)。マクロ名はLispシン ボルで、‘M-x’で呼び出せ、‘global-set-key’でキーにバインドできる有効な名 前をつけます。キーボードマクロ以外に定義されている名前を指定すると、エラ ーメッセージが表示され何も変更はされません。 ‘C-x C-k b’ (‘kmacro-bind-to-key’)の後に、バインドしたいキーシーケン スを続けることにより、最後のキーボードマクロ(の現在の定義)をキーにバイン ドすることもできます。グローバルキーマップ(global keymap)の任意のキーシ ーケンスにバインドできますが、大部分のキーシーケンスはすでに他のバインド をもっているので、キーシーケンスの選択は慎重に行う必要があります。任意の キーマップで既存のバインドをもつキーシーケンスにバインドしようとすると、 既存のバインドを置き換える前に確認を求めます。 既存のバインドの上書きに起因する問題を避けるには、キーシーケンス‘C-x C-k 0’から‘C-x C-k 9’と、‘C-x C-k A’から‘C-x C-k Z’を使います。これらの キーシーケンスは、キーボードマクロのバインド用に予約されています。これら のキーシーケンスにバインドするには、キーシーケンス全体ではなく数字か文字 だけをタイプすればバインドできます。たとえば、 C-x C-k b 4 これは最後のキーボードマクロをキーシーケンス‘C-x C-k 4’にバインドします 。 1度マクロにコマンド名をつければ、その定義をファイルに保存できます。そ れは他の編集セッションでも使用できます。最初に定義を保存したいファイルを visitします。次に以下のコマンドを使います: M-x insert-kbd-macro MACRONAME これは後で実行するとき、今と同じ定義のマクロとなるLispコードをバッファー に挿入します(これを行うためにLispコードを理解する必要はありません。なぜ ならあなたのかわりに‘insert-kbd-macro’がLispコードを記述するからです)。 それからファイルを保存します。後でそのファイルを‘load-file’ (*note Lisp Libraries::を参照してください)でロードできます。initファイル‘~/.emacs’ (*note Init File::を参照してください)に保存すれば、そのマクロはEmacsを実 行する度に定義されます。 ‘insert-kbd-macro’に数引数を与えると、(もしあれば)MACRONAMEにバインド したキーを記録するためのLispコードが追加されるので、ファイルをロードした とき同じキーにマクロが割り当てられます。 17.6 キーボードマクロの編集 =========================== ‘C-x C-k C-e’ 最後に定義されたキーボードマクロを編集します(‘kmacro-edit-macro’)。 ‘C-x C-k e NAME ’ 以前に定義されたキーボードマクロNAMEを編集します (‘edit-kbd-macro’)。 ‘C-x C-k l’ 過去300回分のキーストロークを、キーボードマクロとして編集します (‘kmacro-edit-lossage’)。 ‘C-x C-k C-e’または‘C-x C-k ’ (‘kmacro-edit-macro’)をとタイプし て、最後のキーボードマクロを編集できます。これはマクロ定義をバッファーに 整形出力して、それを編集するために特化したモードに入ります。そのバッファ ーで‘C-h m’をタイプすると、マクロを編集する方法の詳細が表示されます。編 集を終了するには‘C-c C-c’をタイプしてください。 名前をつけたキーボードマクロ、またはキーにバインドしたマクロは、‘C-x C-k e’ (‘edit-kbd-macro’)とタイプして編集できます。このコマンドに続けて そのマクロを呼び出すときのキー入力(‘C-x e’、‘M-x NAME’、またはその他のキ ーシーケンス)を入力します。 ‘C-x C-k l’ (‘kmacro-edit-lossage’)とタイプして、最近300回のキースト ロークをマクロとして編集できます。 17.7 キーボードマクロのステップ編集 =================================== ‘C-x C-k ’ (‘kmacro-step-edit-macro’)とタイプして、最後のキーボード マクロをインタラクティブに1コマンドずつ再生および編集できます。マクロを ‘q’または‘C-g’で終了しなければ、編集されたマクロでマクロリングの最後のマ クロを置き換えます。 このマクロ編集機能は、最初(または次)に実行されるコマンドと、それにた いする操作を尋ねるプロンプトをミニバッファーに表示します。‘?’を入力すれ ば、オプションの要約を表示できます。以下のオプションが利用可能です: • および‘y’は、現在のコマンドを実行して、キーボードマクロの次の コマンドに進みます。 • ‘n’、‘d’、およびは、現在のコマンドをスキップして削除します。 • ‘f’は、キーボードマクロの実行において現在のコマンドをスキップします が、マクロから削除はしません。 • は、現在のコマンドと、現在のコマンドのすぐ後に続く同じようなコ マンドを実行します。たとえば連続する文字の挿入 (‘self-insert-command’に相当)には、が使われます。 • ‘c’は、(これ以上の編集は行わずに)キーボードマクロの最後まで実行を続 けます。実行が正常に終了した場合、編集されたマクロで元のキーボード マクロを置き換えます。 • ‘C-k’は、キーボードマクロの残りの部分をスキップおよび削除して、ステ ップ編集を終了し、編集されたマクロで元のキーボードマクロを置き換え ます。 • ‘q’および‘C-g’は、キーボードマクロのステップ編集を取り消して、キー ボードマクロにたいして行った編集を破棄します。 • ‘i KEY... C-j’は、一連のキーシーケンス(最後の‘C-j’は含まれません)を 読み取って実行し、キーボードマクロの現在のコマンドの前に挿入します (現在のコマンドはスキップしません)。 • ‘I KEY...’は、1つのキーシーケンスを読み取って実行し、キーボードマク ロの現在のコマンドの前に挿入します(現在のコマンドはスキップしません )。 • ‘r KEY... C-j’は、一連のキーシーケンス(最後の‘C-j’は含まれません)を 読み取って実行し、現在のコマンドをそれで置き換えます(実行は挿入され たキーシーケンスの次に移ります)。 • ‘R KEY...’は、1つのキーシーケンスを読み取って実行し、キーボードマク ロの現在のコマンドを、そのキーシーケンスで置き換えます(実行は挿入さ れたキーシーケンスの次に移ります)。 • ‘a KEY... C-j’は、現在のコマンドを実行してから、一連のキーシーケン ス(最後の‘C-j’は含まれません)を読み取って実行してから、それをキーボ ードマクロの現在のコマンドの後ろに挿入します(実行は現在のコマンドと 、その後ろに挿入されたキーシーケンスの次に移ります)。 • ‘A KEY... C-j’は、キーボードマクロの残りのコマンドを実行してから、 一連のキーシーケンス(最後の‘C-j’は含まれません)を読み取って実行し、 それらをキーボードマクロの最後に追加します。それからステップ編集を 終了し、編集されたマクロで元の元のキーボードマクロを置き換えます。 18 ファイルの処理 ***************** オペレーティングシステムは“ファイル”にデータを永続化するので、Emacsで編 集するテキストの大部分はファイルから読み込んで、最終的にファイルに格納し ます。 ファイルを編集するには、Emacsにファイルを読み込み、ファイルのテキスト を含むバッファーを準備するよう、指示しなければなりません。これを、ファイ ルの“visit(訪問)”と呼びます。編集コマンドは直接バッファーのテキスト、つ まりEmacs内部のコピーに適用されます。変更がファイルに反映されるのは、バ ッファーをファイルに“保存(save)”したときだけです。 ファイルのvisitや保存に加え、Emacsはファイルの削除、コピー、名前の変 更、ファイルへの追加、ファイルの複数バージョンの保持、ディレクトリーの操 作を行うことができます。 18.1 ファイルの名前 =================== ファイルを操作するEmacsコマンドの多くは、ミニバッファー(*note Minibuffer File::を)を使って、ファイル名の指定を求めます。 ミニバッファーでは、通常の補完およびヒストリーコマンドを使うことがで きます(*note Minibuffer::を参照してください)。ファイル名の補完では、ファ イル名の拡張子が変数‘completion-ignored-extensions’に含まれているファイ ルは無視されます(*note Completion Options::を参照してください)。またほと んどのコマンドは、ファイルの読み込みにおいて、確認をともなう寛大な補完 (permissive completion with confirmation)を使います。この補完では、存在 しないファイル名が許されますが、存在しないファイル名の入力を完了するため にをタイプすると、Emacsは‘[Confirm]’を表示し、この確認に同意するた めに2番目のをタイプしなければなりません。詳細については、*note Completion Exit::を参照してください。 ミニバッファーのヒストリーコマンドは、ファイル名を読み取るための特別 な機能をいくつか提供します。*note Minibuffer History::を参照してください 。 それぞれのバッファーは、バッファーローカルな変数‘default-directory’に 、“デフォルトのディレクトリー”を格納しています。ミニバッファーを使ってフ ァイル名を読み取るとき、通常Emacsはミニバッファーの初期内容として、デフ ォルトディレクトリーを挿入します。変数‘insert-default-directory’を ‘nil’に変更することにより、この挿入を抑制できます。常にEmacsは任意の相対 パスで指定されたファイル名を、デフォルトディレクトリーにたいする相対パス とみなします。たとえばディレクトリーを指定しないファイル名は、デフォルト ディレクトリーのファイルを指定します。 ファイルをvisitするとき、Emacsはvisitしているバッファーの ‘default-directory’に、そのファイルのディレクトリーをセットします。‘C-x b’のようなコマンドを通じて、ファイルをvisitしていないバッファーを新たに 作成すると、通常そのバッファーのデフォルトディレクトリーは、現在のバッフ ァーのデフォルトディレクトリーをコピーします。現在のバッファーの ‘default-directory’の値を見るために、‘M-x pwd’コマンドを使用できます。 ‘M-x cd’コマンドはディレクトリー名の入力を求め、バッファーの ‘default-directory’もそのディレクトリーをセットします(これを行うことによ りバッファーのファイル名は変更されません)。 例として、ファイル‘/u/rms/gnu/gnu.tasks’をvisitしているとします。この ときデフォルトディレクトリーは‘/u/rms/gnu/’にセットされます。ファイル名 を読み取るコマンドを呼び出して、ミニバッファーでディレクトリー名を省略し て単に‘foo’と入力すると、これはファイル‘/u/rms/gnu/foo’を指定したことに なります。‘../.login’と入力すると‘/u/rms/.login’、‘new/foo’と入力すると ‘/u/rms/gnu/new/foo’を指定したことになります。 ミニバッファーにファイル名をタイプするとき、2つのショートカットを使う ことができます。2つのスラッシュは、2番目のスラッシュの前にあるすべてを無 視します。そして‘~/’は、ユーザーのホームディレクトリーです。*note Minibuffer File::を参照してください。 文字‘$’は、ファイル名を置き換える環境変数の代用として使われます。環境 変数の名前は、‘$’の後ろのすべての英数字から構成されます。‘$’の後ろの、大 カッコ(braces)に囲まれた変数名も使用できます。たとえばシェルコマンド ‘export FOO=rms/hacks’は、名前が‘FOO’の環境変数をセットするために使われ ます。すると‘/u/$FOO/test.c’と‘/u/${FOO}/test.c’はどちらも、 ‘/u/rms/hacks/test.c’の省略形となります。環境変数が定義されていないとき は、何の置き換えも発生せず、文字‘$’はそれ自身を意味します。Emacs外部でセ ットされた環境変数は、それがEmacsの開始前に適用されたときだけ、Emacsに影 響を与えることに注意してください。 ‘$’により環境変数が展開されるようなとき、名前に‘$’を含むファイルにア クセスする場合は、‘$$’とタイプします。1つの‘$’が環境変数を展開するのと同 時に、2つのペアは1つの‘$’に変換されます。かわりにファイル名を‘/:’でクォ ートすることもできます(*note Quoted File Names::を参照してください)。名 前が文字‘~’で始まるファイル名も、‘/:’でクォートするべきです。 ファイル名に非ASCII文字を含めることができます。*note File Name Coding::を参照してください。 18.2 ファイルのvisit(訪問) ========================== ‘C-x C-f’ ファイルをvisitします(‘find-file’)。 ‘C-x C-r’ 変更を許さない閲覧用として、ファイルをvisitします (‘find-file-read-only’)。 ‘C-x C-v’ 最後にvisitしたファイルとは異なるファイルを、かわりにvisitします (‘find-alternate-file’)。 ‘C-x 4 f’ 別のウィンドウでファイルをvisitします(‘find-file-other-window’)。選 択されたウィンドウに表示されているものは変更しません。 ‘C-x 5 f’ 新しいフレームでファイルをvisitします(‘find-file-other-frame’)。選 択されたフレームに表示されているものは変更しません。 ‘M-x find-file-literally’ 内容を変換せずにファイルをvisitします。 ファイルを“Visiting(訪問)”するとは、そのファイル内容をEmacsのバッファ ーに読み込むことを意味するので、それを編集することができます。Emacsは visitするファイルごとに、新しいバッファーを作成します。 ファイルをvisitするには、‘C-x C-f’ (‘find-file’)とタイプして、visitし たいファイルの名前をミニバッファーで入力します。ミニバッファーでは、 ‘C-g’をタイプして、コマンドを中止することができます。ミニバッファーでの ファイル名の入力についての詳細は、*note File Names::を参照してください。 ファイルは存在するが、システムが読み込みを許さない場合、エコーエリア にエラーメッセージが表示されます(GNUおよびUnixシステムでは、‘su’や ‘sudo’のような方法を使用して、そのようなファイルをvisitできるかもしれな い。*note Remote Files::を参照されたい。) それ以外の場合、スクリーンに新 しいテキストが表示され、モードラインバッファー名が表示されることで、‘C-x C-f’が成功したことを知ることができます。通常Emacsは、ファイル名からディ レクトリー名を省いて、バッファー名を作ります。たとえば ‘/usr/rms/emacs.tex’という名前のファイルは、バッファー名‘emacs.tex’とな ります。その名前のバッファーがすでにある場合、Emacsは一意な名前を作りま す。通常の方法はディレクトリー名にもとづく接尾辞の追加です(たとえば ‘’、‘’など)が、違う方法を選択することもできます。*note Uniquify::を参照してください。 新しいファイルを作成するには、同じコマンド‘C-x C-f’を使ってvisitする だけです。Emacsはエコーエリアに‘(New file)’と表示しますが、他の点では既 存の空のファイルをvisitしたのと同じく振る舞います。 ファイルをvisitした後で編集コマンドにより行われた変更は、Emacsのバッ ファーに反映されます。バッファーを“保存(save)”するまでは、visitしている ファイルに影響はありません。バッファーが保存されていない変更を含むとき、 そのバッファーが“変更されている(modified)”といいます。これはバッファーを 保存しなければ、その変更が失われることを意味します。モードラインの左余白 の近くに2つのアスタリスクが表示され、バッファーが変更されていることを示 します。 すでにEmacsがvisitしているファイルをvisitした場合、‘C-x C-f’は他のコ ピーを作らず既存のバッファーに切り替えます。切り替えを行う前に、最後に visitまたは保存した後にファイルが変更されているか確認します。もしファイ ルが変更されているとき、Emacsはそれの再読み込みを提案します。 ‘large-file-warning-threshold’ (デフォルトは10000000で、これは約 10MB)より大きなファイルのvisitを試みると、Emacsは最初に確認を求めます。 ‘y’を応えることにより、ファイルのvisitを続けます。しかしEmacsは、Emacsバ ッファーの最大サイズ(Emacsが割り当てられるメモリー量の制限と、Emacsが扱 える整数により制限されます)を超えるバッファーは、visitできないことに注意 してください。この場合、Emacsは最大バッファーサイズを超えた旨を知らせる エラーメッセージを表示します。 ファイル名にシェル形式のワイルドカード文字が含まれている場合、Emacsは それにマッチするすべてのファイルをvisitします。(大文字小文字を区別しない ファイルシステムでは、Emacsは大文字小文字に関係なくワイルドカードをマッ チします)。ワイルドカードには‘?’、‘*’および‘[...]’シーケンスが含まれます 。ミニバッファーでワイルドカード‘?’をファイル名に入力するには、‘C-q ?’と タイプする必要があります。ワイルドカード文字を実際に名前に含むファイルを visitする方法についての情報は、*note Quoted File Names::を参照してくださ い。‘find-file-wildcards’をカスタマイズして、ワイルドカード機能を無効に することができます。 無意識に間違ったファイル名をタイプして違うファイルをvisitした場合、 ‘C-x C-v’ (‘find-alternate-file’)で実際に望むファイルをvisitできます。 ‘C-x C-v’は‘C-x C-f’と似ていますが、これは現在のバッファーをkillします (変更されている場合は最初に保存するか確認を求めます)。‘C-x C-v’がvisitす るファイルの名前を読み取るときは、ミニバッファーにデフォルトのファイル名 全体を挿入して、ポイントをディレクトリー名の後に置きます。これは名前を少 し間違えた場合などに便利です。 実際はディレクトリーであるファイルをvisitしたとき、EmacsはEmacsのディ レクトリーブラウザーのDiredを呼び出します。*note Dired::を参照してくださ い。この振る舞いは、変数‘find-file-run-dired’を‘nil’にセットすることによ り無効にできます。この場合、ディレクトリーをvisitするとエラーになります 。 実際には他のファイルの集まりであるような“アーカイブファイル(file archives)”の場合、アーカイブされたメンバーを操作できる、Diredに似た環境 を呼び出す特別なモードでvisitします。これらの機能については、*note File Archives::を参照してください。 オペレーティングシステムが変更を許していない、または読み取り専用にし ているファイルをvisitした場合、Emacsもバッファーを読み取り専用にするので 、保存すると問題を起こすような変更を防ぐことができます。‘C-x C-q’ (‘read-only-mode’)で、バッファーを書き込み可能にできます。*note Misc Buffer::を参照してください。 予期せぬ入力による変更を防ぐために、読み込み専用でファイルをvisitした い場合は、‘C-x C-f’のかわりにコマンド‘C-x C-r’ (‘find-file-read-only’)で visitします。 ‘C-x 4 f’ (‘find-file-other-window’)は‘C-x C-f’と同様ですが、指定した ファイルを含むバッファーは、別のウィンドウで選択されます。‘C-x 4 f’の前 に選択されていたウィンドウは、すでに表示していたのと同じバッファーの表示 を続けます。1つのウィンドウしか表示されていないときにこのコマンドを使う と、これはウィンドウを2つに分割し、1つのウィンドウには前に表示されていた のと同じバッファー、別の1つには新しい要求されたファイルを表示します。 *note Windows::を参照してください。 ‘C-x 5 f’ (‘find-file-other-frame’)も同様ですが、新しいフレームををオ ープンするか、指定したファイルをすでに表示している既存のフレームを選択し ます。*note Frames::を参照してください。 グラフィカルなディスプレーでは、ファイルをvisitする追加の方法が2つあ ります。1つ目は、Emacsが適したGUIツールキットによりビルドされているとき 、マウスによるコマンドの呼び出し(メニューバーやツールバーのクリックによ る)は、ミニバッファーでファイル名の入力を求める代わりに、そのツールキッ ト標準のファイル選択(file selection)ダイアログを表示します。GNU/Linuxお よびUnixプラットフォームでは、GTK+、LessTif、Motifツールキットとともに構 築されていると、Emacsはこれを行います。MS-WindowsとMacでは、GUIバージョ ンのデフォルトにより行われます。これをカスタマイズする情報については、 *note Dialog Boxes::を参照してください。 2つ目は、Emacsはのドラッグアンドドロップ(drag and drop)サポートで、通 常のEmacsウィンドウにファイルをドロップすることにより、そのウィンドウで ファイルをvisitします。例外としてDiredバッファーを表示しているウィンドウ にファイルをドロップすると、表示されているディレクトリーにファイルを移動 またはコピーします。詳細については*note Drag and Drop::と*note Misc Dired Features::を参照してください。 テキスト端末、およびGUIツールキットなしでビルドされているグラフィカル なディスプレーでは、アイテム‘Visit New File’と‘Open File’をもつメニュー バーの‘File’メニューから、、ファイルをvisitできます。 文字エンコーディングと使用されている改行規則を検知するために、Emacsは 自動的に内容をスキャンします。そして、それらをEmacsの内部エンコーディン グとバッファーの改行規則に変換します。バッファーを保存するとき、Emacsは 逆の変換を行い、元のエンコーディングと改行規則でファイルをディスクに書き 込みます。*note Coding Systems::を参照してください。 ファイルにたいして特別なエンコーディングや変換を行わずに、非ASCII文字 のシーケンスとして編集したいときは、‘M-x find-file-literally’コマンドを 使います。これは‘C-x C-f’と同様ですが、フォーマット変換(*note Format Conversion: (elisp)Format Conversion.を参照してください)、文字コード変換 (*note Coding Systems::を参照してください)、自動解凍(*note Compressed Files::を参照してください)を行わず、‘require-final-newline’による最後の 改行も追加しません(*note Customize Save::を参照してください)。同じファイ ルをすでに通常(非リテラル)の方法でvisitしている場合、このコマンドはそれ をリテラル(そのままの文字の列)としてvisitするかを尋ねます。 2つの特別なフック変数により、ファイルをvisitする操作を変更して拡張す ることができます。存在しないファイルをvisitすることにより、 ‘find-file-not-found-functions’の関数が実行されます。この変数は関数のリ ストを保有し、それらはどれか1つが非‘nil’を返すまで、(引数を指定せずに )1つずつ呼び出されます。これはノーマルフックではないため、その事実を示す ために名前の最後が‘-hook’ではなく、‘-functions’で終わっています。 ファイルが存在するしないにかかわらず、ファイルをvisitするのに成功する と、引数なしで関数‘find-file-hook’を呼び出します。この変数はノーマルフッ クです。ファイルが存在しない場合、最初に ‘find-file-not-found-functions’を実行します。*note Hooks::を参照してくだ さい。 ファイルを編集するために自動的にメジャーモードを指定し(*note Choosing Modes::を参照してください)、そのファイルのために特別なローカル変数を定義 する方法がいくつかあります(*note File Variables::を参照してください)。 18.3 ファイルの保存 =================== Emacsでのバッファーの“保存(Saving)”は、バッファーの内容を、そのバッファ ーによりvisitされているファイルに書き戻すことを意味します。 18.3.1 ファイルを保存するコマンド --------------------------------- ファイルの保存と書き込みに関するコマンドが、いくつかあります。 ‘C-x C-s’ 現在のバッファーを、そのファイルに保存します(‘save-buffer’)。 ‘C-x s’ 任意、またはすべてのバッファーを、それらのファイルに保存します (‘save-some-buffers’)。 ‘M-~’ 現在のバッファーが変更されたことを忘れます(‘not-modified’)。プレフ ィクス引数(‘C-u’)を指定すると、現在のバッファーを変更済みとマークし ます。 ‘C-x C-w’ 現在のバッファーを、指定したファイル名で保存します(‘write-file’)。 ‘M-x set-visited-file-name’ 現在のバッファーが保存される場所で、ファイル名を変更します。 ファイルを保存して変更を永続化させたいときは、‘C-x C-s’ (‘save-buffer’)とタイプします。保存が完了すると、‘C-x C-s’は以下のような メッセージを表示します: Wrote /u/rms/gnu/gnu.tasks 現在のバッファーが変更されていない(新規作成されたとき、または最後に変更 されたときから変更していない)場合、保存しても意味がないので実際の保存は 行われません。かわりに‘C-x C-s’は、エコーエリアに以下のようなメッセージ を表示します: (No changes need to be saved) ‘C-u C-x C-s’のようにプレフィクス引数を指定すると、Emacsはそのバッフ ァーを次回の保存が行われるときバックアップするようマークします。*note Backup::を参照してください。 コマンド‘C-x s’ (‘save-some-buffers’)は、任意、またはすべての変更され たバッファーの保存を提案します。これはバッファーごとに何を行うか尋ねます 。使用できる応答は、‘query-replace’と同様です。 ‘y’ このバッファーを保存し、残りのバッファーについて尋ねます。 ‘n’ このバッファーは保存せずに、残りのバッファーについて尋ねます。 ‘!’ このバッファーを保存し、残りのバッファーを尋ねることなくすべて保存 します。 ‘’ これ以上の保存をせずに、‘save-some-buffers’を終了します。 ‘.’ このバッファーを保存したら、他のバッファーをどうするか尋ねることな く、‘save-some-buffers’を終了します。 ‘C-r’ 現在尋ねられているバッファーを閲覧します。Viewモードから抜けると、 再び‘save-some-buffers’はどうするか尋ねます。 ‘d’ そのバッファーに対応するファイルとDiffをとり、どのような変更を保存 するのか確認できます。これはコマンド‘diff-buffer-with-file’ (*note Comparing Files::を参照してください)を呼び出します。 ‘C-h’ これらのオプションについての、ヘルプメッセージを表示します。 ‘save-some-buffers-default-predicate’の値をカスタマイズして、どのバッフ ァーにたいしてEmacsが問い合わせるか制御できます。 Emacsを終了するキーシーケンス‘C-x C-c’は、‘save-some-buffers’を呼び出 すので、同じ質問をします。 バッファーを変更したが変更を保存したくないとき、保存されるのを防ぐた めにできることがいくつかあります(それ以外の‘C-x s’または‘C-x C-c’で間違 って保存してしまうのはあなたの責任です)。まずできることは、‘M-~’ (‘not-modified’)とタイプすることで、これはバッファーが変更されているとい うマークをクリアーします。これを行うと、保存コマンドに、バッファーが保存 を必要しないと信じこませることができます(‘~’は数学のシンボルで、“not(否 定)”として使われることがあります。したがって‘M-~’はメタと“not”になります 。)。かわりにファイルからテキストを読み込むことにより、ファイルをvisitま たは保存された後に行った、すべての変更を取り消すことができます。これは “リバート(reverting: 復元)”と呼ばれます。*note Reverting::を参照してくだ さい(undoコマンド‘C-x u’を繰り返すことにより、変更がすべての変更を取り消 すこともできますが、リバートの方が簡単です)。 ‘M-x set-visited-file-name’は、現在のバッファーがvisitしているファイ ルの名前を変更します。このコマンドはミニバッファーを使って、新しいファイ ル名を読み取ります。その後に、そのバッファーがそのファイル名のファイルを visitしているとマークし、バッファー名も合わせて変更します。 ‘set-visited-file-name’は、新しくvisitするファイルへの保存はしません。こ れは後で保存するときのために、Emacs内のレコードを変更するだけです。これ はバッファーを変更されている(modified)とマークするので、そのバッファーで の_将来_の‘C-x C-s’で、保存が行われます。 バッファーにたいして、違うファイルをvisitしているとマークしてすぐに保 存したい場合は、‘C-x C-w’ (‘write-file’)を使います。このコマンドは、 ‘set-visited-file-name’の後すぐに‘C-x C-s’をするのと同じですが、‘C-x C-w’はファイルが存在するとき確認を求める点が異なります。ファイルを visitしていないバッファーでの‘C-x C-s’は、‘C-x C-w’と同じ効果をもちます 。したがってファイル名を読み取り、バッファーがそのファイルをvisitしてい るとマークした後、バッファー内容をそのファイルに保存します。ファイルを visitしていないバッファーのデフォルトファイル名は、バッファー名と、バッ ファーのデフォルトディレクトリーから合成されます(*note File Names::を参 照してください)。 新しいファイル名が何らかのメジャーモードに関連する場合、大抵は‘C-x C-w’によりそのメジャーモードへの切り替えが行われます。コマンド ‘set-visited-file-name’もこれを行います。*note Choosing Modes::を参照し てください。 Emacsがファイルを保存する際、ディスクの最新バージョンのファイル日付を 確認して、それがEmacsが最後に読み込み、または書き込みしたときと異なる場 合、Emacsはその事実をユーザーに知らせます。なぜならそれはおそらく同時編 集による問題を示しており、それをすぐにユーザーに知らせる必要があるからで す。*note Simultaneous Editing: Interlocking.を参照してください。 18.3.2 バックアップファイル --------------------------- ほとんどのオペレーティングシステムでは、ファイルを書き換えるとファイルに 入っていたそれまでの記録は、自動的に破棄されます。したがって、Emacsでフ ァイルを保存すると、ファイルの古い内容は捨てられます。しかし実際に保存す る前に、Emacsが慎重に古い内容を“バックアップ(backup)”ファイルと呼ばれる 別のファイルにコピーすれば、古い内容は失われません。 Emacsは最初にバッファーからファイルに保存されたときだけ、バックアップ ファイルを作成します。その後ファイルを何回保存しようと、バックアップは変 更されません。しかしバッファーをkillしてから、そのファイルを再びvisitす ると、新しいバックアップファイルが作成されます。 ほとんどのファイルにたいして、変数‘make-backup-files’はバックアップフ ァイルを作るかを決定します。ほとんどのオペレーティングシステムでは、デフ ォルト値は‘t’なので、Emacsはバックアップファイルを書き込みます。 バージョンコントロールシステム(version control system: *note Version Control::を参照してください)で管理されているファイルにたいして、バックア ップファイルを作るかは、変数‘vc-make-backup-files’により決定されます。バ ージョンコントロールシステムに以前のバージョンがある場合、バックアップフ ァイルを作るのは不必要なので、デフォルト値は‘nil’です。 *note General VC Options::を参照してください。 選択できるオプションは、Emacsにファイルごとに1つのバックアップを作ら せる方法と、編集するファイルごとに番号がついた、一連のファイルを作る方法 があります。*note Backup Names::を参照してください。 変数‘backup-enable-predicate’のデフォルト値は、一時的なファイルのため に使われるディレクトリー(変数‘temporary-file-directory’または ‘small-temporary-file-directory’で指定されます)のファイルは、バックアッ プしないような値になっています。 前に保存されたバッファーにたいしても、バッファーから他のバックアップ ファイルを作るよう、Emacsに明示的に指示することができます。バッファーを ‘C-u C-x C-s’で保存すると、この保存したバージョンが、次にバックアップす るときのバックアップになります。‘C-u C-u C-x C-s’はバッファーを保存しま すが、最初に元のファイル内容を新しいバックアップファイルとします。‘C-u C-u C-u C-x C-s’は両方を行います。まず前の内容でバックアップを作成し、次 回に保存したときは、今回保存したものをバックアップにします。 変数‘backup-directory-alist’をカスタマイズして、指定したパターンにマ ッチする特定のファイルにたいして、指定したディレクトリーにバックアップを 作成させることができます。典型的な使い方は、要素‘("." . DIR)’を追加する ことにより、すべてのバックアップを絶対パスDIRに作る方法です。異なるディ レクトリーにある同じ名前のファイルによる、バックアップファイルの名前の衝 突を避けるため、Emacsはバックアップファイルの名前を変更します。‘("." . ".~")’を追加すると、これは元のファイルがあるディレクトリーに、非表示の ‘.~’というディレクトリーを作って、そこにバックアップを作成します。 Emacsはバックアップを作るため、必要ならディレクトリーを作成します。 18.3.2.1 単一または番号つきバックアップ ....................................... Emacsのバックアップファイル作成では、バックアップの名前は通常、編集され るファイル名の後ろに‘~’をつけて作成されます。したがって‘eval.c’のバック アップファイルは、‘eval.c~’になります。 アクセスコントロールによりEmacsが通常の名前でバックアップファイルを書 き込めない場合、‘~/.emacs.d/%backup%~’というバックアップファイルに書き込 みます。この1つのファイルしか存在しないので、一番最近作られたバックアッ プだけが利用可能です。 Emacsは“番号つきバックアップファイル(numbered backup files)”を作るこ ともできます。番号つきバックアップファイルの名前は、元のファイル名の後ろ に‘.~’と番号と‘~’をつけたものです。したがって‘eval.c’のバックアップファ イルは、‘eval.c.~1~’、‘eval.c.~2~’、...、‘eval.c.~259~’、...となります。 変数‘version-control’は、単一のバックアップファイルを作るか、複数の番 号つきバックアップファイルを作るかを決定します。有効な値は以下のとおりで す: ‘nil’ すでに番号つきバックアップのあるファイルにたいしては、番号つきバッ クアップを作ります。それ以外は単独のバックアップをつくります。これ がデフォルトです。 ‘t’ 番号つきバックアップを作ります。 ‘never’ 番号つきバックアップをつくらず、常に単一のバックアップを作ります。 この変数をセットする通常の方法は、initファイルやcustomizationバッファー を通じて、グローバルにセットする方法です。しかし特定のバッファーにローカ ルに‘version-control’をセットして、そのバッファーのバックアップ作成を制 御することができます(*note Locals::を参照してください)。特定のファイルを visitするとき、常にEmacsに‘version-control’をローカルにセットさせること ができます(*note File Variables::を参照してください)。Rmailモードのよう ないくつかのモードは、この変数をセットします。 さまざまなGNUユーティリティーにたいして、何をすべきか指示する環境変数 ‘VERSION_CONTROL’をセットすると、Emacsも開始時にこの環境変数にしたがって 、Lisp変数‘version-control’をセットします。環境変数の値が‘t’または ‘numbered’のときは、‘version-control’は‘t’になります。値が‘nil’または ‘existing’のときは、‘version-control’は‘nil’になります。もし‘never’また は‘simple’のときは、‘version-control’は‘never’になります。 変数‘make-backup-file-name-function’に適切なLisp関数をセットすること により、Emacsがバックアップファイル名を作る通常の方法をオーバーライドで きます。 18.3.2.2 バックアップの自動削除 ............................... ディスク容量の過度な消費を防ぐため、Emacsは自動的に番号つきバックアップ を削除することができます。一般的にEmacsは一番古いバックアップと、一番新 しいバックアップをいくつか保持し、その間にあるバックアップを削除します。 これは新しいバックアップが作られる度に行なわれます。 2つの変数‘kept-old-versions’および‘kept-new-versions’が、この削除を制 御します。これらの変数の値は順に、削除せずに残す一番古い番号(小さい番号 )のバックアップと、一番新しい番号(大きい番号)で、新しいバックアップが作 られる度に評価されます。中間のバックアップ(一番古いものと一番新しいもの を除いたもの)は、余分なバージョンで、これらのバックアップは削除されます 。これらの変数の値は余分なバージョンを削除するとき、つまり新しいバックア ップが作られた直後に使われます。新しく作られたバックアップは、 ‘kept-new-versions’のカウントに含まれます。デフォルトでは、両方の変数の 値は2です。 ‘delete-old-versions’が‘t’のとき、Emacsは何も尋ねずに余分なバックアッ プファイルを削除します。‘nil’(デフォルト)のとき、Emacsは余分なバージョン のバックアップを削除するか尋ねます。他の値の場合、Emacsはバックアップの 自動削除をしません。 Diredの‘.’(ピリオド)コマンドでも、古いバージョンを削除できます。*note Flagging Many Files::を参照してください。 18.3.2.3 コピー vs. リネーム ............................ バックアップファイルは、古いファイルをコピーまたはリネームすることで作る ことができます。コピーとリネームは、古いファイルが複数の名前をもつ場合 (ハードリンクされている場合)に、異なる効果をもちます。古いファイルがバッ クアップファイルにリネームされた場合、ハードリンクされた別の名前で参照さ れるファイルは、バックアップファイルとなります。かわりに古いファイルをコ ピーすると、ハードリンクされた別の名前で参照されるファイルは、編集中のフ ァイルのままで、それらの名前でアクセスする内容は新しい内容となります。 バックアップファイルを作る方法は、編集中のファイルの所有者とグループ にも影響します。コピーが使われた場合、それらは変化しません。リネームが使 われた場合、そのユーザーがファイルの所有者となり、ファイルのグループはデ フォルト(オペレーティングシステムごとにグループのデフォルトは異なります )のグループになります。 リネームとコピーの選択は、以下の変数により行われます: • 変数‘backup-by-copying’が非‘nil’(デフォルトは‘nil’)の場合、コピーが 使用されます。 • 上記以外の場合、変数‘backup-by-copying-when-linked’が非‘nil’(デフォ ルトは‘nil’)で、ファイルが複数の名前をもつ場合は、コピーが使用され ます。 • 上記以外の場合、変数‘backup-by-copying-when-mismatch’が非‘nil’(デフ ォルトは‘t’)で、リネームによりファイルの所有者かグループが変更され る場合は、コピーが使用されます。 ‘backup-by-copying-when-mismatch’を‘nil’に変更すると、Emacsはファイ ルの所有者のユーザーIDの数字をチェックします。もしこの数字が ‘backup-by-copying-when-privileged-mismatch’の値より大きい場合、 ‘backup-by-copying-when-mismatch’が非‘nil’であるかのように振る舞い ます。 • 上記以外の場合、リネームがデフォルトの選択となります。 ファイルがバージョンコントロールシステムで管理されている場合(*note Version Control::を参照してください)、通常、Emacsは普通の方法でそのファ イルのバックアップを作りません。しかし“コミット”(“チェックイン”とも呼ば れる。*note VCS Concepts::を参照されたい)は、バックアップを作るのと似た ところがあります。これらの操作は通常ハードリンクをこわし、同じファイルに たいする別のファイル名でのvisitを切断します。Emacsにできることはありませ ん。バージョンコントロールシステムがこれを行うのです。 18.3.3 ファイル保存のカスタマイズ --------------------------------- 変数‘require-final-newline’の値が‘t’のとき、ファイルの保存または書き込み により、ファイルの終端に改行がないときは、何も尋ねずに改行を追加します。 値が‘visit’の場合、Emacsはファイルをvisitした直後に、終端に改行がないフ ァイルの改行を追加します(これによりバッファーは変更されたとマークされま す。undoはできません)。値が‘visit-save’の場合、Emacsはそのような改行を visitと保存のときに追加します。値が‘nil’の場合、Emacsはファイルの終端を 変更しません。それ以外の非‘nil’値は、改行を追加するかをEmacsが尋ねること を意味します。デフォルトは‘nil’です。 ファイルの終端に常に改行があると想定する、特定の種類のファイルのため にデザインされたメジャーモードがいくつかあります。そのようなメジャーモー ドは、変数‘require-final-newline’に、変数‘mode-require-final-newline’の 値(デフォルトは‘t’)をセットします。後者の変数の値をセットすることにより 、これらのモードが終端の改行を取り扱う方法を制御できます。 通常プログラムがファイルに書き込むとき、オペレーティングシステムはデ ータをディスクにコミットする前に、ファイルのデータをメインメモリーにキャ ッシュします。これにより大幅にパフォーマンスを向上できます。たとえばラッ プトップを使っている場合、ファイルを書き込む度にディスクをスピンアップ (spin-up)しなくて済みます。しかし、キャッシュをディスクにコミットする前 にオペレーティングシステムがクラッシュすることにより、データを失うリスク もあります。 このリスクを減少させるため、Emacsはファイルを保存した後に‘fsync’シス テムコールを呼び出すことができます。‘fsync’により、データを失うリスクを 皆無にすることはできません。その理由の一部は、多くのシステムは‘fsync’を 正しく実装していないことであり、他の理由の一部はEmacsのファイル保存手段 は通常ディレクトリー更新に頼っており、これは‘fsync’が正しく実装されてい ても、クラッシュを生き延びることはできないでしょう。 ‘write-region-inhibit-fsync’変数は、ファイルを保存した後にEmacsが ‘fsync’を呼び出すかを制御します。この変数のデフォルト値は、Emacsを対話的 に使用しているときは‘nil’、バッチモードの時は‘t’です(*note Batch Mode: Initial Options.を参照)。 Emacsは自動保存ファイルの書き込みに‘fsync’を使うことはありません。な ぜなら、それらのファイルのデータは、いずれにせよ失われるものだからです。 18.3.4 同時編集からの保護 ------------------------- 同時編集(Simultaneous editing)は、2人のユーザーが同じファイルをvisitして 、両者が変更と保存を行ったときに発生します。これが発生していることを誰も 知らせなければ、最初に保存したユーザーは、後で自分の変更が失われているこ とに気付くでしょう。 いくつかのシステムでは、Emacsは2番目のユーザーがファイルの変更を開始 すると、すぐに警告を発します。また、すべてのシステムにおいて、Emacsはフ ァイルを保存するときにチェックして、他のユーザーの変更を上書きすることを 警告します。ファイルを保存するかわりに適切な訂正アクションをとることによ り、他のユーザーの変更を失わなわずに済みます。 ファイルをvisitしているEmacsバッファーで最初の変更を行うとき、Emacsは ファイルが“ロック(locked)”されていることを記録します(これは同じディレク トリーにある、特別な内容の、特別な名前のシンボリックリンク(1)を作ること により行われます。詳細は*note (elisp)File Locks::を参照のこと)。変更を保 存したとき、Emacsはロックを解除します。このアイデアは、ファイルをvisitし ているEmacsバッファーに保存されていない変更があるとき、ファイルはロック されているとするものです。 変数‘create-lockfiles’を‘nil’にセットすることにより、ロックファイルの 作成を抑制することができます。*警告:*これにより、この機能が提供する利点 を失うことになります。 他のユーザーによりロックされているファイルをvisitしているバッファーの 変更を開始すると、“衝突(collision)”が起こります。Emacsが衝突を検知すると 、Lisp関数‘ask-user-about-lock’を呼び出して、何を行うか尋ねます。カスタ マイズのためにこの関数を再定義できます。この関数の標準定義は、ユーザーに 質問をして、3つの有効な応えを受け取ります。 ‘s’ ロックを横取りします。すでにファイルを変更したユーザーはロックを失 い、あなたがロックを取得します。 ‘p’ 続行します。他のユーザーがロックしている如何にかかわらずファイルの 編集を続けます。 ‘q’ 終了します。これはエラー(‘file-locked’)を引き起こし、バッファーの内 容は変更されません。あなたが試みた修正は実際には行われません。 Emacsまたはオペレーティングシステムがクラッシュすると、偽のロックファ イルが残ることがあり、このような偽のロックファイルによる警告を受けること があります。偽の衝突だと確信できるときは、Emacsにとにかく実行させる‘p’を 使います。 ロックはファイル名にもとづいて機能するので、ファイルが複数の名前を持 っていて、2人のユーザーがそれぞれ別のファイル名で同時編集を行うことを、 Emacsが防ぐことはできないことに注意してください。 ロックファイルに書き込みできない状況がいくつかあります。たとえばシス テム権限不足や他の理由により、Emacsがロックファイルが作成できない場合で す。このような場合でも保存を試みたときに、ファイルの最終変更日時をチェッ クすることにより、Emacsは衝突を検知できます。最後にEmacsがvisitまたは保 存したときからファイルが変更されているとき、それは他の何らかの手段により ファイルが変更されたことを示し、Emacsが保存を行うことによりそれらが失わ れることを意味します。そのようなときEmacsは警告メッセージを表示して、保 存する前に確認を求めます。保存するときは‘yes’、保存を取り消すときは ‘no’または‘C-g’と応えてください。 すでに同時編集が発生しているとき、バッファーとファイルを比較する方法 の1つは、‘M-x diff-buffer-with-file’コマンドです。*note Comparing Files::を参照してください。 ---------- Footnotes ---------- (1) システムがシンボリックリンクをサポートしていなければ、通常のファ イルが使われます。 18.3.5 ファイルのシャドーイング ------------------------------- 特定のファイルと等しい“shadow”コピーを1つ以上の場所、ことによると異なる マシン間で保持するように計画できます。これを行うにはまず、“shadowファイ ルグループ”をセットアップしなければなりません。これはリストにあるサイト 間で共有される同じ名前のファイルのセットです。ファイルグループは永続的で 、将来のEmacsセッションでも、現在のセッションと同様に適用されます。一度 グループをセットアップすると、Emacsを終了する度に、編集したファイルをグ ループの他のファイルにコピーします。‘M-x shadow-copy-files’をタイプする ことにより、Emacsを終了せずにコピーすることもできます。 “shadowクラスター”は、ディレクトリーを共有するホストのグループなので 、それらのコピーは、そのディレクトリーにあるすべてのファイルを更新するの に充分です。shadowクラスターはそれぞれ名前を持ち、プライマリーホスト(コ ピーを行うホスト)のネットワークアドレスと、プライマリーホスト以外でクラ スターに含めるホストを選択するための正規表現を指定します。 ‘M-x shadow-define-cluster’によりshadowクラスターを定義できます。 ‘M-x shadow-initialize’ ファイルのシャドーイング(shadowing)をセットアップします。 ‘M-x shadow-define-literal-group’ サイト間で共有される単一のファイルを定義します。 ‘M-x shadow-define-regexp-group’ ファイルのグループがマッチするすべてのファイルを、ホスト間で共有す るようにします。 ‘M-x shadow-define-cluster NAME ’ shadowファイルのクラスターNAMEを定義します。 ‘M-x shadow-copy-files’ すべての保留中のshadowファイルをコピーします。 ‘M-x shadow-cancel’ ファイルにたいするshadow指示を取り消します。 shadowファイルグループをセットアップするには、 ‘M-x shadow-define-literal-group’または ‘M-x shadow-define-regexp-group’を使います。詳細な情報は、これらの関数の ドキュメント文字列を参照してください。 ファイルをshadowにコピーする前に、Emacsは確認を求めます。“no”を応える ことにより、その時だけはコピーを回避できます。特定のファイルにたいして今 後もshadowingを取り消したい場合、‘M-x shadow-cancel’を使うことにより、 shadowファイルグループを削除または変更します。 MS Widowsでは、ファイルのシャドーイングは利用できません。 18.3.6 タイムスタンプの自動更新 ------------------------------- ファイルにタイムスタンプを書き込むことができます。これによりファイルを編 集・保存する度に、タイムスタンプが自動的に更新されます。タイムスタンプは 、ファイルの最初の8行になければならず、以下のような形式、 Time-stamp: <> または以下のような形式です: Time-stamp: " " その後、フック‘before-save-hook’に関数‘time-stamp’を追加します(*note Hooks::を参照してください)。ファイルを保存するとき、この関数は現在の日時 で自動的にタイムスタンプを更新します。コマンド‘M-x time-stamp’を使って、 手動でタイムスタンプを更新することもできます。デフォルトではタイムスタン プの書式は、localeのセッティング(*note Environment::を参照してください )と、タイムゾーン(*note (elisp)Time of Day::を参照してください)にしたが います。カスタマイズに関しては、Customグループの‘time-stamp’を参照してく ださい。 18.4 バッファーのリバート ========================= ファイルをvisitしているバッファーにたいして、広範な変更をした後に気が変 わったときは、“リバート(revert: 復元)”することにより。変更をファイルの保 存されたバージョンに戻すことができます。間違えてリバートしてしまうことに より、大量の作業結果を失うこともあり得るので、Emacsは最初に確認を求めま す。 ‘revert-buffer’コマンドは、ファイルが少ししか変更されていないときは、 前にポイントがあったテキスト部分とだいたい同じ位置にポイントを置くよう試 みます。しかし広範な変更を行っていた場合、ポイントは大きく異なる場所に置 かれることになります。 リバートはバッファーをnot modified(変更されていない)とマークします。 しかし、これはリバートされた変更を単一の変更として、そのバッファーの undoヒストリーに追加します(*note Undo::を参照)。したがって、リバート後に 気が変わってリバートされた変更を元に戻したくなった場合は、‘C-/’またはそ のエイリアスをタイプして、それを行うことができます。 ファイルに関連付けられていない、Diredバッファーのようなバッファーでも 、リバートすることができます。それらの場合、リバートはその内容を再計算す ることを意味します。‘C-x b’で明示的に作成したバッファーは、リバートでき ません。リバートを試みると‘revert-buffer’はエラーを報告します。 自動的かつ頻繁に変更されるファイル、たとえば実行を続けるプロセスのロ グ出力などを編集しているとき、Emacsが確認なしにリバートできたら便利でし ょう。このような振る舞いをさせるには、変数‘revert-without-query’に正規表 現のリストをセットします。ファイル名がそれらの正規表現の1つにマッチした とき、‘find-file’および‘revert-buffer’は、バッファーが変更されていないと きは、ファイルが変更される度に自動的にリバートします(もしテキストを編集 していた場合、変更を放棄するのはおそらく正しくありません)。 Emacsにバッファーを定期的にリバートするよう、指示することもできます。 特定のバッファーにたいしてこれを行うには、‘M-x auto-revert-mode’とタイプ して、マイナーモードのAuto-Revertモードを有効にします。カレントバッファ ーがvisitしているファイルがディスク上で変更されたとき、自動的にリバート します。すべてのバッファーにたいして同じことを行うには、‘M-x global-auto-revert-mode’とタイプして、Global Auto-Revertモードを有効にし ます。これらのマイナーモードはリモートのファイルにたいするチェックやリバ ートはしません。なぜならそれは通常とても遅いからです。この動作は、変数 ‘auto-revert-remote-files’を非‘nil’にセットすることにより変更できます。 デフォルトでは、Auto-Revertモードは“ファイル通知(file notifications)”を使用して機能します。これにより、ファイルシステムへの変 更が、OSからEmacsに報告されます。変数‘auto-revert-use-notify’を‘nil’にカ スタマイズして、ファイル通知を無効にできます。その場合、Emacsは5秒ごとに ポーリングして、ファイルの変更をチェックするでしょう。変数 ‘auto-revert-interval’を通じて、ポーリングの間隔を変更できます。 すべてのシステムでファイル通知がサポートされている訳ではありません。 サポートされないシステムでは、‘auto-revert-use-notify’はデフォルトで ‘nil’です。 Auto-Revertモードの1つの使い方は、システムログのようなファイルを “tail”することです。これにより、それらのファイルにたいする、他のプログラ ムによる変更を、継続的に表示できます。これを行うには、ポイントをバッファ ーの最後に移動します。そうすればファイル内容が変更されても、ポイントはそ の位置に留まります。しかし、ファイルがファイルの終端方向に向かって変更さ れるだけだと確信できるときは、かわりにAuto-Revert Tailモード (‘auto-revert-tail-mode’)を使います。このモードは、これをより効果的に行 います。Auto-Revert Tailモードは、リモートのファイルにたいしても機能しま す。 バッファーが自動リバートされたとき、メッセージが生成されます。これは ‘auto-revert-verbose’を非‘nil’にセットすることにより、抑制できます。 Diredバッファー(*note Dired::を参照)では、Auto-Revertモードはそのバッ ファーのディレクトリーでファイルが作成、または削除されたとき更新を行いま す。 バージョンコントロールシステムの下にあるファイルを、以前のバージョン にリバーとするコマンドについては、*note VC Undo::を参照してください。バ ージョンコントロールシステムの下にあるファイルをvisitしているときの自動 リバートの特性については、*note VC Mode Line::を参照してください。 18.5 非ファイルバッファーの自動リバート ======================================= 通常Global Auto Revertモードは、ファイルのバッファーだけをリバートします 。非ファイルバッファーにたいして自動リバートを行うには、2つの方法があり ます。1つはそれらのバッファーにたいしてAuto Revertモードを有効にする方法 です(‘M-x auto-revert-mode’を使います)。もう1つは ‘global-auto-revert-non-file-buffers’に非‘nil’値をセットする方法です。後 者はそれが実装されているすべての種類のバッファーにたいして、自動リバート を有効にします(以下のメニューにリストされています)。 ファイルバッファーと同様、非ファイルバッファーはそれらにたいして作業 を行っているときや、リバートすると失われてしまう情報が含まれているとき、 通常はリバートすべきではありません。したがって、それらがmodified(変更さ れている)のときはリバートしません。非ファイルバッファーが変更されている とマークするのは、ファイルバッファーのときより通常難しいので、トリッキー になり得ます。 他のトリッキーな点に関する詳細は、効率の問題です。自動リバートはしば しばバッファーにたいするすべての可能な変更を検知しようとせず、広範または 簡単に検知できる変更だけを検知します。したがって、非ファイルバッファーに 自動リバートを有効にすることは、バッファーのすべての情報が最新であると常 に保証はしませんし、手動によるリバートを無用にする必要もないからです。 それとは反対に、特定のバッファーは‘auto-revert-interval’で指定された 秒数ごとに自動的にリバートします(これは現在のところBuffer Menuだけに適用 されます)。この場合、自動リバートはリバートの際、‘auto-revert-verbose’が 非‘nil’でも、何もメッセージを表示しません。 詳細はバッファーの特性に依存し、それらは対応するセクションで説明され ています。 18.5.1 Buffer Menuの自動リバート -------------------------------- 非ファイルバッファーの自動リバートが有効なとき、必要性の有無にかかわらず 、Buffer Menu (*note Several Buffers::を参照) は‘auto-revert-interval’で 指定された秒数ごとに自動的にリバートされます。(リバートする必要があるか チェックするのは、恐らく実際にリバートするより長い時間を要する)。 Buffer Menuがmodifiedと不適切にマークされたときは、‘g’により手動でリ バートして自動リバートを再開します。しかし特定のバッファーにたいして削除 や表示のマークをつけた場合は、慎重になる必要があります。なぜならリバート はすべてのマークを消去するからです。マークの追加はバッファーのmodifiedフ ラグをセットするという事実は、自動的なマークの消去からの自動リバートを防 ぎます。 18.5.2 Diredバッファーの自動リバート ------------------------------------ Diredバッファーは、バッファーのメインディレクトリーのファイルリストが変 化したとき(たとえば新しいファイルの追加や削除)だけ、自動リバートします。 特定のファイルの情報が変化したとき(たとえばサイズの変化)や、サブディレク トリーへの追加は自動リバートしません。_すべて_のリストされた情報が最新で あることを確実にするには、Diredバッファーで自動リバートが_有効であっても _、手動で‘g’を使ってリバートする必要があります。メインディレクトリーにリ ストされているファイルへの変更や保存で、実際に自動リバートが起こるのに気 付くかもしれません。これはファイルの変更や保存は、たとえばバックアップフ ァイルやauto-saveファイルにより、高い確率でディレクトリー自身を変更する からです。しかし、これは保証されているわけではありません。 Diredバッファーがmodifiedとマークされ、残したい変更がない場合、大抵は ‘g’でバッファーを手動でリバートすることにより、自動リバートを再開できま す。しかし1つ例外があります。ファイルにフラグやマークをつけた場合、安全 にバッファーをリバートできます。これはフラグやマークを消去しません(もち ろんマークされたファイルが削除されていない場合です)。しかしバッファーは リバートの後でさえmodifiedの状態に留まるので、自動リバートは再開しません 。これは、もしファイルにたいしてフラグやマークをつけた場合、それはバッフ ァーにたいして作業をしており、警告なしにバッファーが変更されることを望ま ないだろうからです。マークやフラグがある状態で自動リバートを再開したいと きは、‘M-~’を使ってバッファーをnon-modifiedとマークします。しかしマーク やフラグの追加・削除・変更により、バッファーは再びmodifiedとマークされま す。 現在のところ、リモートのDiredバッファーは、自動リバートされません。特 定のファイルだけをリストするように、シェルのワイルドカードやファイル引数 を与えられたDiredバッファーも同じです。‘*Find*’および‘*Locate*’は、どち らも自動リバートしません。 Diredバッファーの自動リバートは、いくつかのシステムでは満足に機能しな いかもしれないことに注意してください。 18.6 自動保存-災害にたいする防御 ================================= Emacsは定期的に、visitしているファイルを、実際に使っているファイルを変更 せずに、別のファイルに自動的に保存するときがあります。これは“自動保存 (auto-saving)”と呼ばれます。これはシステムがクラッシュしたとき、失われて しまう作業をある程度以下に制限するためのものです。 Emacsが自動保存するときだと決定すると、各バッファーを判断して、それら のバッファーの自動保存が有効で、最後に自動保存されてから変更されている場 合は、自動保存します。ファイルが実際に自動保存されている場合は、自動保存 の間、エコーエリアに‘Auto-saving...’というメッセージが表示されます。自動 保存の間のエラーはキャッチされるので、ユーザーがタイプして実行したコマン ドに、干渉することはありません。 18.6.1 自動保存ファイル ----------------------- 自動保存は通常、visitしているファイルへの保存はしません。なぜなら永続化 したくない変更を保存するのは、好ましくないからです。そのかわりに、自動保 存は“auto-saveファイル”と呼ばれる別のファイルに保存し、visitしているファ イルへの変更は、保存を明示的に要求したとき(‘C-x C-s’など)に行います。 auto-saveファイルの名前は通常、visitしているファイル名の前後に‘#’をつ けて作られます。したがって‘foo.c’というファイルをvisitしているバッファー は、‘#foo.c#’というファイルに自動保存されます。ファイルをvisitしていない バッファーのほとんどは、明示的に要求した場合だけ自動保存されます。それら のバッファーが自動保存されるとき、auto-saveファイル名は、バッファー名の 前後に‘#’をつけて、その後ろに数字と文字を付け加えて一意な名前にします。 たとえば送信メッセージを作成する‘*mail*’バッファーは、‘#*mail*#704juu’の ような名前のファイルに、自動保存されます。Emacsの一部(関数 ‘make-auto-save-file-name’および‘auto-save-file-name-p’)を違った方法で再 プログラムしない限り、auto-saveファイル名はこの方法で作成されますバッフ ァーの自動保存に使われるファイル名は、そのバッファーの自動保存をオンにし たときに計算されます。 変数‘auto-save-file-name-transforms’は、auto-saveファイル名をある程度 制御することを許します。これに一連の正規表現を指定して置換することにより 、auto-saveファイル名を変更します。デフォルト値は、リモートのファイル (*note Remote Files::を参照してください)を、ローカルマシンの一時ディレク トリーのauto-saveファイルに変換します。 大きなバッファーから大量のテキストを削除したとき、そのバッファーにた いする自動保存は一時的にオフになります。これは、もしテキストをうっかり削 除してしまった場合、それがauto-saveファイルに含まれていて、そこから探せ る方が便利だからです。これが発生した後、再び自動保存を有効にするには、バ ッファーを‘C-x C-s’で保存するか、‘C-u 1 M-x auto-save-mode’を使います。 別のauto-saveファイルではなく、visitしているファイル自体に自動保存し たい場合は、グローバルなマイナーモード‘auto-save-visited-mode’を有効にし ます。このモードでは、自動保存は明示的な保存と等価です。このモードは上述 の‘auto-save’と直交(orthogonal)するモードであり、両方同時に有効にできる ことに注意してください。しかし、いくつかのバッファーで‘auto-save’モード がアクティブで、かつ時代遅れの‘auto-save-visited-file-name’変数が非 ‘nil’値の場合、そのバッファーは‘auto-save-visited-mode’の影響を受けない でしょう。 ‘auto-save-visited-mode’モードの自動保存処理の間隔は、変数 ‘auto-save-visited-interval’を使用してカスタマイズできます。 ‘auto-save-interval’と‘auto-save-timeout’は、‘auto-save-visited-mode’に 影響を与えません。これらの変数の詳細は、*note Auto Save Control::を参照 してください。 バッファーのauto-saveファイルは、そのバッファーをvisitしているファイ ルに保存したとき削除されます(変数‘delete-auto-save-files’を‘nil’にセット することにより、これを禁じることができます)。‘C-x C-w’または ‘set-visited-file-name’で、visitされているファイル名を変更することにより 、あたらしくvisitされているファイル名にもとづいてauto-saveファイル名はリ ネームされます。 18.6.2 自動保存の制御 --------------------- ファイルをvisitする度に、そのファイルバッファーの自動保存は、オンになり ます(バッチモードでは異なります。*note Initial Options::を参照してくださ い)。この変数のデフォルトは‘t’なので、ファイルをvisitしているバッファー の自動保存は通常、常に行われます。現在のバッファーの自動保存を切り替える には、‘M-x auto-save-mode’とタイプします。Auto Saveモードはバッファーロ ーカルに動作するマイナーモードです(*note Minor Modes::を参照してください )。 Emacsは最後に自動保存されてから何文字タイプしたかにもとづいて、定期的 に自動保存を行います。変数‘auto-save-interval’は、自動保存と自動保存の間 に何文字タイプされたかを指定します。デフォルトは300です。Emacsは小さすぎ る値は受け付けません。‘auto-save-interval’を20より小さな値にカスタマイズ した場合、Emacsは20と指定されたかのように振る舞います。 自動保存はタイピングをストップしたときも行われます。デフォルトでは 30秒アイドル状態が続くと実行されます。(このときEmacsはガベージコレクショ ンも実行します; *note (elisp)Garbage Collection::を参照してください)。こ の間隔を変更するには、変数‘auto-save-timeout’をカスタマイズします。実際 の実行間隔は、現在のバッファーの大きさに応じて長くなります。これは、自動 保存が実感できるほど時間がかかるような大きなバッファーを編集しているとき は、それをなるべく無くすようにする狙いです。アイドル状態のときの自動保存 は、2つの事を達成します。最初に、端末を少しの間離れるときなどに、すべて の作業の保存を保証します。次に、実際にタイプしているときは自動保存を避け ます。 ‘auto-save-visited-mode’が有効なとき、Emacsはアイドル5秒後に、ファイ ルをvisitしているバッファーを自動保存するでしょう。アイドル時の間隔は、 変数‘auto-save-visited-interval’でカスタマイズできます。 Emacsは、致命的なエラーが発生したときも自動保存を行います。これには ‘kill %emacs’のようなコマンドによるEmacsジョブのkill、電話回線やネットワ ーク回線の切断が含まれます。 コマンド‘M-x do-auto-save’により、明示的に自動保存を行うことができま す。 18.6.3 自動保存からのデータ復旧 ------------------------------- コマンド‘M-x recover-file FILE ’により、auto-saveファイルの内 容を使って、失われたデータを復旧できます。これはFILEをvisitして、(確認を 求めた後で)auto-saveファイル‘#FILE#’の内容をリストアします。その後‘C-x C-s’で復旧したテキストを、FILE自身に保存できます。たとえばファイル ‘foo.c’を、そのauto-saveファイル‘#foo.c#’で復旧するには、以下のようにし ます: M-x recover-file foo.c yes C-x C-s ‘M-x recover-file’は確認を求める前に、指定したファイルとauto-saveファ イルのあるディレクトリー一覧を表示するので、ファイルのサイズや日付を確認 できます。auto-saveの方が古い場合、‘M-x recover-file’はそれを読み込むよ うに提案しません。 Emacsまたはコンピューターがクラッシュしたとき、‘M-x recover-session’コ マンドで編集していたすべてのファイルを、それらのauto-saveファイルで復旧 できます。これは最初に中断されたセッションの記録された一覧を表示します。 ポイントを移動して選択してから、‘C-c C-c’をタイプします。 ‘recover-session’は、そのセッションの間に編集されていた各ファイルにつ いて、ファイルを復旧するか尋ねます。‘y’と応えると‘recover-file’を呼び出 し、通常の方法で復旧を行います。これは元のファイルとauto-saveファイルの 日付を表示して、ファイルの復旧を行うかもう1度尋ねます。 ‘recover-session’が完了すると、復旧を選択したファイルがEmacsバッファ ーに表示されます。実際にファイル自体を 更新するためには、これらを保存す るのが唯一の方法です。 Emacsは中断されたセッションについての情報を、ディレクトリー ‘~/.emacs.d/auto-save-list/’の、‘.saves-PID-HOSTNAME~’という名前のファイ ルに記録します。‘auto-save-list-file-prefix’を‘nil’にセットすると、復旧 用にセッションが記録されなくなります。 18.7 ファイルのエイリアス ========================= シンボリックリンクとハードリンクは、同じファイルを参照するためにいくつか の名前を使うことを可能にします。ハードリンクは、ファイルを直接参照する他 の名前です。それらすべての名前は同じように有効で、それらの間に優先順位は ありません。対照的にシンボリックリンクは、ある種の定義されたエイリアス (別名)です。‘foo’が‘bar’へのシンボリックリンクの場合、そのファイルをどち らの名前でも参照できますが、‘bar’が実際の名前で、‘foo’はエイリアスに過ぎ ません。シンボリックリンクがディレクトリーを指すときは、さらに複雑なケー スが発生します。 Emacsがすでに異なる名前でvisitしている場合、通常はエコーエリアにメッ セージを表示して、そのファイルをvisitしている既存のバッファーを使います 。これはハードリンクおよびシンボリックリンクをサポートしているシステム、 または長いファイル名を切り詰めるシステムで長い名前のファイルを使っている 場合、またはファイル名の大文字小文字を区別しないシステムで発生します。変 数‘find-file-suppress-same-file-warnings’を非‘nil’値にセットすることによ り、メッセージを表示しないようにできます。変数 ‘find-file-existing-other-name’を‘nil’にセットすれば、この機能全体を無効 にできます。その場合、同じファイルを異なる名前でvisitすると、それぞれの ファイル名で別々のバッファーが使われます。 変数‘find-file-visit-truename’が非‘nil’の場合、バッファー用に記録され るファイル名は、指定した名前ではなく、ファイルの“本当の名前”(これはすべ てのシンボリックリンクを対象の名前で置き換えて作られます)が使われます。 ‘find-file-visit-truename’をセットするは、 ‘find-file-existing-other-name’にも暗に影響します。 シンボリックリンクを通じてアクセスされるようなディレクトリーにたいし ては通常、優先的にリンクされた名前をEmacsに表示させたいときがあります。 これを行うには‘directory-abbrev-alist’をカスタマイズします。このリストの 各要素は‘(FROM . TO)’という書式です。これはディレクトリー名にFROMが出現 したときは常に、FROMをTOで置き換えることを意味します。文字列FROMは正規表 現です(*note Regexps::を参照してください)。正規表現はディレクトリー名の 最初の文字にマッチさせる必要があるので、‘\`’で始まります(埋め込みの改行 をサポートするディレクトリー名の場合は、‘^’で無効にします)。TOには同じデ ィレクトリーを指す、絶対パスによる普通のディレクトリー名を指定する必要が あります。文字列TOでホームディレクトリーを指定するのに、‘~’を使用しない でください。Emacsはこれらの変換を個別に行います。以下は通常シンボリック リンク‘/fsf’でアクセスされる、‘/home/fsf’を指定する例です: (("\\`/home/fsf" . "/fsf")) 18.8 ファイルディレクトリー =========================== ファイルシステムは、ファイルを“ディレクトリー”にグループ化します。“ディ レクトリーリスト”は、ディレクトリーに含まれるファイルのリストです。 Emacsはディレクトリーを作成および削除するコマンドを提供し、簡単な形式(フ ァイル名のみ)、および詳細な形式(サイズ、日付、その他の属性を含む)のディ レクトリーリストを作成します。EmacsにはDiredと呼ばれるディレクトリーブラ ウザーも含まれています。詳細は*note Dired::(‘C-x d’で呼び出せる)を参照し てください。 ‘C-x C-d DIR-OR-PATTERN ’ 簡単なディレクトリーリストを表示します(‘list-directory’)。 ‘C-u C-x C-d DIR-OR-PATTERN ’ 詳細なディレクトリーリストを表示します。 ‘M-x make-directory DIRNAME ’ DIRNAMEという名前の新しいディレクトリーを作成します。 ‘M-x delete-directory DIRNAME ’ DIRNAMEという名前のディレクトリーを削除します。もし空でない場合、そ れらを再帰的に削除するか尋ねます。 ディレクトリーリストを表示するコマンドは、‘C-x C-d’ (‘list-directory’)です。これはミニバッファーを使って、リストを表示するデ ィレクトリーと、リストするファイルを指定するワイルドカードが含まれたパタ ーンの両方により、ファイル名を読み取ります。たとえば C-x C-d /u2/emacs/etc これはディレクトリー‘/u2/emacs/etc’のファイルをリストします。以下はファ イル名のパターンを指定する例です。 C-x C-d /u2/emacs/src/*.c 通常、‘C-x C-d’は名前だけを含む、簡単なディレクトリーリストを表示しま す。数引数(値は関係なし)は、サイズ、日付、所有者を含む詳細な一覧を作成す るよう指示します。 ディレクトリーリストのテキストは、主に下位プロセスとして‘ls’を実行す ることにより取得されます。2つのEmacs変数が、‘ls’に指定するスイッチを制御 します。‘list-directory-brief-switches’には、簡単な一覧に使うためのスイ ッチを文字列で指定します(デフォルトは‘"-CF"’)。 ‘list-directory-verbose-switches’には、詳細な一覧に使うためのスイッチを 文字列で指定します(デフォルトは‘"-l"’)。 詳細なディレクトリー一覧では、Emacsはディレクトリーが含まれるディスク の空き容量についての情報を追加します。変数 ‘directory-free-space-program’および‘directory-free-space-args’を通じて 、ローカルファイルシステムにたいしてこれが行われる方法をカスタマイズでき ます。‘directory-free-space-program’には実行するプログラム(デフォルトは ‘df’)、そのプログラムに渡す引数は‘directory-free-space-args’(デフォルト はシステム依存)を指定します(MS-WindowsおよびMS-DOSでは、これら2つの変数 は無視され、同様な機能をもつEmacsの内部実装がかわりに使用される)。 コマンド‘M-x delete-directory’は、ミニバッファーを使ってディレクトリ ー名の入力を求め、空のときはディレクトリーを削除します。ディレクトリーが 空でない場合、再帰的に削除するか確認を求めます。“Trash(ごみ箱)”(または “Recycle Bin”)の機能をもつシステムでは、変数 ‘delete-by-moving-to-trash’を‘t’に変更することにより、指定したディレクト リーを無条件に削除するかわりに、ごみ箱に移動します。ごみ箱の使い方につい ての情報は、*note Misc File Ops::を参照してください。 18.9 ファイルの比較 =================== コマンド‘M-x diff’は、ミニバッファーを使って2つのファイル名の入力を求め 、‘*diff*’という名前のバッファーに、2つのファイルの違いを表示します。こ れは‘diff’プログラムに、変数‘diff-switches’で指定されたオプションを指定 して実行することにより機能します。‘diff-switches’には文字列を指定します 。デフォルトはunified context diff形式を指定する‘"-u"’です。プログラムに ついての情報は、*note Diff: (diffutils)Top.を参照してください。 ‘diff’コマンドの出力は、Diffモードと呼ばれるメジャーモードを使って表 示されます。*note Diff Mode::を参照してください。 (より高機能な)代替物は‘M-x ediff’です(*note Ediff: (ediff)Top.を参照 )。 コマンド‘M-x diff-backup’は指定したファイルと、そのファイルの一番最近 のバックアップを比較します。バックアップファイル名を指定したときは、 ‘diff-backup’は指定されたバックアップファイルと、それの元となるファイル を比較します。それ以外の点は‘M-x diff’と同じです。 コマンド‘M-x diff-buffer-with-file’は指定されたバッファーと、それに対 応するファイルを比較します。これはバッファーを保存すると、ファイルにどの ような変更がされるかを表示します。 コマンド‘M-x compare-windows’はカレントウィンドウと、カレントウィンド ウの前に選択されていたウィンドウを比較します(Emacsのウィンドウについての 詳細は、*note Windows::を参照してください)。比較はそれぞれのウィンドウの ポイント位置から、それぞれのバッファーのポイントの初期位置を、対応するバ ッファーのマークリング(*note Mark Ring::を参照)にpushした後に開始されま す。それから各ウィンドウのポイントを1文字ずつ前方に移動していきます。文 字がマッチしなくなるとコマンドは終了します。 コマンドを開始したとき、2つのウィンドウのポイントの後ろのテキストがマ ッチしない場合、‘M-x compare-windows’は2つのウィンドウでマッチするテキス トが見つかるまでポイントを進めてから終了します。したがって‘M-x compare-windows’を繰り返し使うと、毎回1つのマッチする範囲をスキップする か、次の開始点を探します。 数引数を指定すると、‘compare-windows’は空白文字の違いを無視します。変 数‘compare-ignore-case’が非‘nil’の場合、大文字小文字の違いを無視して比較 します。変数‘compare-ignore-whitespace’が非‘nil’の場合、 ‘compare-windows’はデフォルトでは空白文字の違いを無視しますが、数引数が 指定されたときは、その回のコマンド呼び出しでは、これをオフにします。 ‘M-x smerge-mode’を使って、Smergeモードに切り替えることができます。こ れは‘diff3’プログラムの出力を編集するマイナーモードです。これは通常、バ ージョン管理システムと、バージョン管理システムの外でのupdateをマージする とき、ファイルへの変更が競合して失敗した結果です。Smergeモードは特定の変 更を選択することにより、競合を解決するコマンドを提供します。 ファイルをマージする強力なインターフェースを提供するEmerge機能につい ては、 *note Emerge::を参照してください。 18.10 Diffモード ================ Diffモードは、‘M-x diff’や他の同様なコマンドの出力のために使用されるメジ ャーモードです。この種の出力は“patch”と呼ばれます。なぜならそれが特定の 変更を自動的に適用するために、‘patch’コマンドに渡されるからです。手動で Diffモードを選択するには、‘M-x diff-mode’とタイプします。 パッチに指定された変更は、“hunk(欲張り)”にグループ化されます。これは 変更された行を1行以上含むテキストと、それに隣接するテキストです。 hunksもまた、変更のコンテキストを提供するために、変更されていない行も含 みます。それぞれのhunkには“hunkヘッダー”が前についていて、これはhunkの変 更が発生した、古い行番号と、新しい行番号が指定されます。Diffモードは実際 のhunkの内容と区別するため、hunkヘッダーをハイライトします。 パッチ内の最初のhunkの前にはファイルヘッダーがあり、それはそのファイ ルの新たなバージョンと古いバージョンの名前と、それらのタイムスタンプを示 します。パッチが複数ファイルの変更を表す場合、各ファイルがそのファイルの 変更の最初のhunkの前にそのようなヘッダーをもつことになります。 他のバッファーと同様に、Diffモードのバッファーを編集することができま す(もし読み込み専用の場合、最初にそれを書き込み可にする必要があります。 *note Misc Buffer::を参照のこと)。hunkを編集すると、Diffモードはpatchを 正しい状態に保ち、‘patch’により正しく適用できるように、hunkヘッダーの行 番号を自動的に修正しようと試みます。自動的な行番号の修正を無効にするには 、変数‘diff-update-on-the-fly’を‘nil’に変更してください。 Diffモードは、‘C-x `’やエラーメッセージを処理する他のコマンドによりコ ンパイラーのエラーメッセージとして扱われるようにhunkをアレンジします (*note Compilation Mode::を参照)。したがって、対応するソースの位置を visitするために、Compilationモードのコマンドを使用できます。 それに加えてDiffモードは、移動、操作、patchの一部を適用するために、以 下のコマンドを提供します: ‘M-n’ 次のhunk-startに移動します(‘diff-hunk-next’)。プレフィクス引数を指 定した場合は、次のN番目のhunkに前方へ移動します。 このコマンドには副作用があります。これは移動先のhunkを“refines(不純 物を取り除く)”して、よりよい粒度で変更をハイライトします。この機能 を無効にするには‘M-x diff-auto-refine-mode’とタイプして、マイナーモ ードのDiff Auto-Refineモードをオフに切り替えます。デフォルトでDiff Auto-Refineモードを無効にするには、以下をinitファイルに追加します (*note Hooks::を参照してください): (add-hook 'diff-mode-hook (lambda () (diff-auto-refine-mode -1))) ‘M-p’ 前のhunkが開始される位置に移動します(‘diff-hunk-prev’)。プレフィク ス引数を指定した場合は、前のN番目のhunkに後方へ移動します。これは ‘M-n’と同様、Diff Auto-Refineモードが無効でなければ、移動先のhunkを refiningする副作用があります。 ‘M-}’ 複数ファイルへのpatchで、次のファイルが開始される位置に移動します (‘diff-file-next’)。プレフィクス引数を指定した場合は、次のN番目のフ ァイルの先頭へ、前方に移動します。 ‘M-{’ 複数ファイルへのpatchで、前のファイルが開始される位置に移動します (‘diff-file-prev’)。プレフィクス引数を指定した場合は、前のN番目のフ ァイルの先頭へ、後方に移動します。 ‘M-k’ ポイントがある位置のhunkをkillします(‘diff-hunk-kill’)。 ‘M-K’ 複数ファイルへのpatchで、現在のファイル部分をkillします (‘diff-file-kill’)。 ‘C-c C-a’ そのhunkを、ターゲットファイルに適用します(‘diff-apply-hunk’)。 ‘C-u’によるプレフィクス引数を与えた場合は、このhunkをリバート(“新し い”バージョンを“古い”バージョンに変更するリバースhunkを適用する)し ます。‘diff-jump-to-old-file’が非‘nil’なら、かわりにsのhunkを“古い ”バージョンに適用します。 ‘C-c C-b’ ポイント位置のhunkの変更を、よりよい粒度でハイライトします (‘diff-refine-hunk’)。これにより変更された各行について実際に変更さ れた箇所を確実に見ることができます。 ‘C-c C-c’ そのhunkに対応するソースファイルの該当行にジャンプします (‘diff-goto-source’)。デフォルトでは、ファイルヘッダーの最初に示さ れる、“新しい”バージョンのファイルにジャンプします。プレフィクス引 数を与えた場合は、かわりに“古い”バージョンにジャンプします。 ‘diff-jump-to-old-file’が非‘nil’なら、このコマンドはデフォルトで“古 い”バージョンにジャンプし、プレフィクス引数の意味も逆になります。プ レフィクス引数が8より大(たとえば‘C-u C-u C-c C-c’とタイプした場合 )なら、このコマンドは次回呼び出しにたいして ‘diff-jump-to-old-file’のセットも行います。 ‘C-c C-e’ このパッチでEdiffセッションを開始します。*note Ediff: (ediff)Top.を 参照してください。 ‘C-c C-n’ 表示を現在のhunkに制限します(‘diff-restrict-view’)。*note Narrowing::を参照してください。プレフィクス引数を指定すると、複数フ ァイルへのpatchで、表示を現在のファイルに制限します。制限を解除する には、‘C-x n w’ (‘widen’)を使います。 ‘C-c C-r’ バッファー全体にたいする比較方向を逆転します (‘diff-reverse-direction’)。プレフィクス引数を与えた場合は、カレン トリージョンの内部でのみ方向を逆転します(*note Mark::を参照)。方向 の逆転とは、hunkとファイル冒頭のヘッダーを、“新しい”バージョンから “古い”バージョンにするパッチを生成するように変更することを意味しま す。 ‘C-c C-s’ ポイント位置でhunkを2つの別個のhunkに分割します (‘diff-split-hunk’)。これはhunkヘッダーの挿入ち、カレントhunkのヘッ ダーの変更を行います。これは手動でpatchを編集するために有用で、 ‘diff’プログラムに‘-u’または‘--unified’オプションを指定して生成され た、“unified diff format(統一diffフォーマット)”だけで機能します。 ‘diff’に‘-c’または‘--context’オプションを指定して生成された、 “context diff format(コンテキストdiffフォーマット)”のhunkを分割する には、最初に‘C-c C-u’で、バッファーをunified diff formatに変換する 必要があります。 ‘C-c C-d’ バッファー全体を、“context diff format”に変換します (‘diff-unified->context’)。プレフィクス引数を指定すると、リージョン のhunkだけを変換します。 ‘C-c C-u’ バッファー全体をunified diff formatに変換します (‘diff-context->unified’)。プレフィクス引数を指定すると、unified formatからcontext formatに変換します。マークがアクティブのときは、 リージョンのhunkだけを変換します。 ‘C-c C-w’ 空白文字の変更を無視して、カレントhunkを再生成します (‘diff-ignore-whitespace-hunk’)。 ‘C-x 4 A’ それぞれのhunkについて、‘C-x 4 a’が行うようにChangeLog(*note Change Log::を参照してください)のエントリーを生成します (‘diff-add-change-log-entries-other-window’)。これは、あとで実際に 変更の説明を記入できるように、変更ログの雛形を作ります。Diffモード での‘C-x 4 a’自体は、現在のhunkのファイルのためのものですが、関数名 はpatch自体から取得します。これはpatchにより削除される関数のための 、ログエントリーを作るのに有用です。 patchには変更された行の行末に、無意識に入力された望んでいない空白文字 が含まれている場合があります。この問題を扱うには2つの方法があります。1つ 目はDiffバッファーでWhitespaceモード(*note Useless Whitespace::を参照し てください)を有効にする方法で、これは自動的に変更された行の行末にある空 白文字をハイライトします。2つ目はコマンド‘M-x diff-delete-trailing-whitespace’を使う方法で、patchにより変更された行の 行末の空白文字を検索して、patchとpatchされたソースファイルの両方からそれ を取り除きます。このコマンドは変更を保存しないので、ユーザーが変更を保存 するか決定することができます(変更されたファイルはエコーエリアに表示され ます)。プレフィクス引数を指定すると、patchされた(“新しい”)ファイルではな く、元の(“古い”)ソースファイルを変更しようと試みます。 18.11 ファイルのコピー、命名、リネーム。 ======================================== Emacsにはファイルをコピー、命名、リネームするためのコマンドがいくつかあ ります。これらはすべてミニバッファーを使用してOLD(またはTARGET)とNEWの 2つのファイル名を読み取り、それらをコピー、またはファイル名に調整します 。これらのコマンドは、ワイルドカードを含むファイル名は許容しません。 これらすべてのコマンドは、引数NEWが単なるディレクトリー名(*note (elisp)Directory Names::を参照)の場合には、そのディレクトリーを実際の新 しい名前として、OLDをそれの非ディレクトリー成分とします。たとえば、コマ ンド‘M-x rename-file ~/foo /tmp/ ’は、‘~/foo’を ‘/tmp/foo’にリネームします。GNU、およびその他のPOSIXシステムでは、ディレ クトリー名は‘/’で終端されます。 これらのコマンドはすべて、新しいファイル名がすでに存在する場合は確認 を求めます。 ‘M-x copy-file’はファイルOLDのコンテンツを、ファイルNEWにコピーします 。 ‘M-x copy-directory’は、シェルコマンド‘cp -r’と同じようにディレクトリ ーをコピーします。NEWがディレクトリー名の場合、このコマンドはOLDディレク トリーのコピーを作成して、それをNEWの下に配します。それ以外では、このコ マンドはOLDのコンテンツを、新しいNEWという名前のディレクトリーにすべてコ ピーします。 ‘M-x rename-file’は、ファイルOLDをNEWにリネームします。すでにファイル 名NEWが存在する場合、確認に‘yes’と答えなければリネームは行われません。な ぜなら、名前NEWの古い内容が失われてしまうからです。OLDとNEWが異なるファ イルシステム上にある場合は、ファイルOLDがコピーされた後に削除されます。 ファイルがバージョンコントロール(*note Version Control::を参照してく ださい)の配下にある時は、‘M-x rename-file’のかわりに ‘M-x vc-rename-file’を使ってリネームします。*note VC Delete/Rename::を参 照してください。 ‘M-x add-name-to-file’は、既存のファイルの古い名前を削除せずに、新し い名前を追加します。新しい名前は、既存のファイルのハードリンクとして作成 されます。新しい名前は、そのファイルがあるのと同じファイルシステムになけ ればなりません。MS-Windowsでは、このコマンドはファイルがNTFSファイルシス テムにあるときだけ機能します。MS-DOS、およびその他いくつかのリモートシス テムタイプでは、ファイルをコピーすることにより機能します。 ‘M-x make-symbolic-link’は、TARGETを指すNEWという名前のシンボリックリ ンクを作成します。これにより、今後NEWというファイルを開こうとすると、そ の時点でTARGETという名前のファイルが何であれ、ファイルのオープンが行われ たときは、そのファイルを開きます。その時点でTARGETという名前のファイルが 存在しないときはエラーになります。このコマンドは引数TARGETを展開しないの で、リンクの対象を相対パスで指定できます。しかし、このコマンドはTARGET内 の先頭の‘~’は展開するので、簡単にホームディレクトリーを指定できます。ま た、先頭の‘/:’は取り除くので、リテラル‘~’および‘/:’で始まる相対パスを指 定することができます。*note Quoted File Names::を参照してください。 MS-Windowsでは、このコマンドはMS Windows Vista以降だけで機能します。 NEWがリモートのときは、そのシステムタイプに依存して機能します。 18.12 その他のファイル操作 ========================== Emacsには、ファイルを操作する他のコマンドがたくさん存在します。それらは すべて1つのファイルを操作します。ファイル名にワイルドカードは指定できま せん。 ‘M-x delete-file’はファイルの入力を求め、そのファイルを削除します。 1つのディレクトリーにある、複数のファイルを削除する場合、‘delete-file’よ りDiredを使う方が便利でしょう。*note Dired Deletion::を参照してください 。 ‘M-x move-file-to-trash’は、ファイルをシステムの“Trash”(または “Recycle Bin”)に移動します。この機能は、ほとんどのオペレーティングシステ ムで利用可能です。Trashに移動されたファイルは、後で気が変わったとき元に 戻すことができます(trashに移動されたファイルのリストアはシステムに依存す る)。 デフォルトでは、Emacsの削除コマンドはTrashを_使いません_。一般的な削 除コマンドでTrash(それが利用可能な場合)を使うには、変数 ‘delete-by-moving-to-trash’を‘t’に変更します。これはコマンド‘M-x delete-file’と‘M-x delete-directory’ (*note Directories::を参照してくだ さい)、およびDired (*note Dired Deletion::を参照してください)の削除コマ ンドに影響を与えます。‘M-x delete-file’および‘M-x delete-directory’にプ レフィクス引数を与えると、‘delete-by-moving-to-trash’の値にかかわらず、 Trashを使わずに完全に削除します。 ファイルがバージョンコントロール(*note Version Control::を参照してく ださい)の配下にある時は、‘M-x delete-file’のかわりに‘M-x vc-delete-file’を使って、ファイルを削除します。*note VC Delete/Rename::を 参照してください。 ‘M-x insert-file’(‘C-x i’も)は、指定したファイルの内容のコピーを、現 在のポイント位置に挿入し、ポイントの位置は変更せずに挿入された内容の前に 残します。挿入した内容の後の位置はマークリングに追加され、マークは非アク ティブになります(*note Mark Ring::を参照してください)。 ‘M-x insert-file-literally’も‘M-x insert-file’と同様ですが、ファイル はliterally(そのまま)挿入されます。つまり‘M-x find-file-literally’コマン ド(*note Visiting::を参照してください)と同様に、特別なエンコーディングや 変換なしに、ASCII文字の並びとして扱われます。 ‘M-x write-region’は‘M-x insert-file’の逆です。このコマンドはリージョ ンの内容を、指定されたファイルにコピーします。‘M-x append-to-file’はリー ジョンのテキストを、指定されたファイルの末尾に加えます。*note Accumulating Text::を参照してください。変数 ‘write-region-inhibit-fsync’の値は、これらのコマンドおよびファイルの保存 に影響を与えます。*note Customize Save::を参照してください。 ‘M-x set-file-modes’はファイル名と、その後に“ファイルモード(file mode)”を読み込んで、指定されたファイルにそのファイルモードを適用します。 ファイルモード(または“ファイルパーミッション(file permissions)”とも呼ば れます)は、ファイルが読み込み可能か、書き込み可能か、実行可能か、そして それは誰にたいしてなのかを決定します。このコマンドは、‘chmod’コマンドに 指定する形式の、シンボルまたは8進のファイルモードを読み取ります。たとえ ば‘u+x’は、そのファイルを所有するユーザーに実行可能の権限を追加すること を意味します。ファイルモードをサポートしないオペレーティングシステムでは 、効果はありません。‘chmod’はこの関数の便利なエイリアスです。 18.13 圧縮ファイルへのアクセス ============================== Emacsは、圧縮されたファイルをvisitするとき、自動的に解凍します。また、そ れらのファイルを変更して保存するときも、自動的に再圧縮します。Emacsは圧 縮ファイルを名前で認識します。ファイル名が‘.gz’で終わっていれば、それは ファイルが‘gzip’で圧縮されていることを示します。他の拡張子の場合は、他の 圧縮プログラムを示します。 自動的な解凍と圧縮は、Emacsがファイル内容を操作するすべてに適用されま す。これにはvisit、保存、内容のバッファーへの挿入、ロード、バイトコンパ イルが含まれます。 この機能を無効にするには、コマンド‘M-x auto-compression-mode’とタイプ します。変数‘auto-compression-mode’をカスタマイズすることにより、永続的 に無効にすることができます。 18.14 ファイルアーカイブ ======================== 名前が‘.tar’で終わるファイルは通常、‘tar’プログラムで作られた“アーカイブ ”です。Emacsはそれらを、Tarモードと呼ばれる特別なモードで表示します。こ れは内容をDiredに似たリストで提供します(*note Dired::を参照してください )。リストの移動はDiredのときと同様で、アーカイブに含まれるファイルを visitできます。しかしTarモードでは、Diredコマンドのすべてが利用可能では ありません。 Auto Compressionモードが有効な場合(*note Compressed Files::を参照して ください)、Tarモードは圧縮アーカイブ(ファイルの拡張子が‘.tgz’、 ‘.tar.Z’、‘.tar.gz’)も使うことができます。 キー‘e’、‘f’、はすべて、ファイルをファイル自身のバッファーに展開 します。それをバッファーで編集して、バッファーを保存すると、編集されたバ ージョンでTarバッファーのものを置き換えます。Tarバッファーでファイル名を マウスでクリックしても、同様なことが行えます。‘v’はファイルをバッファー にViewモードで展開します(*note View Mode::を参照してください)。‘o’は、フ ァイルを展開して他のウィンドウで表示するので、ファイルの編集とアーカイブ の操作を同時に行うことができます。 キー‘I’は、新しい(標準)ファイルをアーカイブに追加します。ファイルは最 初は空ですが、上記のコマンドを使用してすぐに編集することができます。この コマンドはカレントのファイルの前に新しいファイルを挿入するので、Tarバッ ファーの最上行で使用すると、新しいファイルがアーカイブの最上行となり、バ ッファーの最後で使用すると、新しいファイルがアーカイブの最下行になります 。 Diredと同様に、‘d’は後で‘x’を使ったときにファイルを削除するためにマー クし、‘u’はマークを外します。‘C’はファイルをアーカイブからディスクにコピ ーし、‘R’はアーカイブのファイルをリネームします。‘g’はバッファーをディス ク上のアーカイブでリバートします。キー‘M’、‘G’、‘O’は、ファイルのパーミ ッションビット、グループ、所有者を変更します。 Tarバッファーの保存により、構成要素に変更が施された、新しいバージョン のアーカイブをディスクに書き込みます。 Tarモードを使うのに、‘tar’プログラムは必要ありません。Emacsは直接アー カイブを読み込みます。しかし圧縮アーカイブへのアクセスには、適切な解凍プ ログラムが必要です。 ‘arc’、‘jar’、‘lzh’、‘zip’、‘rar’、‘7z’、‘zoo’、および自己解凍実行形 式の‘exe’には、互いに似通った異なるArchiveモードが使われます。 ArchiveモードのキーバインドはTarモードと同様で、それに加えてキー‘m’は 後に続く操作のためにファイルをマークし、‘M-’はマークされたファイル のマークをすべて外します。キー‘a’は、1行に収まらないようなアーカイブの、 詳細なファイル情報の表示を切り替えます。ファイルのリネーム、ファイルモー ドや所有者の変更をサポートするアーカイブ書式は、いくつかに限られます。 Tarモードとは異なり、Archiveモードはアーカイブの展開と格納に、アーカ イブプログラムを実行します。しかし、展開したりアーカイブ内のファイルを操 作するときだけこれらのプログラムが必要で、アーカイブの目録を見るには必要 ありません。プログラム名とセットできるオプションの詳細は、Customizeグル ープ‘Archive’でセットできます(*note Customization Groups::を参照してくだ さい)。 18.15 リモートファイル ====================== 他のマシンにあるファイルを、特別なファイル名構文を使って参照できます: /METHOD:HOST:FILENAME /METHOD:USER@HOST:FILENAME /METHOD:USER@HOST#PORT:FILENAME このリクエストを発行するために、Emacsは‘ssh’のような、リモートログインプ ログラムを使います。どのmethodを使うかは、常にファイル名で指定しなければ なりません。たとえば‘/ssh:USER@HOST:FILENAME’は‘ssh’を使います。ファイル 名のmethodに擬似methodの‘-’を使用したとき、Emacsは以下によりmethodを選択 します: 1. ホスト名が‘ftp.’(ドット付き)で始まるとき、EmacsはFTPを使います。 2. ユーザー名が‘ftp’または‘anonymous’のとき、EmacsはFTPを使います。 3. 変数‘tramp-default-method’が‘ftp’にセットされているとき、Emacsは FTPを使います。 4. ‘ssh-agent’が実行されているとき、Emacsは‘scp’を使います。 5. 上記以外の場合、Emacsは‘ssh’を使います。 変数‘tramp-mode’を‘nil’にセットすることにより、リモートファイル名の機能 を完全にオフにすることができます。個別のケースについて機能をオフにするに は、ファイル名を‘/:’でクォートします(*note Quoted File Names::を参照して ください)。 FTPを通じたリモートファイルへのアクセスは、以下で説明するAnge-FTPパッ ケージで処理されます。他の方法によりリモートファイルへのアクセスは Trampパッケージにより処理され、これにはそれ自身のマニュアルがあります。 *note The Tramp Manual: (tramp)Top.を参照してください。 Ange-FTPパッケージでは、リモートファイル名にユーザー名USERがしている ときは、FTPを通じてその名前でログインします。USERが指定されていないとき 、Emacsはローカルシステムのユーザー名でログインします。しかし変数 ‘ange-ftp-default-user’に文字列がセットされているときは、かわりにその文 字列を使用します。Emacsは、ログイン時にパスワードの入力も求めます。 パフォーマンス的な理由により、FTPを通じたファイルのアクセス時に、デフ ォルトではEmacsはバックアップファイルを作成しません。バックアップを作成 するには、変数‘ange-ftp-make-backup-files’を非‘nil’値に変更してください 。 デフォルトではリモートファイルの自動保存ファイルは、変数 ‘auto-save-file-name-transforms’で指定された、ローカルマシンの一時ディレ クトリーに作成されます。*note Auto Save Files::を参照してください。 匿名FTPでアクセスできるファイルをvisitするには、特別なユーザー名 ‘anonymous’または‘ftp’を使います。これらのユーザー名にたいするパスワード は、特別に処理されます。これは変数 ‘ange-ftp-generate-anonymous-password’により制御されます。この変数の値が 文字列の場合、その文字列がパスワードとして使用されます。非‘nil’(デフォル ト)の場合、‘user-mail-address’の値が使用されます。‘nil’の場合、Emacsは通 常どおりパスワードの入力を求めます(*note Passwords::を参照してください )。 セキュリティー上の理由で、リモートマシンとの間にある“ファイアーウォー ル(firewall)”により、ファイルにアクセスできないときがあります。対象ファ イルにアクセスできるマシンから“ゲートウェイ(gateway)”マシンにログインで きて、FTPサーバーがゲートウェイ機能をサポートしている場合は、リモートフ ァイル名を使うことができます。これを行うには変数 ‘ange-ftp-gateway-host’にゲートウェイマシンの名前をセットして、 ‘ange-ftp-smart-gateway’を‘t’にセットする必要があります。それ以外の場合 でもリモートファイル名が機能するようにできますが、その方法は複雑です。こ れらの方法は、‘M-x finder-commentary ange-ftp ’とタイプして読 むことができます。 18.16 ファイル名のクォート ========================== 特殊な文字や構文を含むファイルにたいする特別な効果を防ぐために、絶対ファ イル名を“クォート”できます。これを行うには先頭に‘/:’を追加します。 たとえばリモートにあるように見える名前の、ローカルなファイルの名前を クォートすることにより、リモートファイル名として扱われないようにすること ができます。したがって名前が‘/foo:’というディレクトリーがあり、そこに ‘bar’という名前のファイルがある場合、Emacsでは、そのファイルを ‘/:/foo:/bar’という名前で参照できます。 リモートファイル名もローカル部分の特殊文字だけをクォートしたい場合は ローカル部分だけをクォートできます。たとえば‘/ssh:baz:/:/foo:/bar’は、ホ スト‘baz’上のディレクトリー‘/foo:’のファイル‘bar’を参照します。 ‘/:’は、‘~’がユーザーのホームディレクトリーを意味する、特別な文字とし て扱われることを防ぐこともできます。たとえば‘/:/tmp/~hack’は、ディレクト リー‘/tmp’のファイル‘~hack’を参照します。 ‘/:’によるクォートは、ミニバッファーでの名前に‘$’を含むファイル名の入 力にも使用できます。これが機能するには、ミニバッファーの最初の内容が ‘/:’で始まらなければなりません(2回‘$’を記述することでも同様な効果が得ら れます。詳細は*note File Names with $::を参照してください)。 ファイルをvisitするときに、ワイルドカードをクォートすることもできます 。たとえば‘/:/tmp/foo*bar’は、ファイル‘/tmp/foo*bar’をvisitします。 同じ効果を得るための別の方法は、‘/tmp/foo[*]bar’と入力する方法です。 これは‘/tmp/foo*bar’だけにマッチするワイルドカード指定です。しかしクォー トしなくても同じ結果が得られるので、ワイルドカード文字をクォートする必要 がない場合がたくさんあります。たとえば‘/tmp’の中に‘foo’で始まり‘bar’で終 わるファイルが‘foo*bar’だけの場合、‘/tmp/foo*bar’と指定することにより、 ‘/tmp/foo*bar’だけをvisitすることができます。 18.17 ファイル名キャッシュ ========================== “ファイル名キャッシュ(file name cache)”により、ファイルがどこにあるか正 確に覚えていなくても、名前でファイルがどこにあるかを簡単に指定することが できます。ファイル名をミニバッファーでタイプするとき、‘C-’ (‘file-cache-minibuffer-complete’)で、ファイル名キャッシュを使ったファイ ル名を補完が行なわれます。‘C-’を繰り返すと、最初にタイプした内容か ら補完できる利用可能な候補を順番に表示します(しかし‘C-’文字は、多く のテキスト端末でタイプできないことに注意してください)。 ファイル名キャッシュは自動的に充填されません。かわりに以下のコマンド を使ってファイル名をキャッシュにロードします。 ‘M-x file-cache-add-directory DIRECTORY ’ DIRECTORYの各ファイルを、ファイル名キャッシュに加えます。 ‘M-x file-cache-add-directory-using-find DIRECTORY ’ DIRECTORYの各ファイルを、ファイル名キャッシュに加えるとともに、ネス トされたサブディレクトリーのすべてのファイルを、ファイル名キャッシ ュに加えます。 ‘M-x file-cache-add-directory-using-locate DIRECTORY ’ DIRECTORYの各ファイルを、ファイル名キャッシュに加えるとともに、ネス トされたサブディレクトリーのすべてのファイルを、ファイル名キャッシ ュに加えます。ファイルの検索には、‘locate’を使用します。 ‘M-x file-cache-add-directory-list VARIABLE ’ VARIABLEにリストされた各ディレクトリーのファイル名を、ファイル名キ ャッシュに加えます。VARIABLEはLisp変数で、‘load-path’と同様、値はデ ィレクトリーのリストです。 ‘M-x file-cache-clear-cache ’ キャッシュをクリアーして、すべてのファイル名を削除します。 ファイル名キャッシュは永続的ではありません。キャッシュが維持されるの はEmacsのセッションの間だけです。キャッシュの内容は、 ‘file-cache-display’コマンドで閲覧できます。 18.18 ファイル検索の便利な機能 ============================== このセクションでは、最近開いたファイルの検索、バッファーからのファイル名 の読み取り、イメージファイルの閲覧などの、便利な機能を紹介します。 ‘M-x recentf-mode’でRecentfモードを有効にすると、‘File’メニューに最近 開いたファイルを含むサブメニューが含まれるようになります。‘M-x recentf-save-list’は現在の‘recent-file-list’をファイルに保存し、‘M-x recentf-edit-list’でそれを編集できます。 ‘M-x ffap’コマンドは、‘find-file’を一般化した、より強力なデフォルト決 定のための機能で、基本的にはポイント位置のテキストにもとづいて決定を行な います。Partial Completionモードは‘find-file’を拡張する、‘ffap’とともに 使用できるその他の機能を提案します。*note Completion Options::を参照して ください。 イメージファイルをvisitすることにより、Imageモードが選択されます。こ のメジャーモードでは、‘C-c C-c’ (‘image-toggle-display’)とタイプすること により、Emacsバッファーでファイルのイメージ表示と、イメージの元となるテ キスト(またはraw byte)表示を切り替えることができます。さらに‘C-c C-x’ (‘image-toggle-hex-display’)とタイプすると、Emacsバッファー内でイメージ としてファイルを表示、または16進表記で表示を切り替えることができます。フ ァイルのイメージ表示は、Emacsがそのようなイメージの表示をサポートするよ うにコンパイルされているときだけ機能します。イメージがフレームの高さまた は幅より大きい場合、通常のポイント移動キー(‘C-f’、‘C-p’、...)は、イメー ジの他の部分の表示に使われます。‘n’ (‘image-next-file’)および‘p’ (‘image-previous-file’)を押すことにより、同じディレクトリーにある次また は前のイメージをvisitします。 アニメーションが可能なイメージの場合、コマンド (‘image-toggle-animation’)で、アニメーションの開始と停止ができます。オプ ション‘image-animate-loop’が非‘nil’でなければ、アニメーションの再生は1回 です。‘f’ (‘image-next-frame’)と‘b’ (‘image-previous-frame’)により、アニ メーションの各フレームを切り替えることができます。これらのコマンドは数引 数を指定することにより、指定した数の分だけ先のフレームを表示できます。 ‘F’ (‘image-goto-frame’)により、特定のフレームを指定することができます。 フレームは1からインデックスがつきます。‘a +’ (‘image-increase-speed’)と タイプすると、アニメーションのスピードが早くなり、‘a -’ (‘image-decrease-speed’)で遅くなります。また‘a r’ (‘image-reverse-speed’)で逆再生されます。コマンド‘a 0’ (‘image-reset-speed’)は、スピードを元の値にリセットします。 EmacsがImageMagickのサポートつきでコンパイルされている場合、さまざま なイメージを描画するのに、ImageMagickを使うことができます。変数 ‘imagemagick-enabled-types’は、EmacsがImageMagickを使って描画できるイメ ージの種類のリストです。リストの各要素は、ImageMagick内部でのイメージ種 類にたいする名前で、シンボルまたは等価な文字列で指定します(たとえば ‘BMP’は‘.bmp’イメージです)。利用可能なイメージの種類にたいして ImageMagickを有効にするには、‘imagemagick-enabled-types’を‘t’に変更しま す。変数‘imagemagick-types-inhibit’は、変数‘imagemagick-enabled-types’の 値にかかわらずmImageMagickを使わずに描画するイメージ種類のリストです(リ ストのデフォルトには‘C’および‘HTML’などが含まれ、これらはImageMagickはイ メージとして描画できるが、Emacsはイメージとして描画しないものです)。 ImageMagickを完全に無効にするには、‘imagemagick-types-inhibit’を‘t’に変 更してください。 Image-Diredパッケージはイメージをサムネールとして表示するのにも使用さ れます。*note Image-Dired::を参照してください。 18.19 ファイルセット ==================== 定期的に特定のファイルのグループを編集する場合、それらを“ファイルセット (fileset)”として定義できます。これによりvisit、‘query-replace’、シェルコ マンドなどの特別な操作を、すべてのファイルに一度に行うことができます。フ ァイルセットを使うには、initファイル(*note Init File::を参照)に、式 ‘(filesets-init)’を追加しなければなりません。これはメニューバーの ‘File’メニューに、サブメニュー‘Filesets’を追加します。 ファイルセットを定義する一番簡単な方法は、ファイルを1つずつ追加する方 法です。ファイルセットNAMEにファイルを追加するには、そのファイルを visitして‘M-x filesets-add-buffer NAME ’をタイプします。ファ イルセットNAMEが存在しない場合、現在のファイルだけを含む新しいファイルセ ットを作成します。コマンド‘M-x filesets-remove-buffer’は、ファイルセット から現在のファイルを削除します。 ‘M-x filesets-edit’(または‘Filesets’メニューの‘Edit Filesets’を選択 )で、ファイルセットを直接編集することもできます。編集はCustomizeバッファ ーで行われます(*note Easy Customization::を参照してください)。ファイルセ ットは通常、単純なファイルのリストですが、ファイル名にマッチする正規表現 で、ファイルセットを定義することもできます。より複雑なファイルセットの例 は、Customizeバッファーに記されています。将来のEmacsセッションで同じファ イルセットを使うには、‘Save for future sessions’を選択するのを忘れないで ください。 コマンド‘M-x filesets-open’を使って、ファイルセットのすべてのファイル をvisitし、それらを‘M-x filesets-close’で閉じることができます。‘M-x filesets-run-cmd’を使って、ファイルセットのすべてのファイルにたいして、 シェルコマンドを実行します。これらのコマンドは‘Filesets’メニューからも利 用可能で、メニューには既存のファイルセットが、サブメニューとして表示され ています。 異なるコンセプトのファイルセット(バージョンコントロール操作のためにグ ループにまとめられたファイル)については、*note Version Control::を参照し てください。この種のファイルセットには名前がなく、Emacsセッション間で引 き継がれません。 19 複数バッファーの使用 *********************** Emacsで編集するテキストは、“バッファー(buffer)”と呼ばれるオブジェクトの 中に存在します。ファイルをvisitするたびに、そのファイルのテキストを保持 するために、バッファーが使われます。Diredを呼び出すたびに、ディレクトリ ーリストを保持するためにバッファーが使われます。‘C-x m’でメッセージを送 信すると、メッセージのテキストを保持するためにバッファーが使われます。コ マンドのドキュメントは、‘*Help*’という名前のバッファーに表示されます。 それぞれのバッファーは、任意の長さの一意な名前を持っています。バッフ ァーがウインドウに表示されているとき、バッファーの名前はモードライン (*note Mode Line::を参照してください)に表示されます。バッファー名での大 文字と小文字の違いは重要です。ほとんどの場合、ほとんどのバッファーは visitしているファイルから作られ、それらの名前はファイル名から生成されま す。しかし、新しい空のバッファーを、任意の名前で作成することもできます。 新しく開始されたEmacsにはいくつかのバッファーがあり、それらの中には ‘*scratch*’という名前の、Lisp式を評価するのに使用されるバッファーも含ま れます。そのバッファーはファイルに関連付けられていません(*note Lisp Interaction::を参照してください)。 “選択”されるバッファーは、常に1つだけです。そのバッファーを“カレント バッファー(current buffer: 現在のバッファー)”と呼びます。「コマンドは“そ のバッファー(the buffer)”を操作します」という言い方をするときがあります 。これはカレントバッファーを操作するというのが、本当の意味です。Emacsの ウィンドウが1つだけのとき、そのウィンドウに表示されているバッファーがカ レントになります。複数のウィンドウがあるとき、“選択されたウィンドウ”に表 示されているバッファーがカレントになります。*note Windows::を参照してく ださい。 バッファーの“コンテンツ(contents: 内容)”とは、オプションでテキストプ ロパティ(*note Text properties: International Chars.を参照)のセットをも つ一連の文字から構成されます。テキストプロパティにより、文字により多くの 情報を指定できます。 バッファーのテキスト的な内容は別として、それぞれのバッファーはいくつ かの情報を記録しています。それらは、(もしあれば)visitしているファイルは 何か、変更されているか、有効なメジャーモードとマイナーモードは何か(*note Modes::を参照してください)、などの情報です。これらは、“バッファーローカ ルな変数(buffer-local variables)”に格納され、これらの変数はバッファーご とに異なる値をもつことができます。*note Locals::を参照してください。 バッファーのサイズは、いくつかの最大値を超えて大きくすることはできま せん。これは一番大きいバッファーの位置が、“Emacsの整数(Emacs integers)”で 表されることにより定義されます。なぜならEmacsはそのデータ型を使用して、 バッファーの位置を追跡するからです。通常の64ビットマシンでは、バッファー の最大サイズは2^{61} - 2バイト、およそ2EiBです。通常の32ビットマシンでは 、バッファーの最大サイズは通常2^{29} - 2バイト、およそ512MiBです。バッフ ァーのサイズはシステムのメモリー量によっても制限されます。 19.1 バッファーの作成と選択 =========================== ‘C-x b BUFFER ’ BUFFERという名前のバッファーを、選択または作成します (‘switch-to-buffer’)。 ‘C-x 4 b BUFFER ’ 同様ですが、他のウィンドウでBUFFERを選択します (‘switch-to-buffer-other-window’)。 ‘C-x 5 b BUFFER ’ 同様ですが、別のフレームでBUFFERを選択します (‘switch-to-buffer-other-frame’)。 ‘C-x ’ バッファーリストの、前のバッファーを選択します(‘previous-buffer’)。 ‘C-x ’ バッファーリストの、次のバッファーを選択します(‘next-buffer’)。 ‘C-u M-g M-g’ ‘C-u M-g g’ 数字Nを読み取って、カレントバッファーではない、一番最近選択された、 別のウィンドウにあるバッファーの、N行目に移動します。 ‘C-x b’ (‘switch-to-buffer’)コマンドは、ミニバッファーを使ってバッフ ァー名を読み取ります。それからそのバッファーをカレントとして、現在選択さ れたウィンドウに表示します。空の入力は、そのとき他のウィンドウに表示され ていない、一番最近カレントだったバッファーを指定します。 バッファー名を入力するとき、通常の補完とヒストリーコマンドを使うこと ができます(*note Minibuffer::を参照してください)。‘C-x b’および関連する コマンドは、ミニバッファーの補完に、“確認つきの寛大な補完(permissive completion with confirmation)”を使うことに注意してください。存在しないバ ッファー名にたいする補完の後、すぐにをタイプすると、Emacsは ‘[Confirm]’を出力し、バッファー名を確定するために2回目のをタイプし なければなりません。詳細は、*note Completion Exit::を参照してください。 その他の補完オプションと機能についての詳細は、*note Completion Options::を参照してください。 存在しないバッファーを指定すると、‘C-x b’はファイルをvisitしていない 新しい空のバッファーを作成し、編集用にそのバッファーを選択します。変数 ‘major-mode’は、新しいバッファーのメジャーモードのデフォルトを決定します 。デフォルトでは、これはFundamentalモードです。*note Major Modes::を参照 してください。新しいバッファーを作る1つの理由は、それを一時的なノートと して使うためです。これを保存しようと試みると、Emacsは保存に使うファイル 名を尋ね、バッファーのメジャーモードは、ファイル名にもとづきメジャーモー ドを再割り当てします(*note Choosing Modes::を参照してください)。 少ないバッファーの切り替えでは、コマンド‘C-x ’および‘C-x ’を使うのが便利です。‘C-x ’ (‘previous-buffer’)は前のバッフ ァー(現在のフレームの一番最近選択されたバッファー順)、‘C-x ’ (‘next-buffer’)は逆方向のバッファーに移動します。 現在のウィンドウとは別のウィンドウにバッファーを選択するには、‘C-x 4 b’ (‘switch-to-buffer-other-window’)とタイプします。これはミニバッファー を使ってバッファー名の入力を求め、選択されているウィンドウではない別のウ ィンドウに、そのバッファーを表示して、そのウィンドウを選択します。 同様に‘C-x 5 b’ (‘switch-to-buffer-other-frame’)はバッファー名の入力 を求め、他のフレーム(*note Frames::を参照)にそのバッファーを表示して、そ のフレームを選択します。他のウィンドウまたはフレームにすでにバッファーが 表示されている場合、Emacsは新しく作成するのではなく、そのウィンドウまた はフレームを選択します。 ‘C-x 4 b’および‘C-x 5 b’コマンドが表示するウィンドウまたはフレームを 取得する方法については、*note Displaying Buffers::を参照してください。 これらに加えて、‘C-x C-f’や、その他のファイルをvisitするコマンドでも 、すでにファイルをvisitしているバッファーに切り替えることができます。 *note Visiting::を参照してください。 プレフィクス引数だけを指定した‘C-u M-g M-g’ ‘goto-line’は、ミニバッフ ァーを使って数字Nを読み取り、別のウィンドウにあるカレントバッファー以外 の、一番最近選択されたバッファーを選択して、ポイントをそのバッファーの N行目の先頭に移動します。これは他のバッファーの行番号を参照するバッファ ーで特に有用です。ポイントが数字の直後にある場合、‘goto-line’はNのデフォ ルトとしてその数字を使います。ただの‘C-u’ではないプレフィクス引数では、 異なる振る舞いをすることに注意してください。‘C-u 4 M-g M-g’はミニバッフ ァーから数字を読み取らず、_カレントバッファー_の4行目にジャンプします(プ レフィクス引数を指定しない‘M-g M-g’は、数字Nを読み取ってカレントバッファ ーのN行目に移動することを思い出してください。*note Moving Point::を参照 してください)。 Emacsはスペースで開始される名前のバッファーを、内部的な用途のために使 用しています。それらのバッファーは特別な方法で扱われます。たとえば、それ らのバッファーではundo情報が記録されません。そのようなバッファー名を使う ことは避けるのが最良です。 19.2 既存のバッファーを一覧する =============================== ‘C-x C-b’ 既存のバッファーをリストします(‘list-buffers’)。 既存のバッファーのリストを表示するには、‘C-x C-b’とタイプします。これ により、‘*Buffer List*’という名前のバッファーにバッファーメニューがポッ プアップします。リストの各行にはバッファー名、サイズ、メジャーモード、 visitしているファイルが表示されます。バッファーは、カレントだった順でリ ストされます。したがって、一番最近カレントだったバッファーが先頭に表示さ れます。このセクションでは、バッファーリストが表示される方法と、リスト内 に示されるさまざまなものの解釈の仕方について説明します。‘*Buffer List*’バ ッファーの特別なモードと、利用可能なコマンドについては、*note Several Buffers::を参照してください。 行の最初のフィールドの‘.’は、そのバッファーがカレントであることを示し ます。‘%’は読み取り専用バッファーであることを示します。‘*’はそのバッファ ーが変更されていることを示します。いくつかのバッファーが変更されていて、 それらを保存するべきだと思ったときは、‘C-x s’ (*note Save Commands::を参 照してください)で保存します。以下はバッファーリストの例です: CRM Buffer Size Mode File . * .emacs 3294 Emacs-Lisp ~/.emacs % *Help* 101 Help search.c 86055 C ~/cvs/emacs/src/search.c % src 20959 Dired by name ~/cvs/emacs/src/ * *mail* 42 Mail % HELLO 1607 Fundamental ~/cvs/emacs/etc/HELLO % NEWS 481184 Outline ~/cvs/emacs/etc/NEWS *scratch* 191 Lisp Interaction * *Messages* 1554 Messages この例でバッファー‘*Help*’は、ヘルプを要求されたことにより作成されます (*note Help::を参照してください)。これはファイルをvisitしていません。バ ッファー‘src’は、ディレクトリー‘~/cvs/emacs/src/’にたいして、Diredが作成 したバッファーです。ファイルをvisitしているバッファーだけを一覧するには 、‘C-u C-x C-b’のように、コマンドにプレフィクス引数を与えます。 ‘list-buffers’は名前がスペースで始まるバッファーを省略します(そのバッ ファーがファイルをvisitしていない限り)。これらのバッファーは、Emacsによ り内部的に使用されます。 19.3 その他のバッファー操作 =========================== ‘C-x C-q’ バッファーの読み取り専用の状態を切り替えます(‘read-only-mode’)。 ‘M-x rename-buffer BUFFER ’ カレントバッファーの名前を変更します。 ‘M-x rename-uniquely’ カレントバッファーの末尾に‘’を加えてリネームします。 ‘M-x view-buffer BUFFER ’ バッファーBUFFERをスクロールして閲覧します。*note View Mode::を参照 してください。 バッファーを読み取り専用にすることができます、これはバッファーのテキ ストにたいして挿入や削除を行うコマンドが許されないことを意味します(とは いえ、他の‘C-x f’のようなコマンドは、バッファーを変更済みとマーク することは可能。*note Text Coding::を参照されたい)。読み取り専用バッファ ーのモードラインでは、左余白の近くに‘%%’または‘%*’が表示されます。*note Mode Line::を参照してください。読み取り専用バッファーは通常、Diredや Rmailのように、そのバッファーのテキストを操作する専用コマンドをもつ、サ ブシステムにより作成されます。アクセスが制御されているファイルをvisitし たときも、そのバッファーに書き込めない旨が通知されます。 コマンド‘C-x C-q’ (‘read-only-mode’)は、読み取り専用バッファーを書き 込み可能に、書き込み可能なバッファーを読み取り専用にします。これは各バッ ファーにローカルな変数‘buffer-read-only’をセットすることにより機能します (値が非‘nil’のときバッファーは読み取り専用)。オプション ‘view-read-only’を非‘nil’値に変更すると、‘C-x C-q’でバッファーを読み取り 専用にしたとき、そのバッファーでViewモードが有効になります(*note View Mode::を参照してください)。 ‘M-x rename-buffer’は、カレントバッファーの名前をリネームします。新し い名前はミニバッファーで指定します。デフォルトはありません。他のバッファ ーで使用済の名前を指定するとエラーとなり、リネームされません。 ‘M-x rename-uniquely’は、カレントバッファーの後ろに数字を追加して、似 てはいるが異なる名前を作成します。このコマンドに引数は必要ありません。こ れは複数のshellバッファーを作成するのに便利です。‘*shell*’バッファーをリ ネームしてから、再度‘M-x shell’を行うと、これは新しく‘*shell*’という名前 のバッファーを作成します。一方リネームされた古いshellバッファーは、新し い名前で実行を続けます。この方法はmailバッファー、compilationバッファー 、そして特定の名前で特別なバッファーを作成するEmacs機能に適しています(こ れらの機能のいくつか、たとえば‘M-x compile’、‘M-x grep’などでは、コマン ドを再度実行する前に他のバッファーに切り替える必要があります。さもないと カレントバッファーの名前を変更せずに、そのバッファーを再使用します)。 コマンド‘M-x append-to-buffer’および‘M-x insert-buffer’も、あるバッフ ァーから他のバッファーへテキストをコピーするのに使用できます。*note Accumulating Text::を参照してください。 19.4 バッファーのkill ===================== しばらくの間、Emacsセッションを続けていると、多くのバッファーが溜まって しまう場合があります。必要のないバッファーを“kill”したほうがよいと思うか もしれません(他のエディターではこの操作を“close(閉じる)”と呼び、“バッフ ァーを閉じる”とか、ファイルをvisitしているバッファーでは“ファイルを閉じ る”のように表現するものもあります)。ほとんどのオペレーティングシステムで は、バッファーをkillすることにより、バッファーのためにEmacsが使用してい たメモリーをオペレーティングシステムに解放するので、他のプログラムがそれ を使えるようになります。以下はバッファーをkillするコマンドです: ‘C-x k BUFFER ’ バッファーBUFFERをkillします(‘kill-buffer’)。 ‘M-x kill-some-buffers’ バッファーを1つずつkillするか尋ねます。 ‘M-x kill-matching-buffers’ 正規表現にマッチするすべてのバッファーをkillするか尋ねます。 ‘C-x k’ (‘kill-buffer’)は、ミニバッファーで指定した名前のバッファーを 1つkillします。だけをタイプしたときはデフォルトが使われ、これはカレ ントバッファーをkillします。カレントバッファーをkillすると、最近カレント だったが、今は別のウィンドウにも表示されていないバッファーがカレントにな ります。ファイルをvisitしているバッファーが変更されているとき、それを killしようとすると確認を求められます。そのバッファーをkillする前に、確認 に‘yes’を応えなければkillできません。 コマンド‘M-x kill-some-buffers’は、各バッファーについて1つずつ確認を 求めます。‘yes’と応えると、‘kill-buffer’と同様にバッファーをkillすること を意味します。このコマンドは名前がスペースで始まる、Emacsが内部的に使用 するバッファーは無視します。 コマンド‘M-x kill-matching-buffers’は、正規表現の入力を求め、名前がそ の正規表現にマッチするすべてのバッファーをkillします。*note Regexps::を 参照してください。‘kill-some-buffers’と同様、このコマンドはkillする前に 確認を求めます。このコマンドは通常、名前がスペースで始まる、Emacsが内部 的に使うバッファーを無視します。内部的なバッファーも同じようにkillするに は、プレフィクス引数を指定して‘kill-matching-buffers’を呼び出します。 さまざまなバッファーをkillするにはBuffer Menu機能も便利です。*note Several Buffers::を参照してください。 バッファーがkillされるときに特別な処理を行いたい場合、フック ‘kill-buffer-hook’にフック関数を追加できます(*note Hooks::を参照してくだ さい)。 (多くの人がそうしているように)何日間も1つのEmacsセッションを使ってい ると、何日か前に使ったバッファーが溜まってくるかもしれません。コマンド ‘M-x clean-buffer-list’は、それらを一掃するのに便利です。これは長い間使 用されていない、変更されていないバッファーをすべてkillします。3日間表示 されていない普通のバッファーはkillされます。しかし自動的にkillされるべき ではない特定のバッファーを指定したり、使われていない時間が短いバッファー でもkillするように指定できます。これらのデフォルト、およびこのコマンドの 挙動の他の動向は、‘clean-buffer-list’のドキュメント文字列で説明されてい る、いくつかのオプションをカスタマイズすることにより制御できます。 Midnightモードを有効にすることにより、1日ごとにバッファーを一掃するこ ともできます。Midnightモードは毎日真夜中に‘clean-buffer-list’、またはノ ーマルフック‘midnight-hook’に指定された関数を実行します(*note Hooks::を 参照してください)。Midnightモードを有効にするには、Customizationバッファ ーを使って変数‘midnight-mode’を‘t’にセットします。*note Easy Customization::を参照してください。 19.5 複数バッファーにたいする操作 ================================= ‘M-x buffer-menu’ すべてのEmacsバッファーの、バッファーリストの編集を開始します。 ‘M-x buffer-menu-other-window’ 同様ですが、別のウィンドウで行います。 ‘C-x C-b’ (*note List Buffers::を参照してください)でオープンされる “Buffer Menu”は、単にバッファーを一覧するだけではありません。これは Diredに似たインターフェースで、バッファーにたいしてさまざまな操作を行う ことができます。ここでは、バッファーの保存、kill(Diredとの一貫性を保つた め、ここではそれらを“削除(delete)”する、と呼びます)、表示ができます。 Buffer Menuを使うには‘C-x C-b’とタイプして、‘*Buffer List*’バッファー が表示されたウィンドウに切り替えます。‘M-x buffer-menu’とタイプして、選 択されたウィンドウにBuffer Menuを開くこともできます。コマンド‘M-x buffer-menu-other-window’は、Buffer Menuを別のウィンドウに開いて、そのウ ィンドウを選択します。 Buffer Menuは読み取り専用バッファーで、このセクションで説明する特別な コマンドだけを通じて変更します。このバッファーでは、通常のカーソル移動コ マンドを使うことができます。以下のコマンドは、バッファーのカレント行に適 用されます。 ‘d’ そのバッファーの削除(kill)フラグをセットしてから、ポイントを次の行 に移動します(‘Buffer-menu-delete’)。削除フラグは、各行のバッファー 名の前の文字‘D’により示されます。削除は‘x’コマンド(以下参照)をタイ プしたときだけ発生します。 ‘C-d’ ‘d’と同様ですが、ポイントを下ではなく上に移動します (‘Buffer-menu-delete-backwards’)。 ‘s’ そのバッファーの保存フラグをセットします(‘Buffer-menu-save’)。保存 フラグは各行のバッファー名の前の文字‘S’により示されます。保存は ‘x’コマンド(以下参照)をタイプしたときだけ発生します。同じバッファー に保存と削除の両方をリクエストできます。 ‘x’ すべての削除および保存フラグを処理します(‘Buffer-menu-execute’)。 ‘u’ カレント行のすべてのフラグを取り除いてから、下に移動します (‘Buffer-menu-unmark’)。プレフィックス引数を指定した場合は、フラグ を取り除いた後、上に移動します。 ‘’ 前の行に移動して、その行のすべてのフラグを取り除きます (‘Buffer-menu-backup-unmark’)。 ‘M-’ すべて行から特定のフラグを取り除きます (‘Buffer-menu-unmark-all-buffers’)。これは、1文字の入力を求めて、そ の文字でマークされたバッファーのマークを取り除きます。をタイプ した場合は、すべてのマークを取り除きます。 ‘U’ すべての行のすべてのフラグを取り除いてから、下に移動します (‘Buffer-menu-unmark-all’)。 フラグを取り除くコマンド‘d’と‘C-d’には、繰り返し回数として数引数を指定で きます。 以下のコマンドは、カレント行にリストされたバッファーを即座に処理しま す。これらのコマンドにも、繰り返し回数を数引数として指定できます。 ‘~’ バッファーを変更されていない(unmodified)とマークします (‘Buffer-menu-not-modified’)。*note Save Commands::を参照してくださ い。 ‘%’ バッファーの読み取り専用属性を切り替えます (‘Buffer-menu-toggle-read-only’)。*note Misc Buffer::を参照してくだ さい。 ‘t’ そのバッファーを、tagsテーブルとしてvisitします (‘Buffer-menu-visit-tags-table’)。*note Select Tags Table::を参照し てください。 以下は、他のバッファーを選択するために使われるコマンドです: ‘q’ Buffer Menuメニューを閉じます(‘quit-window’)。一番最近に表示されて いたバッファーが、その場所に表示されます。 ‘’ ‘f’ そのウィンドウの‘*Buffer List*’バッファーを置き換えて。この行のバッ ファーを選択します(‘Buffer-menu-this-window’)。 ‘o’ ‘C-x 4 b’のように‘*Buffer List*’を表示したまま、その行のバッファー を他のウィンドウで選択します(‘Buffer-menu-other-window’)。 ‘C-o’ この行のバッファーを他のウィンドウで表示しますが、選択はしません (‘Buffer-menu-switch-other-window’)。 ‘1’ この行のバッファーを、フレーム全体のウィンドウで選択します (‘Buffer-menu-1-window’)。 ‘2’ 現在のフレームを2つのウィンドウにセットアップして、この行のバッファ ーを一方のウィンドウで選択し、もう一方のウィンドウに以前のカレント バッファー(‘*Buffer List*’)は除く)を表示します (‘Buffer-menu-2-window’)。 ‘b’ この行のバッファーをbury(つまりバッファーリストの最後)に移動します (‘Buffer-menu-bury’)。 ‘m’ ‘v’コマンドで抜けるとき、この行のバッファーを他のウィンドウで表示さ れるようにマークします(‘Buffer-menu-mark’)。表示フラグは行の先頭に 文字‘>’で示されます(1つのバッファーが削除と表示のフラグを両方もつこ とはないでしょう)。 ‘v’ この行のバッファーを選択し、‘m’コマンドでフラグづけされたバッファー も他のウィンドウで表示します(‘Buffer-menu-select’)。バッファーにフ ラグをつけていないとき、このコマンドは‘1’と等価です。 以下はバッファーリスト全体に影響を与えるコマンドです: ‘S’ ポイントがある列の数値にしたがって、Buffer Menu全体をソートします。 数引数Nを指定すると、N番目の列でソートします (‘tabulated-list-sort’)。 ‘T’ 非ファイルバッファーを削除または再挿入します (‘Buffer-menu-toggle-files-only’)。このコマンドは、そのようなバッフ ァーがバッファーリストに含まれるか否かを切り替えます。 バッファー‘*Buffer List*’は通常、バッファーの作成およびkillにより自動 的に更新はされません(内容は単なるテキストです)。バッファーを作成・削除・ リネームした場合、それが行われたか確かめるために‘*Buffer List*’を更新す るには、‘g’ (‘revert-buffer’)とタイプします。このバッファーのAuto Revertモードを有効にすれば、このバッファーが変更されたとマークされない限 り、‘auto-revert-interval’秒ごとに定期的に更新させることができます。 Global Auto Revertモードは、‘global-auto-revert-non-file-buffers’が非 ‘nil’のときだけ、‘*Buffer List*’バッファーに適用されます。 詳細は、*note global-auto-revert-non-file-buffers: Autorevert.を参照してください。 19.6 インダイレクトバッファー ============================= “インダイレクトバッファー(indirect buffer: 間接バッファー)”は、そのイン ダイレクトバッファーの“ベースバッファー(base buffer: 基底バッファー)”と 呼ばれる、他のバッファーのテキストを共有します。ある点においては、ファイ ルに置けるシンボリックリンクの、バッファー版に例えることができます。 ‘M-x make-indirect-buffer BASE-BUFFER INDIRECT-NAME ’ ベースバッファーBASE-BUFFERの、インダイレクトバッファー INDIRECT-NAMEを作成します。 ‘M-x clone-indirect-buffer ’ カレントバッファーの、インダイレクトバッファーを作成します。 ‘C-x 4 c’ カレントバッファーのインダイレクトバッファーを作成して、それを別の ウィンドウで選択します(‘clone-indirect-buffer-other-window’)。 インダイレクトバッファーのテキストは、常にベースバッファーのテキスト と等しく、どちらかを編集すると、その変更はすぐにもう一方から見えるように なります。しかし他の観点では、インダイレクトバッファーとベースバッファー は、完全に分離されています。これらのバッファーは異なる名前、異なるポイン ト値、異なるナローイング、異なるマーカー、異なるメジャーモード、異なるロ ーカル変数をもつことができます。 インダイレクトバッファーはファイルをvisitできませんが、ベースバッファ ーはvisitできます。インダイレクトバッファーの保存を試みると、それは実際 にはベースバッファーの保存として機能します。ベースバッファーをkillすると インダイレクトバッファーもkillされますが、インダイレクトバッファーの killは、ベースバッファーに影響を与えません。 インダイレクトバッファーの1つの使い方としては、アウトラインの複数の視 点からの表示です。*note Outline Views::を参照してください。 手早くインダイレクトバッファーを作成するには、コマンド‘M-x clone-indirect-buffer’を使う方法があります。これはカレントバッファーをベ ースバッファーとする、インダイレクトバッファーを作成して選択します。数引 数を指定すると、インダイレクトバッファーの名前の入力を求めます。指定しな い場合、カレントバッファー名の後ろに‘’を付加した名前を使います。‘C-x 4 c’ (‘clone-indirect-buffer-other-window’)は、‘M-x clone-indirect-buffer’と同様に機能しますが、新しいバッファーを他のウィン ドウで選択します。これらの関数はインダイレクトバッファーを作成した後、フ ック‘clone-indirect-buffer-hook’を実行します。 インダイレクトバッファーを作成する、より一般的な方法はコマンド‘M-x make-indirect-buffer’です。これはバッファーBASE-BUFFERから、名前が INDIRECT-NAMEのインダイレクトバッファーを作成します。これらの名前は、ミ ニバッファーを使って入力が求められます。 19.7 バッファー処理の便利な機能とカスタマイズ ============================================= このセクションではバッファーを切り替えをもっと便利にする、モードと機能を いくつか説明します。 19.7.1 バッファー名を一意にする ------------------------------- 同じ名前のファイルを複数のバッファーでvisitしているとき、Emacsはバッファ ーに区別可能な名前をつけなければなりません。デフォルトの方法はファイルを ディレクトリーの一部を後ろに追加する方法です。たとえば同時にファイル ‘/foo/bar/mumble/name’と‘/baz/quux/mumble/name’をvisitしている場合、バッ ファーの名前は‘name’と‘name’になるでしょう。 Emacsは名前を一意にするために必要な分だけ、ディレクトリー名の一部を追加 します。 オプション‘uniquify-buffer-name-style’をカスタマイズして、一意なバッ ファー名を構築するための異なるスタイルを選択することができます。 命名方法‘forward’は、バッファー名の先頭部分に、ファイルのディレクトリ ー名の一部を含めます。この方法を使うとファイル‘/u/rms/tmp/Makefile’と ‘/usr/projects/zaphod/Makefile’をvisitしているバッファーの名前は、 ‘tmp/Makefile’と‘zaphod/Makefile’になるでしょう。 対照的に命名方法‘post-forward’は、バッファーを‘Makefile|tmp’および ‘Makefile|zaphod’と名づけます。デフォルトの ‘post-forward-angle-brackets’は、‘post-forward’と同様ですが、一意なパス を山形カッコ(angle brackets)で囲います。命名方法‘reverse’では、 ‘Makefile\tmp’および‘Makefile\zaphod’となります。‘post-forward’と ‘reverse’の重要な違いは、2つのファイルを区別するのに1つのディレクトリ名 では不足するときです。‘reverse’はディレクトリー名を逆順にして命名するの で、ファイル‘/top/middle/file’は‘file\middle\top’となります。一方 ‘post-forward’はディレクトリー名を正順でファイル名に追加するので ‘file|top/middle’となります。‘uniquify-buffer-name-style’が‘nil’にセット されていると、バッファー名の後ろに単に‘<2>’、‘<3>’と加えることにより、バ ッファー名を作成します。 タイプする前にバッファー名に_注意_すれば、バッファー名にディレクトリ ー名を付加する方法に重要な違いはありません。しかしルールを知った経験豊富 なユーザーは、それほど注意する必要はないでしょう。そして、その場合いずれ かのルールでバッファー名が表示されていれば,思い出し利用するのが容易にな ることでしょう。 19.7.2 素早いミニバッファーの選択 --------------------------------- グローバルなマイナーモードのIcompleteモードは、ミニバッファーで利用可能 な補完候補を素早く選択する便利な方法を提供します。これが有効な場合、ミニ バッファーでタイプすることにより、すでにタイプした文字にマッチする、利用 可能な候補を連続で表示します。 ‘C-j’とタイプすることにより、常にリストの最初の補完候補を選択できます 。つまり特定の補完候補を選択するには、まずその候補をリストの先頭にするこ とです。これを行うには2つの方法があります。1つ目の方法は、補完候補の名前 をさらにタイプすることにより、違う候補が含まれないように、希望する補完候 補にリストを絞りこむ方法です。もう1つは‘C-.’および‘C-,’を使って、望む候 補が先頭にくるまでリストをローテートする方法です。 ‘M-’は‘C-j’のようにリストの最初の補完候補を選択しますが、ミニバ ッファーを抜けないので、さらに編集を続けることができます。これはファイル 名の入力で通常使われます。‘M-’により、いくつかのディレクトリー階層 をたどることができます。 Icompleteモードを有効にするには、‘M-x icomplete-mode’とタイプするか、 変数‘icomplete-mode’を‘t’にカスタマイズします(*note Easy Customization::を参照してください)。 19.7.3 バッファーメニューのカスタマイズ --------------------------------------- ‘M-x bs-show’ ‘M-x list-buffers’と同様にバッファーリストを作成しますが、カスタマ イズが可能です。 ‘M-x ibuffer’ バッファーのリストを作成して、Dired様式でそれらを操作できるようにし ます。 ‘M-x bs-show’は、通常‘C-x C-b’で表示されるのと同じようなバッファーリ ストを表示しますが、これはより柔軟な方法で表示をカスタマイズできます。た とえば、表示すべきバッファー属性のリスト、バッファー名の列幅の最小と最大 、決して表示されないバッファーや常に表示するバッファー名にたいする正規表 現を指定することができます。通常のバッファーリストよりこちらのほうが好ま しい場合、このコマンドを‘C-x C-b’にバインドできます。このバッファーリス トをカスタマイズするには、Customグループの‘bs’(*note Easy Customization::を参照)を使用するか、‘bs-customize’を呼び出してください。 MSBグローバルマイナーモード(“MSB”は“mouse select buffer”が由来)は、カ スタマイズ可能なマウスによる別のBuffer Menuを、好みに応じて提供します。 これは通常‘C-Down-mouse-1’、または‘C-’にバインドされている ‘mouse-buffer-menu’と、そのコマンドを置き換えます。メニューはCustomグル ープ‘msb’でカスタマイズが可能です。 IBufferとは、バッファーのリストを閲覧して、フィルタリング、マーキング 、さまざまな方法によるソート、およびバッファーにたいする処理を含む、 Dired(*note Dired::を参照)に似た操作をバッファーに行うメジャーモードです 。 20 複数ウィンドウ ***************** Emacsのフレームは、2つ以上のウィンドウに分割できます。複数のウィンドウで 異なるバッファーを表示したり、1つのバッファーの異なる部分を表示できます 。複数フレームは自ずと複数ウィンドウになります。なぜならフレームには、そ れぞれウィンドウがあるからです。ウィンドウは1つのフレームだけに属します 。 20.1 Emacsウィンドウの概念 ========================== Emacsの各ウィンドウには、常に1つのEmacsバッファーが表示されます。1つのバ ッファーは、複数のウィンドウに表示される場合があります。この場合、バッフ ァーのテキストへの任意の変更は、それが表示されているすべてのウィンドウで 表示されます。しかし各ウィンドウは独自にポイント値をもっているので、ウィ ンドウごとにバッファーの異なる部分を表示できます。 常に1つのEmacsウィンドウが、“選択されたウィンドウ”となります。このウ ィンドウに表示されているバッファーが、カレントバッファーとなります。グラ フィカルなディスプレーでは、選択されたウィンドウのカーソルは、点滅する塗 りつぶされたカーソルとなり、選択されていないウィンドウでは、中抜きボック スのカーソルになります。テキスト端末では、カーソルは選択されたウィンドウ だけで描画されます。*note Cursor Display::を参照してください。 ポイントを移動するコマンドは、選択されたEmacsウィンドウのポイント値だ けに影響します。他のEmacsウィンドウのポイント値は、たとえ同じバッファー を表示していたとしても変更されません。これと同じことは、‘C-x b’のような バッファー切り替えコマンドについても言えます。これらは他のウィンドウには 影響を与えません。しかし‘C-x 4 b’のような、別のウィンドウを選択して、バ ッファーを切り替えるコマンドもあります。(たとえば)‘C-h f’ (‘describe-function’)や‘C-x C-b’ (‘list-buffers’)を含む、ウィンドウで情 報を表示するコマンドは、選択されたウィンドウに影響を与えることなく、通常 は選択されていないウィンドウ内にバッファーを表示することにより機能します 。 複数ウィンドウで同じバッファーを表示しているとき、これらは異なるリー ジョンを持ちます。なぜなら、それらは異なるポイント値を持つことができるか らです。しかしバッファーごとにマーク位置は1つだけなので、これらは同じマ ーク位置をもちます。 それぞれのウィンドウには、独自のモードラインがあり、それにはバッファ ー名、変更状態、そのウィンドウに表示されているバッファーのメジャーモード とマイナーモードが表示されます。選択されたウィンドウのモードラインは、異 なる色で表示されます。詳細については、*note Mode Line::を参照してくださ い。 20.2 ウィンドウの分割 ===================== ‘C-x 2’ 選択されたウィンドウを上下に2分割します(‘split-window-below’)。 ‘C-x 3’ 選択されたウィンドウを左右に2分割します(‘split-window-right’)。 ‘C-mouse-2’ ウィンドウのモードライン上では、ウィンドウを分割します。 ‘C-x 2’ (‘split-window-below’)は、選択されたウィンドウを上下に2つのウ ィンドウに分割します。分割した後は、上が選択されたウィンドウになり、新た に分割されたウィンドウが下になります。2つのウィンドウは最初同じポイント 値をもち、(可能な限り)同じバッファー部分を表示します。必要ならポイントを スクリーン上に残したまま、ウィンドウをスクロールできます。デフォルトでは 2つのウィンドウの高さは、元のウィンドウの高さの半分になります。正の数引 数は上のウィンドウの高さが何行分かを指定し、負の数引数は下のウィンドウが 何行分の高さかを指定します。 変数‘split-window-keep-point’を‘nil’に変更すると、‘C-x 2’はスクリーン に表示されるテキストができるだけ前と同じになるように、ウィンドウに表示さ れるバッファー部分と、各ウィンドウのポイント位置を調整します。さらにポイ ントが元のウィンドウの下半分にあったときは、上ではなく下のウィンドウが選 択されます。 ‘C-x 3’ (‘split-window-right’)は、選択されたウィンドウを左右に2つのウ ィンドウに分割します。左のウィンドウが選択されたウィンドウとなり、右のウ ィンドウには同じバッファーの同じ部分が表示され、ポイント位置も同じです。 正の数引数は左のウィンドウの幅を列数で指定し、負の数引数は右のウィンドウ の幅を数引数で指定します。 ウィンドウを‘C-x 3’で分割すると、分割されたウィンドウの幅はフレーム全 体の幅より小さくなります。ウィンドウの幅が狭くなりすぎると、継続行が使わ れたバッファーを読むことが困難になる場合があります(*note Continuation Lines::を参照してください)。したがってウィンドウの幅が50列より狭くなった とき、Emacsは自動的に行を切り詰めに切り替えます。この切り詰めは、変数 ‘truncate-lines’の値に関係なく発生します(*note Line Truncation::を参照し てください)。‘truncate-lines’のかわりに、この自動切り詰めを制御するのは 、変数‘truncate-partial-width-windows’です。この変数の値が正の整数(デフ ォルトは50)の場合、それは自動的な行切り詰めが発生する前の、分割ウィンド ウの最小のトータル幅(total width)を指定します。この値が‘nil’の場合、自動 的な行切り詰めは無効です。他の非‘nil’値では、分割されたウィンドウの幅に 関係なく、Emacsは行を切り詰めます。ウィンドウのトータル幅(total width)と は、‘window-total-width’ (*note (elisp)Window Sizes::を参照してください )で報告される列単位の値で、これにはフリンジと、継続および切り詰めのため のグリフ、マージン、スクロールバーが含まれます。 テキスト端末では、左右に分割されたウィンドウを垂直に分割する分割線は 、‘vertical-border’フェイスで描画されます。 ウィンドウのモードライン上で‘C-mouse-2’をクリックすると、クリックした 位置に垂直分割線を配してウィンドウを分割します。Emacsがコンパイルされた 方法に依存しますが、ウィンドウのスクロールバー上で‘C-mouse-2’をクリック すると、クリックした位置に水平分割線を配してウィンドウを分割します(この 機能は、EmacsがGTK+のスクロールバーを使っているときは機能しません)。 デフォルトでは、ウィンドウを分割したとき、Emacsは分割されたウィンドウ のサイズをフレームのデフォルトフォントの整数倍にします。これによりスクリ ーンが正確に2分割されない場合があります。変数‘window-resize-pixelwise’を 非‘nil’値にセットすると、Emacsは分割されたウィンドウのサイズを、同じピク セル数にします(元のサイズが奇数のピクセル数の場合、1ピクセル増減されます )。フレームのピクセル数がフレームの文字サイズ倍でない場合、このオプショ ンが‘nil’でも、少なくとも1つのウィンドウがピクセル幅のサイズ変更をされる ことに注意してください。 20.3 他のウィンドウの使用 ========================= ‘C-x o’ 他のウィンドウを選択します(‘other-window’)。 ‘C-M-v’ 次のウィンドウをスクロールします(‘scroll-other-window’)。 ‘Mouse-1’ ウィンドウのテキスト領域を‘mouse-1’でクリックすると、そのウィンドウ を選択してクリックした位置にポイントを移動します。モードラインをク リックすると、ポイントを移動せずにそのウィンドウを選択します。 キーボードで‘C-x o’ (‘other-window’)をタイプして、ウィンドウを切り替 えることができます。‘o’は“other”のoで、0(ゼロ)ではありません。2つ以上の ウィンドウがある時、このコマンドはすべてのウィンドウを順繰りに選択します (一般的に上からした、左から右)。一番右または一番下のウィンドウの後は、左 上のウィンドウに戻ります。数引数は上記の順番で何番目のウィンドウに移動す るかを意味します。負の引数は逆向きで同じことを行います。ミニバッファーが アクティブのとき、ミニバッファーウィンドウはこの順番では最後のウィンドウ になります。ミニバッファーのウィンドウから他のウィンドウに切り替えて、後 からミニバッファーに戻って引数の入力を終了させることができます。*note Minibuffer Edit::を参照してください。 通常のスクロールコマンド(*note Display::を参照してください)は、選択さ れたウィンドウだけに適用されますが、次のウィンドウをスクロールするコマン ドが1つあります。‘C-M-v’ (‘scroll-other-window’)は、‘C-x o’が選択するウ ィンドウをスクロールします(このコマンドは‘C-v’のように正または負の引数を とります。ミニバッファーでの‘C-M-v’は、ミニバッファーに関連付けられたヘ ルプウィンドウがあれば、標準的な次のウィンドウではなくヘルプウィンドウを スクロールします。*note Minibuffer Edit::を参照してください)。 ‘mouse-autoselect-window’を非‘nil’値にセットしている場合、マウスが選 択されたウィンドウ以外のウィンドウに移動すると、そのウィンドウが選択され ます。この機能はデフォルトでオフです。 20.4 他のウィンドウでの表示 =========================== ‘C-x 4’は、異なるウィンドウ(他の既存のウィンドウや、選択されたウィンドウ を分割することにより新たに作成されたウィンドウ)のバッファーに切り替える 、さまざまなコマンドのプレフィクスキーです。Emacsがウィンドウを選択また は作成する方法については、*note Window Choice::を参照してください。 ‘C-x 4 b BUFNAME ’ 他のウィンドウのバッファーBUFNAMEを選択します (‘switch-to-buffer-other-window’)。*note Select Buffer::を参照して ください。 ‘C-x 4 C-o BUFNAME ’ バッファーBUFNAMEを選択せずに、別のウィンドウに表示します (‘display-buffer’)。ウィンドウが選択される方法についての詳細は、 *note Displaying Buffers::を参照してください。 ‘C-x 4 f FILENAME ’ ファイルFILENAMEをvisitして、他のウィンドウでバッファーを選択します (‘find-file-other-window’). *note Visiting::を参照してください。 ‘C-x 4 d DIRECTORY ’ DIRECTORYのDiredバッファーを、別のウィンドウで選択します (‘dired-other-window’)。*note Dired::を参照してください。 ‘C-x 4 m’ ‘C-x m’ (*note Sending Mail::を参照してください)と同様に、メールメ ッセージの編集を開始しますが、別のウィンドウで行います (‘compose-mail-other-window’)。 ‘C-x 4 .’ ‘M-.’ (*note Xref::を参照してください)と同様に、識別子の定義を検索 しますが、別のウィンドウで行います (‘xref-find-definitions-other-window’)。 ‘C-x 4 r FILENAME ’ ファイルFILENAMEを読み取り専用でvisitして、別のウィンドウでバッファ ーを選択します(‘find-file-read-only-other-window’)。*note Visiting::を参照してください。 20.5 ウィンドウの削除とリサイズ =============================== ‘C-x 0’ 選択されたウィンドウを削除します(‘delete-window’)。 ‘C-x 1’ フレームから選択されたウィンドウ以外のすべてのウィンドウを削除しま す(‘delete-other-windows’)。 ‘C-x 4 0’ 選択されていたウィンドウを削除して、それに表示されていたバッファー をkillします(‘kill-buffer-and-window’)。このキーシーケンスの最後の 文字はゼロです。 ‘M-x delete-windows-on BUFFER ’ 指定されたBUFFERを表示しているウィンドウを削除します。 ‘C-x ^’ 選択されたウィンドウの高さを増やします(‘enlarge-window’)。 ‘C-x }’ 選択されたウィンドウの幅を増やします (‘enlarge-window-horizontally’)。 ‘C-x {’ 選択されたウィンドウの幅を減らします (‘shrink-window-horizontally’)。 ‘C-x -’ バッファーに多くの行数が必要ない場合、そのウィンドウを縮小します (‘shrink-window-if-larger-than-buffer’)。 ‘C-x +’ すべてのウィンドウの高さを同じにします(‘balance-windows’)。 選択されたウィンドウを削除するには、‘C-x 0’ (‘delete-window’)とタイプ します(これはゼロです)。一度ウィンドウが削除されると、そのウィンドウが占 めていたスペースは隣接したウィンドウに与えられます(しかしミニバッファー の場合、それがアクティブな場合でも適用されません)。ウィンドウの削除は、 ウィンドウを表示用に使っていたバッファーに影響を与えません。そのバッファ ーは存在し続け、‘C-x b’で切り替えることができます。 ‘C-x 4 0’ (‘kill-buffer-and-window’)は、コマンド‘C-x 0’より強力なコマ ンドです。これはカレントバッファーをkillしてから、選択されたウィンドウを 削除します。 ‘C-x 1’ (‘delete-other-windows’)は、選択されたウィンドウ_以外_のすべ てのウィンドウを削除します。選択されたウィンドウはフレーム全体に拡張され ます(このコマンドは、ミニバッファーのウィンドウがアクティブのとき使うこ とができません。これを試みるとエラーがシグナルされます)。 ‘M-x delete-windows-on’は、特定のバッファーを表示するウィンドウを削除 します。これは、そのバッファーの入力を求めます(デフォルトはカレントバッ ファー)。‘C-u 0’のようにプレフィックス引数が0の場合、このコマンドはカレ ントディスプレイ上のフレームのウィンドウだけを削除します。 コマンド‘C-x ^’ (‘enlarge-window’)は、フレームの高さを変えずに垂直方 向に隣接するウィンドウのスペースを縮小して、選択されたウィンドウの高さを 増やします。正の数引数を与えると、このコマンドは指定した行数分ウィンドウ の高さを増やします。負の数引数を与えると、指定した行数分ウィンドウの高さ を増やします。垂直方向に隣接するウィンドウが存在しない場合(たとえばウィ ンドウの高さがフレーム全体の高さと同じとき)、エラーをシグナルします。こ のコマンドは変数‘window-min-height’(デフォルトは4)で指定された、最小行数 よりウィンドウの高さを縮小しようとしても、エラーをシグナルします。 同様に‘C-x }’ (‘enlarge-window-horizontally’)は、選択されたウィンドウ の幅を増やし、‘C-x {’ (‘shrink-window-horizontally’)は幅を減らします。こ れらのコマンドは、変数‘window-min-width’(デフォルトは10)で指定された最小 列数よりウィンドウの幅を縮小すると、エラーをシグナルします。 モードライン(*note Mode Line Mouse::を参照してください)、またはウィン ドウ分割線(window dividers。*note Window Dividers::を参照してください)を マウスでクリックすることにより、ウィンドウの高さの変更およびウィンドウの 分割や削除を行なう、別の方法を提供します。 ‘C-x -’ (‘shrink-window-if-larger-than-buffer’)は、バッファー全体を表 示するのに必要な高さより選択されたウィンドウの高さが大きいときは、選択さ れたウィンドウの高さを減らします。余った行数はフレームの他のウィンドウに 与えられます。 ‘C-x +’ (‘balance-windows’)を使って、選択されたフレームのすべてのウィ ンドウの高さを均等にすることもできます。 20.6 ウィンドウでのバッファーの表示 =================================== ユーザーのコマンドの結果として、任意のバッファーが表示またはポップアップ されるのは、Emacsでは一般的な処理です。コマンドがこれを行うには、いくつ かの異なる方法があります。 ‘C-x C-f’ (‘find-file’)のような多くのコマンドは、デフォルトでは選択さ れたウィンドウを“乗っ取って”バッファーを表示します。 選択されたウィンドウを乗っ取らずに、たとえばウィンドウを分割して新し いウィドウを作り、そこにバッファーを表示するといったような、利口な表示を 試みるコマンドがいくつかあります。さまざまなヘルプコマンド(*note Help::)を含む、そのようなコマンドは内部的に‘display-buffer’を呼び出すこ とにより機能します。詳細は、*note Window Choice::を参照してください 他のコマンドは‘display-buffer’と同じことを行いますが、それに加えてバ ッファーの編集を開始できるように、表示されたウィンドウを選択します。コマ ンド‘C-x `’ (‘next-error’)が1つの例です(*note Compilation Mode::を参照し てください)。そのようなコマンドは、内部的に関数‘pop-to-buffer’を呼び出す ことにより機能します。*note Switching to a Buffer in a Window: (elisp)Switching Buffers.を参照してください。 名前が‘-other-window’で終わるコマンドは、‘display-buffer’と同じように 振る舞います。例外はそれらが決して選択されたウィンドウに表示しない点です 。これらのコマンドのいくつかは、プレフィクスキー‘C-x 4’にバインドされて います(*note Pop Up Window::を参照してください)。 名前が‘-other-frame’で終わるコマンドは、‘display-buffer’と同じように 振る舞います。例外は、i)選択されたウィンドウに決して表示しない、ii)望む バッファーを表示するために新たなフレームを作成するか、他のフレーム上のウ ィンドウを使用する、という2点です。これらのコマンドのいくつかは、プレフ ィクスキー‘C-x 5’にバインドされています。 20.6.1 ‘display-buffer’が機能する方法 ------------------------------------- ‘display-buffer’コマンド(およびこのコマンドを内部的に呼び出すコマンド)は 、以下で与えられたステップに従って、表示するウィンドウを選択します。この ステップの順番を変更する方法については、*note Choosing a Window for Displaying a Buffer: (elisp)Choosing Window.を参照してください。 • 他に考慮されるべき点とは無関係に、そのバッファーが選択されたウィン ドウ内に表示されるべき場合は、選択されたウィンドウを再利用します。 デフォルトではこのステップはスキップされますが、オプション ‘display-buffer-alist’ (*note Choosing a Window for Displaying a Buffer: (elisp)Choosing Window.を参照)にバッファー名にマッチする正 規表現を追加して、アクション関数‘display-buffer-same-window’ (*note Action Functions for Buffer Display: (elisp)Buffer Display Action Functions.を参照)でそれを参照することにより、Emacsにスキップしない よう告げることができます。たとえば、選択されたウィンドウ内に優先的 にバッファー‘*scratch*’を表示するには、以下のように記述します: (customize-set-variable 'display-buffer-alist '("\\*scratch\\*" (display-buffer-same-window))) デフォルトでは、‘display-buffer-alist’は‘nil’です。 • 上記以外の場合、バッファーがすでに既存のウィンドウに表示されている ときは、そのウィンドウを再利用します。通常は選択されたフレームのウ ィンドウだけが考慮されますが、対応するアクション alist‘reusable-frames’エントリー(*note Action Alists for Buffer Display: (elisp)Buffer Display Action Alists.を参照)を使用している 場合は、他のフレームのウィンドウも再利用可能です。これを行う例は、 次のステップを参照してください。 • 上記以外の場合、オプションで新しいフレームを作成して、バッファーを そこに表示します。デフォルトではこのステップはスキップされます。こ れを有効にするには、以下のようにオプション ‘display-buffer-base-action’ (*note Choosing a Window for Displaying a Buffer: (elisp)Choosing Window.を参照)の値を変更してく ださい: (customize-set-variable 'display-buffer-base-action '((display-buffer-reuse-window display-buffer-pop-up-frame) (reusable-frames . 0))) このカスタマイズでは、すべての可視およびアイコン化されたフレーム上 の再利用可能なウィンドウを検索するステップを先行して試みるでしょう 。 • 上記以外の場合、選択されたフレームのウィンドウを分割することにより 、新しいウィンドウを作成して、バッファーを新しく作成したウィンドウ に表示しようと試みます。 分割は垂直または水平に行われる可能性があり、それは変数 ‘split-height-threshold’および‘split-width-threshold’に依存します。 これらの変数には整数値を指定します。‘split-height-threshold’が選択 されたウィンドウの高さより小さい場合、分割により下が新しいウィンド ウになります。上記以外の場合、‘split-width-threshold’が選択されたウ ィンドウの幅より小さい場合、分割により右が新しいウィンドウになりま す。どちらの条件も適用できなかったとき、Emacsは分割により下を新しい ウィンドウにしようと試みますが、それは選択されたウィンドウが以前に 分割されていなかった場合に限られます(過剰な分割を避けるため)。 • 上記以外の場合、そのウィンドウに前に表示されていたバッファーを表示 します。通常は選択されたフレームのウィンドウだけが考慮されますが、 適正なアクションalistエントリー‘reusable-frames’ (上記参照)により、 他のフレームのウィンドウかもしれません。 • 上記以外の場合、選択されたフレームの既存のウィンドウのバッファーを 表示します。 • 何らかの理由により上記すべてが失敗した場合、新しいフレームを作成し て、そこにバッファーを表示します。 20.6.2 編集不可バッファーの表示 ------------------------------- ウィンドウに表示されるバッファーの中には、編集のためではなく閲覧するため のものがあります。Helpコマンド(*note Help::)は通常、この目的のために ‘*Help*’と呼ばれるバッファーを使用し、ミニバッファーの補完(*note Completion::)は別の‘*Completions*’と呼ばれるバッファーなどを使用します。 このようなバッファーは通常、短時間しか表示されません。 Emacsは通常、このような一時的に表示されるウィンドウを、前のサブセクシ ョンで説明したように‘display-buffer’を通じて表示します。一方、 ‘*Completions*’バッファーは通常、そのフレームにいくつウィンドウが表示さ れているかに関わらず、選択されたフレームの最下のウィンドウに表示されます 。 一時的なバッファーを他のやり方でEmacsに表示させたい場合、変数 ‘display-buffer-alist’ (*note Choosing a Window for Displaying a Buffer: (elisp)Choosing Window.を参照)をカスタマイズしてください。たとえば、常に 選択されたウィンドウの下に‘*Completions*’を表示するには、初期化ファイル (*note Init File::を参照)で以下のフォームを使用します: (customize-set-variable 'display-buffer-alist '(("\\*Completions\\*" display-buffer-below-selected))) Emacsは通常、バッファーの内容のすべてを表示するのに必要な大きさのウィ ンドウを作成するという点において、‘*Completions*’バッファーは特別です。 たとえば‘*Help*’バッファーなど、他の一時表示でこのようなウィンドウのリサ イズを行なうには、マイナーモード(*note Minor Modes::を参照)の ‘temp-buffer-resize-mode’ (*note Temporary Displays: (elisp)Temporary Displays.を参照)に切り替えます。 ‘temp-buffer-resize-mode’でリサイズされるウィンドウの最大サイズは、オ プション‘temp-buffer-max-height’と‘temp-buffer-max-width’ (*note Temporary Displays: (elisp)Temporary Displays.)で制御できます。最大サイ ズは、ウィンドウが含まれるフレームのサイズを超えることはできません。 20.7 ウィンドウ処理のための便利な機能 ===================================== Winnerモードは、ウィンドウの設定変更(たとえばフレームのウィンドウがどの ように分割されたか)を記録するグローバルマイナーモードなので、それらを undoできます。Winnerモードは‘M-x winner-mode’、または変数‘winner-mode’を カスタマイズすることにより、切り替えることができます。このモードが有効な 場合、‘C-c left’ (‘winner-undo’)は、左のウィンドウの設定変更をundoします 。undoしてから気が変わった場合、‘C-c right’ (‘M-x winner-redo’)を使って 、undoした変更を再実行することができます。 Followモード(‘M-x follow-mode’)は、複数のウィンドウの同じバッファーを 同期するので、バッファーの隣接した部分が常に表示されます。*note Follow Mode::を参照してください。 Windmoveパッケージは、フレーム内の隣接したウィンドウ間を直接移動する コマンドを定義します。rightの部分をleft、up、downに置き換えると、対応す る方向の隣接するウィンドウを選択します。 ‘M-x windmove-default-keybindings’は、これらのコマンドを‘S-right’などに バインドします。これにより、これらのキーを使ったシフト選択が無効になりま す(*note Shift Selection::を参照してください)。 コマンド‘M-x compare-windows’は、異なるウィンドウに表示されたテキスト を比較します。*note Comparing Files::を参照してください。 Scroll Allモード(‘M-x scroll-all-mode’)は、スクロールおよびポイント移 動コマンドが、表示されているすべてのウィンドウに適用されるグローバルマイ ナーモードです。 21 フレームとグラフィカルなディスプレー *************************************** Emacsがグラフィカルなディスプレー(たとえばXウィンドウシステム)で開始され たときは、システムレベルのグラフィカルな表示領域(display region)を占有し ます。このマニュアルではこれを“フレーム”と呼び、“ウィンドウ”という言葉は フレームでバッファーを表示する部分のために使います。フレームには最初1つ のウィンドウが含まれていますが、これを複数のウィンドウに分割することがで きます。フレームには通常、メニューバー、ツールバー、エコーエリアも含まれ ます。 追加のフレームを作ることもできます(*note Creating Frames::を参照して ください)。同じEmacsセッションで作られたすべてのフレームは、背後にあるバ ッファーや、その他のデータにアクセスします。たとえば1つ以上のフレームで 表示されているバッファーは、あるフレームに表示されているものに変更を加え ると、即座に他のフレームに反映されます。 ‘C-x C-c’とタイプすると、現在表示されているすべてのフレームを閉じて、 他に表示されているフレームがなければ、Emacsセッションを終了します(*note Exiting::を参照してください)。選択されたフレームだけを閉じるには、‘C-x 5 0’(これは‘o’ではなくゼロです)とタイプします。 このセクションでは、グラフィカルなディスプレーに特有の機能(特にマウス コマンド)と、複数フレームを管理する機能について説明します。テキスト端末 では、これらの機能の多くは利用できません。しかしテキスト端末で複数のフレ ームを作ることは可能です。そのようなフレームは1度に1つだけ表示され、テ キスト画面全体を占有します(*note Non-Window Terminals::を参照してくださ い)。テキスト端末の中には、マウスを使うことが可能なものがいくつかありま す(GNUおよびUnix systemsでこれを行うには、*note Text-Only Mouse::を、 MS-DOSでこれを使うには、 *note MS-DOS Mouse::を参照してください )。メニ ューはすべてのテキスト端末でサポートされています。 21.1 編集のためのマウスコマンド =============================== ‘mouse-1’ クリックした場所にポイントを移動します(‘mouse-set-point’)。 ‘Drag-mouse-1’ ドラッグにより選択されたテキストを取り囲むリージョンをアクティブ化 して、そのテキストをプライマリー選択に置きます (‘mouse-set-region’)。 ‘mouse-2’ クリックした場所にポイントを移動して、そこにプライマリー選択の内容 を挿入します(‘mouse-yank-primary’)。 ‘mouse-3’ リージョンがアクティブなときは、近くにあるリージョンの終端をクリッ クした位置に移動します。アクティブでないときは現在のポイントにマー クをセットして、ポイントをクリックした位置に移動します。結果となる リージョンはkillリングに保存されます。2回目のクリックでリージョンを killします(‘mouse-save-then-kill’)。 もっとも基本的なマウスコマンドは‘mouse-set-point’で、これはウィンドウ のテキスト領域でマウスの左ボタン、‘mouse-1’をクリックすることにより呼び 出されます。これはポイントをクリックされた位置に移動します。そのウィンド ウが選択されたウィンドウでなかったとき、そのウィンドウが選択されたウィン ドウになります。‘mouse-1’をダブルクリックして、リージョンをアクティブに することもできます(*note Word and Line Mouse::を参照)。 クリックしたフレームが選択されたフレームでなかった場合は通常、クリッ クされたフレームが選択されたフレームになるのに加えて、ウィンドウも選択さ れてカーソルがセットされます。Xウィンドウシステムでは、変数 ‘x-mouse-click-focus-ignore-position’を‘t’にセットすることにより、これを 変更できます。この場合、選択されていないフレームへの最初のクリックではフ レームだけを選択し、他は変更しません。次にクリックするとそのウィンドウを 選択してカーソルをその位置にセットします。 ‘mouse-1’を押してテキストの周辺をドラッグすると、最初にマウスボタンを 押した位置にマークが置かれ、ボタンを離した位置にポイントがセットされ (*note Mark::を参照してください)、その領域がアクティブになります (‘mouse-set-region’)。それに加えてリージョンのテキストがプライマリー選択 となります(*note Primary Selection::を参照してください)。 変数‘mouse-drag-copy-region’を非‘nil’値に変更すると、テキストの周囲を ドラッグすることにより、そのテキストをkillリングに追加します。デフォルト は‘nil’です。 ドラッグしている途中でマウスがウィンドウの上または下を超えた場合、マ ウスがウィンドウ内に戻るまで、ウィンドウが一定の割合でスクロールします。 この方法により、スクリーン全体に収まらないリージョンを選択できます。1度 に何行スクロールするかは、マウスがウィンドウの縁からどれだけ離れたかに依 存します。変数‘mouse-scroll-min-lines’は、最小ステップサイズを指定します 。 マウスの真ん中のボタン、‘mouse-2’をクリックすると、クリックした位置に ポイントを移動して、プライマリー選択の内容を挿入します (‘mouse-yank-primary’)。*note Primary Selection::を参照してください。こ の振る舞いは、他のXアプリケーションと一貫性があります。かわりに ‘mouse-2’を、‘mouse-yank-at-click’にバインドできます。これはクリックした 位置にyankするコマンドです。 変数‘mouse-yank-at-point’を非‘nil’値に変更すると、‘mouse-2’はポイント を移動しません。これはどこをクリックしたか、フレームのどのウィンドウをク リックしたかに関係なく、ポイントのある位置にテキストを挿入します。この変 数は‘mouse-yank-primary’と‘mouse-yank-at-click’の両方に影響します。 マウスの右ボタン、‘mouse-3’をクリックすると、コマンド ‘mouse-save-then-kill’が実行されます。これはどこをクリックしたかと、リー ジョンの状態に依存していくつかのアクションを処理します。 • アクティブなリージョンがないときは、‘mouse-3’のクリックにより、ポイ ントがあった位置にマークをセットし、クリックした位置にポイントを置 いて、リージョンをアクティブにします。 • リージョンがアクティブなときは、‘mouse-3’のクリックにより、クリック した位置に近いリージョンの終端を、クリックした位置に調整します。調 整されたリージョンのテキストは、killリングにコピーされます。元のリ ージョンのテキストがすでにkillリングにある場合は、それを置き換えま す。 • 元のリージョンが‘mouse-1’のダブルクリックまたはトリプルクリックで選 択されたものである場合、リージョンは単語全体、または行全体にたいし て定義されているので(*note Word and Line Mouse::を参照してください )、‘mouse-3’によるリージョンの調整も単語全体または行全体を単位とし て行われます。 • 同じ場所で連続して2回‘mouse-3’を使うことにより、すでに選択されてい るリージョンをkillできます。したがってマウスでテキストをkillする簡 単な方法は、まずリージョンの始端を決めるため‘mouse-1’をクリックして 、もう一方の終端で‘mouse-3’を2回クリックします。テキストを削除せず にkillリングにコピーするには、‘mouse-3’を1回だけクリックするか、テ キスト範囲をドラッグします。その後は適当な場所でyankしてコピーでき ます。 ‘mouse-save-then-kill’コマンドは、変数‘mouse-drag-copy-region’の値に もしたがいます(上記参照)。変数の値が非‘nil’のときは、コマンドがアクティ ブなリージョンをセットまたは調整したとき、常にリージョンのテキストは killリングにも追加されます。一番最近のkillリングのエントリーが同じ方法で 追加されたものである場合、新しいエントリーを作成せず、そのエントリーを置 き換えます。 上記で説明した任意のマウスコマンドを使ってセットしたリージョンは、シ フト選択以外のマウス移動コマンド、および通常のマークを非アクティブ化する 方法により、マークが非アクティブになります。*note Shift Selection::を参 照してください。 スクロールに使うことができる“ホイール”があるマウスもいくつかあります 。Emacsはデフォルトで、マウスホイールによるウィンドウのスクロールを、ほ とんどのグラフィカルなディスプレーでサポートします。この機能を切り替える には、‘M-x mouse-wheel-mode’を使います。変数‘mouse-wheel-follow-mouse’お よび‘mouse-wheel-scroll-amount’は、(どこでホイールによるスクロール操作が 行われたかによる)スクロール対象の選択方法と、バッファーがスクロールされ る量を決定します。変数‘mouse-wheel-progressive-speed’は、スクロールの早 さがホイールを移動した早さにリンクするかを決定します。 チルトホイール(横スクロール)つきのマウスの場合、Emacsは水平スクロール もサポートします。この機能はデフォルトではオフで、変数 ‘mouse-wheel-tilt-scroll’でオンになります。水平スクロールの方向を逆転し たい場合は、変数‘mwheel-flip-direction’を非‘nil’値にカスタマイズしてくだ さい。 21.2 単語と行にたいするマウスコマンド ===================================== 以下の‘mouse-1’の変種は、1度に単語全体または行全体を選択します。Emacsは 選択されたテキスト周辺のリージョンをアクティブにして、killリングにもコピ ーされます。 ‘Double-mouse-1’ クリックした単語や文字周辺のテキストを選択します。 シンボルの構文をもつ文字(C modeでのアンダースコアーなど)をダブルク リックすると、シンボルを取り囲むその文字を選択します。開きカッコ(ま たは閉じカッコ)の構文をもつ文字をダブルクリックすると、そのカッコで 始まる(または終わる)グループを選択します。区切り文字の構文をもつ文 字(Cのシングルクォーテーションやダブルクォーテーション)をダブルクリ ックすると、文字列定数を選択します(Emacsはその文字により開始するの か(または終了するのか)を、発見的な手法を使って見つけ出します)。 カッコによるグループ化、または文字列の区切り文字の先頭をダブルクリ ックすると、そのリージョンの最後にポイントが移動します。新たな位置 を表示するために必要なら、バッファーの表示を前方にスクロールします 。カッコによるグループ化、または文字列の区切り文字の終端をダブルク リックしても、デフォルトではポイントはそのリージョンの終端に留まり 、リージョンの先頭がウィンドウ上端より上にある場合は表示されません 。必要ならバッファーの表示を後方にスクロールすてリージョンの先頭に 移動するように変更するには、ユーザーオプション ‘mouse-select-region-move-to-beginning’を非‘nil’にセットしてくださ い。 ‘Double-Drag-mouse-1’ 単語全体を単位として、ドラッグした箇所のテキストを選択します。 ‘Triple-mouse-1’ クリックした行を選択します。 ‘Triple-Drag-mouse-1’ 行全体を単位として、ドラッグした箇所のテキストを選択します。 21.3 マウスで参照をフォローする =============================== Emacsのバッファーには“ボタン”や、アクティブ化(例えばクリック)したとき何 らかのアクション(例えば参照をフォローする)を行う、“ハイパーリンク”を含む ものがあります。ボタンのテキストは通常、アンダーラインが引かれていたり、 周囲にボックスが描かれて、視覚的にハイライトされています。ボタンの上にマ ウスを移動すると、マウスカーソルの形状が変化して、ボタンがライトアップさ れます。変数‘mouse-highlight’を‘nil’に変更すると、Emacsはこのハイライト 機能を無効にします。 ボタンをアクティブにするには、ポイントをそこに移動してをタイプす るか、‘mouse-1’または‘mouse-2’でボタンをクリックします。たとえばDiredバ ッファーでは、ファイル名がボタンです。これをアクティブにすることにより、 Emacsはそのファイルをvisitします(*note Dired::を参照してください)。 ‘*Compilation*’バッファーでは、各エラーメッセージがボタンです。これをア クティブにすることにより、そのエラーにたいするソースコードをvisitします (*note Compilation::を参照してください)。 ボタンを‘mouse-1’でクリックすると、ボタンがアクティブになりますが、マ ウスボタンを押してから離すまで一定時間(厳密に言うと450ミリ秒以上)が経過 すると、Emacsはボタンをアクティブにせず、ポイントをクリックした場所に移 動します。この方法によりボタンをアクティブにせずにポイントを移動するのに 、マウスを使用できます。マウスをボタンの上にドラッグすると、通常どおりリ ージョンをセットして、ボタンはアクティブにしません。 ボタンにたいして‘mouse-1’がどのように適用されるかは、 ‘mouse-1-click-follows-link’をカスタマイズすることにより変更できます。変 数の値が正の整数の場合、それはボタンのアクティブ化を取り消すのに、何ミリ 秒マウスボタンを押しつづける必要があるかを指定します。前のパラグラフで説 明したように、デフォルトは450です。値が‘nil’の場合、‘mouse-1’は単にクリ ックした場所にポイントを移動するだけで、ボタンをアクティブにしません。値 が‘double’の場合、シングルクリックでポイントのセット、ダブルクリックでボ タンをアクティブにします。 選択されていないウィンドウのボタンでも通常、‘mouse-1’でクリックすれば ボタンがアクティブになります。変数 ‘mouse-1-click-in-non-selected-windows’を‘nil’に変更した場合、選択されて いないウィンドウのボタンを‘mouse-1’でクリックすると、クリックした位置に ポイントを移動してウィンドウを選択しますが、ボタンはアクティブになりませ ん。 21.4 メニューにたいするマウスクリック ===================================== およびで修飾されたマウスクリックにより、メニューが表示され るものがいくつかあります。 ‘C-mouse-1’ このメニューはバッファーを選択するためのものです。 MSB(“mouse select buffer”)グローバルマイナーモードは、このメニュー をスマートで、よりカスタマイズ可能なものにします。 *note Buffer Menus::を参照してください。 ‘C-mouse-2’ このメニューには、フェイスや他のテキストプロパティーをテストしたり 、それらを設定するものが含まれます(後者は主にEnriched textを編集す るのに便利です。*note Enriched Text::を参照してください)。 ‘C-mouse-3’ このメニューは、モードに特有なメニューです。Menu-barモードがオンの 場合、ほとんどのモードでは、このメニューに、そのモード特有なメニュ ーバーのメニューと同じアイテムを表示します。このボタンに異なるメニ ューを指定するモードもいくつかあります。Menu-barモードがオフの場合 、このメニューにはモード特有のメニューだけでなく、本来メニューバー に含まれるべきすべてのアイテムが含まれるので、メニューバーを表示せ ずに、それらにアクセスすることができます。 ‘S-mouse-1’ このメニューはそのウィンドウのバッファーの、デフォルトのフェイスを 変更するためのものです。*note Text Scale::を参照してください。 グラフィカルなアプリケーションには、‘mouse-3’をモード特有なメニューに 使うものもいくつかあります。‘mouse-3’で‘mouse-save-then-kill’コマンドを 実行するかわりに、Emacsにこのようなメニューを表示させるには、以下の行を initファイルに追加して‘mouse-3’をリバインドします(*note Init Rebinding::を参照してください)。 (global-set-key [mouse-3] 'mouse-popup-menubar-stuff) 21.5 モードラインのマウスコマンド ================================= ウィンドウのモードラインをマウスでクリックして、ウィンドウを選択したり操 作することができます。 モードラインのいくつかの領域、たとえばバッファー名や、メジャーモード およびマイナーモードは、独自のマウスバインディングをもっています。これら の領域にマウスを移動すると、その領域がハイライトされ、特別なバインディン グが表示されます(*note Tooltips::を参照してください)。このセクションのコ マンドは、それらの領域には適用できません。 ‘mouse-1’ モードラインを‘mouse-1’でクリックすると、それが属するウィンドウを選 択します。モードライン上で‘mouse-1’でドラッグすることにより、それを 移動することができるので、ウィンドウの高さを変更することができます 。マウスでの高さの変更により、ウィンドウが削除されることはありませ ん。ウィンドウの高さが定められた最小値より小さくなる場合は、拒絶さ れます。 ‘mouse-2’ モードラインを‘mouse-2’でクリックすると、そのウィンドウがフレーム全 体に表示されます。 ‘mouse-3’ モードラインを‘mouse-3’でクリックすると、それが属するウィンドウを削 除します。フレームにウィンドウが1つしかないときは、何もしません。 ‘C-mouse-2’ モードラインを‘C-mouse-2’でクリックすると、クリックした位置でウィン ドウを左右に分割します(*note Split Window::を参照してください)。 さらに、左右に並んだモードラインの間にある分割線を、‘mouse-1’でクリッ クしてドラッグすることにより、垂直の境界線を左右に移動できます。 ウィンドウのサイズ変更は、‘window-resize-pixelwise’の値に影響されるこ とに注意してください。詳細は*note Split Window::を参照してください。 21.6 フレームの作成 =================== プレフィクスキー‘C-x 5’は、‘C-x 4’に類似しています。‘C-x 4’コマンドが、 選択されたフレームの別ウィンドウにバッファーを表示するのにたいして、‘C-x 5’は異なるフレームを使います。可視またはアイコン化(“最小化”とも言われる 。*note (elisp)Visibility of Frames::を参照)されたフレームで、すでに要求 されたバッファーが表示されている場合、そのフレームを手前に表示して非アイ コン化(“最小化解除”)されます。それ以外の場合は、新しいフレームが現在の表 示端末に作成されます。 以下の‘C-x 5’コマンドは、選択するバッファーを検索したり作成する方法が 異なります。 ‘C-x 5 2’ 新しいフレームを作成します(‘make-frame-command’)。 ‘C-x 5 b BUFNAME ’ バッファーBUFNAMEを他のフレームで選択します。これは ‘switch-to-buffer-other-frame’を実行します。 ‘C-x 5 f FILENAME ’ ファイルFILENAMEをvisitして、そのバッファーを他のフレームで選択しま す。これは‘find-file-other-frame’を実行します。*note Visiting::を参 照してください。 ‘C-x 5 d DIRECTORY ’ ディレクトリーDIRECTORYにたいするDiredバッファーを、他のフレームで 選択します。これは‘dired-other-frame’を実行します。*note Dired::を 参照してください。 ‘C-x 5 m’ 他のフレームでメールメッセージの作成を開始します。これは ‘compose-mail-other-frame’を実行します。これは‘C-x m’の異なるフレー ム版です。*note Sending Mail::を参照してください。 ‘C-x 5 .’ 他のフレームで識別子の定義を検索します。これは ‘xref-find-definitions-other-frame’を実行する、‘M-.’の複数フレーム 版です。*note Xref::を参照してください。 ‘C-x 5 r FILENAME ’ ファイルFILENAMEを読み取り専用でvisitして、そのバッファーを他のフレ ームで選択します。これは‘find-file-read-only-other-frame’を実行しま す。*note Visiting::を参照してください。 “フレームパラメーター(frame parameters)”を指定することにより、新しく 作成されるフレームの外見と動作を制御できます。*note Frame Parameters::を 参照してください。 21.7 フレームコマンド ===================== 以下のコマンドは、フレームを削除したり操作するために使われます: ‘C-x 5 0’ 選択されたフレームを削除します(‘delete-frame’)。1つしかフレームがな いときは、エラーをシグナルします。 ‘C-z’ 選択されたEmacsフレームを最小化(またはアイコン化)します (‘suspend-frame’)。*note Exiting::を参照してください。 ‘C-x 5 o’ 他のフレームを選択して手前に表示します。このコマンドを繰り返すと、 端末のすべてのフレームを循環することができます。 ‘C-x 5 1’ 現在の端末の、選択されたフレーム以外のすべてのフレームを削除します 。 ‘M-’ カレントフレームの最大化を切り替えます。フレームが最大化されている ときはスクリーン全体に表示されます。 ‘’ カレントフレームのフルスクリーンモードを切り替えます(フルスクリーン と最大化の違いは、前者がウィンドウマネージャーの装飾を隠すことで、 これによりEmacs自身のスクリーンスペースが若干増えます)。 フレームを本当に最大化またはフルスクリーンにするためには、変数 ‘frame-resize-pixelwise’を非‘nil’値にカスタマイズする必要があるウィンド ウマネージャーもいくつかあります。この変数を非‘nil’値にセットすると、一 般的にフレームのサイズ変更を行や列の整数倍ではなく、ピクセル単位で行うこ とができます。 ‘C-x 5 0’ (‘delete-frame’)コマンドは、選択されたフレームを削除します 。しかしEmacsセッションとの対話能力が失われるのを防ぐため、Emacsセッショ ンの最後のフレームの削除は拒絶します。Emacsがデーモンとして実行されてい るとき(*note Emacs Server::を参照してください)は、普通の対話的なフレーム がすべて削除された後も、常に仮想的なフレーム(virtual frame)が残ります。 この場合、‘C-x 5 0’は最後の対話的なフレームを削除できます。Emacsセッショ ンに再接続するには、‘emacsclient’を使うことができます。 ‘C-x 5 1’ (‘delete-other-frames’)コマンドは、現在の端末(端末にはグラ フィカルなディスプレーとテキスト端末の両方が含まれます)の、カレントのフ レーム以外のすべてのフレームを削除します。*note Non-Window Terminals::を 参照してください)。他のグラフィカルなディスプレー、またはテキスト端末で 開いたフレームをもっている場合、これらは削除されません。 ‘C-x 5 o’ (‘other-frame’)コマンドは、現在の端末の次のフレームを選択し ます。EmacsをXウィンドウシステム上のウィンドウマネージャーで使っていて、 どんなフレームだろうと、マウスカーソルが上にくるとそのフレームを選択(ま たは“フォーカスを与える”)するようになっている場合、このコマンドが正常に 機能するために、変数‘focus-follows-mouse’を‘t’に変更する必要があります。 これは‘C-x 5 o’を呼び出し、マウスカーソルを選択されたフレームにワープさ せます。 21.8 フォント ============= デフォルトでは、Emacsはグラフィカルなディスプレーでテキストを表示するの に、10ポイントのmonospaceフォントを使います。違うフォントを指定する異な る方法がいくつかあります: • ‘Options’メニューの‘Set Default Font’をクリックします。これは既存の グラフィカルなフレームすべてのデフォルトを、選択したフォントにしま す。これを将来のセッションのために保存するには、‘Options’メニューの ‘Save Options’をクリックしてください。 • 以下のように、‘font’パラメーターを指定するように、変数 ‘default-frame-alist’を変更する行をinitファイルに追加します: (add-to-list 'default-frame-alist '(font . "DejaVu Sans Mono-10")) これはこのinitファイルで再起動した後の、Emacsが作るすべてのグラフィ カルなフレームのデフォルトを、指定したフォントにします。 • 以下のようにXリソースファイルに、Xリソースセッティング ‘emacs.font’を追加します: emacs.font: DejaVu Sans Mono-12 Xリソースファイルが効果を表すには、Xを再起動するか‘xrdb’コマンドを 使わなければなりません。*note Resources::を参照してください。Xリソ ースファイルでは、フォント名をクォートしないでください。 • EmacsをGNOMEデスクトップで実行している場合、変数 ‘font-use-system-font’を‘t’(デフォルトは‘nil’)にセットして、Emacsに デフォルトのシステムフォントを使うように指示できます。これが機能す るには、EmacsがGsetting(または古いGconf)のサポートつきでコンパイル されていなければなりません。 • コマンドラインオプション‘-fn’(または‘--font’)を使います。*note Font X::を参照してください。 現在使っているフォントをチェックするには、‘C-u C-x =’コマンドが有用で す。これはポイント位置の文字の説明と、それを描画しているフォント名を表示 します。 Xでは、フォント名を表現する異なる方法がいくつか存在します。1番目は “Fontconfigパターン”を使う方法です。Fontconfigパターンは以下の形式をもち ます: FONTNAME[-FONTSIZE][:NAME1=VALUES1][:NAME2=VALUES2]... このフォーマットでは、大カッコ(brackets)の中の要素は省略可能です。 FONTNAMEは、‘Monospace’や‘DejaVu Sans Mono’のような、フォントの“ファミリ ー名”です。FONTSIZEは、フォントの“ポイントサイズ”(1“プリンターポイント ”はおよそ1/72インチです)で、エントリー‘NAME=VALUES’は、フォントのslantや weightなどのセッティングを指定します。VALUESには1つの値か、カンマで区切 られた値のリストを指定します。それらに加えていくつかのプロパティー値は、 ある種のプロパティー名だけで有効なものがあり、それらについては‘NAME=’部 分を省略できます。 以下は、一般的なフォントプロパティーの一覧です: ‘slant’ ‘italic’、‘oblique’、‘roman’のうちの、どれか1つです。 ‘weight’ ‘light’、‘medium’、‘demibold’、‘bold’、‘black’のうちの、どれか1つで す。 ‘style’ slantとweightを組み合わせた、特別なstyleを定義するフォントがいくつ かあります。たとえば‘Dejavu Sans’は、‘book’ styleを定義し、これは slantおよびweightプロパティーをオーバーライドします。 ‘width’ ‘condensed’、‘normal’、‘expanded’のうちの、どれか1つです。 ‘spacing’ ‘monospace’、‘proportional’、‘dual-width’、‘charcell’のうちの、どれ か1つです。 以下はFontconfigパターンの例です: Monospace Monospace-12 Monospace-12:bold DejaVu Sans Mono:bold:italic Monospace-12:weight=bold:slant=italic Fontconfigパターンの、より詳細な説明は、Fontconfigのマニュアルを参照 してください。これはFontconfigとともに配布されており、 からオンラインで利用可能で す。 フォントを指定する2番目の方法は、“GTKフォントパターン”を使う方法です 。これらは以下の構文を使います。 FONTNAME [PROPERTIES] [FONTSIZE] FONTNAMEはファミリー名、PROPERTIESはスペースで区切られたプロパティー値の リストで、FONTSIZEはポイントサイズです。GTKフォントパターンで指定するプ ロパティーは以下のようなものでしょう: • Slantプロパティー: ‘Italic’、‘Oblique’。省略したときはデフォルトの slant(roman)が暗に指定されます。 • Weightプロパティー: ‘Bold’、‘Book’、‘Light’、‘Medium’、 ‘Semi-bold’、‘Ultra-light’。省略したときは‘Medium’ weightが暗に指定 されます。 • Widthプロパティー: ‘Semi-Condensed’、‘Condensed’。省略したときはデ フォルトのwidthが使用されます。 以下にGTKフォントパターンの例をいくつか示します: Monospace 12 Monospace Bold Italic 12 フォントを指定する3番目の方法は、“XLFD”(“X Logical Font Description”)を使う方法です。これはXでフォントを指定する際の伝統的な手法 です。以下のように、各XLFDは14の単語か数字をダッシュで区切ったものからな ります: -misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1 XLFDでのワイルドカード文字(‘*’)は、任意の文字の並び(noneを含む)にマッチ し、‘?’は任意の1文字にマッチします。しかしマッチングは実装依存で、長い名 前の中のダッシュにたいするワイルドカードのマッチが不正確なことがあります 。信頼できる結果を得るためには、14個すべてのダッシュを指定して、ワイルド カードを1つのフィールドだけに使います。XLFDでは大文字小文字の違いは重要 ではありません。XLFDの構文は以下のとおりです: -MAKER-FAMILY-WEIGHT-SLANT-WIDTHTYPE-STYLE... ...-PIXELS-HEIGHT-HORIZ-VERT-SPACING-WIDTH-REGISTRY-ENCODING エントリーは以下の意味をもちます: MAKER フォントのmanufacturer(製造者名)です。 FAMILY フォントのファミリー名です(たとえば‘courier’)。 WEIGHT フォントのweightで、通常は‘bold’、‘medium’、‘light’のどれかです。他 の値をサポートするフォント名もいくつかあります。 SLANT フォントのslantで、通常は‘r’(roman)、‘i’(italic)、‘o’(oblique)、 ‘ri’(reverse italic)、‘ot’(other)のどれかです。他の値をサポートする フォント名もいくつかあります。 WIDTHTYPE フォントのwidthで、通常は‘normal’、‘condensed’、‘semicondensed’、 ‘extended’のどれかです。他の値をサポートするフォント名もいくつかあ ります。 STYLE オプションの追加のstyle名です。通常これは空で、ほとんどのXLFDでは、 この位置に2つのハイフンを続けて指定します。style名には、‘ja’や ‘ko’のような、ISO-639 language nameの2文字を指定することもできます 。CJKスクリプトをサポートするいくつかのフォントは、style名の部分に この記述をもちます。 PIXELS フォントのheightをピクセルで指定します。 HEIGHT プリンターのポイントの1/10を単位とした、スクリーン上のフォントの heightです。フォントのポイントサイズの10倍です。垂直解像度(vertical resolution)を与えれば、HEIGHTとPIXELSは比例します。したがって一方を 指定して、もう一方に‘*’を指定するのが一般的です。 HORIZ フォントが意図するインチあたりのピクセル数で表した、水平解像度 (horizontal resolution)です。 VERT フォントが意図するインチあたりのピクセル数で表した、垂直解像度 (vertical resolution)です。通常、システムのフォント解像度は、スクリ ーンにたいして正しい値になっています。したがって、これとHORIZには ‘*’を指定するのが普通です。 SPACING これには‘m’(monospace)、‘p’(proportional)、‘c’(character cell)を指 定します。 WIDTH ピクセル単位で表した文字の平均widthの10倍です。 REGISTRY ENCODING フォントを描画するXフォント文字セット(X font character set)です(Xフ ォント文字セットはEmacs文字セットと同じではありませんが、似ています )。フォントの選択をチェックするのに、‘xfontsel’コマンドを使うことが できます。通常は、REGISTRYに‘iso8859’、ENCODINGに‘1’を使うべきです 。 フォントを指定する4番目の方法は、フォントニックネーム(font nickname)を 使う方法です。特定のフォントは通常のフォント指定のかわりに、短いニックネ ームをもつものがあります。たとえば‘6x13’は以下と同じです -misc-fixed-medium-r-semicondensed--13-*-*-*-c-60-iso8859-1 X上でのEmacsは、2つのタイプのフォントを認識します。1つは“クライアント サイド”のフォントで、これはXftおよびFontconfigライブラリーにより提供され ます。もう1つは“サーバーサイド”のフォントで、これはXサーバー自身により提 供されます。ほとんどのクライアントサイドフォントは、アンチエイリアシング (antialiasing)やサブピクセルンティング(subpixel hinting)などの、サーバー サイドフォントにはない、進んだフォント機能をサポートします。Fontconfigと GTKパターンは、クライアントサイドフォントだけにマッチします。 すべての文字が同じ幅をもつ固定幅フォントを使いたいと思うでしょう。 XftおよびFontconfigフォントでは、‘fc-list’コマンドを使って、以下のように して利用可能な固定幅フォントを一覧することができます。 fc-list :spacing=mono fc-list :spacing=charcell サーバーサイドのXフォントにたいしては、‘xlsfonts’プログラムを使って、以 下のようにして利用可能な固定幅フォントを一覧することができます。 xlsfonts -fn '*x*' | grep -E '^[0-9]+x[0-9]+' xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-m*' xlsfonts -fn '*-*-*-*-*-*-*-*-*-*-*-c*' XLFDのSPACINGフィールドが、‘m’または‘c’のフォントは固定幅フォントです。 特定のフォントの外見を見るには、以下のように‘xfd’コマンドを使います: xfd -fn 6x13 これはフォント‘6x13’の全体を表示します。 Emacsを実行しているときは、特定の種類のテキスト(*note Faces::を参照し てください)や、特定のフレーム(*note Frame Parameters::を参照してください )のフォントをセットすることもできます。 21.9 スピードバーフレーム ========================= “スピードバー(speedbar)”は、簡単に他のフレームを操作したり処理するための 、特別なフレームです。スピードバーが存在するとき、それは常に“アタッチさ れたフレーム(attached frame)”と呼ばれる、特定のフレームに対応しています 。すべてのスピードバー操作は、そのフレームにたいして処理されます。 ‘M-x speedbar’とタイプすると、スピードバーを作成して、カレントフレー ムに関連付けます。スピードバーを解除するには、再度‘M-x speedbar’とタイプ するか、スピードバーを選択して‘q’とタイプします(他のEmacsフレームを削除 するのと同じ方法で、スピードバーフレームを削除することもできます)。スピ ードバーを他のフレームに関連付けたいときは、一旦解除してから、そのフレー ムで‘M-x speedbar’を呼び出します。 スピードバーは、さまざまなモードを処理できます。デフォルトモードは “File Display(ファイル表示)”モードで、これはアタッチされたフレームの、選 択されたウィンドウのカレントディレクトリーのファイルを、1行に1ファイルず つ表示します。ディレクトリー以外をクリックすると、アタッチされたフレーム の、選択されたウィンドウでそのファイルをvisitし、ディレクトリーをクリッ クすると、スピードバーでそのディレクトリーを表示します(*note Mouse References::を参照してください)。各行には‘[+]’や‘<+>’が記されたボックス があり、それをクリックすると、そのアイテムの内容を“展開”します。ディレク トリーを展開すると、ディレクトリーの内容を、ディレクトリー自身の行の下に 加えてスピードバー表示します。通常のファイルを展開すると、ファイルの中の tagリストをスピードバー表示に加えます。tag名をクリックして、アタッチされ たフレームの選択されたウィンドウで、tagにジャンプできます。ファイルまた はディレクトリーが展開されているときは、‘[+]’が‘[-]’に変化します。ボック スを再度クリックすると、アイテムを収納して、内容を隠すことができます。 キーボードを使ってスピードバーを操作することもできます。スピードバー でポイントのある行でをタイプするのは、そのアイテムをクリックするの と等しく、はアイテムを展開または収納します。‘U’は、カレントディレク トリーの親ディレクトリーを表示します。カレント行のファイルをコピー、削除 、リネーム<するには、‘C’、‘D’、‘R’をタイプします。新しいディレクトリーを 作成するには、‘M’をタイプします。 スピードバーのモードで、他に一般的な目的に使われるのは“Buffer Display(バッファー表示)”モードです。このモードでは、スピードバーは Emacsバッファーのリストを表示します。このモードに切り替えるにはスピード バーで‘b’をタイプします。File Displayモードに戻るには、‘f’をタイプします 。スピードバーのウィンドウのどこかを‘mouse-3’でクリック(またはモードライ ンを‘mouse-1’でクリック)して、ポップアップメニューの‘Displays’を選択して も、表示モードを変更することができます。 Rmailモード、Info、GUDを含むいくつかのメジャーモードは、スピードバー に選択可能な便利なアイテムを配する、特別な方法をもっています。たとえば Rmailモードでは、スピードバーはRmailファイルのリストを表示し、カレントメ ッセージを他のRmailファイルに移動する場合は、それの‘’ボックスをクリッ クします。 スピードバーの使い方とプログラミングに関する詳細は、*note Speedbar: (speedbar)Top.を参照してください。 21.10 複数ディスプレー ====================== 1つのEmacsが、1つ以上のXディスプレーと通信できます。最初、Emacsは環境変 数‘DISPLAY’、または‘--display’オプション(*note Initial Options::を参照し てください)で指定された、ただ1つのディスプレーに表示されます。他のディス プレーに接続するには、コマンド‘make-frame-on-display’を使います: ‘M-x make-frame-on-display DISPLAY ’ ディスプレーDISPLAYに新しいフレームを作成します。 1つのXサーバーは、1つ以上のスクリーンを処理できます。1つのサーバーに 属する2つのスクリーンでフレームを開いた場合、Emacsはそれらが1つのキーボ ードを共有するのを知っているので、これらのスクリーンから到着するすべての コマンドを1つの入力ストリームとして扱います。 異なるXサーバーでフレームを開いた場合、Emacsは各サーバーごとに別な入 力ストリームを作成します。各サーバーは、それぞれ選択されたフレームをもち ます。特定のXサーバーで入力したコマンドは、そのサーバーの選択されたフレ ームに適用されます。 21.11 フレームパラメーター ========================== 変数‘default-frame-alist’の中の、“フレームパラメーター(frame parameters)”のデフォルトリストを指定することにより、すべてのフレームのデ フォルトの外見と振る舞いを制御することができます。この値はエントリーのリ ストで、各エントリーにはパラメーター名と、そのパラメーターの値を指定しま す。これらのエントリーはEmacsが新しいフレームを作るとき(初期フレームを含 む)に効果を及ぼします。 たとえば以下のファイルをinitファイル(*note Init File::を参照してくだ さい)に追加することにより、デフォルトのフレーム幅が90列、デフォルトのフ レーム高さが40行、デフォルトフォントに‘Monospace-10’を指定します。 (add-to-list 'default-frame-alist '(width . 90)) (add-to-list 'default-frame-alist '(height . 40)) (add-to-list 'default-frame-alist '(font . "Monospace-10")) フレームパラメーターのリストと、その効果については、*note (elisp)Frame Parameters::を参照してください. 変数‘initial-frame-alist’をカスタマイズすることにより、初期フレームだ けに適用されるフレームパラメーターのリストを指定することもできます。 EmacsがX ツールキットを使ってコンパイルされている場合、カラーとフォン トを指定するフレームパラメーターは、メニューとメニューバーには影響を及ぼ しません。なぜなら、それらはEmacsが直接描画しているのではなく、ツールキ ットにより描画されているからです。 フレームの外観と振る舞いも、Xリソースを通じてカスタマイズできます (*note X Resources::を参照)。これらはinitファイル内で指定された初期フレ ームのパラメーターをオーバーライドします。 セッションの保存とリストアのためにdesktopライブラリーを使用している場 合は、desktopファイルに記録されたフレームが、これらのパラメーターととも にリストアされることに注意してください。これらのフレームがリストアされる ときは、initファイル内で‘default-frame-alist’および ‘initial-frame-alist’で指定されているフレームパラメーターよりも、記録さ れたパラメーターが優先されます。これを避ける方法については、*note Saving Emacs Sessions::を参照してください。 21.12 スクロールバー ==================== グラフィカルなディスプレーでは、Emacsウィンドの横に“垂直スクロールバー (vertical scroll bar)”があります。スクロールバーのupボタンまたはdownボタ ンを‘mouse-1’でクリックすると、ウィンドウを1行ずつスクロールします(しか し、これらのボタンがないようにスクロールバーをカスタマイズできるツールキ ットもある)。スクロールバー内部のボックスの上または下を‘mouse-1’でクリッ クすると、‘M-v’または‘C-v’と同様に、ほぼウィンドウ全体の高さ分スクロール します(*note Moving Point::を参照) (これも、いくつかのツールキットでは動 作が異なるかもしれない)。スクロールバー内部のボックスをドラッグすると、 連続してスクロールします。 EmacsがXウィンドウシステム上でXツールキットサポートなしでコンパイルさ れている場合、スクロールバーは違った振る舞いをします。スクロールバーの任 意の箇所を‘mouse-1’でクリックすると‘C-v’のように前方にスクロールし、 ‘mouse-3’でクリックすると‘M-v’のように後方にスクロールします。スクロール バーで‘mouse-2’をクリックすると、スクロールバー内部のボックスを上下にド ラッグできます。 垂直スクロールバーの使用を切り替えるには、‘M-x scroll-bar-mode’とタイ プします。このコマンドは、まだ作成されていないフレームも含めて、すべての フレームに適用されます。選択されたフレームの垂直スクロールバーだけ切り替 えたい場合は、コマンド‘M-x toggle-scroll-bar’を使用してください。 起動時に垂直スクロールバーの使用を制御するには、変数 ‘scroll-bar-mode’をカスタマイズします。この変数の値は、‘right’(ウィンド ウの右にスクロールバーを配します)、‘left’(ウィンドウの左にスクロールバー を配します)、‘nil’(垂直スクロールバーを無効にします)のどれかです。 EmacsがXウィンドウシステム上でGTK+サポートつきでコンパイルされている、ま たはMS-Windows、macOSの場合、デフォルトでは右にスクロールバーを配します 。EmacsがXウィンドウシステム上でGTK+サポートなしでコンパイルされている場 合、(古いXアプリケーションの慣例にしたがって)スクロールバーを左に配しま す。 Xリソース‘verticalScrollBars’を使って、スクロールバーの有効または無効 にすることができます(*note Resources::を参照してください)。スクロールバ ーの幅を制御するにはフレームパラメーター‘scroll-bar-width’を変更してくだ さい(*note (elisp)Frame Parameters::を参照してください)。 (GTK+またはMotifとともに)X上でEmacsを使っている場合、変数 ‘scroll-bar-adjust-thumb-portion’をカスタマイズして、スクロールバーの“オ ーバースクロール(overscrolling: たとえばバッファーの最後が表示されていて もさらに下にスクロールします)”を制御できます。変数の値が非‘nil’の場合、 バッファーの最後が表示されていてもスクロールバーを下にドラッグできます。 ‘nil’の場合、バッファーの最後が表示されたとき、内部のボックスはスクロー ルバーの最下になります。バッファー全体が表示されているときは、オーバース クロールできません。 スクロールバーの視覚的な外見は、‘scroll-bar’フェイスにより制御されま す。 グラフィカルなフレームでは、垂直スクロールバーは暗に横並びのウィンド ウを区別する役目を担っています。垂直スクロールバーが無効なとき、Emacsは デフォルトでは幅1ピクセルの“垂直ボーダー(vertical border)”によりそのよう なウィンドウを区別します。このボーダーは右側のウィンドウの最初の1ピクセ ルの列を占め、したがってそこに表示されていたグリフの左端ピクセルの上に上 書きされることになるでしょう。これらのピクセルに重要な情報が含まれる場合 は、window dividerを有効にしてそれらを可視にできます(*note Window Dividers::を参照)。垂直ボーダーの見栄えを複製するには、フレームの ‘right-divider-width’パラメーターを1にセットして、‘window-divider’フェイ スを‘vertical-border’のフェイスから継承してください(*note Window Dividers: (elisp)Window Dividers.を参照)。 ツールキットサポート付きのグラフィカルなディスプレーでは、Emacsは各ウ ィンドウの最下に“水平スクロールバー(horizontal scroll bar)”も提供します 。スクロールバーのleftボタンまたはrightボタンを‘mouse-1’でクリックすると 、ウィンドウを1列ずつ水平にスクロールします(これらのボタンを表示しないよ うスクロールバーをカスタマイズできるツールキットがあることに注意)。スク ロールバーの内部ボックスの左または右下を‘mouse-1’でクリックすると、ウィ ンドウは4列スクロールします。スクロールバー内部のボックスをドラッグする と、連続してスクロールします。 このような水平スクロールにより、そのウィンドウのポイント位置が、右側 または左側の見えない場所になるかもしれないことに注意してください。文字を タイプしてテキストを挿入したり、キーボードコマンドでポイントを移動するこ とにより通常、ポイントは視界に戻るでしょう。 水平スクロールバーの使用を切り替えるには、‘M-x horizontal-scroll-bar-mode’とタイプします。このコマンドは、まだ作成され ていないフレームも含めて、すべてのフレームに適用されます。選択されたフレ ームの水平スクロールバーだけ切り替えたい場合は、コマンド‘M-x toggle-horizontal-scroll-bar’を使用してください。 起動時に水平スクロールバーの使用を制御するには、変数 ‘horizontal-scroll-bar-mode’をカスタマイズしてください。 Xリソース‘horizontalScrollBars’を使って、水平スクロールバーを有効また は無効にすることができます(*note Resources::を参照してください)。スクロ ールバーの高さを制御するには、フレームパラメーター‘scroll-bar-height’を 変更してください(*note (elisp)Frame Parameters::を参照してください)。 21.13 ウィンドウdivider ======================= グラフィカルなディスプレーでは、ウィンドウの外観を分割するために、 “window dividers”を使用することができます。window dividersはマウスでドラ ッグできるバーなので、隣接したウィンドウを簡単にリサイズできます。 window dividersの表示を切り替えるには、コマンド‘M-x window-divider-mode’を使用します。 dividersをどこに表示するかカスタマイズするには、オプション ‘window-divider-default-places’を使用します。変数の値には‘bottom-only’ (dividersをウィンドウの下だけに表示します)、‘right-only’ (dividersをウィ ンドウの右だけに表示します)、または‘t’ (下と右の両方に表示します)を指定 します。 このモードにより表示されるwindow dividersの幅を調整するには、オプショ ン‘window-divider-default-bottom-width’および ‘window-divider-default-right-width’をカスタマイズします。 ウィンドウの列の最初の1ピクセル(window dividerが無効な場合は横並びの ウィンドウを区別する垂直ボーダーに使用されます)を可視とするwindow dividerは、垂直スクロールバーが無効のときにも有用です(*note Scroll Bars::を参照)。 window dividersについての詳細は、*note Window Dividers: (elisp)Window Dividers.を参照してください。 21.14 ドラッグアンドドロップ ============================ ほとんどのグラフィカルなデスクトップ環境で、Emacsは“ドラッグアンドドロッ プ(drag and drop)”操作にたいする、基本的なサポートを提供します。たとえば Emacsのフレームにテキストをドロップすると、ドロップされた箇所にテキスト を挿入し、ファイルをドロップすると、Emacsフレームはそのファイルをvisitし ます。特別なケースとしては、Diredバッファーにファイルをドロップすること により、バッファーに表示されているディレクトリーにファイルを移動またはコ ピーします(アプリケーションの慣例に基づきます)。 ファイルをドロップすると、通常はドロップされたウィンドウでファイルを visitします。そのような場合に、新しいウィンドウでファイルをvisitしたいと きは、変数‘dnd-open-file-other-window’をカスタマイズします。 現在のところ、XDNDおよびMotif drag and drop protocolsと、古いKDE 1.x protocolがサポートされています。 Emacsはオプションで、テキストのリージョンを他のバッファーの他の部分へ ドラッグする操作もサポートします。これを有効にするには、変数 ‘mouse-drag-and-drop-region’を非‘nil’値にカスタマイズしてください。通常 そのテキストは、ドロップ先が元のリージョンと同じなら移動(カットアンドペ ースト)され、他のバッファーならそのリージョンがコピーされます。この変数 の値が‘shift’、‘control’、‘alt’のような修飾キー名の場合、その修飾キーを 押しながらテキストをドロップすると、ドロップ先がドラッグ元と同じバッファ ーでも、テキストはカットされずにコピーされます。 ドラッグ元とドロップ先が異なるバッファーのときにもテキストをカットす るためには、オプション ‘mouse-drag-and-drop-region-cut-when-buffers-differ’を非‘nil’値にセット します。デフォルトでは、グラフィカルなディスプレイの選択されたテキストは ツールチップ内に表示され、ドラッグ中にはマウスカーソルとともにポイントが 移動します。このような動作を抑止するには、オプション ‘mouse-drag-and-drop-region-show-tooltip’、および/または ‘mouse-drag-and-drop-region-show-cursor’に‘nil’をセットしてください。 21.15 メニューバー ================== ‘M-x menu-bar-mode’で、メニューバーの使用を切り替えることができます。引 数を指定しないと、このコマンドはグローバルマイナーモードのMenu Barを切り 替えます。引数を指定した場合、引数が正ならMenu Barモードをオンにして、負 ならオフにします。起動時にメニューバーの使用を制御するには、変数 ‘menu-bar-mode’をカスタマイズしてください。 熟練したユーザーは、テキストのために更なる行を得るために、メニューを オフにしている場合がしばしばあります(特にテキスト端末時)。メニューバーが オフでも、ポップアップメニューをサポートするディスプレーなら、 ‘C-mouse-3’でメニュー内容を含むポップアップメニューを表示できます。*note Menu Mouse Clicks::を参照してください。 メニューバーのコマンドを呼び出す方法については、*note Menu Bar::を参 照してください。メニューバーのメニューの視覚的な外見をカスタマイズする方 法は、*note X Resources::を参照してください。 21.16 ツールバー ================ グラフィカルなディスプレーでは、Emacsはフレームのトップ、メニューバーの 直下に“ツールバー(tool bar)”を配します。これはマウスでクリックすることに より、さまざまなコマンドを呼び出すことができるアイコンが1列に並んだもの です。 (デフォルトの)グローバルツールバーは、一般的なコマンドを含みます。自 身のツールバーを定義するメジャーモードもいくつか存在します。バッファーが それらのメジャーモードの場合、モードのツールバーにより、グローバルツール バーが置き換えられます。 ツールバーの使用を切り替えるには、‘M-x tool-bar-mode’とタイプします。 このコマンドは、まだ作成されていないフレームを含むすべてのフレームに適用 されます。起動時にツールバーの使用を制御するには、変数‘tool-bar-mode’を カスタマイズします。 EmacsがGTK+サポートつきでコンパイルされている場合、ツールバーアイテム には、イメージ、テキストラベル、またはそれら両方を含むことができます。デ フォルトではEmacsはGnomeデスクトップの、ツールバースタイルセッティングに したがいます。もし何も定義されていない場合、ツールバーのアイテムにはイメ ージだけが表示されます。特定のツールバースタイルを強要するには、変数 ‘tool-bar-style’をカスタマイズしてください。 フレームパラメーター‘tool-bar-position’で、GTK+ツールバーのためのツー ルバーの配置を制御することもできます。*note (elisp)Frame Parameters::を 参照してください。 NSビルドはツールバーをウィンドウ装飾と判断するため、ウィンドウが装飾 されていないときはツールバーを表示しません。*note (elisp)Frame Parameters::を参照してください。macOSでは、フレームがフルスクリーンのと きツールバーは表示されませんが、スクリーン上端にマウスポインターを移動す ることにより表示することができます。 21.17 ダイアログボックスの使用 ============================== ダイアログボックスとは、yes-or-noの質問(はい/いいえで応える問いかけ)を したり、他の何か特別な質問を問いかけるための、特別な種類のメニューです。 コマンドを呼び出すためにマウスを使い、それがユーザーへの質問を要するよう な操作の場合、多くのEmacsコマンドはyes-or-noを問うために、ダイアログボッ クスを使います。 ダイアログボックスの使用を無効にするには、変数‘use-dialog-box’を ‘nil’に変更します。この場合、Emacsはエコーエリアとキーボード入力を使って yes-or-noプロンプトを処理します。この変数はファイル選択ウィンドウの使用 も制御します(しかしこれらはすべてのプラットフォームでサポートされている わけではありません)。 ファイル選択ウィンドウはファイル名を問うための、特別な種類のダイアロ グボックスです。変数‘use-file-dialog’をカスタマイズすれば、他の種類のダ イアログボックスを使用して、ファイル選択ウィンドウを使用しないようにでき ます。変数‘use-dialog-box’ですべてのダイアログボックスを使用しないように している場合、この変数は効果がありません。 EmacsがGTK+サポートつきでコンパイルされている場合、EmacsはGTK+のファ イル選択ダイアログを使います。Emacsは非表示のファイル(名前がドットで始ま るファイル)の表示の有効・無効を切り替えるボタンを、ダイアログボックスに 追加します。この切り替えをデフォルトで有効にしたい場合、変数 ‘x-gtk-show-hidden-files’を‘t’に変更します。さらにEmacsは、GTK+ファイル 選択ダイアログにヘルプテキストを追加します。このヘルプテキストを無効にす るには、変数‘x-gtk-file-dialog-help-text’を‘nil’に変更してください。 21.18 ツールチップ ================== “ツールチップ”は、小さい特別なフレームに、マウスのカレント位置に関するテ キスト情報を表示します。ツールチップはウィンドウの重要なテキストの上や、 ツールバーのボタンやメニューアイテムのような、Emacsフレームの他の部分の 上でマウスを停止させたときにアクティブになります。 ツールチップの使用は、コマンド‘M-x tooltip-mode’で切り替えることがで きます。Tooltipモードが無効な場合、ヘルプテキストは、かわりにエコーエリ アに表示されます。ツールチップの使用を起動時に制御するには、変数 ‘tooltip-mode’をカスタマイズしてください。 以下の変数はツールチップ表示にたいするカスタマイズオプションを提供し ます: ‘tooltip-delay’ この変数は、最初のツールチップを表示する前に、Emacsがwaitする長さを 指定します。値は秒です。 ‘tooltip-short-delay’ この変数は、すでに最初のツールチップが表示されているとき、異なるア イテムにたいする後続のツールチップを表示する前に、Emacsがwaitする長 さを指定します。値は秒です。 ‘tooltip-hide-delay’ マウスが静止しているとき、ツールチップを隠すまでの秒数です。 ‘tooltip-x-offset’ ‘tooltip-y-offset’ マウスポインター位置から、ツールチップの左上隅までのXオフセットと Yオフセットを、ピクセルで指定します。‘tooltip-frame-parameters’が、 ‘left’および‘top’パラメーターをインクルードするためにカスタマイズさ れている場合、これらは無視されることに注意してください。オフセット には、ツールチップがマウスのクリックと干渉するような、マウスポイン ターのホットスポットを覆い隠さない値を指定するべきです。 ‘tooltip-frame-parameters’ ツールチップの表示のために、フレームパラメーターが使用されます。 *note (elisp)Frame Parameters::、および*note (elisp)Tooltips::を参 照してください。 ツールチップの表示にたいする追加のカスタマイズオプションについては、 ‘M-x customize-group tooltip ’を使用してください。 EmacsがGTK+サポートつきでビルドされている場合、ツールチップはGTK+を通 じて、GTK+のツールチップのデフォルトの外見を使います。これを無効にするに は、変数‘x-gtk-use-system-tooltips’を‘nil’に変更します。これを行うか、 EmacsがGTK+サポートなしでビルドされた場合は、ツールチップテキストのほと んどの属性は‘tooltip’フェイスとXリソース(*note X Resources::を参照してく ださい)により指定されます。 “GUDツールチップ”は、プログラムをGUDでデバッグしているときに変数の値 を表示する、特別なツールチップです。*note Debugger Operation::を参照して ください。 21.19 マウスの回避 ================== グラフィカルな端末では、マウスポインターがEmacsフレームのテキストを隠し てしまうことがありえます。この問題を避けるために、Emacsは2つの方法を提供 します。 1番目の方法は、ユーザーが自己挿入文字をタイプしたとき、Emacsがマウス ポインターを非表示にして、マウスポインターを動かしたときに、ポインターが Emacsフレームの内側にあるときは、再びポインターを表示する方法です。この 機能を無効にするには、変数‘make-pointer-invisible’を‘nil’にセットしてく ださい。*note Display Custom::を参照してください。 2番目の方法はMouse Avoidance(マウス回避)モードを使って、マウスポイン ターをポイントから遠ざける方法です。Mouse Avoidanceモードを使うには、変 数‘mouse-avoidance-mode’をカスタマイズします。この変数にさまざまな値をセ ットすることにより、マウスを遠ざけるいくつかの方法を選択できます。 ‘banish’ キーが押されたらポインターをフレームの隅に移動します。ポインターを どこに遠ざけるかは、変数‘mouse-avoidance-banish-position’でカスタマ イズできます。 ‘exile’ カーソルがポインターに近づきすぎたときだけポインターを遠ざけて、カ ーソルが離れたらポインターを元に戻します。 ‘jump’ カーソルがポインターに近づきすぎたら、ランダムな方向と距離にポイン ターを移動します。 ‘animate’ ‘jump’と同様ですが、移動モーションをアニメ化します。 ‘cat-and-mouse’ ‘animate’と同じです。 ‘proteus’ ‘animate’と同様ですが、マウスポインターの外見も変更します。 コマンド‘M-x mouse-avoidance-mode’を使って、このモードを有効にするこ ともできます。Mouse Avoidanceモードがマウスを移動したときは、常にそのフ レームを前に表示します。 21.20 非ウィンドウ端末 ====================== テキスト端末では、Emacsは1度に1つのEmacsフレームしか表示できません。それ でも複数のEmacsフレームを作成して、それらを切り替えることができます。こ れらの端末でフレームを切り替えるのは、異なるウィンドウの設定を切り替える のによく似ています。 ‘C-x 5 2’を使うと新しいフレームを作成してそれに切り替えます。‘C-x 5 o’を使うと既存のフレームを巡回します。‘C-x 5 0’を使うと、カレントフレー ムを削除します。 各フレームには区別するための番号があります。端末が1度に1つのフレーム しか表示できない場合、選択されたフレームの番号Nが、モードラインの先頭に 近い位置に、‘FN’という形式で表示されます。 ‘FN’は、フレームの実際の初期名称です。フレームにもっと意味のある名前 を与えて、その名前でフレームを選択できます。コマンド‘M-x set-frame-name NAME ’を使うと、選択されたフレームに新しい名前を指定し、‘M-x select-frame-by-name NAME ’を使うとその名前に一致するフレーム を選択します。指定した名前は、そのフレームが選択されたときに、モードライ ンに表示されます。 21.21 テキスト端末でのマウスの使用 ================================== 端末ウィンドウでのマウスクリックをサポートするテキスト端末がいくつかあり ます。 ‘xterm’と互換性のある端末エミュレーターでは、‘M-x xterm-mouse-mode’を 使って、Emacsに簡単なマウスの使用 — 基本的には修飾なしのシングルクリック だけがサポートされます — を制御させることができます。より新しいバージョ ンの‘xterm’は、マウストラッキングもサポートします。そのようなクリックに たいする通常の‘xterm’のマウス機能は、マウスボタンを押すときにキー を押すことにより、利用できます。Xterm Mouseモードはグローバルマイナーモ ードです(*note Minor Modes::を参照してください)。コマンドを繰り返すと、 このモードを再びオフにします。 GNU/Linuxのコンソールでは、‘M-x gpm-mouse-mode’を使ってマウスサポート を有効にできます。これが機能するためにはgpmサーバーがインストールされて いて、システムで実行されていなければなりません。このモードが有効な場合、 EmacsとGPMを使用する他のプログラムとの間で、マウスによるテキスト転送がで きないことに注意してください。これはGPMとLinux kernelによる制限です。 MS-DOSでのマウスサポートに関する情報は、*note MS-DOS Mouse::を参照し てください 。 22 国際化文字セットのサポート ***************************** Emacsは、広範囲な国際化文字セット(international character sets)をサポー トします。それらには、ラテンアルファベットの変種であるEuropeanと Vietnamese、同様にArabic scripts、(Bengali、Hindi、Thaiのような言語にた いする)Brahmic scripts 、Cyrillic、Ethiopic、Georgian、Greek、(Chineseと Japaneseにたいする)Han、(Koreanにたいする)Hangul、Hebrew、IPAが含まれま す。Emacsは他の国際化されたソフトウェアー(ワープロやメーラー)などで使わ れる、それらの文字にたいするさまざまなエンコーディングもサポートします。 Emacsは関連するアクティビティーのすべてをサポートすることにより、国際 化文字セットの編集を可能にします: • 非ASCII文字のファイルをvisitしたり、非ASCIIのテキストを保存したり、 非ASCIIのテキストを、EmacsとEmacsが呼び出すプログラム(コンパイラー 、スペルチェッカー、メーラーなど)に引き渡すことができます。言語環境 のセッティングとは、コーディングシステムのセッティングと、その他の 言語に特有な文化のためのオプションを処理することです。かわりに各コ マンドにエンコードあるいはデコードする方法を指定できます。*note Text Coding::を参照してください. • さまざまなスクリプトでエンコードされた、非ASCII文字を表示することが できます。これはグラフィカルなディスプレー上で適切なフォントを使う こと(*note Defining Fontsets::を参照してください)、そしてテキスト表 示のために特別なコードを送信すること(*note Terminal Coding::を参照 してください)により機能します。正しく表示できない文字があるときは、 *note Undisplayable Characters::を参照してください。これには考えら れる原因と、解決方法が記述されています。 • 本来、右から左に記述されるスクリプトの文字は、表示のために再配置さ れます(*note Bidirectional Editing::を参照)。これらのスクリプトには Arabic、Hebrew、Syriac、Thaana、それ以外にもいくつか存在します。 • 非ASCII文字を挿入したり検索することができます。これを行うために、言 語にあったインプットメソッド(IM: input method。*note Select Input Method::を参照してください)を指定するか、言語環境を選択したときにセ ットアップされた、デフォルトのインプットメソッドを使うことができま す。キーボードが非ASCII文字を生成できる場合、適切なキーボードコーデ ィングシステムを選択できます。Emacsはそれらの文字を受け入れることが できるでしょう。Latin-1文字は、‘C-x 8’プレフィクスを使って入力する こともできます。*note Unibyte Mode::を参照してください. Xウィンドウシステムでは、Emacsがキーボード入力を正しく解釈するため に、localeに適切な値をセットする必要があります。*note locales: Language Environments.を参照してください。 このチャプターの残りの部分では、これらの問題について詳細を説明します 。 22.1 国際化文字セットのイントロダクション ========================================= 国際化文字セットとスクリプトのユーザーは、ファイルを保存するために、多少 の差はありますが、標準化された多くのコーディングシステムを確立しています 。これらのコーディングシステムは通常は“マルチバイト(multibyte)”で、これ は1つの非ASCII文字を表すのに、2つ以上のバイトシーケンスを対応させること を意味します。 Emacsは、内部的には“Unicode”標準のスーパーセットである、マルチバイト 文字エンコーディングを使用します。この内部的なエンコーディングは、ほとん どすべての既知のスクリプトを、1つのバッファーまたは文字列に混成すること を可能にします。Emacsはファイルを読み書きしたり、サブプロセスとデータを やりとりするとき、このマルチバイト文字エンコーディングと、他のさまざまな コーディングシステムをコード変換します。 コマンド‘C-h h’ (‘view-hello-file’)は、ファイル‘etc/HELLO’を表示しま す。これは、多くの異なる言語で、“hello”をどのように記述するかを、さまざ まな文字で例示するファイルです。もしもある文字が端末で表示できないときは 、それらの文字は‘?’か、中抜きのボックスで表示されます。 これらの文字セットを使う国のキーボードでも、一般的にはすべての文字に 対応するキーはもっていません。キーボードがサポートしない文字は、‘C-x 8 ’ (‘insert-char’)を使って挿入することができます。*note Inserting Text::を参照してください。一般的な文字のいくつかは略記が利用できます。た とえば‘C-x 8 [’とタイプ(Electric Quoteモードでは、通常は単に‘`’とタイプ )することにより、left single quotation mark ‘を挿入できます。Emacsはさま ざまな“インプットメソッド(IM: input methods)”をサポートします。これはあ るスクリプトの文字をタイプするのを簡単にするもので、通常1つのスクリプト または言語に1つです。*note Input Methods::を参照してください。 プレフィクスキー‘C-x ’は、マルチバイト文字、コーディングシステム 、インプットメソッドに属するコマンドにたいして使用されます。 コマンド‘C-x =’ (‘what-cursor-position’)は、ポイント位置にある文字の 情報を表示します。文字の位置に加えて、*note Position Info::で説明したよ うに、このコマンドはその文字がどのようにエンコードされているかを表示しま す。たとえば、このコマンドは文字‘c’に大して、以下のような行をエコーエリ アに表示します: Char: c (99, #o143, #x63) point=28062 of 36168 (78%) column=53 ‘Char:’の後ろの4つの値は、ポイント位置の文字を説明するためのもので、 1つ目はその文字自身、その後ろに文字コードを10進(decimal)、8進(octal)、 16進(hex)で表示します。非ASCIIのマルチバイト文字の場合、バッファーのコー ディングシステムでその文字を安全に1バイトでエンコードできる場合は、 ‘file’とそのバッファーのコーディングシステムで表した文字コードの16進表記 が続きます。その文字のエンコーディングが1バイトより長い場合、Emacsは ‘file ...’と表示します。 Emacsが“rawバイト(raw bytes)”に遭遇する場合がまれにあります。rawバイ トとは、既知の非ASCII文字エンコーディングとしてEmacsが解釈できない、値 128(8進0200)から255(8進0377)の範囲の単一バイトのことです。そのような rawバイトは、特別な文字セット‘eight-bit’に属すものとして扱われます。 Emacsはそれらをエスケープされた8進コードで表示します(これはカスタマイズ 可能。*note Display Custom::を参照されたい)。この場合、‘C-x =’は‘file’の かわりに‘raw-byte’を示します。加えて、‘C-x =’はそれらがあたかもEmacsが範 囲‘#x0080..#x00FF’のユニコード文字から区別するためにマップする範囲 ‘#x3FFF80..#x3FFFFF’にあるかのようにrawバイトの文字コードを表示します。 プレフィクス引数を指定した(‘C-u C-x =’)では、その文字の詳細な情報をウ ィンドウに表示します: • 文字セット名(character set name)と、文字セットでその文字が識別され るコード。ASCII文字の場合、‘ascii’文字セットに属すると識別されます 。 • その文字のスクリプト(script)、構文(syntax)、カテゴリー (categories)。 • 現在のインプットメソッドで(もしその文字をサポートしていれば)、その 文字を入力するためにタイプするキー。 • その文字のエンコード。バッファー内部のエンコードと、ファイルに保存 したときの外部のエンコードの両方。 • グラフィカルなディスプレーでEmacsを実行しているときはフォント名と、 その文字にたいするグリフコード(glyph code)。Emacsをテキスト端末で実 行している場合、端末に送るコード。 • その文字のテキストプロパティー(*note (elisp)Text Properties::を参照 してください)。これにはその文字を表示するのに使われるデフォルト以外 のフェイスと、それを含むオーバーレイ(overlays)が含まれます(*note (elisp)Overlays::を参照してください)。 以下は例です(マニュアルに収まるように折り返している行もあります): position: 1 of 1 (0%), column: 0 character: ê (displayed as ê) (codepoint 234, #o352, #xea) preferred charset: unicode (Unicode (ISO10646)) code point in charset: 0xEA script: latin syntax: w which means: word category: .:Base, L:Left-to-right (strong), c:Chinese, j:Japanese, l:Latin, v:Viet to input: type "C-x 8 RET ea" or "C-x 8 RET LATIN SMALL LETTER E WITH CIRCUMFLEX" buffer code: #xC3 #xAA file code: #xC3 #xAA (encoded by coding system utf-8-unix) display: by this font (glyph code) xft:-PfEd-DejaVu Sans Mono-normal-normal- normal-*-15-*-*-*-m-0-iso10646-1 (#xAC) Character code properties: customize what to show name: LATIN SMALL LETTER E WITH CIRCUMFLEX old-name: LATIN SMALL LETTER E CIRCUMFLEX general-category: Ll (Letter, Lowercase) decomposition: (101 770) ('e' '^') 22.2 言語環境 ============= サポートされているすべての文字セットは、マルチバイト文字が利用可能なとき は、Emacsバッファーの中でサポートされます。その文字を表示するために、特 定の言語を選択する必要はありません。しかしさまざまなデフォルト値をセット するために、“言語環境(language environment)”を選択することは重要です。大 まかに言うと、言語環境とは、言語の選択というよりも、好ましいスクリプト選 択の提示です。 言語環境は、テキストを読み込むとき、それを認識するコーディングシステ ムを制御します(*note Recognize Coding::を参照してください)。これはファイ ル、到着メール、その他のEmacsで読む任意のテキストに適用されます。これは 新しくファイルを作成するときに使う、デフォルトのコーディングシステムも指 定します。それぞれの言語環境は、デフォルトのインプットメソッドも指定しま す。 言語環境を選択するには、‘current-language-environment’をカスタマイズ するか、コマンド‘M-x set-language-environment’を使います。このコマンドを 使うとき、どのバッファーがカレントかで違いは生じません。なぜなら、その効 果はEmacsセッションにグローバルで適用されるからです。サポートされている 言語環境の一覧は、変数‘language-info-alist’を参照してください。コマンド ‘C-h L LANG-ENV ’ (‘describe-language-environment’)を使うと、言語環 境LANG-ENVの、より詳細な情報が参照できます。サポートされる言語環境には、 以下が含まれます: ASCII、Arabic、 Belarusian、Bengali、 Brazilian Portuguese、 Bulgarian、 Burmese、Cham、 Chinese-BIG5、Chinese-CNS、 Chinese-EUC-TW、Chinese-GB、Chinese-GB18030、Chinese-GBK、 Croatian、Cyrillic-ALT、Cyrillic-ISO、Cyrillic-KOI8、 Czech、 Devanagari、 Dutch、English、 Esperanto、Ethiopic、 French、 Georgian、 German、Greek、Gujarati、 Hebrew、IPA、 Italian、 Japanese、Kannada、 Khmer、Korean、Lao、 Latin-1、Latin-2、 Latin-3、Latin-4、Latin-5、Latin-6、Latin-7、Latin-8、Latin-9、 Latvian、Lithuanian、 Malayalam、Oriya、 Persian、Polish、 Punjabi、 Romanian、 Russian、Sinhala、 Slovak、Slovenian、Spanish、 Swedish、 TaiViet、 Tajik、Tamil、 Telugu、Thai、 Tibetan、Turkish、 UTF-8、 Ukrainian、 Vietnamese、Welsh、 Windows-1255 グラフィカルなディスプレーでは、使用されている言語環境で使われている スクリプトを表示するために、適切なフォントをもっている必要があります。フ ォントのセットアップについては、*note Fontsets::を参照してください。 環境変数‘LC_ALL’、‘LC_CTYPE’、‘LANG’をセットすることにより、使用する 文字セットのlocaleを指定するオペレーティングシステムがいくつかあります (もしこれらの1つ以上がセットされている場合、特に1番目のものが空でない場 合、それは正にこの目的のためにlocaleを指定しています)。起動の間、Emacsは 文字セットのlocale名を、システムのlocaleエイリアステーブルから探して、そ の正規化された名前(canonical name)を、変数 ‘locale-charset-language-names’および‘locale-language-names’(前者は後者 をオーバーライドします)のエントリーにたいしてマッチし、マッチが見つかっ たら対応する言語環境を選択します。これはディスプレーテーブルと端末のコー ディングシステム、localeコーディングシステム、localeに必要な好ましいコー ディングシステム — そして最後に重要なのは — Emacsがキーボードから送られ た非ASCII文字をデコードする方法を調整します。 Emacs実行中に、(‘M-x setenv’を使って)環境変数‘LC_ALL’、‘LC_CTYPE’、 ‘LANG’を変更した場合、新しいlocaleにたいする言語環境を再調整するために、 後で‘set-locale-environment’コマンドを呼び出したいと思うかもしれません。 ‘set-locale-environment’関数は通常、システムメッセージをデコードする ために、言語環境により確立された、優先されるコーディングシステムを使用し ます。しかしlocaleが変数‘locale-preferred-coding-systems’のエントリーに マッチした場合、Emacsはかわりに対応するコーディングシステムを使用します 。たとえばlocaleの‘ja_JP.PCK’が、‘locale-preferred-coding-systems’の ‘japanese-shift-jis’にマッチした場合、Emacsは通常なら ‘japanese-iso-8bit’が使われるような場合でも、エンコーディングにそのコー ディングシステムを使用します。 initファイルで明示的にコマンド‘set-language-environment’を使うか、 ‘current-language-environment’をカスタマイズすることにより、起動時に選択 された言語環境をオーバーライドできます。 特定の言語環境LANG-ENVの効果に関する情報を表示するには、コマンド‘C-h L LANG-ENV ’ (‘describe-language-environment’)を使います。これはこ の言語環境に有効な言語、文字セットのリスト、コーディングシステム、インプ ットメソッドを表示します。これはこの言語環境で使われるスクリプトを例示す る、サンプルテキストも表示します。LANG-ENVに空の入力を与えると、このコマ ンドは選択されている言語環境を説明します。 ノーマルフック‘set-language-environment-hook’により、任意の言語環境を カスタマイズできます。コマンド‘set-language-environment’は、新しい言語環 境をセットアップした後に、このフックを実行します。フック関数は変数 ‘current-language-environment’をチェックすることにより、特定の言語環境を テストできます。このフックはキーボード入力にたいするコーディングシステム や端末出力、デフォルトのインプットメソッドなど、特定の言語環境にたいして 非デフォルトのセッティングが必要な場所に設定します 新しい言語環境のセットアップを開始する前に、 ‘set-language-environment’はまずフック‘exit-language-environment-hook’を 実行します。このフックは‘set-language-environment-hook’によるカスタマイ ズを取り消すのに便利です。たとえば、特定の言語環境にたいして ‘set-language-environment-hook’を使って特別なキーバインドをセットアップ した場合は、‘exit-language-environment-hook’で通常のキーバインドに復元す るべきです。 22.3 インプットメソッド ======================= “インプットメソッド(IM: input method)”は、対話的入力のために具体的にデザ インされた、一種の文字変換です。Emacsでは、各言語はそれ自身のインプット メソッドをもっています。同じ文字を使う複数の言語で、1つのインプットメソ ッドを共有できます。複数のインプットメソッドをサポートする言語もあります 。 一番簡単な種類のインプットメソッドは、ASCII文字を他のアルファベットに マッピングすることにより機能します。これによりASCIIのかわりに他のアルフ ァベットを使うことが可能になります。GreekとRussianのインプットメソッドは この方式で機能します。 より強力なテクニックがコンポジション(composition: 複合)です。これは文 字のシーケンスを1つの文字に変換します。Europeanのインプットメソッドの多 くが、アクセント文字を後(または前)に続けた文字シーケンスから、1つの非 ASCII文字を生成するためにコンポジションを使います。たとえば、インプット メソッドのいくつかは、‘o ^’のシーケンスを1つのアクセントつき文字に変換し ます。これらのインプットメソッドは、それら自身では特別なコマンドをもちま せん。これらすべてが行うのは、文字シーケンスを複合して、プリント文字にす ることです。 音節記号(syllabic scripts)のためのインプットメソッドは通常、マッピン グと、それに続けてコンポジションを使います。ThaiとKoreanのためのインプッ トメソッドは、この方式で機能します。最初に複数の文字が、特定の音や口調の ためのシンボルにマッピングされます。次にこれらシンボルのシーケンスから音 節全体を作り、それを1つの音節記号にマッピングします。 ChineseとJapaneseには、さらに複雑な方式が必要です。Chineseのインプッ トメソッドでは、最初にChineseの単語の音声スペルを入力するか(特にインプッ トメソッド‘chinese-py’)、文字の一部をシーケンスとして入力します(インプッ トメソッド‘chinese-4corner’、‘chinese-sw’など)。通常1つの入力シーケンス は、多くのChinese文字に対応します。‘C-f’、‘C-b’、‘C-n’、‘C-p’(または矢印 キー)、またはこの状況では特別な意味をもつ数字を指定することにより、意図 するものを選択します。 文字の候補は、概念的には複数の行にアレンジされ、各行は10個の候補をも ちます。通常Emacsは1度に1行をエコーエリアに表示します。行頭に‘(I/J)’が表 示され、これはトータルJ行中、I番目の行かを示します。‘C-n’または‘C-p’をタ イプすると、次または前の行を表示します。 ‘C-f’または‘C-b’をタイプすると、カレント行の候補の間を前方または後方 に移動します。これを行うとき、Emacsはカレント候補を特別な色でハイライト します。‘C-’とタイプすると、カレント候補を選択して、それを入力に使 用します。各行の候補には番号も付けられています。この番号は各候補の前に表 示されます。番号をタイプすると、カレント行の番号に関連付けられた候補を選 択し、それを入力に使用します。 これらChineseのインプットメソッドでは、はすべての文字候補をバッ ファーに表示します。候補の1つを‘mouse-2’でクリックすることにより選択しま す。‘C-f’、‘C-b’、‘C-n’、‘C-p’、および数字キーは通常どおり機能しますが、 それらはエコーエリアではなく、文字候補を表示したバッファーをハイライトし ます。 Japaneseのインプットメソッドでは、最初に音声スペルを使って単語全体を 入力します。つぎに単語がバッファーに入った後で、より大きな辞書を使って Emacsがそれを1つ以上の文字に変換します。1つの音声スペルは、いくつかの Japaneseの単語に対応します。これらの1つを選択するには、‘C-n’または ‘C-p’を使って候補を巡回します。 インプットメソッドをオフにして、入力した文字シーケンスが複合されない ようにするのが便利なときがあります。たとえばインプットメソッド ‘latin-1-postfix’では、シーケンス‘o ^’は、アクセントつきの‘o’に複合され ます。これらの文字を個別に入力したいときはどうすればよいでしょう? 1つは、アクセントを2度タイプする方法です。これは文字とアクセントを個 別に入力するための特別な機能です。たとえば‘o ^ ^’により、2つの文字‘o^’が 得られます。他の方法としては‘o’の後に別の文字 — 複合されない何か別の文字 — を入力してすぐにそれを削除する方法です。たとえば‘o o ^’とタイプ することにより、‘o’と‘^’を個別に得ることができます。もう1つは、より一般 的ですがタイプが容易とは言えない方法で、2つの文字が欠号されるのを防ぐた めに、文字の間で‘C-\\ C-\\’を使用する方法です。これは、コマンド ‘C-\\’(‘toggle-input-method’)を2回使用しています。 *note Select Input Method::を参照してください。 ‘C-\ C-\’は、インクリメンタル検索の中で使うのが特に便利です。なぜなら これは複合される文字が入力されるのを待つのを止めて、それまでに入力した文 字で検索を開始するからです。 現在のインプットメソッドを使って、ポイント位置の後ろの文字を入力する 方法を探すには、‘C-u C-x =’をタイプします。*note Position Info::を参照し てください。 変数‘input-method-highlight-flag’および‘input-method-verbose-flag’は 、インプットメソッドで何が起きているかを告げる方法を制御します。 ‘input-method-highlight-flag’が非‘nil’の場合、部分的な入力シーケンスがバ ッファーでハイライトされます(この機能を無効にしているインプットメソッド もあります)。‘input-method-verbose-flag’が非‘nil’の場合、次にタイプでき る文字の一覧をエコーエリア(ただしミニバッファーにいるときは除く)に表示し ます。 フック変数‘quail-activate-hook’に関数で変更を行うことにより、入力メソ ッドが機能する方法を変更できます。*note Hooks::を参照してください。たと えば、関数‘quail-translation-keymap’によりリターンされるキーマップ内のキ ーバインディングを、‘define-key’を使用して、定義することによりその入力メ ソッドのいくつかのキーを再定義できます。*note Init Rebinding::を参照して ください。 キーボードにない文字をタイプする他の方法は、‘C-x 8 ’ (‘insert-char’)を使って、Unicode名またはコードポイント(code-point)にもと づいて1つの文字を挿入する方法です。*note Inserting Text::を参照してくだ さい。 22.4 インプットメソッドの選択 ============================= ‘C-\’ 選択されたインプットメソッドを有効または無効にします (‘toggle-input-method’)。 ‘C-x C-\ METHOD ’ カレントバッファーにたいして、新しいインプットメソッドを選択します (‘set-input-method’)。 ‘C-h I METHOD ’ ‘C-h C-\ METHOD ’ インプットメソッドMETHODの説明を表示します (‘describe-input-method’)。デフォルトでは、(もしあれば)カレントのイ ンプットメソッドを説明します。これは特定のインプットメソッドの使い 方に関する、すべての詳細説明を表示します。 ‘M-x list-input-methods’ サポートされている、すべてのインプットメソッドのリストを表示します 。 カレントバッファーにたいするインプットメソッドを選択するには、‘C-x C-\’ (‘set-input-method’)を使います。このコマンドはミニバッファー からインプットメソッドの名前を読み取ります。この名前は通常、それが使われ ることを意図した言語環境で開始されます。変数‘current-input-method’は選択 されたインプットメソッドを記録します。 インプットメソッドは非ASCII文字を表すために、さまざまなASCII文字のシ ーケンスを使います。インプットメソッドを一時的にオフにできると便利なとき もあります。そのようなときは‘C-\’ (‘toggle-input-method’)をタイプします 。インプットメソッドを再度有効にするには、もう1度‘C-\’をタイプします。 ‘C-\’をタイプしたときに、まだインプットメソッドが選択されていない場合 、インプットメソッドを指定するように求めます。これはインプットメソッドを 指定する‘C-x C-\’を使ったときと同じ効果です。 ‘C-u C-\’のようにプレフィクス引数を指定した場合、 ‘toggle-input-method’は常にインプットメソッドを尋ねます。このときデフォ ルトとして提案されるのは、もっとも最近選択されたインプットメソッドです。 言語環境の選択により、さまざまなバッファーで使用するデフォルトのイン プットメソッドが指定されます。デフォルトのインプットメソッドがある場合、 ‘C-\’とタイプしてカレントバッファーでそれを選択できます。変数 ‘default-input-method’はデフォルトのインプットメソッドを指定します (‘nil’は、それが存在しないことを意味します)。 複数の異なるインプットメソッドをサポートする言語環境では、 ‘set-language-environment’で選択されるデフォルトとは違うインプットメソッ ドを使いたいときもあるでしょう。‘set-language-environment-hook’を使って 、特定の言語環境にたいして異なるデフォルトのインプットメソッドを使うよう Emacsに指示できます(*note set-language-environment-hook: Language Environments.を参照してください)。たとえば: (defun my-chinese-setup () "Set up my private Chinese environment." (if (equal current-language-environment "Chinese-GB") (setq default-input-method "chinese-tonepy"))) (add-hook 'set-language-environment-hook 'my-chinese-setup) これは言語環境をChinese-GB languageに選択したときは、常にデフォルトのイ ンプットメソッドを‘chinese-tonepy’にセットします。 特定のインプットメソッドを自動的にアクティブにするようEmacsに指示でき ます。たとえば: (add-hook 'text-mode-hook (lambda () (set-input-method "german-prefix"))) これはTextモードで自動的にインプットメソッド‘german-prefix’をアクティブ にします。 英文字スクリプトのためのいくつかのインプットメソッドは、それらのスク リプトで一般的に使用されているさまざまなキーボードエミュレートするために 、(実質的には)他のアルファベットに再マッピングすることにより機能します。 この再マッピングがどのように正しく行われるかは、実際のキーボードレイアウ トに依存します。キーボードがどのレイアウトなのかを指定するには、コマンド ‘M-x quail-set-keyboard-layout’を使います。 コマンド‘M-x quail-show-key’を使って、ポイントの後ろにある文字を入力 するために、選択されたキーボードレイアウトの、どのキー(またはキーシーケ ンス)をタイプすればよいのか表示できます。コマンド‘C-u C-x =’もこの情報と 、それに加えてその文字に関する他の情報を表示します。 ‘M-x list-input-methods’は、サポートされているすべてのインプットメソ ッドを一覧します。この一覧は各インプットメソッドの情報と、モードラインに 表示される文字列を表示します。 22.5 コーディングシステム ========================= さまざまな言語のユーザーは、多少の差はあれ、それらを表示するための標準の コーディングシステムを確立しています。Emacsはこれらのコーディングシステ ムを、内部的に使用しません。データを読み込むときは、さまざまなコーディン グシステムからEmacs独自のコーディングシステムに変換し、データを書き込む ときには、内部コーディングシステムから他のコーディングシステムに変換しま す。ファイルの読み書き、端末とのやりとり、サブプロセスとのデータ交換にお いて、変換が可能です。 Emacsは各コーディングシステムに名前を割り当てます。ほとんどのコーディ ングシステムは、1つの言語で使用され、コーディングシステムの名前は、言語 の名前で始まります。複数の言語で使用されるコーディングシステムもあります 。これらのコーディングシステムの名前は、通常‘iso’で始まります。 ‘no-conversion’、‘raw-text’、‘emacs-internal’のような特別なコーディング システムもあります。 まとめて“コードページ(codepages)”として知られる、特別なクラスのコーデ ィングシステムは、MS-WindowsおよびMS-DOSのソフトウェアーによりエンコード されたテキストをサポートするためにデザインされています。これらのコーディ ングシステムの名前は‘cpNNNN’という形式で、NNNNは3桁から4桁のコードページ 番号です。これらのコーディングもほかのコーディングシステムと同様に使うこ とができます。たとえばコードページ850でエンコードされたファイルをvisitす るには、‘C-x c cp850 C-x C-f FILENAME ’とタイプします。 非ASCII文字のさまざまな表現の変換に加えて、コーディングシステムは行末 変換(end-of-line conversion)も行います。Emacsは、ファイル内の行の区切り 方として、3つの異なる変換を扱います。つまり、改行(Unix)、復帰改行(DOS)、 復帰(Mac)です。 ‘C-h C CODING ’ コーディングシステムCODINGの説明を表示します (‘describe-coding-system’)。 ‘C-h C ’ カレントで使用しているコーディングシステムCODINGの説明を表示します (‘describe-coding-system’)。 ‘M-x list-coding-systems’ サポートされているすべてのコーディングシステムのリストを表示します 。 コマンド‘C-h C’ (‘describe-coding-system’)は、特定のコーディングシス テムについて、それらのコーディングシステムで規定されている、行末変換も含 めた情報を表示します。引数にコーディングシステム名を指定できます。引数が 空のときには、さまざまな目的のために選択されている、現在のコーディングシ ステムの、カレントバッファにたいするものとデフォルトの両方について表示す るとともに、コーディングシステムを認識するための優先順位表を表示します (*note Recognize Coding::を参照してください)。 サポートされているすべてのコーディングシステムのリストを表示するには 、‘M-x list-coding-systems’とタイプします。表示されるリストは、モードラ インに表示される文字も含めて、各コーディングシステムの情報を提供します。 リストに表示される各コーディングシステム — ただし何の変換も行わない ‘no-conversion’は除く — は、プリントする文字をどのように変換するか、しな いかを指定しますが、改行変換については、各ファイル内容にもどづいて決定す るので選択をしません。たとえばファイルが行区切りに改行復帰文字を使ってい るように見えるときは、DOSの改行変換を使います。 リストされた各コーディングシステムは、改行変換を厳密に指定する3つの変 種があります。 ‘...-unix’ 何の改行変換も行いません。ファイルは行区切りに改行文字を使っている と仮定します(これは通常Unix、GNUシステム、macOSで使われている慣習で す)。 ‘...-dos’ ファイルが行区切りに改行復帰文字を使っていると仮定し、適切な変換を 行います(これは通常Microsoftシステムで使われている慣習です(1))。 ‘...-mac’ ファイルが行区切りに復帰文字を使っていると仮定し、適切な変換を行い ます(これはクラシックなMac OSで使われていた慣習です)。 これらのコーディングシステムの変種は、それらが完全に予測可能なため、 簡略化のために‘list-coding-systems’の表示からは省略されています。たとえ ばコーディングシステム‘iso-latin-1’は‘iso-latin-1-unix’、 ‘iso-latin-1-dos’、‘iso-latin-1-mac’という変種をもちます。 コーディングシステム‘unix’、‘dos’、‘mac’は、それぞれ ‘undecided-unix’、‘undecided-dos’、‘undecided-mac’の別名です。これらのコ ーディングシステムは改行変換だけを指定し、文字コード変換はテキスト字体か ら推論されるよう残します コーディングシステム‘raw-text’は、主にASCIIテキストのファイルに適して いますが、ファイルには、非ASCII文字の符号を意味しない127を越えるバイト値 が含まれるかもしれません。‘raw-text’では、 Emacsはそれらのバイト値を変更 せずにコピーし、カレントバッファーの‘enable-multibyte-characters’を ‘nil’にセットして、それらは適切に解釈されるます。‘raw-text’は、出会った データに基づく通常の方法で行末変換を処理し、使用する行末変換を指定する変 種も3つもちます。 対照的に、コーディングシステム‘no-conversion’は、いかなる文字コード変 換 — 非ASCIIバイト値や行末にたいしても — を行いません。これは、バイナリ ーファイル、tarファイル、 そのまま処理する必要があるその他のファイルを読 み書きするのに便利です。これも‘enable-multibyte-characters’を‘nil’にセッ トします。 いかなる種類の変換もしないでファイルを編集するもっとも簡単な方法は、 ‘M-x find-file-literally’コマンドを使うことです。このコマンドは、 ‘no-conversion’を使い、ファイルを見る前にファイルの内容を変換するかもし れない、Emacsのその他の機能を抑制します。*note Visiting::を参照してくだ さい。 コーディングシステム‘emacs-internal’(または‘utf-8-emacs’)は、Emacs内 部エンコーディングのままで格納された、非ASCII文字を含むファイルであるこ とを意味します。これは出会ったデータに基づいて行末変換を処理し、行末変換 の種類を指定する通常の3つの変種を持ちます。 ---------- Footnotes ---------- (1) これはMIMEの‘text/*’の本体、および他のネットワーク転送のコンテキ ストでも指定されています。これはEmacsが直接サポートしないSGMLリファレン ス構文のrecord-start/record-endとは異なります。 22.6 コーディングシステムの認識 =============================== Emacsはテキストを読み込むとき、どのコーディングシステムが使われているか 認識しようと試みます。これはファイルの読み込み、サブプロセスからの出力、 X選択からのテキストなど、さまざまです。Emacsは大抵の場合 — 自分の好みを 1度指定しておけば、自動的に正しいコーディングシステムを選択できます。 データにどのバイトシーケンスが出現するかにより、認識あるいは識別され るコーディングシステムもいくつかあります。しかし識別される可能性さえない コーディングシステムもあります。たとえばLatin-1とLatin-2を識別する方法は ありません。これらは同じバイト値を異なる意味で使用します。 Emacsはこのようなシチュエーションを、コーディングシステムの優先リスト により処理します。Emacsがファイルを読み込むときは常に、それに使用するコ ーディングシステムを指定しなければ、Emacsはデータを各コーディングシステ ムに照らしてチェックし、それを優先順位の上から順に、データに適合するコー ディングシステムが見つかるまで続けます。そして、そのコーディングシステム で、ファイル内容が表示できると仮定して変換を行います。 コーディングシステムの優先リストは、選択されている言語環境に依存しま す(*note Language Environments::を参照してください)。たとえばFrenchを使 うのなら、おそらくEmacsにはLatin-2よりLatin-1を選んでほしいでしょう。 Czechを使うなら、おそらくLatin-2のほうがよいでしょう。これが言語環境を指 定する理由の1つです。 しかし、コマンド‘M-x prefer-coding-system’を使って、優先リストの詳細 を変更できます。このコマンドはミニバッファーからコーディングシステムの名 前を読み取り、それを優先リストの先頭に追加して、他のすべてのものより優先 するようにします。このコマンドを数回使うと、使用するごとに優先リストの先 頭に1つの要素が追加されます。 ‘iso-8859-1-dos’のような、行末変換を指定したコーディングシステムを使 うと、‘iso-8859-1’を優先して認識を試み、その際DOSの行末変換を使うことを Emacsに指示することになります。 ファイルにたいして使用するコーディングシステムをファイル名が示してい ることがあります。変数‘file-coding-system-alist’は、この対応関係を指定し ます。このリストに要素を追加する特別な関数は、 ‘modify-coding-system-alist’です。たとえば、すべての‘.txt’の読み書きに、 コーディングシステム‘chinese-iso-8bit’を使用したいなら、つぎのLisp式を実 行します: (modify-coding-system-alist 'file "\\.txt\\'" 'chinese-iso-8bit) 1つ目の引数は‘file’、2番目の引数はこれを適用するファイルを決定する正規表 現、3番目の引数は、これらのファイルに対して使用するコーディングシステム です。 Emacsはファイルの内容にもとづいて、使用する行末変換の種類を認識します 。復帰のみ、あるいは復帰改行のシーケンスだけであれば、対応する行末変換を 選択します。変数‘inhibit-eol-conversion’を非‘nil’にセットすることにより 、行末変換の自動的な使用を抑止できます。これを行うとDOSスタイルのファイ ルは、バッファー内に可視の‘^M’という文字を表示します。モードラインの左端 に目立たないように表示される改行タイプ指示‘(DOS)’より、こちらのほうを好 む人もいます。 デフォルトでは、コーディングシステムの自動検知はエスケープシーケンス を検出します。文字シーケンスがエスケープ文字で開始されていて、そのシーケ ンスが有効なISO-2022であれば、それはEmacsにファイルをデコードするエンコ ーディングに、ISO-2022を使うことを告げています。 しかし、ファイルの中のエスケープシーケンスを、そのまま読み取りたい場 合もあるでしょう。そのような場合、変数‘inhibit-iso-escape-detection’を非 ‘nil’にセットします。これにより、コード検知はエスケープシーケンスを無視 するようになり、ISO-2022エンコーディングは使用されません。この結果として 、すべてのエスケープシーケンスがバッファー内で可視になります。 変数‘inhibit-iso-escape-detection’のデフォルト値は‘nil’です。わたした ちは特別な操作を除いて、これを変更しないことを推奨します。なぜなら、 EmacsディストリビューションのEmacs Lispソースファイルのいくつかは、コー ディングシステム‘iso-2022-7bit’でエンコードされた非ASCII文字を含んでおり 、エスケープシーケンス検知を抑止しているときにこれらのファイルをvisitす ると、正しくデコードされないからです。 変数‘auto-coding-alist’および‘auto-coding-regexp-alist’は、それぞれフ ァイル名に含まれる特定パターン、およびファイルに含まれる特定パターンによ りコーディングシステムを指定する一番強い方法です。これらの変数は、ファイ ル自身に含まれる‘-*-coding:-*-’タグさえオーバーライドします。たとえば、 Emacsはtarおよびアーカイブファイルに、‘auto-coding-alist’を使います。こ れはアーカイブのメンバーファイルに‘-*-coding:-*-’が含まれている場合、 Emacsが混乱してそれをファイル全体に適用するのを防ぎます。 コーディングシステムを指定する他の方法は、変数 ‘auto-coding-functions’を使う方法です。たとえばビルトインの1つ ‘auto-coding-functions’は、XMLファイルにたいするエンコーディングを検知し ます。前の2つと異なり、この変数は‘-*-coding:-*-’タグをオーバーライドしま せん. 22.7 ファイルのコーディングシステムの指定 ========================================= Emacsがファイルのエンコーディングを正しく認識しなかった場合、‘C-x r’ (‘revert-buffer-with-coding-system’)で、正しいコーディングシステムで ファイルを再読み込みできます。このコマンドは、使用するコーディングシステ ムの入力を求めます。ファイルのデコードに実際に使われているコーディングシ ステムを見るには、モードラインの左端の近くのコーディングシステムのニーモ ニック文字を見るか、‘C-h C’ (‘describe-coding-system’)をタイプします。 特定のファイルのコーディングシステムを指定するのに、そのファイル自身 の最初に‘-*-...-*-’構成を指定するか、ファイルの最後にローカル変数リスト (*note File Variables::を参照してください)を使用できます。これは ‘coding’という名前の“変数”に、値を定義することにより行われます。Emacsは 実際には変数‘coding’をもっていません。かわりに変数をセットして、特定のフ ァイルにたいしてコーディングシステムを指定するのにこれを使います。たとえ ば‘-*-mode: C; coding: latin-1; -*-’は、Latin-1コーディングシステム、同 様にCモードを指定することを指示します。ファイルの中でコーディングを明示 的に指定した場合、これは‘file-coding-system-alist’をオーバーライドします 。 22.8 出力のためのコーディングシステムの選択 =========================================== Emacsがバッファーにたいして1度コーディングシステムを選択すると、そのコー ディングシステムは、‘buffer-file-coding-system’に記録されます。これによ り‘save-buffer’や‘write-region’などの、バッファーからファイルに書き込む 際のデフォルトに、それを使用するようになります。 ‘set-buffer-file-coding-system’を使って、バッファーのコーディングシステ ムとは異なるコーディングシステムで、ファイルに書き込むよう指定できます (*note Text Coding::を参照してください)。 Emacsがサポートする任意の文字を、任意のEmacsバッファーに挿入できます が、ほとんどのコーディングシステムは、それらの文字のサブセットしか処理す ることができません。したがって挿入した文字は、そのバッファーを保存するの に使われるコーディングシステムではエンコードできないかもしれません。たと えば、‘iso-8859-2’でエンコードされたPolishのファイルをvisitして、それに Russianの単語を追加することは可能です。このバッファーを保存するとき、 Emacsは‘buffer-file-coding-system’の現在の値を使用できません。なぜなら追 加された文字が、そのコーディングシステムではエンコードできないからです。 これが発生した場合、Emacsは(‘M-x prefer-coding-system’または‘M-x set-language-environment’によりセットされた)もっとも適したコーディングシ ステムを試します。そのコーディングシステムがバッファーのすべての文字をエ ンコードできたら、Emacsはそれを使って、その値を ‘buffer-file-coding-system’に格納します。そうでなければEmacsはバッファー 内容をエンコードするのに適したコーディングシステムのリストを表示して、そ れらのコーディングシステムを1つ選ぶよう求めます。 メールメッセージに適さない文字を入力した場合、Emacsの振る舞いは若干異 なります。この場合、追加でMIMEメッセージに推奨されたもっとも適したコーデ ィングシステムかをチェックします。もしそうでなければ、この事実を知らせ、 他のコーディングシステムの入力を求めます。これにより、メール受信者のメー ルソフトがデコードするのが困難なエンコードで、無意識にメッセージを送るよ うなことがなくなります(入力をもとめられたときに、適さないコーディングシ ステムを選ぶ、という選択肢もまだ残っています)。 メールメッセージを送信するとき、Emacsはメッセージテキストのエンコーデ ィングに使うコーディングシステムを決定する、4つの異なる方法をもっていま す。最初にバッファー自身の‘buffer-file-coding-system’が非‘nil’なら、それ を使います。次に‘sendmail-coding-system’が非‘nil’なら、それを使います。 3番目は‘default-sendmail-coding-system’の値を使います。上述した値のすべ てが‘nil’の場合、Emacsは、新たなファイルに使用されるデフォルトコーディン グシステム(選択された言語環境により制御される、 ‘buffer-file-coding-system’の値)を使用して送信メールをエンコードします。 22.9 ファイルのテキストにたいするコーディングシステムの指定 =========================================================== Emacsがファイル内容にたいして、自動的に正しいコーディングシステムを選択 しない場合、コーディングシステムを指定するために、以下のコマンドを使用で きます。 ‘C-x f CODING ’ カレントバッファーのファイルを、コーディングシステムCODINGを使って 保存または再visitします(‘set-buffer-file-coding-system’)。 ‘C-x c CODING ’ 直後に続くコマンドのコーディングシステムにCODINGを指定します (‘universal-coding-system-argument’). ‘C-x r CODING ’ コーディングシステムCODINGを使って、現在のファイルを再visitします (‘revert-buffer-with-coding-system’)。 ‘M-x recode-region RIGHT WRONG ’ コーディングシステムWRONGを使ってデコードされたリージョンを、かわり にコーディングシステムRIGHTを使ってデコードします。 コマンド‘C-x f’ (‘set-buffer-file-coding-system’)は、カレントバ ッファーのファイルのコーディングシステムをセットします(たとえばファイル を保存またはリバートするときに使うコーディングシステム)。これはミニバッ ファーを使ってコーディングシステムを指定します。モードラインのコーディン グシステムインディケーターを‘mouse-3’でクリックしても、このコマンドを呼 び出すことができます。 バッファーのすべての文字を処理できないコーディングシステムを指定した 場合、Emacsは問題となる文字について警告します。そしてそのバッファーを保 存するときのコーディングシステムの選択を求めます。 このコマンドを、カレントバッファーのエンコーディングの際の改行変換の 指示に使うこともできます(*note end-of-line conversion: Coding Systems.を 参照してください)。たとえば‘C-x f dos ’は、カレントバッファー を、DOSスタイル(行末が改行復帰文字)で保存します。 ファイルにたいしてコーディングシステムを指定する他の方法は、ファイル をvisitするときに指定する方法です。最初にコマンド‘C-x c’ (‘universal-coding-system-argument’)を使います。このコマンドはミニバッフ ァーを使ってコーディングシステムを読み取ります。ミニバッファーを抜けた後 、_その直後に続くコマンド_に、指定したコーディングシステムが使用されます 。 たとえば直後に続くコマンドが‘C-x C-f’の場合、そのコーディングシステム を使ってファイルを読み込みます(そして後で保存するときのために、そのコー ディングシステムを記録します)。直後に続くコマンドが‘C-x C-w’の場合、その コーディングシステムを使ってファイルを書き込みます。‘C-x f’のかわ りに、この方法で保存するときのコーディングシステムを指定した場合、バッフ ァーにそのコーディングシステムが処理できない文字が含まれていても警告はさ れません。 ‘C-x i’や‘C-x C-v’、同様に‘C-x C-f’の別ウィンドウ版‘C-x c’など 、その他のファイルコマンドも指定されたコーディングシステムに影響されます 。そして‘M-x shell’ (*note Shell::を参照してください)を含む、サブプロセ スを開始するコマンドも影響を受けます。直後に続くコマンドがコーディングシ ステムを使用しない場合、‘C-x c’は何の影響も与えません。 変換をせずにファイルをvisitする簡単な方法は、‘M-x find-file-literally’コマンドです。*note Visiting::を参照してください。 変数‘buffer-file-coding-system’のデフォルト値は、新しいファイルを作成 するときに選択されるコーディングシステムを指定します。これは新しいファイ ルを作成するときや、バッファーを作成してそれをファイルに保存するときに適 用されます。言語環境の選択は、この変数を言語環境にたいして適した、デフォ ルトのコーディングシステムにセットします。 間違ったコーディングシステムでファイルをvisitしたときは、‘C-x r’ (‘revert-buffer-with-coding-system’)でこれを正すことができます。これ は指定したコーディングシステムを使って、現在のファイルを再visitします。 テキストの一部が、すでに間違ったコーディングシステムでバッファーに挿 入されてしまった場合、‘M-x recode-region’を使ってデコードしなおすことが できます。これは正しいコーディングシステムと、実際に使われた間違ったコー ディングシステムの入力を求め、変換を行います。最初にリージョンを間違った コーディングシステムでエンコードして、その後で正しいコーディングシステム でデコードします。 22.10 プロセス間通信にたいするコーディングシステム ================================================== このセクションでは、他のプロセスと通信するときに使うコーディングシステム を指定する方法を説明します。 ‘C-x x CODING ’ 選択したテキストを、他のグラフィカルなアプリケーションと送受信する ために、コーディングシステムCODINGを使用します (‘set-selection-coding-system’)。 ‘C-x X CODING ’ 次回に選択するテキストを、他のグラフィカルなアプリケーションと送受 信するために、コーディングシステムCODINGを使用します (‘set-next-selection-coding-system’)。 ‘C-x p INPUT-CODING OUTPUT-CODING ’ カレントバッファーでのサブプロセスの入出力に、コーディングシステム INPUT-CODINGとOUTPUT-CODINGを使用します (‘set-buffer-process-coding-system’)。 コマンド‘C-x x’ (‘set-selection-coding-system’)は、選択したテキ ストを他のウィンドウアプリケーションに送信するとき、および他のアプリケー ションで選択されたテキストを受信するときのコーディングシステムを指定しま す。このコマンドは、このコマンドを再度使って設定をオーバーライドするまで 、以降のすべての選択に適用されます。コマンド‘C-x X’ (‘set-next-selection-coding-system’)は、Emacsで次に選択されるテキスト、 または次に読み取られるテキストのためのコーディングシステムを指定します。 変数‘x-select-request-type’は、Xウィンドウシステムからのリクエストに より、他のアプリケーションで選択されたテキストを受信する際のデータタイプ を指定します。値が‘nil’(デフォルト)の場合、Emacsは‘UTF8_STRING’、 ‘COMPOUND_TEXT’の順に試み、さらにさまざまな経験則を用いて、2つの結果から より適したものを選択します。どちらも成功しなかったとき、Emacsは ‘STRING’にフォールバックします。‘x-select-request-type’の値が、 ‘COMPOUND_TEXT’、‘UTF8_STRING’、‘STRING’、‘TEXT’のうちのどれかであった場 合、Emacsはリクエストされたタイプだけを使用します。値がこれらのシンボル のリストだった場合、Emacsはリストのリクエストタイプを順に試行し、どれか が成功するか、すべてを試みるまで続けます。 コマンド‘C-x p’ (‘set-buffer-process-coding-system’)は、サブプ ロセスの入出力のコーディングシステムを指定します。このコマンドはカレント バッファーに適用されます。サブプロセスは通常、それぞれ自身のバッファーを もっています。したがってサブプロセスに対応するバッファーでこのコマンドを 実行することにより、特定のサブプロセスとの送受信に使用するコーディングシ ステムを指定できます。 サブプロセスを開始するコマンドの直前に‘C-x c’ (‘universal-coding-system-argument’)を使うことにより、そのプロセスとの通 信で使用するコーディングシステムを指定することもできます。*note Text Coding::を参照してください。 デフォルトでは、プロセス通信の入出力は現在の言語環境に依存します。 変数‘locale-coding-system’は、システムのエラーメッセージや、 ‘format-time-string’のフォーマットやタイムスタンプなどの、システム文字列 のエンコードおよびデコードで使用するコーディングシステムを指定します。こ のコーディングシステムは、Xウィンドウシステムでの非ASCIIキーボードによる 入力のデコード、およびバッチモードのときに標準出力とエラーストリームに送 るテキストのエンコードにも使用されます。通常は環境変数‘LC_ALL’、 ‘LC_CTYPE’、‘LANG’のうちの1つで指定される、背景にあるシステムのテキスト 表現(text representation)と互換性のあるコーディングシステムを選択するべ きです(上記の順番で最初の環境変数の値が空でない場合、それはテキスト表現 を決定します)。 22.11 ファイル名にたいするコーディングシステム ============================================== ‘C-x F CODING ’ ファイル名のエンコードおよびデコードに、コーディングシステム CODINGを使用します(‘set-file-name-coding-system’)。 コマンド‘C-x F’ (‘set-file-name-coding-system’)は、ファイルの _名前_に使用するコーディングシステムを指定します。ファイルの_内容_の読み 込みと書き込みには影響がありません。 実際にこのコマンドが行うのは、変数‘file-name-coding-system’に値をセッ トすることだけです。変数にコーディングシステムの名前(Lispシンボルか文字 列)をセットすると、Emacsはすべてのファイル操作において、ファイル名のエン コードにそのコーディングシステムを使用します。これによりファイル名に非 ASCII文字 — または少なくとも指定されたコーディングシステムではエンコード できる非ASCII文字 — を使うことが可能になります。 ‘file-name-coding-system’が‘nil’の場合、Emacsは言語環境により選択され 、変数‘default-file-name-coding-system’に格納される、デフォルトのコーデ ィングシステムを使用します。デフォルトの言語環境では、ファイル名の非 ASCII文字は特別にエンコードはされません。これらはEmacsの内部表現を使って 、ファイルシステム上に表示されます。 Emacsが、MS-WindowsのNTファミリーの子孫(Windows 2000、XP、および以降 すべてのバージョン)にあたるバージョンで実行されている場合、 ‘file-name-coding-system’の値は大部分が無視されます。これはEmacsがデフォ ルトでUnicodeファイル名を直接渡せるAPIを使用するからです。一方、Windows 9Xでは、ファイル名は変数‘file-name-coding-system’を使ってエンコードされ ており、この変数にはカレントのシステムロケールにたいして適切なコードペー ジ(*note codepage: Coding Systems.を参照してください)がセットされている 必要があります。変数‘w32-unicode-filenames’の値は、Emacsがファイル名を引 数とするOS関数を呼び出すUnicode APIを使うかどうかを制御します。この変数 はスタートアップコードにより、Windows 9Xでは‘nil’、新しいバージョンの MS-Windowsでは‘t’にセットされます。 *警告: *Emacsセッションの途中で‘file-name-coding-system’(または言語環 境)を変更した場合、すでにvisitしているファイルの名前が、古いコーディング システムを使えばエンコードできるが、新しいコーディングシステムではエンコ ードされない(または違ってエンコードされる)という問題が発生します。このよ うなバッファーをvisitしたファイル名で保存を試みると、間違ったファイル名 で保存するか、エラーが発生します。このような問題が発生したときは‘C-x C-w’を使って、そのバッファーにたいして新しいファイル名を指定してください 。 ファイル名をエンコードするとき間違いが発生した場合、コマンド‘M-x recode-file-name’を使って、ファイル名のコーディングシステムを変更します 。このコマンドは古いコーディングシステムでの既存のファイル名と、変換した いコーディングシステムの入力を求めます。 22.12 端末入出力にたいするコーディングシステム ============================================== ‘C-x t CODING ’ 端末の出力に、コーディングシステムCODINGを使用します (‘set-terminal-coding-system’)。 ‘C-x k CODING ’ キーボード入力に、コーディングシステムCODINGを使用します (‘set-keyboard-coding-system’)。 コマンド‘C-x t’ (‘set-terminal-coding-system’)は、端末出力のた めのコーディングシステムを指定します。端末出力の文字コードを指定した場合 、端末へのすべての文字出力は、指定したコーディングシステムに変換されます 。 この機能は、特定の言語または文字セットをサポートするようビルドされた 、特定の文字端末で有用です — たとえばEuropean端末は、ISO Latin文字セット の1つをサポートします。マルチバイトテキストを使う場合は、端末のコーディ ングシステムを指定する必要があります。これにより、Emacsは端末が実際にど の文字を処理できるのか知ることができます。 デフォルトでは、Emacsが端末タイプまたはlocale指定により、正しいコーデ ィングシステムを推論できない場合、端末への出力は変換されません。 コマンド‘C-x k’ (‘set-keyboard-coding-system’)、または変数 ‘keyboard-coding-system’は、キーボード入力のためのコーディングシステムを 指定します。キーボード入力の文字コード変換は、非ASCIIのグラフィック文字 を送信するキーをもつ端末で有用です — たとえば、いくつかの端末はISO Latin-1、またはそれのサブセットのためにデザインされています。 デフォルトでは、キーボード入力はシステムのlocale設定にもとづいて変換 されます。端末がlocaleにより暗に指定されるエンコードを実際にはサポートし ない場合(たとえば、‘M-i’をタイプしたときに非ASCII文字が挿入されるのに気 づいたとき)、エンコーディングをオフにするために ‘keyboard-coding-system’を‘nil’にセットする必要があるでしょう。これは、 (set-keyboard-coding-system nil) をinitファイルに記述することにより、行うことができます。 キーボード入力にたいするコーディングシステムを使用した変換と、インプ ットメソッドの使用は似通った点があります。これらは両方ともキーボード入力 シーケンスを1つの文字に変換します。しかし、インプットメソッドは人間によ り対話的に使用されることが便利なようにデザインされており、通常はASCIIの プリント文字のシーケンスが、変換されたシーケンスになります。通常、コーデ ィングシステムは非グラフィック文字のシーケンスを変換します。 22.13 フォントセット ==================== フォントは通常、1つのアルファベットまたはスクリプトの形状を定義します。 したがってEmacsがサポートするスクリプトの全範囲を表示するには、多くのフ ォントのコレクションが要求されます。Emacsではこのようなコレクションのこ とを“フォントセット(fontset)”と呼びます。フォントセットはフォント仕様の リストとして定義され、それぞれが文字コードのある範囲を処理し、指定された フォントでカバーしない文字にたいしては他のフォントセットにフォールバック します。 それぞれのフォントセットは、フォントと同様に名前をもちます。しかしフ ォントはシステムに格納されていて、利用可能なフォント名はシステムで定義さ れていますが、フォントセットはEmacs自身で定義されます。1度フォントセット を定義したら、1つのフォントを使える場所ならどこでも、フォントセットを名 前で指定して使用することができます。もちろんEmacsのフォントセットに使用 できるのは、システムがサポートするフォントだけです。もしある文字がスクリ ーン上で空のボックスや16進コードで表示される場合、それは使用しているフォ ントセットがその文字にたいするフォントをもっていないことを意味します。こ のような場合や、文字は表示されるが、それが意図したものとは異なる場合、多 分追加のフォントをインストールする必要があるでしょう。オペレーティングシ ステムにはインストールできるオプションのフォントがあるはずです。またはサ ポートされたスクリプトのほとんどのフォントを含むGNU Intlfontsパッケージ をインストールすることもできます。(1) Emacsは3つのフォントセットを自動的に作成します。それは“スタンダードフ ォントセット(standard fontset)”、“スタートアップフォントセット(startup fontset)”、“デフォルトフォントセット(default fontset)”の3つです。デフォ ルトフォントセットは、さまざまな非ASCII文字のフォントをもち、他の2つのフ ォントセットのデフォルトのフォールバック先です(デフォルトフォントをセッ トしたときは、デフォルトフォントセットではなくデフォルトフォント)。しか しこれはフォントのファミリー名を指定しないので、これを直接使うと、結果は 少しランダムに思えるかもしれません。Emacsを‘-fn’オプションで実行すること により、特定のフォントセットを使用するように指示できます。たとえば、 emacs -fn fontset-standard ‘Font’でフォントセットを指定することもできます(*note X Resources::を参照 してください)。 使用するフォントセットが何も指定されていない場合、EmacsはASCIIフォン トを使用し、そのフォントがカバーしない文字にたいするフォールバックに ‘fontset-default’を使用します。名前とは裏腹にスタンダードフォントセット は、明示的に要求されたときだけ使用されます。 特定のフォントセットの情報を表示するためには、 ‘M-x describe-fontset’コマンドを使用します。これこのコマンドはフォントセ ットの名前(デフォルトはカレントフレームで使用されているフォントセット)を 尋ねて、文字のすべての部分範囲(subrange)と、フォントセット内でそれらに割 り当てられたフォントを表示します。 フォントセットは、すべての文字コードにたいしてフォントを指定する必要 はありません。フォントセットが特定の文字にたいしてフォントを指定していな い、または指定したフォントがシステムに存在しない場合、フォントセットは文 字を正しく表示できません。この場合、その文字は16進コード、細いスペース、 または空のボックスがかわりに表示されます(詳細は、*note glyphless characters: Text Display.を参照してください)。 ---------- Footnotes ---------- (1) EmacsをXで実行している場合、以下のようにして新しくインストールし たフォントの場所を、X serverに指示する必要があるでしょう: xset fp+ /usr/local/share/emacs/fonts xset fp rehash 22.14 フォントセットの定義 ========================== XでEmacsを実行している場合、Emacsは‘standard-fontset-spec’の値により、ス タンダードフォントセットを作成します。このフォントセットの名前は、 -*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard または単に短く‘fontset-standard’です。 GNUstep、およびmacOSではスタンダードフォントセットは、 ‘ns-standard-fontset-spec’の値を使って作成され、MS Windowsでは ‘w32-standard-fontset-spec’の値を使って作成されます。 スタンダードフォントセットのボールド、イタリック、ボールドイタリック などの変種も自動的に作成されます。これらの変種の名前には‘medium’のかわり に‘bold’、または‘r’のかわりに‘i’、またはその両方が使われます。 Emacsは‘Font’リソース、または‘-fn’引数で指定した任意のデフォルト ASCIIフォント、またはEmacsが起動時に見つけたデフォルトフォントにもとづい て、フォントセットを自動的に作成します。これが“スタートアップフォントセ ット(startup fontset)”で、名前は‘fontset-startup’です。Emacsは CHARSET_REGISTRYフィールドを‘fontset’、CHARSET_ENCODINGフィールドを ‘startup’で置き換えてフォントセットを生成して、その置き換えた文字列をフ ォントセットの指定に用います。 たとえば以下の形式でEmacsを起動した場合、 emacs -fn "*courier-medium-r-normal--14-140-*-iso8859-1" Emacsは以下のフォントセットを生成して、それをXウィンドウの初期フレームに 使用します: -*-courier-medium-r-normal-*-14-140-*-*-*-*-fontset-startup スタートアップフォントセットは、そのフォントでサポートされているすべ ての文字にたいして指定したフォントか、異なるregistryまたはencodingのフォ ントを使用し、それ以外の文字は‘fontset-default’にフォールバックして表示 するでしょう。 Xリソースの‘Emacs.Font’では、フォントセット名を実際のフォント名のよう に指定できます。しかし‘Emacs*Font’のようなワイルドカードを使ったリソース にフォントセット名を指定しないように注意してください — ワイルドカードを 使った指定は、メニューのようなフォントセットを処理できないものも含めて、 他のさまざまな目的にも適用されます。*note X Resources::を参照してくださ い。 ‘Fontset-N’という名前のXリソースを使って、追加のフォントセットを指定 できます。ここでNは0から始まる整数です。リソースの値はつぎのような形式で す: FONTPATTERN, [CHARSET:FONT]... ここでFONTPATTERNは、最後の2つのフィールドを除いて、標準のXフォント名の 形式です(前のfontset-startupの例を参照)。最後の2つのフィールドは、 ‘fontset-ALIAS’の形式をもつべきです。 すべてのフォントセットには2つの名前、長い名前と短い名前があります。長 い名前はFONTPATTERNです。短い名前は‘fontset-ALIAS’で、これは長い名前の最 後の2つのフィールドです(たとえば、スタートアップ時に自動的に作成されるフ ォントセットは‘fontset-startup’)。どちらの名前でもフォントセットを参照で きます。 ‘CHARSET:FONT’という構成は、ある文字セットにたいして、(このフォントセ ットでは)どのフォントを使用するかを指定します。ここでCHARSETは、文字セッ トの名前で、FONTはその文字セットに使用するフォントです。1つのフォントセ ットの定義の中で、この構成を何度でも使用できます。 他の文字セットにたいしては、EmacsはFONTPATTERNにもとづいて選択します 。これは文字セットを記述する値で‘fontset-ALIAS’を置き換えます。ASCII文字 フォントにたいしては、‘fontset-ALIAS’を‘ISO8859-1’で置き換えます。 これに加えて、複数の連続するフィールドがワイルドカードの場合、Emacsは それらを1つのワイルドカードにまとめます。これは、オートスケールされたフ ォントの使用を避けるためです。大きいフォントをスケーリングしたフォントは 編集に適しておらず、小さいフォントをスケーリングしたフォントも同様です。 なぜならEmacsがそうするように、もともと小さなフォントを使うほうがよいか らです。 したがって、FONTPATTERNが以下の場合、 -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24 ASCII文字にたいするフォント指定は、以下のようになるでしょう: -*-fixed-medium-r-normal-*-24-*-ISO8859-1 そしてChinese GB2312文字にたいするフォント指定は、以下のようになるでしょ う: -*-fixed-medium-r-normal-*-24-*-gb2312*-* 上記のフォント指定に一致するChineseフォントがないかもしれません。ほと んどのXディストリビューションには、FAMILYフィールドが‘song ti’か ‘fangsong ti’のChineseフォントだけが含まれています。そのような場合、 ‘Fontset-N’をつぎのように指定します: Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\ chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-* そうするとChinese GB2312の文字を除くフォント指定では、FAMILYフィールドが ‘fixed’となり、Chinese GB2312の文字に対するフォント指定では、FAMILYフィ ールドが‘*’となります。 フォントセットのリソース値を処理してフォントセットを作る関数は、 ‘create-fontset-from-fontset-spec’と呼ばれます。フォントセットを作るため に、この関数を明示的に呼ぶこともできます。 フォントの命名についての詳細は、*note Fonts::を参照してください。 22.15 フォントセットの修正 ========================== 常にフォントセットをスクラッチから作成する必要はありません。軽微な変更だ けが必要なときは、既存のフォントセットを修正するのが簡単な方法でしょう。 ‘fontset-default’の修正は、それをフォールバックに使用する他のフォントセ ットにも影響するので、特定のスクリプトのためにEmacsが選択するフォントに 関する問題を解決する、効果的な方法になり得ます。 フォントセットは関数‘set-fontset-font’を使って、文字、文字セット、ス クリプトフォントを修正する文字範囲、使用されるフォントの指定を修正するこ とができます。以下は例です: ;; Use Liberation Mono for latin-3 charset. (set-fontset-font "fontset-default" 'iso-8859-3 "Liberation Mono") ;; Prefer a big5 font for han characters. (set-fontset-font "fontset-default" 'han (font-spec :registry "big5") nil 'prepend) ;; Use DejaVu Sans Mono as a fallback in fontset-startup ;; before resorting to fontset-default. (set-fontset-font "fontset-startup" nil "DejaVu Sans Mono" nil 'append) ;; Use MyPrivateFont for the Unicode private use area. (set-fontset-font "fontset-default" '(#xe000 . #xf8ff) "MyPrivateFont") システムにインストールされているフォントが壊れていたり、使用されてい る文字にたいして好ましくない結果を生成するフォントがあるかもしれません。 そのような場合、文字を表示するのに必要となる適切なフォントの検索に、それ らのフォントを完全に無視するように、Emacsに指示したいと思うかもしれませ ん。‘face-ignored-fonts’の値(リスト変数です)に、不適切なフォントを追加す ることによりこれを行なうことができます。以下は、そのような設定を ‘~/.emacs’に記述する例です: (add-to-list 'face-ignored-fonts "Some Bad Font") 22.16 表示できない文字 ====================== あなたの端末では表示できない非ASCII文字が、いくつか存在するかもしれませ ん。ほとんどのテキスト端末は、1つの文字セットだけをサポートします (Emacsに何を使うか指示するには、変数‘default-terminal-coding-system’を使 用します。*note Terminal Coding::を参照してください)。そのコーディングシ ステムではエンコードできない文字は、デフォルトでは‘?’と表示されます。 グラフィカルなディスプレーでは、より広範囲の文字を表示できますが、そ れらすべてのフォントがインストールされていないかもしれません。フォントが ない文字は、中空のボックスで表示されます。 Latin-1文字を使用するとき、端末がLatin-1を表示できない場合、かわりに ニーモニックASCIIシーケンスを表示できます。たとえばo-umlautのかわりに ‘"o’が表示されます。これを行うには‘iso-ascii’をロードします。 端末がLatin-1を表示できる場合、Latin-1と等しい文字とASCIIニーモニック を混交して、他のEuropean文字セットを表示できます。これは変数 ‘latin1-display’をカスタマイズすることにより有効になります。ニーモニック ASCIIシーケンスは、ほとんどがインプットメソッドのプレフィクスに対応しま す。 22.17 Unibyte編集モード ======================= ISO 8859 Latin-N文字セットは、さまざまなEuropean言語で必要とされるアクセ ント文字と区切り文字を扱うために、8進の0240から0377(10進の160から250)の 範囲の文字コードを定義しています。Emacsはこの範囲のバイトを、たとえ unibyteバッファー(たとえばマルチバイト文字を無効にしている場合)でも、そ れらを文字としてではなく、rawバイトとみなします。しかし、それでもEmacsは これらの文字コードを、あたかも_1つ_も1バイト文字セットに属するかのように 1度に扱うことができます。これらのコードの_どれ_を使うかを指定するには、 ‘M-x set-language-environment’を呼び出して、‘Latin-N’のような適切な言語 環境を指定します。*note Disabling Multibyte Characters: (elisp)Disabling Multibyte.を参照してください。 端末や使っているフォントがこれらの文字をサポートしている場合、Emacsは 160から255の文字を読み取り可能な文字として表示できます。これは自動的に行 われます。グラフィカルなディスプレーでは、Emacsはフォントセットを通じて 1バイト文字として表示できます。これは現在の言語環境で、それらに対応する マルチバイト文字を表示することにより行われます。これを行うには、変数 ‘unibyte-display-via-language-environment’に非‘nil’値を設定します。この セッティングは、これらのバイトを表示する方法だけに影響しますが、Emacsが それらを文字としてではなくrawバイトとして扱うという基礎事実は変わらない ことに注意して下さい。 端末でLatin-1文字セットを表示できない場合、Emacsはこれらの文字をその 文字が少なくとも何であるかを明確に理解できるような、ASCIIシーケンスとし て表示できます。これを行うには、ライブラリー‘iso-ascii’をロードします。 他のLatin-N文字セットに対しても似たようなライブラリを実装できますが、こ れは まだ行われていません。 通常、非ISO 8859文字セット(10進文字の128から159のコードも含む)は、8進 でエスケープ表示されます。ライブラリー‘disp-table’の関数 ‘standard-display-8bit’を使うことにより、非標準の拡張バージョンのISO 8859文字セットに変更できます。 1バイトの非ASCII文字を入力する2つの方法があります: • 選択した言語環境のインプットメソッドを使用することができます。*note Input Methods::を参照してください。unibyteバッファーでインプットメ ソッドを使用した場合、入力した非ASCII文字は、ユニバイトに変換されま す。 • キーボードが、非ASCII文字を表現する(10進の)128以上の文字コードを生 成できるならば、それらの文字コードを直接タイプすることができます。 グラフィカルなディスプレーでは、これらのキーを使うのに特別なことを する必要はありません。それらは単純に機能するでしょう。テキスト端末 では、コマンド‘M-x set-keyboard-coding-system’を使うか、変数 ‘keyboard-coding-system’をカスタマイズして、キーボードが使用するコ ーディングシステムを指定します(*note Terminal Coding::を参照してく ださい)。この機能を有効にすることにより、おそらくMeta文字を入力する ためにを使う必要が生じるでしょう。しかし、コンソール端末、また は‘xterm’のような端末エミュレータでは、Metaをにアレンジするこ とが可能です。また8ビット文字を直接キーボードから入力したり、 キーやキーを使うこともできます。*note User Input::を 参照してください。 • 非ASCIIのLatin-1、および、数は多くありませんが他のプリント文字入力 の合成文字(compose-character)プレフィックスとして‘C-x 8’を使用でき ます。‘C-x 8’は、(ミニバッファーや他のバッファーでの)挿入、検索、キ ーシーケンスが許される他のコンテキストなどで使用できます。 ライブラリー‘iso-transl’をロードすることにより‘C-x 8’は機能します。 1度ライブラリーをロードすると、修飾キーがある場合は、‘C-x 8’と 同じ目的で使用できます。後続の文字を修飾するには、アクセント文字と 一緒にを使用します。さらにLatin-1の専用アクセント文字キー(dead accent characters)があると、1度‘iso-transl’をロードした後は、それら のキーも後続の文字を合成するように定義されます。 ‘C-x 8 C-h’を使用すると、利用可能なすべての‘C-x 8’翻訳をリストしま す。 22.18 文字セット ================ Emacsでは“文字セット(character set)”を縮めて、“charset”と呼びます。 Emacsは、ほとんどの有名なcharsets(‘ascii’、‘iso-8859-1’、‘cp1250’、 ‘big5’、‘unicode’など)に加えて、Emacs自身のcharsets(‘emacs’、 ‘unicode-bmp’、‘eight-bit’など)をサポートします。すべてのサポートされた 文字は、1つ以上のcharsetsに属します。 Emacsは通常、charsetsにたいして正しいことを行う(does the right thing)ので、あなたはそれらを心配する必要はありません。しかし、charsetsの 背景の詳細を知ることが助けになる場合もあります。 1つの例はフォント選択です(*note Fonts::を参照してください)。それぞれ の言語環境(*note Language Environments::を参照してください)は、さまざま な文字にたいする優先リスト(priority list)を定義します。フォントを検索す るとき、Emacsは最初に一番優先度の高いcharsetsを表示できるものを探すこと を試みます。たとえばJapanese言語環境では、charsets ‘japanese-jisx0208’は 一番高い優先度をもっているので、Emacsは‘registry’プロパティーが ‘JISX0208.1983-0’のフォントの使用を試みます。 charsetsに関する情報を得るのに使うことができるコマンドが2つあります。 コマンド‘M-x list-charset-chars’はcharset名の入力を求め、その文字セット のすべての文字を表示します。コマンド‘M-x describe-character-set’は charset名の入力を求め、Emacsでの内部表現も含めたそのcharsetに関する情報 を表示します。 ‘M-x list-character-sets’は、すべてのサポートされたcharsetsを表示しま す。このリストはcharsetsの名前と、各charsetを識別する追加の情報を与えま す。詳細については、Information Processing Society of Japan/Information Technology Standards Commission of Japan (IPSJ/ITSCJ) (https://www.itscj.ipsj.or.jp/itscj_english/)により保守されている、ISO International Register of Coded Character Sets to be Used with Escape Sequences (ISO-IR) (https://www.itscj.ipsj.or.jp/itscj_english/iso-ir/ISO-IR.pdf)を参照して ください。このリストでは、charsetsは2つのカテゴリーに分かれています。“通 常のcharsets(normal charsets)”が最初にリストされ、その後に“追加の charsets(supplementary charsets)”が続きます。追加のcharsetは他の charsetを定義するのに(サブセットの親として)使用されるか、古いバージョン のEmacsとの互換性のために提供されます。 バッファーの文字がどのcharsetに属するか探すには、ポイントをその文字の 前において、‘C-u C-x =’をタイプします(*note International Chars::を参照 してください)。 22.19 双方向の編集 ================== EmacsはArabicやFarsi、Hebrewのような、テキストを水平方向の右から左に記述 するスクリプトで書かれたテキストの編集をサポートします。しかし数字やそれ らのスクリプトに埋め込まれたLatinテキストは、左から右に表示されます。 Latin文書の中に少量のArabicやHebrewのテキスト部分が含まれている場合も、 稀ではありません(例: プログラムソース内のコメントや文字列)。これらの理由 により、これらのスクリプトを使うテキストは、実際には“双方向 (bidirectional)”、つまりそれらはleft-to-right(左から右)の文字と right-to-left(右から左)文字の混交されたものになります。 このセクションでは、双方向テキストを編集するためにEmacsが提供する機能 とオプションを説明します。 Emacsはright-to-leftおよび双方向テキストを、いわゆる“logical”順(また は“reading”順)で格納します。バッファーまたは文字列の最初の文字の位置は、 次に読む文字の前になります。双方向テキストを“visual”順に再配置するには、 表示時間が発生します。結果として文字の位置は、それらが表示される位置にた いして単調に増加しなくなります。Emacsは表示のための双方向テキストの再配 置を、Unicode Standard Annex #9 (http://unicode.org/reports/tr9/)で説明 されているUBA(Unicode Bidirectional Algorithm)で実装しています。 right-to-leftパラグラフ中に長い英文テキストが出現するような、基本となる パラグラフと継続行が逆方向のときに表示する方法だけが、UBAと異なります。 バッファーローカルな変数‘bidi-display-reordering’は、表示用にバッファ ーのテキストを再配置するかどうかを制御します。この変数の値が非‘nil’の場 合、Emacsは右から左の方向に表示される文字を再配置します。デフォルト値は ‘t’です。 双方向テキストの各パラグラフは、それ自身の“base direction(基本方向 )”をもっており、それはright-to-leftまたはleft-to-rightです。 left-to-rightのパラグラフはスクリーンの左端から開始し、右端に到達すると 切り詰め、または継続されます。対照的にright-to-leftのパラグラフのテキス トは右端から開始し、左端で継続、または切り詰められて表示されます。デフォ ルトでは、パラグラフの境界は空行(たとえば行全体が空白文字からなる行)です 。これを変更するために、2つの変数‘bidi-paragraph-start-re’と ‘bidi-paragraph-separate-re’をカスタマイズできます。これらの値には正規表 現(文字列)を指定します。たとえば単一の改行を新たなパラグラフの開始とする 場合は、両方の変数に‘\"^\"’をセットします。これら2つの変数はバッファーロ ーカルです(*note Locals::を参照)。 Emacsは、パラグラフを開始するテキストにもとづいて、各パラグラフの基本 方向を動的に決定します。しかし、バッファーのパラグラフにたいして特定の基 本方向を強制する必要もあるでしょう。変数‘bidi-paragraph-direction’が非 ‘nil’の場合、これは基本方向の動的な決定を無効にして、バッファーのすべて のパラグラフの方向を、このバッファーローカルな値で指定された方向に強制し ます。値には‘right-to-left’と‘left-to-right’が指定できます。これ以外の値 は‘nil’と解釈されます。 かわりにパラグラフの先頭に特別な文字を挿入することにより、パラグラフ の基本方向を制御できます。特別な文字‘RIGHT-TO-LEFT MARK’またはRLMは、以 降に続くパラグラフをright-to-left方向に強制します。その効果は ‘LEFT-TO-RIGHT MARK’またはLRMによりleft-to-right方向に再強制されるまで続 きます(‘C-x 8 ’を使ってこれらの文字を挿入できます)。GUIセッションで はLRM文字およびRLM文字は、極端に細いスペースで表示されます。テキスト端末 では、それらはスペースで表示されます。 文字は表示用に再配置されるので、logical順で処理を行うEmacsコマンドや バッファーの拡大は、普通とは異なる効果を生みます。たとえばコマンド ‘C-f’および‘C-b’はポイントをlogical順で移動するので、再配置された双方向 テキストではポイントがジャンプすることがあります。同様に隣接する文字位置 の範囲をカバーするハイライトされたリージョンは、リージョンが再配置された テキストにかかる場合には不連続に見える場合があります。これは双方向テキス トをサポートする他のプログラムの振る舞いとしては普通であり、似通っていま す。 や‘C-’のように、矢印キーにバインドされたカーソル移動コマ ンドは、カレントパラグラフの基本方向にしたがいます。left-to-rightパラグ ラフでは、修飾キーの有無に関わらず、にバインドされるコマンドは、 バッファーテキスト内を_前方(forward)_に移動しますが、right-to-leftパラグ ラフではかわりに_後方(backward)_に移動することになります。これは、 right-to-leftパラグラフのバッファー位置は、ディスプレイ上を左に移動する ことにより大部分は増加するという事実を反映しています。 パラグラフ外に移動した際、先行または後続するパラグラフの基本方向が、 移動する前のパラグラフの方向と異なる場合は、矢印キーのもつ意味は変化する でしょう。これが発生したときは、新たな基本方向に合わせて矢印キーを押下す る必要があります。 デフォルトでは、およびはlogical方向に移動しますが、 ‘visual-order-cursor-movement’が非‘nil’の場合、これらのコマンドはそれぞ れスクリーン位置を左または右に、必要ならスクリーン行の次行または前行へと 移動します。これは周辺の双方向コンテキストに依存して、多くのバッファー位 置が移動される可能性を秘めることに注意してください。 23 メジャーモードとマイナーモード ********************************* Emacsには多くの“編集用モード(editing modes)”が含まれており、これは基本的 な振る舞いを、編集に便利な方法に変更します。これらの編集用モードは“メジ ャーモード(major modes)”と“マイナーモード(minor modes)”に分けられます。 メジャーモードは、Cソースファイル(*note Programs::を参照してください )などの特定のファイルタイプや、shellバッファー(*note Shell::を参照してく ださい)などの、特別なタイプの非ファイルバッファーにたいして作業するため の特別な機能を提供します。メジャーモードは互いに排他であり、各バッファー は常に1つのメジャーモードをもちます。 マイナーモードはオンとオフを切り替えることができるオプションの機能で 、ファイルやバッファーのタイプに特定する必要はありません。たとえばAuto Fillモードは、単語の間にタイプしたで行を区切るマイナーモードです (*note Auto Fill::を参照してください)。マイナーモードは互いに独立してい て、選択されたメジャーモードからも独立しています。 23.1 メジャーモード =================== すべてのバッファーはメジャーモードをもっており、そのバッファーがカレント である間の編集の動作を決定します。モードラインには通常カレントのメジャー モード名がカッコ内に表示されます(*note Mode Line::を参照してください)。 もっとも特殊化されていないメジャーモードは、“Fundamental(基本)モード ”と呼ばれます。このモードには、モード独自の再定義や変数設定がないので、 各Emacsコマンドはもっとも一般的な振る舞いをし、各ユーザーオプションはデ フォルトの状態になっています。 Lispや英文テキストのように、Emacsが認識できる特定のタイプのテキスト編 集には、LispモードやTextモードのような、より特殊化されたメジャーモードを 通常は使用します。ほとんどのメジャーモードは3つのグループに分けられます 。最初のグループはプレインまたはマークアップされた通常テキストのためのモ ードを含みます。これにはTextモード、HTMLモード、SGMLモード、TeXモードや Outlineモードなどが含まれます。2番目のグループはプログラミング言語特有の モードです。これらは、Lispモード(いくつかの変種を有する)、Cモード、 Fortranモードなどが含まれます。3番目のグループはファイルに直接関連付けら れていないメジャーモードが含まれます。これらはEmacsが特別の目的のために 作るバッファーで使用されるものです。例としては、Diredが作成するバッファ ーのためのDiredモード(*note Dired::を参照)、‘C-x m’で作成されるバッファ ーのためのMessageモード(*note Sending Mail::を参照)、下位のシェルプロセ スとの通信用のバッファーのためのShellモード(*note Interactive Shell::を 参照)などが含まれます。 通常、メジャーモードは最初にファイルをvisitしたとき、またはバッファー を作成したときに、Emacsにより自動的にセットされます。‘M-x’コマンドを使う ことにより、新しいメジャーモードを明示的に選択することができます。モード の名前に‘-mode’を追加することにより、モードを選択するコマンド名を得るこ とができます(たとえば、Lispモードを選択する場合は‘M-x lisp-mode’)。すべ てのバッファーは厳密に1つのメジャーモードをもつので、メジャーモードを“オ フ”にする方法はなく、かわりに他のメジャーモードに切り替えなければなりま せん。 バッファーローカルな変数‘major-mode’の値は、メジャーモードコマンドと 同じ名前のシンボル(たとえば‘lisp-mode’)です。この変数は自動的にセットさ れます。あなた自身が変更するべきではありません。 ‘major-mode’のデフォルト値は、メジャーモードが指定されていないファイ ルを使うときや、‘C-x b’で作成した新しいバッファーのメジャーモードを決定 します。通常、デフォルト値はFundamentalモードを指定する、シンボル ‘fundamental-mode’です。Customizationインターフェースを通じて、このデフ ォルト値を変更できます(*note Easy Customization::を参照してください)。 initファイルに以下のような行を追加しても変更できます(*note Init File::を 参照してください): (setq-default major-mode 'text-mode) ‘major-mode’のデフォルト値が‘nil’の場合、メジャーモードは前のカレントバ ッファーから引き継がれます。 特殊化されたメジャーモードは、特定のキーにたいして、そのモードにより 適した何かを行うよう、意味づけが変更される場合があります。たとえばプログ ラミングに関連するモードでは、には、カレント行をその言語のルールに したがってインデントする機能がバインドされます(*note Indentation::を参照 してください)。一般的に変更されるキーは、‘C-j’です。多くのモ ードがモード自身の特別なコマンドを定義しており、それらは通常、プレフィク スキーが‘C-c’であるようなキーシーケンスにバインドされます。メジャーモー ドはユーザーオプションと変数も変更できます。たとえばプログラミングに間す るモードは通常、変数‘comment-start’にバッファーローカルな値をセットしま す。これはソースコードのコメントがどのように区切られるかを決定します (*note Comments::を参照してください)。 カレントメジャーモードのキーバインディング一覧も含めたドキュメントを 閲覧するには、‘C-h m’ (‘describe-mode’)とタイプします。*note Misc Help::を参照してください。 Fundamentalモード以外のすべてのメジャーモードは、“モードフック(mode hook)”を定義します。これはバッファーでそのモードが有効になるたびに実行さ れる、カスタマイズ可能なLisp関数のリストです。フックに間する詳細は、 *note Hooks::を参照してください。各モードフックはメジャーモード名の後に 名前がつけられます。たとえばFortranモードのモードフックは、 ‘fortran-mode-hook’です。さらに、すべてのテキストベースのメジャーモード は、‘text-mode-hook’を実行し、多くの、プログラミング言語のモード(Emacsと ともに配布されるものを含む) は、その言語モード自身のモードフックの前に、 ‘prog-mode-hook’を実行します(1) 。フック関数は変数‘major-mode’の値を調べ て、どのモードに入ろうとしているか調べることができます。 モードフックは、一般的にマイナーモードを有効にするために使用されます (*note Minor Modes::を参照してください)。たとえば以下の行をinitファイル に記述すると、すべてのテキストベースのメジャーモードでFlyspellマイナーモ ード(*note Spelling::を参照してください)を、Emacs LispモードでEldocマイ ナーモード(*note Lisp Doc::を参照してください)を有効にすることができます : (add-hook 'text-mode-hook 'flyspell-mode) (add-hook 'emacs-lisp-mode-hook 'eldoc-mode) ---------- Footnotes ---------- (1) より具体的には、そのモードは‘prog-mode’から”派生”したモードです (*note (elisp)Derived Modes::を参照)。 23.2 マイナーモード =================== マイナーモードは明確な方法でEmacsの動作を変更する、オプションの編集用モ ードです。メジャーモードとは異なり、いつでも任意の数のマイナーモードを有 効にできます。いくつかのマイナーモードは“バッファーローカル (buffer-local)”で、特定のバッファーにたいしてオン(有効)にして、他のバッ ファーではオフ(無効)に切り替えることができます。それ以外のマイナーモード は“グローバル(global)”で、それが有効な間はEmacsセッションのすべてのバッ ファーで行う、すべての操作に影響します。ほとんどのマイナーモードはデフォ ルトで無効ですが、デフォルトで有効なものもいくつかあります。 ほとんどのバッファーローカルなマイナーモードは、モードラインのメジャ ーモード標識のすぐ後ろに有効であることを示します。たとえばモードラインに ‘Fill’と表示されているとき、それはAuto Fillモードが有効であることを意味 します。*note Mode Line::を参照してください。 メジャーモードと同様に、各マイナーモードは“モードコマンド(mode command)”に関連付けられていて、それはモード名の後ろに‘-mode’を付けた名前 です。たとえばAuto Fillモードのモードコマンドは‘auto-fill-mode’です。し かしメジャーモードのコマンドは、単純にそのモードを有効にするだけですが、 マイナーモードのモードコマンドは、モードを有効または無効にすることができ ます。 • ‘M-x’を通じて、またはバインドしたキー(*note Key Bindings::を参照し てください)をタイプすることにより、モードコマンドをプレフィクスキー なしで直接呼び出すと、それはマイナーモードを“切り替え(toggles)”ます 。つまり、マイナーモードがオフのときはオンに、オンのときはオフに切 り替えます。 • プレフィクス引数を指定してモードコマンドを呼び出すと、引数が0または 負のときは無条件にマイナーモードをオフにし、それ以外のときは無条件 にオンに切り替えます。 • Lispからモードコマンドが呼び出された場合、引数が省略されているか ‘nil’のとき、マイナーモードは無条件にオンになります。これはメジャー モードのモードフックからマイナーモードをオンに切り替えるのを簡単に します(*note Major Modes::を参照してください)。非‘nil’の引数は、上 で説明したインタラクティブなプレフィクス引数と同様に処理されます。 ほとんどのマイナーモードは、モードコマンドと同じ名前の“モード変数 (mode variable)”をもっています。変数の値が非‘nil’のときはモードが有効で 、‘nil’なら無効です。一般的に、Lispから直接モード変数を変更して、モード を有効または無効にするべきではありません。かわりにモードコマンドを使うべ きです。しかしCustomizeインターフェース(*note Easy Customization::を参照 してください)を通じてのノード変数のセットは、Customizeが自動的にモードコ マンドを実行するので、常に正しくモードを有効または無効にします。 以下にいくつかのバッファーローカルなマイナーモードのリストを示します: • Abbrevモードは、事前に定義された省略形(abbreviation)の定義にもとづ いて、テキストを自動的に展開します。*note Abbrevs::を参照してくださ い。 • Auto Fillモードは、行が長くなりすぎるのを防ぐため、タイプされた文字 にしたがって改行を挿入します。*note Filling::を参照してください。 • Auto Saveモードはバッファー内容を定期的に保存して、クラッシュした場 合等に失われる作業量を減らします。*note Auto Save::を参照してくださ い。 • Electric Quoteモードは、クォーテーションマークを自動的に変換します 。たとえば、`like this'とタイプするとこれは、‘like this’のように再 クォートされます。どうのような種類のテキストを処理するかを制御でき ます。また特定のバッファーにたいしてこれを完全に無効にできます。 *note Quotation Marks::を参照してください。 • Enrichedモードは、書式つきのテキストの編集と保存を可能にします。 *note Enriched Text::を参照してください。 • Flyspellモードは、自動的に間違ったスペルの単語をハイライトします。 *note Spelling::を参照してください。 • Font-Lockモードは、プログラム内で見つかった特定のテキスト単位を自動 的にハイライトします。このモードはデフォルトでグローバルに有効にな っていますが、個別のバッファーで無効にすることができます。*note Faces::を参照してください。 • Display Line Numbersモードは‘display-line-numbers’の便利なラッパー であり、‘display-line-numbers-type’の値を使用してセッティングします 。*note Display Custom::を参照してください。 • Outline minorモードは、Outlineモードと呼ばれるメジャーモードと同様 な機能を提供します。*note Outline Mode::を参照してください。 • Overwriteモードは、通常のプリント文字の挿入により、後の文字をずらす かわりに、既存のテキストを置き換えます。たとえば、ポイントが ‘FOOBAR’の‘B’の前にある場合、‘G’をタイプすると通常は‘FOOGBAR’となり ますが、Overwriteモードでは‘FOOGAR’になります。Overwriteモードでは 、コマンド‘C-q’は次の文字が何であれ、たとえそれが数字であってもその 文字を挿入します — これにより既存のテキストを置き換える代わりに文字 を挿入する方法が与えられます。モードコマンド‘overwrite-mode’は、 キーにバインドされています。 • Binary Overwriteモードは、バイナリーファイルを編集するための、 Overwriteモードの変種です。このモードは改行とタブを他の文字と同じよ うに扱うので、他の文字を上書きしたり、他の文字で上書きさせたりする ことができます。Binary Overwriteモードでは‘C-q’の後の数字は、通常ど おり8進文字コードを指定します。 • Visual Lineモードは、 単語単位の折り返し(word wrapping)を処理します 。これにより長い行は単語境界で折り返されます。*note Visual Line Mode::を参照してください。 以下に便利なグローバルマイナーモードをいくつか示します: • Column Numberモードは、現在の列番号をモードラインに表示します。 *note Mode Line::を参照してください。 • Delete Selectionモードでは、リージョンがアクティブの場合、最初にリ ージョンのテキストを削除してからテキストを挿入します。*note Using Region::を参照してください。 • Icompleteモードは、ミニバッファーで補完がアクティブのとき、利用可能 な候補を表示します。*note Icomplete::を参照してください。 • Line Numberモードは、現在の行番号をモードラインに表示します。このモ ードはデフォルトで有効です。*note Mode Line::を参照してください。 • Menu Barモードは、各フレームにメニューバーを表示します。このモード はデフォルトで有効です。*note Menu Bars::を参照してください。 • Scroll Barモードは、各ウィンドウにスクロールバーを表示します。この モードはデフォルトで有効ですが、スクロールバーが表示されるのはグラ フィカルな端末だけです。*note Scroll Bars::を参照してください。 • Tool Barモードは、各フレームにツールバーを表示します。このモードは デフォルトで有効ですが、ツールバーが表示されるのはグラフィカルな端 末だけです。*note Tool Bars::を参照してください。 • Transient Markモードはリージョンをハイライトして、マークがアクティ ブなときはEmacsの多くのコマンドがリージョンにたいして操作を行うよう になります。このモードはデフォルトで有効です。*note Mark::を参照し てください。 23.3 ファイルのモードを選択する =============================== ファイルをvisitしたとき、Emacsは自動的にメジャーモードを選択します。これ は通常、ファイル名にもとづいて選択されます—たとえば名前が‘.c’で終わるフ ァイルは通常、Cモードで編集されます — が、ファイル内の特別なテキストにも とづいてメジャーモードが選択されるときもあります。この特別なテキストは、 バッファーローカルなマイナーモードを有効にするためにも使用されます。 以下は、これの正確な手順です: 最初にEmacsは、ファイルにファイルローカル(file-local)なモード変数が含 まれているかチェックします。*note File Variables::を参照してください。メ ジャーモードを指定するファイルローカル変数が存在する場合、Emacsは他の条 件をすべて無視してそのメジャーモードを使用します。ファイルローカル変数を 使用してメジャーモードを指定する方法はいくつかあります。一番単純なのは、 空行でない最初の行に、そのモードの名前と、モード名の前後に‘-*-’を記述す る方法です。他のテキストがその行にあっても問題はありません。たとえば、 ; -*-Lisp-*- これはEmacsにLispモードを使用するよう指示します。Lispがこの行をコメント として扱うように、セミコロンがどのように使われているか注意してください。 以下のように書くこともできます ; -*- mode: Lisp;-*- ファイルローカル変数を使用して、バッファーローカルなマイナーモードを指定 することもできます。これは‘eval’指定を使用して行います。たとえば、空行で ない最初の行に以下を記述すると、これはバッファーをLispモードにして、 Auto-Fillモードを有効にします。 ; -*- mode: Lisp; eval: (auto-fill-mode 1); -*- しかし、ほとんどのマイナーモードはユーザー個人の好みが表れるものなので、 この方法でマイナーモードを有効にするのは、通常は不適切です。特定のファイ ルタイプにたいしてマイナーモードを個人的に使用したい場合は、メジャーモー ドフックを通じてマイナーモードを有効にするのが、より良い方法です。 2番目に、メジャーモードを指定するファイル変数が存在しない場合、 Emacsは最初の行が‘#!’で開始されていないかチェックします。もし該当したら 、それはそのファイルがファイルの最初の行に記述された名前のインタープリタ ーを実行する(ファイルの残りはインタープリターへの入力として使用されます )ことにより機能する、実行可能なシェルコマンドであることを示します。した がってEmacsはインタープリター名を使って、モードの選択を試みます。たとえ ば、‘#!/usr/bin/perl’で始まるファイルは、Perlモードで開かれます。変数 ‘interpreter-mode-alist’は、インタープリター名とメジャーモードの対応を指 定します。 最初の行が‘#!’で開始されている場合、最初の行で‘-*-’の機能は通常は使用 できません。なぜならインタープリターを実行するときにシステムが混乱するか らです。そのため、Emacsはそのようなファイルにたいしては、1行目と同じよう に2行目の‘-*-’を探します。これはマジック文字列‘'\"’で開始されるman pageで 、troffプリプロセッサーのリストを指定することと同じです。 3番目に、Emacsは変数‘magic-mode-alist’にもとづいて、バッファーの先頭 のテキストを調べて、メジャーモードの決定を試みます。デフォルトではこの変 数は‘nil’(空のリスト)なので、Emacsはこのステップをスキップしますが、 initファイルでこれをカスタマイズできます(*note Init File::を参照してくだ さい)。変数の値には、以下の形式のリスト要素を指定します (REGEXP . MODE-FUNCTION) ここでREGEXPは正規表現(*note Regexps::を参照してください)で、 MODE-FUNCTIONはメジャーモード関数です。ファイルの先頭のテキストが REGEXPにマッチした場合、EmacsはMODE-FUNCTIONで指定したメジャーモードを選 択します。 ‘magic-mode-alist’の要素は、以下の形式でも指定できます (MATCH-FUNCTION . MODE-FUNCTION) ここでMATCH-FUNCTIONは、バッファーの先頭で呼び出されるLisp関数です。この 関数が非‘nil’を返した場合、EmacsはメジャーモードをMODE-FUNCTIONにセット します。 4番目に —Emacsが適正なメジャーモードをまだ見つけていない場合 — 今度は ファイル名を調べます。ファイル名とメジャーモードの対応付けは、変数 ‘auto-mode-alist’で制御されます。この変数の値は、各要素が以下の形式のリ ストです。 (REGEXP . MODE-FUNCTION) または以下の形式です (REGEXP MODE-FUNCTION FLAG) たとえば、通常見られるようなリストの要素は、‘("\\.c\\'" . c-mode)’のよう な形式で、これは名前が‘.c’で終わるファイルにたいして、Cモードを選択する 役目を負っています(正規表現で‘.’がもつ特別な意味を打ち消すために、文字列 に‘\’を含めなければなりません。これはLisp構文では‘\\’と記述する必要があ ります)。要素が‘(REGEXP MODE-FUNCTION FLAG)’の形式をもち、FLAGが非 ‘nil’の場合、EmacsはMODE-FUNCTIONを呼び出した後、EmacsはREGEXPとマッチし た接尾辞を捨てて、ほかのマッチを検索します。 GNU/Linuxおよび、ファイル名の大文字小文字を区別する他のシステムでは、 Emacsは‘auto-mode-alist’の検索で大文字小文字を区別します。この検索が失敗 すると、2回目は大文字小文字を区別せずにalistを再検索します。2回目の検索 を行わないようにするには、変数‘auto-mode-case-fold’を‘nil’に変更します。 Microsoft Windowsのような、ファイル名の大文字小文字を区別しないシステム では、Emacsは大文字小文字を区別しないで‘auto-mode-alist’を検索します。 最後に、Emacsが_まだ_使用するメジャーモードを見つけられない場合、 Emacsはバッファーの先頭のテキストと、変数‘magic-fallback-mode-alist’を比 較します。この変数は上述した‘magic-mode-alist’と同じように機能しますが、 ‘auto-mode-alist’の_後_に調べられるという点が異なります。デフォルトでは ‘magic-fallback-mode-alist’にはイメージファイル、HTML/XML/SGMLファイル、 PostScriptファイル、およびUnixスタイルのConfファイルをチェックする形式が 含まれています。 バッファーのメジャーモードを変更したとき、‘M-x normal-mode’とタイプす ると、Emacsが自動的に選択するメジャーモードに戻ることができます。この関 数は‘find-file’がメジャーモードを選択するために呼び出す関数と同じです。 この関数は、(もしあれば)ファイルの‘-*-’ 行およびローカル変数リストも処理 します。*note File Variables::を参照してください。 コマンド‘C-x C-w’および‘set-visited-file-name’は、新しいファイル名が 何らかのモードに関係がある場合は、新しいメジャーコードに変更します(その バッファーがファイルをvisitしていない場合、‘C-x C-s’も同じことを行います )。しかしバッファーの内容がメジャーモードを指定していて、ある種の特別な メジャーモードはモードの変更を許しません。このモード変更機能をオフにする には、‘change-major-mode-with-file-name’を‘nil’にセットして下さい。 24 インデント ************* “インデント(Indentation)”とは、“空白文字”(スペースやタブ文字)を行のテキ ストの先頭に挿入したり調整することを指します。このチャプターでは、インデ ントコマンドと、Textモードやそれに関連するモード、同様にプログラミング言 語のモードでの一般的なオプションを記します。プログラミング用のモードでの インデントに関する追加のドキュメントは、*note Program Indent::を参照して ください。 インデントを行うもっとも簡単な方法は、キーです。ほとんどのメジャ ーモードでは、これによりコマンド‘indent-for-tab-command’が実行されます (Cおよびそれに関連するモードでは、は同じように振る舞うコマンド ‘c-indent-line-or-region’を実行する。*note C Indent::を参照されたい)。 空白文字を挿入、またはモードに適した方法でカレント行をインデントし ます(‘indent-for-tab-command’)。リージョンがアクティブのときは、リ ージョンのすべての行をインデントします。 の正確な動作は、メジャーモードに依存します。Textモードおよびそれ に関連するモードでは、は通常、空白とタブ文字を組み合わせたものを挿 入して、ポイントを次のタブストップに進めます。このために、先行する行の最 初の空白以外の文字の位置は、追加のタブストップとして扱われるので、 を使って先行する行にポイントを揃えることができます。リージョンがア クティブ(*note Using Region::を参照してください)な場合、は特別な動 作をします。これはリージョンの各行をインデントするので、各行の最初の空白 以外の文字は、先行する行に揃えられます。 プログラミング関連のモードでは、はコードのカレント行にたいして、 前の行のコードの意味を理解してインデントします。リージョンがアクティブな 場合、リージョンのすべての行はこの方法でインデントされます。ポイントが最 初にカレント行のインデント領域にあった場合、その行の最初の空白以外の文字 に再配置されます。 単にタブ文字をバッファーに挿入したいときは、‘C-q ’とタイプします (*note Inserting Text::を参照してください)。 24.1 インデントコマンド ======================= ‘’ (‘indent-for-tab-command’)コマンドとは別に、Emacsは他の方法でイ ンデントを処理する、さまざまなコマンドを提供します。 ‘C-M-o’ カレント行をポイント位置で分割します(‘split-line’)。その行のポイン トの後にあるテキストは新しい行となり、ポイントがあった位置と同じ列 にインデントされます。このコマンドは、最初にポイントを複数のスペー スまたはタブを飛び越えて移動させます。その後、ポイントは挿入された 行の前に配されます。 ‘M-m’ カレント行の最初の空白以外の文字に移動(前方または後方)します (‘back-to-indentation’)。その行に空白文字しかない場合は、その行の行 末に移動します。 ‘M-i’ ポイント位置の空白文字を次のタブストップまでインデントします (‘tab-to-tab-stop’)。*note Tab Stops::を参照してください。 ‘M-x indent-relative’ ポイントが前の行(実際には最後の空行以外の行)の、最初の空白以外の文 字に揃うように、ポイント位置に空白文字を挿入します。ポイントがすで にその位置より右にある場合は、かわりに‘tab-to-tab-stop’を実行します — ただし数引数を指定した場合は何もしません。 ‘M-^’ 前の行とカレント行をマージします(‘delete-indentation’)。このコマン ドはカレント行の前にある任意のインデントと、行の境界を1つのスペース で置き換えて、2つの行を明解に結合(join)します。 特別なケースとして、結合された文字が連続する開きカッコまたは閉じカ ッコの場合、または他の改行が続く場合、1つのスペースは省略されます (Lispコードにたいして有用)。 fillプレフィクスが存在して、それが改行の後ろにあった場合、‘M-^’は fillプレフィクスを削除します。*note Fill Prefix::を参照してください 。 ‘C-M-\’ リージョンのすべての行にたいして、各行の先頭で‘’をタイプしたか のようにインデントします(‘indent-region’)。 数引数が与えられた場合、その列番号までリージョンのすべての行をイン デントします。 ‘C-x ’ このコマンドは、リージョン内で開始されるすべての行のインデントを変 更するのに使用されます。インデントの変更は、影響を受ける行を厳格な (rigid)単位として移動することにより行われます。 引数を指定しないで呼び出されたとき、このコマンドは影響を受ける行の インデントを対話的に調整するために、transientモードをアクティブにし ます。transientモードがアクティブの間は、‘’または‘’に より、スペース1文字単位で左または右にインデントします。‘S-’ま たは‘S-’とタイプすることにより、タブストップ単位で左または右 にインデントすることもできます。他のキーをタイプするとtransientモー ドは無効になり、通常の編集を再開します。 プレフィクス引数Nを指定して呼び出すと、このコマンドは行をN個のスペ ースでインデントします(transientモードは有効になりません)。Nに値を 与えると後方にインデントするので、リージョン内の行のすべてのインデ ントを除去したいときは、以下のように充分に大きい負の引数を与えます 。 C-u -999 C-x 24.2 タブストップ ================= Emacsは、特定の列番号が“タブストップ”になるよう定義しています。これらは Textモードおよびそれに関連するモードで、および‘M-i’のようなコマンド により、空白文字が挿入されるときのストップポイントとして使用されます。変 数‘tab-stop-list’は、これらの位置を制御します。デフォルト値は‘nil’で、こ れはタブストップが8列ごとという意味です。値には、タブストップの列番号を 、0基準の列番号のリスト(昇順)で指定することもできます。Emacsは最後の要素 と、その1つ前の要素の差分を繰り返すことにより、リストを無限に拡張します 。 変数‘tab-stop-list’を直接カスタマイズするかわりに、コマンド‘M-x edit-tab-stops’を通じて、タブストップを視認しながらセットする便利な方法 があります。このコマンドは、以下のようなタブストップの説明を含んだバッフ ァーに切り替えます。 : : : : : : 0 1 2 3 4 0123456789012345678901234567890123456789012345678 To install changes, type C-c C-c 最初の行は各タブストップ位置にコロンを示します。その後の2行はコロンが示 す位置を表示します。‘tab-stop-list’の値が‘nil’(デフォルト)の場合、最初は コロンが表示されません。 異なるタブストップを置きたい列に、コロンを配して指定するために、この バッファーを編集できます。このバッファーはOverwriteモードを使用します (*note Minor Modes::を参照してください)。Emacsは、最後に明示した2つのス トップの差分を繰り返すことにより、タブストップのリストを無限に拡張するこ とを思い出してください。編集が終わったら、新しいタブストップを有効にする ために、‘C-c C-c’とタイプします。通常、新しいタブストップのセッティング は、すべてのバッファーに適用されます。しかし‘M-x edit-tab-stops’を呼び出 したバッファーにたいして、ローカルな変数‘tab-stop-list’を作成していた場 合(*note Locals::を参照してください)、新しいタブストップのセッティングは 、そのバッファーだけに適用されます。将来のEmacsセッションのためにタブス トップのセッティングを保存するには、Customizeインターフェースを使用して ‘tab-stop-list’の値を保存します(*note Easy Customization::を参照してくだ さい)。 このセクションで議論したタブストップは、バッファーでタブ文字が表示さ れる方法には影響しないことに注意してください。タブ文字は常に次の“タブス トップ表示(display tab stop)”まで拡張される、空のスペースとして表示され ます。*note Text Display::を参照してください。 24.3 タブ vs. スペース ====================== インデントコマンドは通常、最小になるような一連のタブ文字とスペースを挿入 (または削除)することにより、望む列に行を揃えます。タブ文字は次の“タブス トップ表示(display tab stop)”まで伸長された、空のスペースとして表示され ます。デフォルトでは、‘tab-width’列ごと(デフォルトは8)に、1つのタブスト ップ表示があります。*note Text Display::を参照してください。 もし望むなら、すべてのインデントをスペースだけで行うこともできます。 これを要求するには、バッファーローカルな変数‘indent-tabs-mode’を‘nil’に セットします。バッファーローカルな変数についての情報は、*note Locals::を 参照してください。しかし‘C-q ’は、‘indent-tabs-mode’の値とは無関係 に、常にタブ文字を挿入することに注意してください。 ‘indent-tabs-mode’を‘nil’にセットする1つの理由は、すべてのエディター がタブ文字を同じ方法で表示するわけではないという理由です。Emacsユーザー も同様で、彼らはカスタマイズされた‘tab-width’により、異なる値をもつかも しれません。スペースだけを使うことにより、ファイルが常に同じように見える ことを保証できます。Emacsでどのように見えるかだけに関心がある場合、この 問題に取り組む他の方法は、ファイルローカルな変数‘tab-width’をセットする 方法です(*note File Variables::を参照してください)。 空白以外の文字の列を常に保ちながら、スペースをタブに、またはその逆の 変換を行うコマンドも存在します。‘M-x tabify’は、リージョンの連続するスペ ースをスキャンして、インデントを変更せずに、少なくとも2文字の連続するス ペースをタブに変換します。‘M-x untabify’は、リージョンのすべてのタブを適 正な数のスペースに変更します。 24.4 インデントの便利な機能 =========================== 変数‘tab-always-indent’は、 (‘indent-for-tab-command’)コマンドの動 作を微調整します。デフォルト値は‘t’で、これは*note Indentation::で説明し た動作を与えます。値をシンボル‘complete’に変更すると、は最初にカレ ント行のインデントを試みます、すでにその行がインデントされている場合、こ のコマンドはポイント位置のテキストの補完を試みます(*note Symbol Completion::を参照してください)。値が‘nil’の場合、はポイントが行の 左端かインデント位置にあるときだけインデントを行い、それ以外はタブ文字を 挿入します。 Electric Indentモードはグローバルなマイナーモードで、これはをタ イプしたあと自動的にインデントを行います。このモードはデフォルトで有効で す。このマイナーモードを切り替えるには、‘M-x electric-indent-mode’とタイ プします。1つのバッファーにたいしてモードを切り替えるには、‘M-x electric-indent-local-mode’を使用してください。 25 人間の言語のためのコマンド ***************************** このチャプターでは“テキスト(text)” — 人間の言語(対照的なものとしてコンピ ューターのプログラム言語があります)における、文字シーケンスという意味 — にたいして動作する、Emacsコマンドを説明します。これらコマンドは、人間の 言語の構文および文体の規則に配慮した方法で動作します。単語、センテンス (文)、パラグラフ(段落)、大文字に関する規則があります。“フィル(filling)” — パラグラフの行をおおよそ同じ長さに再配置するという意味 — を行うコマン ドもあります。これらのコマンドは主にテキストの編集を意図しており、プログ ラムの編集にも便利なときがあります。 Emacsには、人間言語のテキストを編集するためのメジャーモードがいくつか あります。ファイルが普通のテキストを含む場合は、Textモードを使います。こ れはEmacsを、テキストの構文規則にたいして少しカスタマイズしたものです。 Outlineモードは。アウトライン構造でテキストを操作する特別なコマンドを提 供します。*note Outline Mode::を参照してください。 Orgモードは、Outlineモードを拡張してEmacsを本格的なオーガナイザーに変 えます。これによりTODOリストを管理したり、ノートを保存して、それを多くの フォーマットで公開することができます。 *note The Org Manual: (org)Top.を 参照してください。 EmacsにはTeXやLaTeX (*note TeX Mode::を参照してください)、HTMLやSGML (*note HTML Mode::を参照してください)、XML (*note The nXML Mode Manual: (nxml-mode)Top.を参照してください)、 GroffやNroff (*note Nroff Mode::を 参照してください)のような、コマンドが埋め込まれたテキストのための、他の メジャーモードがあります。 テキスト文字で作られたAA(ASCII art)のピクチャーを編集する必要がある場 合は、そのような絵を編集するための特別なメジャーモードのPictureモードを 使用します *note Picture Mode::を参照してください。 テキストを記述するときは、自動タイピングの機能が便利でしょう。*note The Autotype Manual: (autotype)Top.を参照してください。 25.1 単語 ========= Emacsは、単語単位で移動するコマンドをいくつか定義しています: ‘M-f’ 1単語前方に移動します(‘forward-word’)。 ‘M-b’ 1単語後方に移動します(‘backward-word’)。 ‘M-d’ 単語の最後までkillします(‘kill-word’)。 ‘M-’ 単語の先頭までkillします(‘backward-kill-word’)。 ‘M-@’ 次の単語の最後にマークをセットします(‘mark-word’)。 ‘M-t’ 2つの単語を入れ替える、または他の単語を飛び越えて単語をドラッグしま す(‘transpose-words’)。 これらのキーは文字単位のコマンド‘C-f’、‘C-b’、‘C-d’、、‘C-t’に類 似していることに注目してください。‘M-@’は‘C-@’(これは‘C-’の別名です )が由来です。 コマンド‘M-f’ (‘forward-word’)および‘M-b’ (‘backward-word’)は、単語単 位で前方または後方に移動します。これらのベースのキーシーケンスは、 1文字単位で移動するキーシーケンス‘C-f’および‘C-b’に類似しています。類似 点は数引数にも拡張されます。これらは繰り返し回数を指定します。‘M-f’に負 の引数を与えると後方に移動し、‘M-b’に負の引数を与えると前方に移動します 。前方への移動は単語の最後の文字の直後で停止し、後方への移動は、最初の文 字の直前で停止します。 ‘M-d’ (‘kill-word’)は、ポイントの後ろの単語をkillします。正確に言うと 、ポイントから、‘M-f’で移動する位置までのすべてをkillします。したがって ポイントが単語の途中にある場合、‘M-d’はポイントの後だけをkillします。ポ イントと次の単語の間に区切り文字がある場合、それは単語と一緒にkillされま す(次の単語だけをkillして、その前にある区切り文字はkillしたくないときは 、‘M-f’で最後まで移動して、‘M-’で単語を後方にkillします)。‘M-d’は ‘M-f’と同様の引数を取ります。 ‘M-’ (‘backward-kill-word’)は、ポイントの前の単語をkillします。 これはポイントから、‘M-b’で移動する位置までのすべてをkillします。たとえ ばポイントが‘FOO, BAR’のスペースの後ろにある場合、これは‘FOO, ’をkillし ます。‘FOO’だけをkillして、カンマとスペースは残したい場合は、‘M-’の かわりに‘M-b M-d’を使用します。 ‘M-t’ (‘transpose-words’)は、ポイントの前またはポイントを含む単語を、 次の単語と交換します。単語間の区切り文字は移動されません。たとえば ‘FOO, BAR’は、‘BAR FOO,’ではなく、‘BAR, FOO’に入れ替えられます。入れ替え については、*note Transpose::を参照してください。 リージョンにたいして操作を行う際、単語単位で操作したいときは、コマン ド‘M-@’ (‘mark-word’)を使用します。このコマンドは‘M-f’で移動する位置にマ ークをセットします。このコマンドにつての詳しい詳細は、*note Marking Objects::を参照してください。 単語にたいするコマンドが理解する単語境界は、構文テーブル(syntax table)で制御されます。単語の区切り文字に、(たとえば)任意の文字を使うこと ができます。*note Syntax Tables: (elisp)Syntax Tables.を参照してください 。 以上に加えて、リージョンまたはバッファーに含まれる単語数のカウントと リポートを行う‘M-=’ (‘count-words-region’)および‘M-x count-words’コマン ドについては、*note Position Info::を参照してください。 25.2 センテンス =============== センテンス(文)とパラグラフ(段落)を操作するEmacsコマンドは、単語を処理す るコマンドと同様、ほとんどがMetaキーに割り当てられています。 ‘M-a’ センテンスの先頭に、後方へ移動します(‘backward-sentence’)。 ‘M-e’ センテンスの最後に、前方へ移動します(‘forward-sentence’)。 ‘M-k’ センテンスの最後まで、前方にkillします(‘kill-sentence’)。 ‘C-x ’ センテンスの最初まで、後方にkillします(‘backward-kill-sentence’)。 コマンド‘M-a’ (‘backward-sentence’)および‘M-e’ (‘forward-sentence’)は 、センテンスの先頭または最後に移動します。これらのコマンドのバインディン グは、行の先頭と最後に移動する‘C-a’と‘C-e’に似せて選ばれました。似ていな い点は、‘M-a’または‘M-e’を繰り返すと、センテンス単位で連続して移動するこ とです。 センテンスにたいして後方に移動すると、ポイントはセンテンスの最初の文 字の直前に移動します。前方に移動したときは、センテンスを終了させる区切り 文字の直後に移動します。どちらもセンテンスの境界にある空白文字にポイント を移動することはありません。 ‘C-a’と‘C-e’がkillコマンド‘C-k’をもつように、‘M-a’と‘M-e’にも対応する killコマンドがあります。‘M-k’ (‘kill-sentence’)は、ポイントからセンテン スの最後までをkillします。正の数引数Nを指定すると、次のNセンテンスを killします。負の数引数−Nを指定すると、後方にN番目のセンテンスの先頭まで をkillします。 ‘C-x ’ (‘backward-kill-sentence’)は、センテンスの先頭までを後方 にkillします。 センテンスのコマンドは、センテンスの最後に2つのスペースを置くという Americanのタイピストの慣習に、ユーザーが従うと仮定します。つまりセンテン スの最後は‘.’、‘?’、‘!’の後ろに改行または2つのスペースがあると仮定し、そ の間に任意の個数の‘)’、‘]’、‘'’、‘"’が許されます。パラグラフの先頭および 最後は、センテンスの先頭および最後でもあります。この慣習にしたがうことに より、Emacsのセンテンスにたいするコマンドがセンテンスの最後のピリオドと 、省略形を示すピリオドを区別できるので便利になります。 センテンスの間を1つのスペースにしたい場合は、 ‘sentence-end-double-space’を‘nil’にセットすることにより、センテンスのコ マンドが1つのスペースで止まるようになります。しかし、これにはセンテンス の終わりのピリオドと、省略形を示すピリオドを区別できなくなるという欠点が あります。したがって便利で信頼できる編集のために、2つのスペースの慣習に したがうことを推奨します。変数‘sentence-end-double-space’はフィルにも影 響します(*note Fill Commands::を参照してください)。 変数‘sentence-end’は、センテンスの終了を認識する方法を制御します。非 ‘nil’の場合、その値は正規表現にすべきで、それはセンテンスの最後の数文字 (センテンスの後ろのスペースも含む)とのマッチに使用されます。値が‘nil’(デ フォルト)の場合、Emacsは‘sentence-end-double-space’の値のような、変数条 件に照らしてセンテンスの最後を計算します。 Thaiのようないくつかの言語は、センテンスの最後を示すのにピリオドを使 用しません。そのような場合は変数‘sentence-end-without-period’に‘t’をセッ トします。 25.3 パラグラフ =============== パラグラフ(段落)を操作するEmacsコマンドもMetaキーに割り当てられています 。 ‘M-{’ 前のパラグラフの先頭に、後方へ移動します(‘backward-paragraph’)。 ‘M-}’ 次のパラグラフの最後に、前方へ移動します(‘forward-paragraph’)。 ‘M-h’ そのパラグラフ、または次のパラグラフの周囲にポイントとマークを配し ます(‘mark-paragraph’)。 ‘M-{’ (‘backward-paragraph’)は、カレントのパラグラフ、または前のパラ グラフの先頭に移動します(呼び出し時にポイントがある場所に依存する。パラ グラフの定義は以下を参照)。同様に、‘M-}’ (‘forward-paragraph’)は、カレン トのパラグラフ、または次のパラグラフの最後に移動します。パラグラフの前に 空行がある場合、‘M-{’はその空行に移動します。 パラグラフにたいして操作をしたい場合、‘M-h’ (‘mark-paragraph’)とタイ プすることにより、パラグラフの周囲にリージョンがセットされます。たとえば ‘M-h C-w’は、パラグラフの周囲またはポイントの後ろをkillします。‘M-h’は、 ポイント位置のパラグラフの先頭にポイントを、最後にマークを配します。ポイ ントがパラグラフの間(連続する空行の中、または境界)にある場合、‘M-h’はポ イントの後ろに続くパラグラフの周囲にリージョンをセットします。パラグラフ の最初の行の前に空行がある場合、その空行はリージョンに含まれます。 リー ジョンがすでにアクティブの場合、このコマンドはポイントを変更せずにマーク をセットします。連続する‘M-h’は、マークをパラグラフ単位で先にセットしま す。 パラグラフの定義はメジャーモードに依存します。Fundamentalモード、同様 にTextモードとそれに関連するモードでは、パラグラフと、その隣接するパラグ ラフを分けるのは1行以上の“空行” — 空の行、スペースとタブだけからなる行 、およびそれらに改ページ文字がついた行 — です。プログラミング言語に関す るモードでは、通常パラグラフは同じような方法で定義されるので、パラグラフ がないプログラムなどにたいしても、パラグラフのコマンドを使うことができま す。 Textモードでは、インデントされた行自体では、パラグラフの区切りには_な らない_ことに注意してください。インデントされた行をパラグラフの分割に使 用したい場合は、かわりにParagraph-Indent Textモードを使用します。*note Text Mode::を参照してください。 フィルプレフィクスをセットしている場合、フィルプレフィクスで始まって いないすべての行は、パラグラフの区切りとなります。*note Filling::を参照 してください。 パラグラフ境界の正確な定義は、変数‘paragraph-separate’および ‘paragraph-start’により制御されます。‘paragraph-start’の値には、パラグラ フを開始または分割する行にマッチする正規表現を指定します。 ‘paragraph-separate’の値には、パラグラフの一部とならないような、パラグラ フを分割する行にマッチする正規表現を指定します。新しいパラグラフを開始す るパラグラフに含まれる行は、‘paragraph-start’にはマッチしますが、 ‘paragraph-separate’にはマッチしません。たとえばFundamentalモードでは、 ‘paragraph-start’は‘"\f\\|[ \t]*$"’、‘paragraph-separate’は ‘"[ \t\f]*$"’です。 ‘paragraph-start’と‘paragraph-separate’はテキストの左マージンにマッチ しますが、行頭である必要はないので、パラグラフ関数がマージンのセッティン グに応じてテキストリージョン内で同じように確実に機能させるために、これら のregexpに‘^’を使用するべきでないことに注意してください。 25.4 ページ =========== “改ページ文字”(formfeed character: ASCIIコード12で、‘control-L’とも表示 されます)でページに分割されているものがあり、Emacsではそれらがエスケープ シーケンス‘^L’で表示されます(*note Text Display::を参照してください)。伝 統的には、そのようなテキストファイルのハードコピーを印刷する場合、各改ペ ージ文字で改ページされます。ほとんどのEmacsコマンドは、この文字をほかの 文字と同様に扱うので、‘C-q C-l’で挿入して、で削除などができます。そ れに加えて、Emacsはページ単位の移動や操作を行うコマンドを提供します。 ‘M-x what-page’ ポイント位置のページ番号と、ページ内での行番号を表示します。 ‘C-x [’ 前のページ境界にポイントを移動します(‘backward-page’)。 ‘C-x ]’ 次のページ境界にポイントを移動します(‘forward-page’)。 ‘C-x C-p’ 現在のページ(または他のページ)の周囲に、ポイントとマークを配します (‘mark-page’)。 ‘C-x l’ 現在のページの行数を数えます(‘count-lines-page’)。 ‘M-x what-page’は、ファイルの先頭から数えたページ数と、そのページの行 数をエコーエリアに表示します。 ‘C-x [’ (‘backward-page’)コマンドは、前のページ区切りの直後にポイント を移動します。ポイントがすでにページ区切りの直後にある場合は、そのページ 区切りをスキップして、その前のページ区切りに移動します。数引数は繰り返し 回数を指定します。‘C-x ]’ (‘forward-page’)コマンドは、次のページ区切りに 前方に移動します。 ‘C-x C-p’ (‘mark-page’)コマンドは、ポイントを現在のページの先頭(ペー ジの先頭に隣接するページ区切りの後ろ)、マークをページの最後(ページの最後 に隣接するページ区切りの後ろ)に配します。 ‘C-x C-p C-w’は、ページを他の場所に移動するためにkillする便利な方法で す。‘C-x [’または‘C-x ]’で他のページへ移動して、そこにkillされたページを yankすれば、すべてのページは再び適切に区切られます。‘C-x C-p’のリージョ ンに後続のページ区切りだけが含まれるのは、これが期待したよう確実に機能さ せるためです。 ‘C-x C-p’に数引数を指定すると、現在のページから数えて何ページ目に移動 するかを指定します。0は現在のページ、1は次のページ、−1は前のページを意味 します。 ‘C-x l’ (‘count-lines-page’)コマンドは、ページをどこで2つに分割するか の良い指標になります。これは現在のページの全行数と、カレント行の前にある 行数と、後ろにある行数を以下のように表示します。 Page has 96 (72+25) lines 合計が1少ないのに注意してください。これはポイントが行の先頭にない場合は 正しくなります。 変数‘page-delimiter’は、ページがどこで始まるかを制御します。この値に はページを分割する行の先頭にマッチする正規表現を指定します(*note Regexps::を参照してください)。この変数の値は通常‘"^\f"’で、これは行の先 頭の改ページ文字にマッチします。 25.5 クォーテーションマーク =========================== テキストをクォートするための一般的な方法の1つは、typewriter convention(タ イプライター方式)です。これは'like this'のようなstraight apostrophesによ るクォートや、"like this"のようなダブルクォートを使用します。別の一般的 な方法としてはcurved quote convention(曲クォート方式)があります。これは ‘like this’や`̀like thi”のように、左右のシングルクォーテーションマークや ダブルクォーテーションマークを使用します。(1)テキストファイルにおいては 、typewriter quotesはシンプルで可搬性があり、curved quotesはあいまいさが 少なく見栄えもよくなります。 Electric Quoteモードにより、curved quotesをタイプするのが簡単になりま す。オプションでタイプした文字`を‘、'を’、``を“、''を”に変換します。この デフォルトのクォートリストは、変数‘electric-quote-chars’をカスタマイズし て変更できます。値には左シングルクォート、右シングルクォート、左ダブルク ォート、右ダブルクォートに対応する、4つの文字からなるリストを指定します 。デフォルト値は‘'(?‘ ?’ ?“ ?”)’です。 Electric Quoteモードは、このモードをどこでアクティブにするかを制御す る変数を通じて、カスタマイズできます。‘electric-quote-paragraph’が非 ‘nil’の場合、テキストパラグラフ内でアクティブになります。 ‘electric-quote-comment’が非‘nil’の場合、プログラミング言語のコメント内 でアクティブになります。‘electric-quote-string’が非‘nil’の場合、プログラ ミング言語の文字列定数内でアクティブになります。デフォルトでは、 ‘electric-quote-string’が‘nil’で、それ以外の変数が‘t’です。 Electric Quoteモードはデフォルトで無効になっています。これを単一のバ ッファーで切り替えるには‘M-x electric-quote-local-mode’、グローバルに切 り替えるには‘M-x electric-quote-mode’とタイプします。1回だけこれを抑制し たいときは、‘`’や‘'’のかわりに、‘C-q `’と‘C-q '’を使用します。Electric Quoteモードが無効または非アクティブのときにcurved quoteを挿入する場合、 『‘』は‘C-x 8 [’、『’』は‘C-x 8 ]’、『“』は‘C-x 8 {’、『”』は‘C-x 8 }’と タイプします。*note Inserting Text::を参照してください。 ‘electric-quote-chars’の値は、これらのキーバインドには影響を与えないこと に注意してください。これらの値は‘electric-quote-mode’のキーバインドでは なく、‘global-map’のバインドのためのものです。 ---------- Footnotes ---------- (1) curved single quote文字、U+2018 LEFT SINGLE QUOTATION MARKと U+2018 RIGHT SINGLE QUOTATION MARKです。curved double quote文字はU+201C LEFT DOUBLE QUOTATION MARKとU+201D RIGHT DOUBLE QUOTATION MARKです。これ らの文字を表示できないテキスト端末では、Infoリーダーはそれらをtypewriter ASCII quote文字として表示するかもしれません。 25.6 テキストのフィル ===================== テキストを“フィル(fill)”するとは、指定した幅に収まるように行を分割するこ とを意味します。Emacsはフィルを2つの方法で行います。Auto Fillモードでは 、自己挿入文字によるテキストの挿入で、自動的にフィルされます。テキストを 編集するときに使用できる、明示的なフィルコマンドもあります。 25.6.1 Auto Fillモード ---------------------- “Auto Fill”モードは、行が長くなりすぎたとき、スペースの箇所で行を自動的 に分割する、バッファーローカルなマイナーモード(*note Minor Modes::を参照 )です。 ‘M-x auto-fill-mode’ Auto Fillモードを有効または無効にします。 ‘’ ‘’ Auto Fillモード中は、適切なときに行を分割します。 モードコマンド‘M-x auto-fill-mode’は、カレントバッファーのAuto Fillモ ードを切り替えます。他のマイナーモードと同様、正の数引数はAuto Fillモー ドを有効にし、負の引数は無効にします。特定のメジャーモードでAuto Fillモ ードを自動的に有効にするには、モードフックに‘auto-fill-mode’を追加します (*note Major Modes::を参照してください)。Auto Fillモードが有効なときは、 モードラインにモード指標の‘Fill’が表示されます(*note Mode Line::を参照し てください)。 Auto Fillモードは、行が望ましい幅より長くなったとき、空白の位置で自動 的に行を分割します。行の分割は、をタイプしたときだけ発生しま す。行の分割をさせずにスペースまたは改行を挿入したいときは、‘C-q ’ま たは‘C-q C-j’とタイプします。‘C-o’も行の分割を発生させずに改行を挿入しま す。 Auto Fillモードが行を分割するときは、“適応型フィルプレフィクス (adaptive fill prefix)”にしたがうよう試みます。フィルプレフィクスがカレ ントパラグラフの最初の1行目、および/または2行目で推論できる場合、そのフ ィルプレフィクスは新しい行に挿入されます(*note Adaptive Fill::を参照して ください)。そうでない場合、新しい行はその行でをタイプしたかのように インデントされます(*note Indentation::を参照してください)。プログラミン グ言語に関するモードでは、行がコメントの途中で改行された場合、新しいコメ ント区切りが適切に挿入されてコメントが分割されます。 Auto Fillモードはパラグラフ全体を再フィルしません。これは行の分割はし ますが、行のマージはしません。したがって、パラグラフの途中を編集している ときは、適切にフィルされていないパラグラフがあり得ます。これをフィルする には、フィルコマンドを明示的に呼び出してください (*note Fill Commands::を 参照してください)。 25.6.2 明示的なフィルコマンド ----------------------------- ‘M-q’ カレントパラグラフをフィルします(‘fill-paragraph’)。 ‘C-x f’ フィルの列幅をセットします(‘set-fill-column’)。 ‘M-x fill-region’ リージョンの各パラグラフをフィルします(‘fill-region’)。 ‘M-x fill-region-as-paragraph’ リージョンを1つのパラグラフとしてフィルします。 ‘M-o M-s’ 行を中央に揃えます。 コマンド‘M-q’ (‘fill-paragraph’)は、カレントのパラグラフを“フィル”し ます。このコマンドは特定の最大列幅に適合するような方法で、パラグラフの改 行を再配分して、パラグラフの余分なスペースやタブ文字を削除します。 ‘M-q’は通常、ポイントがあるパラグラフに作用しますが、ポイントがパラグ ラフの間にあるときは、ポイントの後ろのパラグラフに作用します。リージョン がアクティブの場合、かわりにリージョンのテキストに作用します。‘M-x fill-region’を呼び出して、リージョンのテキストを明確にフィルすることもで きます。 ‘M-q’および‘fill-region’は、パラグラフの境界を探すために、通常の Emacsの条件式を使用します。より細かく制御するには、ポイントとマークの間 にあるすべてを1つのパラグラフとして再フィルする、‘M-x fill-region-as-paragraph’を使用することができます。このコマンドはリージ ョンの空行を削除するので、分割されたテキストブロックは、1つのブロックに 結合されます。 ‘M-q’に数引数を指定した場合、これはテキストのフィルと同時に“割付 (justify)”も指示します。これは行の右端が正確にフィル列になるように、余分 なスペースが挿入されることを意味します。余分なスペースを削除するには、引 数を指定せずに‘M-q’を使用します(‘fill-region’と同じ)。 フィルのための行の最大幅は、バッファーローカルな変数‘fill-column’によ り指定されます。デフォルト値は70です(*note Locals::を参照してください)。 カレントバッファーの‘fill-column’をセットする一番簡単な方法は、コマンド ‘C-x f’ (‘set-fill-column’)を使用する方法です。数引数を指定すると、それ を新しいフィル列として使用します。‘C-u’だけを指定すると、このコマンドは 現在のポイントの水平位置を‘fill-column’にセットします。 コマンド‘M-o M-s’ (‘center-line’)は、現在のフィル列でカレント行を中央 に揃えます。数引数Nを指定すると、Nを中央に揃えた後、ポイントを先に移動し ます。このバインディングはTextモードのためのもので、利用可能なのはTextモ ードとそれに関連するモードだけです(*note Text Mode::を参照してください )。 デフォルトでは、Emacsは2つのスペースまたは改行が後にあるピリオドを、 センテンスの終わりと判断します。後に1つのスペースしかないピリオドは、セ ンテンスの終わりではなく、省略形を示します。それに合わせて、フィルコマン ドも後に1つのスペースしかないピリオドでは、行を分割しません。変数 ‘sentence-end-double-space’を‘nil’にセットした場合、フィルコマンドは後に 1つのスペースしかないピリオドでも行を分割するようになり、各ピリオドの後 に1つのスペースを配すようになります。他の効果とこの方法の欠点については 、*note Sentences::を参照してください。 変数‘colon-double-space’が非‘nil’の場合、フィルコマンドはコロンの後に 2つのスペースを配します。 行分割を許さない場所の条件を追加で指定するには、アブノーマルフック変 数‘fill-nobreak-predicate’をカスタマイズします(*note Hooks::を参照してく ださい)。このフックの各関数は、Emacsが行を分割すべきと判断する位置で、引 数なしで呼び出されます。関数が非‘nil’値を返した場合、Emacsはその位置で行 を分割しません。このフックに指定できる関数には、 ‘fill-single-word-nobreak-p’(センテンスの最初の単語の後ろ、および最後の 単語の前では分割しません)、‘fill-single-char-nobreak-p’(1文字の単語の後 ろでは分割しません)、‘fill-french-nobreak-p’(‘(’の後ろ、および‘)’、‘:’、 ‘?’の前では分割しません)が含まれます。 25.6.3 フィルプレフィクス ------------------------- “フィルプレフィクス(fill prefix)”機能により、フィルされるパラグラフの各 行が、特別な文字列(インデントされたパラグラフの行頭につける複数のスペー スなど)で開始されるようになります。フィルプレフィクスを明示的に指定する ことができます。明示的に指定しない場合、Emacsは自動的にそれを推測するこ とを試みます(*note Adaptive Fill::を参照してください)。 ‘C-x .’ フィルプレフィクスをセットします(‘set-fill-prefix’)。 ‘M-q’ 現在のフィルプレフィクスで、パラグラフをフィルします (‘fill-paragraph’)。 ‘M-x fill-individual-paragraphs’ リージョンをフィルします。インデントの変化は、新しいパラグラフの開 始と判断されます。 ‘M-x fill-nonuniform-paragraphs’ リージョンをフィルします。パラグラフを分割する行だけを、新しいパラ グラフの開始と判断します。 カレントバッファーのフィルプレフィクスを指定するには、使用したいフィ ルプレフィクスで開始される行に移動して、プレフィクスの最後にポイントを配 し、‘C-x .’ (‘set-fill-prefix’)とタイプします(‘C-x’の後にピリオドです)。 フィルプレフィクスをオフに切り替えるには、ポイントを行の先頭に移動して ‘C-x .’とタイプして、空のフィルプレフィクスを指定します。 フィルプレフィクスの効果がある間、フィルコマンドはフィルを行う前にパ ラグラフの各行のフィルプレフィクスを削除して、フィルを行った後で各行にフ ィルプレフィクスを挿入します(パラグラフの最初の行は変更されずに残ります 。これは他の行と異なるように意図されていることがよくあるからです)。Auto Fillモードは、新しい行を作成するときにフィルプレフィクスの自動的な挿入も 行います(*note Auto Fill::を参照してください)。‘C-o’コマンドは、行の先頭 で使用したときは、新しい行を作成してフィルプレフィクスを挿入します。コマ ンド‘M-^’は逆に、削除する改行の後ろにフィルプレフィクスがあれば、プレフ ィクスを削除します。 たとえば‘fill-column’が50で、フィルプレフィクスが‘;; ’の場合、以下の テキストにたいして‘M-q’を行うと、 ;; This is an ;; example of a paragraph ;; inside a Lisp-style comment. 結果は以下のようになります: ;; This is an example of a paragraph ;; inside a Lisp-style comment. ‘M-q’およびパラグラフのコマンドは、フィルプレフィクスで開始されない行 を、パラグラフの開始と判断します。これは、最初の行を除く各行がインデント されている形式のパラグラフにたいして、良い結果を与えます。空行、またはプ レフィクスが削除されたインデントされた行も、パラグラフを分割または開始し ます。これは各行にコメント区切りがある、複数パラグラフにわたるコメントを 記述するときに望ましいものです。 ‘M-x fill-individual-paragraphs’を使用して、各パラグラフに自動的にフ ィルプレフィクスをセットできます。このコマンドはリージョンをパラグラフに 分割して、インデントの変化を新しいパラグラフの開始として扱い、それらのパ ラグラフをフィルします。したがって1つのパラグラフのすべての行は、同じ量 のインデントをもちます。このインデントは、そのパラグラフにたいするフィル プレフィクスの役目を果たします。 ‘M-x fill-nonuniform-paragraphs’も同様なコマンドですが、別の方法でリ ージョンをパラグラフに分割します。このコマンドは、 (‘paragraph-separate’で定義される)パラグラフ開始行だけを、新しいパラグラ フの開始と判断します。これは1つのパラグラフの各行は異なる量のインデント をもつことを想定しており、パラグラフの中で最小のインデント量をフィルプレ フィクスに使用します。このコマンドは最初の行のインデントが、パラグラフの 他の行より少なくても多くても、良い結果をもたらします。 フィルプレフィクスは、変数‘fill-prefix’に保存されます。変数の値は文字 列で、フィルプレフィクスがないときは‘nil’です。これはバッファーごとの変 数です。変数の変更はカレントバッファーだけに影響しますが、変更できるデフ ォルト値も存在します。*note Locals::を参照してください。 テキストプロパティー‘indentation’は、パラグラフのインデント量を制御す る別の方法を提供します。*note Enriched Indentation::を参照してください。 25.6.4 適応型フィル ------------------- フィルコマンドは、特定なケースでは自動的に適切なフィルプレフィクスを推測 できます。空白文字または特定の区切り文字が行の先頭にあり、それがパラグラ フの全行に適用されている場合です。 パラグラフに2行以上の行がある場合は、2行目からフィルプレフィクスが取 得されますが、それは1行目にもそれが存在する場合だけです。 パラグラフに1行しかない場合、フィルコマンドは、その行からフィルプレフ ィクスを取得する_かも_しれません。この決定は複雑です。なぜならそのような 場合に妥当な、3つの選択肢があるからです。 • 最初の行のプレフィクスを、パラグラフのすべての行に適用します。 • 後続の行を空白文字でインデントします。これにより最初の行のプレフィ クスの下にテキストが並びますが、実際には最初の行からプレフィクスを コピーしません。 • 2行目以降の行に特別なことは行いません。 これら3つの書式スタイルは一般的に使用されているものです。そのためフィ ルコマンドは、そのメジャーモードに出現するプレフィクスにもとづいて、望ま しいスタイルを決定しようと試みます。判断基準は以下のとおりです。 最初の行で見つかったプレフィクスが‘adaptive-fill-first-line-regexp’に マッチするか、それがコメント開始シーケンス(メジャーモードに依存します)の 場合、見つかったプレフィクスをパラグラフのフィルに使用しますが、それは後 続の行でそれらがパラグラフの開始として振る舞わない場合に限られます。 上記以外の場合、見つかったプレフィクスは同じ量のスペースに変換され、 それらのスペースは残りの行のフィルプレフィクスとして使用されますが、それ は後続の行でそれらがパラグラフの開始として振る舞わない場合に限られます。 Textモード、および空行またはページ区切りだけがパラグラフを分割するモ ードでは、適応型フィルにより選択されるプレフィクスは、パラグラフの開始と して振る舞わないので、常にフィルに使用できます。 変数‘adaptive-fill-regexp’は、どのような行開始がフィルプレフィクスの 役目を果たすかを決定します。行がこの正規表現にマッチする文字で開始される とき、プレフィクスとして使用されます。変数‘adaptive-fill-mode’を‘nil’に セットした場合、フィルプレフィクスは自動的に選択されません。 変数‘adaptive-fill-function’に関数をセットすることにより、より複雑な 方法で自動的にフィルプレフィクスを選択する方法を指定できます。この関数は 行の左端の直後のポイントで呼び出され、その行にもとづいた適切なフィルプレ フィクスを返すべきです。この関数が‘nil’を返した場合、 ‘adaptive-fill-regexp’がフィルプレフィクスを見つける機会を与えられます。 25.7 大文字小文字変換コマンド ============================= Emacsには、1つの単語または任意の範囲のテキストを、大文字または小文字に変 換するコマンドがあります。 ‘M-l’ 後続の単語を小文字に変換します(‘downcase-word’)。 ‘M-u’ 後続の単語を大文字に変換します(‘upcase-word’)。 ‘M-c’ 後続の単語の先頭の文字を大文字に変換します(‘capitalize-word’)。 ‘C-x C-l’ リージョンを小文字に変換します(‘downcase-region’)。 ‘C-x C-u’ リージョンを大文字に変換します(‘upcase-region’)。 ‘M-l’ (‘downcase-word’)は、ポイントの後ろの単語を小文字に変換して、そ の先にポイントを移動します。したがって、‘M-l’を繰り返すと、単語を連続し て変換します。‘M-c’ (‘capitalize-word’)は、単語の最初の文字を大文字にし て残りを小文字にしますが、‘M-u’ (‘upcase-word’)はすべての文字を大文字に 変換します。これらのコマンドはすべて、引数を与えると複数の単語を変換しま す。これらのコマンドはすべてが大文字の大きなテキストを、これらが混成され たものに変換するとき、特に有用です、なぜなら適切に‘M-l’、‘M-u’、‘M-c’を 使い分けて単語を変換しながら移動できるからです(変換が不要なときは‘M-f’を 使ってその単語をスキップします)。 負の引数を与えると。ポイントの前の指定した数の単語にたいして、大文字 小文字の変換を適用しますが、ポイントは移動しません。これは大文字小文字を 間違えてタイプしたとき有用です。大文字小文字の変換コマンドを実行した後、 そのまま編集を続けられるからです。 単語の途中で単語の大文字小文字を変換するコマンドが与えられた場合、ポ イントの後ろに続く単語の一部だけに変換が適用されます(これは‘M-d’ (‘kill-word’)と互換性があります)。負の引数の場合は、ポイントの前にある単 語の一部が変換されます。 他の大文字小文字の変換コマンドは‘C-x C-u’ (‘upcase-region’)と‘C-x C-l’ (‘downcase-region’)で、これらはポイントとマークの間にあるすべてのテ キストを大文字または小文字に変換します。ポイントとマークは移動しません。 リージョンにたいする大文字小文字の変換コマンド‘upcase-region’および ‘downcase-region’は、通常では無効になっています。これは、これらを使おう と試みたとき、確認を求められることを意味します。確認にたいして同意すると コマンドが有効になり、それ以降は確認を求められなくなることを意味します。 *note Disabling::を参照してください。 25.8 Textモード =============== Textモードは、人間の言語のテキストファイルを編集するためのメジャーモード です。‘.txt’という拡張子で終わる名前のファイルは、通常はTextモードで開か れます。明示的にTextモードに切り替えるには、‘M-x text-mode’とタイプして ください。 Textモードでは、改行とページ区切りだけがパラグラフを分割します。結果 として、パラグラフはインデントすることができ、適応型フィルはパラグラフを フィルするときに、どのインデントが使用されているか決定します。*note Adaptive Fill::を参照してください。 Textモードでは (‘indent-for-tab-command’)コマンドは通常、カレン ト行をインデントするかわりに、次のタブストップまで空白文字を挿入します。 詳細については、*note Indentation::を参照してください。 Textモードは、明示的にそれらを呼び出した場合をのぞき、コメントに間す る機能をオフに切り替えます。これは構文テーブル(syntax table)を変更するの で、アポストロフィーは単語の一部と判断されます(たとえば‘don't’は1つの単 語と判断されます))。しかし単語がアポストロフィーで開始される場合、それは 先頭の文字を大文字にするためのプレフィクスとして扱われます(たとえば ‘M-c’により、‘'hello'’は‘'Hello'’に変換されます)。 パラグラフの最初の行をインデントしている場合は、Textモードではなく Paragraph-Indent Textモード(‘M-x paragraph-indent-text-mode’)を使用する べきでしょう。このモーででは、パラグラフの間に空行を入れる必要はありませ ん。最初の行のインデントだけでパラグラフの開始を判断するのに充分だからで す。しかしパラグラフのすべての行がインデントされている場合は、サポートさ れません。メジャーモードを変更したくないとき(たとえばメール作成時など)は 、‘M-x paragraph-indent-minor-mode’を使って、等価なマイナーモードを有効 にしてください。 Textモードでは、‘M-’が‘ispell-complete-word’にバインドされます。 このコマンドはバッファーのポイントの前にある単語を、スペル辞書を使用して 補完します。*note Spelling::を参照してください。ウィンドウマネージャーが ‘M-’をウィンドウの切り替えに定義している場合は、かわりに‘ ’または‘C-M-i’とタイプすることができます。 Textモードに入ると、モードフック‘text-mode-hook’が実行されます(*note Major Modes::を参照してください)。 以下のセクションでは、Textモードから“派生”したいくつかのメジャーモー ドを説明します。派生したモードは、上記で説明したTextモードのほとんどの機 能を継承します。とくに、Textモードから派生したモードは、それら自身のモー ドフックの前に、‘text-mode-hook’を実行します。 25.9 Outlineモード ================== OutlineモードはTextモードから派生したメジャーモードで、アウトライン (outline: 概略、概要、要綱)を編集するために特化したモードです。このモー ドはアウトライン構造のエントリー間を操作したり、バッファーの一部を一時的 に非表示にするコマンドを提供するので、アウトライン構造をより簡単に閲覧す ることができるでしょう。‘M-x outline-mode’とタイプすることにより、 Outlineモードに切り替わります。Outlineモードに入ることにより、フック ‘text-mode-hook’、およびそれに続けてフック‘outline-mode-hook’が実行され ます(*note Hooks::を参照してください)。 Outlineモードで行を非表示にするコマンド(*note Outline Visibility::を 参照してください)を使用した場合、それらの行は画面に表示されなくなります 。非表示行の前にある表示された行の後ろには省略記号(3つのピリオド)が表示 され、そこに隠れたテキストがあることを示します。連続する複数の行を非表示 にした場合も、省略記号は1つだけです。 ‘C-n’や‘C-p’のような、複数の行にたいして操作を行う編集コマンドは、非 表示の行のテキストを、その前にある表示された行の一部として扱います。表示 された行の最後にある省略記号をkillすると、省略記号に対応する後続のすべて の非表示テキストを実際にkillします。 Outline minorモードは、メジャーモードであるOutlineモードと同じコマン ドを提供する、バッファーローカルなマイナーモードで、他のメジャーモードと 合わせて使うことができます。‘M-x outline-minor-mode’とタイプして、カレン トバッファーにたいしてOutline minorモードを切り替えることができます。フ ァイルローカル変数のセッティングを使用して、特定のファイルにたいして有効 にすることもできます(*note File Variables::を参照してください)。 メジャーモードのOutlineモードは、‘C-c’プレフィクスで特別なキーバイン ディングを提供します。Outline minorモードは、‘C-c @’プレフィクスで同様な バインディングを提供します。これは他のメジャーモードの特別なコマンドとの 競合を減らすためです(変数‘outline-minor-mode-prefix’は、使用するプレフィ クスを制御します)。 25.9.1 アウトラインのフォーマット --------------------------------- Outlineモードは、バッファーの行には2つのタイプがあると仮定します。それは “ヘッダー行(heading lines)”と“ボディー行(body lines)”です。ヘッダー行は アウトラインのトピックを表します。ヘッダー行は1つ以上のアスタリスク文字 (‘*’)で開始されます。アスタリスクの数はアウトライン構造でのヘッダーの深 さを決定します。したがって1つの‘*’がついたトピックは、メジャーなトピック になります。このヘッダーと、次の‘*’が1つのヘッダーの間にある、‘*’が2つの ヘッダー行は、そのヘッダーのサブトピックです。ヘッダー行ではないすべての 行はボディー行です。ボディー行は、それの前にあるヘッダー行に属します。以 下は例です: * Food This is the body, which says something about the topic of food. ** Delicious Food This is the body of the second-level header. ** Distasteful Food This could have a body too, with several lines. *** Dormitory Food * Shelter Another first-level topic with its header line. ヘッダー行とそれに属するすべてのボディー行を合わせて、“エントリー (entry)”と呼びます。ヘッダー行と、その配下にあるすべてのヘッダー行、それ らすべてのボディー行を、“サブツリー(subtree)”と呼びます。 ヘッダー行と判別する条件は、変数‘outline-regexp’をセットすることによ りカスタマイズできます(これを行う推奨された方法は、メジャーモードの関数 を使うか、ファイルローカル変数を使う方法です)。行の開始がこのregexpにマ ッチする行は、ヘッダー行と判断されます。(行の左端ではなく)行の途中でのマ ッチは勘定に入りません。 テキストにたいするマッチの長さは、ヘッダーのレベルを決定します。長い マッチは、より深くネストされたレベルとなります。‘@chapter’、‘@section’、 ‘@subsection’というコマンドが、ドキュメントをチャプター、セクション、サ ブセクションに分割するようなテキストフォーマッターがある場合(訳注: texinfo形式のこと)、‘outline-regexp’に‘"@chap\\|@\\(sub\\)*section"’をセ ットすることにより、それらの行をヘッダー行と判断させることができます。こ こでトリックに注意してください。2つの単語‘chapter’と‘section’は同じ長さ です。しかしregexp‘chap’だけにマッチするように定義することによって、チャ プターのヘッダーにマッチするテキストの長さを短くすることができるので、 Outlineモードはセクションがチャプターの配下であることを知ることができま す。これは‘@chap’で始まるコマンドが他にない場合に限り機能します。 変数‘outline-level’をセットすることにより、ヘッダー行のレベルを計算す るためのルールを明示できに指定できます。‘outline-level’の値には、引数を とらないカレントヘッダーのレベルを返す関数を指定します。この変数をセット する推奨された方法は、メジャーモードのコマンドを使うか、ファイルローカル 変数を使用する方法です。 25.9.2 アウトライン移動コマンド ------------------------------- Outlineモードはヘッダー行を後方または前方に移動する、特別な移動コマンド を提供します。 ‘C-c C-n’ ポイントを次の可視なヘッダー行に移動します (‘outline-next-visible-heading’)。 ‘C-c C-p’ ポイントを前の可視なヘッダー行に移動します (‘outline-previous-visible-heading’)。 ‘C-c C-f’ ポイントを同じレベルの、次の可視なヘッダー行に移動します (‘outline-forward-same-level’)。 ‘C-c C-b’ ポイントを同じレベルの、前の可視なヘッダー行に移動します (‘outline-backward-same-level’)。 ‘C-c C-u’ ポイントを、より低い(より包括的な)レベルの可視のヘッダー行に移動し ます(‘outline-up-heading’)。 上記のコマンドはすべて、繰り返し回数として数引数を受け取ります。たと えば、‘C-c C-f’に引数を与えると、その数だけ前方の可視なヘッダー行と同じ レベルに移動し、‘C-c C-u’に引数を与えると、ネストされたレベルをその数の レベル抜け出して移動します。 25.9.3 アウトライン表示コマンド ------------------------------- Outlineモードには、アウトライン構造にもとづいてバッファーの一部を一時的 に非表示にしたり可視にするコマンドが、いくつかあります。これらのコマンド はアンドゥ可能ではありません。コマンドの効果は単純にアンドゥメカニズムに 記録される訳ではありませんが、それらを実行した直後に限りアンドゥできます (*note Undo::を参照してください)。 これらのコマンドは、カレントのヘッダー行に作用します。ポイントがヘッ ダー行にある場合、それがカレントのヘッダー行です。ポイントがボディー行に ある場合、カレントヘッダー行は一番近くの前にあるヘッダー行です。 ‘C-c C-c’ カレントヘッダー行のボディーを非表示にします (‘outline-hide-entry’)。 ‘C-c C-e’ カレントヘッダー行のボディーを可視にします(‘outline-show-entry’)。 ‘C-c C-d’ カレントヘッダー行の配下のすべて(ヘッダー行自身は含まれません)を非 表示にします(‘outline-hide-subtree’)。 ‘C-c C-s’ カレントヘッダー行の配下のすべて(ボディー、サブヘッダーおよびそのボ ディーを含む)を可視にします(‘outline-show-subtree’)。 ‘C-c C-l’ カレントヘッダー行のボディーと、すべてのサブヘッダーを非表示にしま す(‘outline-hide-leaves’)。 ‘C-c C-k’ カレントヘッダー行のサブヘッダーをすべてのレベルで可視にします (‘outline-show-branches’)。 ‘C-c C-i’ カレントヘッダー行の一番近いサブヘッダー(1レベル下)を可視にします (‘outline-show-children’)。 ‘C-c C-t’ バッファーのすべてのボディー行を非表示にします (‘outline-hide-body’)。 ‘C-c C-a’ バッファーのすべての行を可視にします(‘outline-show-all’)。 ‘C-c C-q’ 上位Nレベルのヘッダー行を除き、すべてを非表示にします (‘outline-hide-sublevels’)。 ‘C-c C-o’ ポイントのあるヘッダー行またはボディー行と、そこから最上位までのレ ベルにあるヘッダーを除き、すべてを非表示にします (‘outline-hide-other’)。 これらのコマンドのうち、カレントヘッダー行に直接続くボディー行を非表 示にする‘C-c C-c’ (‘outline-hide-entry’)と、それらを可視にする‘C-c C-e’ (‘outline-show-entry’)が一番簡単なコマンドです。サブヘッダーとそれらのボ ディーは影響を受けません。 コマンド‘C-c C-d’ (‘outline-hide-subtree’)および‘C-c C-s’ (‘outline-show-subtree’)は、より強力です。これらはカレントヘッダー行の “サブツリー” — つまりカレントヘッダー行のボディーと、すべての直接または 間接のサブヘッダーとそのボディー — に適用されます。 コマンド‘C-c C-l’ (‘outline-hide-leaves’)は、カレントヘッダー行のボデ ィーと、サブツリーのボディーをすべて非表示にします(サブヘッダー自身は表 示されます)。コマンド‘C-c C-k’ (‘outline-show-branches’)は、(たとえば ‘C-c C-d’)などで)前に非表示にされたサブヘッダーを可視にします。コマンド ‘C-c C-i’ (‘outline-show-children’)はこれの穏やかなバージョンで、直接的 なサブヘッダー(たとえば1レベル下のサブヘッダー)を可視にします。 コマンド‘C-c C-o’ (‘outline-hide-other’)は、ポイントのあるエントリー と、その祖先(アウトライン構造上でそこから最上位レベルに至るまでのヘッダ ー)、およびトップレベルのヘッダーを除き、すべてを非表示にします。このコ マンドは、そのバッファーの最初のヘッダーの前のボディー行も表示します。 残りのコマンドは、バッファー全体に作用するコマンドです。‘C-c C-t’ (‘outline-hide-body’)はすべてのボディー行を非表示にするので、アウトライ ン構造だけを見ることができます(特別な例外として、ファイルの最初にあるヘ ッダー行より前の行は、技術的に言うとボディー行ですが、これらは非表示にな りません)。‘C-c C-a’ (‘outline-show-all’)はすべての行を可視にします。 ‘C-c C-q’ (‘outline-hide-sublevels’)は、カレントのヘッダー行(ポイントが ヘッダー行にないときのデフォルトは1行目)の位置、またはその上にある最上位 のヘッダーを除き、すべてを非表示にします。数引数Nを指定すると、上位Nレベ ルのヘッダー行を除き、すべてを非表示にします。この場合、上位Nレベルと、 最初のヘッダーの前のボディー行が表示されることに注意してください。 インクリメンタル検索が、Outlineモードにより非表示にされたテキストを検 索したとき、検索された部分のバッファーは可視になります。その位置で検索を 抜けると、テキストは可視のまま残ります。アクティブなインクリメンタル検索 が、非表示のテキストにマッチするかを切り替えるには、‘M-s i’とタイプしま す。将来の検索にたいしてデフォルトを変更するには、オプション ‘search-invisible’をカスタマイズします(このオプションは‘query-replace’、 および関連する機能が非表示のテキストを扱う方法に影響を与えます。*note Query Replace::を参照してください)。バッファーローカルなマイナーモード Revealモード(‘M-x reveal-mode’)を使用して、操作にしたがって自動的にテキ ストを可視にもできます。 25.9.4 複数ビューによるアウトラインの閲覧 ----------------------------------------- 1つのアウトラインを同時に2つのビューで、別のウィンドウで表示することがで きます。これを行うには、‘M-x make-indirect-buffer’を使ってインダイレクト バッファーを作らなければなりません。このコマンドの最初の引数は既存のアウ トラインバッファーの名前で、2番目の引数は新しくインダイレクトバッファー として使用する名前です。*note Indirect Buffers::を参照してください。 1度インダイレクトバッファーが作成されると、‘C-x 4 b’や他のEmacsコマン ドで、通常のやり方でウィンドウにそれを表示できます。テキストの一部を可視 にしたり非表示にするOutlineモードのコマンドは、それぞれのバッファーで独 立したエントリーを操作し、それぞれのバッファーは独自のビューをもつことが できます。同じアウトラインにたいして2つ以上のビューが欲しいときは、追加 でインダイレクトバッファーを作成します。 25.9.5 折り畳み編集 ------------------- Foldoutパッケージは、OutlineモードおよびOutline minorモードを、フォール ディング(folding: 折り畳み)コマンドで拡張します。フォールディングのアイ デアは、アウトラインのネストされた部分にたいして、それに関連する部分と、 より高いレベルが非表示のときに、それにズームインするというものです。 すべてのテキストと、レベル1より下のレベルが非表示になっている Outlineモードのバッファーを考えてください。それらのヘッダーの下に何が隠 れているか見るには、‘C-c C-e’ (‘M-x outline-show-entry’)でボディーを可視 にするか、‘C-c C-i’でその子ヘッダー(レベル2)を可視にすることができます。 Foldoutでは、‘C-c C-z’ (‘M-x foldout-zoom-subtree’)を使います。これは そのヘッダーのボディーと、その子サブヘッダーを可視にして、バッファーをナ ローイングするので、レベル1にヘッダーとボディー、それにレベル2のヘッダー だけが可視になります。そのうちの1つのレベル2ヘッダーの下を見るには、カー ソル位置をそのヘッダーに移動して、もう一度‘C-c C-z’を使用します。これに より、そのレベル2ヘッダーのボディーと、レベル3の子サブヘッダーが可視にな り、バッファーが再びナローイングされます。連続して好きなだけサブヘッダー をズームインすることができます。モードラインの文字列には、今どの深さにい るのかが表示されます。 ヘッダーにズームインしているときに、それらの子サブヘッダーを見るには ‘C-u C-c C-z’のように数引数を指定します。何レベル下の子かを指定すること もできます(‘M-x outline-show-children’に相当します)。たとえば ‘M-2 C-c C-z’は2レベルの子サブヘッダーを可視にします。ボディーを指定する には‘M-- C-c C-z’のように負の引数を指定します。‘C-c C-s’ (‘M-x outline-show-subtree’)のようにサブツリー全体を展開するには、 ‘M-0 C-c C-z’のように引数に0を指定します。 ズームインしている時でも、Outlineモードの表示および非表示の関数は、 Foldoutに干渉せずに使用できます。バッファーがナローイングされているので 、グローバルな編集操作は、ズームインされたヘッダーのテキストだけに影響し ます、これは特定のチャプターやセクションに変更を限定するのに便利です。 フォールドのズームを取り消す(抜ける)には、‘C-c C-x’ (‘M-x foldout-exit-fold’)を使用します。これは最上位レベルのヘッダーの配下のす べてのテキストと、サブヘッダーを非表示にして、バッファーの以前のビューに 戻ります。数引数はフォールドを何レベル抜けるかを指定します。0を指定する とすべてのフォールドを抜けます。 テキストとサブヘッダーを非表示にせずに、フォールドのナローイングを取 り消すには、負の引数を指定します。たとえば、‘M--2 C-c C-x’は2つのフォー ルドを抜け出し、テキストとサブヘッダーは表示されたままにします。 Foldoutモードはフォールドへの出入りと、非表示のテキストを表示するため のマウスコマンドも提供します: ‘C-M-mouse-1’でヘッダーをクリックするとズームインします。 シングルクリック: ボディーを可視にします。 ダブルクリック: サブヘッダーを可視にします。 トリプルクリック: ボディーとサブヘッダーを可視にします。 4連クリック: サブツリー全体を可視にします。 ‘C-M-mouse-2’でヘッダーをクリックしたときは可視になります シングルクリック: ボディーを可視にします。 ダブルクリック: サブヘッダーを可視にします。 トリプルクリック: ボディーとサブヘッダーを可視にします。 4連クリック: サブツリー全体を可視にします。 ‘C-M-mouse-3’でヘッダーをクリックすると、ヘッダーの配下のテキストを非表示にするか、フォールドを抜けます シングルクリック: サブツリーを非表示にします。 ダブルクリック: フォールドを抜けてテキストを非表示にします。 トリプルクリック: テキストを非表示にせずにフォールドを抜けます 4連クリック: すべてのフォールドを抜けてテキストを非表示にしま す。 ‘foldout-mouse-modifiers’をセットすることにより、(‘--’の かわりに)他の修飾キーを指定できます。すでに‘foldout.el’ライブラリーがロ ードされている場合、これが効果をもつために再ロードしなければなりません。 Foldoutパッケージを使用するには、‘M-x load-library foldout ’とタイプするか、initファイルに以下の行を記述して自動的にこれを行う ことができます。 (with-eval-after-load "outline" (require 'foldout)) 25.10 Orgモード =============== Orgモードは、Emacsをオーガナイザーおよび/またはオーサリングツールとして 使用するための、Outlineモードの変種です。名前が拡張子‘.org’で終わるファ イルは、Orgモードで開かれます(*note Choosing Modes::を参照してください )。明示的にOrgモードに切り替えるには、‘M-x org-mode’とタイプしてください 。 Orgモードでは、Outlineモードのように、各エントリーは1つ以上の‘*’文字 で始まるヘッダー行をもちます。*note Outline Format::を参照してください。 それに加えて、‘#’文字で始まる行は、コメントとして扱われます。 Orgモードは、簡単にアウトライン構造を眺めたり操作するためのコマンドを 提供します。それらのコマンドのうち、一番簡単なのは (‘org-cycle’)で す。ヘッダー行でこのコマンドを呼び出すと、サブツリーを — (i)ヘッダー行だ けを表示 (ii)ヘッダー行と、(あれば)直接の子ヘッダー行だけを表示 (iii)サ ブツリー全体を表示 — の3つの異なる視点で巡回します。ボディー行にたいして 呼び出された場合、にグローバルにバインドされたコマンドが実行されま す。 Orgモードのバッファーの任意の場所で、‘S-’ (‘org-shifttab’)とタイ プすることにより、アウトライン構造全体を — (i) 最上位ㇾベルのヘッダー行 だけを表示 (ii)ボディー行を除いたすべてのヘッダー行を表示 (iii) すべてを 表示 — の3つの異なる視点で巡回します。 ヘッダー行で‘M-’ (‘org-metaup’)または‘M-’ (‘org-metadown’)と タイプすることにより、ボディー行と(あれば)サブツリーを含むバッファー内の エントリー全体を、上または下に移動できます。同様に‘M-’ (‘org-metaleft’)および‘M-’ (‘org-metaright’)で、ヘッダー行を昇格 または降格できます。ボディー行で呼び出された場合は、それらのキーにグロー バルにバインドされたコマンドが実行されます。 以下のサブセクションでは、オーガナイザーやオーサリングシステムとして Orgモードを使用するための基本的な操作方法を解説します。詳細については、 *note The Org Mode Manual: (org)Top.を参照してください。 25.10.1 オーガナイザーとしてのOrg --------------------------------- エントリー内のどこかで‘C-c C-t’ (‘org-todo’)とタイプすることにより、その Orgエントリーを“TODO”アイテムとして、タグ付けすることができます。これは ヘッダー行にキーワード‘TODO’を追加します。もう一度‘C-c C-t’をタイプする とキーワードは‘DONE’に切り替わり、さらに‘C-c C-t’とタイプするとキーワー ド全体を除去します。‘C-c C-t’で使用されるキーワードは、変数 ‘org-todo-keywords’を通じてカスタマイズすることができます。 エントリーをTODOとして作成する他に、エントリー内で‘C-c C-s’ (‘org-schedule’)とタイプすることにより、日付を割り当てることができます。 これはEmacs Calender(*note Calendar/Diary::を参照してください)をポップア ップして日付の入力を求め、選択された日付と一緒に、ヘッダー行の下にタグ ‘SCHEDULED’を追加します。コマンド‘C-c C-d’ (‘org-deadline’)も、タグ ‘DEADLINE’を使う以外は同じ効果をもちます。 1度Orgファイルに計画されたTODOアイテムをもつと、‘C-c [’ (‘org-agenda-file-to-front’)とタイプすることにより、“アジェンダファイル (agenda files)”のリストにそのファイルを追加できます。Orgモードは、たとえ ばあなたの生活のさまざまな側面をオーガナイズするために、複数のアジェンダ ファイルを簡単に保守できるようにデザインされています。アジェンダファイル のリストは、変数‘org-agenda-files’に格納されています。 アジェンダファイルのアイテムを閲覧するには、‘M-x org-agenda’とタイプ します。このコマンドは何を見たいのか、入力を求めます(今週に行なうすべて の事項のリストか、特定のキーワードにマッチするTODOアイテムのリストか、な ど)。 詳細は、*note (org)Agenda views::を参照してください。 25.10.2 オーサリングシステムとしてのOrg --------------------------------------- Orgノートを見映えよくフォーマットしたり、エクスポートして公表したいと思 うかもしれません。カレントバッファーをエクスポートするには、Orgバッファ ーのどこかで‘C-c C-e’ (‘org-export’)とタイプします。このコマンドはエクス ポートするフォーマットの入力を求めます。現在サポートされているフォーマッ トは、HTML、LaTeX、Texinfo、OpenDocument(‘.odt’)、iCalendar、Markdown、 man-page、PDFです。PDFのようないくつかのフォーマットは、システムに特定の ツールがインストールされている必要があります。 1度に複数のファイルを特定のディレクトリー(ローカルまたはネットワーク 越し)にエクスポートするには、変数‘org-publish-project-alist’にプロジェク トのリストを定義しなければなりません。詳細はOrgのドキュメントを参照して ください。 Orgはエクスポートされたドキュメントのテキストのフォーマットに適用する 、シンプルなマークアップの仕組みをサポートします: - This text is /emphasized/ - This text is *in bold* - This text is _underlined_ - This text uses =a teletype font= #+begin_quote ``This is a quote.'' #+end_quote #+begin_example This is an example. #+end_example 詳細は、*note (org)Exporting::、および*note (org)Publishing::を参照し てください。 25.11 TeXモード =============== TeXはDonald Knuthにより記述された強力なテキストフォーマッターで、GNU Emacsと同様、フリーなソフトウェアーです。TeXフォーマットにはいくつかの変 種があります。LaTeXはTeXのための簡略化された入力フォーマットです。 DocTeXはLaTeXソースが記述された特別なファイルフォーマットであり、ソース とドキュメントが合成されています。SliTeXは、時代遅れの特別なLaTeX形式で す。(1) Emacsは、それらの変種用にTeXのメジャーモードを提供します。それはPlain TeXモード、LaTeXモード、DocTeXモード、SliTeXモードです。Emacsはバッファ ーの内容を調べて、適切なモードを選択します(通常これはTeX様式のファイルを visitしたときに自動的に呼び出される‘tex-mode’コマンドにより行われる。 *note Choosing Modes::を参照されたい)。ファイル内容がこれを決定するのに 不十分な場合、Emacsは‘tex-default-mode’に指定されたモードを選択します。 デフォルト値は‘latex-mode’です。Emacsが間違った選択をしたときは、コマン ド‘M-x plain-tex-mode’、‘M-x latex-mode’、‘M-x slitex-mode’、 ‘doctex-mode’を使用して、正しいTeXモードの変種を選択できます。 以下のセクションでは、TeXモードとその変種の機能について記述しています 。TeXに関連したモードは他にもいくつかありますが、このマニュアルには記述 されていません。 • BibTeXモードはBibTeXファイルのためのメジャーモードで、これは一般的 にはLaTeX文書の図書目録リファレンスを維持するのに使用されます。詳細 については、コマンド‘bibtex-mode’のドキュメント文字列を参照してくだ さい。 • RefTeXパッケージは、図書目録リファレンスを管理するLaTeXモードとして 使用されるマイナーモードを提供します。 *note The RefTeX Manual: (reftex)Top.を参照してください。 • AUCTeXパッケージは、TeXおよびそれに関連するフォーマットを編集するた めの。より先進的な機能を提供します。これにはEmacsバッファーでTeXを プレビューする機能も含まれます。BibTeXモードやRefTeXパッケージとは 異なり、AUCTeXはデフォルトではEmacsとともには配布されません。これは Packageメニュー(*note Packages::を参照してください)を通じてダウンロ ードできます。インストールされた後に、 *note The AUCTeX Manual: (auctex)Top.を参照してください。 ---------- Footnotes ---------- (1) これはLaTeX由来の‘slides’ドキュメントクラスにより置き換えられまし た。 25.11.1 TeX編集コマンド ----------------------- ‘"’ コンテキストに応じて‘``’、‘"’、‘''’のどれかを挿入します (‘tex-insert-quote’)。 ‘C-j’ パラグラフの区切り(2つの改行)を挿入して、前のパラグラフのバランスの 取れていない大カッコ(braces)やドル記号をチェックします (‘tex-terminate-paragraph’)。 ‘M-x tex-validate-region’ リージョン内のパラグラフの、バランスのとれていない大カッコやドル記 号をチェックします。 ‘C-c {’ ‘{}’を挿入して、ポイントをその間に配します(‘tex-insert-braces’)。 ‘C-c }’ 対応が取れていない、次の閉じ大カッコの後ろに、前方に移動します (‘up-list’)。 TeXでは文字‘"’は通常使用されません。かわりに‘``’で始まり‘''’で終わる 引用が使用されます。したがってTeXモードは‘"’キーを‘tex-insert-quote’コマ ンドにバインドしています。これは空白文字または開き大カッコの後ろに‘``’、 バックスラッシュの後に‘"’、それ以外の文字の場合は‘''’を挿入します。 特別な例外として、ポイントの前のテキストが‘``’か‘''’のときに‘"’をタイ プすると、Emacsは前のテキストを1つの‘"’で置き換えます。したがって、必要 がある時は‘""’とタイプして‘"’を挿入できます(‘C-q "’を使用してこの文字を 挿入することもできます)。 TeXモードでは、‘$’は特別な構文コードを持っていて、それはTeXの数式モー ドの区切りを理解しようと試みます。数式モードを抜けるために‘$’を入力した 場合、数式モードに入るための対応する‘$’の位置が1秒間表示されます。これは 閉じ大カッコが挿入されたとき、それに対応する開き大カッコが表示されるのと 同じき機能です。しかし‘$’が数式モードに入るためなのか、それとも抜けるた めなのかを指示する方法はありません。したがって、もし対応するものがある場 合、実際にはそれが関係なくても、前の‘$’の位置が表示されます。 TeXは大カッコを、対応が取れていなければならない区切りとして使用します 。これを1つずつ挿入するより、つねに大カッコの対応が取られている方を好む ユーザーもいます。‘C-c {’ (‘tex-insert-braces’)を使うと、対になった大カ ッコを挿入します。これはポイントを2つの大カッコの間に配すので、中のテキ ストを挿入することができます。その後でコマンド‘C-c }’ (‘up-list’)を使用 すると、前方の閉じ大カッコの先に移動します。あるテキストをマークした後に ‘C-c {’を呼び出すこともでき、その場合このコマンドはマークされたテキスト を大カッコで括ります。 対応の取れていない大カッコをチェックするコマンドが2つあります。‘C-j’ (‘tex-terminate-paragraph’)は、ポイントの前のパラグラフをチェックして、 新しいパラグラフを開始するための2つの改行を挿入します。対応が取れていな いものが見つかった場合、エコーエリアにメッセージを出力します。‘M-x tex-validate-region’はリージョンを、パラグラフごとにチェックします。エラ ーは‘*Occur*’バッファーにリストされます。そのバッファーでは、特定のミス マッチをvisitする‘C-c C-c’などの、通常のOccurモードのコマンドを使用でき ます(*note Other Repeating Search::を参照してください)。 TeXのEmacsコマンドは大カッコだけではなく、角カッコ(square brackets)や カッコ(parentheses)などもカウントすることに注意してください。これはTeX構 文をチェックする目的としては、厳密に正しいとは言えません。しかしカッコと 角カッコはテキストの中で、同じような対応の取れた区切りとして使用され、さ まざまな移動コマンドや、対応する区切りの表示が、それらにたいして機能する のは便利なのです。 25.11.2 LaTeX編集コマンド ------------------------- LaTeXモードは、plain TeXには適用できない特別な機能をいくつか提供します: ‘C-c C-o’ LaTeXブロックのための‘\begin’と‘\end’を挿入して、ポイントをそれらの 間の行に配します(‘tex-latex-block’)。 ‘C-c C-e’ まだ閉じていない一番内側のLaTeXブロックを閉じます (‘tex-close-latex-block’)。 LaTeX入力では、テキストをブロック化するのに‘\begin’と‘\end’のタグが使 用されます。ブロックを挿入するには‘C-c C-o’ (‘tex-latex-block’)とタイプ します。これはブロックタイプの入力を求め、適切な対応する‘\begin’と ‘\end’を挿入し、その2行の間に空行を残してポイントをそこに移動します。 ‘C-c C-o’にたいしてブロックタイプを入力するとき、通常の補完コマンドを 使用できます(*note Completion::を参照してください)。デフォルトの補完リス トには、標準的なLaTeXのブロックタイプが含まれています。補完にブロックタ イプを追加したい場合は、リスト変数‘latex-block-names’をカスタマイズして ください。 LaTeX入力では、‘\begin’と‘\end’のタグは対応が取れていなければなりませ ん。‘C-c C-e’ (‘tex-close-latex-block’)により、対応が取れていない最後の ‘\begin’に対応する‘\end’を挿入することができます。これは対応する ‘\begin’に調和するように‘\end’をインデントし、ポイントが行の先頭にあると きは‘\end’タグの後ろに改行を挿入します。マイナーモード ‘latex-electric-env-pair-mode’は、‘\end’か‘\begin’の一方をタイプしたとき 、自動的に対応する‘\end’または‘\begin’を挿入します。 25.11.3 TeX印刷コマンド ----------------------- バッファーの全内容、または一部(たとえば大きなドキュメントの1つのチャプタ ー)にたいして、TeXをEmacsのサブプロセスとして呼び出すことができます。 ‘C-c C-b’ カレントバッファー全体にたいしてTeXを呼び出します(‘tex-buffer’)。 ‘C-c C-r’ バッファーのヘッダーとともに、カレントリージョンにたいしてTeXを呼び 出します(‘tex-region’)。 ‘C-c C-f’ カレントファイルにたいしてTeXを呼び出します(‘tex-file’)。 ‘C-c C-v’ 最後の‘C-c C-b’、‘C-c C-r’、‘C-c C-f’コマンドの出力をプレビューしま す(‘tex-view’)。 ‘C-c C-p’ 最後の‘C-c C-b’、‘C-c C-r’、‘C-c C-f’コマンドの出力を印刷します (‘tex-print’)。 ‘C-c ’ カレントファイルにたいしてBibTeXを呼び出します(‘tex-bibtex-file’)。 ‘C-c C-l’ TeX出力を表示するウィンドウを再センタリングして、最後の行が見えるよ うにします(‘tex-recenter-output-buffer’)。 ‘C-c C-k’ TeXサブプロセスをkillします(‘tex-kill-job’)。 ‘C-c C-c’ カレントバッファー全体にたいして、他のコンパイルコマンドを呼び出し ます(‘tex-compile’)。 カレントバッファーをTeXに渡すには、‘C-c C-b’ (‘tex-buffer’)とタイプし ます。フォーマットされた出力は、通常‘.dvi’という一時ファイルに出力されま す。その後で‘C-c C-v’ (‘tex-view’)とタイプして、‘xdvi’のような外部プログ ラムを起動して、出力ファイルを閲覧することができます。‘C-c C-p’ (‘tex-print’)とタイプして出力ファイルのハードコピーを印刷することもでき ます。 デフォルトでは‘C-c C-b’は、カレントディレクトリーでTeXを実行します。 TeXの出力もこのディレクトリーに作成されます。TeXを違うディレクトリーで実 行するには、変数‘tex-directory’を望むディレクトリー名に変更します。環境 変数‘TEXINPUTS’に相対名が含まれていたり、ファイルに含まれる‘\input’コマ ンドが相対ファイル名の場合、‘tex-directory’を‘"."’に_しないと_、望ましく ない結果となるでしょう。そうでない場合は、‘"/tmp"’などの他のディレクトリ ーを指定しても安全です。 そのバッファーにたいするTeXの変種は、‘C-c C-b’で実際に実行されるシェ ルコマンドを決定します。Plain TeXモードでは、これは変数 ‘tex-run-command’で指定され、デフォルトは‘"tex"’です。LaTeXモードでは、 これは‘latex-run-command’で指定され、デフォルトは‘"latex"’です。‘.dvi’を 閲覧するために‘C-c C-v’で実行されるシェルコマンドは、TeXの種類に関係なく 、変数‘tex-dvi-view-command’で決定されます。出力を印刷するために‘C-c C-p’で実行されるシェルコマンドは、変数‘tex-dvi-print-command’で決定され ます。TeXでコンパイルされたファイルを閲覧および印刷するために要求される ファイル拡張子は、変数‘tex-print-file-extension’でセットできます。たとえ ば、この変数に‘.pdf’をセットして、それに合わせて‘tex-dvi-view-command’と ‘tex-dvi-print-command’を変更できます。 Emacsは出力ファイル名に通常、前のパラグラフで説明したシェルコマンド文 字列を自動的に追加します。たとえば‘tex-dvi-view-command’が‘"xdvi"’のとき 、‘C-c C-v’は‘xdvi OUTPUT-FILE-NAME’を実行します。しかし、ファイル名がコ マンドに埋め込まれている必要があるケース、たとえばあるコマンドの引数にフ ァイル名を与えて、そのコマンドの出力をパイプで他のコマンドに渡さなければ いけない場合があります。コマンド文字列の‘*’で、ファイル名をどこに置くか 指定することができます。以下は例です (setq tex-dvi-print-command "dvips -f * | lpr") エラーメッセージを含むTeXからの端末出力は、‘*tex-shell*’という名前の バッファーに表示されます。TeXでエラーが発生した場合、このバッファーに切 り替えて、適切な入力を与えることができます(これはShellモードで機能します 。*note Interactive Shell::を参照してください)。このバッファーに切り替え なくても、これをスクロールできるので、‘C-c C-l’とタイプして最後の行を表 示することができます。 これ以上の出力が有用でないと判断した時は、‘C-c C-k’ (‘tex-kill-job’)と タイプしてTeXプロセスをkillします。‘C-c C-b’および‘C-c C-r’の使用すると きも、TeXがまだ実行中の時はkillします。 ‘C-c C-r’ (‘tex-region’)とタイプして、任意のリージョンをTeXに渡すこと ができます。しかし、これはトリッキーです。なぜならほとんどのTeX入力ファ イルは、先頭にパラメーターをセットしたりマクロを定義するコマンドを含んで いるからです。この問題を解決するために、‘C-c C-r’では、必須のマクロを含 むファイル部分を指定することができます。指定したリージョンの前にそれを含 めて、TeXの入力の一部とします。ファイルの必須と指定された部分を“ヘッダー ”と呼びます。 Plain TeXモードでヘッダーの境界を示すには、ファイルに2つの特別な文字 列を挿入します。これはヘッダーの前に‘%**start of header’、ヘッダーの後ろ に‘%**end of header’を記述します。これらの文字列は1行に全体を記述しなけ ればなりませんが、文字列の前または後ろに他のテキストがあっても構いません 。この2つの文字列を含む行はヘッダーの中に含まれます。‘%**start of header’がバッファーの先頭100行にない場合、‘C-c C-r’はヘッダーがないとみ なします。 LaTeXモードでは、ヘッダーは‘\documentclass’または‘\documentstyle’で始 まり、‘\begin{document}’で終わります。いかなる場合でもLaTeXがこれらを要 求するので、ヘッダーを識別するのに特別なことをする必要はありません。 コマンド(‘tex-buffer’)および(‘tex-region’)は、すべてを一時ディレクト リーで処理します。そしてTeXでクロスリファレンスのために必要となる補助的 なファイルは利用不可です。一般的にこれらのコマンドは、すべてのクロスリフ ァレンスが正しい必要がある最終コピーのために実行するのには適していません 。 クロスリファレンスのための補助的なファイルを使いたいときは、‘C-c C-f’ (‘tex-file’)を使用します。これはカレントバッファーのファイルにたいして、 そのファイルのディレクトリーでTeXを実行します。TeXを実行する前に、変更さ れたバッファーを保存するか確認が求められます。一般的には、クロスリファレ ンスを正しく取得するために、2回(‘tex-file’)を使用する必要があります。 変数‘tex-start-options’の値は、TeXを実行するためのオプションを指定し ます。 変数‘tex-start-commands’の値は、TeXを開始するTeXコマンドを指定します 。デフォルト値はTeXをノンストップモードで実行します。対話的にTeXを実行す るときは、変数に‘""’をセットします。 大きなサイズのTeXドキュメントは複数のファイル — 1つはメインファイルで 、他はサブファイル — に分割されているときがあります。サブファイルにたい してTeXを実行しても通常は動作しません。メインファイルにたいして実行する 必要があるのです。サブファイルを編集するのに‘tex-file’を使えるようにする には、変数‘tex-main-file’にメインファイルの名前をセットします。その後は ‘tex-file’はそのファイルにたいしてTeXを実行します。 ‘tex-main-file’を使用する一番簡単な方法は、各サブファイルのローカル変 数リストにそれを指定する方法です。*note File Variables::を参照してくださ い。 LaTeXファイルにたいしては、BibTeXを使用してカレントバッファーのファイ ルのための補助的なファイルを処理できます。BibTeXはデータベースの図書目録 の引用(bibliographic citations)を探して、図書目録のセクション (bibliography section)のための引用文献(cited references)を準備します。コ マンド‘C-c ’ (‘tex-bibtex-file’)は、カレントバッファーのファイルに たいする‘.bbl’ファイルを生成するためにシェルコマンド (‘tex-bibtex-command’)を実行します。一般的に、‘.aux’ファイルを生成するた めに一度‘C-c C-f’ (‘tex-file’)を行う必要があります。その後‘C-c ’ (‘tex-bibtex-file’)を行ってから、さらなるクロスリファレンスを正しく取得 するために‘C-c C-f’ (‘tex-file’)を2回行います。 カレントのTeXバッファーで、他のコンパイルプログラムを呼び出すには、 ‘C-c C-c’ (‘tex-compile’)をタイプします。このコマンドは‘pdflatex’、 ‘yap’、‘xdvi’、‘dvips’を含む、多くの一般的なプログラムに渡す引数を知って います。標準の補完キーを使用して望ましいコンパイルプログラムを選択できま す(*note Completion::を参照してください)。 25.11.4 TeXモード、その ----------------------- TeXモードの変種に入ると、フック‘text-mode-hook’および‘tex-mode-hook’を実 行します。その後、‘plain-tex-mode-hook’、‘doctex-mode-hook’、 ‘latex-mode-hook’、‘slitex-mode-hook’のうち、適切なものを実行します。 TeXシェルを開始すると、フック‘tex-shell-hook’を実行します。*note Hooks::を参照してください。 コマンド‘M-x iso-iso2tex’、‘M-x iso-tex2iso’、‘M-x iso-iso2gtex’、 ‘M-x iso-gtex2iso’はLatin-1でエンコードされたファイルと、TeXでエンコード された等価なファイルの変換に使用できます。 25.12 SGMLモードとHTMLモード ============================ SGMLおよびHTMLのためのメジャーモードは、インデントのサポートとタグを操作 するコマンドを提供します。 HTMLは2つのモードから構成されます — 1つ目は‘html-mode’と呼ばれる基本 的なモードで、これは若干カスタマイズされたSGMLモードの変種です。もう1つ はデフォルトでHTMLファイルに使用されるもので‘mhtml-mode’モードと呼ばれ、 ‘