VimperatorでウェブページのコンテキストでJavaScript実行
通常のjsコマンドのようにChromeのコンテキストではなくて,FirebugのコンソールみたいにウェブページのコンテキストでJavaScriptを実行する(つもり).なんかもっとうまい書き方があるような気がするけど,with文で無理矢理やってみた.
.vimperatorrcに中に以下のように書くと,wrappedjavascriptまたはwjsコマンドが使えます.補完が効かなかったり,名前が微妙だったりするけど,とりあえず動きます.
2009/01/20 11:32 | Firefox | トラックバック(0) | コメント(0)
Vimのマッピングについて考え中
Vim使いから見てkey-chord.elがいかに役に立たないか - while (”im mirrored”);を見て.
Vimで自分用に新しくマッピングを定義するとき,これまで以下の順番で考えて,結局今のところはだいたい<Space>をプレフィックスにする方法をメインで使って,使えるところは<expr>使って柔軟な動作にする感じになっている.
- 自分の使わない既存のマッピングを殺して,それをプレフィックスにして定義する.
(例)f使わない人 nnoremap f <nop> nnoremap fa :some_command<CR> nnoremap fb :call some_func()<CR> ...
- 既存のマッピング殺すのが気持ち悪いので<Leader>をプレフィックスとして使う.
nnoremap <Leader>a :some_command<CR> nnoremap <Leader>b :call some_func()<CR> ...
- Leaderだとプラグインとかぶったり,デフォルトだと押しにくい.let leader=","とかも既存のマッピング殺しているので気持ち悪い.そこで,<Space>とか<CR>とかをプレフィックスにする.
nnoremap <Space>a :some_command<CR> nnoremap <Space>b :call some_func()<CR> ...
- 場合によっては<expr>使うと幸せ.
folding を h,l で閉じたり開いたりするマッピング - ns9logとか,
みたいなやつinoremap <silent> <expr> <CR> (pumvisible() ? "\<C-e>" : "") . "\
" inoremap <silent> <expr> <Tab> pumvisible() ? "\<C-y>" : "\<Tab>"
ところが,<Space>を使うマッピングは思ったほど押しやすくない,つまり親指→その他の指,というシーケンスがそんなに押しやすくない.そこで,たまたまkanaさんのarpeggio.vimを使ってみて,これはいいなと思った.例えば,
Arpeggionnoremap ra :some_command<CR>
とした場合,r→aと押したときはデフォルトの文字置換できて,a→rと押したときはデフォルトの文字挿入ができて,rとaをほぼ同時に押したときはsome_commandが発動する,といったようにデフォルトの動作を殺さないまま,かつ押しやすいところにマッピングを追加できる.
ところが,冒頭で挙げたkanaさんの記事では,arpeggio.vimは役に立たなくないとい結論で,自分は稀な人なのか,と思った.考えてみると,
自明なことだが、同時押しを採用する主な理由は割り当てたい機能に対してそれ以外に使えるキーシーケンスがないからだ(「使える」はタイプのし易さ等を含む)。モードレスな編集体系ならばそう余裕はないが、Vimはそうではない。
に関しては,デフォルトのマッピング殺すの気持ち悪いというどうでもいい理由で,使えるキーシーケンスをむやみに絞っている自分が悪い.次に,
key-chord.elが提供する機能を言い換えると、タイムアウトありの曖昧なキーバインド定義になる(space-chord.elは特にこれを意識したものになっている。当人にそういうつもりはないだろうけれど)。これはVimではデフォルトでできるし、ある程度以上Vimを使っていればその恩恵に預かっている。だからVim使いから見ればkey-chord.elは「タイミングを微調整して同時押しをエミュレートした」という点以外に真新しいものはないし、それを使わなくても普通にキーバインドを定義するだけで十分だ。
に関しては,自分にとっては,どんな場面でも通用する一定のtimeoutlenがない,またはこのへんの動作がよくわかってない.最後に,
(これは主観だが)同時押しにかかるコストはそう小さくはない。Vim使いのキーバインドは「いかにモディファイヤーを押さずに事を済ませるか」あるいは「いかにモディファイヤーを押しっぱなしで事を済ませられるか」となる傾向にあるので、上記の理由も合わせて、タイミングのシビアな同時押しを利用するよりも普通のキーバインドを定義した方が楽だ。
に関しては,デフォルトのマッピングを殺さない前提だと,個人的には<Space>プレフィックスよりarpeggio.vimによる同時押しの方がましだと思っているのでちょっと違う.
要するに,「デフォルトのマッピングを殺したくない」にこだわってみた結果,なんだかおかしなことになっているのだと思う.kanaさんの.vimrcとか見るとtとかqは殺されているので,自分も思いきって適当なキーを殺すとすっきりいくかも知れない.その他の案としては,デフォルトのマッピング殺すにしても影響少なそうなShiftキー押しながらに全部定義してしまう,どうにかしてtimeoutlenを動的に定義する,がある.前者は,
nnoremap F <nop>
nnoremap FA :some_command<CR>
nnoremap FB :call some_func()<CR>
とか.後者は突き詰めると結局arpeggio.vimになってしまうような気もするな.もう少し考えてみよう.
2009/01/18 19:24 | Vim | トラックバック(0) | コメント(0)
livedoor Readerでスクロールをスムーズにする続きの続き
LDR/Fastladderでアイテムの高さを制限してサクサク読むためのスクリプト - by edvakf in hatenaの記事で,ぼちぼち散歩 livedoor Readerでフィードを読むのがちょっとだけ早くなるかも知れないUser CSSで作ってみたCSSを改良する,fastladder_fixed_item_height.user.jsというGreasemonkeyを作ってくださったので,スクロールをスムーズにするやつをこれに対応してみた.
二つのGreasemonkeyを両方インストールすると各アイテムのスクロールもスムーズになるはずです.
fastladder_fixed_item_height.user.jsはOperaでもFirefoxでも動くのに対して,こっちのldr_smooth_scroll.user.jsはFirefoxバリバリなので,大変申し訳ない限りです.もうちょっとがんばって,設定画面以外はOperaでも動くようにがんばってみようかな.
2009/1/20追記: 一応Operaでも動くようにしてみた.
ただし,OperaではE4X動かないので,設定画面の追加部分はコメントアウトしてます.あと,Safri + GreaseKitでも動くようにしたかったけど,DOM要素に対する__(define|lookup)(setter|getter)__がうまくいってない?っぽくてできなかった.変な実装にするんじゃなかったな.
2009/01/16 23:50 | Firefox | トラックバック(0) | コメント(0)
Vimperatorビルド用にMacPortsでasciidocの8.2系列をビルドするPrivate Portfile
Vimperatorではヘルプの生成にasciidocを使っているけど,最新のasciidoc 8.3系列じゃなくて8.2系列の使用を前提としているため,8.3系列のasciidocだとmakeの途中でエラーで止まってしまう([参考1] [参考2]).ところが,MacPortsでasciidocをインストールすると8.3系列がインストールされ,しかも今のところ8.2系列などの過去のバージョンをインストールする手段が(たぶん)ない.というわけで,asciidoc 8.2.7をインストールするPrivate Portfileを作ってみた.以下,簡単に作業ログの残しておきます.ちなみにPrivate PortfileについてはHowTo/LocalPortfile - MacPortsWiki-JPなどを参照してください.
asciidocのホームページのダウンロードページを見ると,Mercurialでソースコード管理しているとのことなので,MacPortsを使わずにインストールする場合は,
% hg clone -r 8.2.7 http://hg.sharesource.org/asciidoc
% cd asciidoc
% sudo ./install.sh
などとすればインストールできることがわかる.これをPortfileにすることを考えて,まず以下のようにして8.2.7当時の公式Portfileを引っ張ってきた.
% svn co -r 44195 http://svn.macports.org/repository/macports/trunk/dports/textproc/asciidoc
% cp -R asciidoc /path/to/local_port_tree/textproc
次に,MacPorts Guideのhgのところや,HowTo/PrivatePortfileTutorial - MacPortsWiki-JPを参考にしながら,hgでソースをfetchしてくるように変更してみた.本当は,新しくasciidoc827とかいう名前のPortfileを作って,公式のasciidocと共存するようにしたかったのだけど,asciidoc 8.2.7のinstall.shに簡単にコマンド名などにsuffixをつけれるオプションがなかったので,今回は妥協してasciidocという名前のままにした.個人的にはVimperatorのビルドにしかasciidocを使わないのでこれで困らないけど,他の用途でasciidocを使っている人は気をつけて下さい.したがって元のasciidocをアンインストールしてから8.2.7をインストールする必要があります.
% sudo port uninstall asciidoc
% cd /path/to/local_port_tree
% portindex
% sudo port install asciidoc @8.2.7
ここで,fetch時というかhg cloneのときに「abort: unknown encoding: X-MAC-JAPANESE」というエラーが出たので,mercurialとsshと私 » Happy My Lifeのページを参考に$HOME/.hgrcを適当にいじってからリトライした.ここまでで,asciidoc 8.2.7のインストールは終わりで,Vimperatorをmakeし直してみる.ヘルプファイルは元のtxtファイルが更新されてないとリビルドされない上に,手元の環境ではmake cleanでヘルプファイルを消せなかったので,自力で消してから再度ビルドした.
% cd /path/to/vimperator_git
% rm */locale/*/*.html
% make xpi
で,一応うまいこといったので,たぶん大丈夫なんでしょう.以下に作成したPortfileを貼っておきます.あんまり自信ないので試される方は自己責任でお願いします.
2009/01/12 15:52 | Mac | トラックバック(0) | コメント(0)
livedoor Readerでスクロールをスムーズにする続き
ぼちぼち散歩 livedoor ReaderまたはFastladderでスクロールをスムーズにするGreasemonkeyの続き.
livedoor Reader内の関数を置き換える方法から,__defineSetter__,__defineGetter__,__lookupSetter__,__lookupGetter__でHTML要素のscrollTopプロパティを直接書き換えるさらに邪悪な(?)方法にしてみた.はじめ,__defineSetter__したプロパティに対して+=とか-=とかが使えないのかと思ったら,ちゃんとGetterの方も定義したら大丈夫になった.
- ldr smoth scroll
- インストール
あと,KeybindからGM_setValueを呼ぼうとすると,
Greasemonkey access violation: unsafeWindow cannot call GM_setValue.
と言われて,どうしたものかと思っていたら,ちょうと前回も参照させてもらったとこでunsafeWindow 内から GM_* や window.eval を使う - KBDAHOLIC - やぬすさんとこに,同じことが書いてありすぐさま解決することができた.感謝です!
2009/01/11 02:56 | Firefox | トラックバック(0) | コメント(0)
livedoor ReaderまたはFastladderでスクロールをスムーズにするGreasemonkey
livedoor Readerでいかに早くフィードを読むかについてはたまに考えていて,ぼちぼち散歩 livedoor Readerでフィードを読むのがちょっとだけ早くなるかも知れないUser CSSとかしてみたけど, 結局使うのをやめてしまった.で,ふとiPhoneのLDR touchでフィードを読んでいるとなんとなく読みやすくて,これはスクロールが滑らかだからじゃないか?ということでやってみた.
「次のアイテム」(j, enter),「前のアイテム」(k, shift+enter), 「下にスクロール」(space, pagedown),「上にスクロール」(shift+space, pageup)が全てスムーズになります.また,設定画面から有効,無効などを設定できます.自動のときは高さが閾値より大きいときのみスムーズにスクロールします.このへんはlivedoor Readerのソースにそうしようとした形跡があったのでアイデアをパクらせてもらいました.設定画面はそれぞれ以下のような感じです(クリックで拡大します).
livedoor Reader | Fastladder |
---|---|
![]() |
![]() |
さらにFastladder まわり ( miscs 改良 ) - KBDAHOLIC - やぬすさんとこのアイデアをパクらせてもらって,tで一番上へ,bで一番下へスクロールも実装しました.あとS(shift+s)でなし→常に→自動→なし→…とトグルすることができます.
スクロールの実装が適当過ぎて,なんか酔いそうになることもあるけどまぁまぁいい感じのような気がするのでしばらく試してみようと思います.スムーズにイージングとかつけたらもう少しそれっぽくなるのかなぁ.
2009/01/10 00:24 | Firefox | トラックバック(0) | コメント(0)
Locationbar2のようなURL表示にするVimperatorプラグイン作った
Vimperator使っているからには :set guioptions=tbぐらいにはしたい,というのがあったものの,どうしてもT(ナビゲーションツールバー)を消せずにいた.理由を考えてみると,ナビゲーションツールバーの機能はほとんど使ってないけど,表示されている情報が非常に重要だからだと思った.
ナビゲーションツールバーの情報のうちfavicon,スター,フィードの各表示についてはmigratestatusbar.jsを導入して,.vimperatorrcに
javascript <<EOM
liberator.globalVariables.migrate_elements = [
{
// star button of awesome bar
id: 'star-button',
dest: 'liberator-statusline-field-url',
after: true,
},
{
// icon that show the existence of RSS and Atom on current page
id: 'feed-button',
dest: 'liberator-statusline-field-url',
after: true,
},
{
// favicon of awesome bar
id: 'page-proxy-stack',
dest: 'liberator-statusline',
after: false,
},
];
EOM
などと書くことによってステータスバーに移動することができる.ところが,Locationbar2を使って色分けしているURL表示については今のところ代替がなかったので,作ってみた.
名前が微妙な気もするけど,以下の画像のような感じで既存のURL表示をLocationbar2風に置き換えます.
見た目を変えるだけでなく,Locationbar2のようにURLの各部分をクリックすると上の階層へ移動できたりします(Vimperator使いならguとかgUとか使うと思うけど).このへんの実装に関しては元のLocationbar2の実装をだいぶパクりました.また,:highlightコマンドにも対応していて,:hi ColorizeUrlDomain -append color: green とかできます.普通に.vimperatorrcに書くとエラーになるので,loadpluginsするなり,afterのようにするなりしないといけませんが.
注意点としては今のところ,:set showstatuslinks=1してるときに,リンクのURLが表示されません.というか,普段 :set showstatuslinks=2なのでさっきまで全然気付いてませんでした.
というわけで,今のところのVimperatorの見た目は以下のような感じです.guioptionsのB(ブックマークバー)もどうにかしたい気もするけど今のところは妥協しています.
2009/01/05 15:08 | Mac | トラックバック(0) | コメント(0)
Tree Style TabとMultiple Tab HandlerをVimperatorから使うプラグイン
FirefoxアドオンのTree Style TabとMultiple Tab Handlerが大好きなので,Vimperatorからというかキーボードから操作できるプラグインを書いてみた.
デフォルトのキーマッピングを上書きするなどおれおれ仕様なので注意.multipleTabHandler.jsでは,<Leader>mで選択,非選択をトグルでき,選択されたタブがあるときとないときでdとrの動作を変えている.treeStyleTab.jsの方もズームのマッピングを一部潰している.
とりあえずオプションでデフォルトのキーマッピングを上書きするかどうかを選べるようにするべきか.あと,mutipleTabHandler.jsの方はcopy.jsとかと連携できたりするとよさそうやなぁ.
ちなみに,Tree Style Tabについてはぼちぼち散歩 ここ数日のVimperatorのバグを直すつもりのパッチに書いたようにVimperatorのタブへのbindingを消さないとえらいことになる
2009/01/04 22:46 | Firefox | トラックバック(0) | コメント(0)