Firefoxの"ページのソースを表示"で外部エディタを使うと開けないことがあるのを回避する

タイトル長い。WindowsのFirefoxで外部エディタを設定するとまず間違いなくはまるバグをどうにか回避してやろうという試み。このバグは対象のページのソースを一時的なファイルに保存までは正常に行えているものの、指定した外部エディタにそのファイル名がUTF-8(多分)で渡されるのが原因。直接view_source.editor.pathに外部エディタを指定せずに、ゴニョゴニョするバッチ・ファイルを指定してやるという手法で頑張ってみた。結果、できないことなどないということがわかった。バッチファイルすげー。

@echo off

pushd %TEMP%

for /f "delims=" %%i in ('dir /b /od') do set x=%%i

"C:\WINDOWS\notepad.exe" "%x%"

exit

以上のバッチ・スクリプトをview-source-editor.batなどというファイル名で適当なフォルダに保存する(notepad.exeのパスは使いたいエディタのパスに変更)。あとはFirefoxでabout:configからview_source.editor.pathに保存したview-source-editor.batのフルパスを設定するだけ(view_source.editor.externalがtrueであることも確認)。

about:configによるview-source-editor.batの設定例

user.jsで設定する場合は、

user_pref("view_source.editor.external", true);
user_pref("view_source.editor.path", "C:\\Path\\to\\view-source-editor.bat");

で良い。設定後、ファイル名の文字化けが起こるページ(例えばAmazon.co.jpのトップ・ページ)でページのソースを表示(View Page Source)を実行した時、ソースの表示のためにFirefoxによって作られた一時的なファイルが設定したエディタで開かれるはず(稀にまったく関係ないファイルが開かれる可能性はある)。

以下は仕組みの説明。

確実に開かれるわけではない理由は簡単で、Firefoxから送られるファイル名をまったく無視しているから。バッチ・スクリプトの5行目の、

for /f "delims=" %%i in ('dir /b /od') do set x=%%i

で、dir /b /odの出力結果を1行ずつxという環境変数にどんどん上書きしながら格納していくコードが肝。

/fはファイルや文字列、コマンドの標準出力などを解析する時のforのオプション。

delimsは、ParsingKeywordsというforのオプションで、区切り文字をセットするオプション。これは省略可能だが、指定しないとデフォルトで空白(とタブ)が区切り文字として設定されるので、delims=と何も指定しないようにしておく必要がある(空白が含まれるファイル名になることが多いので、デフォルトのままだとまずい)。

inの後ろの括弧に括られた部分が、for /fの解析の対象になる。一重引用符の場合はコマンドとして解釈される(引用符がないとファイル名、二重引用符だと文字列として解釈される)ので、この場合dirコマンドの結果が対象になることになる。

dirコマンドには、

/b
ファイル名のみの出力にする
/od
更新日時でソートする

というオプションを与えているので、最終的にxには一時フォルダ(%TEMP%)にあるファイルの中で更新日時が一番新しいファイルのファイル名が入ることになる。

Firefoxのページのソースを表示(View Page Source)からこのバッチ・ファイルを呼び出した場合、ほとんどの場合xに入るファイル名はソースの表示のために作られた一時的なファイルであるので、結果としてエディタでソースが表示できることになる。

3.5系(3.1b1とか)で直っる予定のバグだったら笑える(3.1b3でちょっと試してみたけど直ってない感じだった)。そういや3.1b2pre以降からview_source.editor.argsとかいう外部エディタに引数を渡す設定が出来、行番号等を渡せるようになってるらしい。