【Vim】 マークとレジスター
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
マークとレジスターは、Vimでのテキスト編集をより効率的に行うために、是非とも憶えておきたい機能です。
1. マーク
マークは文字どおり、ファイル中の任意の場所に(見えない)印を付ける機能です。いったん付けた印は、ファイルを開いている間だけ、もしくはファイルを閉じて別のファイルを開きなおした後も、Vimの中で保持されます。
現在のカーソル位置にマークを設定するには、ノーマルモード又はビジュアルモードで
1 |
ma |
などと入力します。a
はマークの名前を表し、大文字・小文字併せて52個のマークを設定する事ができます。小文字のa~zはカレントバッファ(現在編集中のファイル)のみで有効で、大文字のA~Zはファイルを閉じても有効です(~/.viminfoに、ファイルのパスとともに”ファイルマーク”として保持されます)。
設定したマークへカーソルを移動させるには、ノーマルモード又はビジュアルモードで
1 |
`a |
などと入力します。なお大文字のA~Zの場合は、そのマークした場所が現在編集中でないファイルであっても、そのファイルが自動的に開いた上でマークの箇所へ移動します。また、バッククォートの代わりに
1 |
'a |
と入力すると、マークのある行の先頭(カラム0)へカーソルが移動します。
マークは、単にカーソル移動として使うことももちろん可能ですが、テキストのヤンク(コピー)や削除の際の範囲指定に使用することもできます。例えば、現在のカーソル位置からa
のマークを設定した場所までのテキストをヤンクしたい場合は、ノーマルモードで
1 |
y`a |
と入力します。バッククォートの代わりにシングルクォート('
)を使用すれば、a
のマークを設定した行の先頭からのヤンクになりますので、行単位でのヤンクの場合はシングルクォートの方が少ない手間でヤンクできます。
また上記の他に、特殊なマークが用意されています。役に立ちそうなものを、いくつかかいつまんでご紹介します。
1 2 3 4 5 6 7 8 9 10 11 |
0~9 過去に開いたファイルの、そのファイルを閉じた時点のカーソル位置 [ カレントバッファで直前に変更又はヤンクしたテキストの先頭 ] カレントバッファで直前に変更又はヤンクしたテキストの末尾 < 直前にビジュアルモードで選択したテキストの先頭 > 直前にビジュアルモードで選択したテキストの末尾 " カレントバッファを前回閉じた際のカーソル位置 ^ カレントバッファでの、直前のインサートモード終了時のカーソル位置 . カレントバッファに対して最後に変更を加えた位置 ( 現在のカーソル位置を含む文章の先頭 ) 現在のカーソル位置を含む文章の末尾 { 現在のカーソル位置を含む段落の先頭 } 現在のカーソル位置を含む段落の末尾 |
なお、これらは全て読み取り専用のマークで、ユーザーが位置を任意に設定することはできません。また、ほとんどのマークは、いったんファイルを閉じて再度ファイルを開いた場合でも有効です。例えば、あるファイルを開いた直後に
1 |
`. |
と入力すれば、そのファイルの直前の編集位置にカーソルを移動することができます(これは、そのファイルに対する作業内容を思い出すのに役に立ちます)。
現在設定されているマークの一覧を表示するには、コマンドモードで
1 |
:marks |
を実行します。実行例は以下のとおりです。
上図の0~6のマークは、(上記のとおり)直近にVimで開いたファイルの一覧を表しています。これは、0~6のマークへ移動することで、そのファイルを素早く開くことができる、ということを意味します。例えば上図の状態で、
1 |
`2 |
と入力すると、すぐさま~/.bashrc
が開き、そのファイルを前回閉じた際の位置へカーソルが移動します。これは非常に便利な機能です。
より詳しい情報は、Vimの:help mark
で確認することができます。
2. レジスター
レジスターは、ヤンク又は削除したテキストを格納する変数のようなものです。例えば、a
というレジスターにヤンクした1行分のテキストを格納するには、ノーマルモード又はビジュアルモードで
1 |
"ayy |
と入力します。先頭のダブルクォートが、これから行う操作にレジスターを割り当てる、という宣言になります。また、レジスターa
に格納されたテキストをプット(貼り付け)するには、同様にダブルクォート(及びレジスター)を前置して、
1 |
"ap |
と入力します。なお、レジスターを指定せずにヤンク、削除もしくはプットした場合は、無名レジスター("
)が暗黙的に指定されます。
レジスターには、主に以下の種類があります。なお一部、読み取り専用のレジスターもあります。
1 2 3 4 5 6 7 8 9 10 |
a~z 名前付きレジスター 0~9 直近でヤンク/削除したテキスト - 直近でヤンク/削除した、1行未満の短いテキスト . 直近にインサートモードで挿入したテキスト % カレントバッファのパス # 代替バッファのパス : コマンドモードで直近に実行したコマンド _ ブラックホール(テキストを保持しない) / 直近の検索文字列 |
名前付きレジスターは通常、ヤンク又は削除したテキストを格納し、同時にそれまで保持していたテキストをクリアしますが、ヤンク又は削除時にレジスターを**大文字**にすると、現在保持しているテキストの**末尾に**新たなテキストを追加します。これは、あちこにち散らばったテキストを繋げながらコピーするのに役立ちます。
レジスターが現在保持しているテキストを確認するには、コマンドモードで
1 |
:registers |
を実行します。実行例は以下のとおりです。
ここで^J
は、改行文字を表します。
より詳しい情報は、Vimの:help registers
で確認することができます。
なお、マークとレジスターの基本的な機能は旧Viにも搭載されています。ちなみにViにはビジュアルモードがないため、範囲指定のヤンクや削除を行う場合には、マークを使わないと作業効率が格段に落ちてしまいます。Vi派/Vim派に係らず、作業効率アップを図るなら、是非とも憶えておきたい技術だといえます。
以上、簡単ですがVimに関するHowToをご紹介しました。