Vimのレジスタの種類とコマンドの使い方・構造
投稿日:2022年4月11日 更新日:
コピー&ペースト(コピペ)使用時にはクリップボードが使われますが、
テキストエディターVimはそれとは独立した領域を持ち、それをレジスタと呼びます。
レジスタにはいくつか種類があり、コピーするときと貼り付けるときに使用するレジスタの指定ができます。
レジスタとは
レジスタは、Vim独自のクリップボードで、コピーしたものを一時保管する場所です。
通常のクリップボードとは独立しているので、エディター外のソフトとの間でコピペをするに、
ちょっとした操作 or 設定が必要になります。
またVimではコピー = ヤンク、ペースト = プットと呼びます。
レジスタの種類
名称 | レジスタ名 | 意味 |
---|---|---|
無名レジスタ | " | ヤンクや削除・変更時に無差別に入る |
番号付きレジスタ | 0 | 直近のヤンクが入る(名前未指定時) |
番号付きレジスタ | 1 – 9 | 直近の削除・変更したものが1に入り、9へと順に移動していく(名前未指定時) |
名前付きレジスタ | a – z | 名前を指定して入れられる(上書き) |
名前付きレジスタ | A – Z | a–zの内容に追加で入れられる |
読み取り専用レジスタ | . | 直近に挿入した文字が入る |
読み取り専用レジスタ | % | 編集中のファイル名が入る |
読み取り専用レジスタ | : | 直近に実行したコマンドモードのコマンドが入る |
選択領域用レジスタ | +, * | クリップボードの中身が入る |
最終検索パターンレジスタ | / | 直近の検索パターンが入る |
ブラックホールレジスタ | _ | 入れたものを消去する |
これが全部ではないですが、使用頻度が比較的高いものを上記に載せました。
格納先のレジスタを未指定でヤンク(コピー)を行うと無名レジスタに格納され、
また取り出すレジスタを未指定でプット(ペースト)すると、同様に無名レジスタから取り出されます。
レジスタ + (*) はクリップボードと同期していますが、
使用しているVimが対応していなかったり、環境によっては使用できません。
Linuxでの確認方法、設定方法は下記記事を参考に。
ヤンク・削除・変更時に使われるレジスタ
Vim内でヤンク(コピー)や削除・変更を行うと、テキストはレジスタに格納されます。
このとき、無名レジスタ " には無差別に入ります。
指定してレジスタa~zに入れない場合は、
ヤンク時にはレジスタ0、削除・変更時にはレジスタ1に入れられます (Fig.2)。
- レジスタ未指定(ヤンク):
"
,0
- レジスタ未指定(削除・変更):", 1 ~ 9
- レジスタ指定:", a–z (A–Z)
慣れない間は「ヤンクしておいたテキストが、削除したときに無意識に上書きしてしまった」
というようなことが起こるかもしれません。
そうならないよう、削除・変更時にどのレジスタにも入れたくないときには、ブラックホールレジスタを使用します。
このときは無名レジスタにも入らず、上書きされません。
レジスタ未指定時に無名レジスタではなく、ブラックホールレジスタを使用するように設定する方法は後述します。
レジスタの一覧表示
レジスタの中に、現在何が格納されているのか確認したい時には、
Vimのノーマルモードのときに下記を入力します(コマンドモード使用)。
:reg <Enter>
または
:registers <Enter>
使い方・コマンドの構造
ノーマルモードでレジスタへの格納・取り出しが行えますが、
レジスタへの格納はビジュアルモードでも、
レジスタからの取り出しはインサートモードでも可能です (Fig.3)。
レジスタに入れる
ノーマルモードのとき
操作 | コマンド |
---|---|
1行ヤンクして無名レジスタへ格納 | yy |
1行ヤンクしてレジスタaへ格納 | " ayy |
カーソルから行末までヤンクしてレジスタbへ格納 | " bY$ |
カーソル行から最終行まで削除してレジスタcへ格納 | " cdG |
ノーマルモードのときに、テキストをレジスタに格納するコマンドを一般化すると次になります。
" {レジスタ名} {オペレーター} {モーション}
オペレーターというは、ヤンク・削除・変更といった範囲を指定して作用するコマンドのことです。
モーションというのは、カーソルの移動のことです。
ダブルコーテーションの後に格納先のレジスタ名を指定し、コマンドとその範囲を指定するということになります。
オペレーター、モーションについては下記でもっと詳しく説明しています。
>> Vimのコマンドの表記とコマンドの基本構造(オペレーターとモーション)
オペレーターの例
- ヤンク : y
- 削除 (切り取り) : d
- 変更 : c
モーションの例
- 1単語 : w
- カーソルから行末まで : $
- カーソルから行頭まで : 0
コマンドとその範囲指定をするとき、例外的に下記も使用できます。
例外的なオペレーター・モーションの指定
- {オペレーター} x2 : カーソル行に対してオペレーターを作用
- (文字で){オペレーター} : カーソルから行末までに対してオペレーターを作用
ビジュアルモードのとき
操作 | コマンド |
---|---|
指定した範囲を無名レジスタへ格納 | {範囲指定}y |
指定した範囲をレジスタaへ格納 | {範囲指定}" ay |
ビジュアルモードのときに、テキストをレジスタに格納するコマンドを一般化すると次になります。
{ビジュアルモードでの範囲指定} " {レジスタ名} {オペレーター}
ビジュアルモードでテキスト範囲を指定しておき、ダブルコーテーションの後に格納先のレジスタ名を指定、コマンド入力ということになります。
ビジュアルモードへの入り方(ノーマルモードから)
- 文字単位のビジュアルモード :
v
- 行単位のビジュアルモード :
V
- 矩形ビジュアルモード :
Ctrl-v
レジスタから取り出す
ノーマルモードのとき
操作 | コマンド |
---|---|
無名レジスタから取り出し、カーソルの後方に貼り付け | p |
レジスタaから取り出し、カーソルの後方に貼り付け | " ap |
レジスタbから取り出し、カーソルの前方に貼り付け | " bP |
ノーマルモードのときに、レジスタからテキストを取り出すときにはプット(ペースト)コマンドを使用します。
コマンドを一般化すると次になります。
" {レジスタ名} {プットコマンド}
ダブルコーテーションの後に格納先のレジスタ名を指定し、プットコマンドの構成になります。
挿入モードのとき
操作 | コマンド |
---|---|
無名レジスタから取り出し、カーソルの後方に貼り付け | Ctrl-r " |
レジスタaから取り出し、カーソルの後方に貼り付け | Ctrl-r a |
挿入モードのときにレジスタからテキストを取り出すときには、
Ctrl-rを押すとダブルコーテーション " が表示されるので、
その後にレジスタ名を入力するとカーソル後方にプット(ペースト)されます。
Ctrl-r {レジスタ名}
デフォルトの使用レジスタの設定方法
vnoremap d "_d
nnoremap d "_d
vnoremap D "_D
nnoremap D "_D
vnoremap x "_x
nnoremap x "_x
vnoremap X "_X
nnoremap X "_X
vnoremap c "_c
nnoremap c "_c
vnoremap C "_C
nnoremap C "_C
レジスタを指定せずにヤンク・削除・変更やプットを行うと、
無名レジスタを指定したコマンドを実行することになります。
しかしそれだと不便に思う人もいるかもしれません。
対応策の1つとして、キーマップを変更する方法があります。
たとえば、削除・変更時に無名レジスタへ入れたくないときは、
削除コマンドキーd(,x)と変更コマンドキーcを押したときに、
ブラックホールレジスタを指定したコマンドを実行するように設定します。
Vimの設定ファイルである .vimrcファイル に左のテキストを追記すればよいです。
これでレジスタを指定せずに削除・変更を行っても、ヤンクしたテキストが上書きされなくなります。
まとめ
- レジスタとは: Vimエディター固有のクリップボード
- レジスタの種類
- レジスタ未指定(ヤンク):
"
,0
- レジスタ未指定(削除・変更):", 1 ~ 9
- レジスタ指定:", a–z
- レジスタ未指定(ヤンク):
- コマンド
- レジスタの中身の一覧表示:
:reg
<Esc> - レジスタへ格納
- (ノーマルモード)
"
ayy
: 1行ヤンクしてレジスタaへ格納 - (ビジュアルモード){範囲指定}
"
ay
: 指定した範囲をレジスタaへ格納
- (ノーマルモード)
- レジスタから取り出し
- (ノーマルモード)
"
ap
: レジスタaから取り出し、カーソルの後方に貼り付け - (挿入モード)
Ctrl-r
a : レジスタaから取り出し、カーソルの後方に貼り付け
- (ノーマルモード)
- レジスタの中身の一覧表示:
レジスタ以外にもVimにはさまざまな機能が存在しています。
下記の一覧をみれば、ある程度どんな機能があるのか知ることができます。
>> 【動画あり】Vimのコマンドを一覧にまとめてみた