2010-08-07

Emacs でウィンドウの位置決め

これは Mac OS X (Snow Leopard) で、Carbon Emacs (2010年版) を使う場合の話。他のプラットフォームや他の Emacs で同様の手順が有効かどうかは知らない。

現在、ウチのメインマシンは iMac (Mid 2010) で、セカンドディスプレイとしてシネマディスプレイがつながっている(→ iMac とシネマが並んだ写真)。iMac が右でシネマが左という配置だ。iMac をメイン、シネマをサブディスプレイとして使っている。メニューは iMac に表示されている。この状態で、Carbon Emacs のウィンドウが起動時にシネマにくるようにするにはどう設定すれば良いか?

Carbon Emacs では(おそらく大抵の GUI ベースの Emacs でも同様)、起動時におけるウィンドウの位置、サイズ、その他もろもろは .emacs 中で default-frame-alist に値(正確にはキーワードと値のペアのリスト)を設定することでおこなう。ウィンドウのサイズ(行数)なら height、位置なら topleft だ。

Carbon Emacs ではメインディスプレイの左上が原点、つまり座標 (0,0) で、右にいくにしたがい水平座標の値が増え、下にいくほど垂直座標の値が増える。では、原点よりも左側にある領域の位置はどう表現すれば良いんだろう? 素直に考えれば負値で表現となる。(left . -300) などのように。ところが、これを指定してもうまくいかない。値をいろいろ変えてみてもメインディスプレイの右端に表示されてしまう。どうやら負値を指定すると画面の右端から測った位置の意味になるようだ。

ググってみたところ、Emacs Lisp でウィンドウの位置を始めとする情報を取得できることがわかった。「なら、ウィンドウを適当な位置に動かした後で *scratch* から lisp コードを実行すれば位置の表現方法もわかるんじゃないか」と思いついた。

Carbon Emacs のウィンドウを好みの位置に動かした後、*scratch* バッファに移り、(frame-parameters (selected-frame)) を評価する。これでそのウィンドウの各種特性値がリストになって返ってくる。以下はその戻り値のサンプル。長いのでバックスラッシュで折り返してある。

((parent-id) (explicit-name) (display . "Mac") \
(visibility . t) (icon-name) (window-id . "9520240") \
(top . 2) (left + -605) \
(buffer-list #<buffer *scratch*> #<buffer  *Minibuf-1*> #<buffer *GNU Emacs*>) \
(unsplittable) (minibuffer . #<window 4 on  *Minibuf-0*>) \
(modeline . t) ...)

この中の left をふくむ部分がウィンドウの水平位置の表現になる。どうやら、メインの左側に置かれたサブディスプレイの領域は「負値を加えるという表現」で指定するようだ。あとは、これをそのまま .emacsdefault-frame-alist の設定に使えば良い。

参考までに、現在 iMac 上の Carbon Emacs で使っている .emacs の一部を以下に示す。この設定では、Carbon Emacs のウィンドウがサブディスプレイの右端に表示される。

(.emacs より抜粋)
 1: (cond ((or (eq window-system 'macosx) (eq window-system 'mac))
 2:        (tool-bar-mode -1)  ; turn off Tool Bar
 3:        (require 'carbon-font)
 4:        (fixed-width-set-fontset "hiramaru" 12)
 5:        (global-font-lock-mode 1)
 6:        ;; set working directory to my home.
 7:        (if (not (equal (getenv "HOME") (expand-file-name default-directory)))
 8:          (setq default-directory "~/"))
 9:        (setq default-frame-alist (append
10:                                   '(
11:                                     (cursor-color . "Navy")
12:                                     (height . 98) ; for 30inch Cinema
13:                                     (top . 2)
14:                                     (left + -605)
15:                                     )
16:                                    default-frame-alist))
17:      ))

関連リンク

関連記事

0 件のコメント:

コメントを投稿