読者です 読者をやめる 読者になる 読者になる

vimで選択しているcsvカラム列をハイライトするスクリプトを書いた

昨日の続きでもあるんですけど、csvファイルを閲覧・編集する時はエディタで見ます。
私の場合はもちろんvimvimwiki*1にて紹介されているCSVハイライト表示機能をよく使います。

使い方は簡単で列index値を指定するだけです。

:Csv 2

そうするとこんな感じでハイライト表示されます。

"国語","数学","理科","社会"
100,70,85,90


だけどすごく面倒なところもあって、使用する時にカラム数が多いといちいち数えてられません。

そこでちょっとしたスクリプトを書いてみました。

選択したカラムをハイライトするスクリプト

下記のスクリプトをvimrcに貼り付ければカラム名を選択して「,hc」でハイライト表示できるようになります。
Vim-Rubyも交えて書いたので、vim-rubyオプションでvimコンパイルされている事が条件です。


コードはへぼへぼでちょっと恥ずかしい。


Csvモジュール使ってパースした方が、良かったかなぁ。


そんな感じでお気楽にCSVハイライト表示ができるようになって、ちょっとLife Changingできたかも。

【コード】

"------------------------------------------------
" CSVのハイライト表示
" @see http://www.vim.org/tips/tip.php?tip_id=667
"------------------------------------------------
" csv の特定のカラムをハイライト (put in .vimrc)
" 使い方↓↓
" :Csv 5                            : 5番めのカラムをハイライト
function! CSVH(x)
	execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
	execute 'normal ^'.a:x.'f,'
endfunction
command! -nargs=1 Csv :call CSVH(<args>)

"-----------------------------
" カラム名からIndex値を取得する
"-----------------------------
function! CsvCol2Index(colName)
ruby << EOF
colName = VIM::evaluate("a:colName")
columns = eval("[" + VIM::Buffer.current.line + "]")
colIndex = columns.index(colName)
colIndex = -1 unless colIndex 
VIM::command("return '" + colIndex.to_s + "'")
EOF
endfunction

"------------------------------------------------
"選択中のCSVカラムをハイライトする
"------------------------------------------------
function! SelectCsvH()
	"最後のヤンクを保管しておく
	let tmp = @"
	"現在選択中のテキストを取得する
	normal! gv"ty
	"取得した結果を変数に格納する
	let seltext=@t
	let columnNumber = CsvCol2Index(seltext)
	if columnNumber >= 0
		let result = CSVH(columnNumber)
	else
		echo "対象のカラムは存在しません"
	endif
	"最後のヤンクを書き戻す
	let @" = tmp
	let @/ = seltext
endfunction

" 選択中のCSVカラム名の列をハイライト表示する
vmap <silent> ,hc :call SelectCsvH()<CR>

*1:ソース元はvim.orgのTips