Edited at

【詳解】モテたいVimmer必見 快適にコーディングするためのvimrc解説

More than 1 year has passed since last update.


やること


  • vimrcの基本設定


    • 文字コード

    • タブ・インデント

    • 文字列検索

    • カーソル

    • カッコ・タグジャンプ

    • コマンド補完



  • 特殊な設定


    • マウスの有効化

    • ペースト設定



  • Vimプラグイン


    • NeoBundle(Vimプラグインの管理)

    • molokai(カラースキーム)

    • lightline.vim(ステータスラインの表示内容強化)

    • vim-trailing-whitespace(全角と半角の空白文字を可視化)

    • indentLine(インデントの可視化)

    • neocomplete・neosnippet・neosnippet-snippets(コードの自動補完)

    • CtrlP(多機能セレクタ)

    • Syntastic(構文エラーチェック)




対象となる読者


  • 素のVimを使っていて、もっと快適にコードを書きたい人

  • どこかのvimrcをコピペしてきて理解しないまま使い続けてる人

  • Node.jsやJavascriptでコードを書いてる人

  • モテたい人


動作環境

環境
バージョン

CentOS
7.1

iTerm2
3.0.10

Vim
7.4

※ 最近Vimが8.0にバージョンアップされました。Vim8.0でも動作確認は出来ているので、最新のVim8.0を使っても大丈夫です。


vimrcとは

Q. そもそもvimrcとは何か?

A. vimの設定情報が書かれたファイルの事です。正式には「.vimrc」という名前で先頭にドットが付きます。

このvimrcファイルに色んな設定を記述することでVimが便利なものになっていきます。


設定方法

ユーザーのホームディレクトリ以下に.vimrcファイルを置きます。

そうすることで、Vimを起動した時に自動的に.vimrcファイルを読み込んでくれるようになります。


zsh

% touch ~/.vimrc



最初の設定

先ほど作成した空の.vimrcファイルは、今のままだと何も書かれていないので素のVimと同じ状態です。

まずはvimrcファイルの先頭に以下の設定を書きましょう。


.vimrc

set encoding=utf-8

scriptencoding utf-8

1行目の「set encoding=utf-8」はファイル読み込み時の文字コードの設定

2行目の「scriptencoding utf-8」はVim script内でマルチバイト文字を使う場合の設定

※ Vim scriptにはvimrcファイルも含まれているので、日本語でコメントを書く場合は先頭にこの設定が必要になります。

この書き方については、こちらのページを参考にさせて頂きました。

vimrcアンチパターン


文字コード

ここからは日本語のコメントをvimrcの中に書いていきます。

分かりづらい設定に関してはアニメーションGifで説明します。


.vimrc

set fileencoding=utf-8 " 保存時の文字コード

set fileencodings=ucs-boms,utf-8,euc-jp,cp932 " 読み込み時の文字コードの自動判別. 左側が優先される
set fileformats=unix,dos,mac " 改行コードの自動判別. 左側が優先される
set ambiwidth=double " □や○文字が崩れる問題を解決

set ambiwidth=doubleについて

以下を見れば分かると思いますが、□や◯文字が崩れているのが分かります。



↑設定前

↓設定後

※ iTerm2を使ってる場合は以下のように設定から「Treat ambiguous-width characters as double width」にチェックする必要がある


タブ・インデント


.vimrc

set expandtab " タブ入力を複数の空白入力に置き換える

set tabstop=4 " 画面上でタブ文字が占める幅
set softtabstop=4 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent " 改行時に前の行のインデントを継続する
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set shiftwidth=4 " smartindentで増減する幅

こちらを参考にさせて頂きました。

Vim のカスタマイズ 〜 タブ/インデントの設定 〜


文字列検索


.vimrc

set incsearch " インクリメンタルサーチ. 1文字入力毎に検索を行う

