fc2ブログ

ぼちぼち散歩

Vimperatorからdel.icio.us IncSearchを使うプラグインを作った

ローカルにdeliciousのブックマークをキャッシュしておいてから,インクリメンタルサーチで簡単に検索できるdel.icio.us IncSearchをVimperatorから使えるプラグインを作ってみた.一応,Hatebu IncSearchlivedoor clip IncSearchGoogle Bookmarks IncSearchでも使えるようにしたつもり.

使い方としては,まず.vimperatorrcに使うブックマークサービスの名前(deliciousの場合不要)と一回に表示する検索結果の数(デフォルトの15でよければ不要)を書きます.

" delicious, hatebu, livedoorclip, googlebookmarksのどれか
let sbmincsearch_service_name = "delicious"
" あんまり大きくすると遅くなるかも
let sbmincsearch_max = 50

すると,deliciousならdeliciousIncsearch,hatebuならhatebuIncsearchという風にコマンドが定義されて,それを使ってIncSearch拡張のデータベースからインクリメンタルサーチできます.元の拡張の検索関数を使っているので,|によるOR検索や,!によるNOT検索,[tag]によるタグの識別なども使えます.

さらに,はてなブックマーク拡張のVimperatorプラグインのようにcompleteオプションを指定することもできます.というか,はてブ拡張のVimpプラグインの実装をとても参考にしました.

autocmd VimperatorEnter .* :set complete+=I

のように,completeにIを加えると,:openや:tabopenの結果にインクリメンタルサーチの結果を含めることができます.あと,ブックマークの同期コマンドは用意していないので,通常のIncSearch拡張の画面から同期して下さい.

スポンサーサイト



2009/09/19 17:00 | Firefox | トラックバック(0) | コメント(6)

ページの先頭へ

Tree Style TabとMultiple Tab HandlerをVimperatorから使うプラグイン その2

以前に作ったTree Style TabとMultiple Tab HandlerをVimperatorから使うプラグインをもう少しバージョンアップしてみた.Firefox 3.5 + Vimperator 2.1でのみ動作確認しています.

前回からの変更点はたぶん以下のような感じ.

  • Vimperatorのタブ移動コマンドでは,TreeStyleTabで畳んでいるタブから次のタブへ移動するときに次のタブへ行かずにタブを展開してその子タブへ移動してしまうので,それを修正するようにタブの移動コマンドを再定義した.
  • TreeStyleTabで<C-w>k, <C-w>j, <C-w>h, <C-w>lでそれぞれタブバーの位置を上下左右に配置できる.APIがあったからやってみたけど,これはあんまりいらないかも.
  • MultipleTabHandlerでタブのURIをコピーする時のフォーマットをカスタマイズできるようになったので,それを利用するmcopyコマンドを定義.これでcopy.jsとまではいかなくてもそれなりに柔軟に,しかも複数タブ同時にURLやタイトルをコピーすることができる.MultipleTabHandlerの設定画面で定義したフォーマットを使えるのでそこそこ便利だと思う.
  • MultipleTabHandlerとTreeStyleTabが両方インストールされているときには,ツリーの構造に従ってタブを選択するコマンドを作成した.zsで同じレベルのタブ全部,ztで同じツリーのタブ全部を選択できる.

例によって問答無用でデフォルトのマッピングを上書きしたりするので,ご利用には十分ご注意下さい.

2009/09/19 16:31 | Firefox | トラックバック(0) | コメント(0)

ページの先頭へ

Vimでoperator-userを使って他のプラグインをoperatorとして使えるようにしてみた

kanaさん作のoperator-userを使うと,簡単にoperatorを定義できる.operatorというのはここでは,Vimのコマンドのうちdwとかc$とかのdとかcとかの,動作を指定するコマンドのこと(こんな説明でいいのか,まぁ詳しくは:h operatorで(^-^;)).で,Vimにははじめから便利なoperatorが定義されていて,新たにoperatorを定義できると言われても,さてどうしたもんかと思っていた.

そんなときに,operator-userとは別に,commentop.vimというコメントアウト/アンコメントするためのoperatorを定義するプラグインを見つけて,あーなるほどこれは便利だと思った.ところが,コメント系のプラグインとしては,NERD Commenterが非常に高機能で便利に使っていたので,そこから機能が落ちるのはちょっとなぁとも思っていた.

というわけで,前置きが長くなったけど,それだったらNERD Commenterとoperator-userを組み合わせて新しいoperatorを作ったらいいんじゃね?ということでやったみた.以下を.vimrcなどに書いておけば,,cや,uなどといったoperatorが定義される.

function! s:SID_PREFIX()
    return matchstr(expand('<sfile>'), '<SNR>\d\+_')
endfunction

noremap [Operator] <Nop>
map , [Operator]

" デフォルトのマッピング定義を行わない
let g:NERDCreateDefaultMappings = 0
 
 nmap gA <Plug>NERDCommenterAppend
 nmap [Prefix]a <Plug>NERDCommenterAltDelims

" NERDCommenter + operator-user
function! s:setCommentOperator(key, name)
    call operator#user#define(
    \   'comment-' . a:name,
    \   s:SID_PREFIX() . 'doCommentCommand',
    \   'call ' . s:SID_PREFIX() . 'setCommentCommand("' . a:name . '")')
    execute 'map' a:key '<Plug>(operator-comment-' . a:name . ')'
endfunction

function! s:setCommentCommand(command)
    let s:comment_command = a:command
endfunction

function! s:doCommentCommand(motion_wiseness)
    let v = operator#user#visual_command_from_wise_name(a:motion_wiseness)
    execute 'normal! `[' . v . "`]\<Esc>"
    call NERDComment(1, s:comment_command)
endfunction

call s:setCommentOperator('[Operator]c',       'norm')
call s:setCommentOperator('[Operator]<Scace>', 'toggle')
call s:setCommentOperator('[Operator]m',       'minimal')
call s:setCommentOperator('[Operator]s',       'sexy')
call s:setCommentOperator('[Operator]i',       'invert')
call s:setCommentOperator('[Operator]y',       'yank')
call s:setCommentOperator('[Operator]l',       'alignLeft')
call s:setCommentOperator('[Operator]b',       'alignBoth')
call s:setCommentOperator('[Operator]n',       'nested')
call s:setCommentOperator('[Operator]u',       'uncomment')

一応ポイントとしては,NERDComment()という関数がNERD Commenterの本体で,第一引数を1にしておくと直前のVisual modeで選択された範囲に対して操作を行うというところ.なので,doCommentCommand()でoperatorの操作範囲を一旦Visual modeで選択してからEscするようにしている.NERD Commenterの各コマンドの意味は:h NERDComFunctionalitySummaryを参照ということで.

また,operatorは,例えばddで一行削除やyyで一行ヤンクというように,2回連続入力でその行全体に対して動作したり,Visual mode中では選択範囲に対して動作したりするのだが,operator-userで定義したoperatorもちゃんとそのように振る舞う.そのため,,c,cで一行コメントアウトやVisual mode中に,uで選択範囲をアンコメントといった動作も同時に定義される.なので,NERD Commenterのデフォルト定義は無効にしてある.

さらに,textobj-commenttextobj-indentといった,text objectとももちろん連携可能なので,使いこなせば光の速さでコメント操作ができるようになる!...はず!

あと,調子にのってAlignプラグインもoperator化してみたけど,さすがにこれはちょっと無理があると思った.自分ではたまに使おうと思うけど(^-^;)

2009/09/19 15:35 | Vim | トラックバック(0) | コメント(0)

ページの先頭へ

トップページへ