Salin dan tempel konten dari satu file ke file lain di vi

256

Saya bekerja dengan dua file, dan saya perlu menyalin beberapa baris dari satu file dan menempelkannya ke file lain. Saya tahu cara menyalin (yy) dan menempel (p) di file yang sama. Tapi itu tidak berfungsi untuk file yang berbeda. Bagaimana ini dilakukan?

Juga, apakah ada cara untuk memotong-tempel? Saya sudah mencoba googling, tetapi sebagian besar sumber hanya berbicara tentang copy-paste.

macha
sumber
Apakah Anda yakin ini tidak berhasil? Saya menggunakan ini cukup sering untuk menyalin garis antar file.
sjngm
Nah ketika saya melakukan itu, saya hanya mendapatkan tanda kutip?
macha
4
Perintah dd bekerja seperti cut.
Martin Stålberg

Jawaban:

218

Karena Anda sudah tahu cara memotong / mencabut teks, berikut adalah beberapa ide untuk menempelkannya kembali ke file lain:

  • Edit file pertama, tarik teks yang Anda inginkan. Kemudian buka file kedua Anda dari dalam vi ( :e /path/to/other/file) dan rekatkan
  • Buka kedua file bersama di jendela terpisah dan bernavigasi di antara mereka menggunakan Ctrl+ w, Up/ Downbaik dengan:

    • vi -o /path/to/file1 /path/to/file2
    • Dari dalam file pertama, Ctrl+ w,s
Adam Batkin
sumber
Saya memiliki dua jendela dempul terbuka, saya melakukan "v untuk mode visual pertama dan kemudian pilih semua baris dan lakukan" y "untuk menarik, bukan saya melakukan alt + tab untuk masuk ke file lain dan ketika saya melakukannya a "p" untuk put, itu hanya mencetak tanda kutip
macha
10
Jika Anda bekerja dengan 2 jendela dempul, Anda harus menggunakan cara copy / paste dempul / windows. Itu mudah. Tandai hal-hal yang ingin Anda salin dengan mouse Anda (Anda tidak perlu melakukan hal lain, teks yang ditandai itu sekarang disalin ke clipboard.) Beralih ke jendela dempul Anda yang lain. Masuk ke mode penyisipan di vim (tekan i). Tekan tombol kanan mouse - mouse kanan di jendela dempul akan menempel apa pun yang ada di clipboard.
no.
3
Apa yang Anda lakukan tidak akan berfungsi: Yanking in vi tidak akan menempatkan teks ke clipboard Windows Anda, dan buffer yank tidak dibagi di antara instance open vim.
Adam Batkin
1
Saya tidak mengerti apa titik terakhir yang seharusnya dilakukan: * Dari dalam file pertama, Ctrl+ w, s.
svassr
1
bagi saya itu membelah jendela tetapi membuka file yang sama persis. Bagaimana Anda memilih file mana yang akan dibuka? Saya telah melihat perintah :sp myfileyang membagi secara horizontal dan membuka file yang ditentukan, tetapi bagaimana yang akan saya lakukan jika saya lebih suka untuk membagi jendela secara vertikal?
svassr
50

Jika Anda menggunakan Vim di Windows, Anda bisa mendapatkan akses ke clipboard (salin / tempel MS) menggunakan:

"*dd - potong garis (atau 3dd untuk memotong tiga baris)

"*yy - salin baris (atau 3yy untuk menyalin tiga baris)

"*p - rekatkan baris pada baris setelah kursor

"*P - rekatkan baris pada baris sebelum kursor

Anda dapat menempel di antara jendela Vim yang terpisah atau antara aplikasi Vim dan PC ( Notepad , Microsoft Word , dll.).

JayG
sumber
17
Gunakan +sebagai register clipboard sistem lintas platform (Windows dan Linux) vs. *, yang merupakan Windows saja ( +berfungsi sama di Windows *).
Stephen Swensen
42

Gunakan variasi dsuka ddmemotong.

Untuk menulis berbagai baris ke file lain, Anda dapat menggunakan:

:<n>,<m> w filename

Di mana <n>dan <m>adalah angka (atau simbol) yang menunjuk sejumlah garis.

Untuk menggunakan papan klip desktop, lihat +gperintahnya.

Apalala
sumber
Untuk melakukan ini dengan tanda, buat dua tanda (a dan b, misalnya) di sekitar teks yang ingin Anda tulis ke file: pindah ke baris pertama ma,, pindah ke baris terakhir mb,. Kemudian tambahkan huruf a 'ke tanda ketika Anda menggunakan perintah di atas::'a,'b w filename
EchoLynx
solusi hebat untuk rentang garis lebar!
Yasin Okumuş
29

Anda dapat membuka file dan jenis lainnya :r file_to_be_copied_from. Atau Anda bisa buffer. Atau buka file pertama, buka baris yang ingin Anda salin, ketik "qY, buka file yang ingin Anda tempel dan ketik "qP.

"buffer_name, salinan ke buffer. Yadalah menarik dan Pdiletakkan. Semoga itu bisa membantu!