set ignorecase " 検索パターンに大文字小文字を区別しない
set smartcase " 検索パターンに大文字を含んでいたら大文字小文字を区別する
set hlsearch " 検索結果をハイライト

" ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>


検索ハイライトについて

検索した文字列がハイライトします。ESCキー2回でハイライト表示の切り替えが出来ます。


カーソル


.vimrc

set whichwrap=b,s,h,l,<,>,[,],~ " カーソルの左右移動で行末から次の行の行頭への移動が可能になる

set number " 行番号を表示
set cursorline " カーソルラインをハイライト

" 行が折り返し表示されていた場合、行単位ではなく表示行単位でカーソルを移動する
nnoremap j gj
nnoremap k gk
nnoremap <down> gj
nnoremap <up> gk

" バックスペースキーの有効化
set backspace=indent,eol,start


カーソルラインについて

カーソルのある行がハイライトされる



※ マシンスペックが低かったりすると描画に時間が掛かりカーソル移動が遅くなる事があります。

その場合は無理して使う必要は無いので設定をオフにしてください。


カッコ・タグジャンプ


.vimrc

set showmatch " 括弧の対応関係を一瞬表示する

source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する

Vimの「%」拡張について

ノーマルモード時に「%」で対応するカッコにジャンプ出来ます。

「source $VIMRUNTIME/macros/matchit.vim」の設定は、Vimに同梱されているmatchitプラグインを有効化することで

HTMLタグやRubyのdef...endなども%で対応するタグにジャンプすることが出来るようになります。


コマンド補完


.vimrc

set wildmenu " コマンドモードの補完

set history=5000 " 保存するコマンド履歴の数

set wildmenuについて

コマンドの補完を視覚的に分かりやすく表示してくれます。タブキーで次の選択候補に移れます。


マウスの有効化

以下の設定をすることで、マウスでカーソル移動やスクロール移動が出来るようになります。


.vimrc

if has('mouse')

set mouse=a
if has('mouse_sgr')
set ttymouse=sgr
elseif v:version > 703 || v:version is 703 && has('patch632')
set ttymouse=sgr
else
set ttymouse=xterm2
endif
endif


ペースト設定

クリップボードから普通にペーストすると自動インデントが効いて下に行くほど右にずれていきますが、

以下の設定をすることで、クリップボードからペーストする時だけインデントしないようにしてくれます。


.vimrc

if &term =~ "xterm"

let &t_SI .= "\e[?2004h"
let &t_EI .= "\e[?2004l"
let &pastetoggle = "\e[201~"

function XTermPasteBegin(ret)
set paste
return a:ret
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif




↑設定前

↓設定後


Vimプラグイン

Vimプラグインとは、Vimを便利にするための拡張機能の事です。

このVimプラグインを導入することでコードの自動補完が出来たり、見た目をかっこよくしたりなど、便利な機能を提供してくれます。

Vimプラグインは自分で自作することもできますが、既に便利なVimプラグインが世の中にたくさんあるので、

ここでは特に便利だと思ったものについて紹介しようと思います。


はじめに

Vimプラグインの導入方法ですが、vimrcの基本設定と同じく「.vimrc」ファイルに記述するだけです。

Vimプラグインの導入には「NeoBundle」という、Vimプラグインを管理するためのVimプラグインを使う方法がシンプルで簡単です。


NeoBundle(Vimプラグインの管理)

以下がNeoBundleの設定になります。細かい部分は①・②・③で見ていきます。


.vimrc

if has('vim_starting')

" 初回起動時のみruntimepathにNeoBundleのパスを指定する
set runtimepath+=~/.vim/bundle/neobundle.vim/

" NeoBundleが未インストールであればgit cloneする・・・・・・①
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
endif

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

" インストールするVimプラグインを以下に記述
" NeoBundle自身を管理
NeoBundleFetch 'Shougo/neobundle.vim'
"----------------------------------------------------------
" ここに追加したいVimプラグインを記述する・・・・・・②

