名前つきバッファと履歴バッファ

「クリップボード」の活用

機能概要

JVimには文字列を入れておく「領域」がいくつかあって,一時的に任意の テキストを記憶させたり書き出したりできます
MacやWindowsの操作を知っている人なら「クリップボード」のようなものと 思って下さい

この特殊な「領域」は「バッファ」などと呼ばれ,JVimにはいろいろな種類の バッファを使い分けて活用できるのです
バッファには,どんな種類があって,どのように使うと便利なのかを解説します

名前つきバッファとは

JVimには,一時的にテキストを記憶しておける領域があって,普段のYankやPut 操作に使っている 一時(無名)バッファ も,そのひとつです. でも実は,バッファには, いろいろ種類があって,その中には 自分で名前をつけて自由に使えるバッファ も あるのです. ここに,自分で好きなようにテキストを格納したり書き出させたりでき ます. これを 名前つきバッファ といいます

バッファにつける「名前」には,英小文字の"a"〜"z"までの26種類のどれか ひとつの「一文字の名前」を指定でき,YankやPut操作の時に,名前を指定すれば その名前のバッファに内容が格納されたり,内容を書き出したりできるのです

MacやWindowsの操作を知っている人ならば,"a"から"z"までの26種類の名前のつい た「クリップボード」があって,それぞれ自由にコピー,追加コピー,カット, ペーストなどの操作ができるようなものと思えば分かりやすいと思います

たとえば,現在カーソルがある行全体を名前付きバッファ"a"に覚えておくように したいのであれば

"ayy

と打ちます. この文字列の意味は

" (バッファ名)(コマンド)

という形式で…つまり行単位のYankコマンドである yy コマンドの直前に 「二重引用符とアルファベット小文字をひとつ」打つようにすると,いつもの yy と 違って Yank内容を指定した名前の場所(バッファ)に格納 します

(コマンド)部分では実際は 「Yank」,「削除」,「変更コマンド」のいずれかを打ちます

を,バッファに格納します

いくつか例を書きます

"gdw

カーソル位置からカーソルのある単語の末尾までを削除します
その時に実際に削除された文字列は,名前つきバッファ g に入ります

"by5H

「画面に表示されている上から5行目」からカーソル位置までの領域を, 名前つきバッファ b に入れます

要するに,普段の削除やYankや変更コマンドを打つ前に

"x

という具合に("x"は名前)打てば 指定した名前がつくだけです

名前つきバッファの内容を書き出すには

p または P コマンドを知ってますよね ? 普通は「直前に削除,Yank,変更した文字列」をカーソル位置の直前や直後の文字や行に 書き出すコマンドです. このコマンドの直前に同じように名前を指定できます

"ap

とすれば,(この例なら) 名前つきバッファ a の内容をカーソル位置の後ろに書き出す ことになります. 通常のPutコマンドと同様に,格納する時に 行単位で入れたのであれば 次の行に書き出されるし,文字単位で格納したのであればカーソル文字のすぐ後ろ に 書き出されます

これにより,一度名前をつけておけば「いつでもどこでも」名前を呼び出せば書き出す ことができるわけです

また,すでに挿入モードにいる時であれば 挿入モードのまま CTRL-R を押してからバッファ名の文字を押した瞬間に 内容がカーソル位置に書き出されます
例えば 挿入中に CTRL-R a などという操作で 名前aの内容 を書き出すことができます

Visualモードを使っている場合は

Visualモードで範囲指定 して削除やYankや変更する場合には 以下のような操作で名前つきバッファを使えます

削除であれば通常は

[Visual操作をしてから]d

と打っていると思いますが

[Visual操作をしてから]"ad

のように "d"で削除する直前に「引用符と名前(例では"a")」という風にします

Yankや変更も全く同様に

[Visual操作をしてから]"ay

とか

[Visual操作をしてから]"ac

とか

[Visual操作をしてから]"ar

とか

[Visual操作をしてから]"as

のような操作となります. 簡単ですね

バッファに追加するには

普通は,新しくバッファに内容を入れると,以前の内容は削除されて,新しい内容に 置き換わりますが,「前の内容に追加して格納したい」こともありますね. こういう時は, バッファに入れる時に指定する名前を「大文字」にします. たとえば

"Ay$

とすれば,行末までのテキストは,今まで"a"に入っていた内容に追加されます

追加するつもりで間違えて小文字で打ってしまったら,戻せないので気を付けて操作しましょう

名前を指定しない場合の内容は

普段, 名前をつけないで削除,Yank,変更コマンドを使っている時には 文字列はどこに記録されて いるのかというと… " という名前(二重引用符一個だけの名前です)で記録されて います. これはいわゆる「一時バッファ」の名前 というわけです. よって, 普段 名前を 指定せずに使っている p P コマンドは ""p とか ""P と打つのと全く同じで, 普段打っているコマンドはこれの省略形 のようなものだということです. そしてこの内容は削除やYankや変更コマンドを実行するたびに 内容が書きかわります

履歴バッファとは

名前を指定せずに消えた文字列は,その後で別のものを削除したらもう二度と 戻ってこないわけではありません. 実は,もうちょっと過去までのものを覚えておける領域があって 9回前に削除した文字列までは まだメモリ上に残っていて 普通の名前つきバッファと同じような操作で書き出すことが可能です
さきほど " という名前のバッファに 最も最近に削除などの操作をした文字列が 入っているのを説明しましたが, これと同様に

1

という名前のバッファに「二回前に削除した文字列」が入っています
さらに 2 という名前には「そのさらに前に削除した文字列」…という具合に… 9 番までの過去の削除された文字列の入ったバッファがあります

新しく削除コマンドが実行されるたびに 1 の内容は 2 に, 2 の内容 は 3 に…という具合に 9 までが保存されていて, 9 にあったものは 次の削除コマンドで捨てられます. この 1 から 9 までの名前のバッファの ことを 履歴バッファ と呼びます. Viの解説本によっては 番号つきバッファ という 名前で解説をしているものもあります

書き出し方は,名前つきバッファと全く同じで

"3p

なら 3番目の履歴内容が書き出されるといった具合に使えます

どの名前や番号にどんな内容を入れておいたのかを確認したい

「名前つきバッファの名前とその内容を忘れてしまった」とか 「何番の履歴に何が入っていたのかなんて覚えているわけがない」…という時のために

:di

または :dis または :display と打つと, 現在使われている バッファの一覧表示 をします

このリストをよく見ると,今まで説明したもの以外にもまだ何かありますね
簡単に説明しますと
まず, % には現在の編集対象ファイル名が入っています
. (ピリオドです)には 最も最近挿入した文字列が入っています. 挿入モード中で CTRL-A CTRL-@ キーを押した時に書き出される文字列です
また, : (コロン)には 最も最近打ったコマンド文字列が入っています

その他のバッファ

:di コマンドでも表示はされませんが - には「最も最近に一行以内の範囲を 削除した内容」が入ってます. 他にも,マニュアルにも書いてないバッファがあるみたいです

関連操作

「名前つきバッファ」と関係の深い「一連の操作の記録と再生」の 解説も読んでみて下さい


前項目, 「複数の窓を思い通りに操作する」へ

目次へ

次項目, 「操作の記録と再生機能は超便利」へ