今回はchrisbra/csv.vimによるCSVファイルの表示と、Vimが提供する差分モードを使う方法を紹介する。Microsoft ExcelやGoogleスプレッドシートなどと比較してVimが抜きん出て便利になるのはこの差分モードを使うときではないかと思う。CSVデータを扱うことが多い方のなかには、この機能なしには生きていない状態になる方もいるだろう。使ったことがないのであれば、ぜひ一度試してもらいたい機能だ。

スプレッドシートと言うと、機能的にはMicrosoft Excelに落ち着くことが多い。費用面を抑えたい場合にはMicrosoft Excelの無償オンライン版を使うか、Googleスプレッドシートを使うという選択肢がある。オンライン版でもそこそこ機能が豊富なので、結構いろんなことができる。AI技術を使ったサポート機能などはオンライン版のほうが便利だったりすることもある。CSVを含め、表形式のデータはこうしたアプリケーションを使うのが一般的だ。

Vimとchrisbra/csv.vimプラグインを使うとスプレッドシートアプリケーションが提供している基本的な機能が使用できることをこれまで紹介してきた。スプレッドシートアプリケーションと比較するとあくまでライトな代替候補という位置付けになるが、Vimの差分モードを使うときは立場が逆転する。Vimが提供する最強の機能の一つであり、それがchrisbra/csv.vimと結び付くことで2つのCSVデータを比較しながら変更点を簡単にチェックできるようになる。今回はこの機能を紹介する。

CSVプラグインと差分モードの使いやすさ

差分モードは次のようにvimコマンドにオプション「-d」を指定し、その後に比較したいファイルを2つ指定して起動する。Vimの場合には「vimdiff」というコマンドも用意されており、vimdiffコマンドにファイルを2つ指定するかたちで起動してもよい。

◆Vimを差分モードで起動する方法

vim -d 旧ファイル 新ファイル

◆vimdiffで差分モード起動する方法

vimdiff 旧ファイル 新ファイル

nvimを使う場合には「nvim -d」のようにオプション「-d」を使って同じ状況にすることができる。例えば、この状態で2つのCSVファイルを指定して開くと次のようになる(日本郵便が「郵便番号データダウンロード 住所の郵便番号(ローマ字) zip形式 - 日本郵便」で提供しているデータの、2020年6月版と2014年10月版のデータを差分モードで開いている)。

Vimの差分モードとchrisbra/csv.vimプラグインを使っているようす

異なっているデータ部分が赤色で強調表示されていることがわかる。

差分を調べる場合、UNIX系のOSではdiffコマンドが使われることが多い。典型的な使い方としては、diffコマンドに「-u」を指定して「unified」と呼ばれる形式で差分データを作成し、この差分データを見ながら違いを調べるといった作業が考えられる。次が「diff -u」で作成したパッチファイルの例だ。

--- KEN_ALL_ROME_201410.CSV 2020-08-08 10:36:31.175837000 +0900
+++ KEN_ALL_ROME_202006.CSV 2020-08-08 10:36:32.073446000 +0900
@@ -533,30 +533,30 @@
 "0050831","北海道","札幌市 南区","中ノ沢","HOKKAIDO","SAPPORO SHI MINAMI KU","NAKANOSAWA"
 "0050840","北海道","札幌市 南区","藤野(400、400−2番地)","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO(400.400-2-BANCHI)"
 "0612271","北海道","札幌市 南区","藤野(その他)","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO(SONOTA)"
-"0612281","北海道","札幌市 南区","藤野一条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO1-JO"
-"0612282","北海道","札幌市 南区","藤野二条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO2-JO"
-"0612283","北海道","札幌市 南区","藤野三条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO3-JO"
-"0612284","北海道","札幌市 南区","藤野四条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO4-JO"
-"0612285","北海道","札幌市 南区","藤野五条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO5-JO"
-"0612286","北海道","札幌市 南区","藤野六条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO6-JO"
+"0612281","北海道","札幌市 南区","藤野 一条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO 1-JO"
+"0612282","北海道","札幌市 南区","藤野 二条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO 2-JO"
+"0612283","北海道","札幌市 南区","藤野 三条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO 3-JO"
+"0612284","北海道","札幌市 南区","藤野 四条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO 4-JO"
+"0612285","北海道","札幌市 南区","藤野 五条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO 5-JO"
+"0612286","北海道","札幌市 南区","藤野 六条","HOKKAIDO","SAPPORO SHI MINAMI KU","FUJINO 6-JO"
 "0050008","北海道","札幌市 南区","真駒内(17番地)","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI(17-BANCHI)"
 "0050861","北海道","札幌市 南区","真駒内(その他)","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI(SONOTA)"
