Firefox

Last-modified: 2011-03-31 (木) 10:46:41

macについてはこちら

自作scripts

userscripts.orgでホストしていただいている自作のgreasemonkeyスクリプトを中心に紹介しています。

GoogleResult sites blocker for Greasemonkey

Q&Aサイトやwikipediaなど、そういうサイトがみたいときははじめっからそっちを検索するよ、というサイトが検索結果に出てくるのを防ぎます。
wikipediaなどの結果にうもれて目的サイトが上の方に出てこなくてイライラしている人は試してみてください。

wikiwiki_toolicon_kill for Greasemonkey

wikiwikiをはじめとしたpukiwiki plus利用サイトで画面下の編集バーを消します。
wiki記法になれた人にとっては邪魔な代物で、タブ二回でポストが出来なくなるのでこれを防ぎます。

Redirect_cutter for Greasemonkey

どなたかのスクリプトをもとに作ったきもするんですが、インスパイア元が見つからないので今のところオリジナルだと認定しています。
リダイレクトが必要なページのリダイレクトを抑えます。正規表現利用で設定はめんどくさいけれど、多くのサイトに対応できるものになっています。

Search Delicious on Google for Greasemonkey

googleの検索結果の右側、広告が時折出る部分をつぶし、かわりにdeliciousを検索した結果を表示します。
使う前にアカウント名を設定してください。パスワードは不要で、ログインも不要です。

Addon bar - slim addon bar - userstyles.org

firefox4 のアドオンバーのたかさをすこしだけちいさくします。
Status-4-Evar :: Add-ons for Firefoxと一緒につかうのがおすすめです。

高橋メソッドと起動スクリプト

起動スクリプト

次のファイルをtakahashiとか保存して実行権限をつけておけば、コマンドラインから外部ファイルを読み込んで起動できる。mydataの指定はprefs.jsでしている。
パスは適宜書き換えてください。

#/bin/sh
if [ $# -gt 0 ]; then
   cp $1 $HOME/takahashi/chrome/content/mydata
   firefox -app $HOME/takahashi/application.ini
else
   echo "Please set argument."
fi

文法

複数行では
[[SOME:nantoka
kantoka
nantoka:SOME]]

  • CHAPTER:
  • EM:強調
  • PRE:整形済み
  • 表: |~背景暗く|データ|データ
  • XUL,XHTMLなどがつかえる(RAW:?)
  • ラベル|URL?,URL?
  • [[image src="" height="" width=""]]
  • HEADER:
  • FOOTER:
  • ALIGN:LEFT/RIGHT/CENTER

KeySnail

KeySnailとはFirefoxでいろいろなキーコンフィグを実現するAdd onである。

作成スクリプト

hokまわり

autofire時に一定時間で実行する

たとえばSとSAがあるときに、Sだけ押してSに行こうと思うと行かない。それに気がついてEnterを押すまでのんびりすることになる。
解決方法は二つ。

  1. リンク数をカウントし、十分な数確保できるマッピングを行う
  2. 開始、あるいは初打鍵から一定時間後に自動で飛ぶ
    2で、開始からの時間を測れば悪く無いと思うが。
    そのうち実装予定

フォントサイズを変更する

optionの配列を定義するだけ。
次の配列を好きにいじり、.keysnail.jsに書き込む
plugins.options["hok.hint_base_style"] = {

       position        : 'absolute',
       zIndex          : '2147483647',
       color           : '#000',
       fontFamily      : 'monospace',
       fontSize        : '10pt',
       fontWeight      : 'bold',
       lineHeight      : '10pt',
       padding         : '2px',
       margin          : '0px',
       textTransform   : 'uppercase'
   };

eで小文字、Eで大文字にする

リンクキーを押したときにどちらで開く状態なのか分かりやすくしたい。
そのうちやるかも

CaretModeを視覚化

HoK+Caret-Hintではいるのが最も多く、入っていることを忘れがちなので、上のロケーションバーの周りの色を変えて視覚化したい。
結果:http://gist.github.com/642035
greasemonkeyに載せられるといいが、Ccが呼べないため断念
Caret-hintはutil.setBoolPrefを呼んでいる行の前に同じ記述をすればいい。

linuxでC-sできない

windowsもそうかもしれないが、LinuxではC-sにファイルに保存が標準で割り当てられており、C-sで検索しようとするとgFindbarにIバーが立っているときには保存ダイアログが出てしまう。
とりあえずkeyconfig 20080929 • mozillaZine ForumsでC-sを無効にすることで事なきを得たが、時間があったらkeysnailだけで解決したい。
ご存じの方は教えてください。

promptまわり

IME

ふつうpromptでは英語しかつかわないのに、IMEがonになっていると時間の無駄(tabをpromptで切り替える人はこの範囲ではないだろうけど)。とくに、アドレスバーと違い、コマンド入力時にそこに目を持っていかないので、誤入力しやすい。
解決策はcssのime-modeを使う。
stylishでおこなうが、there.is.only.xulのnsをロードするとうまくいかないのでロードしてはいけない。
ついでにピンクにしてみた。

#keysnail-prompt{
 background-color: #ffccFF;
}
#keysnail-prompt-textbox .textbox-input{
 ime-mode: inactive !important;
}

