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

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

痒いところに手が届いた!? vimテク(?)5選

ぱぴだお!(図太い声)

...えー, みなさんこんにちは. 就職活動で大阪と東京を行ったり来たりしているpapixです. 昨年に引き続き, 今年もVim Advent Calendar 2012に参加させて頂くことになりました. 自己紹介とかはこの辺で(先日書いたAdvent Calendarに丸投げ!).

そろそろvimと付き合いだして(?)2年くらい... になると思うのですが, vimは本当に痒い所に手が届くエディタですね! 日々, 「こんなこともできるのか...!」「こんな機能があったのか...!」と驚かされるばかりです.
というわけで今日は, 私がこれまでvimを使ってきた中で, 「痒いところに手が届いた!」と感じたvimのTipsやpluginを厳選して, 5つ程ご紹介したいと思います.

...題して, 「痒いところに手が届いた!? vimテク(?)5選」.

「これからvim使っていくぜ!」という方や, 「vimに慣れてきたから, これから.vimrcを俺色に染め上げていくぜ!」という方の参考になればいいですね. そういう意味では, 去年と同様初心者向けの内容と言えるでしょう.
そんな感じですが, しばしお付き合い頂ければと思います.

※以下, 機能や記述等に間違いがある可能性があります. 発見して頂いた場合, コメント欄や@宛でご指摘頂ければ嬉しいです. すぐさま修正させて頂きます.

痒いところに手が届いた!? vimテク(?)5選

インデント

ちょっと昔の, 今からすればかなりお恥ずかしい話をします...

私は主にPerlを書いている(Perlで遊んでいる?)のですが, Perlではインデントとして「半角スペース4個」を使うことが多いです.
当時, まだvimなど知らず, geditでPerlを書いていた私は驚き, そして戸惑いました. 「どうすればいいんだ...!?」と.

...geditの場合, Tabキーを押して挿入されるタブの幅を設定することはできます.
しかし, Tabキーを押した時にそれを「半角スペース4個」に変換することはできません*1. というわけで, インデントを半角スペースx個分にしたい場合は, ぺちぺちぺち... と人力でスペースキーを4回を押していました.
もっと面倒なのはインデントを削除するときで, 消した半角スペースの数を数えつつ, ぺちぺちぺち... とこれまた人力で半角スペースを削除したりしていました. なんというか, アホ丸出しですね.

後に, 「そうだ, 普通にタブを使ってコーディングしてから, 最後にタブを半角スペース4個に変換すればいいんだ! 次に編集するときは, 半角スペース4個をタブに変換すればOKだし!」とひらめいたりしたのですが, 毎回変更するのは面倒ですし, 何よりアホ丸出しですし, スマートじゃないです.

...それから数カ月後, vimを使い始めて思ったのは, 「最初から, これを使っておけばよかった...!」という事でした.
正直, 今更説明もいらないと思いますが, .vimrc中に,

set smarttab
set expandtab

とした上で,

set tabstop=4
set shiftwidth=4

こんな風にしてやると, 「Tabキーを押すと, 自動的に半角スペース4つが挿入」され, その状態でバックスペースを押すと「半角スペースが4つ削除」されるようになります.

Vimにおけるタブやインデントに関するアレコレは, Vim-users.jpのこちらの記事でいい感じにまとめてありますので, 是非ご一読を!

無限undoと編集位置の自動復帰

if has('persistent_undo')
	set undodir=~/.vim/undo
	set undofile
endif

.vimrcにこう書いておけば, 'undodir'で指定したディレクトリに作業履歴が残っていくので, 編集しているファイルを開きなおしたりした後でも, ファイルを閉じる前に行った作業を含めたundoが出来るようになります.

また,

au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\""

こうしておけば, ファイルを開いた際, 前回最後に編集を行った位置から編集を再開することができます.
この2つを組み合わせれば, 前回最後に編集した部分のコードに問題があった場合に, 「自動復帰で問題のコードを確認」してから, 「無限undoで編集前に戻す」といったことができます.

カッコとカーソル位置の自動調整

みなさんは,

if($hoge == 'fuga')

のようなif文を書くとき, どのようにタイプしますか?
私の場合, まず

