viで1つのファイルから別のファイルにコンテンツをコピーして貼り付ける


256

私は2つのファイルで作業しています。あるファイルから数行をコピーして、別のファイルに貼り付ける必要があります。同じファイルにコピー(yy)と貼り付け(p)する方法を知っています。しかし、それは異なるファイルに対しては機能しません。これはどのように行われますか?

また、切り貼りする方法はありますか?私はグーグルで試しましたが、ほとんどのリソースはコピーと貼り付けについてのみ話します。


これは機能しませんか?ファイル間で行をコピーするためにこれをよく使用します。
sjngm

まあ、それをしているとき、引用符しか得られないのですか?
macha

4
コマンドddはcutのように機能します。
MartinStålberg、2013

回答:


218

テキストをカット/ヤンクする方法はすでに知っているので、テキストを別のファイルに貼り付けるためのアイデアをいくつか紹介します。

  • 最初のファイルを編集して、必要なテキストをヤンクします。次に、vi(:e /path/to/other/file)内から2番目のファイルを開いて貼り付けます
  • 両方のファイルを分割ウィンドウで一緒に開き、次のようにCtrl+ wUp/のDownいずれかを使用してファイル間を移動します。

    • vi -o /path/to/file1 /path/to/file2
    • 最初のファイル内からCtrl+ ws

私は2つのパテウィンドウを開いています。「ビジュアルモードで最初にvを実行してから、すべての行を選択し、ヤンキングで「y」を実行します。他のファイルに移動するためにalt + tabを実行するのではなく、 putの「p」は、引用符のみを出力します
macha

10
2つのパテウィンドウで作業している場合は、コピー/貼り付けのパテ/ウィンドウの方法を使用する必要があります。簡単だ。コピーしたいものをマウスでマークします(他に何もする必要はありません。マークしたテキストはクリップボードにコピーされます。)他のパテウィンドウに切り替えます。vim(hit i)で挿入モードに入ります。右マウスボタンを押します。パテウィンドウで右マウスを押すと、クリップボードにあるものが何でも貼り付けられます。
nos

3
あなたがやっていることは動作しません:viでヤンクしても、テキストはWindowsクリップボードに配置されず、ヤンクバッファーは開いているvimインスタンス間で共有されません。
Adam Batkin、2011年

1
私は、最後の点が行うことになっているかを理解していない:*最初のファイルの中から、Ctrl+ ws
svassr 2013年

1
私にとってはウィンドウを分割しましたが、まったく同じファイルを開きました。そのときに開くファイルをどのように選択しますか?:sp myfile水平に分割して指定されたファイルを開くコマンドを見ましたが、ウィンドウを垂直に分割したい場合はどうすればよいですか?
svassr 2013年

50

WindowsでVimを使用している場合は、次を使用してクリップボード(MSコピー/貼り付け)にアクセスできます。

"*dd -行をカットします(または3ddで3行をカットします)

"*yy -1行をコピーします(3行をコピーするには3yy)

"*p -カーソルの後の行に行を貼り付けます

"*P -カーソルの前の行に行を貼り付けます

を使用すると、別々のVimウィンドウ間、またはVimとPCアプリケーション(メモ帳Microsoft Wordなど)の間に貼り付けることができます。


17
+クロスプラットフォームシステムクリップボードレジスタとして使用(WindowsおよびLinux)と*、Windowsのみです(+Windowsでもと同じように機能します*)。
Stephen Swensen 2013年

42

d好きなもののバリエーションを使っddてカットします。

ある範囲の行を別のファイルに書き込むには、以下を使用できます。

:<n>,<m> w filename

ここで、<n><m>行の範囲を指定する数字(又はシンボル)です。

デスクトップクリップボードを使用する場合は、+gコマンドを確認してください。


、最初の行への移動を:マークでこれを行うあなたは、ファイルへの書き込みしたいテキストの周囲(例えばaとb)2つのマークを作成するにはma、最後の行に移動しますmb。その後、先頭に追加'あなたは上記のコマンドを使用しているとき、マークの手紙には::'a,'b w filename
EchoLynx

幅広いラインの範囲に最適なソリューション!
YasinOkumuş2017

29

他のファイルを開いてと入力できます:r file_to_be_copied_from。または、バッファリングできます。または、最初のファイルに移動し、コピーする行"qYに移動してと入力し、貼り付けたいファイルに移動してと入力し"qPます。

