VimでCSSルールセットを選択する

Vimではvatと入力するだけでカーソル位置から直近のHTMLの要素を選択できるのですが、CSSのルールセットを選択するものがありません。viBvi{とすれば、{}内のテキストは選択できますが、カーソルが{}内にないと機能しません。なのでVim scriptをパクリながらはじめて書いてみました。

git submoduleでインストールすることができます。下記はpathogen.vimを使っている場合です。

git submodule add git@github.com:kosei27/vim-selectCssRuleSet.git ~/path/to/bundle/vim-selectcssruleset
" Select CSS Rule Set
" カーソルから一番近いCSSルールセットを選択する
"
" nnoremap <silent> var  :<C-u>call SelectCssRuleSet()<CR>
" vimrcに↑を追加して、varと入力します。
function! SelectCssRuleSet()
    let save_reg = @@

    silent normal $va{Voy
    let first_yank = @@

    " 最初にヤンクした内容に'{'が含まれるかどうかチェック
    let chk_first_yank = matchstr(first_yank, '{')
    if chk_first_yank == ''
        " 最初にヤンクした内容に'{'が含まれない場合は次の行をチェックする
        let chk_next_line = matchstr(getline(line(".")+1), '{')
        while chk_next_line == '' " 次の行に'{'がない場合は見つかるまで繰り返す
            silent normal j
            " ファイルの最終行に来たらループ抜けてエラーメッセージを表示する
            if line(".")==line("$")
                execute "normal \<Esc>"
                echohl ErrorMsg
                echo 'no match css rule sets.'
                echohl None
                return
                break
            endif
            let chk_next_line = matchstr(getline(line(".")+1), '{')
        endwhile
        silent normal j
    endif

    execute "normal \<Esc>"
    silent normal $va{Vo
    let chk_prev_line = matchstr(getline(line(".")-1), ',')
    while chk_prev_line != '' " 上の行に','があればセレクタグループとして選択する
        silent normal k
        let chk_prev_line = matchstr(getline(line(".")-1), ',')
    endwhile

    let @@ = save_reg
endfunction

vimrcに下記を追加して、varと入力するとカーソルから直近のルールセットが選択されると思います(<plug>とか使うんですよね?ほんとは...)。

nnoremap <silent> var  :<C-u>call SelectCssRuleSet()<CR>