vimperator のコマンドライン領域

参考にならないわけではありませんがこのエントリの内容は古いです。 echo の挙動については http://wiki.livedoor.jp/shin_yan/d/liberator#content_17 により詳しい内容がまとめられていますので参照してください。

vimperator のコマンドライン領域が面白い件。主に liberator.echo() に関しての話題。 :echo だと一行しか受け付けないのでちょっとわきにおいとくよ。ちなみに liberator.echo() の実装を行っているのは ui.js ( http://www.mozdev.org/source/browse/~checkout~/vimperator/src/content/ui.js?rev=1.72;content-type=application%2Fjavascript ) 。

とりあえずモードについて。選択できるモードは以下の 4 つなんだけどそれぞれで特徴があるみたい。

liberator commandline.FORCE_MULTILINE

複数行表示を行う。改行には \n のほか <br> , <br /> を認識する。

javascript <<EOM
liberator.echo(
    "foo\nbar<br>buz<br />",
    liberator.commandline.FORCE_MULTILINE
);
EOM

このモードだと大抵の html / css を理解してくれる。っていうか xml ですらパースしてくれるので何突っ込んでもアリなんじゃないかと思う。一応試したのは以下。

  • p, h?
  • table 関係
  • ul / ol, li
  • img
  • margin, padding, border
  • font 関係 ( !important 指定しないと適用されない )
  • color / background-color
  • position

ただ疑似クラスは理解してくれないようで以下は青文字で foobar と表示される。これが可能なら nnp_cooperation.js で観たことのある動画の区別がすぐ付くんだけどなぁ。

:javascript <<EOM
liberator.echo(
    [
        '<style>',
            'a:link { color : blue !important; }',
            'a:visited { color : red !important; }',
        '</style>',
        '<a href="http://d.hatena.ne.jp/janus_wel/">foo</a>',
        '<a href="http://arien.ai/">bar</a>',
    ].join(''),
    liberator.commandline.FORCE_MULTILINE
);
EOM    

liberator.commandline.FORCE_SINGLELINE

一行しか表示しない。後続で APPEND_TO_MESSAGES が指定されてもそれを無視する。 html はタグごと表示、改行はスペース一個に変換される。

javascript <<EOM
liberator.echo(
    "foo<br />bar\nbuzz",
    liberator.commandline.FORCE_SINGLELINE
);
EOM

liberator.commandline.DISALLOW_MULTILINE

ソースの説明にはできるだけ一行で済ますようにするって書いてあるんだけどなんのこっちゃわからない。一応以下のそれぞれのコードの実行結果から改行関係 ( \n, <br>, <br /> ) は理解してその際は html も理解するけど基本 html は理解しないという推測はできるんだけど。

javascript <<EOM
liberator.echo(
    "foo<br>bar\nbuzz",
    liberator.commandline.DISALLOW_MULTILINE
);
EOM

javascript <<EOM
liberator.echo(
    "<p>foo</p><p>bar</p>",
    liberator.commandline.DISALLOW_MULTILINE
);
EOM

javascript <<EOM
liberator.echo(
    "<p>foo</p><br><p>bar</p>",
    liberator.commandline.DISALLOW_MULTILINE
);
EOM

liberator.commandline.APPEND_TO_MESSAGES

直前の echo に追加して表示する。んだけど直前で FORCE_MULTILINE が指定されてないとダメみたい。以下の例は一番上しか意図通りに動作しない。

javascript <<EOM
liberator.echo( 'foo', liberator.commandline.FORCE_MULTILINE);
liberator.echo( 'bar', liberator.commandline.APPEND_TO_MESSAGE);
EOM

javascript <<EOM
liberator.echo( 'foo', liberator.commandline.FORCE_SINGLELINE);
liberator.echo( 'bar', liberator.commandline.APPEND_TO_MESSAGE);
EOM

javascript <<EOM
liberator.echo( 'foo', liberator.commandline.DISALLOW_MULTILINE);
liberator.echo( 'bar', liberator.commandline.APPEND_TO_MESSAGE);
EOM

つまり

今回言いたかったことっていうのはエラーメッセージで毎回ゆっくりを出すとかの以下のような嫌がらせも可能なわけだよ、ということ ( だいぶ違う ) 。


javascript <<EOM
liberator.echo(
    [
        '<style>',
            'div { position : relative; height : 300px; }',
            'p { position : absolute; bottom : 30px; right : 30; color : red; font-family : "ぷちはんど へなちょこほそぺん" !important; font-size : 24px !important;}',
            'span { font-family : "MS Sans Serif" !important; }',
        '</style>',
        '<div>',
            '<p>ゆっくりしていってね !!</p>',
            '<span>',
[
    '   _,,....,,_  _人人人人人人人人人人人人人人人_',
    '-\'\'":::::::::::::`\'\'>   ゆっくりしていってね!!!   <',
    'ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄',
    ' |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ     __   _____   ______',
    ' |::::ノ   ヽ、ヽr-r\'"´  (.__    ,´ _,, \'-´ ̄ ̄`-ゝ 、_ イ、',
    '_,.!イ_  _,.ヘーァ\'二ハ二ヽ、へ,_7   \'r ´          ヽ、ン、',
    '::::::rー\'\'7コ-‐\'"´    ;  \', `ヽ/`7 ,\'==─-      -─==\', i',
    'r-\'\'"´/  /! ハ  ハ  !  iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |',
    '!イ´ ,\' | /__,.!/ V 、!__ハ  ,\' ,ゝ レリイi (ヒ_]     ヒ_ン ).| .|、i .||',
    '`!  !/レi\' (ヒ_]     ヒ_ン レ\'i ノ   !Y!""  ,___,   "" 「 !ノ i |',
    ',\'  ノ   !\'"    ,___,  "\' i .レ\'    L.\',.   ヽ _ン    L」 ノ| .|',
    ' (  ,ハ    ヽ _ン   人!      | ||ヽ、       ,イ| ||イ| /',
    ',.ヘ,)、  )>,、 _____, ,.イ  ハ    レ ル` ー--─ ´ルレ レ´',
].join('<br />'),
            '</span>',
        '</div>',
    ].join(''),
    liberator.commandline.FORCE_MULTILINE
);
EOM