vimで選択範囲を置換
うわーん。これやりかたかったんだよー!知らなかったよー!
同じネタを説明しても面白くないので、今日はビジュアル選択後に行うアクションについて...「'<'>」の後には、「s(substitute)」だけでなく「g(global)」や「v(vglobal)」を書く事もでき、行単位でのビジュアル選択(正式にはlinewise-visual選択)を行った行に対して絞込みを行い、その上で置換を行う事も出来ます。
例えば
問題こんなテキストならば、「( )」が付いている行を選択して
※以下の阿藤について間違っている物に×を入れよ
( ) 俺は阿藤会だ
( ) 俺こそ阿藤下位だ
( ) 僕も阿藤回だ
( ) リッチに阿藤買いだ
( ) 実は私の従兄弟が阿藤快だ
( ) 叔父が阿藤飼いだ
( ) 海で阿藤貝を拾った
( ) お前、阿藤甲斐性あるな
:'<,'>v/阿藤快/s/( )/(×)/gでおしまい。
※「:」を押した時点で「'<,'>」は補完されます。
また、例えばテキストファイルに書かれた以下の様なスケジュール一覧があったとします。
予定表昼休憩の後に項目番号4として「13:30 来客予定」を入れたくなったらどうしますか?
1. 09:00 出社
2. 10:00 会議(午前の部)
3. 12:00 昼休憩
4. 13:00 会議(午後の部)
ここで仕様を煮詰める
5. 16:00 内部ミーティング
6. 16:30 資料作成
7. 17:30 客先にて打ち合わせ
4から7までを一つずつ足して行きますか?
vimなら4で始まる行から7で始まる行までを選択して
:'<,'>g/^\d/exec "normal 0\<c-a>"とすれば4以降が1個ずつずれるので、5の上から4で書き始めればよいのです。
さらに会議(午後の部)の開始が1時間が遅れるとなった場合、「13:00」を含む行から「17:30」を含む行まで選択して
:'<,'>g/^\d/s/\(\d\d\):/\=printf("%02d:", submatch(1)+1)/でおしまい。
※printf()はvim7でしか動きません。
vimってパズルみたいで面白いですよね。方法はこれだけでなく、人によっては私よりも手数の少ない方法を使われる方もいます。
凝ると色んな事が出来ますので、皆さん凄いの見つけたら教えて下さいね。





![Validate my RSS feed [Valid RSS]](http://mattn.kaoriya.net/images/valid-rss.png)