"----------------------------------------------------------
call neobundle#end()

" ファイルタイプ別のVimプラグイン/インデントを有効にする
filetype plugin indent on

" 未インストールのVimプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定・・・・・・③
NeoBundleCheck


① NeoBundleが未インストールであればgit cloneする

NeoBundleの設定をvimrcに記述しただけではまだNeoBundleは未インストール状態です。

記述したvimrcを保存後にもう一度vimを起ち上げるとNeoBundleのインストールが開始します。

② ここに追加したいVimプラグインを記述する

NeoBundleのインストールが①で完了しているので、追加したいVimプラグインを記述していきます。

下の例ではmolokailightline.vimというVimプラグインを追加してます。この2つのVimプラグインは後で説明します。

Vimプラグインを追加する場合は、ここにどんどん記述していってください。


.vimrc

" インストールするVimプラグインを以下に記述

" NeoBundle自身を管理
NeoBundleFetch 'Shougo/neobundle.vim'
"----------------------------------------------------------
" ここに追加したいVimプラグインを記述する・・・・・・②

" カラースキームmolokai
NeoBundle 'tomasr/molokai'
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'

"----------------------------------------------------------
call neobundle#end()


③ 未インストールのVimプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定

②で追加したいVimプラグインを記述しましたが、この状態ではまだインストールされていない状態です。

①と同じくvimrcを保存後にもう一度vimを立ち上げると記述したVimプラグインをインストールするか訊ねてくれます。

キーボードから「y」とタイピングするとインストールが開始されます。

※Vimプラグインをたくさん記述すると、初回のインストール完了までに少し時間が掛かります。

その場合はdein.vimを入れると改善されると思います。→NeoBundle から dein.vim に乗り換えたら爆速だった話


molokai(カラースキーム)

カラースキームのmolokaiを追加するだけでエディタの配色がカラフルになり、コーディングのモチベーションが上がります。



※ Vimプラグインにはインストールするだけで有効になるものもありますが、少し設定を書かないといけないものもあります。

molokaiでは以下の設定をvimrcに記述してください。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" カラースキームmolokai
NeoBundle 'tomasr/molokai'

"----------------------------------------------------------
" molokaiの設定
"----------------------------------------------------------
if neobundle#is_installed('molokai') " molokaiがインストールされていれば
colorscheme molokai " カラースキームにmolokaiを設定する
endif

set t_Co=256 " iTerm2など既に256色環境なら無くても良い
syntax enable " 構文に色を付ける


set t_Co=256について

iTerm2を使ってるユーザーはこの設定は不要ですが、あっても問題無いので残しときます。

その代わりiTerm2の設定で256色に設定する必要があります。

※ 以下のように設定から「xterm-256color」を選択する。



※ molokai以外にもいろんなカラースキームがあります。自分に合ったお好みの配色を探してみてください

Vim Colorscheme Gallery


lightline.vim(ステータスラインの表示内容強化)

lightline.vimはVimのステータスラインをかっこよくしてくれたり、編集してるファイルの詳細情報を表示してくれたりします。

lightline.vimはインストールするだけで使えますが、カスタマイズすると編集しているファイルのファイルパスを表示したり、Gitのブランチ名表示できたりします。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'

"----------------------------------------------------------
" ステータスラインの設定
"----------------------------------------------------------
set laststatus=2 " ステータスラインを常に表示
set showmode " 現在のモードを表示
set showcmd " 打ったコマンドをステータスラインの下に表示
set ruler " ステータスラインの右側にカーソルの現在位置を表示する


※ ステータスラインを強化する前に、ステータスラインを有効にする必要があるので、上記でその設定を行ってます。(lightline.vimの設定はデフォルトのままです)


vim-trailing-whitespace(全角と半角の空白文字を可視化)