if()

とカッコを全てタイプしてから, カッコの中の条件式を書くようにしています. 最初に右カッコまで書くようにしておけば, 右カッコを書き忘れる, という凡ミスを防ぐことができるからです.

しかし, 最初に右カッコを書いてしまうと, 一旦カーソルを1つ左に戻してから条件式を書き始めなければなりません. でないと,

if()$hoge == 'fuga'

のように, 悲惨な感じになってしまいます.

...が, .vimrcにこう書いておけばもう安心です.

" カーソルを自動的に()の中へ
imap {} {}<Left>
imap [] []<Left>
imap () ()<Left>
imap "" ""<Left>
imap '' ''<Left>
imap <> <><Left>
imap // //<left>
imap /// ///<left>

こうすれば, 左カッコ, 右カッコと連続して入力した場合, カーソルを自動的に1つ左に戻してくれます. なので, カッコを書いて, そのまま条件式を書くことが可能となります.
一番最後の'///'はPerlの正規表現の置換用で, '///'と入力した場合, '/[ココ!]//'にカーソルを持って行ってくれます.

NeoBundleを使ったvimprocの自動ビルド

vimで非同期実行を行う為のライブラリとしてShougoさんのvimprocがありますが, 最新版を落としてくる度にmakeする必要があって, ほんの少し面倒でした.
...が, NeoBundleを使ってこのようにすれば, NeoBundleで最新版を取得すると自動的にビルドすることができるようです.

NeoBundle 'https://github.com/Shougo/vimproc.git', {
      \ 'build' : {
      \     'windows' : 'echo "Sorry, cannot update vimproc binary file in Windows."',
      \     'cygwin'  : 'make -f make_cygwin.mak',
      \     'mac'     : 'make -f make_mac.mak',
      \     'unix'    : 'make -f make_unix.mak',
      \    },
      \ }

...これで手動でmakeする手間が省けますね!

このテクニック(?)はこちらのブログに記載されていました. ありがとうございます!

smartchr

最後に, kanaさんのsmartchrというpluginを紹介したいと思います. 既にいろいろな所で紹介されていますが, 個人的に今年出会ったpluginで一番「おおっ!」と思ったpluginがこのpluginなのです.

inoremap <expr> = smartchr#loop('=', ' = ', ' == ')
inoremap <expr> , smartchr#loop(',', ', ', ' => ')

.vimrcでこんな感じに設定しておくと, '='キーを押すごとに'=', ' = ', ' == 'と遷移していきます. ' == 'の状態でもう一度'='キーを押せば, 再び'='に戻ります.
例えば, Perlのファットカンマ('=>')を, 前後に半角スペースを入れて入力する場合, 半角スペース, '=', '>', 半角スペースと3種類のキーを4回押す必要がありますが, smartchrを使えば','キーを3回押すだけで入力することができます. うまく使いこなせばプログラムがかなり楽になるpluginだと思います.

...ちなみにこの場合, '='キーを連打することで'='を使った区切り線('=========='<-こういうの)が入力できなくなりますが, ノーマルモードから'NI='でN個の'='を入力することができますので特に問題はないかと思います.

まとめ

というわけで, 私自身が「痒い所に手が届いた!」と実感したvimのテクニック(.vimrcの設定やplugin)を5つご紹介させて頂きました.
恐らく, Vim Advent Calendarに参加されている方からすれば「そんなの常識じゃん!」という内容ばかりかとは思いますが... 個人的には, 改めて今までに.vimrcに積み重ねてきたモノをこういう形でまとめる事で, ノウハウや情報を整理することができたので, 有意義だったかなー... と自己満足したりしています.

やはりまだまだ「vimを使いこなす」という段階には程遠いので, Vim Advent CalendarやVimmerの皆様のつぶやきやブログ記事などを拝見しつつ, Vimというエディタと付き合って行きたいと思っています.
また新しい発見があれば, 今回のようにブログの記事として紹介できればいいなー... と思っていますので, その時は宜しくお願い致します.

To Be Continued...

明日は@さんです!

*1:...もしかしたら出来るのかもしれませんが, 少なくとも当時の私はそういう機能があるという情報を知りませんでした...