Y with vim

複数ファイルにまたがる文書の表記揺れを直すのに andLinux 側で grep しないとダメかなーとか思ってたんだけど、ちょっと調べたら簡単に vim でできた ( :help grep:help quickfix:help args:help argdo ) のでメモ。

  • internal grep
    • vim 自体が持っている grep 。なので platform にしばられないで使うことができる。 Windows だと KaoriYa さんとこの gvim ( http://www.kaoriya.net/#VIM ) いれればそれで OK なのでかなり楽。 :vimgrep もしくは :vim で使えるんだけど省略形が editor の名前と同じということはけっこう主要な機能として扱われているのかもしれない。
    • もちろん external grep もあって上述の KaoriYa さんとこの Windowsgvim だと findstr を使うように設定されてるんだけど、少し使ってみた限りでは日本語での使用に難があるみたいなので ( "cmd.exe /c" に日本語を渡すときに文字コードが何か悪さしてるみたいで grep したい文字列によってはうまく動かない。たぶん cmd.exe 側で cp932 を期待しているところに utf-8 だかの Unicode を渡してしまっているのが問題 ) 使い物にならないというか。まぁ internal grep で足りているし特に調べたいと思わないので放置。
    • で、 :vimgrep 正規表現 *.txt とかしても結果の最初のファイルが開かれるだけでえーこれだけー…、とか思うんだけど実は裏で QuickFix とかいうアレが飛んでたり生成されてたりもう大変 !! らしいのでそのあとで :cwindow とか打つと ( :copen でもいいけど何か引っかかったときのみ表示させるには :cwindow を使ったほうがいいらしい ) 結果の一覧が下部に表示されて j / k / <CR> / <C-w><C-w> でいい感じにアレコレできるのでイイヨイイヨーとか思うんだけど .gvimrc や .vimrc に以下の 1 行を書いとくといちいち :cwindow と打つ必要がなくなるのでもっと楽、らしい。いやよくわかってないけど。
autocmd QuickFixCmdPost vimgrep cwindow
  • 複数 file に対する置換
    • :args による file の指定と :argdo による指定された file への一括処理を使えばいいらしい。たぶん以下のような流れが正当な処理手順 ?
      1. :args ./*.txt のように :args でおおざっぱに file 指定。このとき処理対象 file のうち一番最初のものが開かれる。例外がある場合はそのあとで :argadd や :argdelete を使って細かく対象を決めればいいと思うけど先に処理対象の file をひとつの directory にまとめておいたほうが楽な気がする。
      2. :args で処理対象の確認。いま開かれている file の名前が角カッコでくくられる。
      3. :argdo %s/retrun/return/g | update とかすると一括で置換できる。 :update は変更がある場合のみ書き込むそうで ( :help update ) 。他に :argdo set fileformat=unix | update とか :argdo set fileencoding=utf-8 | update なんかは使いでがあるかもしれない。
    • update を忘れると何にもならないけど慣れてしまえばこれは楽すぎる。だれかの file すべての fileencoding を x-iscii-be とかにするイヤガラセも簡単にできてしまうわけだ。他に似ているものとして :windo や :bufdo 、最近だと :tabdo もあるけど :args & :argdo の方が楽だと思う。
    • てかあらかじめ :args で編集対象の file を絞っておいて :next ( 省略形 :n ) や :Next ( 省略形 :N ) で切り替えつつ編集する、というのが画面分割 buffer で足りない場合の伝統的な方法の気がするな。いまはタブ機能があるから別にそういうことをしなくて済むわけだけど、そこらへんを考えると別に一括で云々が便利というのは本質でない気がするというか。たぶん vim script を書くときのほうがここらへんの command を使うかもしれない。

でまぁ、表記揺れを直すのに

  1. :cd ~/work/coderepos/docs/vimperator/2.0/vimperator-help-ja/locale/ja
  2. :vimgrep カンマ ./*.txt
  3. :vimgrepadd コンマ ./*.txt
  4. どっちに統一するか決める & 一括置換して問題ないか確認
  5. :args ./*.txt
  6. :argdo %s/カンマ/コンマ/g | update

とかするわけだけど楽すぎる。何が楽かって前もって script をいれておかなくて済むのが楽だ。日本で主流の editor はどうも script の管理方法とかダメな気がしていたので default で使っていてこんなこともできねーのかうがーとかなっていたんだけどというか default でこれだけ使い勝手がよいというのは普通にすばらしい。