Mengapa shift insert hanya berfungsi sepenuhnya dalam mode insert?

13

Baru saja mencoba menempelkan beberapa konten (dalam Git Bash di server CentOS) ke dalam file menggunakan vim.
Saya baru saja membuka file dan mencoba menggunakan shift+ insertdan saya perhatikan bahwa paruh pertama (kira-kira) terputus, tetapi jika saya mengatur vim untuk memasukkan mode dan menekan shift+ insertsemuanya akan disisipkan dengan sempurna.
Apakah hanya ingin tahu mengapa ini?

Terima kasih

treyBake
sumber
Hei, aku juga punya dua jempol !!! : D
RonJohn

Jawaban:

24

Baik Shift+ Insertdan " paste " ke terminal berperilaku dengan cara yang sama - mereka meniru penekanan tombol.

Ini adalah perbedaan penting yang seringkali tidak mungkin dilakukan oleh terminal - apakah Anda mengetik atau menempel? Catatan : beberapa terminal mendukung mode " bracketed paste ", setelah komentar @ Josh saya bahkan menemukan plugin vim paste bracketed di xterm yang mungkin Anda minati.

Data yang Anda tempelkan akan hilang hingga karakter pertama yang memasuki mode penyisipan. Anda juga dapat menemukan bahwa kursor Anda telah bergerak dan bagian-bagian lain dari file telah berubah (misalnya: kasing / dihapus / dll) ...

Singkatnya, jika Anda menempelkan teks yang ingin Anda masukkan ke dalam file, masukkan mode insert terlebih dahulu.


Coba salin teks berikut dan tempel ke terminal yang menjalankan Vim (tidak dalam mode sisipan):

hello how are you

Hasilnya sama dengan mengetik huruf yang sama pada keyboard Anda:

hasil menempel ke Vim

Dalam hal ini, itu membuat Anda dalam mode memasukkan ...

Sekarang coba keluar dari mode penyisipan - Esc- dan tempel yang berikut

/are
n

Ini melakukan pencarian "adalah":

hasil menempel ke Vim

Sekarang tempel ini:

:0
dG

Oh tidak ... semuanya hilang!

semua hilang


Anda juga akan menemukan bahwa jika Anda telah mengaktifkan indentasi, maka menempelkan blok kode ke vim (dalam mode insert) akan membuat indentasi terlalu banyak - indentasi otomatis, dan kemudian kode yang Anda tempelkan akan memasukkan indentasi.

def my_print(message):
    print(message)
    print('done...')

kode paste

Untuk memperbaikinya, gunakan perintah :set pastedan:set nopaste

kode tempel (mode tempel)

Attie
sumber
4
"Ini adalah perbedaan penting yang tidak bisa dilakukan terminal - apakah Anda mengetik atau menempel?" - ini tidak sepenuhnya benar, beberapa terminal dan aplikasi mendukung "bracketed paste" di mana urutan khusus dikirim sebelum dan sesudah teks yang ditempelkan.
Ash
@Josh: menarik, terima kasih ... komentar Anda bahkan mengarahkan saya ke plugin vim
Attie
Apakah saya satu-satunya yang terganggu set nopaste? Saya harapkan unset paste.
Eric Duminil
@ThisGuyHasTwoThumbs sebagai alternatif, setidaknya saat menggunakan Vim, Anda mungkin ingin menggunakan "+register untuk berinteraksi dengan clipboard sistem, karena ini akan cenderung berperilaku lebih sehat. The downside adalah bahwa beberapa sistem atau membangun Vim dapat digunakan "*sebagai gantinya, atau hanya tidak memiliki dukungan clipboard sistem, tetapi dalam pengalaman saya, "+telah cukup dapat diandalkan.
8bittree