Firefoxでダウンロードしたファイルをキーボードで操作するためのKeySnailプラグイン,dlbsnailをリリースしました

KeySnail

id:moozさんが作っているFirefoxアドオンでKeySnail(http://github.com/mooz/keysnail)というのがあります。このアドオンを使うことによってFirefoxの動作やjavascript関数などに手軽にキーバインドを与えることができ、FirefoxEmacs風にすることができるという、キーボード中毒の人には非常にありがたいアドオンです。このアドオンはプラグインシステムを持っており,機能をどんどん拡張できるという特徴もあります.

Download Statusbar

KeySnailとは別にDownload Statusbar(https://addons.mozilla.org/ja/firefox/addon/download-statusbar/)というシンプルなステータスバーでファイルのダウンロードを表示・管理できるアドオンもあります.非常に便利なので愛用していますが,1つだけ不満がありました.ダウンロードしたファイルを開くにはどうしてもステータスバー上のファイルをクリックしなければならないことです.キーボードで何でも済ませたい僕は今回,この問題を解決すべく,KeySnailのプラグインを作ってみました.

インストール

仕様にはもちろんKeySnailとDownload Statusbarがインストールされていることが前提となります.インストールされていない場合は上記のリンクからインストールしてください.
それが終わったらこのリンクを右クリックして「このプラグインをインストール」を選択してください.

設定と使用方法

下記の設定を.keysnail.ks.jsのPRESERVEエリアに貼り付けることをおすすめします.

key.setViewKey('d', function (ev, arg) {
    ext.exec("dlbsnail-show-file-list", arg, ev);
}, 'Show Download Statusbar Items', true);
key.setViewKey('D', function (ev, arg) {
    ext.exec("dlbsnail-show-command-for-all", arg, ev);
}, 'dlbasnail-all系コマンド', true);

これによってView Modeの時にdキーを押すことでダウンロードしたファイルの一覧が,Dキーを押すことでファイル全体を対象とする操作と対象のファイル数の一覧がそれぞれ表示されます.ファイルの一覧ではダウンロード完了したものを選択してEnterを押すことでそのファイルを開くことができます.全体操作コマンドの一覧では,(当たり前ですが)選択対象のコマンドが実行されます.
また,個別ファイルの操作は開く以外にもリネーム・URLのコピー・ステータスバーからの削除などができるようになっています.下記の設定をすることで実行できるようになります.

plugins.options["dlbsnail.file_key_map"] = {
    "C-z"   : "prompt-toggle-edit-mode",
    "SPC"   : "prompt-next-page",
    "b"     : "prompt-previous-page",
    "j"     : "prompt-next-completion",
    "k"     : "prompt-previous-completion",
    "g"     : "prompt-beginning-of-candidates",
    "G"     : "prompt-end-of-candidates",
    "q"     : "prompt-cancel",
    // for finished file
    "o"     : "open-this-file",
    "O"     : "show-this-file",
    "R"     : "rename-this-file",
    // "C-D"   : "delete-this-file",
    "C"     : "clear-this-file",
    // for in progress or pause file
    // "C-C"   : "cancel-this-file",
    // for in progress file
    // "C-P"   : "pause-this-file",
    // for pause file
    "r"     : "resume-this-file",
    // for all file
    "c"     : "copy-url",
    "V"     : "visit-ref-website",
    "u"     : "undo-clear",
    "h"     : "refresh-file-list"
};

これによりプロンプトで標準の操作以外には以下のコマンドが実行出来るようになります.

o ファイルを開く
O ファイルを含むフォルダを開く
R ファイルのリネーム
C ファイルをステータスバーから取り除く
r ファイルのダウンロードを再開
c ダウンロード元のURLをコピー
V ダウンロード元のURLを訪れる
u ステータスバーから最後に取り除かれたファイルを元に戻す
h 一覧の更新

ただ,ファイルの削除,ダウンロードのキャンセルなどは不可逆な操作なので誤操作によって実行されてしまうと元に戻せません.そのため上記の設定では誤操作が起きないようにコメントアウトしてありますが,危険を承知の上で使用する場合には適宣コメントを外してください.

バグ

ダウンロードが完了していないファイルがある場合,ファイル一覧を表示中にはダウンロード中のファイルの状態を更新するために,一定間隔(デフォルトでは1秒)でprompt.refresh()を呼んでいます.そのため,prompt-select-actionを行ってもリセットされてしまい,上手く動作しないバグがあります.何らかの方法で対処したいと思っています.しかし(ただの言い訳ですが)Javascriptを書くのは生まれてはじめてなので明らかに勉強不足であるのが現状です.対処方法があれば是非教えてください.

追記

上記のバグに対処しました.対処方法は,prompt-select-actionを自分で上書きするというとんでもない力技です.もっとエレガントな方法を知っている方は是非教えてください.