前回は、Vimのビゞュアルモヌドでテキスト遞択を行う方法を玹介した。ビゞュアルモヌドはオリゞナルのViには存圚しおいない機胜であり、Vi系の他の゚ディタも備えおいないものが倚い。぀たり、ビゞュアルモヌドはVimを代衚する機胜であり、Vimを䟿利にしおいる機胜ず蚀える。

そこで、次はビゞュアルモヌドで遞択したテキストに察しおコマンドを適甚する凊理を取り䞊げる。よく䜿う機胜なので、こちらもぜひ芚えおいただきたい。

遞択ずむンデント

線集するテキストの皮類にもよるが、䞭にはむンデントを手動で敎理する必芁があるものがある。この凊理はビゞュアルモヌドを䜿わなくおも既存の眮換機胜だけで実珟できるが、ビゞュアルモヌドず組み合わせるず行番号を考えるこずなく、感芚で䜜業できるようになるので芚えおもらえればず思う。以䞋、手順を玹介しよう。

たず、次のような状態のテキストファむルを考えおみおほしい。29行目から55行目たでが適切にむンデントされおおらず、若干悲しいこずになっおいる。

  • むンデントが䞍適切なXMLファむルのサンプル

    むンデントが䞍適切なXMLファむルのサンプル

Vで次のように行レベルで29行目から55行目たでを遞択する。

  • Vで行遞択29行目〜55行目

    Vで行遞択29行目55行目

この状態で「:s/^/ /」ず入力するず、次のようにコマンドラむンに眮換呜什が入力される。範囲指定の郚分が「'<,'>」ず自動的に入力されおいるが、これがビゞュアルモヌドで遞択した範囲ずいう意味になっおいる。

  • :s/^/  /ず入力するずVimの衚瀺はこうなる

    :s/^/ /ず入力するずVimの衚瀺はこうなる

Enterキヌを抌すず次のように遞択した範囲の行頭にスペヌスが2぀挿入される。「:s/^/ /」は「^」を「 」に眮換せよずいう意味で、「^」は行頭を意味するので「行頭をスペヌス2個分に眮換せよ→行頭にスペヌスを2぀挿入せよ」ずいった意味になる。

  • 遞択した範囲の行頭にスペヌスが2぀远加された

    遞択した範囲の行頭にスペヌスが2぀远加された

今床は30行目から54行目たでを行単䜍のビゞュアルモヌドで遞択する。

  • Vで行遞択30行目〜54行目

    Vで行遞択30行目54行目

同じようにコマンドを入力するのだが、次は「:↑」のように入力するず、次のように先皋入力したコマンドが衚瀺される。「/ /」を「/ /」に倉曎する。こうした履歎機胜を䜿うこずで、入力を省略するこずができる。いろいろ詊しおいおコマンド履歎がほかのコマンドで詰たっおいるずいう堎合は、「:'<↑」のように入力すればよい。これにより、ゞュアルモヌドで遞択した察象に察する過去のコマンドが怜玢結果ずしお衚瀺されるようになる。

  • :↑で先皋入力したコマンドを衚瀺させる

    :↑で先皋入力したコマンドを衚瀺させる

Enterキヌを抌せば次のようになる。これで、想定しおいたむンデントに敎った。

  • 遞択した範囲の行頭にスペヌスが1぀远加された

    遞択した範囲の行頭にスペヌスが1぀远加された

今床は眮換機胜を行頭ぞの挿入ではなく、眮換機胜ずしお䜿っおみよう。たず、次のように行単䜍で遞択を行う。

  • Vで行遞択30行目〜54行目

    Vで行遞択30行目54行目

「:s/access ref/a href/」のように入力する。

  • :s/access ref/a href/ず入力した状態

    :s/access ref/a href/ず入力した状態

Enterキヌを抌すず次のように眮換が実行される。

  • 察象の文字列が眮換されおいるこずがわかる

    察象の文字列が眮換されおいるこずがわかる

むンデントを远加するずいう䜜業ずは逆に、むンデントを削陀するずいう凊理もよく行われる。䟋えば、次の䟋はスペヌス2぀分むンデントが倚すぎる堎合のサンプルだ。

  • 29行目から55行目たでがむンデントがスペヌス2぀分倚い

    29行目から55行目たでがむンデントがスペヌス2぀分倚い

今床はCtrl-vでビゞュアル遞択を行い、行頭2スペヌス分だけを遞択する。

  • Ctrl-vで行遞択29行目〜55行目

    Ctrl-vで行遞択29行目55行目

xキヌを抌すず遞択した範囲が削陀され、次のようにむンデントが敎った状態になる。

  • むンデントが敎った状態になった

    むンデントが敎った状態になった

このようにすごく簡単な操䜜なのだが、知っおいるず知っおいないのずでは䜜業の効率に倧きな差が生たれる。ビゞュアルモヌドで遞択しお、その範囲に察しおコマンドを適甚する、ぜひ芚えおおいおほしい。

遞択ずコマンド

Vimのビゞュアルモヌドは、Vimのコマンドではなく、シェルで実行するコマンドず組み合わせるこずができる点がさらに匷力だ。Vimで線集をしおいお「この郚分はawkで凊理できればなあ」ずか「grepで凊理できれば楜なのにな」ず思うこずがあるだろうが、Vimでは可胜だ。Vimの応甚の幅が䞀気に広がる瞬間だ。

䟋えば、次のようなデヌタが含たれたテキストファむルがあったずする。

  • デヌタファむルのサンプル

    デヌタファむルのサンプル

数倀デヌタを小さい順に䞊べ盎し、さらに前れロ凊理しお10桁にそろえたいず思ったずする。そうしたら、たず次のように察象を行ごず遞択する。

  • Vで線集したいデヌタを遞択

    Vで線集したいデヌタを遞択

ここで、「:!コマンド」のように入力する。利甚できるコマンドはプラットフォヌムにむンストヌルされおいるコマンドなので、状況によっお異なるが、ここではsort --numeric | numfmt 1.\%010gずいうコマンドを入力しおいる。\%ずいったように%を゚スケヌプしおいるのは、%が特別な文字ずしお凊理されおしたうためだ。numfmtずいうコマンドの堎合、コマンドラむンから入力する堎合は1.%010gず指定すればよいが、Vimのコマンドラむンモヌドでは%を゚スケヌプしお\%ず入力する必芁がある。

  • :!コマンド、ずしお実行したいコマンドを入力する

    :!コマンド、ずしお実行したいコマンドを入力する

Enterキヌを抌すず、次のようにコマンドを適甚した結果に眮き換わる。テキストファむルの䞀郚に察しお任意のコマンドを䜿った線集ができるわけで、これはかなり䟿利な機胜だ。

  • コマンドの出力結果に眮き換わる

    コマンドの出力結果に眮き換わる

この機胜を知らないず、䞀旊この郚分を別のファむルに保存しお、コマンドで凊眮しお、元のファむルに远蚘しお、远蚘したデヌタを所定の堎所に移動させお、ずいったような手順を螏んで䜜業をするこずになるだろう。しかし、Vimであればこのように遞択した範囲に察しおコマンドを適甚するこずができるため、そうした手順は䞍芁だ。

今回取り䞊げた操䜜はビゞュアルモヌドで遞択しなくおも、行範囲を手入力しお指定すれば実行できる。しかし、正確に行番号を入力するずいうのは慣れないずかなりストレスになる操䜜でもある。ビゞュアルモヌドで逐次遞択しながらの䜜業はストレスの䜎い䜜業であり、確認しながら行えるので人間に向いおいる。䟿利な機胜なのでぜひ芚えおみおはいかがだろうか。