2008年8月29日金曜日

gnome2 + emacs-22.2.1 + windows.el で、ウインドウ切り替え時、キーボードフォーカスが移動しない

10年ほどXEmacsを使い続けてきましたが、数年前から、XEmacsは、もうダメかな?と思い出していまして、Emacsに戻ろう・・・と思ってましたが、環境整備をするのが面倒で、やっぱりXEmacsを使い続けてきました。
何年か前に、XEmacsでもEmacsでも、同じように使えるように、環境を整えたことはあったんですが、Emacsのバージョンもどんどん新しくなってしまい、どうも、あちこちに違いがでてきてしまってるんです。



最近、fvwm-1.24からgnomeにしようかな?と思い出したのをきっかけに、ここ2~3日、Emacsを使って「リハビリ」してます。



オープンソースなソフトウェアは、わりと、同じソフトをず~っと使い続けることができる(慣れたものを長く使い続けられる)、っていうメリットがあるような気がしてるんです。私の計算機環境なんて、15年くらい、画面の見た目が変わってなかったような…。
ただし、マイナーなソフトとか、開発が停滞しちゃったりするものは、使う人が自分でなんとかするしかない。それがダメならあきらめて乗り換える、ってことになっちゃいます。そういう意味でXEmacsは…
そういう危機を回避するために、とくにテキストエディタなど重要なソフトウェアの場合は、いくつか代替手段を、普段から用意しておかないとまずいですね。





Emacs Lispで書かれたwindows.elというツールがあるんですが、これを使うと、キーボード操作だけで、Emacsのウインドウ(Emacsでは「frame」と呼ぶ)を自在に扱えるようになります。これも、たぶん10年くらい使ってるような気がします。



ふと気がつけば、windows.elってちゃんと今でもバージョンアップしてるんですね。とっても、うれしいです。

http://www.gentei.org/~yuuji/software/



*- Emacs-Lisp -*-
;;; Window manager for GNU Emacs.
;;; $Id: windows.el,v 2.44 2008/06/08 21:55:54 yuuji Exp $
;;; (c) 1993-2008 by HIROSE Yuuji [yuuji gentei.org]
;;; Last modified Mon Jun  9 06:48:44 2008 on firestorm

さてさて、emacsに戻ろうと思っていろいろ環境整備をやりなおしていたんです。
FreeBSDでportsでemacsをインストールすると、現在のバージョンは22.2.1になるんですが、なんか、windows.elを使ってて、挙動がおかしいのです。

(scratchバッファにて)
emacs-version [Ctrl+J]
"22.2.1"

たとえば、C-c C-w 2とかでウインドウを切り替えると、フレームが前面に持ち上がってくる(raise)けど、キーボードフォーカスが元のウインドウに残ったままなんです。マウスでクリックすれば、キーボードフォーカスが移動するんですが、それじゃwindows.elを使う意味がない。



ためしにXEmacsで試してみると、おや、XEmacsでは、ちゃんとraiseしたあと、フォーカスも移ります。
たしかemacs21のときは、ちゃんと動いていたような気がします。
emacs22でだけ、動きが違うんでしょうか???





もしかすると、ウインドウマネージャのせいかもしれない?!と思い、ちょっと調査。



gnomeは最近使い始めたばかりなんで、ぜんぜんよくわかってないんですが、ウインドウマネージャはmetacityという名前らしいです。



「設定エディタ」を起動して中を見ていくと、



apps → metacity → general → focus_mode



というのがあって、"click"になっていたんですが、どうも望むものとは違うっぽい。



「全面に出たウインドウに自動的にフォーカスを与える」、という設定があるかも?と思って探していたんですが、そういうのはないみたいです。





というわけで、windows.elをいじくればなんとかなるかな?と思って、ざっと眺めてみて、よくわかんないけど、1つ、方法を見つけました。



以下のところに、1行追加して、x-focus-frameで、フォーカスを移動させるようにしてみたら、うまいこといきました。



;;;
;; For Emacs 19 frame feature
;;;
(defun win:select-frame (num)
  "Select the NUM-th window frame."
  (if (= (length (frame-list)) 1)
      (if (eq (selected-frame) (aref win:configs num)) (selected-frame) nil)
    (let ((goal (aref win:configs num)))
      (if (null (frame-live-p goal))
      (aset win:configs num nil)    ;returns NIL
    ;(if (eq (cdr (assq 'visibility (frame-parameters goal))) 'icon)
    ;    (make-frame-visible goal))    ;to de-iconify(if iconified)
    ;;'visibility attribute is not defined in XEmacs...
    (or (eq t (frame-visible-p goal))
        (make-frame-visible goal))
    (while (not (frame-visible-p goal)) (sit-for 0))
    (raise-frame goal)
    (x-focus-frame goal) ←追加
    (select-frame goal)





Emacs Lispは、難しいですね。よくわかんないです。ぜんぜんLispじゃないし・・・あっ、Lispだったらもっとわかんないです。昔、授業でちょっとだけ習いはしましたが・・・





ぜんぜん違う話で、今日発売の週刊モーニング掲載の「社長 島耕作」。
「VO社」という名前の企業がちょろっと言及されています。



VOって、どこのことだろう?と思ったんですが、偶然、

■元麻布春男の週刊PCホットライン■
180度変わった、IntelのTVに対する姿勢
http://pc.watch.impress.co.jp/docs/2008/0827/hot567.htm

を読んでたら、「北米で急速にシェアを獲得したVisioなどは」という文があり、おお、このVisioってのが、VO社に違いない!と思ったんです。



でも、ネット検索しても、Microsoft Visioのことばっかり・・・「site:~」とか「-Microsoft」とかいろいろ追加したのに。



ようやくわかりました。Visioじゃなくて、Vizioであると。



なるほど。大画面の液晶テレビとか、値段がすごく安いですね。
安すぎて、そんなんで大丈夫なのか?と、不安になるぐらいです。





今日の反省。



島耕作で新しい知識を身につけるようじゃ、現代人としてやばい。







0 件のコメント:

コメントを投稿