これたで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を指定するずヘッダずしおのハむラむトが行われなくなる