web-dev-qa-db-ja.com

vim-行の範囲をファイルから現在のバッファーに読み込む方法

ファイルfoo.cから行n1-> n2を現在のバッファーに読み取ります。

私は試した: 147,227r /path/to/foo/foo.c

しかし、「E16:範囲が無効です」と表示されますが、foo.cに1000行を超える行が含まれていることは確かです。

53
Aman Jain
:r! sed -n 147,227p /path/to/foo/foo.c
83
boxxar

Sedなどの外部ツールを使用せずに、純粋なVimscriptでそれを行うことができます。

:put =readfile('/path/to/foo/foo.c')[146:226]

配列は0から始まり、行番号は1から始まるため、行番号から1をデクリメントする必要があることに注意してください。

短所:この解決策は、受け入れられた回答より7文字長く、他のファイルのサイズに比べて一時的にメモリを消費します。

24
joeytwiddle

{範囲}は、ソースファイルの行の範囲ではなく、現在のファイルの宛先を指します。

いくつかの実験の後、それはようです

:147,227r /path/to/foo/foo.c

このファイルの227行目の後に/path/to/foo/foo.cの内容を挿入しますつまり、147を無視します。

18
Stewart Johnson

掲載されている他のソリューションは、特定の行番号に最適です。別のファイルの上部または下部から読み取る場合がよくあります。その場合、ヘッドまたはテールの出力の読み取りは非常に高速です。例えば ​​-

:r !head -20 xyz.xml

最初の20行をxyz.xmlからカーソルがある現在のバッファに読み込みます

:r !tail -10 xyz.xml 

Xyz.xmlの最後の10行をカーソルがある現在のバッファに読み込みます

Headコマンドとtailコマンドは非常に高速であるため、これらのコマンドを組み合わせても、非常に大きなファイルに対する他のアプローチよりもはるかに高速です。

:r !head -700030 xyz.xml| tail -30

ファイルxyz.xmlから現在のバッファーに700000から700030までの行番号を読み取ります

この操作は、かなり大きなファイルでも即座に完了します。

5
raj

私は私のコードプロジェクトでこれを実行する必要があり、次のようにしました。

/path/to/foo/foo.cが開いているバッファ内:

:147,227w export.txt

バッファで私は働いています:

:r export.txt

私の本でははるかに簡単です...両方のファイルを開く必要がありますが、一連の行をインポートする場合、通常はとにかく両方を開いています。この方法は、より一般的で覚えやすいです。特に、g/<search_criteria/:.w >> export.txtまたはその他のより複雑な行選択方法を使用して、より複雑な行のセットをエクスポートまたはインポートしようとしている場合はなおさらです。

2
DigitalAce69

範囲を指定すると、コマンドを現在のバッファー内の行のグループに適用できます。

したがって、読み取り範囲の指示は、現在のファイルのどこにコンテンツを挿入するかを意味しますが、読み取るファイルの範囲は意味しません。

2
Justin

次のことを行う必要があります。

:r /path/to/foo/foo.c
:d 228,$
:d 1,146

3つのステップ、しかしそれはそれを成し遂げるでしょう...

2
PaulB