-"0050018","北海道","札幌市 南区","真駒内 曙町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI AKEBONOCHO"
-"0050015","北海道","札幌市 南区","真駒内 泉町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI IZUMIMACHI"
-"0050022","北海道","札幌市 南区","真駒内 柏丘","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI KASHIWAOKA"
-"0050012","北海道","札幌市 南区","真駒内 上町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI KAMIMACHI"
-"0050014","北海道","札幌市 南区","真駒内 幸町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI SAIWAIMACHI"
-"0050011","北海道","札幌市 南区","真駒内 東町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI HIGASHIMACHI"
-"0050021","北海道","札幌市 南区","真駒内 本町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI HONCHO"
-"0050013","北海道","札幌市 南区","真駒内 緑町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI MIDORIMACHI"
-"0050016","北海道","札幌市 南区","真駒内 南町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAI MINAMIMACHI"
+"0050018","北海道","札幌市 南区","真駒内曙町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIAKEBONOCHO"
+"0050015","北海道","札幌市 南区","真駒内泉町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIIZUMIMACHI"
+"0050022","北海道","札幌市 南区","真駒内柏丘","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIKASHIWAOKA"
+"0050012","北海道","札幌市 南区","真駒内上町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIKAMIMACHI"
+"0050014","北海道","札幌市 南区","真駒内幸町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAISAIWAIMACHI"
+"0050011","北海道","札幌市 南区","真駒内東町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIHIGASHIMACHI"
+"0050021","北海道","札幌市 南区","真駒内本町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIHONCHO"
+"0050013","北海道","札幌市 南区","真駒内緑町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIMIDORIMACHI"
+"0050016","北海道","札幌市 南区","真駒内南町","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIMINAMIMACHI"
 "0050017","北海道","札幌市 南区","真駒内公園","HOKKAIDO","SAPPORO SHI MINAMI KU","MAKOMANAIKOEN"
-"0612261","北海道","札幌市 南区","簾舞一条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI1-JO"
-"0612262","北海道","札幌市 南区","簾舞二条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI2-JO"
-"0612263","北海道","札幌市 南区","簾舞三条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI3-JO"
-"0612264","北海道","札幌市 南区","簾舞四条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI4-JO"
-"0612265","北海道","札幌市 南区","簾舞五条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI5-JO"
-"0612266","北海道","札幌市 南区","簾舞六条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI6-JO"
+"0612261","北海道","札幌市 南区","簾舞 一条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI 1-JO"
+"0612262","北海道","札幌市 南区","簾舞 二条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI 2-JO"
+"0612263","北海道","札幌市 南区","簾舞 三条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI 3-JO"
+"0612264","北海道","札幌市 南区","簾舞 四条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI 4-JO"
+"0612265","北海道","札幌市 南区","簾舞 五条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI 5-JO"
+"0612266","北海道","札幌市 南区","簾舞 六条","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI 6-JO"
 "0612272","北海道","札幌市 南区","簾舞(その他)","HOKKAIDO","SAPPORO SHI MINAMI KU","MISUMAI(SONOTA)"
 "0050827","北海道","札幌市 南区","南沢","HOKKAIDO","SAPPORO SHI MINAMI KU","MINAMISAWA"
 "0050821","北海道","札幌市 南区","南沢一条","HOKKAIDO","SAPPORO SHI MINAMI KU","MINAMISAWA1-JO"

...略...

@@ -123528,6 +124261,7 @@
 "9012305","沖縄県","中頭郡 北中城村","比嘉","OKINAWA KEN","NAKAGAMI GUN KITANAKAGUSUKU SON","HIGA"
 "9012321","沖縄県","中頭郡 北中城村","美崎","OKINAWA KEN","NAKAGAMI GUN KITANAKAGUSUKU SON","MISAKI"
 "9012304","沖縄県","中頭郡 北中城村","屋宜原","OKINAWA KEN","NAKAGAMI GUN KITANAKAGUSUKU SON","YAGIBARU"
