[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37. オペレーティングシステムとのインターフェイス

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=System%20Interface"
"elisp/オペレーティングシステムとのインターフェイス"へのコメント(無し)

本章は、Emacsの起動と終了、 オペレーティングシステムの環境に収められた値の参照方法、 端末入出力とフロー制御についてです。

関連情報についてはSee 節 B.1 Emacsの構築方法。 また、端末やスクリーンに関係する オペレーティングシステムの状態情報については、 38. Emacsの画面表示も参照してください。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1 Emacsの始動

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Starting%20Up"
"elisp/Emacsの始動"へのコメント(無し)

本節では、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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.1 概要:始動時の動作手順

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Start-up%20Summary"
"elisp/概要:始動時の動作手順"へのコメント(無し)

Emacsが始動したときに行う(`startup.el'での) 処理の順序はつぎのとおりです。

  1. load-pathにある各ディレクトリファイルにおいて `subdirs.el'という名前のファイルを実行することで load-pathにサブディレクトリを追加する。

  2. LANGなどの環境変数で要求されていれば、 言語環境と端末のコーディングシステムを設定する。

  3. ウィンドウシステムを使用している場合には、 そのウィンドウシステム向けの初期化ライブラリをロードする。 そのライブラリ名は`term/windowsystem-win.el'である。

  4. 初期化オプションを処理する。 (初期化オプションの一部は、これより初期の段階で扱われる。)

  5. 必要ならば、ウィンドウフレームとフェイスを初期化する。

  6. ノーマルフックbefore-init-hookを実行する。

  7. オプション`-no-site-file'が指定されていなければ、 ライブラリ`site-start'をロードする。 このライブラリの名前は普通は`site-start.el'である。

  8. コマンド行で`-q'や`-batch'が指定されていなければ、 ファイル`~/.emacs'をロードする。 オプション`-u'で、`~'のかわりに用いるホームディレクトリを持つ 他のユーザー名を指定できる。

  9. inhibit-default-initnil以外でなければ、 ライブラリ`default'をロードする。 (コマンド行で`-q'を指定したり、 `-batch'モードでは、これを行わない。) ライブラリのファイル名は普通は`default.el'である。

  10. ノーマルフックafter-init-hookを実行する。

  11. バッファ`*scratch*'がカレントバッファであり 基本(fundamental)モードであるならば、 initial-major-modeに従ってメジャーモードを設定する。

  12. バッチモードやウィンドウシステムを用いていなければ、 あれば端末固有のLispファイルが存在するならロードする。

  13. inhibit-startup-echo-area-messageで抑制していなければ、 初期メッセージをエコー領域に表示する。

  14. コマンド行の引数を処理する。

  15. term-setup-hookを実行する。

  16. 初期化ファイルの指定に従って 選択されているフレームのパラメータを修正する frame-notice-user-settingsを呼び出す。

  17. window-setup-hookを実行する。 see 節 38.16 ウィンドウシステム

  18. 未処理のコマンド行引数(上の数手順)がなく、 inhibit-startup-messageの値がnilであり、 バッファが空であれば、 コピーレフト/無保証/基本的な利用情報を表示する。

User Option: inhibit-startup-message
この変数は、(無保証などの)初期の始動メッセージを禁止する。 これがnil以外であるとメッセージを表示しない。

始動メッセージの内容に十分慣れたら、 読者個人の初期化ファイルで設定できるようにこの変数がある。 新規ユーザーが受け取るはずである情報を隠してしまうため、 新規ユーザーの初期化ファイルや複数のユーザーに影響するような方法で この変数に設定しないこと。

User Option: inhibit-startup-echo-area-message
この変数は、エコー領域に表示する始動メッセージを制御する。 個人のファイル`.emacs'につぎのフォームを追加することで エコー領域の始動メッセージを抑制できる。

 
(setq inhibit-startup-echo-area-message
      "your-login-name")

Emacsは、読者のファイル`.emacs'で上に示した式を明示的に検査する。 読者のログイン名はLisp文字列定数として式に現れる必要がある。 inhibit-startup-echo-area-messageに同じ値を 設定する別の方法では、始動メッセージを禁止できない。

このように、望むならば自身のためにメッセージを簡単に禁止できるが、 読者の`.emacs'をむやみにコピーしても、 他人に対してはメッセージを禁止できない。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.2 初期化ファイル:`.emacs'

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Init%20File"
"elisp/初期化ファイル:`.emacs'"へのコメント(無し)

読者がEmacsを始動すると、Emacsは読者のホームディレクトリから ファイル`.emacs'を普通はロードしようとします。 このファイルが存在すれば、これにはLispコードを入れておく必要があります。 コマンド行オプション`-q'と`-u'は、 初期化ファイルの使い方に影響します。 `-q'は初期化ファイルをロードしないように指示し、 `-u'は読者の初期化ファイルのかわりに指定したユーザーの初期化ファイルを ロードするように指示します。 See 節 `Emacsの起動と終了' in

GNU Emacs マニュアル

デフォルトの初期化ファイルをサイトごとに持てます。 これは`default.el'という名前のライブラリです。 Emacsは、ライブラリを探索する標準パスから ファイル`default.el'を探します (see 節 14.1 プログラムからのロード方法)。 Emacsの配布には、このファイルは付属していません。 ローカルなカスタマイズのためにサイトで用意します。 バッチモードや`-q'を指定してある場合を除いて、 デフォルトの初期化ファイルが存在すると、 読者がEmacsを始動するたびにそれをロードします。 しかし、存在するなら、個人の初期化ファイルをさきにロードします。 そこでinhibit-default-initnil以外の値を設定してあると、 Emacsはそのあとファイル`default.el'をロードしません。

サイトごとのカスタマイズ向けの別のファイルは`site-start.el'です。 Emacsはユーザーの初期化ファイルをロードするまえに このファイルをロードします。 このファイルのロードを禁止するには オプション`-no-site-file'を使います。

Variable: site-run-file
この変数は、ユーザーの初期化ファイルよりさきに ロードするべきサイトごとのカスタマイズファイルを指定する。 普通の値は"site-start"である。 実際に効果があるようにこれを変更する唯一の方法は、 Emacsをダンプするまえに行うことである。

読者のファイル`.emacs'に大量のコードがある場合には、 `something.el'という名前の別のファイルへコピーして、 それをバイトコンパイルし(see 節 15. バイトコンパイル)、 読者のファイル`.emacs'では、load(see 節 14. ロード)で そのファイルをロードするようにします。

読者のファイル`.emacs'でよく使われるであろう さまざまなカスタマイズを行う方法の例については、 See 節 `初期化ファイルの例' in

GNU Emacs マニュアル

User Option: inhibit-default-init
この変数は、読者のEmacsセッションにおいては、 デフォルトの初期化ライブラリファイルをロードしないようにする。 その値がnil以外であるとデフォルトライブラリをロードしない。 デフォルト値はnilである。

Variable: before-init-hook
すべての初期化ファイル (ユーザーの初期化ファイル、 `default.el'と/あるいは`site-start.el')を ロードする直前に一度だけ実行するノーマルフック。 (実際の効果があるようにこれを変更する唯一の方法は、 Emacsをダンプするまえに行うことである。)

Variable: after-init-hook
すべての初期化ファイル (ユーザーの初期化ファイル、 `default.el'と/あるいは`site-start.el')をロード直後、 端末固有の初期化のまえに一度だけ実行するノーマルフック。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.3 端末固有の初期化

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Terminal-Specific"
"elisp/端末固有の初期化"へのコメント(無し)

端末の各種類ごとに、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-prefixnilを設定すると、 端末固有ライブラリをロードしないようにできます。 この機能は、読者独自のカスタマイズを試すときに有用です。

変数term-setup-hookに設定すれば、 端末固有ライブラリの特定の動作に優先できます。 これは、読者のファイル`.emacs'と端末固有ライブラリの両者を ロードしたあとの初期化後にEmacsが実行するノーマルフックです。 端末専用ライブラリがない端末向けの初期化を定義するために この変数を使えます。 See 節 22.6 フック

Variable: term-file-prefix
変数term-file-prefixnil以外であると、 Emacsは、つぎのように端末固有の初期化ファイルをロードする。

 
(load (concat term-file-prefix (getenv "TERM")))

端末固有の初期化ファイルをロードしたくない場合には、 読者のファイル`.emacs'で 変数term-file-prefixnilを設定する。 それには、読者のファイル`.emacs'に (setq term-file-prefix nil)を入れる。

Variable: term-setup-hook
この変数は、読者のファイル`.emacs'、 (あれば)デフォルトの初期化ファイル、 端末固有のLispファイルをロードしたあとにEmacsが実行する ノーマルフックである。

端末固有ファイルの定義に優先するためにterm-setup-hookを使える。

関連する機能については、 38.16 ウィンドウシステムwindow-setup-hookを参照してください。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.1.4 コマンド行引数

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Command%20Line%20Arguments"
"elisp/コマンド行引数"へのコメント(無し)

Emacsを始動するときにコマンド行引数を使ってさまざまな動作を要求できます。 一日に一度より多くEmacsを始動する必要はないでしょうし、 しばしばEmacsセッションをそれより長く動かし続けるでしょうから、 コマンド行引数はほとんど使いません。 実際、コマンド行引数を使う癖は避けたほうがよいです。 そのような癖をつけると、Emacsを必要以上に終了したり再始動するからです。 これらのオプションは2つの理由で存在します。 (別のプログラムから起動される)他のエディタと互換性があるようにするのと、 シェルスクリプトから特定のLispプログラムを実行できるようにするためです。

本節では、Emacsがコマンド行引数を処理する方法と、 それらをカスタマイズする方法について述べます。

Function: command-line
この関数は、Emacsを呼び出すときに指定されたコマンド行引数を解析して処理し、 ユーザーのファイル`.emacs'をロードし始動メッセージを表示する。

Variable: command-line-processed
この変数の値は、コマンド行引数を一度処理し終えるとtである。

dump-emacsを呼んでEmacsを再ダンプするときには、 この変数にnilを設定すれば、 新たにダンプしたEmacsでコマンド行引数を処理するようにできる。

Variable: command-switch-alist
この変数の値は、ユーザー定義のコマンド行オプションの連想リストである。 この変数は、読者が要素を追加できるように存在する。

コマンド行オプション(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

GNU Emacs マニュアル
も参照。

Variable: command-line-args
この変数の値は、Emacsに渡されたコマンド行引数のリストである。

Variable: command-line-functions
この変数の値は、認識できないコマンド行引数を処理する関数のリストである。 つぎに処理する引数に特別な意味がないと、 このリストの関数をnil以外の値を返すまで現れる順に呼び出す。

これらの関数は引数なしで呼び出される。 これらの関数では、呼び出し時に束縛される変数argiを介して 対象となるコマンド行引数を参照できる。 (いま対象となっている引数を除く)残りの引数は 変数command-line-args-leftにある。

関数がargiを認識して処理したときには、 その引数を処理したことを表すためにnil以外の値を返すこと。 後続の引数の一部も処理した場合には、 command-line-args-leftから それらを削除することで処理したことを示せる。

これらの関数すべてがnilを返すと、 訪問するファイル名として引数を用いる。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.2 Emacsから抜ける

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Getting%20Out"
"elisp/Emacsから抜ける"へのコメント(無し)

Emacsから抜けるには2つの方法があります。 Emacsを終了するためにEmacsジョブをキルするか、 あとでEmacsを継続できるように休止します。 実用上は、ログアウトするとき以外にはEmacsをほとんど終了しないでしょう。 Emacsを休止するほうが一般的です。

37.2.1 Emacsの終了    Exiting Emacs irreversibly.
37.2.2 Emacsの休止    Exiting Emacs reversibly.



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.2.1 Emacsの終了

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Killing%20Emacs"
"elisp/Emacsの終了"へのコメント(無し)

Emacsを終了するとは、Emacsプロセスの実行を終らせることを意味します。 親プロセスが普通は制御を取り戻します。 Emacsを終了するための下位の基本関数はkill-emacsです。

Function: kill-emacs &optional exit-data
この関数は、Emacsプロセスを終了しEmacsを終える。

exit-dataが整数であると、Emacsプロセスの終了状態として使われる。 (これは主にバッチ処理で有用である。 37.12 バッチモードを参照。)

exit-dataが文字列であると、 その内容を端末入力バッファへ詰め込み、 シェル(やつぎに入力を読むプログラム)がそれらを読み取れるようにする。

保存済みのファイルを除くEmacsプロセス内のすべての情報は、 Emacsを終了すると失われます。 Emacsを不注意に終了すると多くの作業を失うことになるので、 保存する必要があるバッファがあったり動作中のサブプロセスがあると、 Emacsは確認を求めます。 これは関数save-buffers-kill-emacsが行います。

Variable: kill-emacs-query-functions
標準的な問い合わせをしたあとで、 save-buffers-kill-emacsは、 リストkill-emacs-query-functions内の関数を 現れる順に引数なしで呼び出す。 これらの関数では、ユーザーにさらなる確認を求めることができる。 これらのどれかがnilを返すと、Emacsは終了しない。

Variable: kill-emacs-hook
この変数はノーマルフックである。 save-buffers-kill-emacsがファイルをすべて保存し確認し終えると、 このフックの関数群を実行する。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.2.2 Emacsの休止

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Suspending%20Emacs"
"elisp/Emacsの休止"へのコメント(無し)

Emacsを休止するとは、Emacsを一時的に停止し、 普通はシェルである親プロセスに制御を戻すことです。 これにより、あとで同じEmacsプロセスで、つまり、同じバッファ群、 同じキルリング、同じアンドゥ履歴などで編集を再開できます。 Emacsを再開するには、親シェルにおいて ほとんどの場合fgなどの適切なコマンドを使います。

ジョブの休止を扱えないオペレーティングシステムもあります。 そのようなシステムでは、『休止』はEmacsのサブプロセスとして 一時的に新たなシェルを実際には作成します。 そのシェルを終了するとEmacsに戻ります。

ウィンドウシステムを使っている場合には、 Emacsジョブを再開する親プロセスがいないかもしれませんし、 別のウィンドウへ移動すれば別のジョブへ入力できますから、 Emacsの休止は有用ではありません。 したがって、Emacsがウィンドウシステムを使っている場合には、 休止できません。

Function: suspend-emacs string
この関数は、Emacsを休止し、親プロセスへ制御を戻す。 親プロセスがEmacsを再開した場合にのみ、 suspend-emacsはLisp内の呼び出し側へnilを返す。

stringnil以外であると、 Emacsの親シェルが端末入力として読めるようにその文字群を送る。 親シェルはstringの文字群を表示せず、 その結果のみが現れる。

休止するまえに、suspend-emacsは ノーマルフックsuspend-hookを実行する。

ユーザーがEmacsを再開すると、suspend-emacsは ノーマルフックsuspend-resume-hookを実行する。 see 節 22.6 フック

再開後のつぎの再表示では、 変数no-redraw-on-reenternilならば スクリーン全体を再描画する。 (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!

Variable: suspend-hook
この変数は、休止するまえに実行されるノーマルフックである。

Variable: suspend-resume-hook
この変数は、再開後に実行されるノーマルフックである。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.3 オペレーティングシステム環境

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=System%20Environment"
"elisp/オペレーティングシステム環境"へのコメント(無し)

Emacsでは、さまざまな関数を介して オペレーティングシステム環境の変数を参照できます。 これらの変数には、システムの名前、ユーザーの識別番号UIDなどが 含まれます。

Variable: system-configuration
この変数は、読者のシステムのハードウェア/ソフトウェア構成に対する GNUの構成名を文字列で保持している。 この文字列の一部分を検査する簡便な方法は string-matchを使うことである。

Variable: system-type
この変数の値は、Emacsが動作している オペレーティングシステムの種類を表すシンボルである。 つぎに可能な値の一覧を示す。

alpha-vms
Alphaマシン上のVMS。

aix-v3
AIX。

berkeley-unix
バークレーBSD。

dgux
データジェネラルDGUXオペレーティングシステム。

gnu
(HURDかMachから成るGNUカーネルを使っている)GNUシステム。

gnu/linux
GNU/Linuxシステム。 つまり、Linuxカーネルを用いたGNUシステムの変種。 (これらのシステムは人々が『Linux』と呼ぶものの1つであるが、 Linxuは実際にはカーネルのみであり、システム全体ではない。)

hpux
ヒューレットパッカードHPUXオペレーティングシステム。

irix
シリコングラフィックスIrixシステム。

ms-dos
マイクロソフトMS-DOS『オペレーティングシステム』。

next-mach
NeXTのMachベースのシステム。

rtu
マスコンプRTU、UCBユニバース。

unisoft-unix
ユニソフトUniPlus。

usg-unix-v
AT&T System V。

vax-vms
VAX VMS。

windows-nt
マイクロソフトWindows NT。

xenix
SCO Xenix 386。

絶対に必要でない限り、細分類のために新たなシンボルを追加したくない! 実際、将来にはこれらのいくつかを削除することを願っている。 オペレーティングシステムの違いを区別するには、 system-configurationを使うことを勧める。

Function: system-name
この関数は読者が使っているマシンの名前を返す。
 
(system-name)
     => "www.gnu.org"

シンボルsystem-nameは、関数としても変数としても使えます。 実際、関数としては、変数system-nameが現在保持している値を返します。 したがって、Emacsが読者のシステム名に関して混乱している場合には、 変数system-nameに設定できます。 変数はフレームタイトルの作成にも有用です(see 節 28.4 フレームタイトル)。

Variable: mail-host-address
この変数がnil以外であると、system-nameのかわりに 電子メイルアドレスの生成に使われる。 たとえば、user-mail-addressのデフォルト値の作成に使われる。 see 節 37.4 ユーザーの識別。 (これはEmacsの始動時に行われるため、 Emacsをダンプしたときの値が実際に使われる値である。 see 節 B.1 Emacsの構築方法)。

Function: getenv var
この関数は、環境変数varの値を文字列で返す。 Emacs内部では、環境変数の値はLisp変数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

コマンド: setenv variable value
このコマンドは、環境変数variableに値valueを設定する。 どちらの引数も文字列である。 この関数はprocess-environmentを修正することで動作する。 この変数をletで束縛しても十分に実用的である。

Variable: process-environment
この変数は、各要素が1つの環境変数を記述する文字列のリストである。 関数getenvsetenvは、この変数を用いて動作する。

 
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")

Variable: path-separator
この変数は、(環境変数などで)探索パスを 区切る文字を指定する文字列を保持する。 UNIXとGNUシステムではその値は":"であり、 MS-DOSとWidows NTでは";"である。

Variable: invocation-name
この変数は、起動したEmacsのプログラム名を保持する。 値は文字列であり、ディレクトリ名は含まない。

Variable: invocation-directory
この変数は、起動したEmacsの実行形式のディレクトリを保持する。 ディレクトリを判別できない場合にはnilである。

Variable: installation-directory
nil以外であると、サブディレクトリ`lib-src'と`etc'を 探すためのディレクトリである。 Emacsがこれらのディレクトリを標準のインストールディレクトリで みつけられなくてもEmacsの実行形式になんらかの意味で 関連するディレクトリでみつけられれば、nil以外である。

Function: load-average &optional use-float
この関数は、1分間/5分間/15分間のロードアベレッジ (負荷平均)をリストで返す。

デフォルトでは、これらの値は、動作しようとしてるプロセスの平均個数を表す システムのロードアベレッジを100倍した整数である。 use-floatnil以外であると、 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

Function: emacs-pid
この関数は、Emacsプロセスのプロセス番号IDを返す。

Variable: tty-erase-char
この変数は、Emacsが始動するまえに システムの端末ドライバが選んでいた消去文字を保持する。

Function: setprv privilege-name &optional setp getprv
この関数は、(UNIX上には存在しない)VMS基本操作を設定/再設定する。 最初の引数は文字列で表した基本操作の名前である。 第2引数setptnilであり、 基本操作をオンにするかオフにするかを表す。 デフォルトはnilである。 関数は、成功すればtを返し、さもなければnilを返す。

第3引数getprvnil以外であると、 setprvは基本操作を変更しないが、 その基本操作が現在オンであるかオフであるかを表す tnilを返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.4 ユーザーの識別

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=User%20Identification"
"elisp/ユーザーの識別"へのコメント(無し)

Variable: init-file-user
この変数は、Emacsが使用すべきユーザー初期化ファイルを指定する。 あるいは、そのようなものがなければnilである。 この値は、`-q'や`-u user'の コマンド行オプションを反映する。

カスタマイズファイルや他の種類のユーザープロフィールを ロードするLispパッケージは、それらを探す場所を判断するために この変数に従うこと。 この変数のユーザー名のカスタマイズをロードするべきである。 init-file-usernilであると オプション`-q'が使われたことを意味し、 Lispパッケージはいかなるカスタマイズファイルや ユーザープロフィールもロードしないこと。

Variable: user-mail-address
これは、Emacsを使用しているユーザーの通常の電子メイルアドレスを保持する。 Emacsは通常、読者の初期化ファイルを読み取ったあと、 この変数が未設定であるとデフォルト値を設定する。 したがって、デフォルト値を使いたくない場合には、 読者のファイル`~/.emacs'で別の値に設定できる。

Function: user-login-name &optional uid
uidを指定しないと、 この関数はログインしたユーザー名を返す。 環境変数LOGNAMEが設定されていればその値を使う。 さもなければ、環境変数USERが設定されていればその値を使う。 さもなければ、実UIDではなく実効UIDに基づいた値である。

UIDを指定すると、値は(整数である)UIDに 対応するユーザー名である。

 
(user-login-name)
     => "lewis"

Function: user-real-login-name
この関数は、Emacsの実UIDに対応するユーザー名を返す。 これは、実効UIDや環境変数LOGNAMEUSERを無視する。

Function: user-full-name &optional uid
この関数は、ログインしたユーザーの氏名を返す。 あるいは、環境変数NAMEが設定してあればその値を返す。

 
(user-full-name)
     => "Bil Lewis"

uidnil以外であると、 それは整数のユーザー番号か文字列のログイン名であること。 すると、user-full-nameは、 そのユーザー番号かログイン名に対応するユーザーの氏名を返す。

シンボルuser-login-nameuser-real-login-nameuser-full-nameは、関数でもある変数です。 関数としては、その変数が保持する値と同じ値を返します。 これらの変数により、関数として返す値を指定しておくことで Emacsを『ごまかせ』ます。 これらの変数は、フレームタイトルの作成にも有用です (see 節 28.4 フレームタイトル)。

Function: user-real-uid
この関数は、ユーザーの実UIDを返す。

 
(user-real-uid)
     => 19

Function: user-uid
この関数は、ユーザーの実効UIDを返す。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.5 時刻

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Time%20of%20Day"
"elisp/時刻"へのコメント(無し)

本節では、現在時刻と時刻帯(タイムゾーン)を調べる方法を説明します。

Function: current-time-string &optional time-value
この関数は、人間向けの文字列で現在時刻と日付を返す。 文字列の書式は不変であり、各部分の文字数はつねに同じなので、 各部分を取り出すのにsubstringを使っても問題ない。 将来、文字列の末尾に追加情報を付加することもあるので、 文字列の末尾からではなく先頭から文字を数えるほうがよい。

引数time-valueを指定すると、 それは現在時刻のかわりに書式付けする時刻を指定する。 引数は、最初の2つの要素が整数であるリストであること。 したがって、current-time(下記参照)や file-attributes(see 節 24.6.4 ファイルに関する他の情報)で得た時刻を使える。

 
(current-time-string)
     => "Wed Oct 14 22:21:05 1987"

Function: current-time
この関数は、システムの時刻の値を 3つの整数のリスト(high low microsec)で返す。 整数highlowを組み合わせると 1970年1月1日0:00からの経過秒数を与える。 つまり、経過秒数は high * 2**16 + lowである。

第3要素microsecは、現在の秒内のミリ秒を表す (返す時間精度が秒のシステムでは0)。

最初の2つの要素は、関数file-attributesで得られる ファイルに関する時刻の値と比較できる。 see 節 24.6.4 ファイルに関する他の情報

Function: current-time-zone &optional time-value
この関数は、ユーザーの地域の時刻帯を記述するリストを返す。

値は、(offset name)の形である。 ここで、offsetはUTC (11) に対して進んでいる(グリニッジの東)秒数を 与える整数である。 第2要素nameは、その時刻帯の名称を与える文字列である。 夏時間制が始まったり終ると、どちらの要素も変わる。 時刻帯には季節の時刻調整はないとユーザーが指定すると、 どちらの値も定数である。

値を計算するために必要な情報をオペレーティングシステムから得られないと リストのどちらの要素もnilである。

引数time-valueを指定すると、 現在時刻のかわりに分析すべき時刻を指定する。 引数は、2つの整数を収めたコンスセルであるか、 最初の2つの要素が整数であるリストであること。 したがって、current-time(上記参照)や file-attributes(see 節 24.6.4 ファイルに関する他の情報)で得た時刻を使える。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.6 時刻の変換

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Time%20Conversion"
"elisp/時刻の変換"へのコメント(無し)

これらの関数は、時刻の値(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年を表します。

Function: format-time-string format-string time
この関数は、timeformat-stringに従って文字列に変換する。 引数format-stringには、時刻のさまざまな部分で置き換えられる `%'列を含んでよい。 `%'列の意味を以下に示す。

`%a'
曜日の省略名を表す。
`%A'
曜日の(省略しない)名称を表す。
`%b'
月の省略名を表す。
`%B'
月の(省略しない)名称を表す。
`%c'
`%x %X'の同義語。
`%C'
これにはローケル固有の意味がある。 デフォルトのローケル(`C')では、`%A, %B %e, %Y'と等価。
`%d'
ゼロでパディングした月内の日。
`%D'
`%m/%d/%y'の同義語。
`%e'
空白でパディングした月内の日。
`%h'
`%b'の同義語。
`%H'
時(00-23)を表す。
`%I'
時(00-12)を表す。
`%j'
年内の日(001-366)を表す。
`%k'
空白でパディングした時(0-23)を表す。
`%l'
空白でパディングした時(0-12)を表す。
`%m'
月(01-12)を表す。
`%M'
分(00-59)を表す。
`%n'
改行を表す。
`%p'
`AM'か`PM'の適切なほうを表す。
`%r'
`%I:%M:%S %p'の同義語。
`%R'
`%H:%M'の同義語。
`%S'
秒(00-60)を表す。
`%t'
タブ文字を表す。
`%T'
`%H:%M:%S'の同義語。
`%U'
日曜日を週の始まりと仮定した年内の週(01-52)を表す。
`%w'
数字で表した曜日(0-6)。 日曜日を0とする。
`%W'
月曜日を週の始まりと仮定した年内の週(01-52)を表す。
`%x'
これにはローケル固有の意味がある。 デフォルトのローケル(`C')では、`%D'と等価。
`%X'
これにはローケル固有の意味がある。 デフォルトのローケル(`C')では、`%T'と等価。
`%y'
年の下2桁(00-99)を表す。
`%Y'
100年単位の年を表す。
`%Z'
時刻帯の省略名を表す。

これらの`%'列には、桁数やパディングの種類も指定できる。 printfと同様に動作し、 `%'列のあいだに桁数を数字で指定する。 桁数を`0'で始めるとゼロでパディングすることを意味する。 桁数を`_'で始めると空白でパディングすることを意味する。

たとえば、`%S'は分内の秒数を指定し、 `%03S'はゼロでパディングして3桁にすることを意味し、 `%_3S'は空白でパディングして3桁にすることを意味する。 `%S'は普通はパディングして2桁にするため、 `%3S'だけであるとゼロでパディングする。

Function: decode-time time
この関数は、時刻の値を日時情報に変換する。 戻り値は、つぎの9要素のリストである。

 
(seconds minutes hour day month year dow dst zone)

各要素の意味はつぎのとおりである。

sec
0から59の整数で表した分内の秒数。
minute
0から59の整数で表した時内の分数。
hour
0から23の整数で表した日内の時。
day
1から31の整数で表した月内の日。
month
1から12の整数で表した年内の月。
year
年。 典型的には1900より大きい。
dow
日曜日を0とした0から6の整数で表した曜日。
dst
夏時間制が有効であるとt、さもなければnil
zone
グリニッジから東周りではかった時刻帯を表す秒数。

Common Lispに関した注意: Common Lispでは、dowzoneの意味が異なる。

Function: encode-time seconds minutes hour day month year &optional ...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 ...))

引数secminutehourdaymonthの 値が範囲外になるようにすると単純な日時演算を行える。 たとえば、0日はその月のまえの日を意味する。

オペレーティングは可能な時刻の値の範囲を制限する。 その範囲を越える時刻を符号化しようとするとエラーになる。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.7 遅延実行のためのタイマ

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Timers"
"elisp/遅延実行のためのタイマ"へのコメント(無し)

未来のある時刻に関数を呼び出したり、 ある一定期間なにもしないでいたら関数を呼び出すために タイマを設定できます。

Emacsは、Lispプログラムの任意の箇所ではタイマを実行できません。 サブプロセスからの出力を受け取るときにだけタイマを実行できます。 つまり、待つことが可能sit-forread-eventなどの 基本関数の内側や(入力を)待っているあいだに実行できます。 したがって、Emacsが忙しいとタイマの実行が遅れることがあります。 しかし、Emacsが暇ならば、タイマの実行はとても正確です。

Function: run-at-time time repeat function &rest args
この関数は、時刻timeに引数argsで 関数functionを呼び出すように予約する。 引数functionはのちに呼び出される関数であり、 引数argsはそれを呼び出すときに与える引数である。 時刻timeは文字列で指定する。

絶対時刻をさまざまな書式で指定できる。 この関数は、よく使われる日時の書式を受け付けるように努める。 正しい書式にはつぎの2つを含む。

 
year-month-day hour:min:sec timezone

hour:min:sec timezone month/day/year

ここで、どちらの例のフィールドもすべて数である。 current-time-stringが返す書式、および、 他の書式も許される。

相対時刻を指定するには、単位を伴った数字を使う。 たとえばつぎのとおり。

`1 min'
今から1分後。
`1 min 5 sec'
今から65秒後。
`1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year'
今からちょうど103ヵ月、123日、10862秒後。 (12)

timeが数(整数か浮動小数点数)であれば、 秒単位の相対時刻を指定する。

引数repeatは、呼び出しをどの程度頻繁に繰り返すかを指定する。 repeatnilであると、繰り返さずに 時刻timeに関数functionを一度だけ呼び出す。 repeatが数であると、繰り返し間隔を秒単位で指定する。

ほとんどの場合、最初の呼び出しではrepeatの効果はなく、 timeだけが時刻を指定する。 1つ例外があり、timetであると、 時刻がrepeatの整数倍であるとタイマを実行する。 これはdisplay-timeのような関数に有用である。

関数run-at-timeは、予約した未来の特定の動作を 識別するタイマを返す。 この値は、cancel-timer(下記参照)の呼び出しに使える。

Macro: with-timeout (seconds timeout-forms...) body...
bodyを実行するが、seconds秒でその実行を諦める。 時間が切れるまえにbodyが終了すると with-timeoutbodyの最後のフォームの値を返す。 しかし、時間が切れるとbodyの実行を取り止め、 with-timeouttimeout-formsをすべて実行し、 それらの最後の値を返す。

このマクロは、seconds秒後に動作するタイマを設定することで動作する。 その時間内にbodyが終了すれば、タイマを取り消す。 タイマが実際に動作するとbodyの実行を終了させてから、 timeout-formsを実行する。

プログラムから待つことが可能な基本関数を呼び出したときにのみ、 タイマはLispプログラム内で実行可能なため、 with-timeoutbodyの計算途中では bodyの実行を停止できない。 それらが待つことが可能な基本関数の1つを呼び出したときにのみ停止できる。 したがって、長い計算を行わない入力を待つようなbodywith-timeoutを使う。

関数y-or-n-p-with-timeoutは、 応答を長く待ちすぎないようにタイマを使った単純な例です。 See 節 19.6 Yes/Noの問い合わせ

Function: run-with-idle-timer secs repeat function &rest args
Emacsがsecs秒間なにもしないときに実行するタイマを設定する。 secsの値は整数でも浮動小数点数でもよい。

repeatnilであると、 これ以降にはじめてEmacsが十分長い期間なにもしないでいると、 タイマを一度だけ実行する。 しばしばrepeatnil以外であり、 Emacsがsecs秒なにもしないでいるたびに タイマを実行することを意味する。

関数run-with-idle-timerは、 cancel-timer(下記参照)の呼び出しに使えるタイマの値を返す。

Emacsがユーザー入力を待ち始めると『アイドル状態』になり、 なにか入力がくるまでアイドル状態のままです。 5秒間のアイドル状態で動作するタイマがあったとすると、 Emacsがアイドルになってから約5秒後にそのタイマが実行されます。 しかしrepeatが真(nil以外)であったとしても、 そのタイマはEmacsがアイドル状態であり続ける限りは再実行されません。 アイドル状態の期間は単調に増加するので、再度5秒後には戻りません。

Emacsがアイドル状態のときにはさまざまなことを行います。 ガベッジコレクション、自動保存、サブプロセスからのデータの処理です。 しかし、アイドル状態中のこれらの動作はアイドルタイマに干渉しません。 アイドル状態の時間を0にしないからです。 600秒に設定されたアイドルタイマは、 最後のユーザーコマンドを終了してから10分後に実行されます。 たとえその10分間に、サブプロセスの出力を何千回も受け取ろうが、 ガベッジコレクションや自動保存を行ったとしてもです。

ユーザーが入力を与えると、その入力を実行中はEmacsは非アイドル状態です。 そして再度アイドル状態になり、 繰り返すように設定されたアイドルタイマを1つずつそれ以降に実行します。

Function: cancel-timer timer
タイマtimerの予約を取り消す。 timerは、以前にrun-at-timerun-with-idle-timerが返した値であること。 これは、run-at-timeの呼び出しの効果を取り消し、 その時刻になってもなにも特別なことは起こらない。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.8 端末入力

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Terminal%20Input"
"elisp/端末入力"へのコメント(無し)

本節では、端末入力を記録したり処理する関数や変数について述べます。 関連する関数については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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.8.1 入力方式

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Input%20Modes"
"elisp/入力方式"へのコメント(無し)

Function: set-input-mode interrupt flow meta quit-char
この関数は、キーボード入力を読み取るモードを設定する。 interruptnil以外であると、 Emacsは入力割り込みを用いる。 nilであると、CBREAKモードを用いる。 デフォルトの設定はシステムに依存する。 この指定に関わらずつねにCBREAKモードを用いるシステムもある。

EmacsがXと直接通信しているときは、 通信方法が割り込みであると承知していると この引数を無視して割り込みを使う。

flownil以外であると、 Emacsは端末出力にフロー制御XON/XOFF(C-qC-s)を用いる。 CBREAKモード以外ではこれの効果はない。 see 節 37.11 フロー制御

引数metaは、文字コードが127を越える入力文字の扱い方を制御する。 metatであると、8ビット目が立っている文字を メタ文字に変換する。 metanilであると、8ビット目を無視する。 パリティビットを用いる端末では、これが必要である。 metatでもnilでもないと、 Emacsは入力した8ビットすべてを無変更で使う。 8ビット文字集合を使う端末には、これがよい。

quit-charnil以外であると、 中断に使用する文字を指定する。 通常、この文字はC-gである。 see 節 20.9 中断

関数current-input-modeは、Emacsが現在使用している 入力モードの設定を返します。

Function: current-input-mode
この関数は、キーボード入力を読み取るための現在のモードを返す。 set-input-modeの引数に対応する (interrupt flow meta quit)の形の リストを返す。 各要素の意味はつぎのとおりである。
interrupt
nil以外であると、Emacsは割り込み駆動の入力を用いている。 nilであると、EmacsはCBREAKモードを用いている。
flow
nil以外であると、 Emacsは端末出力にフロー制御XON/XOFF(C-qC-s) を用いている。 この値は、interruptnilの場合にのみ意味を持つ。
meta
Emacsが入力文字の8ビット目をメタビットとして扱うときにはtである。 Emacsが各入力文字の8ビット目をつねに0にするときにはtである。 さもなければ、Emacsは文字コードとして8ビットすべてを使っている。
quit
現在Emacsが中断に使っている文字であり、普通はC-gである。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.8.2 入力イベントの変換

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Translating%20Input"
"elisp/入力イベントの変換"へのコメント(無し)

本節では、入力イベントをキー列の一部になるまえに別の 入力イベントに変換する機能について述べます。 これらの機能は、ここに述べる順に各イベントに適用されます。 つまり、各イベントはまずextra-keyboard-modifiersに従って修正され、 つぎに(適切ならば)keyboard-translate-tableを介して変換され、 最後に指定されているキーボードコーディングシステムで復号化されます。 キー列の一部として読み取られるイベントであると、 読み取られるキー列に追加され、それを含む部分キー列を まずfunction-key-mapで検査してから、 つぎにkey-translation-mapで検査します。

Variable: extra-keyboard-modifiers
この変数は、Lispプログラムがキーボード上の 修飾キーを『押す』ことができるようにする。

1
SHIFTキー。
2
LOCKキー。
4
CTLキー。
8
METAキー。

ユーザーがキーボードのキーを打つたびに、 ビットマスクで指定した修飾キーが押し下げられているかのように キーを修正する。

ウィンドウシステムを使っているときには、 プログラムは任意の修飾キーを『押す』ことができる。 さもなければ、CTLMETAのキーのみを 仮想的に押すことができる。

Variable: keyboard-translate-table
この変数は、キーボード文字の変換表である。 これにより、コマンドのバインディングを変更せずに、 キーボードのキー配置を変更できる。 その値は普通は文字テーブルであるか、あるいは、nilである。

keyboard-translate-tableが文字テーブルであると、 キーボードから読み取った各文字をこの文字テーブルで探す。 みつけた値がnil以外であると、 実際の入力文字のかわりにその値を使う。

つぎの例では、keyboard-translate-tableに文字テーブルを設定する。 そして、文字C-sC-\C-qC-^を入れ換える。 これ以降、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-sC-\を入れ換える
  (aset keyboard-translate-table ?\034 ?\^s)
  (aset keyboard-translate-table ?\^s ?\034)
  ;; C-qC-^を入れ換える
  (aset keyboard-translate-table ?\036 ?\^q)
  (aset keyboard-translate-table ?\^q ?\036))

この変換は、端末から読み取った文字に最初に行われる変換である。 recent-keysのような記録機能やドリブルファイルは、 変換後の文字を記録する。

Function: keyboard-translate from to
この関数は、文字コードfromを文字コードtoに変換するように keyboard-translate-tableを変更する。 必要ならばキーボード変換表を作成する。

残りの変換機能は、読み取ったキー列の部分列を変換します。 それらはread-key-sequenceに実装されていて、 read-eventで読む入力には効果はありません。

Variable: function-key-map
この変数は、普通の文字端末上のファンクションキーが 送出する文字の列を記述したキーマップを保持する。 このキーマップは他のキーマップと同じ構造であるが、使い方が異なる。 キー列のバインディングではなく、 読み取りつつあるキー列を変換する方法を指定する。

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 端末固有の初期化

Variable: key-translation-map
この変数は、function-key-mapと同様に 入力イベントを別の入力イベントへ変換するために用いる別のキーマップである。 function-key-mapとは2つの意味で異なる。

key-translation-mapの意図は、 self-insert-commandに普通はバインドされる通常の文字を含めて ユーザー向けに文字集合を別の文字集合に 対応付けられるようにすることである。

キーの『変換として』キー列のかわりに関数を用いると、 function-key-mapkey-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 ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.8.3 入力を記録する

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Recording%20Input"
"elisp/入力を記録する"へのコメント(無し)

Function: recent-keys
この関数は、キーボードやマウスからの最近の100個の入力イベントを収めた ベクトルを返す。 キー列として使われたかどうかに関わらず、すべてのイベントを含む。 したがって、キーボードマクロで生成したイベントを数えずに 最後の100個のイベントをつねに得ることになる。 (キーボードマクロで生成したイベントを省くのは、 それらはデバッグにはあまり役立たないからである。 キーボードマクロを起動したイベントが見えれば十分なはずである。)

コマンド: open-dribble-file filename
この関数は、filenameという名前のドリブルファイル (dribble file)をオープンする。 ドリブルファイルをオープンしていると、 (キーボードマクロを除く)キーボードやマウスからの各入力イベントを そのファイルに書き出す。 文字でないイベントは、その表示表現を`<...>'で囲って表す。

ドリブルファイルをクローズするには、 引数にnilを指定してこの関数を呼び出す。

この関数は、バグ報告のために Emacsのバグを引き起こす入力を記録するために普通は使う。

 
(open-dribble-file "~/dribble")
     => nil

関数open-termscript(see 節 37.9 端末出力)も 参照してください。



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.9 端末出力

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Terminal%20Output"
"elisp/端末出力"へのコメント(無し)

端末出力関数は、端末に出力を送ったり、 端末へ送った出力を記録します。 変数baud-rateは、Emacsが考えている端末の出力速度を表します。

Variable: baud-rate
この変数の値は、Emacsが関知する端末の出力速度である。 この変数に設定しても実際のデータ転送速度を変更しないが、 その値はパディングなどの計算に用いられる。 また、ウィンドウシステムを使っている場合であっても、 スクリーンのどの部分をスクロールするか、 あるいは、再描画するかの決定に影響する。 (このような決定を調整する方法を与えるために、 ウィンドウシステムには真の『出力速度』はないがこのように設計した。)

値の単位はボー(baud)である。

ネットワーク経由で使い、 ネットワークの異なる部分が異なる速度で動いているときには、 Emacsが返す値はローカル端末で使っている場合の値と異なるかもしれません。 リモートマシンへの通信速度でローカル端末と通信する ネットワークプロトコルもあり、 そのような場合、Emacsや他のプログラムは正しい値を得られます。 その他の場合では正しい値を得られません。 Emacsの値がまちがっているときには、 あまり最適でない決定をくだすでしょう。 この問題を修正するには、baud-rateに設定します。

Function: baud-rate
この廃れた関数は、変数baud-rateの値を返す。

Function: send-string-to-terminal string
この関数は、なにも変更せずに文字列stringを端末へ送る。 string内のコントロール文字は、端末に依存する効果を持つ。

この関数の1つの用途は、ファンクションキーの定義を ダウンロード可能な端末のファンクションキーを定義することである。 たとえば、ファンクションキー4を(文字の列C-u C-fを 計算機に送って)4文字進めると定義にするには、 特定の端末ではつぎのようにする。

 
(send-string-to-terminal "\eF4\^U\^F")
     => nil

コマンド: open-termscript filename
この関数は、Emacsが端末へ送出するすべての文字を記録する タームスクリプトファイル(termscript file)を オープンするために使う。 関数はnilを返す。 タームスクリプトファイルは、 Emacsがスクリーンを乱してしまう問題、 誤ったtermcap定義やEmacsの実際のバグではない端末の望ましくない設定の 問題を調べるのに有用である。 どのような文字の列が実際に出力されるか確信できれば、 それらが使用中のtermcapのどの定義に対応するか調べられる。

37.8 端末入力open-dribble-fileも参照。

 
(open-termscript "../junk/termscript")
     => nil



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.10 システム固有のX11のキーシンボル

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Special%20Keysyms"
"elisp/システム固有のX11のキーシンボル"へのコメント(無し)

システム固有のX11のキーシンボル(keysym)を定義するには、 変数system-key-alistに設定します。

Variable: system-key-alist
この変数の値は、各要素がシステム固有の 各キーシンボルに対応する連想リストであること。 要素は(code . symbol)の形である。 ここで、codeは(『提供業者固有の』ビット -2**28を 含まない)数値のキーシンボルコードであり、 symbolはファンクションキーの名前である。

たとえば、(168 . mute-acute)は、 数値コードが -2**28 + 168 であるHP Xサーバーが使うシステム固有キーを定義する。

実際に使用しているXサーバーのキーシンボルと衝突しなければ、 他のXサーバー向けのキーシンボルを連想リストから省かなくても問題ない。

変数は現在の端末につねにローカルであり、 バッファローカルにはなりえない。 see 節 28.2 複数ディスプレイ



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.11 フロー制御

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Flow%20Control"
"elisp/フロー制御"へのコメント(無し)

本節では、 『Emacsがなぜコマンド文字集合の中からフロー制御文字を使うのか?』という 質問に答えたいと思います。 この話題に関する別の視点については、 配布に含まれるファイル`emacs/INSTALL'の中の フロー制御に関する記述を読んでください。 termcapの定義とDECの端末集線器については、 `emacs/etc/TERMS'を参照してください。

ある時期には、ほとんどの端末ではフロー制御を行っておらず、 C-sC-qをフロー制御に用いるものもありませんでした。 したがって、コマンド文字としてC-sC-qを選ぶことは 自然であり議論の余地はありませんでした。 キーに割り付けるべきコマンドがたくさんあったので、 ほとんどすべてのASCIIコントロール文字に意味を与えました。

のちに、フロー制御にこれらの文字を必要とする端末が導入されたのです。 それらはフルスクリーンエディタ向きの端末ではなかったので、 Emacsの保守陣はそれらを無視しました。 後年、C-sC-qによるフロー制御が 端末で広く使われるようになりましたが、当時はそれはオプションでした。 Emacsユーザーの多くはフロー制御をオフにして、 フロー制御のために無意味なキーバインディングに 替えようとはしなかったのです。

Emacsと端末や集線器の製造業者のどちらの使い方が『正しい』でしょう? この問に簡単な答えはありません。

C-sC-qで引き起こされる問題を解消するのに 気が進まないのは、C-sC-qであることに理由がないからです。 文字ストリームに透過な別の(実用上一般的ではないが) フロー制御技術があります。 さらに、それらをフロー制御に使うのは正式な規格ではありません。 興味深いことですが、(1970年ころの)紙テープパンチャ付きの テレタイプモデル33では、計算機からパンチャをオン/オフするために C-sC-qを送っていました!

ウィンドウシステムやPC端末エミュレータが文字端末を置き換えるようになり フロー制御の問題は徐々に解消しつつあります。 しばらくは、読者が望むならEmacsはフロー制御を オンにする手軽な方法を提供します。 関数enable-flow-controlを呼び出すのです。

コマンド: enable-flow-control
この関数は、出力のフロー制御にC-sC-qを 使うようにするとともに、keyboard-translate-table (see 節 37.8.2 入力イベントの変換)を用いて C-\C-^をそれらのかわりに使えるようにする。

読者のファイル`.emacs'で関数enable-flow-control-onを使えば、 特定の種類の端末で自動的にフロー制御をオンにできます。

Function: enable-flow-control-on &rest termtypes
この関数は、端末の種類がtermtypesの1つであると、 フロー制御をオンにしC-\C-^をかわりに使う。 たとえば、つぎのように使う。

 
(enable-flow-control-on "vt200" "vt300" "vt101" "vt131")

enable-flow-controlが行う処理はつぎのとおりです。

  1. (set-input-mode nil t)で 端末入力をCBREAKモードに設定し、 オペレーティングシステムにフロー制御を行うように指示する。

  2. C-\C-^C-sC-qに変換するように keyboard-translate-tableを設定する。 非常に下位レベルであることを除けば、 EmacsはC-sC-qを打ったと考えるので、 たとえ他のコマンドに対してもC-\C-^を打ったとしても 実質的にはC-sC-qを打ったことになる。 see 節 37.8.2 入力イベントの変換

端末側がフロー制御文字を発行するのであれば、 カーネルのフロー制御処理をオンにすれば、 その端末に対する普通のパディングより少なくしても動作するはずです。 termcapの定義をカスタマイズしてパディング量を減らします。 あるいは、baud-rateに小さめの値を設定すると、 パディングの必要量の計算にEmacsは低い速度を使います。 See 節 37.9 端末出力



[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [表紙] [目次] [索引] [検索] [上端 / 下端] [?]

37.12 バッチモード

URL="https://bookshelf.jp/cgi-bin/goto.cgi?file=elisp&node=Batch%20Mode"
"elisp/バッチモード"へのコメント(無し)

コマンド行オプション`-batch'は、 Emacsを非対話的に実行します。 このモードでは、Emacsは端末からコマンドを読まず、 端末のモードを変更せず、スクリーンに出力もしません。 これは、実行するLispプログラムを指定できるようにするためです。 それが終るとEmacsも終了します。 実行すべきプログラムは、 fileという名前のライブラリをロードする`-l file'、 および、 引数なしで関数functionを呼び出す`-f function'で 指定します。

バッチモードでは、ストリームとしてtを指定した messageprin1などでエコー領域に 表示されるLispプログラムの出力は、 Emacsの標準エラー記述子へ出力されます。 したがって、Emacsは非対話的な アプリケーションプログラムのようにふるまいます。 (コマンドの表示などのEmacs自身がエコー領域に出力するものは 完全に抑制される。)

Variable: noninteractive
この変数は、Emacsがバッチモードで動作しているとnil以外である。

[ << ] [ >> ]           [表紙] [目次] [索引] [検索] [上端 / 下端] [?]