通常コマンドの適用範囲の指定は,移動コマンドを打ちますが,ちょっと 複雑な範囲
を指定しようと思うと難しい 場合もありますよね. こんな時はマーク機能を
使うのも有効ですが,JVimにはカーソルを移動させながら反転表示を拡大縮小させ
ながら範囲を決めるという機能もあるのです. これを Visualな範囲指定などと
呼びます. この機能についての解説をします
何かテキストファイルを開いてから v を押して後, カーソルを ちょっと移動させてみましょう. v を打った時のカーソル 位置から新しいカーソル位置までの範囲 が反転表示されると思います. この時は 自由に何度でもカーソルを移動させながら範囲が拡大 縮小します. 範囲を決めたらそのまま
d
を押せば,その範囲を削除します
他にも,変更,Yank,大文字小文字の入れ換え,インデント操作,任意のExコマンド
や,外部フィルタの適用など,ほとんどの操作対象となる範囲を決めるのに使うこ
とができるのです
通常の「移動コマンド形式による範囲指定」でも,「 文字単位 での範囲」あるいは
「 行指向 (linewise)での範囲」の二種類の範囲の性質がありましたが,
Visual指定でも,どちらの方式にするかを選べます
範囲指定開始の時に v ならば,文字単位での指定となり V ならば,
行指向での範囲指定となります. さらに,Visual範囲指定特有の性質として,
CONT-V で範囲指定を開始すると, ブロック指向(blockwise) と
いう特別な範囲指定ができます. これは,実際にやってみるとわかりますが,
カーソル位置から矩形に範囲を選択するようになります. 表のようなものの部分を
切り貼りするのに便利そうですね
ただし,端末やその設定によっては,反転表示されない場合もあるようです
その場合は「選択開始位置からカーソル位置からまでの範囲」が反転選択されている
ような気分になって(?)この解説文を読んで下さい. なお,実際に
反転表示されていなくても,機能自体は正常に使えますので心配は無用です
反転表示中に o を押すと, 開始地点とカーソル位置が入れ替わって,
逆方向に範囲を拡大縮小できます
また,範囲指定(反転)中に vなどの範囲指定開始コマンドを押すと,指定することを
中断します. 間違って v などのキーを押してしまったら,もう一度 v を押せば
よいのです. またはエスケープキーなどでも反転を解除できます
ブロック単位の範囲指定は,ちょっと特殊な特徴があるので説明します
基本的には,選択開始位置とカーソル位置を対角線とするような矩形部分が選択
されますが, $ を押せば, カーソルよりも後ろにある文字も ,
範囲内の行であればすべて選択状態にできます. これを知らないと,
選択末尾の行が他よりも短い時に困りますよね
また,ブロック単位で削除やYankしたものをPut(書き出し)する時も,ブロック単位で
Putされますので注意して下さい. どのようにPutされるのかはちょっと慣れが
必要かも知れません
ちなみに,ブロック単位での指定は,Visual範囲指定だけででき,
いわゆる標準Viには存在しない機能なので,この機能に慣れすぎると,普通のViを
使わなければならなくなった時にちょっと困るかも
たとえば,反転部分を操作中でも CONT-G などとしてカーソル位置
の情報を見ることができます が, 削除やExコマンドを
反転中に関係なく使うことは(そりゃ〜)無理です
削除するには,(さっきの例で書きましたが)
[Visual操作をしてから]d
です
のように大文字にすると,「どんな場合でも必ず行指向」でコマンドが作用します
名前つきバッファに削除内容をいれたい場合は
[Visual操作をしてから]"xdとか
[Visual操作をしてから]"xD
です. x の文字の部分は 実際には名前付きバッファの名前が入ります
Yankも削除とほとんど同様に
[Visual操作をしてから]y
です
のように大文字にすると,「どんな場合でも必ず行指向」でコマンドが作用します
名前つきバッファを使うなら
[Visual操作をしてから]"xy や
[Visual操作をしてから]"xY です
変更操作も同様に
[Visual操作をしてから]c[Visual操作をしてから]r
[Visual操作をしてから]s
です. c , r , s のどれでも効果は同じです. 一番覚えやすいものを使いましょう
[Visual操作をしてから]R
[Visual操作をしてから]S
のように大文字のコマンドを打った場合は
範囲の指定の方式に関係なく「必ず行指向で」コマンドが働きます
変更時に削除されたテキストを名前付きバッファにいれたいのであれば
[Visual操作をしてから]"xc[Visual操作をしてから]"xr
[Visual操作をしてから]"xs
[Visual操作をしてから]"xC
[Visual操作をしてから]"xR
[Visual操作をしてから]"xS
というように使います
選択範囲内部にあるアルファベットの大文字と小文字の変換もできます
ならば,範囲内の大文字と小文字をすべて逆にします
ならば,範囲内の英文字をすべて大文字に
[Visual操作をしてから]u
ならば,範囲内の英文字をすべて小文字にします
とすると,範囲内のすべての行を一行に連結します
[Visual操作をしてから]>
といった操作で,選択範囲の行全体のインデント量を浅くしたり深くしたりできます
とすると,通常のExコマンドを打つ時と同様に,画面の最下行に入力が移りますが
指定した範囲が自動的に入力された状態になっています. もともとExコマンドは
行単位でしか作用しないので,Visual範囲指定を使っても
必ず行指向でしかコマンドは使えないことに注意して下さい
Exコマンドと同様に
[Visual操作をしてから]!
とすると,Exコマンドの解説と同様に外部のプログラムフィルタが簡単に使えます. これも
行指向でしか使えないので注意
特別なコマンドとしては
[Visual操作をしてから]=
とすると,あらかじめ equalprg で指定しておいた外部のプログラムをフィルタと
して使えます
例えば V コマンドで三行分を選択して d で削除した場合, その直後に (移動してもかまわないけど) . (ピリオド)を打つと, カーソル位置から「直前と同じく三行分を削除」します. このように 他のコマンドと同様, . コマンドによってコマンドの繰り返しが できます. この時の挙動は,「同じ範囲に同じコマンドを適用」します
この繰り返し時の適用範囲を詳しく解説すると…つぎのようになります
V によって行単位でVisual選択した場合は
… 直前の操作の時と同じ行数を選択して使います
CTRL-V によって矩形単位でVisual選択した場合は
… 直前に選択した行数と桁数の両方ともが同じとなる領域を選択して使います
v による 一行以内での 文字単位選択をしていた場合は
… 直前に選択した文字数を選択して使います
v による文字単位選択を 複数行に渡る ようにした場は
… 直前に選択された行数と最終行の文字数を使います