Salin semua baris ke clipboard

565

Apakah ada cara untuk menyalin semua baris dari file terbuka ke clipboard di editor VI. Saya mencoba yGtetapi tidak menggunakan clipboard untuk menyimpan garis-garis itu.

Jadi mungkinkah?

Xinus
sumber
1
Jika Anda menggunakan Windows dan tidak berhasil, lihat jawaban ke-17 dari atas: stackoverflow.com/questions/1620018/…
Noumenon

Jawaban:

636

Anda harus menarik teks ke *atau + mendaftar :

gg"*yG

Penjelasan:

  • gg untuk mendapatkan kursor ke karakter pertama file
  • "*yuntuk memulai perintah tarik menarik ke register *dari baris pertama, sampai ...
  • G untuk pergi ke akhir file
CMS
sumber
6
Bagaimana Anda menandai teks sehingga terlihat seperti kunci? Saya belum melihatnya di SO.
jergason
10
Halo ... tidak berfungsi? Data clipboard tetap tidak berubah. ketika saya mengetikkan kursor gg pergi ke baris pertama ... tetapi ketika saya mengetik "* yG ..cpu beep di * ..so apakah itu normal atau ada masalah dengan vim saya? Saya di Ubuntu ..
Xinus
1
Apakah Anda mengaktifkan Deadkey? (misalnya, ketika Anda menekan 'a you get a) Jika demikian, Anda perlu menekan spasi setelahnya ".
Tordek
144
Vim hanya dapat mengakses clipboard sistem jika dikompilasi dengan xterm_clipboard diaktifkan. Untuk mengetahui apakah Anda memiliki fitur ini, jalankan :versiondi vim, dan cari +xterm_clipboardbenderanya. Jika didahului dengan tanda minus, maka Anda tidak akan memiliki fungsi ini. Jika ini masalahnya, Anda mungkin ingin mengkompilasi sendiri vim, atau menjalankan gvim yang biasanya mengaktifkan fitur ini.
nelstrom
9
Masalah dengan pendekatan ini adalah bahwa ia menggerakkan kursor dan menggulung jendela sekitar. Dua kali. The jawaban lain memiliki keystrokes jauh lebih sedikit dan kelemahan :)
sehe
696

Menggunakan:

:%y+

untuk menarik semua lini.

Penjelasan:

  • % untuk merujuk perintah berikutnya untuk bekerja pada semua baris
  • y untuk menarik garis itu
  • + untuk menyalin ke clipboard sistem

NB : Di Windows, +dan *setara lihat jawaban ini .

