詳細設定及び拡張機能

基本的に、Meadowの設定は基となったGNU Emacsと同じです。この章はMeadowに特有な 設定及び機能について説明しています。その他の設定については、基となったGNU Emacsのドキュメントを参照してください。

バージョンと機能の取得

機能の検査

Emacs Lispや、.emacsでの設定で、現在Meadowで動いているかどうかを調べるためには (featurep 'meadow)を用いて検査してください。

Meadowのバージョン取得

(Meadow-version)で、Meadowのバージョンに関する情報を文字列で取得することが出来 ます。この関数はinteractiveではありません。

キー及びマウスのカスタマイズ

モディファイアの設定

この関数でキーに修飾(modifier)キーを設定することができます。修飾キーとは、その キーを押下することによって、他のキーの操作を違うものにすることができるキーのこ とです。Emacsはmeta, ctrl, alt, shift, super, hyperの6種類の修飾を重ねあわせる ことが出来ます。(shiftは大分毛色が違うのですが) この関数は実際にどのキーを修飾 キーとして取り扱うかを指示します。 KEY はキーの仮想コード、又はキーを示す文字 列です。 MODIFIER には以下のキーのどれかを指定することができます。

  • nil .... 通常のキー
  • none .... 無視されるキー。この指定を受けたキーに関する全ての動作はMeadowから無視されます。
  • meta .... meta modifierキー
  • ctrl .... ctrl modifierキー
  • shift .... shift modifierキー(修飾キーとしてのみ動作します)
  • alt .... alt modifierキー(Windowsのaltキーのことではありません)
  • super .... super modifierキー
  • hyper .... hyper modifierキー

マウスボタンの設定

Meadow は IntelliMouse 等の3ボタンマウスに対応しています。ボタンの割り当ては以 下の変数で変更することができます。

  • w32-lbutton-to-emacs-button
  • w32-mbutton-to-emacs-button
  • w32-rbutton-to-emacs-button

これらの変数にはそれぞれ左、真中、右のボタンが押されたときと離されたときに、 Meadow に送られるボタンの番号を指定します。

マウスホイール

マウスホイールが回されたときは、Meadow は次のようなイベントを受け取ります。

 (mouse-wheel1 ([WINDOW | FRAME] POSITION (X . Y) TIME DELTA))

[WINDOW | FRAME]はマウスのカーソルがあるウインドウまたはフレームを表します。 POSITIONはどのエリアにマウスのカーソルがあるかを表します。 (X . Y)はマウスのカ ーソルの座標を表します。 DELTAはホイールの回転角を表します。DELTAを以下の関数 に渡すことで、スクロールした行の総数を知ることができます。

 (w32-get-mouse-wheel-scroll-lines DELTA)

デフォルトのホイールの動作の設定は、マウスカーソルがバッファーウィンドウにある 時はバッファーの内容のスクロール、モードラインにあるときはモードラインが移動さ れます。

マウスカーソルの消去

フォーカスが Meadow にあるときに以下の2つの方法でマウスカーソルが消えるように設定することができます。

キー入力を行うと消える

w32-hide-mouse-on-key に nil 以外の値を設定すると、キー入力によりマウスカーソルが消えるようになります。nil でこの機能は無効になります。

 (setq w32-hide-mouse-on-key t)

マウスの操作をせずに一定時間経過すると消える

w32-hide-mouse-timeout にミリ秒単位の時間を設定することで、この時間の間マウスの操作が行われなかったときにマウスカーソルが消えるようになります。0 を設定するとこの機能は無効になります。~

 (setq w32-hide-mouse-timeout 5000)

ホイールをまわすと消える (3.00)

w32-hide-mouse-by-wheel をt とすると、マウスホイールをまわすことでマウスカーソルが消えるようになります。 このときはほかのときよりも大きめにマウスを動かさないと再表示しないようになります。 通常は10ドットですが、この量が気に入らないときは w32-hide-mouse-by-wheel に数字を設定すればそのドット数だけ移動したときに再表示されるようになります。

(setq w32-hide-mouse-by-wheel t)      ; ホイールをまわすとカーソルが消える
(setq w32-hide-mouse-by-wheel 50)    ; 50ドットマウスを移動させると再表示。

復帰

以上の方法で消えたマウスカーソルはマウスを動かすことで復帰します. この際マウスの乗った机をたたいただけで復帰してしまっては困るというようなときには w32-hide-mouse-stickiness で反応を鈍くすることができます. 正の整数を指定することでマウスカーソルが消えた点(ホイールについてはまわし終わったときのマウスカーソルの位置)から再表示するまでのマウスの移動量, 負の値を指定するとマウスカーソルの移動速度が指定値の絶対値となります.

(setq w32-hide-mouse-stickiness 10)    ; 10 ドット移動すると再表示される

必要ならばこの値は w32-hide-mouse-timeout, w32-hide-mouse-on-key, w32-hide-mouse-by-wheel の各変数で個別に指定することができます. 詳細は各変数の説明を参照してください.

カーソルスタイル設定

Meadowでは自身で表示するカーソルのほかにWindowsが表示するシステムカレット(system caret)を利用することができます。 カレットを使うことで拡大鏡やスクリーンリーダ等が編集している場所を認識できるようになります。
システムカレットは set-cursor-type で以下のシンボルを指定すると利用できます。

 caret, checkered_caret, hairline_caret

また, システムカレットに対してはその高さを0-4 の5段階で設定することができるようになっています。0は1ドット高で, 1-4は(一行の高さ/4)*n の高さになります。段階が5つであることに特に意味はありません。たとえば以下のようにすることで黒い四角で高さが一行の半分のカレットが出てきます。

 (set-cursor-type 'caret)
 (modify-frame-parameters (selected-frame) '((cursor-height . 2)))

visible bell 設定 (3.00)

visible-bell を t に設定した場合、標準では警告音の代わりにタイトルバーが点滅するようになります。visible-bell が t のときに mw32-visible-bell-type の値に'xを指定すると、タイトルバーが点滅する代わりにウィンドウの上下1行ずつが反転する X-Window 上での Emacs と同様の挙動になります。

 (setq visible-bell t)             ;; 通常の visible bell の設定
 (setq mw32-visible-bell-type 'x)  ;; X-Window 版 Emacs 風の描画設定

MCI機能

Meadow では、Windows の MCI (Media Control Interface)を利用して、マルチメディ アデバイスを制御できます。これにより、音声データを再生したり、CD を再生したり できるようになります。詳しくは、MCI のマニュアルを参照してください。

  • (mw32-mci-send-string COMMAND) .... mciSendString() を使って、MCI コマンドを送信します。正常終了した場合には、コマンドの実行結果を表す文字列を返します。例えば、'open' を実行した場合には、'open' したデバイスの ID を文字列で返します。エラー発生時には、エラーコードを数値で返します。使い方は次のとおりです。
 (mw32-mci-send-string "open c:/WINDOWS/Media/tada.wav alias tada")
 => "1" ; デバイス ID
 (mw32-mci-send-string "play tada")
 => ""
 (mw32-mci-send-string "close tada")
 => ""
また、notify を指定することで、 MM_MCINOTIFY イベントを捕獲できます。
 (mw32-mci-send-string "open c:/WINDOWS/Media/tada.wav alias tada")
 => "1" ; デバイス ID
 (progn
   (mw32-mci-send-string "play tada notify")
   (read-event))
 => (mw32-mci mw32-mci-notify-successful 1 nil)
 (mw32-mci-send-string "close tada")
 => ""
  • (mw32-mci-get-error-string ERROR-CODE) .... エラーコードからエラーの内容を文字列で取得します。
  • (mw32-mci-add-notify-callback DEVICE-ID CALLBACK-FUNC &optional CALLBACK-ARG) .... MM_MCINOTIFY イベントに対するコールバックを登録できます。詳しくは、mw32-mci-notify-func() を参照してください。ここでは、MM_MCINOTIFY イベントを拾って、waveaudio を close しています。

Windows Registry機能

MeadowにはWindows Registryにアクセス出来るRegistry APIが用意されています。 これを使ってIEに設定されているプロクシの情報などシステムデータをelispで活用することができます。

  ; レジストリキーの作成
  (mw32-registry-create-key "HKEY_CURRENT_USER\\Software\\hogehoge")
  ; レジストリキーの削除
  (mw32-registry-delete-key "HKEY_CURRENT_USER\\Software\\hogehoge"
  ; レジストリから文字データ取得
  (mw32-registry-get-string key name &optional coding)
  (mw32-registry-get-string "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" "ProductName")
  => "Microsoft Windows 2000"
  ; レジストリから数値データ取得
  (mw32-registry-get-integer key name)
  ; レジストリからリストを取得
  (mw32-registry-get-string-list key name)
  ; レジストリへデータをセット
  (mw32-registry-set key name data)
  ; 対応しているデータ型(取得可能でもセットできないデータ型もあります)
  ; 'registry_binary
  ; 'registry_dword
  ; 'registry_dword_little_endian
  ; 'registry_dword_big_endian
  ; 'registry_expand_sz
  ; 'registry_link
  ; 'registry_multi_sz
  ; 'registry_none
  ; 'registry_qword
  ; 'registry_qword_little_endian
  ; 'registry_resource_list
  ; 'registry_sz
  ; 'registry_full_resource_descriptor
  ; 'registry_resource_requirements_list

フォントの設定

(**失礼ですが、例をあげで、説明を見せていただけませんか?
たとえ、UTF-8-dosでCJKを同時に表示させるために、ちょっと難しいかもしれませんが、どうすればよろしいですか?**)

Meadow 2.xからは、Emacs 21ベースになったため、フォントに関する設定はMeadow 1.x とはだいぶ変更されています。すくなくとも、Meadow 1.xにおける低水準APIについて は互換性がなくなってしまいました。高水準APIについては互換性を保っていますが、 それもすこし性質がことなっていますし、従来の高水準APIを使用する事ももはや推奨 されません。

Meadow 2.xでは、低水準APIと高水準APIのはっきりした区別がなくなっており、単一の フォントリクエストシステムに統合されています。ユーザーはフォント選択に関する要 求を指定するだけとなっていて、その指定方法がことなっているだけなのです。フォン ト選択の指定は連想リストによる条件の指定方法と、Emacs Lispによるプログラムによ る条件の指定方法の2種類が用意されています。

Meadowではフォントシステムを以下の3階層でモデル化しています。

 +----------------------------------------+
 | Font Request Layer     (FR)            | 
 +----------------------------------------+
 | Logical Font Layer     (LF)            | 
 +----------------------------------------+==============
 | Physical Font Layer    (PF)            | Invisible
 +----------------------------------------+

フォント要求(FR)レイヤ

フォントに関する要求事項を管理する層です。一つ一つのフォント要求(FR)は文字 列によるフォント名が必ず与えられます。

FRに割り当てられた名前はフォント名と完全に同一視できるように設計されており 、Emacs Lispからは、そのフォント名をset-face-fontや、set-frame-fontなどの APIに指定することが出来ます。言い換えると、この名前によって、通常のEmacs Lispとの互換性をとっているというわけです。

フォント要求には、連想リストもしくはEmacs Lisp Functionを割り当てることが 出来、これらの記述には、以下で挙げる論理フォント(LF)を用います。

Meadowは、フェイスの情報と、表示される文字、そしてフレームを、このフォント 要求レイヤに渡し、結果として、それらを表示するために用いられる論理フォント を得ます。

論理フォント(LF)レイヤ

論理フォントは、デバイスによる相違があるものの、デバイス環境さえ特定されれ ば、物理フォントと完全に対応させることが出来るフォント情報を保持しているも のです。

物理フォント(PF)レイヤ

実際に表示されるフォントを取り扱うレイヤです。デバイスによって異なった情報 を扱うため、ユーザーからは直接操作することは出来ません。論理フォントから物 理フォントへの対応は、完全に隠蔽されています。

論理フォントの記述

Meadowでは、現状で以下の2種類の論理フォントを定義しています。

Windowsの論理フォント

Windowsで通常用いられるフォントを指定するための論理フォントです。Win32 API におけるLOGFONT構造体とほとんど直接対応し、以下のようなリストで表現されま す。

 (w32-logfont <NAME> <WIDTH> <HEIGHT> <WEIGHT> <ORIENTATION>
  <ITALIC-P> <UNDERLINE-P> <STRIKEOUT-P> <CHARSET> <QUALITY>
  <OUTPRECISION> <PITCH&FAMILY>)
  • NAME .... 31バイト以内のフォントの名前
  • WIDTH .... フォントの幅(数字)
  • HEIGHT .... フォントの高さ(数字)
  • WEIGHT .... フォントの太さ(数字) (通常の太さは400で、ボールドは700)
  • ORIENTATION .... フォントの回転角(数字) (0.1度単位で指定する)
  • ITALIC-P .... nilでない値の時はイタリックフォント
  • UNDERLINE-P .... nilでない値の時は下線を表示
  • STRIKEOUT-P .... nilでない値の時は打ち消し線を表示
  • CHARSET .... フォントの文字集合を表す番号(0で、いわゆるWindows-Latin1の文字集合に、128で、SHIFTJIS文字集合を指定することになる。)
  • QUALITY .... フォントの品質(数字)
  • OUTPRECISION .... フォントの出力精度(数字)
  • PITCH&FAMILY .... フォントが固定幅であるかどうか、加えてフォントファミリーもここに指定するこの論理フォントを(w32-query-get-logfont)という関数を用いて、Windowsのフォント選択ダイアログを通して選択することも出来ます。

BDFの論理フォント

Meadowでは、BDFフォントを使うことも出来ます。BDFフォントの論理フォントは、 以下のようなリストで表現されます。

 (bdf-font "FILENAME")

FILENAMEには実際のBDFフォントのファイル名をフルパスで指定します。

フォント要求の記述

フォント要求を追加するためにはw32-add-font関数を用います。

 (w32-add-font <FR-NAME>
  '((spec [(<SPEC-PLIST> strict <LF> <OPTION-ALIST>)
          |(<SPEC-PLIST> function <FUNCTION> <OPTION-ALIST>)]... )))

FR-NAMEには、追加されるフォントリクエストの名前を指定します。すでに同一名が追 加済みの場合にはエラーとなります。

2番目の引数にはフォントの要求の明細を指定します。現状では、specのみがキーとし て有効で、他は無視されます。このspecに対応する値には、0個以上の要求を指定しま す。各々の要求は、既に示したように、

 (<SPEC-PLIST> strict <LF> <OPTION-ALIST>)

もしくは、

 (<SPEC-PLIST> function <FUNCTION> <OPTION-ALIST>)

によって構成されます。

まず、両者の共通項から説明します。SPEC-PLISTには、この要求が適用されるときの条 件を指定します。これは属性リストで指定されます。これらの条件は、通常フェイスで 指定されているものと照合されます。例えば、 defaultフェイスで、高さが120と指定 されているとします。このフェイスの指定と適合させる為には、SPEC-PLISTで、以下の ように指定する必要があります。

 (:height 120)

もしくは、以下のような指定を用いて、どんな高さが指定されているフェイスに対して も適用されるようにも出来ます。

 (:height any)

anyは特別なキーワードで、フェイス属性のあらゆる値にも適合するという指定です。 特別に、SPEC-PLISTの代わりにanyを指定することも許されます。例えば、以下のよう に指定すると、"test"というフォント名では、どんなフェイスに適用される場合にでも FixedSys?の19ドットのフォントが用いられることになります。

 (w32-add-font "test" '(spec 
   (any strict (w32-logfont "FixedSys" 0 -19 400 0 nil nil nil 128 1 1 1))))

また、unspecifiedを指定した場合には、フェイスでその値が指定されていないときの み、条件が満たされているものとみなされます。

SPEC-PLISTに指定できるキーは以下の通りです。

  • :char-spec .... そのフォントで表示される文字を、文字そのもの(generic charを含む)、charset、もしくは、文字テーブルで指定します。文字テーブルで指定する場合には、文字テーブルで対応する項目に非nil値が入っているかで判定されます。この項目を指定しなかった場合にはascii文字集合が指定されたものとみなされます。このキーを指定しない場合のデフォルト値はasciiです。
  • :width .... そのフォントで表示される文字の幅を以下のシンボルで指定します。
    • ultra-condensed
    • condensed
    • normal
    • semi-expanded
    • expanded
    • extra-expanded
    • ultra-expanded
  • :height .... フォントの高さを0.1ポイント単位で指定します。例えば、120と指定した場合には12ポイントと指定されたフェイスの条件に適合します。このキーを指定しない場合のデフォルト値はunspecifiedです。
  • :family .... フォントファミリ名の条件を指定します。このキーを指定しない場合のデフォルト値は"\\*"です。
  • :weight .... フォントのウェイトに関する条件を指定します。以下の値が指定できます。このキーを指定しない場合のデフォルト値はnormalです。
    • extra-bold
    • bold
    • semi-bold
    • normal
    • semi-light
    • light
    • ultra-light
    • extra-light
  • :slant .... 斜体やイタリック体に関する条件を指定します。以下の値が指定できます。このキーを指定しない場合のデフォルト値はnormalです。
    • normal
    • italic
    • reverse-italic
    • oblique
    • reverse-oblique

Meadowは、あるフェイスが表示される時点で、そのフェイスや表示される文字に関する 条件が specで記述された条件に適合するかどうかを順に調べます。条件に適合された specの項目が採用され(関数によるspecの場合にはこれが失敗することがある。その場 合には、次のspecをまた順に試していく)、その項目が指定する論理フォントを表示の ために用いることになります。なお、結果はキャッシュされるので、2度目以降の表示 にはこの評価は再度行われることはありません。

OPTION-ALISTには、そのフォントを表示する為のオプション設定を指定します。現状で 以下のオプションが指定できます。

  • encoding .... そのフォントのエンコーディングを指定します。通常は自動的に判別されますが、その判別がうまく行かない場合には設定しなければ正常な表示が行われません。この項目には以下のうちのいずれかを指定することが出来ます。

    • nil .... 文字セットのディメンジョンで、フォントのエンコーディングを推測します。1ディメンジョンのフォントの場合、1単位に付き1バイトでエンコーディングされ、2ディメンジョンでは1単位に付き2バイトでエンコーディングされます。

    • 1-byte-set-msb .... 文字セットのディメンジョンによらず、1単位に付き1バイトでエンコーディングされます。その際、最上位ビットは常に1になります。

    • 2-byte-set-msb .... 文字セットのディメンジョンによらず、1単位に付き2バイトでエンコーディングされます。その際、各バイトの最上位ビットは常に1になります。

    • shift_jis .... Shift-JIS形式でのエンコーディングを行います。ただし、文字セットが1ディメンジョンの場合バイトの上位ビットが1にセットされます。

    • unicode .... Unicode形式でのエンコーディングを行います。ただし、現状では、適切なエンコーディングが行われません。将来の為に予約されています。

    • エンコーディングメソッドシンボル .... w32-regist-font-encoderで登録されたエンコーディングメソッドを指定します。※ lisp/international/mw32misc.el , mw32-charset-windows-font-info-alist を参照

  • spacing .... 表示時の文字間のスペース間隔を指定します。例えば、1を指定すると1ドット間隔が増やされます。負の値も指定できます。
  • centering .... 非nil時には、ベースラインを用いず、全体で中心が揃えられるように表示が行われます。
  • relative-compose .... 合成文字を扱う際のグリフの判断基準を指定します。特殊なパラメータなので、通常は指定しないでください。
  • default-ascent .... relative-composeと同じく、合成文字を扱う際のグリフの判断基準を指定します。特殊なパラメータなので、通常は指定しないでください。

specの項目がstrictの時、LFには、論理フォントを直接指定します。

一方、specの項目がfunctionの時、FUNCTIONで指定された関数が、以下の形式で呼ばれます。

 (lambda (CHARACTER FACE-ATTRS FRAME))

ここでCHARACTERは表示されようとしている文字、FACE-ATTRSはフェイスの属性を表すリスト、FRAMEは表示対象のフレームです。 この関数は、渡された情報を基に適切な論理フォントを選択して返さなければなりません。 戻り値は次のいずれかとなります。

  • 適切な論理フォント
  • (論理フォント オプションの連想リスト)の形式のリスト
  • nil (適切なフォントが見つからなかった場合)

フレームの不透明度の設定 (3.00)

Meadow3ではフレームパラメータの設定によりフレームの不透明度(alpha)を設定することができます。 基本的な設定方法は以下のとおり。

(set-frame-parameter (selected-frame)  'alpha  80)

複数の状態で別々の不透明度を設定することもできます。 状態はアクティブ, 非アクティブ, 移動中, サイズ変更中の4種類です。
形式は以下のとおりで, 省略すると <active> と同じ値が設定されます。

(set-frame-parameter (selected-frame)  'alpha  '(<active> [<inactive> [<moving> [sizing]]]))

たとえばアクティブと非アクティブについて指定するときは、

(set-frame-parameter (selected-frame)  'alpha  '(100 70))

さらにフレームの移動中の不透明度まで設定するには、

(set-frame-parameter (selected-frame)  'alpha  '(nil 70 50))

となります. 100だと layered window のまま不透明になりますが, nil を指定すると layered window が解除されます. layered window だと編集中の画面表示に問題が出る環境の場合はこのようにすればよいでしょう. デフォルトの状態に戻すには、

(set-frame-parameter (selected-frame)  'alpha  nil)

フレームパラメータなので default-frame-alist で設定することができます。

IME

初期化設定

※ Meadow3 では mw32-ime-initialize を呼ばなくてもよいようになっている..はずです.

Meadowは、IMEをサポートしています。 起動時に Windows の環境が日本語環境 でかつIMEが利用可能なときはデフォルトで IME を使うように設定されます。

従来どおり .emacs で mw32-ime-initializeを呼んでもかまいません.

(mw32-ime-initialize)
(setq default-input-method "MW32-IME")

IMEの動作の設定 (r3998)

Meadow3では、IMEの動作を Quail と互換となるようにしています。そのため isearch などでも普通にIMEを使うことができるようになっています。migemo を r3998 以降の Meadow で使うときには Meadow 対応の部分を削除したほうが よいと思います。[meadow-develop:7092] (r4051以降ではこのr3988対応の migemo.el を使っ て .emacs に後ろに上げる設定を入れることで正しく動くようになるはずです。)

IMEの動作は以下の変数で切り替えることができます。

  • mw32-ime-cont-on: IME のON/OFFの制御パターンを指定します。 デフォル ト値は 'always で、従来どおり IME 入力モードにするだけで IME を起動 状態にします。(r4051) t の時はミニバッファでのみ、nil の時は常に mw32-input-method を使って入力を行います。 mw32-input-method は少々 トリッキーなことをしているため負荷が高い状態で速い入力を行うとときど き怪しい動作をしますがそれはご愛嬌ということでご勘弁ください。
  • mw32-input-method-noconv-regexp: m32-input-method での入力の際に IME を起動しない文字群を定義します. たとえば以下のように設定すると大 文字アルファベットと数字、そして空白を入力したときにはIMEを起動せず にそのまま入力されます。
(setq mw32-input-method-noconv-regexp "[A-Z0-9 ]")
  • mw32-fep-switch-by-key-event: "全半" ではなく、"C-\" でIMEの切り替え をやっているとIMEが起動できなくなることがあります。どうやら Windows のバグのようですが、 そういう場合はこの変数を t にすることで問題を回 避することができます。 この変数を t とすると IMM API を使う代わりに Windows のキーイベントを発行して IME の切り替えを行うようになります。

r4051以降ではIMEの処理を元の方法に近いやり方に戻しています。 isearch と migemo の関数に以下の defadvice を入れることで全体的に正しく動くと思います。 ここはまたまとめて整理します。

(defadvice migemo-isearch-toggle-migemo (after mw32-fep-control activate)
  (if (or migemo-isearch-enable-p
	  (not (equal current-input-method "MW32-IME")))
      (fep-force-off)
    (fep-force-on)))

(defadvice isearch-mode (before mw32-fep-control activate)
  (if migemo-isearch-enable-p
      (fep-force-off)))

入力文字列のフォント指定

frame-alistに、ime-fontキーを指定することで、IMEの入力文字列のフォントを設定す ることも出来ます。(IMM APIの実装と共に将来的には廃止される可能性があります) た だし、制限として、Windowsのフォント以外は選択されません。BDFフォントは使用する ことができません。.emacsなどの設定例を以下に示します。

 (setq default-frame-alist
       (cons '(ime-font . (w32-logfont "MS ゴシック"
                                       0 0 400 0 nil nil nil 128 1 3 49))
             default-frame-alist))

サブプロセスの起動に関する機能

引数編集機能

Meadowは、外部プロセスを起動することが出来ますが、Windowsでは、引数の渡し方が UNIXでの方法とはかなり異なったものになっています。 UNIX では引数は次のような方 式で渡されます。

 argv[0] = /usr/bin/ls
 argv[1] = -l
 argv[2] = "/home/himi/foo"

しかし、Windows では引数は一つの文字列でなくてはなりません。 さらに問題なことにこういった引数を文字列に結合する方法は起動されるプログラムによって異なるのです。 Windowsでは、慣例的に、おもに次の3つの方法が用いられます。

  • 単純な結合 .... 単純に引数を結合し、それぞれの引数を空白文字で区切ります。 この方法は単純ですが欠陥もあります。 引数にスペースが入っていてもそれを判別することが出来なくなってしまうのです。 上の例では"/usr/bin/ls -l \"/home/himi/foo\""という文字列になります。
  • Microsoft Visual C++の方法 .... Microsoft Visual C++は引数を二重引用符(")の引用符で囲んで結合します。

それぞれの引数は空白文字で区切られます。 引数に二重引用符がある時はバックスラッシュ/円記号(\)を付加してエスケープします。 二重引用符がバックスラッシュ/円記号の後にある場合はさらにもうひとつのバックスラッシュ/円記号を付加します。 この方法は複雑ですが、引数のスペースも引用符も正確に起動プログラムに渡すことができます。 上の例だと"\"/usr/bin/ls\" \"-l\" \"\\\"/home/himi/foo\\\"\""という文字列になります。

  • Cygwinの方法 .... 面倒な事ですが、Cygwinでは、また別の方法で引数を引用符で囲みます。 Cygwinのプログラムは引数を二重引用符(")で囲んで結合します。 それぞれの引数は空白文字で区切られます。引数に二重引用符がある時はこれを重ねて""に変換します。 この方法も引数にスペースや引用符が入っていても正確に起動プログラムに渡すことができます。 上の例だと"\"/usr/bin/ls\" \"-l\" \"\"\"/home/himi/foo\"\"\""という文字列になります。

Meadowでは、この問題に対処する為に「引数編集」機能を備えています。この機能によって、 ユーザーが引数を実際にプロセスに対してどのように渡すかを制御することが出来ます。 これは実際には起動プロセスのプログラム名に対して照合される正規表現を指定することによって行われます。

引数編集の設定

「引数編集」は、次の関数で設定します。

 (define-process-argument-editing PROCESS FUNCTION &optional METHOD)

PROCESSには、正規表現を指定します。起動されるプログラム名はフルパスかつ区切り 文字が'/'に正規化されて、この正規表現に対してマッチが行われます。マッチが成功 すると、FUNCTIONで指定された関数が呼ばれ、引数が実際に変換されることになります 。

FUNCTIONはプロセスに渡されるべき引数のリストとともに呼ばれます。この関数は以下 のうちの一つの方法で値を返さなければなりません。

  • 関数が文字列を返却した場合、プロセスは、その文字列を引数として起動されます。
  • (PROGRAM . ARGUMENT)のコンスペア(PROGRAMもARGUMENTも両方とも文字列でなければなりません)を返却した場合、PROGRAMで指定されたプロセスが、ARGUMENTを引数として起動されます。

METHODには、設定がどのような優先順位で登録されるかを指定します。以下のうちのい ずれかが指定可能です。

  • 'first .... 設定を一番最初に登録します。従って、その設定の優先順位は最も高くなります。
  • 'last .... 設定を一番最後に登録します。従って、その設定の優先順位は最も低くなります。
  • 'append .... 設定を付け加えます。もしPROCESSがすでに登録されていると、何もしません。そうでない場合はその設定を一番最初に登録します。
  • 'replace .... 設定を置き換えます。もしPROCESSがすでに登録されていると、新しいものと置き換えます。そうでない場合は何もしません。
  • nil .... もしPROCESSがすでに登録されていると、新しいものと置き換えます。そうでない場合はその設定を一番最初に登録します。

引数編集の削除

「引数編集」の設定を削除するには以下の関数を用います。

 (remove-process-argument-editing PROCESS)

PROCESSには、削除したい設定に対応する正規表現を指定します。

引数編集設定用の関数

引数編集を簡単に設定するために以下の関数が用意されています。

 (general-process-argument-editing-function ARGUMENT QUOTING ARGV0ISP
                                            &optional EP H2SP QP S2ISP)

ARGUMENTには引数文字列のリストを与えます。通常第一要素は起動プログラムパスであり、 ARGV0ISPの指定により特別な変換がなされます。

QUOTINGには引数の引用符の処理をどのようにするかを指定します。以下のうちのいずれかが指定できます。

  • nil .... 引数を単純に結合します。引数は空白文字で区切られます。
  • 'msvc .... Microsoft Visual C++の方法で引用符をつけます。
  • 'cygnus .... Cygwinライブラリの方法で引用符をつけます。

ARGV0ISPが非nilの場合、引数リストの第一要素(argv[0]に相当する)の区切り記号をバックスラッシュ/円記号(\)に変換します。

(general-process-argument-editing-function 
 '("/usr/bin/ls" "-l" "\"/home/himi/foo\"") 
 'msvc t)
=> "\"\\usr\\bin\\ls\" \"-l\" \"\\\"/home/himi/foo\\\"\""  ;;  /usr/bin/ls => \usr\bin\ls

QUOTINGで指定された方法で引数が一つの文字列として結合された後、 EP, H2SP, QP, S2IPSに従って、文字列は変換されます。

EPが非nilの場合、バックスラッシュ/円記号(\)をエスケープキャラクターと見なし、 その後の文字は変換されません。

H2SPが非nilの場合、文字列の中のハイフン(-)はスラッシュ(/)に変換されます。

(general-process-argument-editing-function 
 '("/usr/bin/ls" "-l" "\"/home/himi/foo\"") 
 nil nil nil t)
=> "/usr/bin/ls /l \"/home/himi/foo\""

QPが非nilの場合、引用符(')または二重引用符(")で囲まれた部分を、引用符で囲まれた文字列と見なし、 その文字列を変換しません。

(general-process-argument-editing-function 
 '("/usr/bin/ls" "-l" "\"/home/himi/foo\"") 
 nil nil nil nil t)
=> "/usr/bin/ls -l /home/himi/foo"

S2ISPが非nilの場合、文字列の中のスラッシュ(/)はバックスラッシュ/円記号(\)に変換されます。

(general-process-argument-editing-function 
 '("/usr/bin/ls" "-l" "\"/home/himi/foo\"") 
 nil nil nil nil nil t)
"\\usr\\bin\\ls -l \"\\home\\himi\\foo\""

ラッパプログラムの設定 (3.00)

Meadow3 ではサブプロセスの起動の際にそれを起動するのに用いるプログラム(ラッパプログラム)を指定することができます。 たとえば foo.exe -a hoge をサブプロセスとして起動するときに bar.exe をラッパプログラムとして指定すると、 コマンドライン的には以下のような形でプログラムが起動されます。

 bar.exe foo.exe -a hoge

この機能を制御するのは mw32-process-wrapper-alist という変数です. たとえば以下のように設定することで, Meadow が tcsh.exe と bash.exe を 仮想端末越しに起動しようとしたときに fakecygpty.exe というプログラムをラッパプログラムとして用いて起動されるようになります。

 (setq mw32-process-wrapper-alist '(("/\\(tcsh\\|bash\\)\\.exe" .
	 (nil . "fakecygpty.exe"))))

fakecygpty.exe は、指定されたプログラムに仮想端末を与えるプログラムです。これによって Meadow の shell-mode で動いている(cygwinの) bash から(cygwinの)telnet や (cygwinの)ssh を実行するとパスワードプロンプトを正しく扱えるようになります。

また, mw32-process-wrapper-alist ではプロセスの起動直前に実行するelisp関数を指定することができます.

 (setq mw32-process-wrapper-alist '(("/\\(tcsh\\|bash\\)\\.exe" .
	 (nil . ("fakecygpty.exe" . set-process-connection-type-pty)))))

とすることでMeadowがプロセスを起動する準備の過程で set-process-connection-type-pty を呼び出します. set-process-connection-type-pty は Meadow3 で本体に追加されている関数で, 起動したプロセスを内部的に仮想プロセスとして扱うように指示します. これにより, 普通はプロセスに eof を送るとパイプを切断してしまうところを正しく(?) C-d を送るようになります. 非常に危険なところに仕込まれているフックなので取り扱いには注意が必要です.

fakecygpty.exe

fakecygpty.exe は、指定されたプログラムに仮想端末を与えるプログラムです。実験的に Meadow3 のソースツリーの $(TOP)/nt の下にソースが置かれています。

Windows上の Emacsではサブプロセスとの通信はpipeで行われます. Windowsには仮想端末は存在しないので通常は問題ありませんが, Cygwin では仮想端末のエミュレーションを実装しているためpipe接続を行うと問題が起きる場合があります。典型的な例としては shellモードで cygwin の scp を動かしたときに ssh-agent を動かしていないとそのまま固まるというものがあります。

fakecygptyはこれらの cygwin プログラムのラッパとして動いて, 子プロセスに対して仮想端末接続を与えることで期待した動作をさせるプログラムです。

ネットワーク環境について

FQDNの取得

Meadowでは(w32-get-fqdn)という関数で現在のシステムのFQDNを取得できます。通常の Emacsとは異なり、起動時にFQDNを自動的に取得したりはしません。このため、 system-nameにFQDNがセットされません。起動時にsystem-nameにFQDNをセットするため には、以下のような設定を.emacsなどに追加してください。

 (setq system-name (w32-get-fqdn))

しかし、環境によっては、この設定によって、MeadowはDNSサーバーへの問い合わせを 行うようになるので、システムはダイアルアップネットワークのダイアログをだすかも しれません。このダイアログを出したくないときは、以下の事項をチェックしてくださ い。

  • 正しいドメイン名とホスト名をコントロールパネルで設定する
    OS毎に設定は違いますが、FQDNをネットワーク設定であらかじめ指定しておくと、いちいちDNSサーバーに取得をすることはなくなります。
  • hostsファイルを設定する
    Windowsではhostsファイルによってもドメインネームを決定しますので、このファイルにFQDNを設定することもできます。

通常hostsファイルはc:\Windows\system32\drivers\etcディレクトリにあります。

このファイルのlocalhostに対応するエントリを以下のように編集してください。

 127.0.0.1       localhost <あなたのホストネーム(FQDN)>

その他

起動時のフレームの位置について(3.00)

Meadow3 では起動時とLISPコードからのフレームの移動の際にデスクトップの領域からタスクバーなどを除いた領域(ワークエリア)からはみ出すような指定を行った場合にはワークエリア内にフレームを収めるように再配置を行うように なっています。

この機能が邪魔だと思う人は、mw32-restrict-frame-position を nil としてください。再配置を行わなくなります。この変数のデフォルト値はtです。