Menangkan Man
sumber
Terima kasih! Ini membantu saya berton
Atsushi Yamamoto
28

Inilah satu cara untuk melakukannya;

  • Mulai Vim dan buka file1 yang merupakan file yang sedang Anda kerjakan.
  • :e file2 yang akan memunculkan file2, file yang ingin Anda salin dari.
  • cari baris yang ingin Anda salin. Jika tiga baris, Anda menekan3yy
  • :b1 ini akan beralih ke buffer 1, di mana file1 berada
  • cari tahu di mana Anda ingin memasukkan garis yang Anda tarik, dan tekan p

Anda dapat melihat kedua file juga. Membagi layar dengan misalnya Ctrl+ w s.

Sedangkan untuk memotong, dmemotong dan menempatkan barang-barang yang dipotong di buffer yank. ddakan "memotong" garis.

tidak
sumber
2
di luar topik: bagaimana cara mendapatkan hal-hal seperti tombol keyboard?
eckes
Bagaimana dengan kedua file tersebut pada dua server ssh yang berbeda, di mana klien yang sama ssh'e dalam dua terminal berbeda di Linux / MacOS? Maksud saya, tidak ada dempul untuk digunakan, dan kedua file tidak dapat dibuka dalam sesi vi yang sama dalam satu terminal.
Qiang Xu
1
Jika klien dapat ssh ke dua server, itu juga dapat menggunakan scp atau sftp ke dua server. Jadi cara tercepat adalah dengan hanya menyalin file dari satu server ke yang lain sehingga mereka berada di server yang sama, mengedit file-file seperti yang dijelaskan, dan menyalin file kembali ke server lain ketika dilakukan jika perlu.
nos
16

Ini semua adalah saran bagus, tetapi jika Anda tahu lokasi teks di file lain gunakan sed dengan mudah. :r! sed -n '1,10 p' < input_file.txtIni akan menyisipkan 10 baris dalam file yang sudah terbuka di posisi kursor saat ini.

malik
sumber
anehnya saya mendapat kode keluar 1 saat menjalankan ini sayangnya pada os x, tidak yakin mengapa.
jayunit100
1
Terima kasih atas saran ini! Saya menggunakan kepala daripada sed karena saya ingin 2 baris pertama::r ! head -n2 file.py
Federico Ponzi
7

Saat mengedit file, buat tanda di mana Anda ingin memulai dan mengakhiri menggunakan

ma- menetapkan atanda

mb- menetapkan btanda

Kemudian, untuk menyalinnya ke file lain, cukup gunakan wperintah:

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

Pembaruan 2017-05:

Saya baru saja menemukan bahwa jika Anda menambahkan baris berikut ke file vimrc Anda,

atur clipboard = tidak bernama

kemudian Vim menggunakan clipboard sistem.


Saya baru saja menemukan cara menarik tidak akan bekerja pada cara di mana saya menyalin konten antara berbagai jendela contoh Vim. (Setidaknya, itu tidak bekerja berdasarkan pengetahuan Vim saya. Saya tidak tahu apakah ada cara lain untuk memungkinkannya bekerja).

Cara mencabut hanya bekerja pada cara di mana banyak file dibuka di jendela yang sama menurut pengujian saya.

Jika Anda ingin melakukannya, Anda sebaiknya menggunakan cara cut-copy-past OS seperti Ctrl+ x, Ctrl+ c(di bawah Windows).

Lichader
sumber
5

Remap ini bekerja seperti pesona bagi saya:

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

Jadi, ketika saya dalam mode visual, saya memilih garis yang saya inginkan dan tekan Ctrl+ clalu Ctrl+ vuntuk memasukkan teks ke file penerima. Anda bisa menggunakan "* y juga, tapi saya pikir ini terkadang sulit untuk diingat.

Ini juga berguna untuk menyalin teks dari Vim ke clipboard.

Sumber: Salin dan tempel di antara sesi menggunakan file sementara

rovitulli
sumber
4

Menyalin teks antara dua buffer (== file) yang dibuka dalam instance Vim yang sama tidak masalah:

Cukup tarik satu buffer dengan y( dengan asumsi Anda menandai area yang akan disalin dalam mode visual sebelumnya), lalu tempelkan ke buffer lain dengan p. Ini juga bekerja dengan tab yang berbeda selama mereka berada dalam instance Vim yang sama.

Cara membuka dua file dalam instance Vim yang sama tergantung pada sistem Anda:

  • Pada Win32, ada opsi di menu konteks yang mengatakan Edit dengan satu vim jika Anda memilih dua file atau lebih
  • Ketika Anda berada di konsol, Anda dapat mencapainya vim file1 file2
  • Jika Anda menggunakan Vim sebagai editor untuk alat lain, pastikan untuk menentukan --remote-silentopsi untuk memastikan bahwa semua file dibuka dalam instance yang sama

