vimで選択しているcsvカラム列をハイライトするスクリプトを書いた
昨日の続きでもあるんですけど、csvファイルを閲覧・編集する時はエディタで見ます。
私の場合はもちろんvimでvimwiki*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>