Hentikan vim menempelkan pilihan sebagai teks!

10

Saya telah menggunakan VI dan VIM selama bertahun-tahun (30 atau lebih) (di xterms, tidak sendiri jendela, gvim) dan saya memiliki perpustakaan besar vim perintah yang saya memberi vim menggunakan mouse tombol tengah sebagai pilihan.

Misalnya saya sering melakukan hal-hal seperti ...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

Pilihan akan mencakup banyak perintah VIM untuk melakukan hal-hal seperti mengganti tes, memformat, memindahkan garis, dll., Dll., Dan biasanya berakhir dengan: w dan: perintah VIM berikutnya, di akhir pemilihan, jadi vim siap untuk saya tempelkan lagi ke file berikutnya. Ini memungkinkan saya memperbarui sejumlah besar file dengan cara yang SANGAT rumit, tanpa memerlukan skrip khusus (seperti perl in-place editing) untuk melakukannya.

Beberapa pasta perintah vim ini panjangnya 200+ baris (disimpan dalam file teks yang saya pop-up di layar, dan 'copy-all'! Ini membuat BANYAK perubahan pada set ribuan file yang saya format ulang. Tapi hanya untuk set file tertentu, bukan untuk pekerjaan vim saya sehari-hari EG: Massal memformat ulang untuk file teks / data.

Masalah...

Selama patch sistem terakhir saya (Fedora 25) vim sekarang menempelkan pemilihan mouse SEBAGAI TEKS dan bukan sebagai perintah vim, dan sepertinya saya tidak bisa menghentikannya!

Ini masih berfungsi dengan baik pada sistem lain (Fedora 24).

Jika saya ingin menempelkan sebagai teks, saya masuk ke mode insert sebelum menempel! Saya tidak ingin VIM secara otomatis menempel teks AS pilihan ketika tidak dalam mode sisipkan. Saya mengerti ini dimaksudkan sebagai fitur keamanan, tetapi bagi saya itu adalah masalah kegunaan utama.

Saya telah mencoba kembali berkencan dengan entri terminfo (xterm-256color) dari mesin yang tidak melakukan ini (terutama entri terminfo "kmous"). Saya juga telah melihat pengaturan vim ": set mouse =" (yang nol!). Saya tidak tahu apakah itu xterm (diragukan), atau sesuatu yang berubah dalam VIM (kemungkinan), dan mengubah log dan google tidak membantu.

Namun sepertinya tidak ada yang membuat saya perilaku lama.

anthony
sumber
Menemukan pengguna lain dengan masalah yang sama, kurang detail, tidak ada solusi unix.stackexchange.com/questions/346293/…
anthony
1
Saya ragu itu kemungkinan besar vimperubahan: Bagaimana bisa vimdi dalam xtermtahu sesuatu dimasukkan melalui keyboard atau disisipkan melalui tombol mouse? Saya tidak tahu mekanisme seperti itu. Di sisi lain, xtermtahu bahwa itu sedang dieksekusi vimsehingga bisa memutuskan untuk mengitari pasta dengan idan <esc>. Coba (a) dengan jenis jendela terminal yang berbeda dan (b) salinan vimdengan nama yang berbeda. Ini akan membantu mempersempit penyebab masalah.
Philippos
Saya setuju dengan @philippos. Mungkin sesuatu selain vimmembajak metode tempel Anda. Mungkin coba ssh'ing atau telneting ke mesin Anda dan tempelkan dengan cara itu. Jika Anda memiliki kotak Windows, gunakan dempul untuk ssh ke mesin Fedora25 Anda dan rekatkan seperti itu.
Jim U
Tidak terkait langsung, tetapi gvim di windows telah berperilaku seperti ini selama bertahun-tahun. Ketika Anda menginstal gvim, Anda mendapatkan dua executable, gvim.exe(grafis-vim) dan command-line vim.exe. Tempel "itext" di gvim.exe dan Anda dapatkan itext. Rekatkan di vim.exe dan Anda dapatkantext
Jim U
1
@Philippos Mekanisme itu bisa di- bracket paste . Saya tidak tahu bagaimana Vim dapat mendukungnya, mungkin pastetogglepilihannya?
Gilles 'SO- stop being evil'

Jawaban:

12

Nah setelah melalui BANYAK halaman web, banyak memberikan beberapa petunjuk yang tampaknya tidak berfungsi, saya menemukan petunjuk (teks tambahan di sekitar tempel) yang mengarahkan saya ke penyebab dan solusi untuk masalah tersebut.

Tampaknya vim telah membangun ke dalamnya sejumlah entri termcap 'palsu' yang digunakannya ketika ia mengenali terminal tertentu (dan kadang-kadang salah, meskipun itu tidak salah dalam kasus ini).

Pengaturan termcap di vim adalah angka tambah karena TIDAK TIDAK muncul dalam daftar pengaturan ": set semua" yang normal. Untuk melihatnya, Anda perlu menggunakan ": set termcap". Pengaturan termcap 'non-standar' yang spesifik adalah "t_BE" (lihat vim ": help t_BE"). Bantuan bawaan "xterm-bracketed-paste" menjelaskan pengaturan termcap internal-ke-vim ini.

Pada dasarnya jika pengaturan ini didefinisikan (dalam hal ini oleh Vim bukan termcap / terminfo) maka vim akan mengirimkannya ke xterm ketika dijalankan, yang memberitahu xterm untuk menambahkan kode khusus di sekitar teks yang ditempelkan pengguna dari sumber eksternal. Ketika vim melihatnya, secara otomatis tidak hanya masuk ke mode insert tetapi juga menetapkan 'mode tempel' agar tidak memformat teks.

Nanti (paste-mode) menurut saya SANGAT berguna! Yang pertama adalah yang telah memberi saya semua masalah.

Solusi brute force adalah menonaktifkan braket-tempel dengan menambahkan ini ke ".vimrc"

:set t_BE=

Solusi Alternatif ....

Alih-alih menonaktifkan braket-tempel sepenuhnya, hentikan tindakan vim saat melihat urutan awal tempel terminal (dari mouse), saat berada dalam perintah atau mode normal.

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

Menggunakan ini berarti bahwa jika Anda menempelkan teks saat dalam mode insert-vim tidak akan mencoba untuk memformat (indentasi) teks yang lebih dari kemungkinan sudah indentasi.

Ini tidak berarti saya tidak lagi perlu beralih mode tempel, karena saya juga menggunakan mode tempel tempel (dipetakan ke F2) untuk menonaktifkan "showbreak" dan "listchars" (menampilkan garis yang dibungkus, tab, ruang tanpa jeda, dan ruang ekstra di ujung baris). Saya masih perlu menempatkan vim dalam mode itu ketika saya ingin membuat pilihan mouse untuk menempel di tempat lain.

Komentar dan Saran tentang solusi dipersilahkan.

anthony
sumber
Ini juga tampaknya bekerja di Cygwin Vm tetapi sayangnya tidak menyelesaikan masalah dalam VS Vim
James Robinson
@ JamesRobinson Kemungkinan besar ini adalah terminal builtin berbeda untuk VS
anthony