vim-trailing-whitespaceはファイル中の行末尾にある半角空白と全角空白を赤くハイライトし可視化してくれます。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" 末尾の全角と半角の空白文字を赤くハイライト
NeoBundle 'bronson/vim-trailing-whitespace'

コード上ではこれらの空白文字は不要な場合が多いので、赤くハイライトされていたら削除するようにしましょう。

またコマンドモードから以下のコマンドを実行する空白文字を一気に削除してくれます。


command

:FixWhitespace



indentLine(インデントの可視化)

indentLineはファイル上のインデントを以下のように可視化してくれます。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" インデントの可視化
NeoBundle 'Yggdroot/indentLine'


neocomplete・neosnippet・neosnippet-snippets(コードの自動補完)

neocompleteはコードの自動補完を行うVimプラグインです。入力中のコードから推測して候補を出してくれます。

うろ覚えだった関数名や長い変数名を入力する必要は無く、途中まで入力したら補完候補から選択するだけです。

コーディングの速度が劇的に上がるので入れといて損は無いVimプラグインです。

またneocompleteはneosnippetと合わせるとさらに補完が強力になります。

neosnippetとは、スニペット補完の機能を提供してくれるVimプラグインです。

neosnippetプラグインだけだと自分でスニペットを自作しないといけませんが、neosnippet-snippetsを入れる事で便利なスニペットがたくさん使えるようになります。

以下はneocomplete・neosnippet・neosnippet-snippetsの設定になります。細かい部分は①・②・③で見ていきます。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
if has('lua') " lua機能が有効になっている場合・・・・・・①
" コードの自動補完
NeoBundle 'Shougo/neocomplete.vim'
" スニペットの補完機能
NeoBundle "Shougo/neosnippet"
" スニペット集
NeoBundle 'Shougo/neosnippet-snippets'
endif

"----------------------------------------------------------
" neocomplete・neosnippetの設定
"----------------------------------------------------------
if neobundle#is_installed('neocomplete.vim')
" Vim起動時にneocompleteを有効にする
let g:neocomplete#enable_at_startup = 1
" smartcase有効化. 大文字が入力されるまで大文字小文字の区別を無視する
let g:neocomplete#enable_smart_case = 1
" 3文字以上の単語に対して補完を有効にする
let g:neocomplete#min_keyword_length = 3
" 区切り文字まで補完する
let g:neocomplete#enable_auto_delimiter = 1
" 1文字目の入力から補完のポップアップを表示
let g:neocomplete#auto_completion_start_length = 1
" バックスペースで補完のポップアップを閉じる
inoremap <expr><BS> neocomplete#smart_close_popup()."<C-h>"

" エンターキーで補完候補の確定. スニペットの展開もエンターキーで確定・・・・・・②
imap <expr><CR> neosnippet#expandable() ? "<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "<C-y>" : "<CR>"
" タブキーで補完候補の選択. スニペット内のジャンプもタブキーでジャンプ・・・・・・③
imap <expr><TAB> pumvisible() ? "<C-n>" : neosnippet#jumpable() ? "<Plug>(neosnippet_expand_or_jump)" : "<TAB>"
endif


① lua機能が有効になっている場合

neocompleteプラグインはVimのlua機能によって動作しています。

lua機能が有効になっていないと使えないVimプラグインになります。

※ luaについての説明はここでは割愛させていただきます

lua機能が有効になってるか確認する方法

以下のコマンドを打ち「+lua」か「+lua/dyn」となっていれば有効になっています。「-lua」と表示されていたら無効です。


zsh

% vim --version | grep lua

+lua

luaの有効化

以下の手順でlua機能が有効化されているVimをビルドしましょう。


zsh

% sudo yum install ncurses-devel lua lua-devel

% git clone https://github.com/vim/vim.git
% cd vim/
% ./configure --with-features=huge --enable-multibyte --enable-luainterp=dynamic --enable-gpm --enable-cscope --enable-fontset
% make
% sudo make install

