vimでPython書きたい人へ

# 対象者
vimを使ってPython書きたい/書いてる人と、カラースキームの編集について知りたい人
ぼくが使っている`.vimrc`と、Python用のシンタックススクリプト、最後にカラースキームをご紹介します。

何かの役に立ちましたらLGTM・ストック・コメントぜひよろしくお願いします！


# 更新情報
- 2020/12/13
    - f-stringのシンタックスハイライトを追加しました。[変更箇所へ](#f-stringに対応する)


# 目次
 - [vimrc](#vimrc)
    - [初めての方へ](#初めての方へ)
      - [基礎理解](#基礎理解)
      - [コマンド](#コマンド)
    - [最初の設定](#最初の設定)
    - [クリップボード経由のコピペ有効化](#クリップボード経由のコピペ有効化)
    - [プラグイン管理の`NeoBundle`](#プラグイン管理のneobundle)
       - [`NeoBundle`本体関係](#neobundle本体関係)
       - [カラースキーム](#カラースキーム)
       - [花文字](#花文字)
       - [カラースキームを調べる](#カラースキームを調べる)
       - [ステータスラインの表示内容強化](#ステータスラインの表示内容強化)
       - [インデント可視化](#インデント可視化)
       - [不要なスペースをハイライト](#不要なスペースをハイライト)
       - [構文エラーチェック](#構文エラーチェック)
       - [多機能セレクタ](#多機能セレクタ)
       - [コード補完](#コード補完)
       - [括弧補完](#括弧補完)
    - [カラースキームの有効化](#カラースキームの有効化)
    - [文字コードの設定](#文字コードの設定)
    - [ステータスラインの有効化](#ステータスラインの有効化)
    - [コマンドモードの設定](#コマンドモードの設定)
    - [タブやインデントの設定](#タブやインデントの設定)
    - [文字列検索](#文字列検索)
    - [カーソル移動など](#カーソル移動など)
    - [括弧やタグの対応](#括弧やタグの対応)
    - [マウス有効化](#マウス有効化)
    - [ファイル管理](#ファイル管理)
    - [表示関係](#表示関係)
    - [マクロとキー設定](#マクロとキー設定)
    - [`neocomplete`の設定](#neocompleteの設定)
    - [`Syntastic`の設定](#syntasticの設定)
    - [CtrlPの設定](#ctrlpの設定)
    - [カラースキーム編集用](#カラースキーム編集用)
 - [カラースキームの編集](#カラースキームの編集)
    - [まずは元となるカラースキームを見つけよう](#まずは元となるカラースキームを見つけよう)
    - [どの部分が気に入らない？](#どの部分が気に入らない)
    - [カラースキームを開く](#カラースキームを開く)
    - [対象のシンタックスグループを検索](#対象のシンタックスグループを検索)
    - [書いてみる](#書いてみる)
    - [確認する](#確認する)
 - [シンタックスファイル](#シンタックスファイル)
 - [pyceberg](#pyceberg)
 - [おわりに](#おわりに)


# vimrc
vimは高機能エディターですが、例えば[Visual Studio](https://visualstudio.microsoft.com/ja/downloads/)や[jupyter notebook](https://jupyter.org/)などと違って、UIやらが（プラグインを用いないと）全く充実してないためなんとなく敷居が高いですよね。
かくいうぼくも大して使いこなせていないので練習あるのみな感じですが...
でも**デフォルトのキーバインドでも慣れるとサクサク**書けたり、色々**自由にカスタマイズできる**のがvimのいいところかなぁと最近思ったり思わなかったりしています。
いろんなプラグインがgithubに公開されていますしね。
そう言うことで、今日はぼくが今使っている`.vimrc`を紹介します。

[ここ](https://qiita.com/ahiruman5/items/4f3c845500c172a02935)で紹介されている`.vimrc`をコピペして、少しだけカスタマイズしたりしています。
**全部コピペで`.vimrc`を作りたい！という時は[ここ](#クリップボード経由のコピペ有効化)までやってからコピペして調整してください。**

<details><summary>.vimrc</summary><div>

```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'
" カラースキーム
"NeoBundle 'tomasr/molokai'
"NeoBundle 'flrnd/plastic.vim'
"NeoBundle 'sainnhe/edge'
NeoBundle 'cocopon/iceberg.vim'
"NeoBundle 'kuroitu/pyceberg.vim'
" 花文字
"NeoBundle 'sainnhe/icursive-nerd-font'
" カラースキームを調べる
NeoBundle 'guns/xterm-color-table.vim'
" ステータスラインの表示内容強化
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'
" pythonコード補完
NeoBundle 'davidhalter/jedi-vim'
NeoBundle 'ervandew/supertab'
autocmd FileType python setlocal completeopt-=preview
let g:SuperTabContextDefaultCompletionType = "context"
let g:SuperTabDefaultCompletionType = "<c-n>"
"let g:jedi#rename_command = "<c-r>"
let g:jedi#force_py_version="3"
" 括弧補完
NeoBundle 'cohama/lexima.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

"----------------------------------------------------------
" カラースキーム
"----------------------------------------------------------
" カラースキームにmolokaiを設定する
"if neobundle#is_installed('molokai')
"  colorscheme molokai
"endif
"colorscheme murphy
" plasticに設定
"if neobundle#is_installed('plastic')
"  colorscheme plastic
"endif
" neonに設定
"if neobundle#is_installed('edge')
"  set termguicolors
"  set background=dark
"  let g:edge_style = 'neon'
"  let g:edge_disable_italic_comment = 1
"  let g:edge_enable_italic = 0
"  colorscheme edge
"endif
" icebergに設定
if neobundle#is_installed('iceberg.vim')
  colorscheme iceberg
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=2 " 画面上でタブ文字が占める幅
set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent " 改行時に前の行のインデントを継続する
set smartindent " 改行時に前の行の構文をチェックし次の行のインデントを増減する
set shiftwidth=2 " smartindentで増減する幅

"----------------------------------------------------------
" 文字列検索
"----------------------------------------------------------
set incsearch " インクリメンタルサーチ. １文字入力毎に検索を行う
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 " 括弧の対応関係を一瞬表示する
set matchtime=3
set matchpairs& matchpairs+=<:>
source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する
let g:lexima_enable_newline_rules=0   " 括弧の改行ルールを無効にする

"----------------------------------------------------------
" マウスでカーソル移動とスクロール
"----------------------------------------------------------
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

"----------------------------------------------------------
" ファイル管理
"----------------------------------------------------------
" バックアップファイルやスワップファイルを作成しない
set nowritebackup
set nobackup
set noswapfile

"----------------------------------------------------------
" 表示関係
"----------------------------------------------------------
set list " 不可視文字の可視化
set wrap " 長いテキストの折り返し
set colorcolumn=80 "80文字目にラインを入れる
" スクリーンベルの無効化
set t_vb=
set novisualbell
" 不可視文字をUnicodeで綺麗に
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%,eol:↲

"----------------------------------------------------------
" マクロおよびキー設定
"----------------------------------------------------------
inoremap jj <Esc> " 入力モード中に素早くjjと入力した場合はESCとみなす
" 検索語にジャンプした検索単語を画面中央に持ってくる
nnoremap n nzz
nnoremap N Nzz
nnoremap * *zz
nnoremap # #zz
nnoremap g* g*zz
nnoremap g# g#zz
vnoremap v $h " vを二回で行末まで選択
" TABで対応ペアにジャンプ
nnoremap <Tab> %
vnoremap <Tab> %
" Shift + 矢印でウィンドウサイズを変更
"nnoremap <S-Left> <C-w><<CR>
"nnoremap <S-Right> <C-w>><CR>
"nnoremap <S-Up> <C-w>-<CR>
"nnoremap <S-Down> <C-w>+<CR>
" 矢印２回押しで行頭・行末へ移動
inoremap <Left><Left> <Esc>_i
inoremap <Right><Right> <Esc>$i<Right>
" カーソル位置の記憶
augroup vimrcEx
  autocmd!
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line('$') |
    \   exe "normal! g`\"" |
    \ endif
augroup END

"----------------------------------------------------------
" 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']
" Python用. 構文エラーチェックにpep8とpyflakesを使用
let g:syntastic_python_checkers=['pep8', 'pyflakes']
" Javascript以外は構文エラーチェックをしない
let g:syntastic_mode_map = { 'mode': 'passive',
                           \ 'active_filetypes': ['javascript', 'python'],
                           \ '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

"----------------------------------------------------------
" カラースキーム編集用
"----------------------------------------------------------
" ハイライトグループを知るコマンド:SyntaxInfoを実装
function! s:get_syn_id(transparent)
  let synid = synID(line("."), col("."), 1)
  if a:transparent
    return synIDtrans(synid)
  else
    return synid
  endif
endfunction
function! s:get_syn_attr(synid)
  let name = synIDattr(a:synid, "name")
  let ctermfg = synIDattr(a:synid, "fg", "cterm")
  let ctermbg = synIDattr(a:synid, "bg", "cterm")
  let guifg = synIDattr(a:synid, "fg", "gui")
  let guibg = synIDattr(a:synid, "bg", "gui")
  return {
        \ "name": name,
        \ "ctermfg": ctermfg,
        \ "ctermbg": ctermbg,
        \ "guifg": guifg,
        \ "guibg": guibg}
endfunction
function! s:get_syn_info()
  let baseSyn = s:get_syn_attr(s:get_syn_id(0))
  echo "name: " . baseSyn.name .
        \ " ctermfg: " . baseSyn.ctermfg .
        \ " ctermbg: " . baseSyn.ctermbg .
        \ " guifg: " . baseSyn.guifg .
        \ " guibg: " . baseSyn.guibg
  let linkedSyn = s:get_syn_attr(s:get_syn_id(1))
  echo "link to"
  echo "name: " . linkedSyn.name .
        \ " ctermfg: " . linkedSyn.ctermfg .
        \ " ctermbg: " . linkedSyn.ctermbg .
        \ " guifg: " . linkedSyn.guifg .
        \ " guibg: " . linkedSyn.guibg
endfunction
command! SyntaxInfo call s:get_syn_info()
```
</div></details>

##初めての方へ
初めてじゃない方は[こちら](#最初の設定)までスキップしてください。

とりあえず`.vimrc `を作りましょう。

```console
$ cd
$ vi .vimrc
```

**「え、vimの起動コマンドって`vim`じゃなくて`vi`なの？」**と思うかもしれませんが、少なくとも現在ではどちらも同じコマンドと見なしていいでしょう。

とりあえずこれでvimで`.vimrc`を開いた状態になってると思います。
vimは慣れないとなかなか難しいと思うので、とりあえず初歩中の初歩な基礎理解とコマンドだけ紹介します。

### 基礎理解
vimにはいくつかモードがあります。

 - ノーマルモード(コマンド入力)
 - インサートモード(テキスト編集)
 - ビジュアルモード(範囲選択)

ノーマルモードはvimでコマンドを入力したりするモードです。
vimでファイルを開いた時はこのモードになります。
他のモードの時は`Esc`を押すとこのモードになります。
インサートモードは文章やコード自体を書き換えるためのモードです。
ノーマルモードで`i`や`o`などと入力するとこのモードになりテキストを編集できるようになります。
ビジュアルモードは範囲選択をするモードです。
ノーマルモードで`v`などと入力するとこのモードになります。
最初はあまり使わないかもしれません。

### コマンド
とりあえず本記事では次のコマンドだけ頭に入れていればOKだと思います。
足りなければ随時ググってください。

ノーマルモードでのコマンド

| 1 | 2 |
|:-:|:-:|
|i|インサートモードに変更|
|:w|保存|
|:q|vimを終了する|
|:wq|保存してvimを終了する|
|dd|1行削除|
|yy|1行コピー|
|p|貼り付け(vim内からvim内へのみ)|

その他のモードでのコマンド

| 1 | 2 |
|:-:|:-:|
|Esc|ノーマルモードに戻る|

## 最初の設定
`.vimrc`の先頭には次のスクリプトを書きましょう。
日本語を有効化するためのスクリプトです。

```vim:.vimrc
set encoding=utf-8
scriptencoding utf-8
```

`.vimrc`を初めて書く場合はとりあえずここまで書いて`Esc`を押してノーマルモードにし、`:wq`で保存して閉じましょう。
改めて開き直せば日本語が有効になります。

## クリップボード経由のコピペ有効化
コピペで全部済ませたい人はここまでは手動でやってからにしましょう。
普通にコピペするとめんどくさいことになるはずです。
やっちゃった場合、修正が面倒ならノーマルモードで`:q!`と入力して保存せず閉じましょう。

<details><summary>コピペ有効化</summary><div>

```vim:.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
```
</div></details>

これでクリップボードからコピペできるようになります。
つまりインターネットのサイトとかから文章などをコピーしてvimで開いてるファイルにペーストできるようになります。便利！

## プラグイン管理の`NeoBundle`
`NeoBundle`はもうずいぶん前に開発終了が宣言されてるみたいですね。
開発者は`dein`をオススメしているようです。
希望者は[ここ](https://qiita.com/delphinus/items/00ff2c0ba972c6e41542)などを参考に書き換えてください。
ぼくもそのうち気が向いたら移行するかもしれないのでその時はまた記事を書くかも...

<details><summary>NeoBundle</summary><div>

```vim:.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'
" カラースキーム
"NeoBundle 'tomasr/molokai'
"NeoBundle 'flrnd/plastic.vim'
"NeoBundle 'sainnhe/edge'
NeoBundle 'cocopon/iceberg.vim'
"NeoBundle 'kuroitu/pyceberg.vim'
" 花文字
"NeoBundle 'sainnhe/icursive-nerd-font'
" カラースキームを調べる
NeoBundle 'guns/xterm-color-table.vim'
" ステータスラインの表示内容強化
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'
" pythonコード補完
NeoBundle 'davidhalter/jedi-vim'
NeoBundle 'ervandew/supertab'
autocmd FileType python setlocal completeopt-=preview
let g:SuperTabContextDefaultCompletionType = "context"
let g:SuperTabDefaultCompletionType = "<c-n>"
"let g:jedi#rename_command = "<c-r>"
let g:jedi#force_py_version="3"
" 括弧補完
NeoBundle 'cohama/lexima.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
```
</div></details>

各プラグインの説明は大体[ここ](https://qiita.com/ahiruman5/items/4f3c845500c172a02935)にウルトラ丁寧な説明が乗っていますので省略しながら説明します。

### `NeoBundle`本体関係
NeoBundle本体に関係するところを抜き出します。
それぞれの動作はコメントにある通りですね。

<details><summary>本体関係</summary><div>

```vim:.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'

...

call neobundle#end()

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

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

### カラースキーム 
カラースキームは個人的に試したものの残骸がコメントアウトされています...
`molokai`は有名ですね。
ただ、個人的には[iceberg](https://github.com/cocopon/iceberg.vim)が気に入りました。
また、これをぼくにとって見やすいように少しだけカスタマイズした[pyceberg](https://github.com/kuroitu/pyceberg)も後ほど紹介させていただきます~~(ダイマ)~~。

```vim:.vimrc
" カラースキーム
"NeoBundle 'tomasr/molokai'
"NeoBundle 'flrnd/plastic.vim'
"NeoBundle 'sainnhe/edge'
NeoBundle 'cocopon/iceberg.vim'
```

有効化の方法はまた[後ほど](#カラースキームの有効化)紹介します。

### 花文字
花文字はなぜか使えませんでした。
~~かっこいいから使いたかった。~~
色々調べたのですが、文字列の背景がハイライトされるだけでした...
どなたか情報あれば教えてください泣

```vim:.vimrc
" 花文字
"NeoBundle 'sainnhe/icursive-nerd-font'
```

### カラースキームを調べる
詳しくは[こちら](https://github.com/guns/xterm-color-table.vim)
使用できるカラーとかが一覧として表示できるコマンド`:XtermColorTable`が使えるようになります。
[カラースキームの色調整](https://qiita.com/sff1019/items/3f73856b78d7fa2731c7)に大いに役立ちます。

```vim:.vimrc
" カラースキームを調べる
NeoBundle 'guns/xterm-color-table.vim'
```

### ステータスラインの表示内容強化
詳しくは[こちら](https://qiita.com/ahiruman5/items/4f3c845500c172a02935#-lightlinevim%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E8%A1%A8%E7%A4%BA%E5%86%85%E5%AE%B9%E5%BC%B7%E5%8C%96)
まあ要するに表示される情報が増えるのでありがたいってことです。

```vim:.vimrc
" ステータスラインの表示内容強化
NeoBundle 'itchyny/lightline.vim'
```

ステータスラインを有効にする必要がありますので[ここ](#ステータスラインの有効化)を参考にしてください。

### インデント可視化
そのままです。インデントが見えるようになります。
どんな言語でもインデントラインは重要ですよね〜。

```vim:.vimrc
" インデントの可視化
NeoBundle 'Yggdroot/indentLine'
```

### 不要なスペースをハイライト
コードに紛れる空白文字を赤のハイライトで見えるようにします。
スペースあるせいでコンパイルできない！なんてこともあるので大変ありがたいですね。
さらにさらに、なんと`:FixWhitespace`というコマンドでハイライトされた不要なスペースを一括削除できたりもします！
まあこれに頼りすぎず、普段から丁寧なコーディングをしましょう。

```vim:.vimrc
" 末尾の全角半角空白文字を赤くハイライト
NeoBundle 'bronson/vim-trailing-whitespace'
```

### 構文エラーチェック
動作は[こちら](https://qiita.com/ahiruman5/items/4f3c845500c172a02935#-syntastic%E6%A7%8B%E6%96%87%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)を見たらわかります。
文法の間違いがあれば教えてくれる感じですね。

```vim:.vimrc
" 構文エラーチェック
NeoBundle 'scrooloose/syntastic'
" プロジェクトに入ってるESLintを読み込む
NeoBundle 'pmsorhaindo/syntastic-local-eslint.vim'
```

単体ではPythonの構文チェックしてくれないので[ここ](#syntasticの設定)を見てください。

### 多機能セレクタ
ファイルの検索とかバッファの検索とかしてくれるプラグインですね。特に使ってない気がする...
まだまだ修行が足りないということなんでしょうか...

```vim:.vimrc
" 多機能セレクタ
NeoBundle 'ctrlpvim/ctrlp.vim'
" CtrlPの拡張プラグイン. 関数検索
NeoBundle 'tacahiroy/ctrlp-funky'
" CtrlPの拡張プラグイン. コマンド履歴検索
NeoBundle 'suy/vim-ctrlp-commandline'
" CtrlPの検索にagを使う
NeoBundle 'rking/ag.vim'
```

これに関連するCtrlPの設定は[こちら](#ctrlpの設定)

### コード補完
コーディングの味方、コード補完ですね。
そういえば`neocomplete`とか別になくても`jedi-vim`使ってるしいいのではないかと思ったけど、別にあっても困ってないから置いています。
そのうち整理するかも。

<details><summary>コード補完</summary><div>

```vim:.vimrc
" pythonコード補完
NeoBundle 'davidhalter/jedi-vim'
NeoBundle 'ervandew/supertab'
autocmd FileType python setlocal completeopt-=preview
let g:SuperTabContextDefaultCompletionType = "context"
let g:SuperTabDefaultCompletionType = "<c-n>"
"let g:jedi#rename_command = "<c-r>"
let g:jedi#force_py_version="3"

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

`neocomplete`の設定は[ここ](#neocompleteの設定)

### 括弧補完
開き括弧を入力した際に閉じ括弧を一緒に入力してくれたり、開き括弧を消した場合隣接する閉じ括弧も消してくれるなど、jupyter notebookなどのエディタによくある地味に便利な括弧補完ももちろんVimでもできます。
[GitHubリポジトリ](https://github.com/cohama/lexima.vim)ではもう少しいろいろ書いてありますが、まあ使いたい人はそちらで確認してください。
基本的にインストールすればそのまま使えます。カスタマイズしたい場合はREADME.mdなどを確認してください。

```vim:.vimrc
" 括弧補完
NeoBundle 'cohama/lexima.vim'
```

個人的には括弧内の改行ルールはあまり使わないのでオフにしています。

## カラースキームの有効化
カラースキームの有効化です。
例の如くコメントアウトしてる部分は残骸です。
好きなやつを使ってください。

<details><summary>カラースキーム設定集</summary><div>

```vim:.vimrc
"----------------------------------------------------------
" カラースキーム
"----------------------------------------------------------
" カラースキームにmolokaiを設定する
"if neobundle#is_installed('molokai')
"  colorscheme molokai
"endif
"colorscheme murphy
" plasticに設定
"if neobundle#is_installed('plastic')
"  colorscheme plastic
"endif
" neonに設定
"if neobundle#is_installed('edge')
"  set termguicolors
"  set background=dark
"  let g:edge_style = 'neon'
"  let g:edge_disable_italic_comment = 1
"  let g:edge_enable_italic = 0
"  colorscheme edge
"endif
" icebergに設定
if neobundle#is_installed('iceberg.vim')
  colorscheme iceberg
endif

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

[pyceberg](https://github.com/kuroitu/pyceberg)もぜひ見てみてください！！~~(ダイマ２回目)~~
導入などの紹介は[こちら](#pyceberg)

## 文字コードの設定
文字コードに関する設定集です。

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

## ステータスラインの有効化
ステータスライン(vimエディタの下部)を有効にします。

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

## コマンドモードの設定
ノーマルモードでコマンドを色々打ちますが、それをアシストしてくれる機能です。
コマンド履歴はもっと少なくても多分何も困らないでしょう。

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

## タブやインデントの設定
タブやインデント、読みやすいコードを書く上では超重要ですね。
個人的にインデント幅が大きすぎると見にくいと感じるので`2`にしていますが、なぜかPythonコードを書いてる時は勝手に`4`になってしまいます。
まあPythonは暗黙の了解でインデント幅は4みたいな風潮があるのでいいですが。
[インデントとか可視化](#インデント可視化)されますしね。

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

## 文字列検索
こちらも重要設定ですね。
文字列検索が便利になります。

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

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

ちなみに文字列検索は`/(検索したい文字列)`
文字列置換は`:%s/(置換対象の文字列)/(置換後の文字列)`が基本です。

## カーソル移動など
vimではノーマルモードなら`h, j, k, l`でそれぞれ`左 下 上 右`と移動できますが、こういったコマンドでの移動の際、長いコードを書いたために1行が折り返して表示されていると、例えば`j`で移動すると見た目での1行下ではなく、次の行にカーソルが移動してしまったりします。
ここではそれを解消したり、カーソルラインをハイライトしたりの設定をしています。

<details><summary>カーソル関連</summary><div>

```vim:/.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
```
</div></details>

## 括弧やタグの対応
コーディング中に対応する括弧が一瞬光ります。
括弧をたくさん書くときに便利です。

```vim:.vimrc
"----------------------------------------------------------
" カッコ・タグの対応
"----------------------------------------------------------
set showmatch " 括弧の対応関係を一瞬表示する
set matchtime=3
set matchpairs& matchpairs+=<:>
source $VIMRUNTIME/macros/matchit.vim " Vimの「%」を拡張する
let g:lexima_enable_newline_rules=0   " 括弧の改行ルールを無効にする
```

## マウス有効化
なんと初期設定のvimではマウスが使えません。
トラックパッドも使えません。
ということで設定しましょう。

<details><summary>マウス有効化</summary><div>

```vim:.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
```
</div></details>

## ファイル管理
vimでファイルを編集すると自動でバックアップファイルやスワップファイルを作成するのですが、別に不要なのでオフにしておきます。
(ファイルのバックアップとかが必要ならそもそもgitとか使った方がいいと思ってます)

```vim:.vimrc
"----------------------------------------------------------
" ファイル管理
"----------------------------------------------------------
" バックアップファイルやスワップファイルを作成しない
set nowritebackup
set nobackup
set noswapfile
```

## 表示関係
空白とか改行とかタブとかを可視化します。
あと一文が長くなったら折り返します。

<details><summary>表示関係設定</summary><div>

```vim:.vimrc
"----------------------------------------------------------
" 表示関係
"----------------------------------------------------------
set list " 不可視文字の可視化
set wrap " 長いテキストの折り返し
set colorcolumn=100 "100文字目にラインを入れる
" スクリーンベルの無効化
set t_vb=
set novisualbell
" 不可視文字をUnicodeで綺麗に
set listchars=tab:»-,trail:-,extends:»,precedes:«,nbsp:%,eol:↲
```
</div></details>

## マクロとキー設定
ここではデフォルトのキーバインドを直感的に使えるようにオーバーライドしたり新しく設定したりしています。
お好みで追加したり削除したりしてくださいね。

 - `nnoremap`はノーマルモードでのキー設定
 - `inoremap`はインサートモードでのキー設定
 - `vnoremap`はビジュアルモードでのキー設定
 - `<S>`は`Shift`キー
 - `<C>`は`Ctrl`キー

<details><summary>マクロとキー設定集</summary><div>

```vim:.vimrc
"----------------------------------------------------------
" マクロおよびキー設定
"----------------------------------------------------------
inoremap jj <Esc> " 入力モード中に素早くjjと入力した場合はESCとみなす
" 検索語にジャンプした検索単語を画面中央に持ってくる
nnoremap n nzz
nnoremap N Nzz
nnoremap * *zz
nnoremap # #zz
nnoremap g* g*zz
nnoremap g# g#zz
vnoremap v $h " vを二回で行末まで選択
" TABで対応ペアにジャンプ
nnoremap <Tab> %
vnoremap <Tab> %
" Shift + 矢印でウィンドウサイズを変更
"nnoremap <S-Left> <C-w><<CR>
"nnoremap <S-Right> <C-w>><CR>
"nnoremap <S-Up> <C-w>-<CR>
"nnoremap <S-Down> <C-w>+<CR>
" 矢印２回押しで行頭・行末へ移動
inoremap <Left><Left> <Esc>_i
inoremap <Right><Right> <Esc>$i<Right>
" カーソル位置の記憶
augroup vimrcEx
  autocmd!
  autocmd BufReadPost *
    \ if line("'\"") > 1 && line("'\"") <= line('$') |
    \   exe "normal! g`\"" |
    \ endif
augroup END
```
</div></details>

## `neocomplete`の設定
`neocomplete`の設定と、`neosnippet`の設定です。
他にも色々オプションあるみたいですが、大体下記で事足りるのではないでしょうか。
詳しくは

 - `neocomplete`は[ここ](https://github.com/Shougo/neocomplete.vim)
 - `neosnippet`は[ここ](https://github.com/Shougo/neosnippet.vim)

をご覧ください。

<details><summary>コード補完設定</summary><div>

```vim:.vimrc
"----------------------------------------------------------
" 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
```
</div></details>

## `Syntastic`の設定
構文チェック機能の設定集ですね。
ただ、なぜかぼくの環境では動いていないっぽい...？
どこか間違ってそうです...

<details><summary>`Syntastic`の設定</summary><div>

```vim:.vimrc
"----------------------------------------------------------
" 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']
" Python用. 構文エラーチェックにpep8とpyflakesを使用
let g:syntastic_python_checkers=['pep8', 'pyflakes']
" Javascript, python以外は構文エラーチェックをしない
let g:syntastic_mode_map = { 'mode': 'passive',
                           \ 'active_filetypes': ['javascript', 'python'],
                           \ 'passive_filetypes': [] }
```
</div></details>

ちなみに`pep8`と`pyflakes`は

```console
$ pip install pep8 pyflakes
```
でインストールできます。
詳しくは[こちら](https://blog.ton-up.net/2013/11/26/vim-python-style-check-and-fix/)

## CtrlPの設定
[多機能セレクタ](#多機能セレクタ)プラグインの設定です。
ファイル検出の設定とかをしています。

<details><summary>CtrlPの設定</summary><div>

```vim:.vimrc
"----------------------------------------------------------
" 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
```
</div></details>

## カラースキーム編集用
カラースキーム編集時に、今カーソルを合わせているコードのシンタックスグループなどを教えてくれる便利コマンドです。

<details><summary>`:SyntaxInfo`コマンドを使えるようにする</summary><div>

```vim:.vimrc
"----------------------------------------------------------
" カラースキーム編集用
"----------------------------------------------------------
" ハイライトグループを知るコマンド:SyntaxInfoを実装
function! s:get_syn_id(transparent)
  let synid = synID(line("."), col("."), 1)
  if a:transparent
    return synIDtrans(synid)
  else
    return synid
  endif
endfunction
function! s:get_syn_attr(synid)
  let name = synIDattr(a:synid, "name")
  let ctermfg = synIDattr(a:synid, "fg", "cterm")
  let ctermbg = synIDattr(a:synid, "bg", "cterm")
  let guifg = synIDattr(a:synid, "fg", "gui")
  let guibg = synIDattr(a:synid, "bg", "gui")
  return {
        \ "name": name,
        \ "ctermfg": ctermfg,
        \ "ctermbg": ctermbg,
        \ "guifg": guifg,
        \ "guibg": guibg}
endfunction
function! s:get_syn_info()
  let baseSyn = s:get_syn_attr(s:get_syn_id(0))
  echo "name: " . baseSyn.name .
        \ " ctermfg: " . baseSyn.ctermfg .
        \ " ctermbg: " . baseSyn.ctermbg .
        \ " guifg: " . baseSyn.guifg .
        \ " guibg: " . baseSyn.guibg
  let linkedSyn = s:get_syn_attr(s:get_syn_id(1))
  echo "link to"
  echo "name: " . linkedSyn.name .
        \ " ctermfg: " . linkedSyn.ctermfg .
        \ " ctermbg: " . linkedSyn.ctermbg .
        \ " guifg: " . linkedSyn.guifg .
        \ " guibg: " . linkedSyn.guibg
endfunction
command! SyntaxInfo call s:get_syn_info()
```
</div></details>

![SyntaxInfo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/1496abdd-6fba-386f-fa4e-84ad9f27cf53.gif)


# カラースキームの編集
ぼくは[ここ](https://qiita.com/sff1019/items/3f73856b78d7fa2731c7)などを参考にしました。
vimでコーディングする上でカラースキームって意外と大切だったりします。
明るい色ばかり使っていたら目が疲れますし、全部同じ色だとスペルミスに気づけなかったり、とにかくコーディング効率が悪くなります。
いろんなサイトで「カラースキームといえばこれ！」とか紹介されているのを見たり、既存の[カラースキームを探せるサイト](http://vimcolors.com/)とかで自分なりに良さげなのを探してきたりしても、どうにも微妙に納得がいかなかったりしませんか？
ということで、すごく簡単にですがカラースキームの編集方法について説明します。

## まずは元となるカラースキームを見つけよう
一から自分専用のカラースキームを作るのは心が折れると思いますのでやめときましょう。
今自分の中で一番気に入っているカラースキームを少しずつ編集するだけで十分なものに仕上げることができます。
ぼくは[iceberg](https://github.com/cocopon/iceberg.vim)が気に入ったのでこれをもとに少しだけ編集しました。

## どの部分が気に入らない？
元となるカラースキームを決めたら、どの部分の色が気に入らないか調べましょう。
[先に紹介](#カラースキーム編集用)した`:SyntaxInfo`でハイライトグループを知ることができますので、それを元に編集します。
以下では例としてPythonStringグループの色を変更します。
![PythonString.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/bdd865ab-cd21-7929-c5e1-4fbf3a420b12.gif)

**このPythonコードは開きっぱなしで！**

## カラースキームを開く
カラースキームは`NeoBundle`で管理していれば

```console
~/.vim/bundle/
```
の中にあると思います。
今回は`iceberg`を編集するので

```console
$ vi ~/.vim/bundle/iceberg.vim/colors/iceberg.vim
```

でカラースキームを開きます。

## 対象のシンタックスグループを検索
vimの文字列検索`/pythonstring`として定義を見てみましょう。
![search_PythonString.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/7a5a9e33-6970-7054-8b4d-aa5cdf7cdc56.gif)
ないですね、はい。
ということは自分で書くしかないわけですね。
どこに書き足してもいいですが、わかりやすいところにしましょう。
今回はカラースキームの色を直接定義している部分の一番最後にします。
<img width="567" alt="define_last.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/818e5895-0457-21bd-d168-2bba73367a81.png">

## 書いてみる
書き方は真似すればOK。
何色がある？っていうのは[ここ](#カラースキームを調べる)で紹介した`:XtermColorTable`を参考にしましょう。
今回は`ctermfg=40,guifg=#00df00`を使います。
`guifg`の16進数はビジュアルモードで範囲選択すれば見えますよ〜
<img width="567" alt="colortable.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/a6da8092-10e1-4b72-bc48-89eb38ee7d28.png">
<img width="567" alt="write_pythonstring.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/13edfcda-22e9-ea2b-c0d9-2bfa07631370.png">
書けたらとりあえず**`:w`で保存するだけ保存しましょう。**
**まだ閉じないように！**

## 確認する
ではPythonのコード画面に移りましょう。
`:syntax on`と入力すれば新しいカラーが反映されるはずです。
![reflect.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/d796f2fa-27da-1202-3489-98c47e664fb6.gif)
派手すぎますね〜やっぱりやめときましょうこの色、とかなったり、微妙に思った色と違ったりするかもしれないので、また[書いてみる](#書いてみる)に戻って編集し直して確認して〜の繰り返しです。

以上でカラースキームの編集方法の説明は終了です！


# シンタックスファイル
さて、カラースキーム編集したしバッチリ！と思ってるそこのあなた、もう一つ大事な要素を忘れてますよ！
それは**シンタックスファイル**の存在です。
シンタックスファイルとは、そのまま文法をまとめたファイルのことです。
vimでPython書くならこれを入れておくべきでしょう。
[ここ](https://github.com/vim/vim/blob/master/runtime/syntax/python.vim)にPythonのシンタックスファイルがありますが、これでは(なぜか)クラスのメソッドなどのアトリビュート(`hoge.foo`の`foo`)の色を変えられなかったりします。
ということでぼくがちょっぴり修正した[ここ](https://github.com/kuroitu/vim_item)の`python.vim`を`README.md`に従って

```console
~/.vim/syntax/
```

に入れましょう。
そうすればアトリビュートも色を変えられるはずです！

## f-stringに対応する
最近Pythonのf-stringを書くことが多くなってきて、文字列と同じ色は見辛いなぁと思っていたところ、[いいもの](https://gist.github.com/phelipetls/8726d6cd68e66ad6b83586ae53f3b3d8)を発見しました。コピペすればOKなシンタックス構文です。
やっている内容の詳細はしっかり[ここ](https://phelipetls.github.io/posts/f-strings-syntax-highlighting-in-vim/)に書いてますが、一応覚書として日本語で解説しておきます。

最初の2行で`pythonString`や`pythonDocstring`などにエスケープシーケンスを定義しています。
次の部分でf-stringについてのシンタックスが定義されています。fから始まる文字列を`pythonfString`などのregionとしています。`{}`で囲まれている部分のハイライトを変更する感じですね。
あとは正規表現でf-stringの構文内をそれぞれのカラースキームに合わせてハイライトされるように指定しています。
最後にハイライトリンクを設定して完了です。


# pyceberg
最後に、本記事を通してダイマしまくった[pyceberg](https://github.com/kuroitu/pyceberg)を宣伝させてもらいます笑
基本は[iceberg](https://github.com/cocopon/iceberg.vim)で、少しぼく好みに色を変更したりしたくらいです。
もしよかったら使ってやってください。

導入方法は`README.md`に書いてあります。
1番簡単なのは`.vimrc`に

```vim:.vimrc
NeoBundle ‘kuroitu/pyceberg’
colorscheme pyceberg
```

とやるやり方ですかね〜

こんな感じになります↓ (画像はnumpyのコードより)
<img width=47% alt="screenshot1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/c398a3d6-d3b9-3bb4-108f-769898bcfdfa.png"> <img width=50% alt="screenshot2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/5421e95b-445f-a610-e3d8-3c636c19a4e0.png">


# おわりに
すごく長い記事になりました...
まあ何かの参考にでもなれば幸いです。


# 参考
- [【詳解】モテたいVimmer必見　快適にコーディングするためのvimrc解説](https://qiita.com/ahiruman5/items/4f3c845500c172a02935)
- [オリジナルのpython.vim](https://github.com/vim/vim/blob/master/runtime/syntax/python.vim)
- [iceberg](https://github.com/cocopon/iceberg.vim)
- [NeoBundle から dein.vim に乗り換えたら爆速だった話](https://qiita.com/delphinus/items/00ff2c0ba972c6e41542)
- [neocompleteとneobundleを捨てた](https://daisuzu.hatenablog.com/entry/2016/08/14/213833)
- [vimのカラースキームの設定・編集方法（初心者〜上級者）](https://qiita.com/sff1019/items/3f73856b78d7fa2731c7)
- [vimでpythonのコーディングスタイルを自動でチェック&自動修正する](https://blog.ton-up.net/2013/11/26/vim-python-style-check-and-fix/)
- [vim - カーソル位置記憶](http://freebsd.sing.ne.jp/tool/02/02/16.html)
- [Python f-strings syntax highlighting in Vim](https://phelipetls.github.io/posts/f-strings-syntax-highlighting-in-vim/)