Vim pluginへの入門[NeoBundle.vim]

# 2016.03.06 追記
NeoBundle.vimはより高速に動作するDein.vimを推しています。（作者が同じ）
これから始める方や速さを求める方はこちらも御覧ください[NeoVim、そしてdein.vimへ](http://qiita.com/okamos/items/2259d5c770d51b88d75b)

# Plugin
vimを使ってみたけどもの足りない。
機能拡張しましょう。
そうそれがプラグイン!!
偉大なvimプラグイン作成者の方々に拍手

# 管理する
現代は管理社会ですなんでも管理しちゃいましょー
Neobundle.vim が最高にクールなので使わない手はないです。

# NeoBundle.vimとは
次世代的なプラグイン管理方法です。
プラグインの導入から更新、削除までサックサックです。

# 環境
[vim](http://www.vim.org/) -> バージョンが7.3.885以降のもので +Lua だと言うことなしです。
[git](http://git-scm.com/) -> 入れといてください

# 導入
実際に導入するにあたって、楽ちんな方法を提供します。

```vim:.vimrc
" neobundle settings {{{
if has('vim_starting')
  set nocompatible
  " neobundle をインストールしていない場合は自動インストール
  if !isdirectory(expand("~/.vim/bundle/neobundle.vim/"))
    echo "install neobundle..."
    " vim からコマンド呼び出しているだけ neobundle.vim のクローン
    :call system("git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim")
  endif
  " runtimepath の追加は必須
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif
call neobundle#begin(expand('~/.vim/bundle'))
let g:neobundle_default_git_protocol='https'

" neobundle#begin - neobundle#end の間に導入するプラグインを記載します。
NeoBundleFetch 'Shougo/neobundle.vim'
" ↓こんな感じが基本の書き方
NeoBundle 'nanotech/jellybeans.vim'

" vimrc に記述されたプラグインでインストールされていないものがないかチェックする
NeoBundleCheck
call neobundle#end()
filetype plugin indent on
" どうせだから jellybeans カラースキーマを使ってみましょう
set t_Co=256
syntax on
colorscheme jellybeans
```

NeoBundleCheck の段階で jellybeans.vim がインストールされていないので、インストールするか聞かれます。
y を入力して Enter を押すとインストールされます。

基本的なコマンドは以下の通りです。

コマンド|動作
---|---
:NeoBundleInstall|プラグインの新規インストール
:NeoBundleUpdate|インストール済みのプラグインのアップデート
:NeoBundleClean|vimrcにないインストール済みのプラグインを掃除
:NeoBundleSource|プラグインの読み込み直し、後述の NeoBundleLasy と組み合わせたりする


# 構文
導入だけしたい人はここは必要ないので飛ばして

```vim
"    通常(user/repositoryはそれぞれgithubのユーザ,リポジトリを入力)
"    []で囲っているものは省略可
NeoBundle 'user/repository' [,version] [,option]
"遅延読み込み(stringは'hoge'といった文字列,listは['hoge','foo','bar']といった文字列の集合)
"    filetypesにはhtml,css,c,cpp,java,ruby,eruby,pythonといったものを入れる
"    commandsには各プラグインのコマンドを入れる
"    insertはインサートモードに入ったときに読み込まれる
"    mappngsはプラグインで定められているマッピングを呼び出したとき
"    autoload内でそのプラグインに見合っただけ入れとけばオーケー(補完プラグインならinsertのみなど)
NeoBundleLasy 'user/repository', {
  \ 'autoload' : {
  \   'filetypes' : string|list,
  \   'commands'  : string|list,
  \   'mappings'  : string|list,
  \   'insert'    : 1,
  \ }}
"フェッチ(ランタイムパスに追加されないらしい)
NeoBundleFetch 'user/repository'
"その他オプション
"   スクリプトの実施
  'build' : {'windows|mac|cygwin|unix|others' : string}
"   最小動作バージョンの記載(バージョンの書き方はいろいろある)
  'vim_version' : '7|7.3|7.3.885'
"   無効化(conditionが1と評価された際にプラグインを無効化する)
  'disabled : condition
```

# オススメのプラグイン
個人的におすすめのプラグインを大量紹介します

## unite.vim
他のプラグインからも使われている便利**ランチャー**
普段使いではファイラーとして機能しているが、奥に秘めたポテンシャルは無限大
下記の設定では`<C-u><C-f>`と`<C-u><C-u>`に特にお世話になっている
ファイルの一覧では`<C-n>`は下方向、`<C-p>`は上方向に移動する。(この操作方法のプラグインが結構ある)
また上端の > に文字列を入力することによって絞り込み検索を行い、Enterでファイルを開くのが基本の使い方
なお、Escを２回押すことで unite で開いたバッファを閉じるように設定している(楽)
※`<C- >`はCtrl+いずれかのキー

```vim:.vimrc
NeoBundle 'Shougo/unite.vim'
" unite {{{
let g:unite_enable_start_insert=1
nmap <silent> <C-u><C-b> :<C-u>Unite buffer<CR>
nmap <silent> <C-u><C-f> :<C-u>UniteWithBufferDir -buffer-name=files file<CR>
nmap <silent> <C-u><C-r> :<C-u>Unite -buffer-name=register register<CR>
nmap <silent> <C-u><C-m> :<C-u>Unite file_mru<CR>
nmap <silent> <C-u><C-u> :<C-u>Unite buffer file_mru<CR>
nmap <silent> <C-u><C-a> :<C-u>UniteWithBufferDir -buffer-name=files buffer file_mru bookmark file<CR>
au FileType unite nmap <silent> <buffer> <expr> <C-j> unite#do_action('split')
au FileType unite imap <silent> <buffer> <expr> <C-j> unite#do_action('split')
au FileType unite nmap <silent> <buffer> <expr> <C-l> unite#do_action('vsplit')
au FileType unite imap <silent> <buffer> <expr> <C-l> unite#do_action('vsplit')
au FileType unite nmap <silent> <buffer> <ESC><ESC> q
au FileType unite imap <silent> <buffer> <ESC><ESC> <ESC>q
" }}}
```

## neomru.vim
unite.vim から独立した機能
ファイル履歴を記録してくれている
こいつがいれば上記unite.vimにより`<C-u><C-u>`で以前開いたファイルが表示される

```vim:.vimrc
NeoBundle 'Shougo/neomru.vim', {
  \ 'depends' : 'Shougo/unite.vim'
  \ }
```

## vimproc
vim に**非同期処理**を提供してくれる縁の下の力持ち
多数のプラグインがこいつを頼りに高速化している。

```vim:.vimrc
NeoBundle 'Shougo/vimproc', {
  \ 'build' : {
  \     'windows' : 'make -f make_mingw32.mak',
  \     'cygwin' : 'make -f make_cygwin.mak',
  \     'mac' : 'make -f make_mac.mak',
  \     'unix' : 'make -f make_unix.mak',
  \    },
  \ }
```

## neocomplete.vim
クソ強力な**補完機能**を使えるようになる
vimproc で高速化するやつ...というか作者が一緒
これも`<C-n>`,`<C-p>`で補完候補から選択する

```vim:.vimrc
if has('lua')
  NeoBundleLazy 'Shougo/neocomplete.vim', {
    \ 'depends' : 'Shougo/vimproc',
    \ 'autoload' : { 'insert' : 1,}
    \ }
endif

" neocomplete {{{
let g:neocomplete#enable_at_startup               = 1
let g:neocomplete#auto_completion_start_length    = 3
let g:neocomplete#enable_ignore_case              = 1
let g:neocomplete#enable_smart_case               = 1
let g:neocomplete#enable_camel_case               = 1
let g:neocomplete#use_vimproc                     = 1
let g:neocomplete#sources#buffer#cache_limit_size = 1000000
let g:neocomplete#sources#tags#cache_limit_size   = 30000000
let g:neocomplete#enable_fuzzy_completion         = 1
let g:neocomplete#lock_buffer_name_pattern        = '\*ku\*'
" }}}
```

## vimshell
vim から**シェル**を簡単に使えるようになる便利屋
画面分割してシェルを使える VimShellPop がオススメ。
縮めて vp にマッピングしている。

```vim:.vimrc
NeoBundleLazy 'Shougo/vimshell', {
  \ 'depends' : 'Shougo/vimproc',
  \ 'autoload' : {
  \   'commands' : [{ 'name' : 'VimShell', 'complete' : 'customlist,vimshell#complete'},
  \                 'VimShellExecute', 'VimShellInteractive',
  \                 'VimShellTerminal', 'VimShellPop'],
  \   'mappings' : ['<Plug>(vimshell_switch)']
  \ }}

" vimshell {{{
nmap <silent> vs :<C-u>VimShell<CR>
nmap <silent> vp :<C-u>VimShellPop<CR>
" }}}
```

## yankround
ヤンク履歴を保持してくれるやつ
ペースト後に`<C-p>`か`<C-n>`を押してヤンク履歴をペーストできる
いわゆる**コピペ拡張**
unite.vim と連携することで、(この設定では)`\<C-p>`で履歴一覧から絞り込み検索が可能

```vim:.vimrc
NeoBundle 'LeafCage/yankround.vim'

" yankround.vim {{{
nmap p <Plug>(yankround-p)
nmap P <Plug>(yankround-P)
nmap <C-p> <Plug>(yankround-prev)
nmap <C-n> <Plug>(yankround-next)
let g:yankround_max_history = 100
nnoremap <Leader><C-p> :<C-u>Unite yankround<CR>
"}}}
```

## vimfiler
**ファイルビューア**
`<C-u><C-j>`で縦分割で開閉できるように設定してみた

```vim:.vimrc
NeoBundleLazy 'Shougo/vimfiler', {
  \ 'depends' : ["Shougo/unite.vim"],
  \ 'autoload' : {
  \   'commands' : [ "VimFilerTab", "VimFiler", "VimFilerExplorer", "VimFilerBufferDir" ],
  \   'mappings' : ['<Plug>(vimfiler_switch)'],
  \   'explorer' : 1,
  \ }}


" vimfiler {{{
let g:vimfiler_as_default_explorer  = 1
let g:vimfiler_safe_mode_by_default = 0
let g:vimfiler_data_directory       = expand('~/.vim/etc/vimfiler')
nnoremap <silent><C-u><C-j> :<C-u>VimFilerBufferDir -split -simple -winwidth=35 -no-quit -toggle<CR>
" }}}
```

## vim-autoclose
括弧を自動的に閉じてくれるやつ
なお閉じ括弧は入力しても２重にならない素敵仕様

```vim:.vimrc
NeoBundle 'Townk/vim-autoclose'
```

## vim-endwise:.vimrc
ifとかの終了宣言を自動で挿入してくれるやつ
デフォルト設定で十分使える

```vim:.vimrc
NeoBundleLazy 'tpope/vim-endwise', {
  \ 'autoload' : { 'insert' : 1,}}
```

## memolist.vim
メモを取る際に使う
mnで新規作成、mlでリスト化、mgでgrep検索が出来るようにマッピングしてみた
なおメモはGoogleDriveにてクラウド管理するようにしている
g:memolist_pathでお好きなディレクトリへどうぞ

```vim:.vimrc
NeoBundle 'glidenote/memolist.vim'

" memolist {{{
let g:memolist_path = expand('~/GoogleDrive/memolist')
let g:memolist_gfixgrep = 1
let g:memolist_unite = 1
let g:memolist_unite_option = "-vertical -start-insert"
nnoremap mn  :MemoNew<CR>
nnoremap ml  :MemoList<CR>
nnoremap mg  :MemoGrep<CR>
" }}}
```

## vim-easymotion
**超高速で簡単な移動**がコンセプト
s[key][key][done]の４キーで画面内のどこへでも移動可能
移動したいところを決めてから使う最強のカーソル移動プラグイン
詳しくは[過去記事](http://qiita.com/himinato/items/5fcdb3ad2885f0bc1ce6)を参照してください

```vim:.vimrc
NeoBundle 'Lokaltog/vim-easymotion'
" vim-easymotion {{{
let g:EasyMotion_do_mapping = 0
nmap s <Plug>(easymotion-s2)
xmap s <Plug>(easymotion-s2)
omap z <Plug>(easymotion-s2)
nmap g/ <Plug>(easymotion-sn)
xmap g/ <Plug>(easymotion-sn)
omap g/ <Plug>(easymotion-tn)
let g:EasyMotion_smartcase = 1
map <Leader>j <Plug>(easymotion-j)
map <Leader>k <Plug>(easymotion-k)
let g:EasyMotion_startofline = 0
let g:EasyMotion_keys = 'QZASDFGHJKL;'
let g:EasyMotion_use_upper = 1
let g:EasyMotion_enter_jump_first = 1
" }}}
```

## vim-easy-align
**文章整形**プラグイン
以下のような文章も即すっきり
ビジュアルモードで選択して、Enter -> 整列したい文字
ちなみに整形したい文字列が複数個ある下記のような場合は Enter -> * -> 整列したい文字(下記例では:)

```vim
"整形前
let g:jellybeans_overrides = {
  \ 'Todo': { 'guifg': '151515', 'guibg': 'd0d033', 'ctermfg': 'Black', 'ctermbg': 'Yellow' },
  \ 'SignColumn': { 'guifg': 'f0f0f0', 'guibg': '333333', 'ctermfg': 'Black', 'ctermbg': 'Gray' },
  \ 'SpecialKey': { 'guifg': 'a0a000','guibg': '2c2c2c', 'ctermfg': 'Black', 'ctermbg': 'Gray' },
  \ }

"整形後
let g:jellybeans_overrides = {
  \ 'Todo':       { 'guifg': '151515', 'guibg': 'd0d033', 'ctermfg': 'Black', 'ctermbg': 'Yellow' },
  \ 'SignColumn': { 'guifg': 'f0f0f0', 'guibg': '333333', 'ctermfg': 'Black', 'ctermbg': 'Gray' },
  \ 'SpecialKey': { 'guifg': 'a0a000','guibg':  '2c2c2c', 'ctermfg': 'Black', 'ctermbg': 'Gray' },
  \ }
```

```vim:.vimrc
NeoBundleLazy 'junegunn/vim-easy-align', {
  \ 'autoload': {
  \   'commands' : ['EasyAlign'],
  \   'mappings' : ['<Plug>(EasyAlign)'],
  \ }}

" vim-easy-align {{{
vmap <Enter> <Plug>(EasyAlign)
nmap <Leader>a <Plug>(EasyAlign)
" }}}
```

## vim-markdown
vimのデフォルトシンタックスでは不満がある人向け

```vim:.vimrc
NeoBundle 'rcmdnk/vim-markdown'
" vim-markdown {{{
let g:vim_markdown_folding_disabled = 1
" }}}
```

# 以降は個人的な推奨プラグイン

## neosnippet, neosnippet-snippets
スニペット補完をおこなえるようになる
if`<C-k>`などは多くの言語で動作するだろう

```vim
"#:conditionで入力状態となり、<C-k>で数字順に数字:ターゲットへジャンプ(下記はvimでの実行例)
if #:condition
  <`0:TARGET`>
endif
```

```vim:.vimrc
NeoBundleLazy 'Shougo/neosnippet', {
  \ 'depends' : 'Shougo/neosnippet-snippets',
  \ 'autoload' : {
  \   'insert' : 1,
  \   'filetypes' : 'snippet',
  \ }}
NeoBundle 'Shougo/neosnippet-snippets'

let g:neosnippet#data_directory     = expand('~/.vim/etc/.cache/neosnippet')
let g:neosnippet#snippets_directory = [expand('~/.vim/.bundle/neosnippet-snippets/neosnippets'),expand('~/dotfiles/snippets')]
" neosnippet {{{
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
" }}}
```

## switch.vim
true/falseとかを瞬時に切り替えてくれる
+と-で切り替えられるようにしている
設定すれば独自でトグルを設定できるが、私は使っていない

```vim:.vimrc
NeoBundle 'AndrewRadev/switch.vim'

" switch {{{
nmap + :Switch<CR>
nmap - :Switch<CR>
" }}}
```

## vim-surround, matchit
テキストを囲みや括弧のカーソル移動機能を拡張する
いろいろと機能豊富

```vim:.vimrc
NeoBundle 'tpope/vim-surround'
NeoBundle 'vim-scripts/matchit.zip'
```

## open-browser.vim, dash.vim
カーソルの下にある単語をgxで調べてくれるopen-browser
カーソルの下にあるプログラムの単語を`<Leader>d`(Leaderはデフォルトだと`\`)でDashで調べてくれるdash.vim
[Dash for Mac - Documentation Browser, Snippet Manager - Kapeli](http://kapeli.com/dash)
からダウンロードしてください(Homebrewでもダウンロード可)

```vim
:.vimrc
NeoBundle 'tyru/open-browser.vim'

" open-browser {{{
let g:netrw_nogx = 1 " disable netrw's gx mapping.
nmap gx <Plug>(openbrowser-smart-search)
" }}}

NeoBundle 'rizzatti/dash.vim'

" dash.vim {{{
nmap <Leader>d <Plug>DashSearch
" }}}
```

# プログラム言語に関係するプラグインたち

## vim-quickrun
実行する言語で自動化の環境が整っている場合あまり出番がない
でもプログラムの編集状態から実行できて、出力を得られる
`\r`で編集中のファイルを実行する

```vim:.vimrc
NeoBundleLazy 'thinca/vim-quickrun', {
  \ 'autoload' : {
  \   'mappings' : [['n', '\r']],
  \   'commands' : ['QuickRun']
  \ }}

" quickrun {{{
let g:quickrun_config = {}
let g:quickrun_config._ = { 'runner' : 'vimproc',
  \ 'runner/vimproc/updatetime' : 200,
  \ 'outputter/buffer/split' : ':botright 8sp',
  \ 'outputter' : 'multi:buffer:quickfix',
  \ 'hook/close_buffer/enable_empty_data' : 1,
  \ 'hook/close_buffer/enable_failure' : 1,
  \ }
nnoremap <expr><silent> <C-c> quickrun#is_running() ? quickrun#sweep_sessions() : "\<C-c>"
" }}}
```

## emmet-vim
HTMLのタグを一瞬で入力できる。
`<C-y>n`で次のタグ入力箇所に移動できたりフロントエンドの味方
利用している技術はこれだと思う[emmet](http://docs.emmet.io/)

```html
    div.container>div.col-sm-6.col-md-4>ul*3>ui*4
    <!-- 入力後にインサートモードのまま<C-y>,で↓の状態に -->
    <div class="container">
      <div class="col-sm-6 col-md-4">
        <ul>
          <ui></ui>
          <ui></ui>
          <ui></ui>
          <ui></ui>
        </ul>
        <ul>
          <ui></ui>
          <ui></ui>
          <ui></ui>
          <ui></ui>
        </ul>
        <ul>
          <ui></ui>
          <ui></ui>
          <ui></ui>
          <ui></ui>
        </ul>
      </div>
    </div>
```

```vim:.vimrc
NeoBundleLazy 'mattn/emmet-vim', {
  \ 'autoload' : {
  \   'filetypes' : ['html', 'html5', 'eruby', 'jsp', 'xml', 'css', 'scss', 'coffee'],
  \   'commands' : ['<Plug>ZenCodingExpandNormal']
  \ }}
" emmet {{{
let g:use_emmet_complete_tag = 1
let g:user_emmet_settings = {
  \ 'lang' : 'ja',
  \ 'html' : {
  \   'indentation' : '  '
  \ }}
" }}}
```

## その他
いっぱいあるのでプラグインの設定だけにして、説明は省きます

```vim:.vimrc
" Ruby on rails
NeoBundle 'tpope/vim-rails'

NeoBundleLazy 'alpaca-tc/alpaca_tags', {
  \ 'depends': ['Shougo/vimproc', 'Shougo/unite.vim'],
  \ 'autoload' : {
  \   'commands' : ['Tags', 'TagsUpdate', 'TagsSet', 'TagsBundle', 'TagsCleanCache'],
  \   'unite_sources' : ['tags']
  \ }}
" alpaca_tags {{{
let g:alpaca_update_tags_config = {
  \ '_' : '-R --sort=yes --languages=-js,html,css',
  \ 'ruby': '--languages=+Ruby',
  \ }
" }}}

NeoBundleLazy 'vim-ruby/vim-ruby', {
  \ 'autoload' : {'filetypes' : ['ruby', 'eruby']}}

" Python
NeoBundleLazy "davidhalter/jedi-vim", {
  \ "autoload": {
  \   "filetypes": ["python", "python3", "djangohtml"],
  \ },
  \ "build" : {
  \   "mac"  : "pip install jedi",
  \   "unix" : "pip install jedi",
  \ }}
" jedi-vim {{{
let g:jedi#rename_command = '<Leader>R'
let g:jedi#goto_assignments_command = '<Leader>G'
autocmd FileType python setlocal omnifunc=jedi#completions
let g:jedi#completions_enabled = 0
let g:jedi#auto_vim_configuration = 0
" }}}

" html

NeoBundle 'hail2u/vim-css3-syntax'
NeoBundle 'othree/html5.vim'

" javascript
NeoBundle 'kchmck/vim-coffee-script'
NeoBundle 'moll/vim-node'
NeoBundle 'pangloss/vim-javascript'
```

# 最後に
今回は酔っぱらいながら書いているので誤字、脱字、間違いの指摘大歓迎です。
以前の投稿からだいぶ間隔が空きました。
北の大地から東京に出てきて仕事をして、AWSに関することを多く学んだのでいずれそれを記事にする予定です。
vimの記事については未定