※ lua機能が有効化されたVimをビルド出来ない環境にある人は「neocomplete」の前身である「neocomplcache」を使えば似たような機能を使えます。

Vimプラグイン作成者が同じ人なので、以下の対応表を見てneocomplcache用の設定に書き換えてください。


neocompleteとneocomplcacheの設定対応表

※ neocomplcacheに設定を変更したら以下の設定も不要になります。もしくはlua機能が無い場合で出し分けてもいいと思います。


.vimrc

if has('lua')


②エンターキーで補完候補の確定. スニペットの展開もエンターキーで確定

③タブキーで補完候補の選択. スニペット内のジャンプもタブキーでジャンプ

※ デフォルトのキーマッピングが自分に合わなかったのでこうしてます。


CtrlP(多機能セレクタ)

CtrlPはいわゆる多機能セレクタというやつで、ファイルの検索やバッファの検索などの機能を提供します。

以下のようにアクセスしたいファイルを絞り込んで検索してくれます。

※ 以下の設定では、CtrlPが提供しているファイル検索のみを使用し、CtrlPの拡張プラグインとして関数検索とコマンド履歴検索を使用しています。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" 多機能セレクタ
NeoBundle 'ctrlpvim/ctrlp.vim'
" CtrlPの拡張プラグイン. 関数検索
NeoBundle 'tacahiroy/ctrlp-funky'
" CtrlPの拡張プラグイン. コマンド履歴検索
NeoBundle 'suy/vim-ctrlp-commandline'

"----------------------------------------------------------
" CtrlPの設定
"----------------------------------------------------------
let g:ctrlp_match_window = 'order:ttb,min:20,max:20,results:100' " マッチウインドウの設定. 「下部に表示, 大きさ20行で固定, 検索結果100件」
let g:ctrlp_show_hidden = 1 " .(ドット)から始まるファイルも検索対象にする
let g:ctrlp_types = ['fil'] "ファイル検索のみ使用
let g:ctrlp_extensions = ['funky', 'commandline'] " CtrlPの拡張として「funky」と「commandline」を使用

" CtrlPCommandLineの有効化
command! CtrlPCommandLine call ctrlp#init(ctrlp#commandline#id())

" CtrlPFunkyの有効化
let g:ctrlp_funky_matchtype = 'path'


使い方

操作
操作方法

CtrlPの起動
Ctrl+P

検索モードの切り替え
Ctrl+F

下方向のカーソル移動
Ctrl+J

上方向のカーソル移動
Ctrl+K

検索結果の選択(バッファ)
Enter

検索結果の選択(水平分割)
Ctrl+X

CtrlPの終了
Esc

ctrlp-funky(関数検索)

編集中のファイル内にある関数を検索出来ます。関数一覧の表示としても便利です。

vim-ctrlp-commandline(コマンド履歴検索)

通常のコマンドの補完(wildmenu)とは違い、過去に実行したコマンドを補完してくれます。

agで検索の高速化

ファイル検索ですが、ファイル数が多くなるとCtrlPの起ち上げにかなり時間がかかります。

CtrlPが作成するキャッシュを利用する方法もありますが、Gitのブランチ名を変えた場合にいちいちキャッシュをクリアしないといけないので面倒臭いです。

以下ではagコマンドをCtrlPの検索に使用することで、起ち上げが爆速になり、キャッシュもクリアする必要が無くなります。

agのインストール


zsh

% sudo yum -y groupinstall "Development Tools"

% sudo yum -y install pcre-devel xz-devel
% git clone https://github.com/ggreer/the_silver_searcher.git
% cd the_silver_searcher
% ./build.sh
% sudo make install

vimrcの設定は以下のようになります。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" CtrlPの検索にagを使う
NeoBundle 'rking/ag.vim'

