概要
2017年より本格的なvim利用を初めて、色々なキーバインドや設定、プラグインを試してきた。そんな中で個人的に、コーディングがより捗るキッカケとなったvimプラグイン、設定がいくつかあるので、動作画面をgifで撮影してまとめてみた。
本記事ではプラグイン名とその挙動例のみ掲載するので、気になった場合はプラグイン名でググればわかりやすい解説が多数ヒットすると思う。
挿入モードで'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
バッファ内のコードを元にコード補完を行ってくれるプラグイン。同様のことはvimの標準機能でも可能で、自分も長らくそれだけ使ってきたが、試しにneocomplcacheを入れてみたら戻れなくなった。
ただ補完してほしくないようなワードやタイミングで補完が始まってしまうのが少し辛い。その辺りは細かい設定を弄ったり、拡張してくれるプラグインを入れるなど好みに応じて広げられる。
neosnippe/neosnippet-snippets
スニペット(頻出の決まりきったコード)の自動入力を補助してくれるプラグイン。neosnippet-snippetsを入れるだけでも多くの言語の多くのスニペットをサポートしてくれる。痒い所に手が届かない場合は比較的簡単に自分でカスタマイズできるようになってるみたい。
syntastic
ファイル保存時にコードを静的解析し、構文エラーを教えてくれる。PHPのセミコロン漏れやJSの括弧の対応漏れ、Rubyの未使用変数の警告など、幅広い範囲で教えてくれる。凡ミスで無駄な出戻りを生まなくなるので最早必須のプラグイン。
syntasticを拡張するプラグインも数多くあって、例えばeslintとかrubocopのような静的解析ツールを連動させることも出来る。
commentary
ヴィジュアルモードで選択した範囲をまとめてコメントアウトするプラグイン。これもvimの標準機能で出来ないこともないが、これを使うことでより手軽にコメントアウトできるので導入。言語によってはサポートしきれていないのでその辺りは別途強化する。
nerdtree
いわゆるディレクトリツリーの決定版。ファイル一覧を表示して任意のファイルをバッファに展開できる。自分はvimのバッファ機能をまだまだ使いこなせていないので、このプラグインもまだ10%程度しか活用できてない。
autoclose
()や{},[]などの対応する閉じ括弧を自動挿入してくれるプラグイン。地味ながら非常に強力。
emmet-vim
イチオシ
フロントエンジニアなら必須とも言えるプラグイン。emmetの構文規則に沿った文字列を入力すると自在にHTMLに展開できる。その機能の多さ、汎用さは最高級。ちないにemmetはvimに限らずsublimeやatomでも提供されているので、vimmer以外でも調べてみると良い。
vim-surround
""や''などの、テキストを囲む要素の自動入力、差し替え、削除などのプラグイン。個人的には、""で囲っていた文字列をやっぱり''で書き直そうと言う時に地味に役立つ。
おまけ(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")endifset runtimepath+=~/.vim/bundle/neobundle.vim/endifcall neobundle#begin(expand('~/.vim/bundle'))letg: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'letg:acp_enableAtStartup=0letg:neocomplcache_enable_at_startup=1letg:neocomplcache_enable_smart_case=1letg:neocomplcache_min_syntax_length=3letg:neocomplcache_lock_buffer_name_pattern='\*ku\*'letg:neocomplcache_enable_camel_case_completion=1letg:neocomplcache_enable_underbar_completion=1if!exists('g:neocomplcache_omni_patterns')letg:neocomplcache_omni_patterns={}endifletg:neocomplcache_omni_patterns.ruby='[^. *\t]\.\w*\|\h\w*::'
autocmd FileTyperubysetlocal omnifunc=rubycomplete#Complete
letg:rsenseHome= expand("~/.vim/bundle/rsense")letg: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+=%*
letg:syntastic_always_populate_loc_list=1letg:syntastic_auto_loc_list=1letg:syntastic_check_on_open=0letg:syntastic_check_on_wq=0letg:syntastic_mode_map={'mode':'passive','passive_filetypes':['ruby']}letg:syntastic_ruby_checkers=['rubocop']"---------------------------------------------------------" ソースコードの実行 \r"---------------------------------------------------------
NeoBundle 'thinca/vim-quickrun'"---------------------------------------------------------" 括弧の自動入力"---------------------------------------------------------
NeoBundle 'Townk/vim-autoclose'
autocmd FileTyperubysetlocal commentstring=#\ %s
"---------------------------------------------------------" 一括コメントアウト gc"---------------------------------------------------------
NeoBundle 'tpope/vim-commentary'"---------------------------------------------------------" HTMLの自動入力 <C-t>,"---------------------------------------------------------
NeoBundle 'mattn/emmet-vim'letg: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*}setfiletype=html
highlight Search term=bold,reverse ctermfg=15 ctermbg=233gui=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-8set fenc=utf-8set fileformats=unix,dos,mac
"---------------------------------------------------------" エディタの見た目関係"---------------------------------------------------------setnumberset laststatus=2set list
set showmatch
set display=lastline
set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P]']'}"---------------------------------------------------------" インデント関係"---------------------------------------------------------set tabstop=2set shiftwidth=2set autoindent
set smartindent
set expandtab
set listchars=tab:>-,trail:.set softtabstop=2set backspace=indent,eol,start"---------------------------------------------------------" 検索関係"---------------------------------------------------------set incsearch
set hlsearch
"---------------------------------------------------------" その他"---------------------------------------------------------set whichwrap=b,s,h,l,<,>,[,]setfiletype=html
autocmd BufWritePre * :%s/\s\+$//ge " 保存時に行末スペースを削除
autocmd InsertEnter * setnohlsearch " 挿入モードではハイライトを無効
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