Mengapa Vim indent kode yang disisipkan salah?


101

Di Vim, jika saya tempel skrip ini:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Saya mendapatkan hasil aneh ini:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Tanda hash (#) dan tab telah muncul. Mengapa?


31
Ini mungkin pertanyaan yang lebih baik untuk vi.stackexchange.com
Eric Renouf

@ EricRenouf mengapa? (pertanyaan jujur)
Qix

3
@ qix saya pikir ini adalah pertanyaan tentang bagaimana vim bekerja, yang merupakan alat umum untuk digunakan pada * nix, tetapi * nix bukan persyaratan untuk menggunakan vim
Eric Renouf

1
@JaredBurrows Saya sangat berharap ini membuatnya
Eric Renouf

1
Bagaimana Anda memicu pasta? Dengan mouse?
Ben Voigt

Jawaban:


123

Ada dua alasan:

Untuk menempel di vimsaat indentasi diaktifkan, Anda harus mengubah ke mode tempel dengan mengetik:

:set paste

Kemudian Anda dapat mengubah untuk memasukkan mode dan menempelkan kode Anda. Setelah menempel, ketikkan:

:set nopaste

untuk mematikan mode tempel. Karena ini adalah tindakan umum dan sering, vimmenawarkan mode tempel tempel:

set pastetoggle=<F2>

Anda dapat mengubah F2ke tombol apa pun yang Anda inginkan, dan sekarang Anda dapat menghidupkan dan mematikan tempel dengan mudah.


Untuk mematikan penyisipan komentar secara otomatis, Anda dapat menambahkan baris ini ke vimrc Anda :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimjuga menyediakan register tempel bagi Anda untuk menempelkan teks dari clipboard sistem. Anda dapat menggunakan "*patau "+pbergantung pada sistem Anda. Pada sistem tanpa X11, seperti OSX atau Windows, Anda harus menggunakan *register. Pada sistem X11, seperti Linux, Anda dapat menggunakan keduanya.

Bacaan lebih lanjut


2
Saya telah menggunakan Vim selamanya dan tidak pernah tahu tentang ini. Terimakasih banyak.
Caja

Kebanyakan emulator terminal grafis modern mendukung fitur yang disebut "mode tempel kurung". Vim dapat meminta terminal untuk mengaktifkan mode ini, yang, pada gilirannya, akan mengelilingi teks yang disisipkan dengan urutan pelarian tertentu. Vim dapat mengenali ini dan mematikan pembungkus / indentasi selama durasi tempel. Stort cerita panjang: menempel akan "bekerja seperti yang diharapkan". Saya bukan pengguna vim, tetapi pencarian web cepat akan memberi tahu Anda cara mengkonfigurasi mode ini.
egmont

2
@MichaelDurrant set pastetidak boleh ada di vimrc Anda. Ini menonaktifkan atau me-reset banyak hal, termasuk pemetaan mode insert, pemetaan baris perintah, singkatan, lebar pita, wrapmargin, autoindent, smartindent, softtabstop, formatoptions, indentexpr, dan beberapa lainnya. :h pastememiliki seluruh daftar. Kebanyakan orang menggunakan beberapa atau semua hal ini dan bertanya-tanya mengapa pengaturan di sana diabaikan.
FDinoff

4
Saya biasanya menggunakan :r!catuntuk menempelkan kata demi kata.
Simon Richter

1
Mungkin perlu mendiskusikan interaksi dengan set mouse, yang secara otomatis dapat masuk dan keluar dari mode tempel ketika menempel dengan klik mouse.
Ben Voigt

36

Gunakan tempel vim. Yang Anda inginkan adalah menempelkan apa yang ada di buffer clipboard "+p

Ini memilih +dan menempelkannya di tempatnya.

Jika Anda menggunakan Linux, *adalah buffer X / klik tengah (teks yang dipilih terakhir).

Lalu vim tahu itu pasta.

Kalau tidak vim mengira Anda telah mengetik kunci yang ditempelkan dan melakukan indentasi sendiri (di atas lekukan yang Anda salin) sampai ke akhir tempel.

Sebagai catatan agar ini dapat berfungsi pada SSH, Anda perlu mengatur opsi untuk clipboard Anda untuk dibagikan -Y

Lihat man sshuntuk lebih jelasnya.


4
Ini sebenarnya jawaban yang benar imho
Kristoffer Sall-Storgaard

Sepertinya ini hanya berfungsi untuk vim grafis ( gvim); vim berjalan dalam emulator terminal menempelkan teks yang terakhir dihapus dengan "* p, bukan pilihan saat ini.
wurtel

Saya tidak menggunakan gvim, hanya terminal vim. apa pengaturan mouse anda? pengaturan mouse saya adalah c. Tidak yakin cara kerjanya ketika pemilihan mouse diizinkan. set mouse?
exussum

2
juga periksa vim --versionapakah melihat apakah itu dikompilasi dengan dukungan clipboard +xterm_clipboardharus dalam output
exussum

@wurtel: Mungkin Anda telah mengatur clipboard dengan unnamedstring.
cuonglm

8

Tab dimasukkan karena Anda telah mengaktifkan otomatis dan Anda dapat menonaktifkan perilaku itu dengan mematikan autoindent ( :set noai) sebelum Anda menempel ke terminal.

Baris yang dikomentari dihasilkan oleh komentar otomatis dan dapat dinonaktifkan dengan mematikannya.

Alternatif bagi mereka, Anda harus mendapatkan perilaku yang diinginkan menggunakan toggle :set paste, menempelkan kode yang diformat dan :set nopasteuntuk mengembalikan perilaku normal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.