Vim
vimrc
vim-plugins

vim中級者未満が捗った設定やプラグイン[gif付き]

概要

2017年より本格的なvim利用を初めて、色々なキーバインドや設定、プラグインを試してきた。そんな中で個人的に、コーディングがより捗るキッカケとなったvimプラグイン、設定がいくつかあるので、動作画面をgifで撮影してまとめてみた。

本記事ではプラグイン名とその挙動例のみ掲載するので、気になった場合はプラグイン名でググればわかりやすい解説が多数ヒットすると思う。

関連記事
はじめてのvimscriptとvimプラグインの作成

挿入モードで'jj' → ESC

最も捗った絶対に外せない設定。

inoremap <silent> jj <ESC>

vimは挿入モードからノーマルモードへの切り替えをescキーで行うため、escキーを頻繁に利用する。その割にESCキーは多くのキーボードではホームポジションから離れた使い勝手の悪い位置にある(MacBookProのタッチバーは論外)

そこで、ホームポジションのまま叩けるJキーを使って、'jj'をESCにバインドする。「え、それじゃあjjという文字列を入力できなくなるじゃん!」 私もそう思った。だが自身のコードを確認してみるとわかる。よほど特殊なケースでない限りコード中にjjという文字列は現れない

私はjjを入力できなくなることを代償に、ホームポジションのまま挿入モードを抜けられるようになった。

挿入モードから抜けると同時に保存

前項のjj → ESC バインドと組み合わせて

inoremap <silent> jj <ESC>:w<CR>

保存するたびに:wだのZZするのも面倒くさいし、実行してみたら「保存するの忘れてたてへぺろ」となることも多いので、挿入モードを抜けるたびに保存してくれるように。

弊害としては意図しない保存をしてしまうことがあるが、普通はgitなりでバージョン管理しているので事故が起こることはない。稼働中のサーバで直接作業するとかになると流石に外したほうが良いと思うけど。

また、ファイル保存をフックに重い処理が動く場合は不向き。私は後述のsyntasticなんかはファイル保存時に実行しないようにして、別途実行するキーバインドを振ったりして回避してる。

ESC ESC → :noh

nnoremap <silent> <Esc><Esc> :noh<CR>

ハイライト消したいとき:nohは面倒なので。

neocomplcache

01.gif

バッファ内のコードを元にコード補完を行ってくれるプラグイン。同様のことはvimの標準機能でも可能で、自分も長らくそれだけ使ってきたが、試しにneocomplcacheを入れてみたら戻れなくなった。

ただ補完してほしくないようなワードやタイミングで補完が始まってしまうのが少し辛い。その辺りは細かい設定を弄ったり、拡張してくれるプラグインを入れるなど好みに応じて広げられる。

neosnippe/neosnippet-snippets

2.gif

スニペット(頻出の決まりきったコード)の自動入力を補助してくれるプラグイン。neosnippet-snippetsを入れるだけでも多くの言語の多くのスニペットをサポートしてくれる。痒い所に手が届かない場合は比較的簡単に自分でカスタマイズできるようになってるみたい。

syntastic

イチオシ
3.gif

ファイル保存時にコードを静的解析し、構文エラーを教えてくれる。PHPのセミコロン漏れやJSの括弧の対応漏れ、Rubyの未使用変数の警告など、幅広い範囲で教えてくれる。凡ミスで無駄な出戻りを生まなくなるので最早必須のプラグイン。

syntasticを拡張するプラグインも数多くあって、例えばeslintとかrubocopのような静的解析ツールを連動させることも出来る。

commentary

4.gif

ヴィジュアルモードで選択した範囲をまとめてコメントアウトするプラグイン。これもvimの標準機能で出来ないこともないが、これを使うことでより手軽にコメントアウトできるので導入。言語によってはサポートしきれていないのでその辺りは別途強化する。

nerdtree

6.gif

いわゆるディレクトリツリーの決定版。ファイル一覧を表示して任意のファイルをバッファに展開できる。自分はvimのバッファ機能をまだまだ使いこなせていないので、このプラグインもまだ10%程度しか活用できてない。

autoclose

7.gif

()や{},[]などの対応する閉じ括弧を自動挿入してくれるプラグイン。地味ながら非常に強力。

emmet-vim

イチオシ

8.gif

フロントエンジニアなら必須とも言えるプラグイン。emmetの構文規則に沿った文字列を入力すると自在にHTMLに展開できる。その機能の多さ、汎用さは最高級。ちないにemmetはvimに限らずsublimeやatomでも提供されているので、vimmer以外でも調べてみると良い。

vim-surround

9.gif

""や''などの、テキストを囲む要素の自動入力、差し替え、削除などのプラグイン。個人的には、""で囲っていた文字列をやっぱり''で書き直そうと言う時に地味に役立つ。

おまけ(vimrc)

本記事作成時点での私のvimrcは以下の通り。本記事で紹介しなかったプラグインや、各種設定、キーバインドも含んでいる。特に"jj"でインサートモードを抜けるキーバインドはもう絶対に手放せない。

"---------------------------------------------------------
" NeoBundle ここから
"---------------------------------------------------------
if has('vim_starting')
  set nocompatible
  if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    echo "install neobundle..."
    :call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
  endif
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#begin(expand('~/.vim/bundle'))
let g:neobundle_default_git_protocol='https'
NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'nanotech/jellybeans.vim'
NeoBundleLazy 'tpope/vim-endwise', {
  \ 'autoload' : { 'insert' : 1,}}

