これまでCSVを扱うプラグインとして「chrisbra/csv.vim」を取り上げてきた。chrisbra/csv.vimが提供している機能はほぼ網羅的に説明できたのではないかと思う。これまでに取り上げた機能を使うだけでも、CSVデータに対してかなりさまざまな操作を行うことができる。CSVを扱うことが多い方には、ぜひとも使ってほしいプラグインだ。

後は、利便性を引き上げるために自分向けの設定や、新しいカスタム機能の作成などを行うことになるだろう。今回と次回は、chrisbra/csv.vimの設定ファイルの書き方を説明していくので、参考にしていただきたい。

拡張子を増やす

chrisbra/csv.vimは、デフォルトでは「.csv」をはじめとするいくつかの拡張子に対して機能するようになっている。設定されていない拡張子では、chrisbra/csv.vimは起動しない。例えば、ファイルの拡張子が大文字になっているケースなどがこれに該当する。システムによっては、データが含まれたファイルの名前が「.CSV」のように全て大文字になっていることもあるだろう。ファイルを編集する前にファイル名を変更すればよいのだが、ファイル名を変更すると後々ファイルを参照するときに逆に不便になることも多く、できれば元のファイル名のまま使いたい。

こうしたケースでは、「.CSV」もchrisbra/csv.vimで処理できるように以下のような設定を追加すればよい。

autocmd BufNewFile,BufRead *.CSV let b:csv_headerline=0
autocmd BufNewFile,BufRead *.CSV set filetype=csv

「autocmd BufNewFile,BufRead *.CSV set filetype=csv」の設定で.CSVがchrisbra/csv.vimで処理されるようになる。もうひとつ注目しておきたいのが「autocmd BufNewFile,BufRead *.CSV let b:csv_headerline=0」だ。

chrisbra/csv.vimでは1行目はヘッダとして処理される。データではなく「フィールド名が収められた行」という扱いだ。これでシンタックスハイライトが行われるようになり、ヘッダとして認識しやすくなる。上記設定はこれを解除して、1行目もデータとして扱うという指定である。CSVファイルは1行目がヘッダではなくデータ行になっていることも多い。この辺りの設定は、利用状況に応じて変えればよいのだが、1行目がヘッダではないデータを扱うことが多いのであれば、あらかじめこの設定を加えておくとよいだろう。

スペース区切りファイルを対象とする

CSVファイルはカンマ「,」でフィールドが区切られているわけだが、CSV系列のテキストファイルでは必ずしもカンマが区切り文字になっているとは限らない。ほかによく使われる区切り文字としては、スペースなどがある。

スペース区切りのCSV的なデータはSSVファイル(Space-Separated Values)と呼ばれることがあり、拡張子は「.ssv」または「.SSV」となる。「それらの拡張子の場合は空白区切りのCSVファイルである」と設定しておけば、chrisbra/csv.vimを利用できるようになる。

具体的には、次のような設定を追加すればよい。

autocmd BufNewFile,BufRead *.SSV let g:csv_delim=' '
autocmd BufNewFile,BufRead *.SSV let b:csv_headerline=0
autocmd BufNewFile,BufRead *.SSV set filetype=csv

autocmd BufNewFile,BufRead *.ssv let g:csv_delim=' '
autocmd BufNewFile,BufRead *.ssv let b:csv_headerline=0
autocmd BufNewFile,BufRead *.ssv set filetype=csv

基本的には「.CSV」を使用できるようにする記述と同じだが、「autocmd BufNewFile,BufRead *.SSV let g:csv_delim=’ ‘」という設定が追加されている点がポイントだ。「let g:csv_delim=’ ‘」の設定でデリミタ(区切り文字)をスペースに設定している。これで、後はchrisbra/csv.vimが適切に処理を行ってくれるようになる。

カンマ区切り以外のデータに関してもchrisbra/csv.vimで処理できるようになるとかなり便利だ。ほかの文字をデリミタにしたければ、上記の設定でスペースを指定している部分を、任意の文字に変えて設定してもらえればよい。Linux系の設定ファイル、特に古い形式のテキストファイルは特定の文字がデリミタになったものがいくつも存在しており、そうしたファイルを扱う際などには有用だろう。

スペース区切りファイルを対象とする(ヘッダあり版)

CSVデータは1行目からデータになっていることも多いが、当然ながら1行目にはフィールド名というか、いわゆるヘッダデータ的なものが入っていることもある。こうしたデータは、よく拡張子として「.tag」または「.TAG」が使われる。1行目がタグ(ヘッダ)になっており、2行目以降がデータ、そしてデータはスペース区切りというパターンだ。

そうしたケースでは、次のような設定を追加すればよい。

autocmd BufNewFile,BufRead *.TAG let g:csv_delim=' '
autocmd BufNewFile,BufRead *.TAG set filetype=csv

ポイントは「.ssv」や「.SSV」の設定の際に記述していた「autocmd BufNewFile,BufRead *.ssv let b:csv_headerline=0」がない点だ。これで1行目がヘッダと認識され、データ行とは別のハイライトが行われるようになる。

