Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2011-08-17

Vim: コード読んでるとき、カーソルのあるブロックを確認する

| 19:31 | Vim: コード読んでるとき、カーソルのあるブロックを確認する - NaN days を含むブックマーク はてなブックマーク - Vim: コード読んでるとき、カーソルのあるブロックを確認する - NaN days

コードを読んでいるとき、いま自分がどのメソッド内にいるのか、どのブロックの中にいるのかがパッと分からなくて困ることがあり、そういう時は [{ で今いる { ... } の先頭までジャンプできるのでそれを使っていますが、いちいちジャンプするのが面倒なのでその場で確認したい。というわけで Preview window というのを使って実現してみます。

Preview window は名前の通り他のファイルをプレビューするための代物で、ウィンドウにフォーカスしなくとも <C-W> z で閉じられるのが便利 (な気がする)。

nnoremap <buffer> <silent> ( :<C-U>call PreviewOpenBrace()<CR>

if !exists('*PreviewOpenBrace')
    function PreviewOpenBrace()
        let l:pos = getpos('.')
        if l:pos == get(s:, 'last_pos', [])
            let l:count = s:last_count + 1
        else
            let l:count = v:count1
        endif
        pclose
        pedit
        wincmd p
        execute 'normal!' l:count . '[{'
        setlocal cursorline
        wincmd p
        let s:last_count = l:count
        let s:last_pos   = l:pos
    endfunction
endif

コード中で ( を押すと Preview window が開いて、カーソルのあるブロックの先頭部分を見せてくれます。さらに外側のブロックを見たい場合は同じ場所で ( を押すと、もうひとつ外側に行きます。カウントにも対応しているので 99( で一気にいちばん外側のブロックを見るというのもできる。

  • スコープのプレフィックスは辞書型の変数になっているということなので、その時点で定義されているかどうか分からない変数にアクセスしたいときは get(s:, 'last_pos', []) と書けます
  • 関数の上書きをしないようにしてるのは ftplugin に入れることを想定しているから (この関数中で Preview window を開く時に ftplugin が実行されて同じ関数が上書きされようとすると、エラーになる)