Hatena::ブログ(Diary)

C++でゲームプログラミング

2011-12-26

Vim の <C-w><C-q> の挙動を変える

バッファを終了する際に <C-w><C-q> を使っているんですが、これだとバッファが削除されるわけではないので、どんどんバッファが溜まっていってしまいます。

という事で、終了するバッファが他のタブ(ウィンドウ)で開いていないならバッファを削除するという挙動にしてみました。


[ソース]

function! s:flatten(seq)
    let result = []
    for n in a:seq
        if(type(n) == type([]))
            let result = result + s:flatten(n)
        else
            let result = result + [n]
        endif
        unlet n
    endfor
    return result
endfunction

function! s:delete_window()
    let tabpagelist = s:flatten(map(range(tabpagenr("$")), "tabpagebuflist(v:val+1)"))
    if count(tabpagelist, winbufnr("%")) == 1
        :bdelete
    else
        :quit
    endif
endfunction


" マッピングを潰したくないなら他のキーにでも
" nnoremap <silent> <C-w><C-q> :call <SID>delete_window()<CR>

今回は Vim script でガシガシ書いてみたけど、他にいいやり方があるかしら?

[]unite-action に tab drop コマンドを追加する

ファイルをタブで開く時に『既にファイルが開いているならがあるなら新規タブを作らないでそっちに移動して欲しい』って事は結構あると思います。

Vim では

:tab drop {file}

というコマンドで『既にファイルが開いていたらそこに移動して、なければ新しいタブで開く』といった事が出来ます。

これを unite-action に追加してみました。


[ソース]

" tab drop
let action = {
\   'description' : 'tab drop',
\   'is_selectable' : 1,
\ }
function! action.func(candidates)"{{{
    for l:candidate in a:candidates
        call unite#util#smart_execute_command('tab drop', l:candidate.action__path)
    endfor
endfunction"}}}
call unite#custom_action('openable', 'tab-drop', action)
unlet action

これで、<Tab> から tab-drop を選択すれば :tab drop されるようになります。

Connection: close