タブ区切りファイルを対象とする

スペース区切りCSVファイルの応用の一つとして、デリミタがタブになっているケースも扱っておこう。こうしたファイルはTSV (Tab-Separated Values)ファイルと呼ばれている。拡張子は「.tsv」や「.TSV」が使われることが多い。

タブ区切りのデータファイルは実は人間がデータを入力するにあたって便利な方式だったりする。特にレコードの値が8文字未満であるようなケースでは、タブ区切りのデータの作成は見た目的にもスプレッドシートアプリケーションのように縦横が揃った表示になりやすく、人間に優しい。

こうしたケースでは、次のような設定を追加すればよい。

autocmd BufNewFile,BufRead *.TSV let g:csv_no_conceal=1
autocmd BufNewFile,BufRead *.TSV set tabstop=20
autocmd BufNewFile,BufRead *.TSV set filetype=csv

autocmd BufNewFile,BufRead *.tsv let g:csv_no_conceal=1
autocmd BufNewFile,BufRead *.tsv set tabstop=20
autocmd BufNewFile,BufRead *.tsv set filetype=csv

上記設定には「autocmd BufNewFile,BufRead *.ssv let b:csv_headerline=0」が含まれていない。つまり、1行目はヘッダとして扱う内容になっている。

「autocmd BufNewFile,BufRead *.TSV set tabstop=20」はタブの表示を空白20文字分にするという設定だ。タブはデフォルトでは8文字分に設定されていることが多いが、現在のスクリーンサイズではもっと長くしてもあまり問題がないため、ここでは20文字分まで広げている。この部分はスクリーンサイズや好みに合わせて変えてもらえればよいだろう。

「autocmd BufNewFile,BufRead *.TSV let g:csv_no_conceal=1」という設定にも注目したい。これはデリミタを「|」で視覚的に表示させない、という設定だ。chrisbra/csv.vimはデフォルトではレコードの区切りを「|」で強調表示する。タブ区切りの場合はタブで区切って表示してくれたほうが見やすいので、この機能を無効にするわけだ。

動作の違いを見てみよう。まず、chrisbra/csv.vimを使わない状態でTSVファイルを開いてみる。

chrisbra/csv.vimを使わないでTSVファイルを開いたところ

データがタブ区切りになっていること、タブは8文字分で展開されていること、などが確認できる。全く同じデータをchrisbra/csv.vimを効かせた状態で開くと次のようになる。

chrisbra/csv.vimを使ってTSVファイルを開いたところ

chrisbra/csv.vimを有効にすると、タブ区切りのファイルだが「|」による強調表示に切り替わっていることがわかる。これはこれで便利ではあるのだが、できればタブはタブとして表示してもらったほうが便利なことが多いように思う。これを先ほどの設定を効かせた状態で開くと次のようになる。

chrisbra/csv.vimでカスタム設定を効かせた状態でTSVファイルを開いたところ

カスタム設定を効かせたことで、表示がタブに切り替わったほか、タブの表示が20文字分に拡大されていることが確認できる。こうなっていると人間が視覚的に認識しやすい。自分の好きなようにカスタム設定を加えるだけで、とても扱いやすくなる。

自分向けの設定で快適度をアップ!

今回説明したカスタム設定をまとめると次のようになる。

autocmd BufNewFile,BufRead *.CSV let b:csv_headerline=0
autocmd BufNewFile,BufRead *.CSV set filetype=csv

autocmd BufNewFile,BufRead *.SSV let g:csv_delim=' '
autocmd BufNewFile,BufRead *.SSV let b:csv_headerline=0
autocmd BufNewFile,BufRead *.SSV set filetype=csv

autocmd BufNewFile,BufRead *.ssv let g:csv_delim=' '
autocmd BufNewFile,BufRead *.ssv let b:csv_headerline=0
autocmd BufNewFile,BufRead *.ssv set filetype=csv

autocmd BufNewFile,BufRead *.TAG let g:csv_delim=' '
autocmd BufNewFile,BufRead *.TAG set filetype=csv

autocmd BufNewFile,BufRead *.TSV let g:csv_no_conceal=1
autocmd BufNewFile,BufRead *.TSV set tabstop=20
autocmd BufNewFile,BufRead *.TSV set filetype=csv

autocmd BufNewFile,BufRead *.tsv let g:csv_no_conceal=1
autocmd BufNewFile,BufRead *.tsv set tabstop=20
autocmd BufNewFile,BufRead *.tsv set filetype=csv

こうした設定はchrisbra/csv.vimを使ってファイルを開いた後に変更することもできる。しかし、あらかじめ設定ファイルに書いておき、ユーザーが開いた段階で使えるようにしておいたほうがよいと思う。この手の設定は忘れやすいし、ファイルを開いてから設定を変更するのはあまり効率が良いとは言えないからだ。

なお、上記の設定はそれほど汎用的なものではないので、chrisbra/csv.vimを使う際の参考程度に留めてもらえればと思う。

本連載で使っている~/.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を指定するとヘッダとしてのハイライトが行われなくなる