+"9012306","沖縄県","中頭郡 北中城村","ライカム","OKINAWA KEN","NAKAGAMI GUN KITANAKAGUSUKU SON","RAIKAMU"
 "9012312","沖縄県","中頭郡 北中城村","和仁屋","OKINAWA KEN","NAKAGAMI GUN KITANAKAGUSUKU SON","WANIYA"
 "9012400","沖縄県","中頭郡 中城村","以下に掲載がない場合","OKINAWA KEN","NAKAGAMI GUN NAKAGUSUKU SON","IKANIKEISAIGANAIBAAI"
 "9012407","沖縄県","中頭郡 中城村","安里","OKINAWA KEN","NAKAGAMI GUN NAKAGUSUKU SON","ASATO"

diffで生成したデータはpatchコマンドで適用することが可能で、古いソースコードにパッチを適用して新しいソースコードへアップデートするといったことができる。

diffはdiffで便利ではあるのだが、デフォルトのdiffコマンドは行単位で差分を出力するため、1行の内のどの部分が違っているかを知ることができない。その部分は目視で確認する必要がある。CSVデータのように1行が長いデータの差分を調べるといったことになると、目視での作業は苦行でしかなくなってくる。

そこでVimの差分モードだ。Vimの差分モードを使うと「行のどこが違っているのか」を視覚的に知ることができる。CSVのようなデータとの相性が抜群に良い。CSVデータを扱っている場合にはデータの差分を調べることが重要なこともあるわけだが、Vimの差分モードを使うとそれが一発で済む。すごく便利だ。CSVデータに限った話ではないのだが、2つのデータを比較する必要がある場合にはぜひ使ってほしい機能だ。

差分の中の移動

Vimの差分モードでは「[c」と「]c」で差分部分を移動していくことができる。通常のVimの操作で移動してもよいのだが、差分モードで使っている場合には差分を知りたいことが多いので、こちらのほうが便利だ。

ショートカットキー 内容
[c 前の差分へ移動
]c 次の差分へ移動
Ctrl-w Ctrl-w 次のウィンドウへ移動
Ctrl-w h 左のウィンドウへ移動
Ctrl-w l 右のウィンドウへ移動

Vim差分モードにおける移動方法

Vimの差分モードは基本的に2つのウィンドウが開かれた状態になるので、時にはウィンドウの間を行ったり来たりしたいときがある。覚えておきたいのは、ウィンドウの間を渡り歩ける「Ctrl-w Ctrl-w」だ。特定のキーワードで検索したい場合など、検索したいほうのウィンドウに移動して検索したり、CSVAnalyzeで分析するために別のウィンドウに移動したりといったことができる。「Ctrl-w h」と「Ctrl-w l」で左右に移動することもできるので、余裕があればそちらも覚えておくとよいだろう。面倒な場合には、とりあえず「Ctrl-w Ctrl-w」だけ覚えておけばよい。

なぜ「[」と「]」がショートカットに割り振られているかだが、英語キーボードでは「[」と「]」は左右に隣り合って配置されている。このため、「[」が前の差分へ、「]」が次の差分へ、という割当は直感的で扱いやすいのだ。「c」は「compare(比較)」のcと考えると覚えやすいと思う。

差分の適用

Vimの差分モードではpatchコマンドを適用するように、違いの部分をどちらかに合わせるといったことができる。違いを調べて手動でアップデートしたいときにはこの機能を使うとよい。「dp」と「do」で差分を適用できる。気をつけたいのは適用する方向だ。以下に動作例を挙げておく。

ショートカットキー 内容
dp 差分を新ファイルへ適用
do 差分を旧ファイルへ適用

適用前

doで新から旧へ適用した場合

適用前

dpで旧から新へ適用した場合

「vim -d 旧ファイル 新ファイル」のように指定して起動したとしよう。この場合、旧ファイルが左に、新ファイルが右に配置されている。この場合、左にある旧ファイルが視点の基準となる。「dp」は「diff push」または「put」であり、旧ファイルの内容を新ファイルへ適用(put、push)するといったイメージになる。「do」は「diff obtain」で動作が逆だ。新ファイルの内容を旧ファイルへ持ってくる(obtain)というイメージになる。

差分を適用すると当然ながらデータが書き換わってしまうので操作には注意してほしい。

Vimの終了

Vimを差分モードで起動するというのは、2つのファイルを2つのウィンドウで表示している、という状態を意味している。この状態のVimを終了するには、2つのファイル編集を終了させる必要があるため、2回終了の操作をしなければならない。差分モードを頻繁に使うようになると、ここの操作にイラつきを感じるようになる。この場合、次の操作方法が有用だ。