bmanyが遅い

bmanyが目標をマークアップするのが遅い。

  1. enterを押されても、候補を絞り切るまでページを開かない。
  2. anythingっぽくせず、通常の補完なかんじにする。

バグ・不具合メモ

  • getBoxObjectForはbsolete(command.js l.506)
    詳細:https://developer.mozilla.org/en/DOM%3aelement.getBoundingClientRect
    recenter関数をこんな感じで書き換えればよさそう。
    wikiのtipにおいて提出済み。
  • mac向きの注意
    Mac OS X上ではマークセットが難しい。一部にはC-SPCがspotlightとかいう機能に割り当てられているからであり、これはemacsと共通の問題だが、さらなる問題がある。
    • 一つめはC-SPCで(SpotLightを外したとして)コンテキストメニューが呼び出されることである。この機能はハードコードされているらしい。なぜこの組み合わせに置いたんだろう。
    • 二つめは.keysnail.js内で、C-@とセットしたときに、このキーシーケンスは正しく受け取れないという問題である。macでは"C-`"(`はShift-@)と指定しなければいけないようだ。なんでだ?

デバッグ用関数

  • メッセージをコンソール出力
    Application.console.log(mesg);
  • 要素のプロパティ一覧をコンソール出力
    util.listProperty(elem);
  • (おまけ)firebug用
    Firebug.Console.log( obj )

vimperatorからの移植

vimperatorの関数の多くをkeysnailでも同じように使うことができるが、liberatorクラスは独自クラスなので、そこだけ適当な関数に置き換える。

saveImage 関数

画像をダウンロードして保存するための関数。これをPRESERVEエリアに入力して、HoKで割り付ければOK。
このスクリプトはvimperator用のスクリプトをもとにつくりました。原作者に謝意を表します。
http://gist.github.com/586145

Functions

Delicious bookmark

deliciousのAdd-onをいれているなら、

key.setViewKey(['C-c', 'd'], function () {
   yAddBookMark.open();
}, "deliciousブックマーク", true);

いれていないなら(bookmarkletからの引用)

key.setViewKey(['C-c', 'C-d'], function () {
   f='http://www.delicious.com/save?url='+encodeURIComponent(getBrowser().contentDocument.URL)+\\
'&title='+encodeURIComponent(getBrowser().contentDocument.title)+'&v=5&';
   a=function(){
       if(!window.open(f+'noui=1&jump=doclose','deliciousuiv5','location=yes,links=no,\\
scrollbars=no,toolbar=no,width=550,height=550'))
           location.href=f+'jump=yes'
   };
   if(/Firefox/.test(navigator.userAgent)){
       setTimeout(a,0)
   } else {
       a()
   }
}, 'deliciousブックマーク', true);

(\\のところは改行不要)
取得対象がまちがってたので、getBrowser()をつかって取得するように更新(2010-11-28)

References

commands一覧

List of commands - MDC

keyMapの内部構造

4つのkeyMap配列のなかで、C-zやC-_などの文字列がキー、実行すべき関数がその要素、説明とrepeatのBOOL値が関数のプロパティになっている。
Firebugで表示するには setTimeout(function(){Firebug.Console.log(key.keyMapHolder)},1000); というかんじで。

Enhanced Finderの勝手にbug fix

設定がロードされなかったり変なAdd-onだなぁとおもったらいろいろ突っ込みどころが見つかったのでつっこんでみた。
Add-onじたいは発想、機能ともにとても優れたものだと思うが、いくつかの動作不良からユーザにいまいちと評されているのは残念なことである。

2010-11追記

作者のdoikenさまがMacに対応した新しいバージョンを公開されるということで、拙作xpiはここからは削除しました。
最新バージョンはenhanced findbar :: Add-ons for Firefoxで配布されており、私の変更をオプションとしてマージして頂いております。
もしここのxpiを使っている方がいらっしゃいましたら、今後はそちらをご利用いただき、バグ報告や要望などはdoikenさまのほうにお願いします。

1. 状態の非同期

gFindBarがハイライトしているかどうかの設定(toggleHighlight)と、ハイライト状態を示すボタン("highlight"エレメント)は同期していないので、Add-on開発者が整合性を取る必要がある。
ボタンが押されたときに発するコマンドは

toggleHighlight(this.checked);

であるから、この状態を適切に変更することは大変重要だと考える。
最も間違いのない解決策はすべてをボタンを通して管理することにし、
状態取得:ボタンの状態監視
状態変更:getFindBar.getElement("highlight").click()
で行うことであろうか。
ただし、toggleHighlight(true)かonFindAgainCommand(false)をしないと現在の検索ワードを適応してくれないので、検索ワードを変更するおそれのある処理の後はこの関数を呼ぶ必要がある。
alwaysHL周りの処理は抜本的にやり直したほうが良いのではないかと思う(本当に常時有効にしたいのならば、togglehighlight関数をよばれるたびにハイライトする関数に書き換えればいいだろう(true固定))。

2. 設定が正しく反映されていない。

マウスで選択した文字を検索・・の設定がきちんと反映されていない様に思う。TripleClickの設定と独立させたいならいまのままhlAssist関数内で分岐させればいいが、負荷を気にするユーザにとってはtripleClickと一緒にけせばクリックイベントのリスナが減るというのは魅力かもしれない。prefのファイルもいじって抱き合わせるように設定した(どうせ使わないし)。
さらに、disabledであることと、その設定が無効になっていることは関係ない。理想的にはdisabledにしてもユーザの設定を覚えておいてくれて、その値が参照されたときにはfalseを返すといった動作が望ましいのはもちろんだが、そうはいかないのでtoggleでdisableするときにcheckedであったらuncheckしなければいけないと思う。
また、設定項目のなかのいくつかは再起動しないと反映されない(initで関数を書き換えちゃってるので、initのリロード程度では解決しない。それぞれのcheckが変更されたときにそれぞれ関数を呼べばいいが)。それも説明書きのどこかに書いておいたほうが親切だろう(もちろん再起動しなくてよくすべきなのは言うまでもないが)。

3. wordList機能

wordListはとても便利な機能だが、このような一般的な名前をつかっているのは拡張性に疑問を感じる。たとえば将来wordList機能が標準実装されたときにそれとかぶってしまいかねない。この名前は

ehnancedFB-wordList

のように拡張名を混ぜた名前にすべきだろう(もともとの要素が全部find-を冠している点から当然の配慮と考えられる)。
さらにインクリメンタルに単語を追加していく機能もいまいち必要性がわからなかったので、enterが押されたときだけにするようにしてみた。個人的にはこの機能はつかわないので別にいらないのだが。正規表現2回という複雑さのわりにもたつきは感じ無いが、一応。

4. 選択文字列の分割

画面上で選択したとき、その情報がwordListに分割されないで送られる。もしかしたら意図した動作なのかもしれないが、何となく気持ち悪いので修正した。いちどfindbar-textboxになげてからその結果をarrayでもらっているのはおそらくstring化のためだったようだ。toString()関数を使ったほうが処理の目的が明確になってよい。
もしかしたら、分割しないって言うボタンも欲しいのかもしれない(一度分割したものを選択したら、もう元の状態に戻せないため。とりあえずmiddle clickを区切りつきの追加に当てた。しかしgoogleなどのエンジンとちがって一言一句マッチをおこなうから、半角スペース以外の区切り文字に対応できないという欠点がある。)

5. getInnerText function

この関数はなににつかっているのだろうか。なんらかのノードの中身を再帰的にテキスト配列で取得する関数のようだが、releaseでは消したほうがいいんじゃ。

6. 日本語の使用

xulファイル内に日本語の固定文字列がある。プログラムとくっついた部分以外はi18nの観点から全部dtdに書くべきだろう。今回の場合、xul内の単語はユーザに表示されてしまう。重大なバグと言っても差し支えない。install.rdfにも日本語コメントがみられる。これは差し支えないはずだが、万が一をかんがえてやはりASCIIで書きたいような気がする。
参考

Mac OSへの対応

私が見た範囲でOS X (テスト環境はLeopard+Fx3.6.8)に対応させるために必要な変更は、Ctrl+FのかわりにCmd+Fを使うことだけのようである。どのレイヤーでこの振り分けを行うべきなのかはわからないが、このAdd-onのユーザを増やすためにもmac対応をすべきと考える。
e.ctrlKey -> e.metaKey

メモ

gFindBar._enableFindButtons()の定義:
808 enableFindButtons: function (aEnable)
809 {
810 var findNext = document.getElementById("find-next");
811 var findPrev = document.getElementById("find-previous");
812 var highlight = document.getElementById("highlight");
813 findNext.disabled = findPrev.disabled = highlight.disabled = !aEnable;
814 },
引用元:findbar.jsのソース

ただし、次の関数リストのなかに上記関数はないことから、_ではじまるローレベル関数(あるいは内部関数)にはあまりアクセスしない方がよいだろう。上記ソースから現在のあいだにクラス仕様もかわったようで、いくつかの関数は使えなくなっていたり、引数がかわって認識しなくなっていたりする。
上述の状態の非同期のような問題も起きるので、余程の理由がない限りパブリックな関数でしのぎたい。
https://developer.mozilla.org/En/XUL/findbar

FirefoxAddons

uidとアドオンの対応

{02450954-cdd9-410f-b1da-db804e18c671} - screengrab
{3dba5b22-2e1a-11dc-8314-0800200c9a66} - bookstack
{455D905A-D37C-4643-A9E2-F6FEFAA0424A} - RefControl
{46551EC9-40F0-4e47-8E18-8E5CF550CFB8} - stylish
{582195F5-92E7-40a0-A127-DB71295901D7} - GmailManager
{8b86149f-01fb-4842-9dd8-4d7eb02fd055} - AllInOneGesture
{dd6bfa32-1198-4217-a0e9-1acab501a6e9} - GoogleImageReLinker
{e4a8a97b-f2ed-450b-b12d-ee082ba24781} - GreaseMonkey

JSAction

配布場所:http://hideaway.cc/Firefox/wiki.cgi?page=FrontPage

JSActionで"."で始まるファイル/ディレクトリを無視する変更

UNIX系OSでは"."で始まるものはシステムファイルやらなんやらなので、コレを弾く。
ただし、ファイルについては標準で.jsのみを表示するようにしているので弾く必要はないと判断。
対象:ROOT/chrome/jsactions.jar/content/jsactions.js

if(!entry.isDirectory()){
	if(entryName.search(/\.js$/i) == -1) continue; // js ファイル以外を無視
	if(entryName.search(/init\.js$/i) >= 0 ) continue; // init.jsは無視
	if(entryName.indexOf(".") == 0) continue;
}
if(entry.isDirectory() && type == this.JS_ACTIONS_STARTUP ) continue;
if(entry.isDirectory()) aMenu = true;
if(entryName.search(/^[0-9_]*\-\-/i) >= 0 ) aSep = true;
entryName = entryName.replace(/^[0-9]+_/g, ""); // 最初の数字のみ無し
entryName = entryName.replace(/_/g, " "); // アンダーラインを空白に
entryName = entryName.replace(/\.js$/i, ""); // 拡張子を取り除く

switch(entry.isDirectory()){
	case true:
		if(type == this.JS_ACTION_STARTUP)	continue;		//STARTUP属性は無視
		if(entryName.indexOf(".")==0)		continue;		//.で始まるものは無視
		aMenu = true;
		break;
	case false:
		if(entryName.search(/\.js$/i) == -1)		continue; // js ファイル以外を無視
		if(entryName.search(/init\.js$/i) >= 0 )	continue; // init.jsは無視
		break;
}
if(entryName.search(/^[0-9_]*\-\-/i) >= 0 ) aSep = true;
entryName = entryName.replace(/^[0-9]+_/, ""); // 最初の数字のみ無し(g指定はおかしい)
entryName = entryName.replace(/_/g, " "); // アンダーラインを空白に
entryName = entryName.replace(/\.js$/i, ""); // 拡張子を取り除く

Bookstack

ナビバーからワンタッチで積読できるべきだと思ったので、ボタンを追加。

  1. ボタンをつくってskin/classicに入れる
  2. skin/classic内のbookstack-button.cssを書き換えて、上で追加したボタンをidに反映させる
  3. bookstack-Overlay.xulにボタンを追記。
    <toolbarbutton id="bookstack-add-button"
     tooltiptext="&bookstack.tooltipadd;"
     label="&bookstack.button.titleadd;"
     oncommand="if (event.target == this) bookstack.stack.addCurrentToStack(event);"
     class="toolbarbutton-1 chromeclass-toolbar-additional"></toolbarbutton>
  4. 次のように使う言語のdtdを修正する
    <!ENTITY bookstack.button.titleadd "積読追加">
    <!ENTITY bookstack.tooltipadd "現在のページを積読">