内骨格をいじる - 表示色を変えてみる 

内骨格は、2画面の、Python拡張機能を書くことができる、あふっぽいファイラだ。現在(2008/02/18)の最新バージョンは1.33。

いきなり余談

内骨格は以下のサイトで配布されている。

普段、あふを使っているし、Pythonなら少しはわかる。これは面白いかもしれない。というわけでダウンロードした。
http://hp.vector.co.jp/authors/VA012411/cfiler/doc/image/screenshot.png
(スクリーンショットは配布サイトのものを使用しています。クリックで拡大)
以前のバージョンでは、「とりあえずフォルダでも作るか」と"k"を押したら削除の確認が出て大いにびびったけど、1.29から、あふ互換のキー割り当てができるようになり、"k"でフォルダ作成、削除は"d"という、あふでの操作が可能になった。
さて、本題の拡張である。
とりあえず、フォルダの表示色を、ファイルと一目で見分けられるようにしたい。それは機能拡張なのか?という疑問は気にしない。

やってみる

表示色を変更する手順。とても面倒。

  1. 内骨格のソースファイルをダウンロードする。
  2. ソースから、描画のためのメソッドを探す。
  3. 見つけたメソッドを別の場所にコピーする。
  4. その中から、attrや、attribute_normalを編集する。
  5. クラスのメソッドを、いま編集したメソッドに付け替える。

1.については特に問題ないだろう。
2.について。例えば、ファイルリストの部分の描画は、cfiler_mainwindow.MainWindow._paintFileListItemsと、cfiler_filelist.item_CommonPaint.paintが行っている。一つ目がリストの空欄、二つ目がファイル名がある部分の描画をそれぞれ担当している。
どのペインをどのメソッドが描画しているかは、cfiler_mainwindow.MainWindow.paintをみて、だいたいあたりをつける。
3.について。コピーしたメソッドをconfig.pyに貼り付けてもいいのだが、別のスクリプトに切り分けたいと思ったら、config.pyと同じフォルダに新しくファイルを作るのではなく、"script"というフォルダを作って(デフォルトでは存在しない)、その中に作る。こうしないと、config.pyからスクリプトをインポートできない。

4.について。実際に描画しているのは、cterm.Window.putStringメソッドで、表示色を決めているのは、cterm.Attributeクラス(のインスタンス)。なので、putStringを呼んでいるところをみつけてゴニョゴニョする。
フォルダの表示色を変更したい場合は、cfiler_filelist.pyの、item_CommonPaint.paintメソッドをコピーして、

    #cfiler_filelist.pyの79から83行目
    if self.isdir():
        if self.ishidden():
            attr_fg=(85,85,50)
        else:
            attr_fg=(255,255,150) #←この数値を変更

などとする。
5.について。最後にクラスメソッドを編集したメソッドに置き換える必要がある。config.pyのconfigure関数の最初に、以下のように書いておく(hoge.pyファイルに、item_CommonPaint.paintメソッドを編集したpaint_itemメソッドを書いたとする)。

import hoge

def configure(window):
    cfiler_filelist.item_CommonPaint.paint = hoge.paint_item
    #そのほかの置き換えがならぶ
    window.paint() #起動直後に色の変更を反映

結論


もろもろやってだいたいこんな感じに。とても疲れた。まさか、表示色の設定が、メソッドのローカル変数になってるとは思いもしなかった。メソッドをコピーして、付け替える、なんてやってるのは、これのせい。MainWindowクラスの、クラス変数か何かになってると思ったのに。
ローカル変数を外から変更する手段はない(参照はできる)から、メソッド書き換え以外に方法はないと思う。
…今思うと、描画メソッドを書き直して、ソースを全部コンパイルした方が速かったかも。…さらば、私の半日。