Vimで別ファイルの内容をカーソル位置に読み込む(:read)
テンプレートファイルの中身を今開いているファイルに丸ごと差し込みたい、といった場面で、わざわざ別ファイルを開いてコピー&ペーストする必要はありません。:readコマンドを使えば、カーソル位置に直接挿入できます。
| コマンド | これだけ覚える |
|---|---|
:r {ファイルパス} | カーソル行の直後にファイルの中身を挿入 |
:0r {ファイルパス} | ファイルの先頭に挿入 |
:$r {ファイルパス} | ファイルの末尾に挿入 |
:r! {コマンド} | ファイルではなくコマンドの実行結果を挿入 |
基本の使い方
ノーマルモードで次のいずれかを実行します。
:read {ファイルパス}
:re {ファイルパス}
:r {ファイルパス}
指定したファイルの内容は、カーソルがある行の直後に挿入されます。
line1
line2
:r header.txtline1
header
line2
ファイルパスは絶対パス・相対パスのどちらでも指定できます。
:r ~/templates/header.txt
:r ./snippets/license.txt
挿入位置を制御する
:readは基本的にカーソル行の直後に挿入されますが、行番号を指定すればその行の後に挿入する位置を制御できます。例えばファイルの先頭(0行目の後、つまり1行目の前)に挿入したい場合はこうします。
:0r ~/templates/header.txt
ファイル末尾に追記したい場合は$を使います。
:$r ~/templates/footer.txt
ビジュアルモードで選択した範囲の直後に挿入したい場合は、選択後に:'<,'>normal! oのような小細工をするより、単純にカーソルを目的の行に移動してから:rする方がシンプルで分かりやすいです。
:r {ファイルパス}で任意の位置にファイルの中身を差し込めます。行番号や$と組み合わせれば挿入位置も指定できます。ファイル補完を使って入力を楽にする
:rの後にファイルパスを打つときも、コマンドラインモードの補完が使えます。パスを途中まで入力してTabを押せば候補が補完されるので、フルパスをすべて手入力する必要はありません。よく使うテンプレートファイルであれば、あらかじめ短いコマンドにマッピングしておくのも手軽で効果的です。
nnoremap <leader>th :0r ~/templates/header.txt<CR>
:r! との違いに注意
:readと紛らわしいのが:r!{コマンド}で、こちらは「ファイルの中身」ではなく「OSコマンドの実行結果」を挿入するコマンドです。!の有無で意味がまったく変わるので注意が必要です。
| コマンド | 挿入されるもの |
|---|---|
:r {ファイルパス} | 指定したファイルの中身 |
:r! {コマンド} | コマンドの実行結果 |
コマンド出力の挿入や、ファイルパス自体の補完挿入についてはこちらの記事で詳しく解説しています。
誤った内容を挿入してしまったら
:readによる挿入も通常の編集操作として扱われるため、間違ったファイルを読み込んでしまってもu(アンドゥ)で一括して取り消せます。ファイル1つ分がまとめて1回の変更として記録されるので、部分的に消し忘れる心配もありません。
ライセンス表記や定型のヘッダーコメントをテンプレートファイルとして手元に置いておき、新規ファイルの先頭で:0rして差し込むようにしています。毎回同じ文言をタイプする手間がなくなり、表記ゆれも防げるようになりました。
まとめ
別ファイルの中身をそのまま挿入したいなら:read {ファイルパス}です。行番号や$で挿入位置を指定でき、OSコマンドの出力を挿入したい場合は!付きの:r!と使い分けます。