"buffer_name、バッファにコピーします。YヤンクP入れです。お役に立てば幸いです。


ありがとう!これは私トン助け
山本篤

28

これを行う1つの方法を次に示します。

  • Vimを起動し、作業中のファイルであるfile1を開きます。
  • :e file2は、行のコピー元のファイルfile2を表示します。
  • コピーする行を見つけます。3行だとすると、3yy
  • :b1 これはバッファ1に切り替わり、file1は
  • ヤンクした行を挿入する場所を見つけて、 p

両方のファイルを表示することもできます。Ctrl+で画面を分割しますw s

裁断に関してはd、裁断したものを裁断し、ヤンクバッファーに入れます。dd行を「カット」します。


2
オフトピック:キーボードボタンのようなものを取得するにはどうすればよいですか?
11年


Linux / MacOSの2つの異なる端末で同じクライアントがsshを実行する2つの異なるsshサーバーにある2つのファイルはどうですか?つまり、使用するパテはなく、2つのファイルを1つのターミナルの同じviセッションで開くことはできません。
Qiang Xu

1
クライアントが2つのサーバーにsshで接続できる場合、それらの2つのサーバーにscpまたはsftpを使用することもできます。したがって、最も簡単な方法は、あるサーバーから別のサーバーにファイルをコピーして同じサーバーに常駐させ、説明に従ってそれらのファイルを編集し、必要に応じてファイルを他のサーバーにコピーし直すことです。
nos

16

これらはすべて素晴らしい提案ですが、別のファイル内のテキストの場所がわかっている場合は、sedを簡単に使用できます。:r! sed -n '1,10 p' < input_file.txtこれにより、既に開いているファイルのカーソルの現在位置に10行挿入されます。


不思議なことに、これをos xで実行すると、奇妙なことに終了コード1が返されました。理由はわかりません。
jayunit100 2015

1
この提案をありがとう!:私は私が最初の2行たかったので、sedの代わりに頭を使わ:r ! head -n2 file.py
フェデリコ・ポンジー

7

ファイルの編集中に、開始と終了を使用する場所にマークを付けます

ma- aマークを設定します

mb- bマークを設定します

次に、それを別のファイルにコピーするには、w次のコマンドを使用します。

:'a,'bw /name/of/output/file.txt

7

2017-05更新:

次の行をvimrcファイルに追加すると、

set clipboard = unnamed

その後、Vimはシステムクリップボードを使用しています。


異なるVimインスタンスウィンドウ間でコンテンツをコピーする方法では、ヤンクの方法が機能しないことがわかりました。(少なくとも、それは私のVimの知識に基づいて動作しません。動作させるための別の方法があるかどうかはわかりません)。

私のテストによれば、ヤンク方法は、複数のファイルが同じウィンドウで開かれる方法でのみ機能します。

それをしたい場合は、Ctrl+ xCtrl+ c(Windowsの場合)などのOSの切り取り、コピー、貼り付けを使用することをお勧めします。


5

これらのリマップは私にとって魅力のように機能します:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

だから、私はビジュアルモードでだとき、私は私が欲しいのラインキーを押し選択Ctrl+ c当時とCtrl+をv受信ファイルにテキストを挿入します。「* y」も使用できますが、覚えにくいことがあります。

これは、Vimからクリップボードにテキストをコピーする場合にも役立ちます。

ソース:一時ファイルを使用してセッション間でコピーして貼り付けます


4

Vimの同じインスタンスで開かれている2つのバッファー(==ファイル)間でテキストをコピーしても問題ありません。

y(前にビジュアルモードでコピー先領域をマークしたと仮定して)で1つのバッファーをヤンクし、で他のバッファーに貼り付けpます。Vimの同じインスタンス内にある限り、異なるタブでも機能します。

Vimの同じインスタンスで2つのファイルを開く方法は、システムによって異なります。

  • Win32では、2つ以上のファイルを選択すると、1つのvimで編集するというコンテキストメニューのオプションがあります。
  • コンソールにいるとき、あなたはそれを達成することができます vim file1 file2
  • Vimを別のツールのエディターとして使用する場合は、必ず--remote-silentすべてのファイルが同じインスタンスで開かれるようにオプションを指定してください

