January 06, 2005

Mozilla Thunderbird のキーバインディング

[ インターネット ]

なにやらスパム判定機能がいいとのことで周囲の人が Mozilla Thunderbird をおすすめしてくる昨今です。僕も何度か導入を試みているのですが、xkeymacs を利用して Emacs キーバインドを実現しているため、Thunderbird のもつ重要な操作のうちいくつかが、Emacs キーバインドで上書きされてしまってそのままではちょっと使い勝手が悪いのです。

thunderbird.png

Thunderbird ではメール本文の検索や、取り込んだメールの検索は Ctrl + F や Ctrl + Shift + F で起動することができます。が、Emacs では Ctrl + F はカーソルのフォワードに割り当てられているので、検索を他のキーにバインドさせないと辛いところ。特に僕は、現在メールの振り分けは最低限しか行っておらず必要なものは検索で見つけるという方法で日々のタスクをこなしているので、キーボードから検索を呼び出せないというのは致命的。

どうやら Thunderbird ではキーバインドを自由にカスタマイズすることも可能とのことなので、そのやり方を調べています。キーバインディング定義を上書きするための XML 文書 (XULとかXBLというのかな?) を書いてやって、適当なディレクトリに放り込めばよいことは分かりました。

コピーやカット&ペースト、カーソルの移動などの、メールエディタに関するキーバインドに関しては Thunderbird ディレクトリの res/builtin/platformHTMLBindings.xml に定義されており、これと同じディレクトリに userHTMLBindings.xml を作ってそこに好みのキーバインドを定義してやればよいみたい。(参考 'Thunderbirdのキーバインドカスタマイズ')

そのとき、binding エレメントの属性が editor のものをユーザ定義で上書きするには binding id="editorUser" というエレメントを用意してやって、その子エレメントの handlers に列挙していく。例えば入力欄でコピーを Ctrl + w に割り当てたいときはこんな感じかな?

<?xml version="1.0"?>
 
<bindings id="htmlBindings"
  xmlns="http://www.mozilla.org/xbl"
  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
  <binding id="inputFieldsUser">
    <handlers>
      <handler event="keypress" key="w" modifiers="accel" command="cmd_copy"/>
    </handlers>
  </bindng>
 
</bindings>

キーバインドに関しては handler の event は keypress で固定。w キーは key="w" で表す。(keycode="VK_DELETE" として delete キーを表現したりというパターンもあり。) modifiers 属性は Ctrl や Alt などの同時押しのメタキーを表現するものみたい。XBLのドキュメントを見ると Ctrl は "control"、Alt は "alt"、shift は "shift"。platformHTMLBindings.xml 内で使われている "accel" が何に相当するのかは記述が見当たらなかったけど、Windows だと Ctrl に相当するのかな。(明示的に "control" と記述している例もあるので、accel と control はちょっと違うんだろう)

でまあ、肝心の検索のキーバインドなのですが、それも userHTMLBindings.xml に記述するものなのか、別のファイルにするべきなのかがまだわかってないです。あと、binding の id や handler の cmd も。

Firefox だと navigatorOverlay.xul というファイルに

<!-- Search Menu -->  
<key id="key_find" key="&findOnCmd.commandkey;" command="Browser:Find" modifiers="accel"/>
<key id="key_findAgain" key="&findAgainCmd.commandkey;" command="Browser:FindAgain" modifiers="accel"/>
<key id="key_findPrev" key="&findPrevCmd.commandkey;" command="Browser:FindPrev" modifiers="accel,shift"/>
<key keycode="&findAgainCmd.commandkey2;" command="Browser:FindAgain"/>
<key keycode="&findPrevCmd.commandkey2;" command="Browser:FindPrev" modifiers="shift"/>
<key id="key_findTypeText"/>
<key id="key_findTypeLinks"/>

という記述がみつかるのだけど、この辺が怪しいのかなあ。&findAgainCmd.commandkey みたいな & つきの keycode はどこかへのポインタかな...この辺は XUL をちゃんと理解しないとだめか。

ということで前途多難です。まだ乗り換えにはいたっておらず。キーバインドを自由に再定義できる extention とかないのかな?

追記: accel キーに関してはこちらに以下の記述があった。

Mozilla は、クロスプラットフォームアプリケーションとして、異なるプラットフォーム上で別々の修飾キー (modifier key) を扱わなければなりません。Windows は Control キーをそのバインディングの大部分に使っています (例えば Ctrl + Q でアプリケーションを終了します)。Mac は Command キーを使っています (Cmd + Q は Windows における Ctrl + Q と同じ働きをします)。Unix は伝統的に Alt キーを使っています。なぜなら、Unix のアプリケーションは Control に Mozilla のウィンドウバインディングと矛盾する、他のバインディングを持っているからです。しかし、Windows バックグラウンドを持つ一部の Linux ユーザは Control を使いたいと思っています (Control はデフォルトです。理論上 Alt キーを好む人はたいてい経験豊富なユーザです)。そこで Mozilla では、ウィンドウバインディングに使われる修飾キーを アクセル (accel)キー と呼び、それは変更可能なものとなっています。
Posted by naoya at January 6, 2005 07:52 AM | トラックバック (0)  b_entry.gif
トラックバック [0件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/1417
コメント [2件]

早速WinのThunderbirdをemacキーバインディングを変えようと試みましたが、ctrl+ほげほげ だと、いろんなショートカットにぶつかりまくりで、カスタマイズモチベーションが急降下です。
ctrlの代わりにaltを使おうと思っても、アクセラレーターで使われまくりだし、、
とりあえず修飾キーをctrl+shift にしてみましたが、すこぶる使いにくい。
なんか上手い方法ないですかね。。

[1] Posted by: isao at January 6, 2005 11:50 AM [返信]

窓使いの憂鬱を使うのはどうでしょう。
アプリケーションごとにキーバインドの変更ができるはずですので、
例えばThunderbirdでは ^F を無効にするとかができると思います。

[2] Posted by: Anonymous at January 6, 2005 11:19 PM [返信]
コメントする









名前、アドレスを登録しますか?