Qutebrowserでのダウンロード先ディレクトリをrofiで選べるようにしてみた
Qutebrowserでは、ファイルをダウンロードする際に保存先を選ぶポップアップ?が出てくる。 しかし、これは前回使用したパスしかないし、タブキーでの補完もあまり上手く動かない(補完しようとすると 一つ上の階層を選択したりする)しで使い勝手があまりよくなかった。
私は、保存先がいくつかあってそれを使い分けるタイプなので、いっそのこと最初に表示する保存先の候補を リストから選択できるようにしよう、と思い立った。 Qutebrowserでも絞り込みとかはできるが、なんか挙動がいまいちに感じていたので、それならrofiを使ってやろう と思い立ったのがきっかけ。
どう動くのか
ゆーちゅーぶってヤツにデモ動画を上げてみたのでそちらを参照してほしい。 主には、今迄通りダウンロードをしようとするとrofiが(dmenuモードで)立ち上がり、 一つ選択したらそれが・選択されなかった場合は元のqutebrowserのアルゴリズムで選ばれたパスが ダウンロード先として表示される。
技術的詳解
詳解ってほどでもないけど...
qutebrowserのブラウザに関連する処理は qutebrowser/browser
に集められている。
その中でもダウンロードに関係するのは qutebrowser/browser/downloads.py
である。
一目瞭然なので。
ここのうち、パスを割り出すのに使っている部分が download_dir
なので
ここに処理を挟み込んだ。
Rofiを呼び出す際の注意点
標準入力に渡すファイルオブジェクトは 必ず
seek(0)
することこれを怠ると、読み込みのポインタがファイルの最後にあるので何も読めない
tempfile.TemporaryFile
にはmode="w+"
オプション引数を付けてあげるそうじゃないとバイナリを期待される。まぁどちらでも良いのかもだけどバイナリではないので。
rofi -dmenu
の標準出力をCompletedProcess.stdout
から取得すると、末尾に改行文字(\n
)を含む外してあげないと表示がうまくいかない。空白があるように見えた。
Qutebrowserに新しい設定を組込む
この実装では downloads.location.favorite_paths
という新しい設定項目を
追加している。
これは、 qutebrowser/config/configdata.yml
というYAMLファイルをいじるだけで良い
(少なくともそれで動いている、公式の情報を元にしていないため何かしら足りない可能性はある)