コワイ、ネコ、コワイ

自由気ままに行動して愛らしいネコですが、かわいらしく思えるネコの行動の中には飼い主を殺そうとしている事を表わす行動があるそうです。普通に考えるとツメを出し、キバをむき出しにしている姿を想像してしまいますが、実は普通では気付かないような行動こそ殺そうとしているサインのようです。

身に覚えがありすぎる!
コワイヨー

getter 付きのオブジェクトの生成が重い

ただのオブジェクトに比べて、50倍くらい時間がかかる。
Vimperator でテスト。

テストコード

  let time = function (name, func) {
    let [a, r, b] = [new Date(), func(), new Date()];
    log(name + ": " + ((b.getTime() - a.getTime()) / 1000) + "msec");
    return r;
  }

  time('object - getter', function () {
    let ary = [];
    for (let i = 0; i < 70000; i++) {
      ary.push({ url: 'neko', title: 'sippo', get icon() function() bookmarks.getFavicon(this.url) });
    }
  });
  time('object - property', function () {
    let ary = [];
    for (let i = 0; i < 70000; i++) {
      ary.push({ url: 'neko', title: 'sippo', icon: function() bookmarks.getFavicon(this.url) });
    }
  });
  time('array', function () {
    let ary = [];
    for (let i = 0; i < 70000; i++) {
      ary.push(['neko', 'sippo', function() bookmarks.getFavicon(this.url)]);
    }
  });

出力

vimperator: array: 0.079msec
vimperator: object - property: 0.056msec
vimperator: object - getter: 3.078msec

ファイル変更を監視して自動で :so する

プラグインかいた。
プラグイン開発なんか向け。

:autoso[urce] i_love_vimperator.js

のようにすると、"i_love_vimperator.js" を監視するようになる。
そして、ファイルに変更があったときに スクリプト が実行される。
監視の中止は "!" 付きコマンドで行う。

:aso! i_love_vimperator.js

"!" のときは、監視中のファイルパスで補完できる。

for CVS Head
http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/auto_source.js
for 1.2
http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/branches/1.2/auto_source.js

大量の履歴で重くなる問題が解消?

2.0pre。
Struct オブジェクトの利用をやめたようで、問題はなくなったようだ。
http://hg.intevation.org/mirrors/mozdev.org/vimperator-cvs/rev/7a6ffe3d788b
と、思ったけれどまだちょっと重いみたいだ。

サイドバーを消したい!

ツリー型タブとMultiSidebarを併用しているんだが、たまに両サイド共に消したいときがある。
そこで下のをてけとーに書いてみたんだけれど、(window.content === null) になってしまう。
当然 Vimperator さんが発狂。
困る。

let sidebars = ['sidebar-2-box', 'sidebar-2-splitter'];

let changeElementDisplay = function (elem, show) {
  elem.hidden = !show;
};

let hidden = false;
commands.addUserCommand(
  ['hidesidebar', 'hs[b]', 'hidesb'],
  'Hide sidebars',
  function () {
    sidebars.forEach(function (id) {
      changeElementDisplay(window.document.getElementById(id), hidden);
    });
    //changeElementDisplay(gBrowser.mTabContainer.parentNode, hidden);
    changeElementDisplay(gBrowser.mTabContainer.parentNode.nextSibling, hidden);
    hidden = !hidden;
  },
  {},
  'Hide sidebars'
);

commands.addUserCommand(
  ['sidebarwidth', 'sbw'],
  'set sidebar width',
  function (arg) {
    sidebars.forEach(function (id) {
      let elem = window.document.getElementById(id);
      elem.width = arg.string ? parseInt(arg.string, 10) : 220;
    });
  }
);