ショートカットキー 内容
:wqa 保存して終了
ZZZZ 保存して終了
:qa! 保存せずに終了
:qa 終了

終了のサンプル

まず保存せずに終了する方法として「:qa」または「:qa!」を覚えておくとよい。これで一気に終了することができる。「dp」や「do」で差分を適用したり、直接編集した内容を保存して終了したりする場合には「:wqa」、または「ZZZZ」だ。書き込んで終了してよいなら「ZZZZ」を覚えておくとよいと思う。同じ文字の4回連続入力で結果として終了してくれるので手癖として覚えやすくなかなか快適だ。ただ、この方法だと編集内容は保存されてしまうので、保存せずに終了したいならやはり「:qa!」ということになる。この「a」は全てのウィンドウ(ファイル)に適用する「all」の意味だと覚えておくとよいと思う。

差分モードを使いこなす

結局これもユーザーの使い方によるところはあるが、頻度の違いはあっても2つのデータファイルを比較するケースはあるだろう。その場合、Microsoft Excelを2ウィンドウで開いて目視で比較するか、スプレッドシートアプリケーションの機能を使って比較を行うか、多機能エディタとプラグインという組み合わせで比較する、といったやり方になる。とりあえず目視で比較する、という手段をとるユーザーが多いかもしれない。

Vimの差分モードはそうした場合に使用できる選択肢の一つだ。使い慣れるとこれは非常に強力なツールになる。chrisbra/csv.vimプラグインと併用するとCSVデータの分析を行いつつ差分を調べる、といったことができ、もうこの機能なしには生きていけなくなる。差分モードは使わないという方も、こういった機能があることは覚えておいて損はない。いつか必要なときがやってきたとき、便利な味方になってくれるはずだ。

本連載で使っている~/.vimrcファイル

本連載で使っている設定ファイル(~/.vimrc)は以下の通りだ。

"dein Scripts=============================
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=~/.cache/dein/./repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('~/.cache/dein/.')
  call dein#begin('~/.cache/dein/.')

  " Let dein manage dein
  " Required:
  call dein#add('~/.cache/dein/./repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here
  call dein#add('junegunn/seoul256.vim')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')
  call dein#add('preservim/nerdtree')
  call dein#add('tpope/vim-commentary')
  call dein#add('tpope/vim-fugitive')
  call dein#add('fholgado/minibufexpl.vim')
  call dein#add('dense-analysis/ale')
  call dein#add('junegunn/fzf', {'build': './install --all'})
  call dein#add('junegunn/fzf.vim')
  call dein#add('sheerun/vim-polyglot')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

" seoul256
let g:seoul256_background = 233
colo seoul256

" vim-airline
let g:airline_powerline_fonts = 1
let g:airline_theme = 'molokai'

" NERDTree
"  <C-o> open NERDTree
nnoremap <silent> <C-o> :NERDTreeToggle<CR>

" minibufexpl
nnoremap <silent> bn :<C-u>:bnext<CR>
nnoremap <silent> b1 :<C-u>:b1<CR>
nnoremap <silent> b2 :<C-u>:b2<CR>
nnoremap <silent> b3 :<C-u>:b3<CR>
nnoremap <silent> b4 :<C-u>:b4<CR>
nnoremap <silent> b5 :<C-u>:b5<CR>
nnoremap <silent> b6 :<C-u>:b6<CR>
nnoremap <silent> b7 :<C-u>:b7<CR>
nnoremap <silent> b8 :<C-u>:b8<CR>
nnoremap <silent> b9 :<C-u>:b9<CR>

" fzf
nnoremap <silent> fzf :Files<CR>
nnoremap <silent> ls :Buffers<CR>

"End dein Scripts=========================

set number
syntax on
set whichwrap=b,s,[,],<,>,~,h,l
set cursorline
set incsearch
set hlsearch
set ignorecase

付録 chrisbra/csv.vim 操作・設定方法まとめ

