Bisakah saya mempercepat menempelkan ke vim?

12

Saya menyalin bagian HTML dari halaman web dan ingin menyimpannya dalam file. Untuk itu saya memulai vim sesi baru di jendela terminal, dengan nama file (baru) yang ditentukan pada commandline, tekan iuntuk masuk ke mode insert dan kemudian CtrlShift+ Vdan menunggu sambil [-- INSERT --]muncul di bagian bawah dan menunggu ...

Karena vimtidak responsif setelah beberapa detik, saya membuka 'Editor Teks' dari menu Aplikasi → Accessoiries menempelkan teks (yang muncul dalam sepersekian detik, menyimpannya dengan nama baru, menutup, dan membunuh sesi Vim yang masih belum selesai, 1,5 menit kemudian. Jumlah teks 186K di 3200 baris, tidak berlebihan saya akan mengatakan, atau dengan garis yang terlalu panjang.

Apakah ada cara untuk mempercepat penyisipan semacam ini di vimdan / atau ada penjelasan mengapa ini sangat lambat dibandingkan dengan menggunakan, Editor Teks yang mengerikan dan berorientasi mouse?

(CPU% menurut toptidak datang di atas 5%, meskipun saya memiliki beberapa prosesor bebas dalam sistem, jadi mungkin ada beberapa masalah I / O terikat, yang tidak ada ketika membaca teks yang sama dari file)

Info versi:
Ubuntu 12.04
Vim: 7.3, dengan tambalan seperti yang disediakan oleh Ubuntu 12.04
bash: 4.2.25
gnome-terminal: 3.4.1.1

Anthon
sumber
1
Saya pikir itu lambat b / c itu harus mengurai input dan mencoba untuk memformat dll. Saya tidak yakin pilihan untuk melakukan ini tetapi akan menganggap Anda dapat menonaktifkan sementara fitur itu w / in vim, melakukan paste, dan kemudian aktifkan kembali. Coba juga menggunakan :set pastefitur ini untuk melihat apakah itu meningkatkan keadaan. Lihat :help pasteini menjelaskan bagaimana vimmembuat perbedaan antara mengetik dan menempel.
slm
Saya akan berharap viuntuk mencoba mengurai file ketika membaca (setelah menyimpan cara @ l0b0 disarankan), juga. Tapi itu bekerja dengan cepat.
Anthon
Benar, tetapi saya membayangkan bahwa ia harus mem-reparsing semua yang sudah diuraikan + karakter baru saat Anda menempelkannya. Sepertinya itulah yang terjadi ketika Anda mengedit file juga, hingga taraf tertentu.
slm
yang :set pastetampaknya tidak benar-benar membuat perbedaan (saya tidak menggunakan stopwatch, hanya dinding-jam).
Anthon
OKE, itu hanya sebuah pemikiran ...
slm

Jawaban:

14

Untuk menyimpan banyak teks clipboard ke file dengan cepat, Anda dapat menjalankan cat > file.txt, menempelkan konten, lalu tekan Ctrl- d.

Jika Anda telah menginstal xsel , Anda dapat melakukan :r !xseluntuk memasukkan pilihan "primer" (alias. "Mouse") di Vim, atau :r !xsel -buntuk memasukkan buffer "clipboard" ( Ctrl- c). Anda juga dapat menyimpan pilihan langsung ke file dengan xsel >file.txtatau xsel -b >file.txt. Ini menghilangkan kebutuhan untuk menyisipkan tindakan + EOF yang terpisah, dan menghindari mencetak seluruh buffer salinan di terminal.

Jika Anda tidak memiliki xsel tetapi xclip, perintah yang sesuai adalah xclip -outuntuk pemilihan utama, atau xclip -out -selection clipboarduntuk buffer clipboard.

l0b0
sumber
1
Terima kasih, itu setidaknya berfungsi tanpa harus kembali ke mouse, dan memasukkan file ke vim (misalnya ketika saya tidak memulai dengan file kosong) cukup cepat.
Anthon
Saya tidak mengerti mengapa ini tidak dapat diikat ke ctrl + shift + v sama sekali tidak masuk akal dalam semua ini.
mchid
2

Ini adalah masalah buffer flush-to-disk. Vim mencoba menjaga keamanan pekerjaan Anda dan tidak menganggap Anda dapat mengetik beberapa ribu karakter per detik. Baca :help swap-fileuntuk beberapa perincian tentang buffering. Solusi untuk masalah Anda adalah ini:

Matikan swapfile vim dengan:

vim -n <your file>

atau dari dalam vim sebelum menempel:

:set noswapfile

Lihat :help swapfileuntuk lebih jelasnya.

Pilihan lain adalah dengan cukup mematikan sinkronisasi ke disk dari file swap dengan :set swapsync=tetapi opsi ini membutuhkan lebih banyak penekanan tombol untuk membatalkan dan saya malas. :)

Mematikan swap tidak aman untuk operasi normal! Segera setelah tempel, gunakan :set swapfileatau :set swapsync=fsynckembali ke perilaku normal (meskipun secara teknis, perilaku normal mungkin telah disinkronkan dan bukan fsync , periksa dengan :set swapsync?sebelumnya jika Anda ingin menempuh rute ini).

linux_sa
sumber
1
ini tidak mempercepat bagi saya ...
syarat
1

Jika Anda memiliki xterm_clipboardfitur, Anda dapat menggunakan *dan +mendaftar. Register ini antarmuka dengan buffer pemilihan utama X11, dan clipboard (masing-masing).

Jadi, jika Anda menyalin sesuatu melalui CTRL+ c, Anda dapat menempelkannya di vim dengan "+p.

Jika Anda hanya menyorotnya tanpa menyalin, Anda dapat menempelkannya dengan "*p.
Anda juga dapat menjadikan *buffer sebagai buffer default dengan melakukan :set clipboard=unnamed. Kemudian setiap yank ( y), paste ( p), dll, yang tidak menentukan register akan menggunakan *register. Vim 7.3.74 juga ditambahkan clipboard=unnamedplus, yang akan menggunakan +register secara default.

Anda juga dapat menyalin hal-hal ke dalam primary seleksi & clipboard buffer oleh YanKing, misalnya: "+yy.

 

Perhatikan, bahwa sebagaimana disebutkan, semua kemampuan ini memerlukan xterm_clipboardfitur. Anda dapat melihat apakah Anda memiliki fitur ini dengan melakukan :versioninside vim, atau vim --versiondari shell, dan mencari +xterm_clipboard. Jika dikatakan -xterm_clipboard, Anda tidak memilikinya dan harus mengkompilasi ulang vim.

Patrick
sumber
Saya tidak memiliki fitur itu. Apakah mengkompilasi ulang bantuan bahkan vim tidak berjalan di bawah xterm? (Saya menggunakan terminal gnome).
Anthon
@Anthon Jika Anda menggunakan GUI VIM, maka saya yakin register juga diaktifkan. xterm_clipboardhanya jika menjalankan vim dari terminal.
Patrick
Ini hanya teks, tidak ada GUI VIM, tetapi tidak berjalan dari xterm.
Anthon
Oh, maaf saya salah membaca. Ya xterm_clipboardberlaku untuk emulator terminal apa pun, bukan hanya xterm. Saya sendiri menggunakan urxvt.
Patrick