ここでは,指定した部分を別の場所にコピーしたり,移動させたりする手段となる
コマンドの基本を解説します
解説の前に,次の操作を実際にやってみて下さい
まず,何か文章の書かれている行にカーソルを移動させてから dd コマンド
でカーソルの行を削除します. そして,2〜3行上下の行に移動してから
を押します. すると,さっき削除した内容がカーソルの下の行に書き出されます
もう一度 p を押すと, また同じ内容が書き出されますね
この操作が「書き出し」です. では,詳しく解説します
削除コマンドで削除された内容は,表示からは確かに消えてなくなりますが,
実はしばらくの間は, コンピューターの内部のメモリに記録されているのです. この内部のメモリ
のことを 無名バッファ または 一時バッファと呼びます. Mac
やWindowsの操作を知っている人は,「クリップボードに内容を入れる」のと
同じような概念だと思って下さい
つまり,JVimで削除操作が行われると指定した領域のテキストの削除が行われると
同時に削除されてテキスト内容は 一時バッファにコピーされるというわけです. でも,
別に外見に変化が起きるわけじゃないので, 一時バッファの存在なんて
見た目には全然わかりませんよね
さて,この「一時バッファ」の内容を書き出すのが p コマンドです. 書き出し
操作(Put)をしても, 一時バッファの内容は消えるわけじゃなくて
そのままですから, 何度 p を押しても
その都度同じ文字が書き出されます
この仕組みがわかれば,これだけでも結構使えます. 削除操作であれば
dd に限らず,直後の p コマンドで好きな場所に
何度でも削除した内容をコピーできます
のような「文字単位」で削除された内容は, p コマンドでも
カーソル位置の「文字」の後ろに書き出されます
のような「行単位」で削除された内容は, p コマンドでも
カーソル位置の「行」の後ろに書き出されます
大文字の P というコマンドは, p とは逆に
カーソルの「前」や「前の行」に書き出されます
一時バッファの内容は, 削除コマンドが実行されるごとに内容が最新の削除内容に
入れ替わります . また,「変更」コマンドによってもテキストは削除されますから
この時の内容でも 一時バッファの内容は更新されます
削除と書き出しの組み合わせで, テキストの移動ができます. 好きな領域を削除してから,
別の場所にカーソルを移動させ, p または P を打てばテキストの
移動をしたことになります. いくつか例を書きます
とすると,カーソル位置と次の文字を入れ換えます. x で削除した文字を,
p でカーソルの後ろに書き出すからです
ddp ならば, カーソル位置の行と次の行を入れ換えます
最初の dd で削除した行を p でカーソル行の後ろに書き出すからです
また,一度削除によって 一時バッファにとりこまれた文字列は, 何度でも
p や P で書き出し可能ですから, 文章のいろいろな場所に移動して
書き出しまくってもOKです
文字を削除せずに 一時バッファにテキストを入れることもできます
これを Yank (「ヤンク」と読む)操作といいます. Yank操作は, 指定した範囲を
一時バッファにコピーだけをする操作なので見た目には何にも変化が起こりません. Yank
のコマンドは yですが, 削除や変更と同様に後ろにカーソル移動コマンドを打つと
カーソル位置から移動予定地までの範囲を Yankします. たとえば
であれば「カーソル位置から行末までをYank」します
なら「カーソル以下の50行をyank」です
なら「カーソルの後ろの"."が現れる行内の場所まで」です
なら「カーソルの後ろに"abc"という文字列が見付かる場所まで」です
Yank対象範囲の指定方法は,このように他の削除や変更コマンドと同じなので
あまりたくさん例を示さなくても分かると思います. このようにして
yankされた文字列は, 直後の p や P コマンドで好きな場所に
コピーできるというわけです
Yank操作も,特に使用頻度が高い操作は,簡単なキー操作で実行できるように
特別にキーが割り当てられています
yy は「カーソルのある行全体を」Yankします. Y も同様です
数値をつけて 6yy や 90Y などとすれば, カーソル以下
の6行とか90行をひとまとめにYankします. これは非常によく使う操作
となるはずですので,早めに慣れましょう
YankやPut操作で,日常的によく使われそうな例を以下に書きます
で,現在行のコピーをカーソルの下に作ります. 行をコピーして使うことは
良くあると思います
yypppppp のように p を連打すれば, 同じ内容の行をいくらでも作れるので
似たような内容の行がたくさんある時には, 最初にこうやって
たくさんコピーしてから,違う部分だけを後から変更していけば楽です
ならば,カーソル位置の文字をもうひとつカーソルの後ろに出します
yw で, カーソルが単語の先頭にいれば 「カーソル位置の単語のコピー」ですが, カーソルが単語の先頭にいない場合は byw というように, 最初に b コマンドで単語の先頭に戻る必要がありますね
あと,知っていると良いのは
yyによってYankされた行を書き出すと,「カーソルの次の行」に書き出されますが, 同じ「一行まるごと」のYankでも
0y$
つまり,行頭で y$ としてYankすれば,「カーソルの後ろ」に挿入するように
書き出されます. よって,書き出す時にどのように使うのかによって
yy にするか 0y$ にするかを使い分けるようにするだけでも
快適さが違います. もちろん,削除コマンドなどでも同様のことが言えます
移動コマンドやコピー関連の機能は,実はもう少し高度なコマンドがいくつか
あります. 複数ファイルの間でテキストを移動したりコピーすることも可能ですし
「一時バッファ」以外にも,テキストを記録しておく見えないメモリ上の場所が
あって,それらも活用できます. また,直前だけじゃなくて,もっと過去に削除した
文字列も取り出して書き出すことが(じつは)できます
このような高度な機能については, 別文章「名前つきバッファや履歴バッファの活用」で
解説していますので, ここに書いてある基本操作に慣れてきたら,
そちらも参照してみて下さい