Saya berusaha untuk belajar Vim.
Ketika saya menempelkan kode ke dokumen saya dari clipboard, saya mendapatkan ruang ekstra di awal setiap baris baru:
line
line
line
Saya tahu Anda dapat mematikan indentasi otomatis tetapi saya tidak dapat mengaktifkannya karena saya memiliki beberapa pengaturan lain yang bertentangan atau sesuatu (yang terlihat cukup jelas di .vimrc saya tetapi tampaknya tidak masalah ketika saya mengeluarkannya).
Bagaimana cara mematikan indentasi otomatis ketika saya menempelkan kode tetapi masih memiliki indentasi otomatis vim ketika saya menulis kode? Ini .vimrc
file saya :
set expandtab
set tabstop=2
set shiftwidth=2
set autoindent
set smartindent
set bg=dark
set nowrap
cat > mynewfile.txt
menekan Enter , menempelkan teks Anda, tekan Enter lagi, lalu Ctr + D untuk menyimpan. File sekarang dibuat dan Anda dapat mengeditnya denganvim mynewfile.txt
.Jawaban:
Pembaruan: Jawaban yang lebih baik di sini: https://stackoverflow.com/a/38258720/62202
Untuk mematikan autoindent ketika Anda menempelkan kode, ada mode "tempel" khusus.
Tipe
Kemudian tempel kode Anda. Perhatikan bahwa teks dalam tooltip sekarang mengatakan
-- INSERT (paste) --
.Setelah Anda menempelkan kode Anda, matikan mode tempel, sehingga indentasi otomatis saat Anda mengetik berfungsi dengan benar.
Namun, saya selalu merasa tidak praktis. Itu sebabnya saya memetakan
<F3>
sedemikian rupa sehingga dapat beralih antara mode tempel dan nopaste saat mengedit teks! Saya menambahkan ini ke.vimrc
sumber
:set noai
diikuti oleh:set ai
. Saran:r! cat
lebih pendek.set paste
lebih mudah, pasti. Ini jauh lebih semantik daripadanoai
atau bahkannoautoindent
, yang lebih penting ketika mengetik "noai" dan "tempel" membutuhkan waktu yang sama ketika Anda cukup mahir sebagai pengetik sentuh.:set noai
tidak selalu berfungsi, tergantung pada bagaimana pengaturan terkait indent lain dikonfigurasi sesuai OP.:set paste
tampaknya menjadi singkatan untuk beberapa pengaturan sekaligus.set copyindent
akan mengurus ini untuk Anda dengan mulus.:set paste
juga menonaktifkan fitur lain seperti penyempurnaan kawat gigi, yang juga tidak diinginkan saat menempelkan kode.Untuk menghindari efek yang tidak diinginkan saat menempel, ada opsi yang perlu diatur:
Perintah yang berguna untuk ada di .vimrc Anda adalah
set pastetoggle=<F10>
atau tombol lain, untuk dengan mudah beralih antara tempel dan nopaste.sumber
nmap <silent> <leader>p :set paste<CR>"*p:set nopaste<CR>
Saya biasanya menggunakan
:r! cat
lalu menempelkan( shift + insert )
konten, danCTRL+D
.Tidak perlu mengaktifkan & menonaktifkan, penggunaan langsung.
sumber
:r! cat
kerjanya.:r
menyisipkan isi file ke dalam dokumen saat ini.!cat
mengatakan, jalankan cat yang pada dasarnya membuka stdin (* nix shells)(shift + insert)
atau untuk beberapa terminal, klik kanan mouse akan menempelkan isi clipboard ke terminalCTRL+D
adalah end-of-file, sehingga menutup:r !cat
sesi.paste
dibuat hanya untuk tujuan ini? @ jvriesem Ini bukan opsi 'langsung', jika apa yang saya anggap pemahaman Anda tentang kata itu benar.:r! cat
kemudianCTRL+SHIFT+V
untuk menyisipkan di terminal (kemudianCTRL+D
).Jika Anda bekerja secara lokal, Anda dapat menempel dari clipboard sistem dengan urutan tombol:
"+p
Ini adalah perintah vim yang tepat, jadi tidak perlu khawatir memasukkan mode penyisipan atau mematikan autindent terlebih dahulu.
Tentu saja jika Anda bekerja dari jarak jauh (konsol lebih dari SSH, misalnya) maka ini tidak akan berhasil dan Anda harus pergi
:set noai
, masukkan mode, tempelkan ke konsol, tinggalkan metode masukkan,:set ai
rute seperti dijelaskan di tempat lain.sumber
:set paste
dan:set nopaste
sebagai gantinya karena lebih lama, lebih mudah diingat dan saya tidak harus mencarinya setiap waktu!:set paste
tidak diterapkan, jadi:set noai
sebaiknya digunakan.<leader>p
.. sangat berguna!Saat mengatur mode tempel dengan
paste/nopaste/pastetoggle
sangat baik, Anda masih harus mengaktifkan mode tempel secara manual sebelum menempel dan menonaktifkan mode tempel setelah menempel. Menjadi orang yang malas seperti saya, di bawah ini adalah solusi terbaik yang saya temukan sejauh ini, yang secara otomatis mengubah mode tempel ketika Anda menempel.Sumber: Coderwall
Catatan: Solusi ini tidak berfungsi di WSL (Windows 10 Subsystem untuk Linux). Jika ada yang punya solusi untuk WSL, harap perbarui jawaban ini atau tambahkan dalam komentar.
Tmux Jika menggunakan tmux, maka deklarasi harus diloloskan ganda. Kode untuk ini juga ada di Coderwall
sumber
t_SI
dant_EI
mengaktifkan bracketing paste dan menonaktifkannya. Saat menempelkan tanda kurung aktif, teks yang disisipkan diawali olehesc[200~
dan diikuti olehesc[201~
.Pengguna Mac dapat menghindari pemformatan otomatis dengan membaca langsung dari papan tulis dengan:
sumber
:.!pbpaste
, ini akan berfungsi dengan mengganti baris saat ini dengan output dari buffer pasta. Secara umum, vim memungkinkan Anda untuk mem-pipe data yang ada di file Anda saat ini ke program lain dan mengganti teks dengan output dari perintah. Jadi,:1,3!pbpaste
ganti tiga baris pertama file Anda dengan buffer paste. Saya gunakan:.!ppjson
untuk mengambil string JSON yang sangat panjang (tidak diformat) dan memformatnya dan mengganti string panjang dengan setara yang diformat. ppjson hanyalah skrip bash yang berjalanpython -m json.tool
.Ini adalah posting oleh seseorang yang menemukan cara untuk memetakan kembali acara tempel untuk secara otomatis mengaktifkan mode tempel dan kemudian mematikannya. Bekerja untuk saya di tmux / iTerm di MacOSX.
sumber
Tambahkan ini ke Anda
~/.vimrc
dan Anda hanya perlu menekan F2 sebelum dan sesudah menempel:sumber
Saya baru saja memasukkan
set clipboard=unnamed
.vimrc saya. Itu membuat peta penyangga tempel default ke papan klip X.Jadi, jika saya menandai sedikit teks di terminal, saya cukup menekan
p
untuk menempelkannya di vim. Demikian pula, saya dapat menarik hal-hal di vim (misalnyaYY
untuk menarik garis saat ini ke buffer) dan klik tengah di jendela mana saja untuk menempelkannya.Tidak tahu Saya merasa sangat nyaman.
sumber
Ketika bekerja di dalam terminal, vim-bracketed-paste vim plugin akan secara otomatis menangani pasta tanpa perlu penekanan tombol apa pun sebelum atau setelah menempel.
Ia bekerja dengan mendeteksi mode rekatkan kurung yang merupakan urutan keluar yang dikirim oleh terminal kompatibel term-term "modern" seperti iTerm2, terminal gnome, dan terminal lain menggunakan libvte. Sebagai bonus tambahan berfungsi juga untuk sesi tmux. Saya berhasil menggunakannya dengan iTerm2 pada Mac yang terhubung ke server linux dan menggunakan tmux.
sumber
Simpan ini di ~ / .vimrc Anda dan senang:
Sunting: refleksi,
:r !cat
adalah pendekatan yang jauh lebih baik karena pendek, semantik, dan tidak memerlukan vimrc khusus. Gunakan itu sebagai gantinya!sumber
Meskipun
:pastetoggle
atau:paste
dan:nopaste
harus bekerja dengan baik (jika diterapkan - tidak selalu seperti yang dapat kita lihat dari diskusi) Saya sangat merekomendasikan menempel menggunakan pendekatan langsung"+p
atau"*p
dan membaca dengan"+r
atau"*r
:Vim memiliki akses ke sepuluh jenis register (
:help registers
) dan si penanya tertarik masukquotestar
danquoteplus
dari bagian:help x11-selection
selanjutnya mengklarifikasi perbedaan*
dan+
:sumber
Ini berfungsi untuk saya (case untuk + register, apa yang saya gunakan seperti pertukaran buffer antar aps):
sumber
Jika Anda menggunakan mac, macvim tampaknya menanganinya dengan baik tanpa harus beralih tempel.
buat install macvim --override-system-vim
sumber
.vimrc
file Anda ?Silakan baca artikel ini: Beralih indentasi otomatis untuk menempelkan kode
sumber
Cara tercepat yang saya sadari untuk dengan cepat pergi ke mode tempel-sisipkan untuk tempel sekali pakai adalah tpope tidak mengalami gangguan , yang menampilkan
yo
danyO
, mungkin mnemonik untuk “Anda buka”. Mereka hanya didokumentasikan dalam vimdoc-nya, sebagai:sumber
Cara lain untuk menempelkan adalah melalui
<CR>
dan menjatuhkan konten register (di sini register global). Lihat::h i_ctrl-r
danh i_CTRL-R_CTRL-O
.Dari dokumentasi bantuan vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}
Jadi untuk menempelkan konten ke vim tanpa indentasi otomatis, gunakan
<CR><CO>*
di sebagian besar sistem unix.Catatan: ini hanya berfungsi jika vim dikompilasi dengan
clipboard
.sumber
Dari vim:
]p
Dari luar:
"*]p
atau"+]p
sumber
Jawaban lain yang tidak saya lihat sampai sekarang:
sumber
Pasta asli / braket tempel adalah cara terbaik dan paling sederhana sejak
vim 8
(dirilis pada 2016). Ia bahkan bekerja lebih dari ssh! (Bracketed paste berfungsi di Linux dan Mac, tetapi bukan Windows Git Bash)Pastikan Anda memiliki vim 8+ (Anda tidak memerlukan
+clipboard
atau+xterm_clipboard
opsi).vim --version | head -1
Cukup gunakan perintah tempel asli OS (mis.
ctrl+shift+V
Ataucmd+V
) dalam Mode Normal. Jangan menekani
untuk Mode Sisipkan.Uji
Salin (
ctrl+shift+C
ataucmd+C
) output dari ini (2 baris dengan indentasi tab) ke clipboard sistem:echo -e '\ta\n\tb'
Luncurkan vim 8+ bersih dengan autoindent:
vim -u NONE --noplugin -c 'set autoindent'
Tempel dari papan klip sistem (
ctrl+shift+V
ataucmd+V
) dalam Mode Normal. Jangan menekani
untuk Mode Sisipkan. Thea
danb
harus sejajar dengan tab indent tunggal. Anda bahkan dapat melakukan ini saat ssh-ing ke mesin jarak jauh (mesin jarak jauh akan membutuhkan vim 8+).Sekarang coba cara lama, yang akan secara otomatis mengidentifikasi baris kedua dengan tab tambahan: Tekan
i
untuk Mode Sisipkan. Kemudian tempel menggunakanctrl+shift+V
ataucmd+V
. Thea
danb
tidak selaras sekarang.Memasang Vim 8
Ubuntu 18.04 - datang dengan Vim 8 secara default .
Ubuntu 16.04 - instal dari PPA .
brew install vim
sumber
Featured snippet
untuk pencarian saya 'paste konten tanpa tab', mungkin karena, saya menggunakan kata kunci 'tab', hanya dalam jawaban ini disebutkan :)Sayangnya saya menemukan plugin vim yang disebutkan tidak dapat bekerja dengan iTerm2 3.0.15 (agar adil saya tidak tahu apakah ini rusak pada versi yang lebih lama) - tetapi saya malah menemukan hack ini.
Map command-p untuk melakukan paste dan menggunakan kunci vim iterm2. Jelas ini hanya berfungsi untuk iTerm2.
Bagaimana itu bekerja. Saya menggunakan "jk" untuk masuk ke mode melarikan diri sehingga Anda juga perlu:
: inoremap jk
di .vimrc Anda.
Kemudian itu hanya memanggil P untuk masuk ke mode tempel, "+ p untuk menempel dari clipboard dan kemudian P untuk menonaktifkan mode tempel. Hth.
sumber