"----------------------------------------------------------
" ag.vimの設定
"----------------------------------------------------------
if executable('ag') " agが使える環境の場合
let g:ctrlp_use_caching=0 " CtrlPのキャッシュを使わない
let g:ctrlp_user_command='ag %s -i --hidden -g ""' " 「ag」の検索設定
endif



Syntastic(構文エラーチェック)

Syntasticは構文エラーやコーディング規約のチェックをvim上で行ってくれます。



JavascriptだとESLint、RubyだとRubocopなどの構文チェッカーがありますが、ここではESLintを例に説明します。


.virmc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" 構文エラーチェック
NeoBundle 'scrooloose/syntastic'

"----------------------------------------------------------
" Syntasticの設定
"----------------------------------------------------------
" 構文エラー行に「>>」を表示
let g:syntastic_enable_signs = 1
" 他のVimプラグインと競合するのを防ぐ
let g:syntastic_always_populate_loc_list = 1
" 構文エラーリストを非表示
let g:syntastic_auto_loc_list = 0
" ファイルを開いた時に構文エラーチェックを実行する
let g:syntastic_check_on_open = 1
" 「:wq」で終了する時も構文エラーチェックする
let g:syntastic_check_on_wq = 1

" Javascript用. 構文エラーチェックにESLintを使用
let g:syntastic_javascript_checkers=['eslint']
" Javascript以外は構文エラーチェックをしない
let g:syntastic_mode_map = { 'mode': 'passive',
\ 'active_filetypes': ['javascript'],
\ 'passive_filetypes': [] }


構文エラーが多くなってくると一覧表示して確認したくなると思います。

その場合は以下のコマンドを打つと一覧表示してくれます。


Command

:Errors


※ ファイルサイズが大きいとVimの起動時やファイル保存時に毎回構文エラーチェックが走って重くなります。

その場合はSyntasticの代わりにvim-watchdogsを入れると改善されると思います。→watchdogs.vim つくりました - C++でゲームプログラミング

プロジェクトESlintで構文エラーチェックする

ESLintはnpmでインストールすることになると思いますが、グローバルインストールしたESLint(以下グローバルESLintと呼ぶ)を使うのはオススメしません。

同じプロジェクト内で他のメンバーと作業をする場合、

プロジェクト内のpackage.jsonに記述されたESlint(以下プロジェクトESLintと呼ぶ)をローカルインストールして使うべきです。

グローバルESLintを使うとESLintのバージョンが各々で違う場合があり、

ある人はES2015がサポートされていて、ある人はES2015がサポートされていなかったりします。

SyntasticプラグインはグローバルESLintを使用し構文エラーチェックを行うので、

以下のVimプラグインを入れてプロジェクトESLintで構文エラーチェックするようにしましょう。


.vimrc

"----------------------------------------------------------

" インストール
"----------------------------------------------------------
" プロジェクトに入ってるESLintを読み込む
NeoBundle 'pmsorhaindo/syntastic-local-eslint.vim'


ここまでの設定まとめ


.vimrc

set encoding=utf-8

scriptencoding utf-8
" ↑1行目は読み込み時の文字コードの設定
" ↑2行目はVim Script内でマルチバイトを使う場合の設定
" Vim scritptにvimrcも含まれるので、日本語でコメントを書く場合は先頭にこの設定が必要になる

"----------------------------------------------------------
" NeoBundle
"----------------------------------------------------------
if has('vim_starting')
" 初回起動時のみruntimepathにNeoBundleのパスを指定する
set runtimepath+=~/.vim/bundle/neobundle.vim/

" NeoBundleが未インストールであればgit cloneする
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
endif

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

