Bagaimana saya bisa menjaga kode diformulasikan sebagai sumber asli ketika saya menempelkannya ke vim?

37

Ketika saya menyalin beberapa kode dari halaman web dan menempelnya ke VIM, saya merasa itu menjadi gaya berantakan seperti tangga sebagai berikut

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Karena itu kacau begitu teratur jadi saya pikir mungkin ada sesuatu yang salah dengan saya .vimrcyaitu sebagai berikut:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

Biasanya saya menulis python di VIM. Dan bantuan akan dihargai.

SpawnST
sumber
1
Terima kasih. Ini membuatku kesal selama bertahun-tahun, dan aku tidak pernah bertanya pada siapa pun tentang itu. +1.
DevSolar

Jawaban:

50

Lakukan ini sebelumnya:

:set paste

Kemudian setelah:

:set nopaste
Ignacio Vazquez-Abrams
sumber
Tidak dibutuhkan untuk gvim; ini menyalakan dan mematikan ini secara otomatis saat menempel.
Benjamin Bannier
tahu mengapa itu?
Nathan Fellman
1
Hanya menebak: Plain vim hanya command-line, dan tidak "tahu" tentang clipboard. Dibutuhkan "tempel" sebagai urutan karakter input, dan menerapkan indentasi otomatis. GUI yang sadar GUI mungkin "tahu" bahwa data yang masuk dari clipboard, dan karenanya menonaktifkan autindenting untuk tujuan tersebut.
DevSolar
Itu benar. Terminal memperlakukan operasi "tempel" sebagai input karakter mentah.
Ignacio Vazquez-Abrams
Ini bukan murni masalah vim - Anda bisa mendapatkan efek serupa menempel ke editor DOS lama di command prompt. Program ini tampaknya tidak ada pada Windows 7 64-bit - mungkin karena ini sebenarnya adalah aplikasi DOS 16-bit yang lama dan tidak perlu repot untuk memperbaruinya. Itu ada di Windows XP, dan menempel ke (1) bekerja sangat lambat, memerankan input karakter per karakter, dan (2) membuat kekacauan nyata.
Steve314
16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Beralih indentasi otomatis untuk menempelkan kode

Latar Belakang

Jika Anda menggunakan perintah Vim untuk menempelkan teks, tidak ada yang tidak terduga terjadi. Masalahnya hanya muncul ketika menempel dari aplikasi lain, dan hanya ketika Anda tidak menggunakan versi GUI Vim. Dalam versi konsol atau terminal Vim, tidak ada prosedur standar untuk menempelkan teks dari aplikasi lain. Sebagai gantinya, terminal dapat meniru menyisipkan dengan memasukkan teks ke buffer keyboard, jadi Vim berpikir teks telah diketik oleh pengguna. Setelah setiap baris berakhir, Vim dapat memindahkan kursor sehingga baris berikutnya dimulai dengan indentasi yang sama dengan yang terakhir. Namun, itu akan mengubah lekukan yang sudah ada dalam teks yang disisipkan.

Tempelkan sakelar

Masukkan yang berikut ini di vimrc Anda (ubah ke tombol apa pun yang Anda inginkan):

set pastetoggle=<F2>

Untuk menempel dari aplikasi lain:

  • Mulai mode penyisipan.
  • Tekan F2 (mengaktifkan opsi 'tempel' aktif).
  • Gunakan terminal Anda untuk menempelkan teks dari clipboard.
  • Tekan F2 (matikan opsi 'tempel' mati).

Kemudian lekukan yang ada dari teks yang disisipkan akan dipertahankan.

Anda tidak harus memulai mode penyisipan terlebih dahulu, tetapi jika Anda berada dalam mode normal dan memiliki pemetaan untuk F2, pemetaan itu akan berlaku, dan fungsi 'pastetoggle' tidak akan beroperasi.

Beberapa orang menyukai umpan balik visual yang diperlihatkan di baris status dengan alternatif berikut untuk vimrc Anda:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

Baris pertama menetapkan pemetaan sehingga menekan F2 dalam mode normal akan membalikkan opsi 'tempel', dan kemudian akan menampilkan nilai opsi itu. Baris kedua memungkinkan Anda untuk menekan F2 saat dalam mode insert, untuk mengaktifkan dan menonaktifkan 'tempel'. Baris ketiga memungkinkan menampilkan apakah 'tempel' dihidupkan dalam mode sisipkan.

aXqd
sumber
1
+1 untuk solusi hotkey. Untuk yang tidak terlalu tegas di VIM (seperti saya) yang sudah memetakan tombol-F untuk sesuatu yang lain (seperti saya), <C-F2> akan menjadi Ctrl-F2 ...
DevSolar
luar biasa - Saya sekarang menggunakan ini
hoju
mengapa tidak hanya memetakan kunci tempel untuk melakukan ini secara otomatis, seperti <S-Insert> atau <Ctrl + V>, bersama dengan fungsi aslinya? Atau, tulis fungsi yang menonaktifkan tempel ketika lebih dari beberapa karakter input ditulis ke buffer dalam waktu satu detik, itu hanya sebuah ide, tentu saja bagi saya, saya memiliki hampir SEMUA kunci saya dipetakan ke hal-hal lain sehingga sangat merepotkan. , Saya bahkan punya keyboard dengan 12 tombol F dan + 15 tombol F lainnya (tombol G), dan dengan itu, tiga level, yang masih belum cukup :) tapi itu hanya saya. Satu-satunya masalah adalah, menu klik kanan, yang tidak dapat dikirim oleh seqs esc untuk menandakan operasi awal ...
osirisgothra
2

Autoindent-lah yang mengacaukan Anda.

set autoindent
set smartindent

Cobalah untuk menonaktifkannya ketika Anda memotong dan menempelkan kode Anda, dan kemudian mengaktifkannya lagi setelah Anda selesai.

Johan
sumber
-2

Jumlah upaya terendah untuk mencapai ini adalah (dapat dimasukkan ke dalam .vimrc):

:set paste

Kemudian tempel kode Anda.

h2obro
sumber
3
The 'paste'pilihan tidak pernah dimaksudkan untuk ditetapkan secara permanen. Ini menonaktifkan banyak hal, termasuk pemetaan dan singkatan. Selain itu, jawaban sebelumnya sudah mencakup 'paste'opsi.
Heptite
2
Selamat Datang di Pengguna Super! Ini menggandakan jawaban yang ada dan tidak menambahkan konten baru. Tolong jangan memposting jawaban kecuali Anda benar-benar memiliki sesuatu untuk berkontribusi
Toby Speight