コマンド 内容
CSVWhatColumn カーソルが何列目にあるか
CSVWhatColumn! 同列1行目の内容を表示
CSVNrColumns 最大列数を表示(先頭から10行で判断)
CSVSearchInColumn /パターン/ 現在の列をパターンで検索
CSVSearchInColumn 列番号 /パターン/ 指定した列をパターンで検索
CSVHiColumn 現在の列を強調表示
CSVHiColumn 列番号 指定した列を強調表示
CSVHiColumn! 列の強調表示を解除
CSVArrangeColumn テーブル形式での表示へ切り替え(実験的機能)
CSVTabularize テーブル形式でのプレビュー表示
CSVDeleteColumn 現在の列を削除
CSVDeleteColumn 列番号 指定した列を削除
CSVHeader 1行目を別ウィンドウで表示
CSVHeader 行数 先頭から指定行数分を別ウィンドウで表示
CSVHeader! 開いた行ヘッダウィンドウを閉じる
CSVVHeader 1列目を別ウィンドウで表示
CSVVHeader 列番号 行頭から指定列数分を別ウィンドウで表示
CSVVHeader 開いた列ヘッダウィンドウを閉じる
CSVSort 現在の列でファイルをソート
CSVSort 列番号 現在の列でファイルをソート
CSVSort! 現在の列でファイルを逆順にソート
CSVSort! 列番号 現在の列でファイルを逆順にソート
CSVColumn 現在の列をコピー
列番号CSVColumn 指定した列をコピー
CSVMoveColumnor 現在の列を最後の列の右側へ移動
CSVMoveColumn 列番号 列番号 最初に指定した列を、2つ目に指定した列の右側へ移動
CSVSumCol 現在の列の合計を出力
CSVSumCol 列番号 指定した列の合計を出力
CSVSumRow 行の合計を出力
CSVNewRecord 新しい行を作成
CSVNewDelimiter デリミタ 区切り文字を変更
CSVConvertData データをほかの形式に変換
CSVDuplicates 列番号 指定した列で重複している行を出力
CSVAnalyze 現在の列を分析する(値とその数、割合など)
CSVAnalyze 列番号 指定した列を分析する(値とその数、割合など)
CSVVertFold 1列目から現在の列を折りたたむ
CSVVertFold 列番号 1列目から指定した列までを折りたたむ
CSVVertFold! 列の折りたたみを解除する
CSVTranspose 列と行を入れ替える(転置)
CSVAddColumn 現在の列の右側に新しい列を追加
CSVAddColumn 列番号 指定した列の右側に新しい列を追加
CSVDupColumn 現在の列を右側に複製
CSVDupColumn 列番号 指定した列を右側に複製
CSVSubstitute 列番号/パターン/文字列/ 指定した列で置換
CSVColumnWidth 列ごとの最大文字数を出力
CSVCountCol 現在の列内の値の数を出力
CSVCountCol 列番号 指定した列内の値の数を出力
CSVMaxCol 現在の列内の最大値を出力
CSVMaxCol 列番号 指定した列内の最大値を出力
CSVMinCol 現在の列内の最小値を出力
CSVMinCol 列番号 指定した列内の最小値を出力
CSVAvgCol 現在の列内のデータの平均値を出力
CSVAvgCol 列番号 指定した列内のデータの平均値を出力
PopVarCol 現在の列の母集団分散を出力
PopVarCol 列番号 指定した列の母集団分散を出力
SmplVarCol 現在の列の標本分散を出力
SmplVarCol 列番号 指定した列の標本分散を出力
PopStdCol 現在の列の母標準偏差を出力
PopStdCol 列番号 指定した列の母標準偏差を出力
SmplStdCol 現在の列の標本標準偏差を出力
SmplStdCol 列番号 指定した列の標本標準偏差を出力
移動キー 内容
Ctrl-→ 右の列へ移動
L 右の列へ移動
W 右の列へ移動
Ctrl-← 左の列へ移動
E 左の列へ移動
H 左の列へ移動
列を上へ移動
K 列を上へ移動
列を下へ移動
J 列を下へ移動
フィルタキー 内容
↩️ 現在の列と一致しないすべての行を動的に折りたたむ
Space 現在の列と一致するすべての行を動的に折りたたむ
BS 動的フィルタから最後のアイテムを削除
設定項目 内容
g:csv_delim デフォルトのデリミタ
g:csv_no_conceal 1に設定するとデリミタ部分を|で視覚的に表示(デフォルトは設定されていない)
g:csv_highlight_column ‘y’に設定するとカーソルがある列を自動でハイライト
b:csv_headerline ヘッダの行数を指定。0を指定するとヘッダとしてのハイライトが行われなくなる