検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
この章では、 Emacsを立ち上げたりEmacsから抜けたりすること、 オペレーティング・システム環境の値を取得すること、 端末と入出力とフロー制御について説明します。
関連する情報についてはSee section Emacsを作る。 また、端末と画面にまつわるオペレーティング・システムの状態、 情報については、section Emacsの表示を参照してください。
この節では、Emacsが立ち上げ時に何をするか、 そして、その動作をどのようにカスタマイズするかについて述べます。
Emacsの起動時には以下の順序で実行されます (これは`startup.el'に書かれています)。
before-init-hook
を実行します。
inhibit-default-init
が非nil
ならば、
ライブラリ`default'をロードします
(`-batch'モードやコマンド行で`-q'を指定してあるときは、
ロードを行ないません)。
普通、ライブラリの名前は`default.el'です。
after-init-hook
を実行します。
initial-major-mode
にしたがって主モードの設定を行ないます。
ただし、この時点ではまだ`*scratch*'がカレントで、
しかもまだFundamentalモードです。
inhibit-startup-echo-area-message
によって抑止されていなければ、
最初のエコー領域メッセージを表示します。
term-setup-hook
を実行します。
frame-notice-user-settings
を呼び出します。
window-setup-hook
を実行します。See section ウィンドウ・システム。
inhibit-startup-message
の値がnil
ならば、
copyleft、無保証性、基本的利用のための情報を表示します。
nil
の場合、メッセージを表示しません。
立ち上げメッセージの内容を熟知したら、 個人的な初期化ファイルの中でこの変数を設定すればよいようになっています。 新しいユーザが見ることになっている情報の取得が妨げられるので、 新しいユーザの初期化ファイルや複数のユーザに影響の出るようなやり方で、 この変数を設定してはいけません。
(setq inhibit-startup-echo-area-message "your-login-name")
単純にinhibit-startup-echo-area-message
へログイン名を設定することは、
メッセージを抑制するのに不十分です。
Emacsは陽に`.emacs'が上記のような式を含むか調べています。
ログイン名はLispの文字列定数として式に現われなければなりません。
こうして、あなたは簡単にメッセージを抑止できますが、 誰かがやみくもにあなたの`.emacs'ファイルを転記しても、 その人へのメッセージは抑止されません。
Emacsを立ち上げたとき、 通常はあなたのホーム・ディレクトリ配下にある ファイル`.emacs'をロードしようとします。 このファイルがある場合はLispコードを含んでいなければなりません。 これをあなたの初期化ファイル(init file)といいます。 コマンド行スイッチの`-q'と`-u'が、 初期化ファイルの利用に影響を与えます。 `-q'は初期化ファイルをロードしないことを、 そして`-u'はあなたの初期化ファイルの代わりに、 指定したユーザの初期化ファイルをロードすることを 指定します。See section `Entering Emacs' in The GNU Emacs Manual。
サイトには、`default.el'という名前のライブラリである、
デフォルト初期化ファイル(default init file)があることもあります。
Emacsは`default.el'ファイルを見つけるのに、
ライブラリの標準検索パスを使用します
(see section プログラムでロードする方法)。
Emacsの配布物件にはこのファイルを含んでいません。
サイトで固有なカスタマイズをすることができます。
デフォルト初期化ファイルがあれば、
バッチ・モードの場合と、`-q'を指定した場合を例外として、
Emacsを立ち上げるときにいつもロードされます。
個人の初期化ファイルがあれば、そちらが先にロードされます。
そこでinhibit-default-init
を非nil
の値に設定すると、
Emacsは`default.el'のロードを取りやめます。
もう一つ`site-start.el'というサイトのカスタマイズ用ファイルがあります。 Emacsは、ユーザの初期化ファイルの前に、このファイルをロードします。 このファイルのロードは、オプション`-no-site-file'で禁止できます。
"site-start"
です。
もし`.emacs'のコードが大きくなりすぎたら、
`something.el'のようにファイル名を変えて、
それをバイトコンパイルしておき(see section バイトコンパイル)、
そして`.emacs'ファイルからload
を使って、
ほかのファイルをロード(see section ロード)した方がいいでしょう。
`.emacs'ファイルでありがちな、 望ましいカスタマイズのいろいろなこと については、See section `Init File Examples' in The GNU Emacs Manual。
nil
の場合、デフォルトのライブラリをロードしません。
デフォルト値はnil
です。
各端末の型には独自のLispライブラリがあって、
Emacsが作動するときにはその端末型のライブラリをロードします。
termtypeという名前の端末型のライブラリの名前は、
`term/termtype'です。
ほかのファイルの場合と同様に、
Emacsはload-path
のディレクトリを検索して、
`.elc'や`.el'の接尾辞のついたファイルがないか調べます。
通常、端末固有のライブラリは、
`emacs/lisp/term'というEmacs Lispライブラリの
保管してある`emacs/lisp'ディレクトリの
サブディレクトリに置いてあります。
ライブラリの名前は、
変数term-file-prefix
の値と端末型を結合して構築します。
通常term-file-prefix
は、"term/"
という値をもっています。
この値を変更することはおすすめできません。
端末固有ライブラリの通常の機能は、
特殊キーの送出するシーケンスをEmacsが理解できるようにすることです。
端末にたいするTermcapの項目が、
端末のファンクション・キーの全部を指定してはいない場合、
このライブラリでfunction-key-map
の設定や追加をすることも
あります。See section 端末入力。
端末型の名前がハイフンを含むとき、
ライブラリの名前としては最初のハイフンの前までが有効です。
したがって`aaa-48'と`aaa-30-rv'という端末型は、
両方とも`term/aaa'というライブラリを使います。
必要であれば、ライブラリは(getenv "TERM")
を評価して
端末型の完全な名前を使うことができます。
`.emacs'ファイルで変数term-file-prefix
をnil
に
設定することで、端末固有ライブラリのロードを止めることができます。
この機能は、あなたが独創的なカスタマイズを試してみるときに役に立ちます。
変数term-setup-hook
を設定することによって、
端末固有ライブラリの動作の一部を無効にすることができます。
これは`.emacs'ファイルと端末固有ライブラリの両方をロードした後に、
つまり、
Emacsの初期化の最後にrun-hooks
を使って作動させる正規フックです。
独自のライブラリをもたない端末の初期化の定義に、
この変数を使うことができます。See section フック。
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
を使って、
端末固有ファイルで施された定義を無効にすることができます。
関連する機能についてsection ウィンドウ・システムのwindow-setup-hook
を
参照してください。
コマンド行引数を使って、 Emacsを立ち上げるときにいろいろな動作をさせることができます。 1日に1回よりも多くEmacsを立ち上げる必要はありませんし、 何日もEmacsを立ち上げたままにすることもありますから、 コマンド行引数を使うことはほとんどないでしょう。 実際、こうした習慣こそが不必要に多くEmacsを殺したり、 再起動したりすることを助長しているのであって、 このようなものを使う習慣をなくすことの方が最高なのです。 これらのオプションが存在するのは二つの理由があります。 (ほかのプログラムに起動されるときのための) ほかのエディタとの互換性と、 Lispプログラムをシェル・スクリプトから起動することができるようにすることです。
この節ではEmacsがコマンド行引数をどのように処理するのかと、 どのようにそれをカスタマイズするのかについて述べます。
t
になります。
もしdump-emacs
を呼び出してEmacsを再ダンプするときは、
新しくダンプされたEmacsに新しいコマンド行引数を処理させるために、
この変数をnil
に設定したくなることでしょう。
コマンド行オプション(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
関数で
解析します。section `Command Line Switches and Arguments' in The GNU Emacs Manualを
参照してください。
nil
の値を返すまで順に繰り返します。
この関数群は引数なしで呼び出されます。
考慮中のコマンド行引数はargi
変数でアクセスできます。
残りの引数(処理中のものをのぞく)は、
command-line-args-left
にあります。
関数が引数argi
を認識し処理を行なうとき、
その引数を処理したことを示すために、
非nil
の値を返さなければなりません。
もし後続する引数も処理した場合、
command-line-args-left
から消去して、
そのことを示します。
もしすべての関数がnil
を返したら、
引数は読み込むファイルの名前として使います。
Emacsから抜ける方法は二つあります。 Emacsジョブを殺せば完全に終了してしまいます。 後でまたEmacsプロセスに入れるように、サスペンドすることもできます。 ログ・アウトするときをのぞけば、 実際それほどEmacsを殺すことはありません。 サスペンドすることが、ほとんどです。
Emacsを殺すということはEmacsプロセスの実行を終わらせるということです。
通常は、親プロセスが制御を取り戻します。
Emacsを殺す低水準プリミティブは、kill-emacs
です。
exit-dataが整数の場合、 それをEmacsプロセスのexitステータスとして用います (これは主にバッチ操作のときに便利です。section バッチ・モードを参照してください)。
もしexit-dataが文字列ならば、 シェル(あるいは次に入力を読み込むプログラムなら何でも)が読み込めるよう、 内容を端末の入力バッファに放り込みます。
Emacsプロセスの全情報は、
セーブしたファイルをのぞいて、
Emacsが殺されたときになくなります。
Emacsを殺すといろいろな作業結果が失われてしまうので、
保存の必要なバッファや走行中のサブプロセスが存在すると、
Emacsはユーザに本当に終了するべきか否かを尋ねます。
これは関数save-buffers-kill-emacs
によります。
save-buffers-kill-emacs
は、
リストkill-buffer-query-functions
にある関数を、
先頭から引数なしで呼び出します。
これらの関数でユーザに付加的な確認の質問をすることができます。
一つでも非nil
を返すと、Emacsは殺されません。
save-buffers-kill-emacs
は、
いったんすべてのファイルのセーブと確認を終えた後で、
これはこのフックにある関数群を作動させます。
Emacsのサスペンド(suspending Emacs)とは、
Emacsを一時的に停止させ、
通常はシェルであろう上位のプロセスに、制御を戻すことをいいます。
これは後から同じバッファ、同じkillリング、
同じ取り消し履歴などがある同じEmacsプロセスで、
編集を再開させることができます。
Emacsを再開させるには、
親シェルで適切なコマンドを(大体fg
ですが)使います。
オペレーティング・システムによっては、 ジョブのサスペンドをサポートしていないこともあります。 このようなシステムでの「サスペンド」は、実際、 Emacsの子プロセスとして新しいシェルを一時的に立ち上げるだけです。 このときシェルを抜けるとEmacsに戻ります。
Xのようなウィンドウ・システムを使っている場合、 再開すべき親がいないかもしれないですし、 別なウィンドウに移動するだけでシェルなどのほかのジョブに入力を与えることができるので、 サスペンドは役に立ちません。 そのためEmacsがXのクライアントの場合、 サスペンドは禁止してあります。
suspend-emacs
はnil
をLispの呼び出し側に返します。
もしstringが非nil
ならば、
その文字はEmacsの上位シェルに端末入力として読み込まれます。
(訳注:文字を読み込んだ)結果だけが現われます。
suspend-emacs
は、
サスペンドの前に正規フックsuspend-hook
を作動させます。
suspend-hook
は、
Emacsバージョン18では正規フックではありませんでした。
この値は単一の関数で、
もしその値が非nil
ならば、
suspend-emacs
はサスペンドをせずすぐに戻っていました。
ユーザがEmacsを再開させた後、
suspend-emacs
は、
正規フックsuspend-resume-hook
を作動させます。See section フック。
no-redraw-on-reenter
が非nil
でなければ、
再開の直後で全画面の再表示を行ないます。
(see section 画面の再表示)。
以下の例で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!
Emacsは、 オペレーティング・システム環境にある変数へのアクセスを、 さまざまな関数によって提供しています。 これらの変数にはシステムの名前やユーザのUIDなどが含まれます。
aix-v3
berkeley-unix
dgux
gnu
hpux
irix
linux
ms-dos
next-mach
rtu
unisoft-unix
usg-unix-v
vax-vms
windows-nt
xenix
絶対的に必要ではないのなら、
私たちはきれいな区別をするために新しいシンボルをつけ足すことは望みません。
異なるオペレーティング・システムを区別するためには、
system-configuration
を利用することを推奨します。
string-match
を使うと便利です。
(system-name) => "prep.ai.mit.edu"
シンボルsystem-name
は、関数であると同時に変数でもあります。
実際、関数の方は変数system-name
が現在保持している値が何であれ、
それを返します。
したがってEmacsがシステムの名前について混乱している状況なら、
変数system-name
に値を設定することも可能です。
この変数は、フレームのタイトルを構成するときにも役に立ちます
(see section フレーム・タイトル)。
nil
ならば、
emailアドレスを生成する目的でsystem-name
の代わりに利用されます。
たとえば、user-mail-address
のデフォルト値を構成するときに使用します。See section ユーザの識別。
(これはEmacsの立ち上がり時になされるので、実際に値が使われるのは、
Emacsをダンプしたときに保存していた値です。See section 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とWindows NTでは";"
です。
nil
を保管します。
nil
ならば、
`lib-src'と`etc'のサブディレクトリを探すためのディレクトリです。
これはEmacsが標準のインストール場所のディレクトリを見つけられなかったが、
Emacsの実行可能形式を含むディレクトリから相対的に見つけることができたとき、
非nil
になります。
(load-average) => (169 48 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
を返して、
現在その特権があるかどうかを示します。
LOGNAME
が設定されていたら、
その値を使います。さもないと、
もし環境変数USER
が設定されていたら、
その値を使います。さもないと、
値は実UIDでなく、実効UIDに基づいて取られます。
もしuidを指定したとき、 値はuid(整数でなければなりません)に対応するユーザ名です。
(user-login-name) => "lewis"
LOGNAME
とUSER
を無視します。
(user-full-name) => "Bil Lewis"
シンボルuser-login-name
、user-real-login-name
、
user-full-name
は、関数であると同様に変数でもあります。
この関数群はこの変数群が保持する値を返します。
この変数群で関数群の返す値を設定して、
Emacsを「だます」ことができます。
この変数群はフレームのタイトルを構成するときにも役に立ちます
(see section フレーム・タイトル)。
(user-real-uid) => 19
この節では現在の時刻と時間帯の決定方法を説明します。
substring
を用いることができます。
文字列の後ろに情報を拡張する場合を考慮すれば、文字は後ろからではなく、
前から数えた方がいいでしょう。
引数time-valueが与えると、現在時刻の代わりに整形すべき
時刻を指定します。
引数は最初の二つの要素が整数であるリストでなければなりません。
したがってcurrent-time
(以下を参照)やfile-attributes
(see section ファイルに関するそのほかの情報)で得た値を使うことができます。
(current-time-string) => "Thu Aug 24 06:30:15 1995"
(high low microsec)
として返します。
整数highとlowは、
のようにして(訳注: UTCで)1970年1月1日0時0分0秒
からの秒数を表わします。
第3要素microsecは、 最近の秒が始まってからのマイクロ秒数 (あるいは秒精度までしか返さないシステムでは0)を示します。
最初の二つの要素は、
関数file-attributes
で得られるような時刻の値と
比較することができます。See section ファイルに関するそのほかの情報。
値は(offset name)
という形をしています。
ここでoffsetは整数でUTCよりも進んでいる
(グリニッチより東の)秒数です。
負の値はグリニッチよりも西であることを意味します。
第2要素nameは文字列で時間帯の名称を表わします。
双方とも夏時間の始まりと終わりに変化が生じます。
夏時間の制度のないところでは常に一定です。
値を算出するのに必要な情報が、
オペレーティング・システムからすべては与えられていない場合、
両方の要素はnil
です。
引数time-valueが与えられると、
現在時刻の代わりに解析すべき時刻を指定します。
引数は二つの整数を含むコンス・セルか、
あるいは、先頭の二つの要素が整数のリストです。
したがってcurrent-time
(上記参照)や
file-attributes
(see section ファイルに関するそのほかの情報)
で得られるような
時刻を使うことができます。
この関数群は、
時刻の値(2個、3個の整数のリスト)から文字列、
暦情報への変換を行ないます。
また、暦情報から時刻の値へ変換する関数もあります。
時刻の値は関数current-time
(see section 1日の時刻)
とfile-attributes
(see section ファイルに関するそのほかの情報)
から得ることができます。
(seconds minutes hour day month year dow dst zone)
要素の意味は、以下のとおりです。
t
でそうでなければnil
です。
Common Lispでのdowとzoneの意味は違うので、 注意してください。 (訳注:ちなみに0は月曜で、時間帯は時間単位。)
decode-time
の逆です。
暦情報の7項目を時刻の値に変換します。
引数の意味は、decode-time
の表を参照してください。
100以下の年数もほかの年と同様に扱われます。
1900以降の年の意味にしたければ、
encode-time
を呼び出す前に自分で変えておいてください。
オプション引数zoneは、
デフォルトで現行の時間帯と夏時間規則となります。
指定したときは、(current-time-zone
で得られるような)リストか、
あるいは(decode-time
で得られるような)整数が使えます。
特に夏時間の修正はせずに指定した時間帯を使用します。
指定した未来の時刻に関数を呼び出すことができます。
絶対時刻はいろいろな書式で指定することが可能です。
全フィールドが整数の`hour:min:sec timezone
month/day/year'という形式は受けつけられます。
current-time-string
の返す値も有効です。
相対時刻は数量と単位で指定します。たとえば、
もしtimeが整数ならば、秒で測った相対時間です。
引数repeatは呼出しを何回繰り返すか指定します。もしrepeat
がnil
ならくり返しはせず、timeに一度呼び出されます。もし
repeatが整数ならば、秒で測ったくり返しの期間を指定します。いずれ
にせよrepeatは、1回目の呼出しには影響しません。それは
timeで指定します。
run-at-time
はスケジュールに入れた未来のこの動作を特定する、
タイマーの値を返します。
この値は後でcancel-timer
を呼び出すときに使用することができます。
run-at-time
が返した値の
timerで要求していた動作を取消します。
これはrun-at-time
を呼出しの効果を取り消します。
指定時刻が来ても特別なことは何も起きません。
この節では端末入力を記録し、操作するための関数と変数について述べます。 関連した関数についてはsection Emacsの表示を参照してください。
nil
の場合、CBREAKモードを用います。
Emacsが直接Xと通信しているときは、
通信の方法がわかっているので、
この引数を無視して割込みを使います。
もしflowが非nil
ならば、
Emacsは端末への出力にXON/XOFF (C-q、
C-s)フロー制御を用います。
これはCBREAKモード以外では何の影響も及しません。See section フロー制御文字。
通常の設定はシステムに依存します。 システムによっては何を指定しても常にCBREAKモードを使います。
引数metaは127よりも大きい入力文字符号の扱いを制御します。
もしmetaがt
ならば、
Emacsは、8ビット目を立てた文字をメタ文字に変換します。
もしmetaがnil
ならば、
Emacsは8ビット目を無視します。
これは端末がパリティービットとして使うときに必要です。
もしmetaがt
でもnil
でもないとき、
Emacsは8ビットの入力をそのまま使います。
これはヨーロッパの8ビット文字集合を使う端末のとき便利です。
もしquit-charが非nil
なら、
とりやめに使う文字を指定します。
通常この文字はC-gです。See section とりやめ。
current-input-mode
関数は、
Emacsが現在使っている入力モードの設定を返します。
set-input-mode
の
引数(interrupt flow meta quit)
に対応したリストを返します。
nil
です。
もしnil
ならEmacsはCBREAKモードを使用中です。
nil
です。
この値はinterruptが非nil
でないと、効果をもちません。
t
です。
Emacsが全入力文字の8ビット目を落とすときはnil
です。
Emacsが8ビットすべてを基本的な文字符号として使うときは、
それ以外の値です。
この節ではキー・シーケンスの一部になる前に、 入力イベントを別なイベントに変換する機能について述べます。
ユーザがキーボードのキーを押下するたびに、 まるでビット・マスクで指定した修飾キーが押されているかのように、 キーが変更されます。
Xウィンドウを使っているとき、 プログラムで上記のように修飾キーを「押す」ことができます。 それ以外の場合、 CTLとMETAキーだけ仮想的に押すことができます。
nil
です。
もしkeyboard-translate-table
が文字列ならば、
キーボードから読み込まれた各文字は、
この文字列を参照し文字列中の文字列を代用します。
もし文字列の長さがnならば、
n以上の文字符号は変換しません。
以下の例では、
keyboard-translate-table
を128文字の文字列に設定しています。
そして文字C-sとC-\、また、文字C-qとC-^を
交換するように設定しています。
したがって、
C-\の押下は、通常C-sを押下したときの全効果をもち、
逆もまた同様です
(これについてはさらにSee section フロー制御文字)。
(defun evade-flow-control () "C-sをC-\\ でC-qをC-^で置き換える。" (interactive) (let ((the-table (make-string 128 0))) (let ((i 0)) (while (< i 128) (aset the-table i i) (setq i (1+ i)))) ;; C-sとC-\の交換。 (aset the-table ?\034 ?\^s) (aset the-table ?\^s ?\034) ;; C-qとC-^の交換。 (aset the-table ?\036 ?\^q) (aset the-table ?\^q ?\036) (setq keyboard-translate-table the-table)))
この変換は、端末から読み込んだ直後に行なうことに注意してください。
recent-keys
やドリブル・ファイルのような記録保存機能は、
変換の後に文字を記録します。
keyboard-translate-table
を修正して、
符号fromが符号toに変換するようにします。
必要に応じて変換テーブルの生成と拡張を行ないます。
もしfunction-key-map
が、
あるキー・シーケンスkをあるベクタvに「バインドする」ならば、
kがシーケンスのどこかに現われたとき、
イベントvに置換されます。
たとえば、VT100端末は、キーパッドPF1キーを押下したとき、
ESC O Pを送出します。
したがって、Emacsには
このイベント群のシーケンスを
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には多くの共通な端末固有ファイルがついてきます。
TermcapとTerminfoからすぐ出てくるもの以外の
項目をfunction-key-map
に設定するのが、
主な目的です。See section 端末固有の初期化。
バージョン18以前のEmacsは、 ファンクション・キーの表現する文字シーケンスの検出に まったく異なった方法を使っていました。
function-key-map
のように
入力イベントをほかのイベントに変換するのに使います。
これはfunction-key-map
と以下の点で異なっています。
key-translation-map
は、
function-key-map
で処理した後に作用します。
これはfunction-key-map
の変換の結果を受け取ります。
key-translation-map
実際のキー・バインドに優先します。
key-translation-map
は、
通常self-insert-command
にバインドしておく普通の文字も含め、
ユーザのために一つの文字集合を別のものに写すことにあります。
function-key-map
やkey-translation-map
にキー・シーケンスで
なく関数を使うことによって、単なる別名づけにとどまらず、
キーの変換を行なうことも可能です。
キー変換関数は、read-key-sequence
に指定されたプロンプトか、
あるいはエディタのコマンド・ループで読込み中の場合はnil
を、
単一の引数としてとります。ほとんどたいていの場合、これは無視できます。
もし関数が自分で入力を読み取るなら、 引き続くイベントの変更効果があることになります。 例としてC-c hで、ひき続く文字をハイパー文字に変える定義を、 以下に示します。
(defun hyperify (prompt) (let ((e (read-event))) (vector (if (numberp e) (logior (lsh 1 20) 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)
`iso-transl'ライブラリではこの機能を使って、 ASCII以外のLatin-1文字の入力ができるようにしています。
ドリブル・ファイルを閉じるには、
nil
を引数にしてこの関数を呼び出します。
この関数は、通常、 バグ報告用にEmacsのバグを引き起こすのに必要な入力を記録するときに、 使用します。
(open-dribble-file "~/dribble") => nil
open-termscript
関数も参照してください
(see section 端末出力)。
端末出力関数は、端末出力を送出したり、
端末に送出した出力を追跡したりします。
変数baud-rate
は、
端末への出力スピードをいくつにするかをEmacsに指定しています。
値の単位はボー(baud)です。
もしネットワーク経由でアクセスしていて、
ネットワークの一部でボー・レートが異なる場合、
Emacsの返す値は、
ローカルな端末で使用中のボー・レートの値とは異なることがあります。
あるネットワーク・プロトコルでは、
ローカルな端末速度を遠隔装置と交信してEmacsやほかのプログラムが
正しい値を取得できるようになっていますが、
そうなっていないプロトコルもあります。
もしEmacsの値が間違っていたら、
最適でない決定を下してしまいます。
この問題を解決するためには、
baud-rate
を設定します。
baud-rate
の値を返します。
バージョン18やそれ以前のEmacsでは、
これが端末スピードを取得する唯一の方法でした。
この関数の一つの使いかたとして、 ダウンロード可能なファンクション・キー定義機能をもつ端末の ファンクション・キーの定義を行なうのに用います。 この例では、ある端末で、ファンクション・キー4を (コンピュータへ文字C-u C-fを伝送することによって) 4文字前に進ませるものとして定義しています。
(send-string-to-terminal "\eF4\^U\^F") => nil
nil
を返します。
端末記録ファイルは、Emacsが画面を壊したりする問題や、
本当のEmacsのバグというよりも、
間違ったTermcap項目や不適切な端末オプションの設定のせいでおこる問題を
調べるときに役に立ちます。
どの文字が実際に出力されたのかが確実にわかってしまえば、
使用中のTermcap仕様に対応する文字を確定できます。
section 端末入力のopen-dribble-file
も参照してください。
(open-termscript "../junk/termscript") => nil
システム固有のX11キーシムを定義するには、
変数system-key-alist
を設定します。
(code . symbol)
という形をしており、
codeは数値のキーシム符号
(ただし「ベンダー固有ビット」の1 << 28は含まない)で、
symbolはそのファンクション・キーの名前です。
たとえば、(168 . mute-acute)
は、
(1 << 28) + 168という値をもつ
HPのXサーバーのシステム固有キーを定義しています。
alistでほかのXサーバーのキーシムを定義しても、 実際に使用中のXサーバーと衝突さえしなければ、問題ありません。
この変数は、常に現在のX端末にローカルなので、 バッファ・ローカルにすることはできません。See section 複数のディスプレイ。
この節では、「どうしてEmacsでは、 フロー制御文字をコマンド文字集合に選んだのか?」 という質問に答えようと思います。 この件については配布物件の`emacs/INSTALL'ファイルにある フロー制御についてのコメントもあわせてお読みください。 Termcap項目とDEC端末コンセントレータに関しては、 `emacs/etc/TERMS'をご覧ください。
昔はほとんどの端末でフロー制御が不要だったので、
C-s
とC-qをフロー制御に使うことはありませんでした。
したがってC-sとC-qをコマンド文字として使うのは、
議論の余地のないところだったのです。
キー・ストロークの経済性と可搬性から、
Emacsは可能なかぎりほとんどすべてのASCII制御文字に
おぼえやすい意味を与えました。
そのため、C-sがsearchに、C-qがquoteになったのです。
その後、ある端末がこの文字群でフロー制御をし始めました。 これは全画面での編集にはむいてなかったので、 Emacsの保守をする人は気にとめませんでした。 何年か経って、 C-sとC-qでのフロー制御は端末でも一般的になりましたが、 それでもたいていはオプションでした。 フロー制御を使わないユーザの大部分は、 フロー制御のせいでしかたなく、 それほどおぼえやすくもないキー・バインドに切り替えていました。
で、どちらが「正しい」のでしょう? Emacsでしょうか?端末やコンセントレータの製造業者でしょうか? この問いへの単純な答えはありません。
なぜ私たちがC-sやC-qで起こる問題に 迎合することに気がすすまないのか という一つの理由として、 これには正当性がないということがあげられます。 文字の流れの透過性を保存するフロー制御の技術は、 (まだそれほど共通に実用に供されていないとはいえ)ほかにもあります。 この方法によるフロー制御が公式の標準でないことにも、注意してください。 興味深いことに、紙テープ・パンチつきのモデル33テレタイプ(とても古い)は、 パンチのオン・オフにコンピュータから送られたC-sとC-qを 使っていました!
Xサーバーやそのほかのウィンドウ・システムが、キャラクタ端末を置き換えると、
この問題はだんだん解消されそうです。とりあえずの間、Emacsは、望むならば、
フロー制御を有効にする簡単な方法を提供しつづけるでしょう。
これには関数enable-flow-control
を呼び出します。
keyboard-translate-table
でC-\とC-^という
別名による入力ができるようにします(see section 入力イベントの変換)。
`.emacs'ファイルの中で関数enable-flow-control-on
を使い、
特定の端末型で自動的にフロー制御を有効にすることができます。
(enable-flow-control-on "vt200" "vt300" "vt101" "vt131")
enable-flow-control
が行なうことは以下のとおり。
(set-input-mode nil t)
で
オペレーティング・システムにフロー制御を扱うよう指示します。
keyboard-translate-table
を設定します。
最下位の部分をのぞいて、
EmacsはC-sやC-qが押下された文字ではないことは意識しません。
そのためC-\やC-^がほかのコマンドの文字であっても
押下できます。See section 入力イベントの変換。
もし端末がフロー制御文字の発信源ならば、
いったんカーネルのフロー制御を有効にすると、
多分その端末の通常の場合よりもパディングが少なくてすみます。
Termcap項目をカスタマイズしてパディングの量を減らすことができるでしょう。
またはbaud-rate
を小さい値に設定することにより、
必要なパディングに(端末のボー・レートが)
遅い速度の場合の計算をさせることもできます。See section 端末出力。
コマンド行オプション`-batch'でEmacsを非対話的にすることができます。 このモードでは、Emacsは端末からコマンドを読み込むことはありませんし、 端末のモードを変更することもありませんし、 消去可能な画面へ出力することを期待しません。 これは作動させるLispプログラムを指定し、 完了後Emacsが抜けるべきであるということです。 作動させるプログラムは、 `-l file'と`-f function'で指定します。 ここでfileはロードするライブラリの名前であり、 functionという引数のない関数を呼び出します。
message
やprin1
などでストリームをt
にして、
通常ならエコー領域にいくような出力をするLispプログラムは、
バッチ・モードではEmacsの標準エラー記述子で出力を行ないます。
したがってEmacsは非対話的な応用プログラムのように振る舞います
(コマンドのエコーのように、
通常Emacs自身が行なうエコー領域出力は完全に抑止されます)。
nil
です。
Go to the first, previous, next, last section, table of contents.