Saya ingin memiliki cara cepat mengatur 'paste'
opsi Vim , memasukkan beberapa teks, dan kembali ke nilai sebelumnya 'paste'
.
Sebuah kasus penggunaan tipikal memasukkan konten clipboard OS secara literal, terlepas dari mode penulisan ulang apa pun yang mungkin aktif, seperti lekukan otomatis, dan tanpa mengubah status Vim. Kasus penggunaan lain adalah untuk memungkinkan fitur makro OS untuk menyuntikkan penekanan tombol ke Vim dan meminta mereka ditafsirkan sebagai teks literal.
Ini jelas menggeneralisasi ke opsi lain - ide umumnya adalah untuk mengatur beberapa opsi tetapi hanya untuk durasi satu perjalanan melalui mode penyisipan.
Pada dasarnya saya ingin mengikat urutan kunci (katakanlah _i
) ke makro yang melakukan ini
:set paste
i…<Esc>
:set nopaste
di mana i…<Esc>
maksud saya beralih ke memasukkan mode (seperti dengan i
perintah) dan melanjutkan makro setelah kembali ke mode perintah, kecuali bahwa saya ingin berakhir dengan 'paste'
masih aktif jika sudah aktif sebelumnya. Bagaimana saya bisa melakukan ini?
Catatan: Konten clipboard OS dipetakan ke "*
register . Ketika itu berhasil, 'paste'
opsinya tidak terlalu berguna. Skenario memotivasi untuk pertanyaan ini adalah untuk saat-saat ketika kondisi untuk "*
dukungan register tidak terpenuhi - Vim tidak dikompilasi dengan +xterm_clipboard
fitur, atau sedang berjalan di terminal seperti Layar atau lebih dari SSH yang mengisolasinya dari server X ambient.
sumber
+
atau*
mendaftar?Jawaban:
Cobalah ini:
Ini menyimpan status tempel Anda saat ini di variabel inPaste dan menyetel tempel jika belum disetel. Kemudian ia mengatur autocmd ketika Anda meninggalkan mode insert, dan kemudian menempatkan Anda dalam mode insert.
Ketika Anda meninggalkan mode insert, ia menjalankan autocmd, yang pertama-tama menghapus autocmd (sehingga tidak bisa dijalankan ketika Anda meninggalkan mode insert dengan cara lain), dan akhirnya menetapkan nopaste jika Anda tidak berada dalam mode paste semula.
Juga, jika Anda menggunakan vim di terminal, Anda mungkin ingin melihat vim-bracketed-paste , yang menggunakan fitur mode tempel kurung yang disediakan oleh beberapa emulator terminal untuk mendeteksi jika Anda menempel dan mengatur mode secara otomatis.
Edit: memperbaiki skrip
sumber
_i
,paste
opsi tidak aktif, bahkan jika sudah aktif sebelumnya.'paste'
harus aktif sesingkat mungkin. Ini menonaktifkan banyak fungsi (termasuk peta), karena tujuan utamanya adalah untuk menghindari salah menafsirkan teks yang sedang ditempelkan. Karena itu, saya pikir persyaratan yang dikutip seharusnya tidak perlu.Yang sedang berkata, itu sebenarnya cukup mudah untuk ditempelkan tanpa perlu mengatur
'paste'
. Jika Anda menjalankan gvim atau menggunakan+xterm_clipboard
konsol vim, maka Anda dapat menggunakannya"+p
untuk menempel dari clipboard OS.Masalah lekukan sementara tempel hanya benar-benar terjadi dalam dua skenario. Memasukkan konten register saat dalam mode insert (
<C-r>+
) atau menempelkan klik tengah dengan mouse.Alih-alih menyisipkan konten register saat dalam mode insert, menempelkan dari register dalam mode normal akan menghindari masalah memformat ulang.
Jika Anda ingin melakukan klik tengah menempel dengan mouse, maka gunakan
'mouse'
opsi untuk membiarkan Vim, bukan terminal, menangani klik tengah. Vim kemudian akan memasukkan konten secara harfiah alih-alih menafsirkan teks yang masuk sebagai sedang diketik.sumber
'paste'
memang tidak aktif sebelumnya, tetapi saya tidak mau harus memikirkan hal ini. Saya sering bekerja di Vim yang tidak memiliki akses ke clipboard X atau mouse, baik karena Vim build saya tidak memilikixterm_clipboard
fitur, atau karena saya sedang bekerja di misalnya sesi Layar yang kebetulan saat ini dilampirkan ke sebuah Terminal X.i
, saya tidak menanyakan bagaimana cara menetapkan parameter ini), dan mengembalikan nilai opsi setelah kembali dari mode penyisipan."*p
atau"+p
menempel dari clipboard, tetapi saya tidak ingin menggunakan kemampuan tempel sistem") dan kemudian jawaban ini tidak perlu. Atau Anda tidak, dan kemudian saya pikir jawaban ini ada di sini.Secara pribadi, saya menggunakan yokeybinding dari plugin Tim Pope vim-unimpaired yang sangat baik untuk alasan ini. Dari dokumentasinya:
Mungkin terlalu sulit untuk menginstal plugin hanya untuk pertanyaan Anda, tetapi saya menemukan plugin ini juga menyediakan banyak sekali keybindings berguna lainnya (informasi lebih lanjut di README ).
sumber
Dengan Vim 8+ di Linux atau Mac, Anda sekarang dapat dengan mudah menggunakan tempel asli terminal (mis. Tombol mouse tengah,
ctrl+shift+V
di Gnome,cmd+V
pada Mac) jika terminal mendukung tempel braket. Jangan menekani
untuk Mode Sisipkan.Ini akan menempelkan isi clipboard OS Anda, menjaga spasi dan tab tanpa menambahkan autoindenting. Ini setara dengan tua
:set paste
,i
,ctrl+shift+V
,esc
,:set nopaste
metode.Anda bahkan tidak perlu menginstal fitur
+clipboard
atau+xterm_clipboard
vim lagi. Fitur ini disebut "braket tempel". Untuk detail lebih lanjut, lihat /programming/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56781763sumber