脱初心者を目指すVimmerにオススメしたいVimプラグインや.vimrcの設定

  • 1546
    いいね
  • 6
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに: 「素のVim」から「プラグイン付きのVim」へ

Vimを使い始めた当初、僕は.vimrcの設定だけで実現できる機能に限定した方が「ポータブルなVimスキル」になる気がしていたので、プラグインは全く使わずに「素のVim」を使っていました。
しかし、Vimを使って実務でRailsを開発し始めるとそんなことも言ってられなくなりました。

やはり素のVimだけでは限界があります。
Vimを使って効率よくRailsを開発するためにはプラグインに頼らざるを得ません。

ネットの情報などを参考にしてあれこれプラグインを入れてみましたが、これは手放せないというプラグインもあれば、思ったほど使わなかったというプラグインもあります。

今回の記事では前者のような「これは手放せない!」と僕が考えているプラグインに限定して紹介していきます。

また、後半ではプラグインを使わない.vimrcの一般的な設定についても紹介しています。

対象となる読者

この記事ではこんな方を対象にしています。

  • Vimに関してはまだ初心者でもっと効率よくコードを書きたい人
  • Vimのプラグインに興味はあるが、多すぎてどれを使うべきか迷っている人
  • 基本的なVimコマンドには慣れてきたが、.vimrcのカスタマイズにはまだ抵抗がある人
  • VimでRubyやRailsのコードを書くことが多い人

対象となるVim

僕が使っているのはMacVimですが、ターミナルで使うVimでもほぼ同じように動くはずです。
Windowsは全く試していないのでよくわかりませんが。。。

Vim.png

プラグインを紹介する前に: .vimrcをGitで管理しよう

.vimrcもGitのようなバージョン管理ツールで管理しましょう。
設定を間違えて昔の設定に戻したい!というときもあるでしょうし、GitHubに置いておけば他のマシンからも簡単に共通の.vimrcがダウンロードできます。

また、.vimrcだけでなく、.zshrcや.gitignoreなど、その他のマシン共通の設定ファイルもまとめて管理するようにしておくと便利です。

こうしたいわゆる「dotfiles」を管理する方法は、こちらのサイトを参考にさせてもらいました。

そろそろしっかりvimを使う。dotfilesのgithub管理とvundleの導入。

ちなみに僕のdotfilesもGitHubに置いています。
よかったら参考にしてみてください。

JunichiIto/dotfiles - GitHub

Vundle/NeoBundleでプラグインを自動管理

Vundle/NeoBundleはVimのプラグインを管理しやすくするツールです。
.vimrcにNeoBundle 'Shougo/unite.vim'のようにプラグイン名を記述しておけば、コマンド一つでプラグインをインストールすることができます。

上で紹介した「そろそろしっかりvimを使う。dotfilesのgithub管理とvundleの導入。」ではVundleを使っていますが、最近ではNeoBundleを使う方がイマドキかもしれません。

NeoBundleを使う場合は以下のQiita記事が参考になります。

NeoBundleの導入 - Qiita

設定

僕はNeoBundleのREADMEを参考にして.vimrcを設定しています。

""""""""""""""""""""""""""""""
" プラグインのセットアップ
""""""""""""""""""""""""""""""
if has('vim_starting')
  set nocompatible               " Be iMproved

  " Required:
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

" Required:
call neobundle#begin(expand('~/.vim/bundle/'))

" Let NeoBundle manage NeoBundle
" Required:
NeoBundleFetch 'Shougo/neobundle.vim'

" ファイルオープンを便利に
NeoBundle 'Shougo/unite.vim'
" Unite.vimで最近使ったファイルを表示できるようにする
NeoBundle 'Shougo/neomru.vim'
" ...省略

call neobundle#end()

" Required:
filetype plugin indent on

" If there are uninstalled bundles found on startup,
" this will conveniently prompt you to install them.
NeoBundleCheck
""""""""""""""""""""""""""""""

Unite.vimで目的のファイルをすばやく開く

Unite.vimを使うと現在開いているバッファの一覧やカレントディレクトリ以下にあるファイルの一覧、最近使ったファイルの一覧などを表示して、目的のファイルをすばやく開くことができます。

unite.vim2.gif

設定

僕はこちらのサイトを参考にして設定しました。

この設定では以下のようなキーマッピングになります。

  • Ctrl+P => バッファ一覧
  • Ctrl+N => カレントディレクトリ以下のファイル一覧
  • Ctrl+Z => 最近使ったファイルの一覧
" ファイルオープンを便利に
NeoBundle 'Shougo/unite.vim'
" Unite.vimで最近使ったファイルを表示できるようにする
NeoBundle 'Shougo/neomru.vim'

" http://blog.remora.cx/2010/12/vim-ref-with-unite.html
""""""""""""""""""""""""""""""
" Unit.vimの設定
""""""""""""""""""""""""""""""
" 入力モードで開始する
let g:unite_enable_start_insert=1
" バッファ一覧
noremap <C-P> :Unite buffer<CR>
" ファイル一覧
noremap <C-N> :Unite -buffer-name=file file<CR>
" 最近使ったファイルの一覧
noremap <C-Z> :Unite file_mru<CR>
" sourcesを「今開いているファイルのディレクトリ」とする
noremap :uff :<C-u>UniteWithBufferDir file -buffer-name=file<CR>
" ウィンドウを分割して開く
au FileType unite nnoremap <silent> <buffer> <expr> <C-J> unite#do_action('split')
au FileType unite inoremap <silent> <buffer> <expr> <C-J> unite#do_action('split')
" ウィンドウを縦に分割して開く
au FileType unite nnoremap <silent> <buffer> <expr> <C-K> unite#do_action('vsplit')
au FileType unite inoremap <silent> <buffer> <expr> <C-K> unite#do_action('vsplit')
" ESCキーを2回押すと終了する
au FileType unite nnoremap <silent> <buffer> <ESC><ESC> :q<CR>
au FileType unite inoremap <silent> <buffer> <ESC><ESC> <ESC>:q<CR>
""""""""""""""""""""""""""""""

NERDTreeでツリー型のファイル表示を実現

プロジェクト全体のファイル構成を把握する場合は、ファイルをツリー型に表示できた方が便利です。
NERDTreeというプラグインを入れると:NERDTreeというコマンドでカレントディレクトリをツリー表示できます。

また、ファイルを選んでリターンキーを押すと、そのファイルを開くこともできます。

nerdtree.gif

設定

僕はプラグインを入れているだけで、他に特別な設定はしていません。

" ファイルをtree表示してくれる
NeoBundle 'scrooloose/nerdtree'

fugitive.vimでVimからGitを操作 (でも一番よく使うのはgrep検索)

fugitive.vimを使えば、いちいちターミナルを開かなくてもVim上からGitコマンドを自由に実行できる!・・・のかな?
いろいろとコマンドはあるみたいですが、実はあまり使いこなせていません。(ごめんなさい)

個人的に便利だと思うのは:Ggrep hogehogeのようなコマンドを使うと、Gitで管理されているファイルをgrep検索できる点です。
検索結果はQuickfix Listに表示され、その行でリターンキーを押すと該当行にジャンプすることができます。

fugitive.gif

あとは:Greadで変更前の状態に戻したりするときにも使いますね。

それ以外のコマンドについてはネットの情報を参考にして、みなさんは僕以上に使いこなしてくださいw

設定

fugitive.vimには先ほどの:Ggrepを実行したあとにQuickFix Listが開くようにしています。
また、ステータス行に現在のブランチを表示する機能もあるのでその設定も入れています。

" Gitを便利に使う
NeoBundle 'tpope/vim-fugitive'

" grep検索の実行後にQuickFix Listを表示する
autocmd QuickFixCmdPost *grep* cwindow

" ステータス行に現在のgitブランチを表示する
set statusline+=%{fugitive#statusline()}

vim-railsでRailsプロジェクトを便利に操作

vim-railsというプラグインを導入すると、Rails向けの便利なコマンドが使えるようになります。
例えば:Rmodel userと打ち込めばUserモデルを開くことができる、といった具合です。

rails-vim.gif

とはいえ、こちらのプラグインもたくさんある機能の割にはそれほど使いこなせていないかも・・・。
目的のファイルを開くだけなら、前述のUnite.vimやNERDTreeを使って開くこともしばしばです。

設定

やはりこれもプラグインを入れているだけです。

" Rails向けのコマンドを提供する
NeoBundle 'tpope/vim-rails'

endwise.vimでRubyのendキーワードを自動挿入

endwise.vimはRubyのプログラムを書くときに必携ですね!
Rubyファイルでdoブロックやif文を書いて改行すると、自動的にendキーワードを挿入してくれます。

endwise.gif

Rubyを書いているプログラマは必ず入れておきましょう。

設定

こちらもプラグインをインストールするだけでOK!簡単&便利ですね。

" Ruby向けにendを自動挿入してくれる
NeoBundle 'tpope/vim-endwise'

tcomment_vimで複数行コメントのON/OFFを手軽に実現

tcomment_vimも非常に便利なプラグインです。
Shift+Vで対象の範囲を選択し、Ctrl+-(コントロールキー+ハイフン)を2回押すだけで、その範囲をまとめてコメントアウトしたり、コメントを外したりできます。

tcomment2.gif

矩形選択(Ctrl+V)を駆使して頑張るよりもずっと手軽にコメントON/OFFできます。

設定

こちらもプラグインを入れるだけです。
コメントのON/OFFはCtrl+-のほか、gccでも実現できます。

" コメントON/OFFを手軽に実行
NeoBundle 'tomtom/tcomment_vim'

surround.vimでシングルクオートとダブルクオートを切り替える

それほど頻度は多くないかもしれませんが、シングルクオートで囲んでいた文字列をダブルクオートに変えたい、と思うときがたまにあります。
(注: Rubyではダブルクオートの文字列のみ変数を埋め込める)

surround.vimを使うと、cs'" というコマンドでシングルクオートをダブルクオートに置換することができます。
他にもcs'<p>と打ち込むと、シングルクオート文字列を<p>タグで囲むこともできたりして、応用的な使い方がいろいろできます。

surround.gif

設定

これもやはりプラグインを入れるだけでOKです。

" シングルクオートとダブルクオートの入れ替え等
NeoBundle 'tpope/vim-surround'

vim-indent-guidesを使ってインデントの深さを視覚化する

Rubyのメソッドを書いたりするときは行数が多くなったりインデントが深くなったりしないように気をつけて書くことができますが、HAMLでViewを書いたりする場合はどうしてもネストが深くなったり長くなったりしがちです。

そんなときはvim-indent-guidesを使ってインデントを視覚化してやると、どこからどこまでがそのネストに含まれるのかを把握しやすくなります。

indent-guides.png

設定

このプラグインは1行だけ設定が必要です。

" インデントに色を付けて見やすくする
NeoBundle 'nathanaelkane/vim-indent-guides'

" vimを立ち上げたときに、自動的にvim-indent-guidesをオンにする
let g:indent_guides_enable_on_vim_startup = 1

AnsiEsc.vimでログの内容を色づけ

AnsiEsc.vimを使うとRailsのログファイルなど、ANSIカラー情報が埋め込まれているファイルを開くとそのカラー情報が表示に反映されます。

ansiesc.png

設定

このプラグインはインストールするだけでOKです。

" ログファイルを色づけしてくれる
NeoBundle 'vim-scripts/AnsiEsc.vim'

vim-trailing-whitespaceで行末の不要な半角スペースを可視化

vim-trailing-whitespaceを使うと、行末に入ってしまった不要な半角スペースを可視化してくれます。
さらに、:FixWhitespaceというコマンドを実行すると、そうしたスペースを自動的に削除してくれます。

whitespace.gif

・・・なのですが、僕の環境ではちゃんと動いてくれません。
行末に半角スペースを入れた直後はハイライトしてくれるんですが、バッファを切り替えたりするとハイライトがなくなってしまいます。
常にハイライトしてくれるとすごく便利なんですけどね~。

(2014.06.10修正)
後述する「全角スペースの可視化」と設定がケンカしているのが原因でした。全角スペースの可視化設定を見直すことで常にハイライトされるようになりました。

設定

このプラグインもインストールするだけでOKです。

" 行末の半角スペースを可視化
NeoBundle 'bronson/vim-trailing-whitespace'

その他、.vimrcで追加しておくと便利な設定

ついでにプラグインとは無関係に.vimrcで設定しておくと便利な内容を載せておきます。

全角スペースの可視化

以下のような設定をしておくと、全角スペースが可視化されます。

zenkaku.png

・・・が、半角スペースのときと同じで可視化されたりしなかったりです。
なぜだ。

(2014.06.10修正)
autocmdのイベントにBufReadを追加することで全角スペースが常に可視化されるようになりました。
また、match関数は最後のmatch設定だけが有効になってしまうため、「半角スペースの可視化」が無効になっていました。
matchを複数定義するときはmatchadd関数を使うといいようです。
以下のサンプルコードは上記の内容を反映済みです。

" http://inari.hatenablog.com/entry/2014/05/05/231307
""""""""""""""""""""""""""""""
" 全角スペースの表示
""""""""""""""""""""""""""""""
function! ZenkakuSpace()
    highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=darkgray
endfunction

if has('syntax')
    augroup ZenkakuSpace
        autocmd!
        autocmd ColorScheme * call ZenkakuSpace()
        autocmd VimEnter,WinEnter,BufRead * let w:m1=matchadd('ZenkakuSpace', ' ')
    augroup END
    call ZenkakuSpace()
endif
""""""""""""""""""""""""""""""

挿入モード時にステータス行の色を変える

以下のような設定をしておくと、挿入モード時にステータス行の色を変えることができます。

statusline.gif

モードが切り替わったことを目で確認できるので結構便利です。

" https://sites.google.com/site/fudist/Home/vim-nihongo-ban/-vimrc-sample
""""""""""""""""""""""""""""""
" 挿入モード時、ステータスラインの色を変更
""""""""""""""""""""""""""""""
let g:hi_insert = 'highlight StatusLine guifg=darkblue guibg=darkyellow gui=none ctermfg=blue ctermbg=yellow cterm=none'

if has('syntax')
  augroup InsertHook
    autocmd!
    autocmd InsertEnter * call s:StatusLine('Enter')
    autocmd InsertLeave * call s:StatusLine('Leave')
  augroup END
endif

let s:slhlcmd = ''
function! s:StatusLine(mode)
  if a:mode == 'Enter'
    silent! let s:slhlcmd = 'highlight ' . s:GetHighlight('StatusLine')
    silent exec g:hi_insert
  else
    highlight clear StatusLine
    silent exec s:slhlcmd
  endif
endfunction

function! s:GetHighlight(hi)
  redir => hl
  exec 'highlight '.a:hi
  redir END
  let hl = substitute(hl, '[\r\n]', '', 'g')
  let hl = substitute(hl, 'xxx', '', '')
  return hl
endfunction
""""""""""""""""""""""""""""""

自動的に閉じ括弧を入力する

以下の設定を入れると、{, [, (を入力したときに閉じ括弧を自動的に入力してくれます。

autobrace.gif

が、あまり賢くないので「そこは入れてくれなくていいのに」と思うときもしばしばあります。お好みでどうぞ。

""""""""""""""""""""""""""""""
" 自動的に閉じ括弧を入力
""""""""""""""""""""""""""""""
imap { {}<LEFT>
imap [ []<LEFT>
imap ( ()<LEFT>
""""""""""""""""""""""""""""""

最後のカーソル位置を復元する

以下の設定を入れておくと、ファイルを開いたときに前回開いたときの最後のカーソル位置を復元してくれます

""""""""""""""""""""""""""""""
" 最後のカーソル位置を復元する
""""""""""""""""""""""""""""""
if has("autocmd")
    autocmd BufReadPost *
    \ if line("'\"") > 0 && line ("'\"") <= line("$") |
    \   exe "normal! g'\"" |
    \ endif
endif
""""""""""""""""""""""""""""""

その他、設定もろもろ

その他、僕の.vimrcで入れているVimのオプションを以下に載せておきます。
コメントを参考にして、お好みで取り込んでください。

""""""""""""""""""""""""""""""
" 各種オプションの設定
""""""""""""""""""""""""""""""
" タグファイルの指定(でもタグジャンプは使ったことがない)
set tags=~/.tags
" スワップファイルは使わない(ときどき面倒な警告が出るだけで役に立ったことがない)
set noswapfile
" カーソルが何行目の何列目に置かれているかを表示する
set ruler
" コマンドラインに使われる画面上の行数
set cmdheight=2
" エディタウィンドウの末尾から2行目にステータスラインを常時表示させる
set laststatus=2
" ステータス行に表示させる情報の指定(どこからかコピペしたので細かい意味はわかっていない)
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P
" ステータス行に現在のgitブランチを表示する
set statusline+=%{fugitive#statusline()}
" ウインドウのタイトルバーにファイルのパス情報等を表示する
set title
" コマンドラインモードで<Tab>キーによるファイル名補完を有効にする
set wildmenu
" 入力中のコマンドを表示する
set showcmd
" バックアップディレクトリの指定(でもバックアップは使ってない)
set backupdir=$HOME/.vimbackup
" バッファで開いているファイルのディレクトリでエクスクローラを開始する(でもエクスプローラって使ってない)
set browsedir=buffer
" 小文字のみで検索したときに大文字小文字を無視する
set smartcase
" 検索結果をハイライト表示する
set hlsearch
" 暗い背景色に合わせた配色にする
set background=dark
" タブ入力を複数の空白入力に置き換える
set expandtab
" 検索ワードの最初の文字を入力した時点で検索を開始する
set incsearch
" 保存されていないファイルがあるときでも別のファイルを開けるようにする
set hidden
" 不可視文字を表示する
set list
" タブと行の続きを可視化する
set listchars=tab:>\ ,extends:<
" 行番号を表示する
set number
" 対応する括弧やブレースを表示する
set showmatch
" 改行時に前の行のインデントを継続する
set autoindent
" 改行時に入力された行の末尾に合わせて次の行のインデントを増減する
set smartindent
" タブ文字の表示幅
set tabstop=2
" Vimが挿入するインデントの幅
set shiftwidth=2
" 行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする
set smarttab
" カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
" 構文毎に文字色を変化させる
syntax on
" カラースキーマの指定
colorscheme desert
" 行番号の色
highlight LineNr ctermfg=darkyellow
""""""""""""""""""""""""""""""

余談: neocomplete.vimは使わないの?

便利なプラグインと言えば、賢く自動補完してくれるneocomplete.vimというプラグインが有名です。
しかし僕はこのプラグインを使っていません。
一回導入したことがあるのですが、どうも肌に合わず使うのをやめてしまいました。(使いこなせなかっただけ、という話もある)

Vimには挿入モード時にCtrl+PやCtrl+Nで単純な単語補完をやってくれるので、僕はこの機能を多用しています。
8割ぐらいはこれで十分間に合うので、自動補完系のプラグインは入れていません。

ちなみに以下はCtrl+Pで単語補完する様子です。

ctrl-p.gif

まとめ

言うまでもなくVimの世界は奥がめちゃくちゃ深いので、すごい人の.vimrcはとんでもなくすごいです。
が、今回の記事ではそこまで深いところまでは足を踏み入れずに「比較的簡単にそこそこ使えるプラグインや.vimrcの設定」を集めてみました。

脱初心者を目指すVimmerのみなさんは、よかったら参考にしてみてください。

僕の.vimrcはこちらです

JunichiIto/dotfiles/.vimrc - GitHub

冒頭でも紹介しましたが、僕の.vimrcはGitHubに置いてあるので今回の記事とあわせてチェックしてみると効果的です。

あわせて読みたい

脱初心者を目指すなら知っておきたい便利なVimコマンド20選 (Vimmerレベル診断付き)
こちらの記事では便利なVimコマンドを紹介しています。
楽しい(?)Vimmerレベル診断付きですよ!

僕がサクラエディタからVimに乗り換えるまで - give IT a try
数年前は僕も全くVimが使えず、サクラエディタのような「メモ帳の延長線上にあるテキストエディタ」を使っていました。
そんな僕がVimに乗り換えようと思った動機と、乗り換えるまでにやったトレーニング(?)の数々を公開しています。

Vimコマンドを定期的にツイートするbotも作っています

Vimコマンドの勉強用に作った @be_vimmer_jp というbotがあります。
このbotをフォローすると定期的にVimコマンドの内容をランダムにツイートしてくれます。
よかったらフォローしてみてください。

@be_vimmer_jp
be_vimmer.png

開発の経緯はこちらのブログエントリにまとめてあります。

Vimコマンドを定期的に解説してくれるTwitterボットを作りました - give IT a try