Firefox4.0で出るクソウザイタブ追加アイコンを消す

そこまでクソウザイわけでも無いけれど。
あ、Vimperator向けです。

Firefox3.5で出るクソウザイタブ追加アイコンを消す - :vimperator Trapezoid - vimperatorグループ

Firefox4.0ではタブを沢山開くと、これに代わり別のタブ追加アイコンが現れる。

これも一緒に消しちゃいましょう。

style chrome://* .tabs-newtab-button, #new-tab-button { display: none;}

vimperatorrcに書けばいけます。

Vimperatorの:tabopenコマンド(liberator.open)で現在のタブのすぐ右隣にタブを開くようにする

2011/01/13追記: 外部アプリからURL開く時も同様の動作にしたい場合はこちらへ Vimperatorで現在のタブの右隣にタブを開くようにする(外部アプリからURLを開く時なども) - wltの日記

TabMixPlusとかのアドオンに頼らずに、Vimperatorの:tabopenコマンド(が内部で呼んでるliberator.open関数)で現在のタブのすぐ右隣にタブを開くようにする。
これはabout:configのbrowser.tabs.insertRelatedAfterCurrentがtrueで無ければならない。
.vimperatorrcファイルに次を追加

" タブの開く位置を現在タブのすぐ右にする。(liberator.openの改造)
js <<EOM
liberator.open = liberator.eval(
                   '(' +
                   liberator.open.toSource().replace(/loadOneTab\(([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^)]+)\);/, 'loadOneTab($1, {referrerURI: $2, charset: $3, postData: $4, inBackground: $5, relatedToCurrent: true})') +
                   ')',
                   liberator.open);

EOM

調べたこと(メモ書き)

liberator.open関数はgBrowser.loadOneTabを呼ぶ。
gBrowser.loadOneTabの引数を2個だけにすると、第2引数を次のようにして呼び出せる。

gBrowser.loadOneTab(aURI,
    {
        referrerURI: aReferrerURI,
        charset: aCharset,
        postData: aPostData,
        inBackground: aLoadInBackground,
        allowThirdPartyFixup: aAllowThirdPartyFixup,
        relatedToCurrent: aRelatedToCurrent,
    });

このrelatedToCurrentプロパティだな。
gBrowser.loadOneTabはgBrowser.addTabに、自身のだいたいの引数を渡して呼ぶ(relatedToCurrentの値も)。
relatedToCurrentをtrueにしておけばgBrowser.addTabが右隣にタブ開いてくれそうだな。

Firefox 4.0b8〜b9 でLDRize (Minibufferの修正)

2010/02/09追記: 「ldrize firefox4」でググるとトップに来ちゃうので追記。
Firefox 4.0b10からは他に問題が出てきて、この記事の方法だけではLDRizeできません。方法が無いわけではありませんが、ちょっと難しくなります。詳しくはこちら→Firefox 4.0b10でGreasemonkey 0.9.1のユーザスクリプトのwindowを共通にする改造(開発者orVimper向け) - wltの日記

なお、Minibuffer自体でのエラー(下記参照)だけなら、この記事の内容で直ると思います。



Firefox 4.0b8〜b9 でLDRizeしたいけど動かないので少し修正をした。
LDRizeが依存しているMinibufferがエラーが起こしてたので、これを修正。これだけでLDRizeできるようになった。
正直、原因がよく分からないけども、まぁ回避策として。
Minibufferのバージョンは

var VERSION = "2009.12.06";

修正パッチはこんな感じ

@@ -815,7 +815,7 @@
 // http://userscripts.org/scripts/show/11996
 // slightly modified.
 var FlashMessage = new function(){
-       GM_addStyle(<><![CDATA[
+       GM_addStyle((<><![CDATA[
                #FLASH_MESSAGE{
                        position : fixed;
                        font-size : 500%;
@@ -833,7 +833,7 @@
                        min-width : 1em;
                        text-align : center;
                }
-       ]]></>)
+       ]]></>).toString());
        var opacity = 0.9;
        var flash = $N('div',{id:'FLASH_MESSAGE'});
        hide(flash);

ちなみにエラーの内容は

エラー: can't wrap XML objects
ソースファイル: file:///[Firefoxのプロファイルフォルダ]/gm_scripts/minibuffer/minibuffer.user.js
行: 818

どうもXMLオブジェクトを渡すのがいけないらしくてtoString()メソッドで文字列にした。
だけど、他の場所では普通にXMLオブジェクトを渡して問題起きない・・・。イミフ

VimperatorでGreasemonkeyみたいな事をする

2010/02/09修正: Google検索のやつをFirefox 4.0b11でも動くようにした

特定のウェブページにちょっとしたユーザスクリプトを当てたい事があるけど、グリモンに追加するほどのものでもないし、さくっとVimpだけでやりたい時がある。Vimpにはそもそもautocmdコマンドがあるのでこれを使えばいいけど、ちょっと面倒。と言うわけで簡単なユーティリティ関数を書いた。

// Greasemonkeyライクなautocmdユーティリティ
// window, unsafeWindowの代わりにcontent, unsafeContent
function vimpMonkey(urlRegexPattern, func) {
  var cmd = eval('(function(args) {' +
    'var content = tabs.getTab(args.tab - 1).linkedBrowser.contentWindow;' +
    'var unsafeContent = content.wrappedJSObject;' +
    func.toSource() + '();' +
  '})');
  autocommands.add('PageLoad', urlRegexPattern, cmd);
}