" インストールするVimプラグインを以下に記述
" NeoBundle自身を管理
NeoBundleFetch 'Shougo/neobundle.vim'
" カラースキームmolokai
NeoBundle 'tomasr/molokai'
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'
" インデントの可視化
NeoBundle 'Yggdroot/indentLine'
" 末尾の全角半角空白文字を赤くハイライト
NeoBundle 'bronson/vim-trailing-whitespace'
" 構文エラーチェック
NeoBundle 'scrooloose/syntastic'
" 多機能セレクタ
NeoBundle 'ctrlpvim/ctrlp.vim'
" CtrlPの拡張プラグイン. 関数検索
NeoBundle 'tacahiroy/ctrlp-funky'
" CtrlPの拡張プラグイン. コマンド履歴検索
NeoBundle 'suy/vim-ctrlp-commandline'
" CtrlPの検索にagを使う
NeoBundle 'rking/ag.vim'
" プロジェクトに入ってるESLintを読み込む
NeoBundle 'pmsorhaindo/syntastic-local-eslint.vim'

" vimのlua機能が使える時だけ以下のVimプラグインをインストールする
if has('lua')
" コードの自動補完
NeoBundle 'Shougo/neocomplete.vim'
" スニペットの補完機能
NeoBundle "Shougo/neosnippet"
" スニペット集
NeoBundle 'Shougo/neosnippet-snippets'
endif

call neobundle#end()

" ファイルタイプ別のVimプラグイン/インデントを有効にする
filetype plugin indent on

" 未インストールのVimプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定
NeoBundleCheck

"----------------------------------------------------------
" カラースキーム
"----------------------------------------------------------
if neobundle#is_installed('molokai')
colorscheme molokai " カラースキームにmolokaiを設定する
endif

set t_Co=256 " iTerm2など既に256色環境なら無くても良い
syntax enable " 構文に色を付ける

"----------------------------------------------------------
" 文字
"----------------------------------------------------------
set fileencoding=utf-8 " 保存時の文字コード
set fileencodings=ucs-boms,utf-8,euc-jp,cp932 " 読み込み時の文字コードの自動判別. 左側が優先される
set fileformats=unix,dos,mac " 改行コードの自動判別. 左側が優先される
set ambiwidth=double " □や○文字が崩れる問題を解決

"----------------------------------------------------------
" ステータスライン
"----------------------------------------------------------
set laststatus=2 " ステータスラインを常に表示
set showmode " 現在のモードを表示
set showcmd " 打ったコマンドをステータスラインの下に表示
set ruler " ステータスラインの右側にカーソルの位置を表示する

"----------------------------------------------------------
" コマンドモード
"----------------------------------------------------------
set wildmenu " コマンドモードの補完
set history=5000 " 保存するコマンド履歴の数

"----------------------------------------------------------
" タブ・インデント
"----------------------------------------------------------
set expandtab " タブ入力を複数の空白入力に置き換える
set tabstop=4 " 画面上でタブ文字が占める幅
set softtabstop=4 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent " 改行時に前の行のインデントを継続する
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set shiftwidth=4 " smartindentで増減する幅

"----------------------------------------------------------
" 文字列検索
"----------------------------------------------------------
set incsearch " インクリメンタルサーチ. 1文字入力毎に検索を行う
set ignorecase " 検索パターンに大文字小文字を区別しない
set smartcase " 検索パターンに大文字を含んでいたら大文字小文字を区別する
set hlsearch " 検索結果をハイライト

" ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>

"----------------------------------------------------------
" カーソル
"----------------------------------------------------------
set whichwrap=b,s,h,l,<,>,[,],~ " カーソルの左右移動で行末から次の行の行頭への移動が可能になる
set number " 行番号を表示
set cursorline " カーソルラインをハイライト

" 行が折り返し表示されていた場合、行単位ではなく表示行単位でカーソルを移動する
nnoremap j gj
nnoremap k gk
nnoremap <down> gj
nnoremap <up> gk

" バックスペースキーの有効化
set backspace=indent,eol,start

"----------------------------------------------------------
" カッコ・タグの対応
"----------------------------------------------------------
set showmatch " 括弧の対応関係を一瞬表示する
source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する

