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.


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

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.


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.


-2

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

:set paste

Kemudian tempel kode Anda.


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
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.