"---------------------------------------------------------
" 自動補完
"---------------------------------------------------------
NeoBundle 'Shougo/neocomplcache.vim'
NeoBundle 'Shougo/neocomplcache-rsense.vim'
let g:acp_enableAtStartup = 0
let g:neocomplcache_enable_at_startup = 1
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_enable_underbar_completion = 1
if !exists('g:neocomplcache_omni_patterns')
    let g:neocomplcache_omni_patterns = {}
endif
let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::'
autocmd FileType ruby setlocal omnifunc=rubycomplete#Complete
let g:rsenseHome = expand("~/.vim/bundle/rsense")
let g:rsenseUseOmniFunc = 1
NeoBundle 'Shougo/neosnippet'
NeoBundle 'Shougo/neosnippet-snippets'
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)
xmap <C-k>     <Plug>(neosnippet_expand_target)

"---------------------------------------------------------
" シンタックスチェック
"---------------------------------------------------------
NeoBundle 'scrooloose/syntastic.git'
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 0
let g:syntastic_check_on_wq = 0
let g:syntastic_mode_map = { 'mode': 'passive', 'passive_filetypes': ['ruby'] }
let g:syntastic_ruby_checkers=['rubocop']

"---------------------------------------------------------
" ソースコードの実行 \r
"---------------------------------------------------------
NeoBundle 'thinca/vim-quickrun'

"---------------------------------------------------------
" 括弧の自動入力
"---------------------------------------------------------
NeoBundle 'Townk/vim-autoclose'
autocmd FileType ruby setlocal commentstring=#\ %s

"---------------------------------------------------------
" 一括コメントアウト gc
"---------------------------------------------------------
NeoBundle 'tpope/vim-commentary'

"---------------------------------------------------------
" HTMLの自動入力 <C-t>,
"---------------------------------------------------------
NeoBundle 'mattn/emmet-vim'
let g:user_emmet_leader_key='<c-t>'

"---------------------------------------------------------
" ディレクトリツリー <C-n>
"---------------------------------------------------------
NeoBundle 'scrooloose/nerdtree'
nmap <silent><C-n> :NERDTreeToggle<CR>

"---------------------------------------------------------
" シンタックスハイライト
"---------------------------------------------------------
NeoBundle 'slim-template/vim-slim'
NeoBundle 'othree/yajs.vim'
NeoBundle 'maxmellon/vim-jsx-pretty'
NeoBundle 'posva/vim-vue'
autocmd BufNewFile,BufRead *.{html,htm,vue*} set filetype=html
highlight Search term=bold,reverse ctermfg=15 ctermbg=233 gui=bold,reverse

"---------------------------------------------------------
" ステータスラインの装飾
"---------------------------------------------------------
NeoBundle 'itchyny/lightline.vim'

"---------------------------------------------------------
" 括弧の差し替え、追加、削除
" cs"' / ys[text object]"
"---------------------------------------------------------
NeoBundle 'tpope/vim-surround'

"---------------------------------------------------------
" Helpの日本語化
"---------------------------------------------------------
NeoBundle 'vim-jp/vimdoc-ja'

"---------------------------------------------------------
" NeoBundle ここまで
"---------------------------------------------------------
NeoBundleCheck
call neobundle#end()

"----------------------------------------------------------
" 配色設定
"----------------------------------------------------------
set t_Co=256
highlight StatusLine   cterm=NONE ctermfg=white ctermbg=233
highlight StatusLineNC cterm=NONE ctermfg=white ctermbg=233
highlight VertSplit    cterm=NONE ctermfg=233   ctermbg=233
highlight Pmenu     ctermbg=4
highlight PmenuSel  ctermbg=1
highlight PmenuSbar ctermbg=4
syntax on

"---------------------------------------------------------
" 文字コード関係
"---------------------------------------------------------
set encoding=utf-8
set fenc=utf-8
set fileformats=unix,dos,mac

"---------------------------------------------------------
" エディタの見た目関係
"---------------------------------------------------------
set number
set laststatus=2
set list
set showmatch
set display=lastline
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P]']'}

"---------------------------------------------------------
" インデント関係
"---------------------------------------------------------
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set expandtab
set listchars=tab:>-,trail:.
set softtabstop=2
set backspace=indent,eol,start

"---------------------------------------------------------
" 検索関係
"---------------------------------------------------------
set incsearch
set hlsearch

"---------------------------------------------------------
" その他
"---------------------------------------------------------
set whichwrap=b,s,h,l,<,>,[,]
set filetype=html
autocmd BufWritePre * :%s/\s\+$//ge " 保存時に行末スペースを削除
autocmd InsertEnter * set nohlsearch " 挿入モードではハイライトを無効
autocmd InsertLeave * set hlsearch " 挿入モード以外ではハイライトを有効

"---------------------------------------------------------
" その他 キーバインド
"---------------------------------------------------------
nnoremap <C-C> :w<CR>:SyntasticCheck<CR>
inoremap <silent> jj <ESC>:w<CR>:noh<CR>
inoremap <silent> <C-j> <ESC><ESC>
inoremap <silent> <C-l> <CR>
inoremap <silent> <C-;> <CR>
nnoremap ; :
nnoremap ' :
nnoremap <silent> Z :w<CR>
nnoremap <silent> <Esc><Esc> :noh<CR>
nnoremap <Down> gj
nnoremap <Up>   gk

vimrcはGithubで管理しているので、更新があった場合は基本的にこちらが最新になる。