Benteng
sumber
19
Plus itu tidak akan mengubah lokasi kursor.
nperson325681
1
@uangnan: Register ini tidak ada di vi; hanya dalam vim. Coba ketikkan :helpuntuk memastikan Anda benar-benar vim.
Compiler mencolok
6
Saya perlu set clipboard=unnamed, tapi kemudian ini berhasil!
cdunn2001
235
Vim mengatakan E850: Invalid register name:(
lony
23
Solusi ini hanya berfungsi jika vim dikompilasi dengan opsi clipboard (vim --versi akan menampilkan + clipboard dalam kasus itu). Jika tidak, solusi Brian (:% w! Pbcopy) adalah solusi untuk Mac. Alternatif tersedia untuk sistem operasi lain (misalnya xclip).
yaccob
90

di Mac

  • salin bagian yang dipilih: pilih teks secara visual (ketik vatau Vdalam mode normal) dan ketik:w !pbcopy

  • salin seluruh file :%w !pbcopy

  • melewati dari clipboard :r !pbpaste

Brian
sumber
6
Bekerja dengan lancar. Penjelasan dari perintah akan sangat bagus.
Vlad Manuel Mureșan
5
@ Geo pbcopyadalah utilitas Mac. Di Linux, xselmungkin berfungsi sebagai gantinya, atau clipdi Windows.
David Lord
1
Ini tidak akan berfungsi jika file lebih panjang dari ketinggian terminal Anda.
Sridhar Sarnobat
1
@SridharSarnobat :%w !pbcopymasih berfungsi jika file lebih panjang dari ketinggian terminal.
Adrian Schmidt
Oh maaf, maksudku lebih dari ssh di mana klien adalah Mac dan server adalah Linux (yang saya asumsikan adalah apa yang dicari OP tetapi sekarang saya berpikir tentang hal itu, itu masalah yang tidak terkait). Dalam pembelaan saya, saya akan menghindari vim untuk menyalin dan menempel file lokal, tapi itu selera pribadi saya. Kiat yang bagus.
Sridhar Sarnobat
56

Papan klip adalah penyangga +. Untuk menyalin ke clipboard, lakukan "+ydan [gerakan].

Jadi, gg"+yGakan menyalin seluruh file.

Demikian pula, untuk menempel dari clipboard, "+p

Tordek
sumber
4
Hanya untuk menambah ini (4 tahun kemudian ...), ini memiliki sedikit kelemahan di mana posisi kursor Anda akan melompat ke bagian atas file. Untuk menghindari ini (mis. Jika Anda memetakan ini ke beberapa pintasan di vimrc Anda), Anda dapat melakukan sesuatu seperti: mqgg "+ yG`q
Tom Lord
46

Cara mudah lain untuk menyalin seluruh file jika Anda mengalami masalah menggunakan VI, hanya dengan mengetikkan "nama file kucing". Ini akan menggema file ke layar dan kemudian Anda bisa gulir ke atas dan ke bawah dan salin / tempel.

Zack
sumber
1
E603:: tangkap tanpa: coba
Paul Chris Jones
2
Dan jika Anda ingin melakukan itu tanpa meninggalkan vim, Anda dapat menjalankan perintah berikut: :!cat %. Dan untuk menyalin isi file secara terprogram ke clipboard pada Mac OS::!cat % | pbcopy
TanguyP
Diperlukan untuk menyalin file dari Ubuntu VM di Windows ke Debian di GCP dibuka di jendela browser ...: / Variasi dari vim yanking tidak berfungsi, ini berfungsi untuk menempelkan ke Windows lalu mengunggah file ke GCP.
frmbelz
31

Inilah yang saya lakukan untuk menarik seluruh file:

ggVGy
EmilianoGNFNR
sumber
12
Saya khawatir ini tidak menjawab pertanyaan, karena Anda menarik ke register default, bukan ke clipboard.
Compiler mencolok
2
@ConspicuousCompiler akan melakukannya jika ia memiliki clipboardset untuk menyalin teks yang ditarik ke dalam +.
TankorSmash
@TankorSmash bukan metode tercepat (:% y) atau paling rapi (setidaknya ggyG lebih baik).
pedroapero
@ConspicuousCompiler apa perbedaan antara register default dan clipboard ?
nilon
17

Anda dapat menggunakan perintah "cat" untuk membuka file dan menggunakan mouse untuk menyalin

Pham Luan
sumber
5
Tapi itu tidak akan menjadi cara "vi", jika file besar maka juga itu akan menjadi masalah ... Ini mungkin bekerja tetapi bukan cara yang disarankan ...
Aditya
1
resetterminal sebelumnya, lalu pilih semua dan salin. Ini bekerja melalui sshsesi.
arcol
Cara tercepat untuk file besar (di bawah 10 ribu baris) di server jauh yang berbeda jika xterm_clipboard tidak tersedia
Matias Haeussler
10

(sebagai balasan ke @rshdev, dan untuk menghindari keharusan mengkompilasi ulang vim dengan + xterm_clipboard per @nelstrom dalam komentar di OP)

ada program bernama xclip yang berfungsi seperti putclip di Ubuntu 11:

:%!xclip -sel clip
u

itu tidak diinstal secara default. untuk menginstal, gunakan:

sudo apt-get install xclip
rebus
sumber
10

Di Ubuntu 12

Anda mungkin mencoba menginstal vim-gnomepaket:

sudo apt-get install vim-gnome

Saya mencobanya, karena vim --versionmemberi tahu saya bahwa flag xterm_clipboard akan dinonaktifkan (ditunjukkan oleh - ), yang diperlukan untuk menggunakan fungsionalitas clipboard.

-> menginstal paket vim-gnome di Ubuntu 12 juga menginstal versi vim berbasis konsol, yang mengaktifkan opsi ini (ditunjukkan oleh tanda + sebelum tanda xterm_clipboard)

Di Arch Linux

Anda dapat menginstal vim-clipboarduntuk alasan yang sama.

Jika Anda menjalankan neovim maka Anda harus menginstal xclip(seperti yang dijelaskan oleh help clipboard-tool)

Arch Linux Tux
sumber
1
unix.stackexchange.com/questions/25965/... adakah opsi lain yang ada yang tahu?
Sandip Pingle
6

Jika Anda menggunakan Vim dalam mode visual, tombol cut and paste standar juga berlaku, setidaknya dengan Windows.

  • CTRLA berarti "Tandai seluruh file.
  • CTRLC berarti "Salin pilihan.
  • ESC berarti "Non-pilih, jadi tekan tombol Anda berikutnya tidak mengganti seluruh file :-)

Di bawah terminal Ubuntu (Gnome) setidaknya, salinan standar juga berfungsi ( CTRLSHIFTC, meskipun tampaknya tidak ada pintasan keyboard standar untuk select all(selain ALTEdiikuti oleh A).

paxdiablo
sumber
6
Tetapi jika Anda tidak menggunakan mswin.vim, maka ctrl-a menambah angka berikutnya pada baris saat ini.
Mark Rushakoff
@ Mark, perilaku ini dari instalasi Vim standar jadi saya menganggap itu default. Semua taruhan dimatikan jika lingkungan dikonfigurasi secara berbeda, meskipun jika itu yang terjadi, saya menduga OP akan tahu apa yang mereka lakukan :-) Dalam kedua kasus itu, OP menyatakan dalam komentar mereka berada di Ubuntu sehingga Windows menjadi bagian dari jawaban saya mungkin tidak berlaku. Terminal Gnome akan melakukannya.
paxdiablo
5

Anda dapat menekan gg untuk menemukan kursor Anda ke awal file, lalu tekan yG untuk menyalin semua konten dari awal hingga akhir (lokasi G) untuk buffer. Semoga beruntung!

gameboy90
sumber
4

Saya mencoba beberapa perintah yang disebutkan orang di atas. Tidak ada yang berhasil. Kemudian saya mendapatkan yang paling sederhana dari semuanya.

Langkah 1: vi <filename>
Langkah 2: Klik kanan pada bilah judul jendela Putty
Langkah 3: Pilih "Hapus scrollback" (untuk menghindari menyalin sisa sesi SSH Anda)
Langkah 4: Klik kanan lagi dan pilih "Salin semua ke clipboard".

Abhinav Deshpande
sumber
1
Untuk 15000 file baris, ini tidak mengambil semuanya. Saya perlu meningkatkan Putty saya Window > Settings > lines of scrollbackke 40000 (juga tersedia dengan mengklik kanan judul bar). Ini juga membantu untuk menggunakan, catbukan vi karena itu menggulung semua teks.
Noumenon
1
Saya akhirnya selalu kehilangan garis dari atas dan bawah file dengan cara ini. Yang saya lakukan sekarang adalah cat, lalu klik tengah pada awal dan akhir file untuk memperpanjang pilihan.
Noumenon
Ketika saya mencoba ini, saya hanya mendapatkan 111 baris di layar tetapi ada 174 baris dalam file saya, jadi jawaban kucing Noumenon berhasil untuk saya
seizethecarp
3

:%y aMenyentak semua konten ke dalam buffer vim, Menekan pdalam mode perintah akan menempelkan konten yang disentak setelah baris tempat kursor Anda saat ini berada.

Nyonya
sumber
3

gVim:

:set go=a

ggVG

Lihat :help go-a:

'a' Autoselect:  If present, then whenever VISUAL mode is started,
 or the Visual area extended, Vim tries to become the owner of
 the windowing system's global selection.  This means that the
 Visually highlighted text is available for pasting into other
 applications as well as into Vim itself.  When the Visual mode
 ends, possibly due to an operation on the text, or when an
 application wants to paste the selection, the highlighted text
 is automatically yanked into the "* selection register.
 Thus the selection is still available for pasting into other
 applications after the VISUAL mode has ended.
     If not present, then Vim won't become the owner of the
 windowing system's global selection unless explicitly told to
 by a yank or delete operation for the "* register.
 The same applies to the modeless selection.
kev
sumber
3

Yah, semua pendekatan ini menarik, namun sebagai programmer malas saya menggunakan yank all line dengan menggunakan kombinasi angka + y

misalnya Anda memiliki file kode sumber dengan total 78 baris, Anda dapat melakukannya seperti di bawah ini:

  1. gg untuk mendapatkan kursor di baris pertama
  2. masukkan 78 + y -> lalu tarik 78 garis di bawah kursor dan garis saat ini
arfo
sumber
2

Tidak ada konsep "clipboard" di Bill Joy's vi jadi saya tidak berpikir ada cara built-in untuk melakukannya.

Fitur salin otomatis apa pun yang disorot-ke-clipboard gVim adalah yang termudah atau gunakan program eksternal melalui:!

Untuk vig Cygwin saya gunakan

:%!putclip
u

Mungkin Ubuntu memiliki aplikasi CLI seperti putclip ??

rshdev
sumber
saran bagus, terima kasih! ada program seperti itu, yang disebut xclip. untuk perinciannya, saya memposting jawaban yang terpisah (itu akan terlalu membingungkan untuk membaca dari komentar, tanpa baris baru tambahan dan pemformatan kode).
Stew
2

Jika jari Anda default CTRL-A CTRL-C, coba pemetaan dari $VIMRUNTIME/mswin.vim.

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y

" CTRL-A is Select all
noremap <C-A> gggH<C-O>G
inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
cnoremap <C-A> <C-C>gggH<C-O>G
onoremap <C-A> <C-C>gggH<C-O>G
snoremap <C-A> <C-C>gggH<C-O>G
xnoremap <C-A> <C-C>ggVG

Saya minta mereka memetakannya ke <Leader><C-a>dan <Leader><C-c>.

go2null
sumber
2

Salin seluruh file di dalam vim atau tab-nya

y G 

lalu pindah ke tab dan tempel dengan

p

dan untuk memotong seluruh penggunaan file

d G
Abdul Basit
sumber
2

Saya telah menambahkan baris berikut ke .vimrc saya

nnoremap <F5> :%y+<CR>

Ini memungkinkan saya untuk menyalin semua teks dalam Vim ke clipboard dengan menekan F5(dalam mode perintah).

aks
sumber
1

Berikut adalah perintah peta untuk memilih semua ke clipboard menggunakan CTRL+ a:

"
" select all with control-a
"
nnoremap <C-a> ggmqvG"+y'q

Tambahkan ke .vimrc Anda dan Anda siap pergi ...

Jahroy
sumber
1

Saya tahu sepuluh tahun tentang ini harus diselesaikan tetapi dua jawaban pertama tidak bekerja untuk saya jadi saya terus menggali. Pada Redhat (server jauh) - Windows 10 (mesin lokal), jika Anda tidak dapat memilih semuanya dengan mouse, Anda macet karena salinan yang biasa tidak berfungsi antara remote dan clipboard mesin lokal.

Jadi, untuk menyalin di Linux jarak jauh dan menempel di Windows lokal, tentukan buffer utama dengan *dan lakukan yank ganda yang bagus

Gunakan gg" * yy.

Lefty G Balogh
sumber
0

Saya telah membuat fungsi untuk melakukan tindakan ini, letakkan di Anda ~/.vimrc.

fun! CopyBufferToClipboard()
    %y+
endfun
nnoremap <Leader>y :call CopyBufferToClipboard()<CR>
command! -nargs=0 CopyFile :call CopyBufferToClipboard()

OBS: Jika Anda menggunakan neovim, Anda juga memerlukan manajer clipboard seperti xclip. untuk informasi lebih lanjut ketik neovim:h checkhealth

Hal ini juga penting untuk menyebutkan bahwa tidak selalu sederhana yakan menyalin ke clipboard, untuk membuat setiap pakan copy +yang adalah "Clipboard Register" mencoba untuk set: :set clipboard=unnamed,unnamedplus. Untuk mor informasi lihat: :h unnamed.

Di sini, informasi lebih lanjut tentang vim wikia.

SergioAraujo
sumber
0

Anda dapat menggunakan pintasan, seperti ini:

noremap <F6> :%y+<CR>

Artinya, ketika Anda menekan F6 dalam mode normald, itu akan menyalin seluruh file, dan menambahkannya ke clipboard. Atau Anda cukup mengetik dalam mode normal :%y+dan kemudian mendorong Enter.

Nicolas Pardo
sumber
-1

Klik tombol kiri mouse, seret melintasi bagian yang ingin Anda salin dan lepaskan. Kode secara otomatis disalin ke clipboard.

Kapeel Kokane
sumber
3
File tersebut bisa sangat besar, dan menyeret seluruh teks dengan mouse tidak produktif (atau vicara).
Dr Beco
1
Sebenarnya ini adalah jawaban yang bagus dan bekerja untuk saya. Dalam sistem saya, lingkungan sangat terbatas. Saya harus menampilkan output di layar, dan kemudian menggunakan mouse untuk menarik, memilih dan melepaskan .. lalu saya salin ke Windows Notepad ++ .. dan berfungsi dengan baik. Tidak ada lagi yang berhasil.
Apurva Singh
-1

Saya tidak bisa menyalin file menggunakan jawaban di atas tetapi saya punya dempul dan saya menemukan solusi di Quora.

  1. Ubah pengaturan sesi Putty Anda, masuk ke logging dan ubah ke "karakter yang dapat dicetak". Atur file log
  2. Apakah kucing dari file masing-masing
  3. Buka file yang Anda atur di langkah # 1 dan Anda akan memiliki konten Anda di file log.

Catatan: ini menyalin semua karakter yang dicetak dari sesi itu ke file log, sehingga akhirnya akan menjadi besar. Dalam hal itu, hapus file log dan cat file target sehingga Anda mendapatkan konten file tertentu yang disalin pada mesin Anda.

thethitetulip
sumber