愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

Vim テキストオブジェクトの深淵

*エントリーに直接タグを書くというマジでバカなことをしてしまった。


うみねこ早くプレイしてー

縁寿は俺の嫁ー


とか置いといて

今日はVimperatorでなくてVimのことでも書こうかね。我らが愛する魔法のエディタさ。



Vim7? くらいになってからテキストオブジェクトなる機能が導入されたのだけども

そのままだとコレ、あまり役に立たないんだよね。



例えば、:mogi => "in*c*hiki yarou" に対して (*a* は通常モードでaの上にカーソルがある状態を示す)


di" で ""(ダブルクォーテーション)の内側のテキストだけを消すとか

da" で ""も含めた全体を消すとか

ci" で "" の内側のテキストを消して挿入モードに入るとか


はデフォルトの状態でもできるけど。要は、i(囲み記号)で囲み記号の内側のテキスト、a(囲み記号)で囲み記号を含めた全体を範囲指定できるってことね。



これだとあまりオーッて感じにはならないのよねえ〜

例えば一つ目のやつなら bdwdw とか bdt" で代用できちゃうからね。

つまり、「もう囲んであるもの」をチョメチョメするだけなら既存のコマンドで結構代用が効いてしまうんだよね。





ハイそこで奥さんこれを使いましょう

http://www.vim.org/scripts/script.php?script_id=1697


Vimのプラグイン、surround.vimです。



これが何をするかってえと、要は、aとi以外にも、s(囲み記号)でテキストの「周り」を表現できるようになるってこった。


例えば "oppai" という文字列がここにあったとしようか。んでもってカーソルもそいつのどこかにあるとしよう。

さらに例えば何かの事情で、この文字列を囲んでいる""を、''にしたいとしようか。


君ならどうする? ナニ、jやkで移動してrで置き換える?駄目だな。全然駄目。メモ帳(笑)でも使ってなさい。

vで範囲選択して置換する?うん、ちょっとめんどくさいな。



surround.vim 使いであるあなたはこうすべきだ

cs"' (意味: c = 置き換えよ s" = 囲っている"を ' = 'に)


oppaiを""の中から自由にしたい場合はこうする

ds"



今までの操作は「既に何かに囲まれているテキスト」に対するものだけども、既存のテキストを何かで「囲む」のもカンタンにできるようになる


たとえば、 oppai を[]で囲みたい場合は

ysw[

これちょっと分かりにくいんだけど、ysを一つの「囲み生成」コマンドとしてとらえるといいかもしれない。その次にはいつも通り範囲選択のwやfやtやその他を続けて、その次に囲み記号を入力する。


てなわけでご推察通り、行全体を()で囲みたい場合は、

yss(

になる。



さらにさらに、実はこれ、xmlやhtmlのタグにも使える。


例えば君がoppaiを強調したいとしようか。いいね。いいことだ。

その場合はこうすることで、oppai →<em>oppai</em> という入力が行われる

yswt<em>


ちなみに最後の>は入力せずにEnterしてもいける。

タグを消したい場合は

dst

別のタグで置き換えたい場合は

cst

でいける。


シェフのおすすめ。ぜひお試しあれ。



なんかテキストエディタの話だから、あんま派手さがないね。入れたプラグインも一つだし。

まあブラウザとシェルとエディタはいわば「三種の神器」だから、ギンギンにさりげなく磨き上げておきたいところ。

次はもうちょっとライトな話題でも。デスノの話題とか?ぷっくくく。