[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本章は、Emacsの起動と終了、 オペレーティングシステムの環境に収められた値の参照方法、 端末入出力とフロー制御についてです。
関連情報についてはSee 節 B.1 Emacsの構築方法。 また、端末やスクリーンに関係する オペレーティングシステムの状態情報については、 38. Emacsの画面表示も参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、Emacsが起動時になにを行うか、および、 それらをカスタマイズする方法について述べます。
37.1.1 概要:始動時の動作手順 Sequence of actions Emacs performs at start-up. 37.1.2 初期化ファイル:`.emacs' Details on reading the init file (`.emacs'). 37.1.3 端末固有の初期化 How the terminal-specific Lisp file is read. 37.1.4 コマンド行引数 How command line arguments are processed, and how you can customize them.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsが始動したときに行う(`startup.el'での) 処理の順序はつぎのとおりです。
load-path
にある各ディレクトリファイルにおいて `subdirs.el'という名前のファイルを実行することで load-path
にサブディレクトリを追加する。
LANG
などの環境変数で要求されていれば、 言語環境と端末のコーディングシステムを設定する。
before-init-hook
を実行する。
inhibit-default-init
がnil
以外でなければ、 ライブラリ`default'をロードする。 (コマンド行で`-q'を指定したり、 `-batch'モードでは、これを行わない。) ライブラリのファイル名は普通は`default.el'である。
after-init-hook
を実行する。
initial-major-mode
に従ってメジャーモードを設定する。
inhibit-startup-echo-area-message
で抑制していなければ、 初期メッセージをエコー領域に表示する。
term-setup-hook
を実行する。
frame-notice-user-settings
を呼び出す。
window-setup-hook
を実行する。 see 節 38.16 ウィンドウシステム。
inhibit-startup-message
の値がnil
であり、 バッファが空であれば、 コピーレフト/無保証/基本的な利用情報を表示する。nil
以外であるとメッセージを表示しない。
始動メッセージの内容に十分慣れたら、 読者個人の初期化ファイルで設定できるようにこの変数がある。 新規ユーザーが受け取るはずである情報を隠してしまうため、 新規ユーザーの初期化ファイルや複数のユーザーに影響するような方法で この変数に設定しないこと。
(setq inhibit-startup-echo-area-message "your-login-name") |
Emacsは、読者のファイル`.emacs'で上に示した式を明示的に検査する。 読者のログイン名はLisp文字列定数として式に現れる必要がある。 inhibit-startup-echo-area-message
に同じ値を 設定する別の方法では、始動メッセージを禁止できない。
このように、望むならば自身のためにメッセージを簡単に禁止できるが、 読者の`.emacs'をむやみにコピーしても、 他人に対してはメッセージを禁止できない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
読者がEmacsを始動すると、Emacsは読者のホームディレクトリから ファイル`.emacs'を普通はロードしようとします。 このファイルが存在すれば、これにはLispコードを入れておく必要があります。 コマンド行オプション`-q'と`-u'は、 初期化ファイルの使い方に影響します。 `-q'は初期化ファイルをロードしないように指示し、 `-u'は読者の初期化ファイルのかわりに指定したユーザーの初期化ファイルを ロードするように指示します。 See 節 `Emacsの起動と終了' in
デフォルトの初期化ファイルをサイトごとに持てます。 これは`default.el'という名前のライブラリです。 Emacsは、ライブラリを探索する標準パスから ファイル`default.el'を探します (see 節 14.1 プログラムからのロード方法)。 Emacsの配布には、このファイルは付属していません。 ローカルなカスタマイズのためにサイトで用意します。 バッチモードや`-q'を指定してある場合を除いて、 デフォルトの初期化ファイルが存在すると、 読者がEmacsを始動するたびにそれをロードします。 しかし、存在するなら、個人の初期化ファイルをさきにロードします。 そこでinhibit-default-init
にnil
以外の値を設定してあると、 Emacsはそのあとファイル`default.el'をロードしません。
サイトごとのカスタマイズ向けの別のファイルは`site-start.el'です。 Emacsはユーザーの初期化ファイルをロードするまえに このファイルをロードします。 このファイルのロードを禁止するには オプション`-no-site-file'を使います。
"site-start"
である。 実際に効果があるようにこれを変更する唯一の方法は、 Emacsをダンプするまえに行うことである。読者のファイル`.emacs'に大量のコードがある場合には、 `something.el'という名前の別のファイルへコピーして、 それをバイトコンパイルし(see 節 15. バイトコンパイル)、 読者のファイル`.emacs'では、load
(see 節 14. ロード)で そのファイルをロードするようにします。
読者のファイル`.emacs'でよく使われるであろう さまざまなカスタマイズを行う方法の例については、 See 節 `初期化ファイルの例' in
nil
以外であるとデフォルトライブラリをロードしない。 デフォルト値はnil
である。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
端末の各種類ごとに、Emacsがその種類の端末で動作するときに Emacsがロードする専用Lispライブラリを持てます。 ライブラリ名は、変数term-file-prefix
の値と 端末種類を連結して作ります。 通常、term-file-prefix
の値は"term/"
であり、 これを変更することは勧めません。 Emacsは通常どおり、load-path
のディレクトリ群において `.elc'と`.el'の接尾辞でファイルを探します。
端末固有ライブラリの普通の機能は、 Emacsが識別可能なキー列を送るように特別なキーを設定することです。 端末のすべてのファンクションキーがtermcapに入っていない場合には、 function-key-map
を設定したり追加する必要もあります。
端末種類の名前にハイフンが含まれる場合、 ライブラリ名を選ぶうえでは、最初のハイフンよりまえの名前の部分が有効です。 したがって、`aaa-48'と`aaa-30-rv'のどちらも ライブラリ`term/aaa'を使います。 必要ならば、ライブラリでは(getenv "TERM")
を評価することで 端末種類の完全な名前を得ることができます。
読者のファイル`.emacs'で 変数term-file-prefix
にnil
を設定すると、 端末固有ライブラリをロードしないようにできます。 この機能は、読者独自のカスタマイズを試すときに有用です。
変数term-setup-hook
に設定すれば、 端末固有ライブラリの特定の動作に優先できます。 これは、読者のファイル`.emacs'と端末固有ライブラリの両者を ロードしたあとの初期化後にEmacsが実行するノーマルフックです。 端末専用ライブラリがない端末向けの初期化を定義するために この変数を使えます。 See 節 22.6 フック。
term-file-prefix
がnil
以外であると、 Emacsは、つぎのように端末固有の初期化ファイルをロードする。
(load (concat term-file-prefix (getenv "TERM"))) |
端末固有の初期化ファイルをロードしたくない場合には、 読者のファイル`.emacs'で 変数term-file-prefix
にnil
を設定する。 それには、読者のファイル`.emacs'に (setq term-file-prefix nil)
を入れる。
端末固有ファイルの定義に優先するためにterm-setup-hook
を使える。
関連する機能については、 38.16 ウィンドウシステムのwindow-setup-hook
を参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsを始動するときにコマンド行引数を使ってさまざまな動作を要求できます。 一日に一度より多くEmacsを始動する必要はないでしょうし、 しばしばEmacsセッションをそれより長く動かし続けるでしょうから、 コマンド行引数はほとんど使いません。 実際、コマンド行引数を使う癖は避けたほうがよいです。 そのような癖をつけると、Emacsを必要以上に終了したり再始動するからです。 これらのオプションは2つの理由で存在します。 (別のプログラムから起動される)他のエディタと互換性があるようにするのと、 シェルスクリプトから特定のLispプログラムを実行できるようにするためです。
本節では、Emacsがコマンド行引数を処理する方法と、 それらをカスタマイズする方法について述べます。
t
である。
dump-emacs
を呼んでEmacsを再ダンプするときには、 この変数にnil
を設定すれば、 新たにダンプしたEmacsでコマンド行引数を処理するようにできる。
コマンド行オプション(command line option)は、 つぎの形のコマンド行の引数である。
-option |
command-switch-alist
の要素はつぎの形である。
(option . handler-function) |
handler-functionは、オプションoptionを処理するために呼ばれ、 オプション名を唯一の引数として受け取る。
コマンド行のオプションには引数が続く場合もある。 そのような場合、handler-functionは 変数command-line-args-left
からすべての残りのコマンド行引数を 調べることができる。 (コマンド行引数全体のリストはcommand-line-args
にある。)
コマンド行引数は、ファイル`startup.el'の 関数command-line-1
が解析する。 節 `コマンド行引数' in
nil
以外の値を返すまで現れる順に呼び出す。
これらの関数は引数なしで呼び出される。 これらの関数では、呼び出し時に束縛される変数argi
を介して 対象となるコマンド行引数を参照できる。 (いま対象となっている引数を除く)残りの引数は 変数command-line-args-left
にある。
関数がargi
を認識して処理したときには、 その引数を処理したことを表すためにnil
以外の値を返すこと。 後続の引数の一部も処理した場合には、 command-line-args-left
から それらを削除することで処理したことを示せる。
これらの関数すべてがnil
を返すと、 訪問するファイル名として引数を用いる。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsから抜けるには2つの方法があります。 Emacsを終了するためにEmacsジョブをキルするか、 あとでEmacsを継続できるように休止します。 実用上は、ログアウトするとき以外にはEmacsをほとんど終了しないでしょう。 Emacsを休止するほうが一般的です。
37.2.1 Emacsの終了 Exiting Emacs irreversibly. 37.2.2 Emacsの休止 Exiting Emacs reversibly.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsを終了するとは、Emacsプロセスの実行を終らせることを意味します。 親プロセスが普通は制御を取り戻します。 Emacsを終了するための下位の基本関数はkill-emacs
です。
exit-dataが整数であると、Emacsプロセスの終了状態として使われる。 (これは主にバッチ処理で有用である。 37.12 バッチモードを参照。)
exit-dataが文字列であると、 その内容を端末入力バッファへ詰め込み、 シェル(やつぎに入力を読むプログラム)がそれらを読み取れるようにする。
保存済みのファイルを除くEmacsプロセス内のすべての情報は、 Emacsを終了すると失われます。 Emacsを不注意に終了すると多くの作業を失うことになるので、 保存する必要があるバッファがあったり動作中のサブプロセスがあると、 Emacsは確認を求めます。 これは関数save-buffers-kill-emacs
が行います。
save-buffers-kill-emacs
は、 リストkill-emacs-query-functions
内の関数を 現れる順に引数なしで呼び出す。 これらの関数では、ユーザーにさらなる確認を求めることができる。 これらのどれかがnil
を返すと、Emacsは終了しない。save-buffers-kill-emacs
がファイルをすべて保存し確認し終えると、 このフックの関数群を実行する。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsを休止するとは、Emacsを一時的に停止し、 普通はシェルである親プロセスに制御を戻すことです。 これにより、あとで同じEmacsプロセスで、つまり、同じバッファ群、 同じキルリング、同じアンドゥ履歴などで編集を再開できます。 Emacsを再開するには、親シェルにおいて ほとんどの場合fg
などの適切なコマンドを使います。
ジョブの休止を扱えないオペレーティングシステムもあります。 そのようなシステムでは、『休止』はEmacsのサブプロセスとして 一時的に新たなシェルを実際には作成します。 そのシェルを終了するとEmacsに戻ります。
ウィンドウシステムを使っている場合には、 Emacsジョブを再開する親プロセスがいないかもしれませんし、 別のウィンドウへ移動すれば別のジョブへ入力できますから、 Emacsの休止は有用ではありません。 したがって、Emacsがウィンドウシステムを使っている場合には、 休止できません。
suspend-emacs
はLisp内の呼び出し側へnil
を返す。
stringがnil
以外であると、 Emacsの親シェルが端末入力として読めるようにその文字群を送る。 親シェルはstringの文字群を表示せず、 その結果のみが現れる。
休止するまえに、suspend-emacs
は ノーマルフックsuspend-hook
を実行する。
ユーザーがEmacsを再開すると、suspend-emacs
は ノーマルフックsuspend-resume-hook
を実行する。 see 節 22.6 フック。
再開後のつぎの再表示では、 変数no-redraw-on-reenter
がnil
ならば スクリーン全体を再描画する。 (see 節 38.1 スクリーン全体の再表示)。
つぎの例では、Emacsを休止しても`pwd'は表示されないことに注意。 しかし、シェルはそれを読み取って実行する。
(suspend-emacs) => nil (add-hook 'suspend-hook (function (lambda () (or (y-or-n-p "Really suspend? ") (error "Suspend cancelled"))))) => (lambda nil (or (y-or-n-p "Really suspend? ") (error "Suspend cancelled"))) (add-hook 'suspend-resume-hook (function (lambda () (message "Resumed!")))) => (lambda nil (message "Resumed!")) (suspend-emacs "pwd") => nil ---------- Buffer: Minibuffer ---------- Really suspend? y ---------- Buffer: Minibuffer ---------- ---------- Parent Shell ---------- lewis@slug[23] % /user/lewis/manual lewis@slug[24] % fg ---------- Echo Area ---------- Resumed! |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
Emacsでは、さまざまな関数を介して オペレーティングシステム環境の変数を参照できます。 これらの変数には、システムの名前、ユーザーの識別番号UIDなどが 含まれます。
string-match
を使うことである。alpha-vms
aix-v3
berkeley-unix
dgux
gnu
gnu/linux
hpux
irix
ms-dos
next-mach
rtu
unisoft-unix
usg-unix-v
vax-vms
windows-nt
xenix
絶対に必要でない限り、細分類のために新たなシンボルを追加したくない! 実際、将来にはこれらのいくつかを削除することを願っている。 オペレーティングシステムの違いを区別するには、
system-configuration
を使うことを勧める。
(system-name) => "www.gnu.org" |
シンボルsystem-name
は、関数としても変数としても使えます。 実際、関数としては、変数system-name
が現在保持している値を返します。 したがって、Emacsが読者のシステム名に関して混乱している場合には、 変数system-name
に設定できます。 変数はフレームタイトルの作成にも有用です(see 節 28.4 フレームタイトル)。
nil
以外であると、system-name
のかわりに 電子メイルアドレスの生成に使われる。 たとえば、user-mail-address
のデフォルト値の作成に使われる。 see 節 37.4 ユーザーの識別。 (これはEmacsの始動時に行われるため、 Emacsをダンプしたときの値が実際に使われる値である。 see 節 B.1 Emacsの構築方法)。process-environment
に 保持されている。
(getenv "USER") => "lewis" lewis@slug[10] % printenv PATH=.:/user/lewis/bin:/usr/bin:/usr/local/bin USER=lewis TERM=ibmapa16 SHELL=/bin/csh HOME=/user/lewis |
process-environment
を修正することで動作する。 この変数をlet
で束縛しても十分に実用的である。getenv
とsetenv
は、この変数を用いて動作する。
process-environment => ("l=/usr/stanford/lib/gnuemacs/lisp" "PATH=.:/user/lewis/bin:/usr/class:/nfsusr/local/bin" "USER=lewis" "TERM=ibmapa16" "SHELL=/bin/csh" "HOME=/user/lewis") |
":"
であり、 MS-DOSとWidows NTでは";"
である。nil
である。nil
以外であると、サブディレクトリ`lib-src'と`etc'を 探すためのディレクトリである。 Emacsがこれらのディレクトリを標準のインストールディレクトリで みつけられなくてもEmacsの実行形式になんらかの意味で 関連するディレクトリでみつけられれば、nil
以外である。デフォルトでは、これらの値は、動作しようとしてるプロセスの平均個数を表す システムのロードアベレッジを100倍した整数である。 use-floatがnil
以外であると、 100倍しない浮動小数点数で返す。
(load-average) => (169 48 36) (load-average t) => (1.69 0.48 0.36) lewis@rocky[5] % uptime 11:55am up 1 day, 19:37, 3 users, load average: 1.69, 0.48, 0.36 |
t
かnil
であり、 基本操作をオンにするかオフにするかを表す。 デフォルトはnil
である。 関数は、成功すればt
を返し、さもなければnil
を返す。
第3引数getprvがnil
以外であると、 setprv
は基本操作を変更しないが、 その基本操作が現在オンであるかオフであるかを表す t
かnil
を返す。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
nil
である。 この値は、`-q'や`-u user'の コマンド行オプションを反映する。
カスタマイズファイルや他の種類のユーザープロフィールを ロードするLispパッケージは、それらを探す場所を判断するために この変数に従うこと。 この変数のユーザー名のカスタマイズをロードするべきである。 init-file-user
がnil
であると オプション`-q'が使われたことを意味し、 Lispパッケージはいかなるカスタマイズファイルや ユーザープロフィールもロードしないこと。
LOGNAME
が設定されていればその値を使う。 さもなければ、環境変数USER
が設定されていればその値を使う。 さもなければ、実UIDではなく実効UIDに基づいた値である。
UIDを指定すると、値は(整数である)UIDに 対応するユーザー名である。
(user-login-name) => "lewis" |
LOGNAME
とUSER
を無視する。NAME
が設定してあればその値を返す。
(user-full-name) => "Bil Lewis" |
uidがnil
以外であると、 それは整数のユーザー番号か文字列のログイン名であること。 すると、user-full-name
は、 そのユーザー番号かログイン名に対応するユーザーの氏名を返す。
シンボルuser-login-name
、user-real-login-name
、 user-full-name
は、関数でもある変数です。 関数としては、その変数が保持する値と同じ値を返します。 これらの変数により、関数として返す値を指定しておくことで Emacsを『ごまかせ』ます。 これらの変数は、フレームタイトルの作成にも有用です (see 節 28.4 フレームタイトル)。
(user-real-uid) => 19 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、現在時刻と時刻帯(タイムゾーン)を調べる方法を説明します。
substring
を使っても問題ない。 将来、文字列の末尾に追加情報を付加することもあるので、 文字列の末尾からではなく先頭から文字を数えるほうがよい。
引数time-valueを指定すると、 それは現在時刻のかわりに書式付けする時刻を指定する。 引数は、最初の2つの要素が整数であるリストであること。 したがって、current-time
(下記参照)や file-attributes
(see 節 24.6.4 ファイルに関する他の情報)で得た時刻を使える。
(current-time-string) => "Wed Oct 14 22:21:05 1987" |
(high low microsec)
で返す。 整数highとlowを組み合わせると 1970年1月1日0:00からの経過秒数を与える。 つまり、経過秒数は high * 2**16 + lowである。
第3要素microsecは、現在の秒内のミリ秒を表す (返す時間精度が秒のシステムでは0)。
最初の2つの要素は、関数file-attributes
で得られる ファイルに関する時刻の値と比較できる。 see 節 24.6.4 ファイルに関する他の情報。
値は、(offset name)
の形である。 ここで、offsetはUTC (11) に対して進んでいる(グリニッジの東)秒数を 与える整数である。 第2要素nameは、その時刻帯の名称を与える文字列である。 夏時間制が始まったり終ると、どちらの要素も変わる。 時刻帯には季節の時刻調整はないとユーザーが指定すると、 どちらの値も定数である。
値を計算するために必要な情報をオペレーティングシステムから得られないと リストのどちらの要素もnil
である。
引数time-valueを指定すると、 現在時刻のかわりに分析すべき時刻を指定する。 引数は、2つの整数を収めたコンスセルであるか、 最初の2つの要素が整数であるリストであること。 したがって、current-time
(上記参照)や file-attributes
(see 節 24.6.4 ファイルに関する他の情報)で得た時刻を使える。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
これらの関数は、時刻の値(2つか3つの整数から成るリスト)を 文字列や日時情報に変換します。 日時情報を時刻の値に変換する関数もあります。 時刻の値は、関数current-time
(see 節 37.5 時刻)や file-attributes
(see 節 24.6.4 ファイルに関する他の情報)で得られます。
多くのオペレーティングシステムでは、時刻の値を32ビットに制限しています。 これらのシステムでは、典型的には協定世界時1901年12月13日20:45:52から 2038年1月19日03:14:07までしか表現できません。 しかし、より大きな時刻の値を扱い、 より広い範囲の過去から未来を表現できるシステムもあります。
時刻変換関数は、グレゴリオ暦を導入するまえであっても つねにグレゴリオ暦を使います。 紀元前1年からの経過年数を数え、通常のグレゴリオ暦のように0年を飛ばしません。 たとえば、-37年は、グレゴリオ暦紀元前38年を表します。
これらの`%'列には、桁数やパディングの種類も指定できる。 printf
と同様に動作し、 `%'列のあいだに桁数を数字で指定する。 桁数を`0'で始めるとゼロでパディングすることを意味する。 桁数を`_'で始めると空白でパディングすることを意味する。
たとえば、`%S'は分内の秒数を指定し、 `%03S'はゼロでパディングして3桁にすることを意味し、 `%_3S'は空白でパディングして3桁にすることを意味する。 `%S'は普通はパディングして2桁にするため、 `%3S'だけであるとゼロでパディングする。
(seconds minutes hour day month year dow dst zone) |
各要素の意味はつぎのとおりである。
t
、さもなければnil
。Common Lispに関した注意: Common Lispでは、dowとzoneの意味が異なる。
decode-time
の逆である。 7項目から成る日時情報を時刻の値に変換する。 引数の意味については、上記decode-time
の一覧を参照。
100未満の年は普通の年として扱う。 それらを1900年代として扱いたい場合には、 encode-time
を呼び出すまえに修正しておくこと。
省略可能な引数zoneのデフォルトは、 現在の時刻帯とその夏時間制の規則である。 指定する場合には、(current-time-zone
で得られるような)リストであるか、 環境変数TZ
と同じ形式の文字列であるか、 (decode-time
で得られるような)整数であること。 指定した時刻帯は、夏時間の補正をせずに使われる。
encode-time
に7引数より多く渡すと、 始めの6つをsecondsからyearまでに、 最後の引数をzoneに使い、そのあいだの引数は無視する。 この機能は、decode-time
が返したリストの要素を つぎのようにしてencode-time
の引数に使うことを可能にする。
(apply 'encode-time (decode-time ...)) |
引数sec、minute、hour、day、monthの 値が範囲外になるようにすると単純な日時演算を行える。 たとえば、0日はその月のまえの日を意味する。
オペレーティングは可能な時刻の値の範囲を制限する。 その範囲を越える時刻を符号化しようとするとエラーになる。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
未来のある時刻に関数を呼び出したり、 ある一定期間なにもしないでいたら関数を呼び出すために タイマを設定できます。
Emacsは、Lispプログラムの任意の箇所ではタイマを実行できません。 サブプロセスからの出力を受け取るときにだけタイマを実行できます。 つまり、待つことが可能なsit-for
やread-event
などの 基本関数の内側や(入力を)待っているあいだに実行できます。 したがって、Emacsが忙しいとタイマの実行が遅れることがあります。 しかし、Emacsが暇ならば、タイマの実行はとても正確です。
絶対時刻をさまざまな書式で指定できる。 この関数は、よく使われる日時の書式を受け付けるように努める。 正しい書式にはつぎの2つを含む。
year-month-day hour:min:sec timezone hour:min:sec timezone month/day/year |
ここで、どちらの例のフィールドもすべて数である。 current-time-string
が返す書式、および、 他の書式も許される。
相対時刻を指定するには、単位を伴った数字を使う。 たとえばつぎのとおり。
timeが数(整数か浮動小数点数)であれば、 秒単位の相対時刻を指定する。
引数repeatは、呼び出しをどの程度頻繁に繰り返すかを指定する。 repeatがnil
であると、繰り返さずに 時刻timeに関数functionを一度だけ呼び出す。 repeatが数であると、繰り返し間隔を秒単位で指定する。
ほとんどの場合、最初の呼び出しではrepeatの効果はなく、 timeだけが時刻を指定する。 1つ例外があり、timeがt
であると、 時刻がrepeatの整数倍であるとタイマを実行する。 これはdisplay-time
のような関数に有用である。
関数run-at-time
は、予約した未来の特定の動作を 識別するタイマを返す。 この値は、cancel-timer
(下記参照)の呼び出しに使える。
with-timeout
はbodyの最後のフォームの値を返す。 しかし、時間が切れるとbodyの実行を取り止め、 with-timeout
はtimeout-formsをすべて実行し、 それらの最後の値を返す。
このマクロは、seconds秒後に動作するタイマを設定することで動作する。 その時間内にbodyが終了すれば、タイマを取り消す。 タイマが実際に動作するとbodyの実行を終了させてから、 timeout-formsを実行する。
プログラムから待つことが可能な基本関数を呼び出したときにのみ、 タイマはLispプログラム内で実行可能なため、 with-timeout
はbodyの計算途中では bodyの実行を停止できない。 それらが待つことが可能な基本関数の1つを呼び出したときにのみ停止できる。 したがって、長い計算を行わない入力を待つようなbodyに with-timeout
を使う。
関数y-or-n-p-with-timeout
は、 応答を長く待ちすぎないようにタイマを使った単純な例です。 See 節 19.6 Yes/Noの問い合わせ。
repeatがnil
であると、 これ以降にはじめてEmacsが十分長い期間なにもしないでいると、 タイマを一度だけ実行する。 しばしばrepeatはnil
以外であり、 Emacsがsecs秒なにもしないでいるたびに タイマを実行することを意味する。
関数run-with-idle-timer
は、 cancel-timer
(下記参照)の呼び出しに使えるタイマの値を返す。
Emacsがユーザー入力を待ち始めると『アイドル状態』になり、 なにか入力がくるまでアイドル状態のままです。 5秒間のアイドル状態で動作するタイマがあったとすると、 Emacsがアイドルになってから約5秒後にそのタイマが実行されます。 しかしrepeatが真(nil
以外)であったとしても、 そのタイマはEmacsがアイドル状態であり続ける限りは再実行されません。 アイドル状態の期間は単調に増加するので、再度5秒後には戻りません。
Emacsがアイドル状態のときにはさまざまなことを行います。 ガベッジコレクション、自動保存、サブプロセスからのデータの処理です。 しかし、アイドル状態中のこれらの動作はアイドルタイマに干渉しません。 アイドル状態の時間を0にしないからです。 600秒に設定されたアイドルタイマは、 最後のユーザーコマンドを終了してから10分後に実行されます。 たとえその10分間に、サブプロセスの出力を何千回も受け取ろうが、 ガベッジコレクションや自動保存を行ったとしてもです。
ユーザーが入力を与えると、その入力を実行中はEmacsは非アイドル状態です。 そして再度アイドル状態になり、 繰り返すように設定されたアイドルタイマを1つずつそれ以降に実行します。
run-at-time
や run-with-idle-timer
が返した値であること。 これは、run-at-time
の呼び出しの効果を取り消し、 その時刻になってもなにも特別なことは起こらない。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、端末入力を記録したり処理する関数や変数について述べます。 関連する関数については38. Emacsの画面表示を参照してください。
37.8.1 入力方式 Options for how input is processed. 37.8.2 入力イベントの変換 Low level conversion of some characters or events into others. 37.8.3 入力を記録する Saving histories of recent or all input events.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
nil
以外であると、 Emacsは入力割り込みを用いる。 nil
であると、CBREAKモードを用いる。 デフォルトの設定はシステムに依存する。 この指定に関わらずつねにCBREAKモードを用いるシステムもある。
EmacsがXと直接通信しているときは、 通信方法が割り込みであると承知していると この引数を無視して割り込みを使う。
flowがnil
以外であると、 Emacsは端末出力にフロー制御XON/XOFF(C-q、C-s)を用いる。 CBREAKモード以外ではこれの効果はない。 see 節 37.11 フロー制御。
引数metaは、文字コードが127を越える入力文字の扱い方を制御する。 metaがt
であると、8ビット目が立っている文字を メタ文字に変換する。 metaがnil
であると、8ビット目を無視する。 パリティビットを用いる端末では、これが必要である。 metaがt
でもnil
でもないと、 Emacsは入力した8ビットすべてを無変更で使う。 8ビット文字集合を使う端末には、これがよい。
quit-charがnil
以外であると、 中断に使用する文字を指定する。 通常、この文字はC-gである。 see 節 20.9 中断。
関数current-input-mode
は、Emacsが現在使用している 入力モードの設定を返します。
set-input-mode
の引数に対応する (interrupt flow meta quit)
の形の リストを返す。 各要素の意味はつぎのとおりである。
nil
以外であると、Emacsは割り込み駆動の入力を用いている。 nil
であると、EmacsはCBREAKモードを用いている。nil
以外であると、 Emacsは端末出力にフロー制御XON/XOFF(C-q、C-s) を用いている。 この値は、interruptがnil
の場合にのみ意味を持つ。t
である。 Emacsが各入力文字の8ビット目をつねに0にするときにはt
である。 さもなければ、Emacsは文字コードとして8ビットすべてを使っている。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、入力イベントをキー列の一部になるまえに別の 入力イベントに変換する機能について述べます。 これらの機能は、ここに述べる順に各イベントに適用されます。 つまり、各イベントはまずextra-keyboard-modifiers
に従って修正され、 つぎに(適切ならば)keyboard-translate-table
を介して変換され、 最後に指定されているキーボードコーディングシステムで復号化されます。 キー列の一部として読み取られるイベントであると、 読み取られるキー列に追加され、それを含む部分キー列を まずfunction-key-map
で検査してから、 つぎにkey-translation-map
で検査します。
ユーザーがキーボードのキーを打つたびに、 ビットマスクで指定した修飾キーが押し下げられているかのように キーを修正する。
ウィンドウシステムを使っているときには、 プログラムは任意の修飾キーを『押す』ことができる。 さもなければ、CTLとMETAのキーのみを 仮想的に押すことができる。
nil
である。
keyboard-translate-table
が文字テーブルであると、 キーボードから読み取った各文字をこの文字テーブルで探す。 みつけた値がnil
以外であると、 実際の入力文字のかわりにその値を使う。
つぎの例では、keyboard-translate-table
に文字テーブルを設定する。 そして、文字C-sとC-\、C-qとC-^を入れ換える。 これ以降、C-\を打つとC-sを打った効果があり、 その逆もそうである。 (この話題に関しては詳しくは、see 節 37.11 フロー制御。)
(defun evade-flow-control () "Replace C-s with C-\ and C-q with C-^." (interactive) (setq keyboard-translate-table (make-char-table 'keyboard-translate-table nil)) ;; C-sとC-\を入れ換える (aset keyboard-translate-table ?\034 ?\^s) (aset keyboard-translate-table ?\^s ?\034) ;; C-qとC-^を入れ換える (aset keyboard-translate-table ?\036 ?\^q) (aset keyboard-translate-table ?\^q ?\036)) |
この変換は、端末から読み取った文字に最初に行われる変換である。 recent-keys
のような記録機能やドリブルファイルは、 変換後の文字を記録する。
keyboard-translate-table
を変更する。 必要ならばキーボード変換表を作成する。残りの変換機能は、読み取ったキー列の部分列を変換します。 それらはread-key-sequence
に実装されていて、 read-event
で読む入力には効果はありません。
function-key-map
がキー列kを ベクトルvに『バインド』すると、 キー列のどこにkが現れても、 vのイベントで置き換える。
たとえば、端末VT100は、キーパッドのキーPF1を押すと ESC O Pを送出する。 したがって、Emacsではこの列を1つのイベントpf1
に変換したい。 VT100を使っているときにfunction-key-map
において ESC O Pを[pf1]
に『バインド』すれば、 これを行える。
つまり、C-c PF1を打つと 文字の列C-c ESC O Pが送出される。 のちに関数read-key-sequence
がこれをC-c PF1に戻し、 ベクトル[?\C-c pf1]
を返す。
マイナモード/ローカル/グローバルのキーマップに矛盾するような function-key-map
内の項目は無視される。 この意図は、ファンクションキーが送出する文字の列には それ独自のキーバインディングがあるべきではなく、 もしあったとしても、もとの定義を優先することである。
function-key-map
の値は、 端末のterminfoやtermcapの情報に従って自動的に普通は設定されるが、 端末固有のLispファイルの助けが必要な場合もある。 Emacsには、一般的な多くの端末向けの端末固有ファイルがある。 それらの主目的は、terminfoやtermcapから推定できないものを function-key-map
に定義することである。 see 節 37.1.3 端末固有の初期化。
function-key-map
と同様に 入力イベントを別の入力イベントへ変換するために用いる別のキーマップである。 function-key-map
とは2つの意味で異なる。
key-translation-map
は、 function-key-map
の変換後に使われる。 function-key-map
による変換結果を使う。
key-translation-map
は、実際のキーバインディングに優先する。 たとえば、key-translation-map
でC-x fにバインディングがあると、 グローバルマップにC-x fのバインディングがあったとしても 変換結果が効果を持つ。key-translation-map
の意図は、 self-insert-command
に普通はバインドされる通常の文字を含めて ユーザー向けに文字集合を別の文字集合に 対応付けられるようにすることである。
キーの『変換として』キー列のかわりに関数を用いると、 function-key-map
やkey-translation-map
は 単なる配置替え以上のことに使えます。 その関数で当該キーの変換を計算するのです。
キー変換関数は1つの引数を受け取ります。 その引数は、read-key-sequence
で指定されたプロンプトか、 エディタコマンドループがキー列を読み取っている場合にはnil
です。 多くの場合、プロンプトの値は無視できます。
関数自身が入力を読むときには、 後続のイベントを変更することもできます。 たとえば、後続の文字をハイパー文字にするC-c hの定義は つぎのようになります。
(defun hyperify (prompt) (let ((e (read-event))) (vector (if (numberp e) (logior (lsh 1 24) e) (if (memq 'hyper (event-modifiers e)) e (add-event-modifier "H-" e)))))) (defun add-event-modifier (string e) (let ((symbol (if (symbolp e) e (car e)))) (setq symbol (intern (concat string (symbol-name symbol)))) (if (symbolp e) symbol (cons symbol (cdr e))))) (define-key function-key-map "\C-ch" 'hyperify) |
set-keyboard-coding-system
を用いた キーボード文字集合の復号化を有効にしているときには、 上に述べた変換を終えてから復号化を行います。 See 節 32.10.6 1つの操作向けにコーディングシステムを指定する。 Emacsの将来の版では、他の変換のまえに復号化を行うでしょう。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
ドリブルファイルをクローズするには、 引数にnil
を指定してこの関数を呼び出す。
この関数は、バグ報告のために Emacsのバグを引き起こす入力を記録するために普通は使う。
(open-dribble-file "~/dribble") => nil |
関数open-termscript
(see 節 37.9 端末出力)も 参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
端末出力関数は、端末に出力を送ったり、 端末へ送った出力を記録します。 変数baud-rate
は、Emacsが考えている端末の出力速度を表します。
値の単位はボー(baud)である。
ネットワーク経由で使い、 ネットワークの異なる部分が異なる速度で動いているときには、 Emacsが返す値はローカル端末で使っている場合の値と異なるかもしれません。 リモートマシンへの通信速度でローカル端末と通信する ネットワークプロトコルもあり、 そのような場合、Emacsや他のプログラムは正しい値を得られます。 その他の場合では正しい値を得られません。 Emacsの値がまちがっているときには、 あまり最適でない決定をくだすでしょう。 この問題を修正するには、baud-rate
に設定します。
baud-rate
の値を返す。この関数の1つの用途は、ファンクションキーの定義を ダウンロード可能な端末のファンクションキーを定義することである。 たとえば、ファンクションキー4を(文字の列C-u C-fを 計算機に送って)4文字進めると定義にするには、 特定の端末ではつぎのようにする。
(send-string-to-terminal "\eF4\^U\^F") => nil |
nil
を返す。 タームスクリプトファイルは、 Emacsがスクリーンを乱してしまう問題、 誤ったtermcap定義やEmacsの実際のバグではない端末の望ましくない設定の 問題を調べるのに有用である。 どのような文字の列が実際に出力されるか確信できれば、 それらが使用中のtermcapのどの定義に対応するか調べられる。
37.8 端末入力のopen-dribble-file
も参照。
(open-termscript "../junk/termscript") => nil |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
システム固有のX11のキーシンボル(keysym)を定義するには、 変数system-key-alist
に設定します。
(code . symbol)
の形である。 ここで、codeは(『提供業者固有の』ビット -2**28を 含まない)数値のキーシンボルコードであり、 symbolはファンクションキーの名前である。
たとえば、(168 . mute-acute)
は、 数値コードが -2**28 + 168 であるHP Xサーバーが使うシステム固有キーを定義する。
実際に使用しているXサーバーのキーシンボルと衝突しなければ、 他のXサーバー向けのキーシンボルを連想リストから省かなくても問題ない。
変数は現在の端末につねにローカルであり、 バッファローカルにはなりえない。 see 節 28.2 複数ディスプレイ。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、 『Emacsがなぜコマンド文字集合の中からフロー制御文字を使うのか?』という 質問に答えたいと思います。 この話題に関する別の視点については、 配布に含まれるファイル`emacs/INSTALL'の中の フロー制御に関する記述を読んでください。 termcapの定義とDECの端末集線器については、 `emacs/etc/TERMS'を参照してください。
ある時期には、ほとんどの端末ではフロー制御を行っておらず、 C-s
とC-qをフロー制御に用いるものもありませんでした。 したがって、コマンド文字としてC-s
とC-qを選ぶことは 自然であり議論の余地はありませんでした。 キーに割り付けるべきコマンドがたくさんあったので、 ほとんどすべてのASCIIコントロール文字に意味を与えました。
のちに、フロー制御にこれらの文字を必要とする端末が導入されたのです。 それらはフルスクリーンエディタ向きの端末ではなかったので、 Emacsの保守陣はそれらを無視しました。 後年、C-sとC-qによるフロー制御が 端末で広く使われるようになりましたが、当時はそれはオプションでした。 Emacsユーザーの多くはフロー制御をオフにして、 フロー制御のために無意味なキーバインディングに 替えようとはしなかったのです。
Emacsと端末や集線器の製造業者のどちらの使い方が『正しい』でしょう? この問に簡単な答えはありません。
C-sとC-qで引き起こされる問題を解消するのに 気が進まないのは、C-sとC-qであることに理由がないからです。 文字ストリームに透過な別の(実用上一般的ではないが) フロー制御技術があります。 さらに、それらをフロー制御に使うのは正式な規格ではありません。 興味深いことですが、(1970年ころの)紙テープパンチャ付きの テレタイプモデル33では、計算機からパンチャをオン/オフするために C-sとC-qを送っていました!
ウィンドウシステムやPC端末エミュレータが文字端末を置き換えるようになり フロー制御の問題は徐々に解消しつつあります。 しばらくは、読者が望むならEmacsはフロー制御を オンにする手軽な方法を提供します。 関数enable-flow-control
を呼び出すのです。
keyboard-translate-table
(see 節 37.8.2 入力イベントの変換)を用いて C-\とC-^をそれらのかわりに使えるようにする。読者のファイル`.emacs'で関数enable-flow-control-on
を使えば、 特定の種類の端末で自動的にフロー制御をオンにできます。
(enable-flow-control-on "vt200" "vt300" "vt101" "vt131") |
enable-flow-control
が行う処理はつぎのとおりです。
(set-input-mode nil t)
で 端末入力をCBREAKモードに設定し、 オペレーティングシステムにフロー制御を行うように指示する。
keyboard-translate-table
を設定する。 非常に下位レベルであることを除けば、 EmacsはC-sやC-qを打ったと考えるので、 たとえ他のコマンドに対してもC-\やC-^を打ったとしても 実質的にはC-sやC-qを打ったことになる。 see 節 37.8.2 入力イベントの変換。端末側がフロー制御文字を発行するのであれば、 カーネルのフロー制御処理をオンにすれば、 その端末に対する普通のパディングより少なくしても動作するはずです。 termcapの定義をカスタマイズしてパディング量を減らします。 あるいは、baud-rate
に小さめの値を設定すると、 パディングの必要量の計算にEmacsは低い速度を使います。 See 節 37.9 端末出力。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
コマンド行オプション`-batch'は、 Emacsを非対話的に実行します。 このモードでは、Emacsは端末からコマンドを読まず、 端末のモードを変更せず、スクリーンに出力もしません。 これは、実行するLispプログラムを指定できるようにするためです。 それが終るとEmacsも終了します。 実行すべきプログラムは、 fileという名前のライブラリをロードする`-l file'、 および、 引数なしで関数functionを呼び出す`-f function'で 指定します。
バッチモードでは、ストリームとしてt
を指定した message
やprin1
などでエコー領域に 表示されるLispプログラムの出力は、 Emacsの標準エラー記述子へ出力されます。 したがって、Emacsは非対話的な アプリケーションプログラムのようにふるまいます。 (コマンドの表示などのEmacs自身がエコー領域に出力するものは 完全に抑制される。)
nil
以外である。[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |