はじめに: 「素のVim」から「プラグイン付きのVim」へ
Vimを使い始めた当初、僕は.vimrcの設定だけで実現できる機能に限定した方が「ポータブルなVimスキル」になる気がしていたので、プラグインは全く使わずに「素のVim」を使っていました。
しかし、Vimを使って実務でRailsを開発し始めるとそんなことも言ってられなくなりました。
やはり素のVimだけでは限界があります。
Vimを使って効率よくRailsを開発するためにはプラグインに頼らざるを得ません。
ネットの情報などを参考にしてあれこれプラグインを入れてみましたが、これは手放せないというプラグインもあれば、思ったほど使わなかったというプラグインもあります。
今回の記事では前者のような「これは手放せない!」と僕が考えているプラグインに限定して紹介していきます。
また、後半ではプラグインを使わない.vimrcの一般的な設定についても紹介しています。
対象となる読者
この記事ではこんな方を対象にしています。
- Vimに関してはまだ初心者でもっと効率よくコードを書きたい人
- Vimのプラグインに興味はあるが、多すぎてどれを使うべきか迷っている人
- 基本的なVimコマンドには慣れてきたが、.vimrcのカスタマイズにはまだ抵抗がある人
- VimでRubyやRailsのコードを書くことが多い人
対象となるVim
僕が使っているのはMacVimですが、ターミナルで使うVimでもほぼ同じように動くはずです。
Windowsは全く試していないのでよくわかりませんが。。。
プラグインを紹介する前に: .vimrcをGitで管理しよう
.vimrcもGitのようなバージョン管理ツールで管理しましょう。
設定を間違えて昔の設定に戻したい!というときもあるでしょうし、GitHubに置いておけば他のマシンからも簡単に共通の.vimrcがダウンロードできます。
また、.vimrcだけでなく、.zshrcや.gitignoreなど、その他のマシン共通の設定ファイルもまとめて管理するようにしておくと便利です。
こうしたいわゆる「dotfiles」を管理する方法は、こちらのサイトを参考にさせてもらいました。
そろそろしっかりvimを使う。dotfilesのgithub管理とvundleの導入。
ちなみに僕のdotfilesもGitHubに置いています。
よかったら参考にしてみてください。
Vundle/NeoBundleでプラグインを自動管理
Vundle/NeoBundleはVimのプラグインを管理しやすくするツールです。
.vimrcにNeoBundle 'Shougo/unite.vim'
のようにプラグイン名を記述しておけば、コマンド一つでプラグインをインストールすることができます。
上で紹介した「そろそろしっかりvimを使う。dotfilesのgithub管理とvundleの導入。」ではVundleを使っていますが、最近ではNeoBundleを使う方がイマドキかもしれません。
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を使うと現在開いているバッファの一覧やカレントディレクトリ以下にあるファイルの一覧、最近使ったファイルの一覧などを表示して、目的のファイルをすばやく開くことができます。
設定
僕はこちらのサイトを参考にして設定しました。
この設定では以下のようなキーマッピングになります。
- 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
というコマンドでカレントディレクトリをツリー表示できます。
また、ファイルを選んでリターンキーを押すと、そのファイルを開くこともできます。
設定
僕はプラグインを入れているだけで、他に特別な設定はしていません。
" ファイルをtree表示してくれる
NeoBundle 'scrooloose/nerdtree'
fugitive.vimでVimからGitを操作 (でも一番よく使うのはgrep検索)
fugitive.vimを使えば、いちいちターミナルを開かなくてもVim上からGitコマンドを自由に実行できる!・・・のかな?
いろいろとコマンドはあるみたいですが、実はあまり使いこなせていません。(ごめんなさい)
個人的に便利だと思うのは:Ggrep hogehoge
のようなコマンドを使うと、Gitで管理されているファイルをgrep検索できる点です。
検索結果はQuickfix Listに表示され、その行でリターンキーを押すと該当行にジャンプすることができます。
あとは: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モデルを開くことができる、といった具合です。
とはいえ、こちらのプラグインもたくさんある機能の割にはそれほど使いこなせていないかも・・・。
目的のファイルを開くだけなら、前述のUnite.vimやNERDTreeを使って開くこともしばしばです。
設定
やはりこれもプラグインを入れているだけです。
" Rails向けのコマンドを提供する
NeoBundle 'tpope/vim-rails'
endwise.vimでRubyのendキーワードを自動挿入
endwise.vimはRubyのプログラムを書くときに必携ですね!
Rubyファイルでdoブロックやif文を書いて改行すると、自動的にendキーワードを挿入してくれます。
Rubyを書いているプログラマは必ず入れておきましょう。
設定
こちらもプラグインをインストールするだけでOK!簡単&便利ですね。
" Ruby向けにendを自動挿入してくれる
NeoBundle 'tpope/vim-endwise'
tcomment_vimで複数行コメントのON/OFFを手軽に実現
tcomment_vimも非常に便利なプラグインです。
Shift+Vで対象の範囲を選択し、Ctrl+-(コントロールキー+ハイフン)を2回押すだけで、その範囲をまとめてコメントアウトしたり、コメントを外したりできます。
矩形選択(Ctrl+V)を駆使して頑張るよりもずっと手軽にコメントON/OFFできます。
設定
こちらもプラグインを入れるだけです。
コメントのON/OFFはCtrl+-のほか、gccでも実現できます。
" コメントON/OFFを手軽に実行
NeoBundle 'tomtom/tcomment_vim'
surround.vimでシングルクオートとダブルクオートを切り替える
それほど頻度は多くないかもしれませんが、シングルクオートで囲んでいた文字列をダブルクオートに変えたい、と思うときがたまにあります。
(注: Rubyではダブルクオートの文字列のみ変数を埋め込める)
surround.vimを使うと、cs'" というコマンドでシングルクオートをダブルクオートに置換することができます。
他にもcs'<p>と打ち込むと、シングルクオート文字列を<p>タグで囲むこともできたりして、応用的な使い方がいろいろできます。
設定
これもやはりプラグインを入れるだけでOKです。
" シングルクオートとダブルクオートの入れ替え等
NeoBundle 'tpope/vim-surround'
vim-indent-guidesを使ってインデントの深さを視覚化する
Rubyのメソッドを書いたりするときは行数が多くなったりインデントが深くなったりしないように気をつけて書くことができますが、HAMLでViewを書いたりする場合はどうしてもネストが深くなったり長くなったりしがちです。
そんなときはvim-indent-guidesを使ってインデントを視覚化してやると、どこからどこまでがそのネストに含まれるのかを把握しやすくなります。
設定
このプラグインは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カラー情報が埋め込まれているファイルを開くとそのカラー情報が表示に反映されます。
設定
このプラグインはインストールするだけでOKです。
" ログファイルを色づけしてくれる
NeoBundle 'vim-scripts/AnsiEsc.vim'
vim-trailing-whitespaceで行末の不要な半角スペースを可視化
vim-trailing-whitespaceを使うと、行末に入ってしまった不要な半角スペースを可視化してくれます。
さらに、:FixWhitespace
というコマンドを実行すると、そうしたスペースを自動的に削除してくれます。
・・・なのですが、僕の環境ではちゃんと動いてくれません。
行末に半角スペースを入れた直後はハイライトしてくれるんですが、バッファを切り替えたりするとハイライトがなくなってしまいます。
常にハイライトしてくれるとすごく便利なんですけどね~。
(2014.06.10修正)
後述する「全角スペースの可視化」と設定がケンカしているのが原因でした。全角スペースの可視化設定を見直すことで常にハイライトされるようになりました。
設定
このプラグインもインストールするだけでOKです。
" 行末の半角スペースを可視化
NeoBundle 'bronson/vim-trailing-whitespace'
その他、.vimrcで追加しておくと便利な設定
ついでにプラグインとは無関係に.vimrcで設定しておくと便利な内容を載せておきます。
全角スペースの可視化
以下のような設定をしておくと、全角スペースが可視化されます。
・・・が、半角スペースのときと同じで可視化されたりしなかったりです。
なぜだ。
(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
""""""""""""""""""""""""""""""
挿入モード時にステータス行の色を変える
以下のような設定をしておくと、挿入モード時にステータス行の色を変えることができます。
モードが切り替わったことを目で確認できるので結構便利です。
" 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
""""""""""""""""""""""""""""""
自動的に閉じ括弧を入力する
以下の設定を入れると、{, [, (を入力したときに閉じ括弧を自動的に入力してくれます。
が、あまり賢くないので「そこは入れてくれなくていいのに」と思うときもしばしばあります。お好みでどうぞ。
""""""""""""""""""""""""""""""
" 自動的に閉じ括弧を入力
""""""""""""""""""""""""""""""
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割ぐらいはこれで十分間に合うので、自動補完系のプラグインは入れていません。
まとめ
言うまでもなくVimの世界は奥がめちゃくちゃ深いので、すごい人の.vimrcはとんでもなくすごいです。
が、今回の記事ではそこまで深いところまでは足を踏み入れずに「比較的簡単にそこそこ使えるプラグインや.vimrcの設定」を集めてみました。
脱初心者を目指すVimmerのみなさんは、よかったら参考にしてみてください。
僕の.vimrcはこちらです
JunichiIto/dotfiles/.vimrc - GitHub
冒頭でも紹介しましたが、僕の.vimrcはGitHubに置いてあるので今回の記事とあわせてチェックしてみると効果的です。
あわせて読みたい
僕がサクラエディタからVimに乗り換えるまで - give IT a try
数年前は僕も全くVimが使えず、サクラエディタのような「メモ帳の延長線上にあるテキストエディタ」を使っていました。
そんな僕がVimに乗り換えようと思った動機と、乗り換えるまでにやったトレーニング(?)の数々を公開しています。
Vimコマンドを定期的にツイートするbotも作っています
Vimコマンドの勉強用に作った@be_vimmer_jpというbotがあります。
このbotをフォローすると定期的にVimコマンドの内容をランダムにツイートしてくれます。
よかったらフォローしてみてください。
開発の経緯はこちらのブログエントリにまとめてあります。
Vimコマンドを定期的に解説してくれるTwitterボットを作りました - give IT a try
次回予告? 次は「脱初心者を目指すVimmerにオススメしたい便利なVimコマンド集」を書くかも
時間があれば次は「Vimってやっぱり便利だわ~」としみじみ思う便利なVimコマンドをまとめて紹介したいな~と思っています。
記事が書けたらまた読んでやってください。