olt2でバッファバーの代わりにする

 自分はxyzzyでタブバーというか正式名称バッファバーを表示してないんだけど、変わりにolt2(outline-tree2)でバッファバーの役割をさせてる。とかいう話。

 初めの頃はバッファバーもolt2も両方表示させたりolt2は使ってなかった頃とかもあったりしたんだけど、最近はバッファバーは必要ないような気がして表示していない。バッファバーはタブにバッファ名を表示するわけだけど、olt2を常時使うようになってみるとolt2にファイル名も表示されてるし、同名のファイルを使用しているときにもディレクトリの違いが一目瞭然なので混同される事はないし、olt2はバッファバーと違ってサイドに表示できるので、エディタ的には画面の余白部分を使用できるので画面のリソース的にも効率が良いように思ってみてバッファバーは表示しなくなった。
 使ってみると、olt2は縦に並べるので、沢山ファイルを開いて並べても一つのファイルは1行程度しか場所取らないので沢山並べれる。バッファバーだとファイル名によっては直ぐ埋まってしまうがそういう問題はない。しかもバッファバーの場合と違って大量に開いてもディレクトリ毎に纏めてくれるので意外と見やすい。もし必要なければ、フォルダ単位で非表示にしておけるし、ファイル名とかで検索できるので、実質的には簡易検索機能も付いてる*1
 で、全く問題がないかといえば、そうでもなくて、例えばバッファバーだとクリックした時に直ぐバッファにフォーカスが移るので、ワンクリックで入力できる。olt2はファイル名をクリックするとフォーカスがolt2に移動してしまうので、Windowの表示をノード追従にしてもバッファをもう一度クリックしないといけなくて、なんだか気持ちよく書けない。勿論、olt2の本当の目的の通りにアウトライン解析とかに使う分にはその方が都合が良いし、そもそも、キーボードでバッファを切り替えたりしてればこれなくても殆ど問題はないけど、ブラウザとか使ってて切り替えた時は如何してもマウス持ってるから押したくなる。
 で、そういう風に変えてみた。

■具体的に何をするか
 olt2のバッファ名をクリックすると直ぐバッファへフォーカスを移す。下のコードを適当に.xyzzyとかsiteint.lとかに書いてバイトコンパイルで使う。直接olt2を書き換えても良いんだけど、.xyzzyとかに書けば、もし問題があったときにも消すだけで直ぐ元に戻るので、安全面を考えるとこういう風にしたほうが良いかなぁとか。変数とかについてるoutline-tree2::が邪魔な人は適当にパッケージを変えてから書くと良いかもしれない。

■設定
 変数のtreeview::*treeview-click-focas*をtでフォーカスをエディタにnilでフォーカスをtreeviewに。もし他の自分の関数とかでフォーカスが必要な時は一時的にこの辺をnilに刷れば良いかもしれない。試してないけど。

;;tでフォーカスをエディタにnilでフォーカスをtreeviewに
(defvar treeview::*treeview-click-focas* t)

(defun outline-tree2::outline-tree-set-buffer-by-node (&optional node)
  (treeview::with-app (outline-tree2::*outline-tree-app-id*)
    (unless node
      (setq node (outline-tree2::outline-tree-get-selected-node)))
    (setq node (outline-tree2::outline-tree-get-buffer-node-by-node node))
    (let ((window-list (mapcar 'car (caddr (current-window-configuration))))
          (buffer (outline-tree2::outline-tree-get-buffer-by-node node))
          (current-window (selected-window)))
      (when (and (windowp outline-tree2::*outline-tree-target-window*)
                 (not (eq outline-tree2::*outline-tree-target-window* (selected-window)))
                 (not (minibuffer-window-p outline-tree2::*outline-tree-target-window*))
                 (member outline-tree2::*outline-tree-target-window* window-list))
        (set-window outline-tree2::*outline-tree-target-window*))
      (set-buffer buffer)
      (set-window current-window))
    (winapi:InvalidateRect (get-window-handle) 0 1)
    (winapi:UpdateWindow (get-window-handle))
    (if treeview::*treeview-click-focas*
        (treeview::treeview-focus-editor))
    (refresh-title-bar)
    (refresh-screen 1)))

例によってあんまり試してないので、問題はあるかもしれない。
 oltの方にフォーカスを持って行きたい時はキーボードからフォーカス移せば良い。olt自体の機能を使う時は、回数的にキーボードに手が移動した後の方が多いのでそんなに問題はないとは思う。

■追記 3/31
 後で確認したら、キーボードから操作してもバファにフォーカスが移ってしまうようなのでチョット問題はあるかも。ノード内部にいるときはフォーカスが移動しないが、キーボード操作する場合は結構問題ある。キーボードからの操作とマウスからの操作は変えたい感じはするので、何かもう一工夫しないと駄目かも。右クリックとかは普通に動くし、メニュバーとかから操作するようなのは問題ない感じだけど。
olt2でバッファバーの代わりにする(その2) - himadatenodeの日記
http://d.hatena.ne.jp/himadatanode/20080331/p2

*1:この辺はsilogのhttp://white.s151.xrea.com/wiki/index.php?memo%2Fxyzzy%2FOutline-tree2#w4d99805を使うと更に素早い移動が出来るかも