"----------------------------------------------------------
" マウスでカーソル移動とスクロール
"----------------------------------------------------------
if has('mouse')
set mouse=a
if has('mouse_sgr')
set ttymouse=sgr
elseif v:version > 703 || v:version is 703 && has('patch632')
set ttymouse=sgr
else
set ttymouse=xterm2
endif
endif

"----------------------------------------------------------
" クリップボードからのペースト
"----------------------------------------------------------
" 挿入モードでクリップボードからペーストする時に自動でインデントさせないようにする
if &term =~ "xterm"
let &t_SI .= "\e[?2004h"
let &t_EI .= "\e[?2004l"
let &pastetoggle = "\e[201~"

function XTermPasteBegin(ret)
set paste
return a:ret
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif

"----------------------------------------------------------
" neocomplete・neosnippetの設定
"----------------------------------------------------------
if neobundle#is_installed('neocomplete.vim')
" Vim起動時にneocompleteを有効にする
let g:neocomplete#enable_at_startup = 1
" smartcase有効化. 大文字が入力されるまで大文字小文字の区別を無視する
let g:neocomplete#enable_smart_case = 1
" 3文字以上の単語に対して補完を有効にする
let g:neocomplete#min_keyword_length = 3
" 区切り文字まで補完する
let g:neocomplete#enable_auto_delimiter = 1
" 1文字目の入力から補完のポップアップを表示
let g:neocomplete#auto_completion_start_length = 1
" バックスペースで補完のポップアップを閉じる
inoremap <expr><BS> neocomplete#smart_close_popup()."<C-h>"

" エンターキーで補完候補の確定. スニペットの展開もエンターキーで確定
imap <expr><CR> neosnippet#expandable() ? "<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "<C-y>" : "<CR>"
" タブキーで補完候補の選択. スニペット内のジャンプもタブキーでジャンプ
imap <expr><TAB> pumvisible() ? "<C-n>" : neosnippet#jumpable() ? "<Plug>(neosnippet_expand_or_jump)" : "<TAB>"
endif

"----------------------------------------------------------
" Syntastic
"----------------------------------------------------------
" 構文エラー行に「>>」を表示
let g:syntastic_enable_signs = 1
" 他のVimプラグインと競合するのを防ぐ
let g:syntastic_always_populate_loc_list = 1
" 構文エラーリストを非表示
let g:syntastic_auto_loc_list = 0
" ファイルを開いた時に構文エラーチェックを実行する
let g:syntastic_check_on_open = 1
" 「:wq」で終了する時も構文エラーチェックする
let g:syntastic_check_on_wq = 1

" Javascript用. 構文エラーチェックにESLintを使用
let g:syntastic_javascript_checkers=['eslint']
" Javascript以外は構文エラーチェックをしない
let g:syntastic_mode_map = { 'mode': 'passive',
\ 'active_filetypes': ['javascript'],
\ 'passive_filetypes': [] }

"----------------------------------------------------------
" CtrlP
"----------------------------------------------------------
let g:ctrlp_match_window = 'order:ttb,min:20,max:20,results:100' " マッチウインドウの設定. 「下部に表示, 大きさ20行で固定, 検索結果100件」
let g:ctrlp_show_hidden = 1 " .(ドット)から始まるファイルも検索対象にする
let g:ctrlp_types = ['fil'] "ファイル検索のみ使用
let g:ctrlp_extensions = ['funky', 'commandline'] " CtrlPの拡張として「funky」と「commandline」を使用

" CtrlPCommandLineの有効化
command! CtrlPCommandLine call ctrlp#init(ctrlp#commandline#id())

" CtrlPFunkyの絞り込み検索設定
let g:ctrlp_funky_matchtype = 'path'

if executable('ag')
let g:ctrlp_use_caching=0 " CtrlPのキャッシュを使わない
let g:ctrlp_user_command='ag %s -i --hidden -g ""' " 「ag」の検索設定
endif