ほぼautocmdで呼ばれる関数のラッパ関数なので、グリモンみたいなGM_なんとか関数はもちろん無い。windowは最上位のchromeウィンドウ(?)のままなので、コンテンツウィンドウにアクセスする時は変数contentを使う。また、unsafeWindowの代わりにunsafeContentを用意してある。

使い方は次のように。

// Google検索の左メニューを常に表示
vimpMonkey('(www|encrypted)\\.google\\.co(m|\\.jp)/search',
  function() {
    if (content.getComputedStyle(content.document.getElementById('hidden_modes'),'').display == 'none') {
      unsafeContent.google.x('showmodes', {apply: function(){unsafeContent.google.srp.toggleModes()}});
    }
  });

Vimperatorのautocmdで-jsオプションを使った時

autocmdで-jsオプション使うと{cmd}はfunction(args){with(args){ }}でラップされる
argsには以下のプロパティがある

url URL
title タイトル
tab イベントの起きたタブが何番目か?(1オリジンなのでtabs.getTab(tab-1)とすべし
doc tabs.getTab(上記tabの値-1).linkedBrowser.contentDocument (※文字列なのでevalするといい)

CygwinのddでUSBメモリのMBRを読み書きする

自作OSなどをUSBメモリから起動するために、USBメモリMBRを読み書きする。FreeBSDLinuxなどの環境ならば普通にインストールされてるddを使えばいいが、Windowsにはddが無い。そこでCygwinのddを使う。

まずCygwin上でのUSBメモリのデバイスノード名を調べる。

$ cat /proc/partitions
major minor  #blocks  name

    8     0 117219767 sda
    8    16 244197527 sdb
    8    32 244194455 sdc
    8    48   7897088 sdd
    8    49   7895916 sdd1

これでデバイスノード名が分かる*1。#blocksからUSBメモリのデバイスノード名の見当を付ける。より確実に見当を付けるには、USBメモリを挿す前と後で見比べたり、dfコマンドの結果や、Windowsの「コンピュータの管理」の「ディスクの管理」を見ればいい。
ここではsddが目標のUSBメモリだ。これはもちろんUSBメモリに直にアクセスできるデバイスノードなので、ここからddでMBRを読み書きできる*2

$ dd if=/dev/sdd of=mbr count=1
$ dd if=mbr of=/dev/sdd count=1

おわり。

ところで次の方法ではUSBメモリ内のパーティションへのアクセスになってしまうので、MBRに触れない。ここでUSBメモリのドライブレターは「F」とする。

$ dd if=\\.\F: of=mbr count=1

まぁ、OSの自作やってるわけじゃないんだけどね。

*1:出力は環境によって異なる

*2:もしかしたらユーザがAdministrator権限持ってないと駄目かも

VimperatorでIIDXの譜面検索する

VimperatorからTexTageのIIDX譜面を検索して、新しいタブに開くコマンドを追加する。
Firefoxの「この検索にキーワードを設定」ではできないけどVimpならできる。素敵。
使い方は次の通り

:iidx safari

.vimperatorrcに追加する記述

"" IIDX譜面検索
" scrlist.js : refers()を元に作成
js << EOM
commands.addUserCommand(['iidx'], 'Search IIDX score',
  function(args) {
    var nowval = args.string;
    var refcrdstr = "_";
    // 4桁の16進Unicodeに変換
    for (ri=0; ri<nowval.length; ri++) {
      refcrd = (nowval.charCodeAt(ri)).toString(16);
      while (refcrd.length<4) refcrd = "0"+refcrd;
      refcrdstr += refcrd;
    }
    liberator.open('http://textage.cc/score/index.html?r712B00' + refcrdstr, liberator.NEW_TAB, false);
  }); 
EOM

VimperatorユーザかつIIDXプレイヤなんてどれ位いるんだろう

VimperatorでRequestPolicyを操作する

2011/05/10: いつの間にかrが動かなくなってたので修正

VimperatorからRequestPolicyのポップアップを表示したり、リダイレクト制御の許可をさせたりできるようにする。
マッピングは次の通りにしてある

リダイレクトのオプション gro
リダイレクトの許可 grr
操作用ポップアップ表示 r

.vimperatorrcに以下を追加

"" アドオンRequestPolicyの操作
" 操作用ポップアップ表示
" cf. chrome/requestpolicy.jar/content/overlay.js : openStatusbarPopup()と_attachPopupStatusbar()
javascript <<EOM
mappings.addUserMap(
  [modes.NORMAL],
  ["<Leader>r"],
  "Open RequestPolicy Popup",
  function(){
    requestpolicy.overlay.openStatusbarPopup(document.getElementById('status-bar'));
  }
);
EOM
" リダイレクトの時の許可ボタンをgrrで、オプションをgroで
nnoremap <silent> grr :js gBrowser.getNotificationBox().currentNotification.getElementsByAttribute('label', '許可')[0].click()<CR>
nnoremap <silent> gro :js gBrowser.getNotificationBox().currentNotification.getElementsByAttribute('label', 'オプション')[0].click()<CR>