Bagaimana cara memperbaiki lekukan seluruh file di Vi?

625

Dalam Vim, apa perintah untuk memperbaiki indentasi semua baris?

Sering kali saya akan menyalin dan menempelkan kode ke terminal jarak jauh dan semuanya kacau. Saya ingin memperbaiki ini dalam satu gerakan.

mmcdole
sumber
Mirip: Re-indenting kode indentasi buruk di Vi SE
kenorb
8
Mencegah lebih baik daripada mengobati. Dalam semangat itu muncul komentar ini. Lakukan ": atur tempel" sebelum memasuki mode sisipkan dan tempel kode dari terminal jarak jauh.
Proyek Chthonic

Jawaban:

1215

=, perintah indent dapat mengambil gerakan. Jadi, gguntuk memulai file, =indentasi, Ghingga akhir file gg=G,.

Logan Capaldo
sumber
39
Saya tidak akan pernah bisa melepaskan 1G saya yang berharga =) Salah satu favorit saya adalah =% berdiri di atas braket pembuka. Ini memperbaiki indentasi seluruh blok.
PEZ
2
: 0 <kembali> tidak terlalu buruk tapi gg bagus. (Ya, saya belajar dulu)
Erik Olson
8
Bisakah saya membuat indentasi seluruh file tanpa meninggalkan baris saat ini?
Fábio Perez
86
@ Fábio: ''(dua tanda kutip tunggal) membawa Anda kembali ke tempat Anda gg=G''semestinya jadi harus indentasi kemudian kembali.
Nemo157
@ArchimedesTrajano vim saham Mac OS sudah sangat tua, saya sarankan versi HomeBrew; ini jauh lebih baru. Saya memiliki beberapa masalah yang mengganggu dengan vim Mac. Juga, saya mendengar bahwa Anda tidak boleh main-main dengan yang ada di dalamnya, jadi jangan coba memperbaruinya sendiri kecuali Anda sangat berhati-hati.
AlexMA
126

Sebelum menempel ke terminal, coba :set pastedan :set nopastesetelah selesai. Ini akan mematikan indentasi otomatis, pembungkus baris, dan fitur lain yang mengacaukan tempel Anda.

sunting: Juga, saya harus menunjukkan bahwa hasil yang jauh lebih baik daripada =indentasi biasanya dapat diperoleh dengan menggunakan program eksternal. Sebagai contoh, saya menjalankan :%!perltidysemua waktu. astyle,, cindentdll. juga dapat digunakan. Dan, tentu saja, Anda dapat memetakannya ke stroke kunci, dan memetakan yang berbeda keystroke yang sama tergantung pada jenis file.

derobert
sumber
5
Anda dapat mengatur equalprgopsi di ftplugin untuk menggunakan filter eksternal untuk =indentasi, daripada pengikatan tombol khusus.
Josh Lee
Juga ada opsi pengikat tombol pastetoggle misalnya. : set pt \ p untuk beralih di antara mode
michael
Catatan: dalam konfigurasi grml's, tombol pastetoggle dipetakan ke F11
Thomas
Saya gunakan formatpgmdengan rapi dan astyle dan kemudian gq. Berikut adalah beberapa contoh dari saya .vimrc: au FileType xml set fp=tidy\ -q\ -i\ -xmldanau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian
baru saja mengunduh perltidy setelah membaca ini, ini jauh lebih baik daripada indentasi otomatis vim default
Joey Ciechanowicz
29

Jika Anda ingin mengaktifkan kembali blok tempat Anda berada tanpa harus mengetik akord apa pun, Anda dapat melakukannya:

[[=]]
Andrew Wagner
sumber
1
Maaf untuk menghidupkan kembali ini, tetapi apa yang Anda maksud dengan akord? Coords?
John P
7
"Akor" di sini mengacu pada perintah yang dikeluarkan dengan menekan satu tombol sambil menekan yang lain, dalam analogi dengan akord musik ada beberapa nada yang berbunyi sekaligus. Jadi G adalah shift + g, ^] adalah ctrl +], dan seterusnya. Ini membutuhkan waktu lebih lama untuk diketik daripada binding satu tombol.
Ralph Giles
Anda juga dapat menggunakan =aBkursor yang tidak akan bergerak sama sekali.
Amin
7
Pada keyboard Nordik, [[=]]dibutuhkan 5 akor :(
k4kuz0
29

Tuan dari semua perintah adalah

gg=G

Ini indentasi seluruh file!

Dan di bawah ini adalah beberapa perintah sederhana dan elegan yang digunakan untuk membuat garis cepat di Vim atau gVim.

Untuk membuat indentasi semua baris di bawah baris saat ini

=G

Untuk indentasi baris saat ini

==

Untuk membuat ngaris di bawah garis saat ini

n==

Misalnya, untuk membuat indentasi 4 baris di bawah baris saat ini

4==

Untuk membuat indentasi blok kode, buka salah satu kawat gigi dan gunakan perintah

=%
Sagar Jain
sumber
17

Anda dapat menggunakan aplikasi / utilitas yang rapi untuk membuat indentasi file HTML & XML dan ini berfungsi cukup baik dalam indentasi file tersebut.

Prettify file XML

:!tidy -mi -xml %

Prettify file HTML

:!tidy -mi -html %
Naga Kiran
sumber
16

tekan escape dan kemudian ketikkan kombinasi di bawah ini dengan cepat:

gg=G
tokhi
sumber
28
Saya mengetik dengan lambat, Anda tidak akan percaya apa yang terjadi selanjutnya.
k0pernikus
Saya baru saja memberikan jawaban dan komentar yang mendukung karena itu sangat berharga! lol @ k0pernikus
gglasses
12

1G=G. Itu harus membuat indentasi semua baris dalam file. 1Gmembawakan Anda baris pertama, =akan memulai indentasi otomatis dan final Gakan membawa Anda baris terakhir dalam file.

Amjith
sumber
Atau bahkan1gg=G
Biggybi
1G = G memperbaikinya untuk saya. Luar biasa!
Natus Drew
8

:set pasteadalah teman Anda, saya menggunakan dempul dan akhirnya menyalin kode antar windows. Sebelum saya dihidupkan :set paste(dan :set nopaste) copy / paste memberi saya cocok karena alasan itu.

Elsporko
sumber
1
Ya, saya juga menggunakan dempul. : set paste is awesome
mmcdole
7

Di Vim, gunakan :insert. Ini akan menjaga semua format Anda dan tidak melakukan indentifikasi otomatis. Untuk informasi lebih lanjut help :insert.

Eric Johnson
sumber
7

jika Anda tidak ingin menggunakan :set paste, klik tengah set nopaste,, Anda juga dapat menempelkan isi clipboard:

"*p
"+p

Dengan begitu Anda tidak harus meninggalkan mode normal. jika Anda harus menempelkan +atau *bergantung pada cara Anda memilih teks, lihat :help quoteplus.

0x89
sumber
4

vim-autoformat memformat file sumber Anda menggunakan program eksternal khusus untuk bahasa Anda, mis. permata "rbeautify" untuk file Ruby, paket "js-beautify" npm untuk JavaScript.

Wojtek Kruszewski
sumber
3

Untuk file C ++ yang kompleks, vim tidak selalu mendapatkan pemformatan yang benar saat menggunakan =perintah filter vim . Jadi untuk situasi seperti itu, lebih baik menggunakan formatter C ++ eksternal seperti astyle (atau tidak bisa dipercaya ) misalnya:

:%!astyle

Fungsi Vim '=' menggunakan formatter internal secara default (yang tidak selalu membuat segalanya menjadi benar) tetapi kita juga dapat mengaturnya menggunakan formatter eksternal, seperti astyle, dengan mengaturnya dengan tepat seperti yang dibahas dalam pertanyaan ini .

Pierz
sumber
1

Anda dapat membuat pemetaan untuk melakukan ini untuk Anda.

Yang ini akan membuat indentasi keseluruhan file dan tetap menjaga kursor Anda di posisi Anda:

nmap <leader>ai mzgg=G`z
Sergio D. Márquez
sumber
0

Untuk vi Editor, gunakan: masukkan. Ini akan menjaga semua pemformatan Anda dan tidak memasukkan indentasi otomatis. Setelah selesai tekan escape untuk melihat file yang diformat yang sebenarnya jika tidak, Anda akan melihat beberapa karakter sampah. seperti ^ I eg:

public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert"); 
}
ps2090
sumber
0

Masuk saja ke mode visual dalam vim, dan pilih dari atas ke bawah setelah memilih cukup tekan =, Semua baris yang dipilih akan indentasi.

Ramanand Yadav
sumber
Saya akan menghindari ini. Mode visual adalah ketika Anda tidak yakin tentang gerakan Anda, jika Anda tahu cara menangkap sekumpulan karakter maka tidak ada gunanya langkah tambahan untuk masuk ke mode visual. Kenapa ggvG=kalau bisa gg=G. Apa gunanya membuat gerakan itu terlihat? Itu berlaku untuk semua tindakan yang mengambil gerakan.
alextes