これまで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ファイルを開いてみる。
データがタブ区切りになっていること、タブは8文字分で展開されていること、などが確認できる。全く同じデータをchrisbra/csv.vimを効かせた状態で開くと次のようになる。
chrisbra/csv.vimを有効にすると、タブ区切りのファイルだが「|」による強調表示に切り替わっていることがわかる。これはこれで便利ではあるのだが、できればタブはタブとして表示してもらったほうが便利なことが多いように思う。これを先ほどの設定を効かせた状態で開くと次のようになる。
カスタム設定を効かせたことで、表示がタブに切り替わったほか、タブの表示が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を指定するとヘッダとしてのハイライトが行われなくなる |