読者です 読者をやめる 読者になる 読者になる

vimを引数なしで起動した場合に◯◯を行う

vim vac

Vim Advent Calendar 2012の175日目の記事になります。
174日目は@anekosさんによる Linux の IM (InputMethod) の Fcitx を gVim で快適に使うプラグイン でした。

自分はvimを引数なしで起動した場合には、.vimrcを表示するようにしています。
まぁいわゆるジコマン機能ではありますが、その方法をまとめたので書いてみたいと思います。

VimEnterを使って

vimの起動時のみに特定の処理を行いたい場合、VimEnterという自動コマンドのイベントが用意されているのでそれを使いましょう。
例としてはこんな感じです。

" vimの起動が完了したタイミングでhogehogeを実行
autocmd VimEnter * hogehoge

今回は.vimrcを開くので以下のようにします。

autocmd VimEnter * nested edit $MYVIMRC

これで起動時に~/.vimrcを開くようになりました。
nestedを使うことで自動コマンドがネストするので.vimrcを開いた時のBufReadイベントなどが捕捉できるようになります(:h autocmd-nested)。

しかし、このままでは引数にファイルを与えた場合でも.vimrcを開いてしまうので判定を入れます。

autocmd VimEnter * nested if @% == '' | edit $MYVIMRC | endif

@%にはカレントバッファ名が入ります(:h quote_%)。
これで起動完了時のバッファが無名バッファの場合だけ~/.vimrcを開くようになりました。

これでOKかな、と思いきや、以下の様にパイプでvimに標準入力を渡した時に期待通りの動作をしてくれません。

$ git diff | view -

なぜなら標準入力のバッファもまた無名バッファになるからです。
バッファが空かどうかも判定に追加したいと思います。

autocmd VimEnter * nested if @% == '' && s:GetBufByte() == 0 | edit $MYVIMRC | endif
function! s:GetBufByte()
    let byte = line2byte(line('$') + 1)
    if byte == -1
        return 0
    else
        return byte - 1
    endif
endfunction

これで目的の動作を達成することが出来ました!
vimshellを起動したりtwitterを表示したり、自分だけのウガンダを作ってみるのもいいかもしれません。
めでたしめでたし。

追記

VACを見返していると、@thincaさんの記事 Vim を起動したときに Vim Girl に会いたい! - 永遠に未完成 と割と被っていることに気づきました。
自分だけのウガンダを表示させる場合にはこちらの方がスマートに動作すると思われます。

広告を非表示にする