Vimの2つの異なるインスタンスで2つのファイルを開いた場合は、システムクリップボードを使用する必要があります。最初のVimインスタンスで、"+y(もう一度、前にビジュアルモードでヤンクする領域をマークして、システムクリップボードにテキストをヤンクします。)、2番目のVimに移動して、そこにクリップボードを貼り付けます"+p


:tabedit filenameを使用してターゲットファイルを開き、pを押して行を貼り付けることができます。速いと思います。
jabalv 2017

4

目標:あるファイルの一部を別のファイルに保存します。

ソリューション

  1. 保存するテキストを選択します。
    • 選択を開始する位置にカーソルを置きます
    • を押しvて文字を選択Vするか、大文字で行全体を選択します
    • 選択したいものの最後にカーソルを移動します
  2. 選択したテキストを新しいファイルに保存します。:wSpace新しいファイルのタイプと名前。実際に表示されます

    :'<,'>w new.txt

    次に押す Enter


一時ファイルから貼り付ける方法は?
Vineet

3

私のシナリオでは、ファイル1からファイル2に、途中でn行、n不明をコピーする必要がありました。

:'a,'bw /name/of/output/file.txt

2
  1. クリップボードをサポートするようにコンパイルされたVimバージョンがあることを確認してください
    • :echo has('clipboard') 戻るはずです 1
    • 返された場合0(たとえば、Mac OS X、少なくともv10.11(El Capitan)、v10.9(Mavericks)およびv10.8(Mountain Lion)-クリップボードサポートのないVimバージョンが付属している場合)、経由でクリップボードをサポートするVimバージョンbrew install vim(インストール後にターミナルを再起動することを忘れないでください)
  2. ビジュアルモードを入力します(V-マルチライン、v-プレーン、またはCtrlv-ブロックビジュアル)
  3. コピーする行を選択してください
  4. "*y -選択したものをコピーする
  5. "*p -コピーを貼り付けます

PS:

  • あなたはからの命令で手順2-5を置き換えることができます答えによってJayGあなたは、単一の行をコピー&ペーストする必要がある場合は、
  • 行を選択しやすくするために、に追加できset mouse+=aます.vimrc-無関係な要素(行番号など)を選択せず​​に、マウスを使用してVimで行を選択できます。通知:マウスで選択したテキストをコピーする機能をブロックしますVimからシステムクリップボードに

1

例:fileAおよびfileB-fileAの25行目から開始し、50行をコピーして、fileBに貼り付けます

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

以下のオプションはほとんどの場合に機能し、後で貼り付けることもできます。

 "xnyy
x - buffer name
n - number of line to Yank - optional

ヤンクした行はバッファに保存され'x'ます。編集のどこでも使用できます。

他のファイルに行を貼り付けるには、

:e filename&location

例:現在の編集で以下のコマンドを入力します

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

完全な操作

ファイル1を開く:

vi Test1.sh

a10yy

-Yanked 10 lines

-現在の編集から2番目のファイルを開く

*:e /u/test/Test2.sh*

-貼り付けが必要な行にカーソルを移動します

*"ap*

-バッファーからの行は'*a*'、現在のカーソル位置の後にコピーされます


1

ファイルの一部をコピーして、その内容を別のファイルの中央に貼り付ける場合は、この方法を使用できます。

:linenumber,linenumber write newfile

例:

:2,34 write temp1

または

:'mark, 'mark write newfile

例:

:'a,'b write temp1

これで、行が別のファイルにコピーされました。コピー後にこれらの行を削除したい場合は、

:linenumber1,linenumber2 d

または

:'mark1,'mark2 d

次に、他のファイルに移動します。次に、貼り付けたい行にカーソルを置きます。

タイプ

:r!cat temp1

これで、一時ファイルの内容がここに貼り付けられます。内容を貼り付けた後、コマンドライン自体から一時ファイルを削除できます。

:!rm temp1

これは、コピーと貼り付けを複数回行う場合に役立ちます。


0

もう1つの方法は、2つのファイルを2つの分割バッファーで開き、対象の行を視覚的に選択した後で次の「スニペット」を使用することです。

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

コマンドモードに入り、実行します

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

たとえば、現在開いているファイル20-30から行を抽出filenameする

:r! sed -n '20, 30p' filename
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.