Jika Anda membuka dua file dalam dua instance Vim yang berbeda, maka Anda harus menggunakan clipboard sistem: pada instance Vim pertama, tarik teks ke clipboard sistem menggunakan "+y(sekali lagi, tandai area yang akan ditarik dalam mode visual sebelum ), kemudian pergi ke Vim kedua dan paste clipboard ada: "+p.

eek
sumber
: nama file tabedit dapat digunakan untuk membuka file target dan kemudian hanya p untuk menempelkan baris Anda. Saya pikir ini lebih cepat.
jabalv
4

Sasaran : menyimpan sepotong file ke file lain.

Solusi :

  1. Pilih teks yang ingin Anda simpan:
    • Posisikan kursor di tempat Anda ingin memulai seleksi
    • Tekan vuntuk memilih karakter ATAU huruf besar Vuntuk memilih seluruh garis
    • Pindahkan kursor ke akhir apa yang ingin Anda pilih
  2. Simpan teks yang dipilih ke file baru. Ketik :wSpacedan nama file baru. Sebenarnya kamu akan lihat

    :'<,'>w new.txt

    Lalu tekan Enter

Lu55
sumber
Bagaimana cara menempel kembali dari file temp.?
Vineet
3

Skenario saya adalah saya perlu menyalin n jumlah baris di tengah, n tidak diketahui, dari file 1 ke file 2.

:'a,'bw /name/of/output/file.txt
Shyam S
sumber
2
  1. Pastikan Anda memiliki versi Vim yang dikompilasi dengan dukungan clipboard
    • :echo has('clipboard') harus kembali 1
    • jika kembali 0(misalnya Mac OS X, setidaknya v10.11 (El Capitan), v10.9 (Mavericks) dan v10.8 (Mountain Lion) - hadir dengan versi Vim yang tidak memiliki dukungan clipboard), Anda harus menginstal Versi Vim dengan dukungan clipboard, katakan via brew install vim(jangan lupa untuk meluncurkan kembali terminal Anda setelah instalasi)
  2. Masuk ke mode visual ( V- multiline, v- plain, atau Ctrlv- block-visual)
  3. Pilih baris yang ingin Anda salin
  4. "*y - untuk menyalin yang dipilih
  5. "*p - untuk menempelkan salinan

PS:

  • Anda dapat mengganti langkah 2-5 dengan instruksi dari jawaban oleh JayG , jika Anda perlu menyalin dan menempel satu baris
  • untuk memudahkan memilih garis, Anda dapat menambahkan set mouse+=ake Anda .vimrc- itu akan memungkinkan Anda untuk memilih garis di Vim menggunakan mouse, sementara tidak memilih elemen asing (seperti nomor baris, dll.) PEMBERITAHUAN: itu akan memblokir kemampuan untuk menyalin teks yang dipilih mouse untuk dipilih ke clipboard sistem dari Vim .
Peter Mortensen
sumber
1

Contoh: fileA dan fileB - mulai fileA pada baris 25, salin 50 baris, dan rekatkan ke 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
Brenda
sumber
1

Opsi di bawah ini berfungsi sebagian besar waktu dan juga untuk menempel kemudian.

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

Garis yang ditarik akan disimpan dalam buffer 'x'. Itu dapat digunakan di mana saja di edit.

Untuk menempelkan baris di file lain,

:e filename&location

Contoh: Ketikkan perintah di bawah ini dalam edit saat ini

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

Operasi lengkap

buka file 1:

vi Test1.sh

a10yy

-Yanked 10 lines

-Sekarang buka file kedua dari edit saat ini

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

-Pindahkan kursor ke baris tempat Anda harus menempel

*"ap*

--Lines dari buffer '*a*'akan disalin setelah pos kursor saat ini

Raams
sumber
1

Jika Anda ingin menyalin bagian dari file dan menempelkan konten itu di tengah file lain, Anda bisa melakukan ini.

:linenumber,linenumber write newfile

Contoh:

:2,34 write temp1

Atau

:'mark, 'mark write newfile

Contoh:

:'a,'b write temp1

Sekarang garis disalin ke file lain. Jika Anda ingin menghapus garis-garis itu setelah menyalin, Anda bisa melakukannya

:linenumber1,linenumber2 d

Atau

:'mark1,'mark2 d

Sekarang, buka file lain. Lalu pertahankan kursor pada garis tempat Anda ingin menempel.

Tipe

:r!cat temp1

Sekarang, konten file temp disisipkan di sini. Anda dapat menghapus file temp dari baris perintah itu sendiri, setelah menempelkan konten.

:!rm temp1

Ini akan membantu jika Anda ingin menyalin dan menempel beberapa kali.

SibiCoder
sumber
0

Cara lain bisa dengan membuka dua file dalam dua buffer split dan menggunakan "potongan" berikut setelah pemilihan visual dari garis yang menarik.

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

Masuk ke mode perintah dan jalankan

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

Misalnya untuk mengekstrak baris 20-30dari filenameke dalam file yang sedang dibuka

:r! sed -n '20, 30p' filename
Anthony Awuley
sumber