Kode indent / format otomatis untuk Vim?

35

Saya mencoba menggunakan Vim lebih banyak dan lebih banyak lagi ketika saya bisa. Salah satu pegangan terbesar saya antara Vim dan IDE seperti Aptana adalah kemampuan untuk indentasi otomatis.

Apakah ada cara kode pemformatan otomatis (HTML, CSS, PHP) sehingga indentasi dengan benar?

Jika demikian, bagaimana Anda menginstal ini ke vim? Saya tidak terlalu mengerti plugin. Saya mencoba meninjau utas ini dan lebih membingungkan saya: Bagaimana cara mengubah perilaku indentasi vim?

chrisjlee
sumber
Bisakah Anda menjelaskan bahasa apa yang ingin Anda indentasi? Saya berharap bahwa jika sudah didukung oleh vim sudah seharusnya inden otomatis tanpa upaya lebih lanjut. Jika tidak, Anda harus bisa mendapatkan plugin.
Edd Steel
idealnya Html / css dan php
chrisjlee

Jawaban:

54

Untuk membuat indentasi seluruh file secara otomatis:

gg
=G

Dijelaskan:

  • gg - pergi ke awal file
  • G - pergi ke akhir file
  • =- indentasi
takeshin
sumber
2
Bisakah Anda memecahnya? Apa yang biasanya g dengan sendirinya? dan = G?
chrisjlee
@ Chris lihat hasil edit
takeshin
1
Petunjuk yang bagus, saya tidak pernah tahu ini. Namun, ia melakukan pekerjaan sampah dengan bash.
Sparhawk
Bagaimana cara mengeksekusi gg=Gdari shell tanpa membuka file?
WM
@takeshin bisa tolong jelaskan lebih jauh, apakah kita perlu mengetikkannya di file atau kita perlu menjalankannya di terminal
Kasun Siyambalapitiya
14

Saya tidak tahu tentang memformat otomatis kode yang ada, tetapi jika Anda menulis kode dan perlu indentasi otomatis:

  • :set autoindent(atau :set ai) akan mengaktifkan indentasi otomatis
  • Ctrl- duntuk membatalkan indentasi (AKA outdent) kode Anda
  • Tab atau spasi untuk indentasi - Saya pribadi menggunakan tab
  • :set tabwidth=4(atau :set tw=4) akan mengontrol berapa spasi spasi yang harus dimasukkan dalam kode
  • The >>perintah akan indent baris saat ini. Jika Anda 4>>awali dengan angka, ucapkan maka itu akan membuat indentasi 4 baris, dimulai dengan baris saat ini.
  • Demikian juga << perintah akan menghapus indentasi baris

Saya harap ini memberi Anda awal yang baik.

Hai Vu
sumber
7
Untuk indentasi kode yang ada, gunakan ={motion}dalam mode normal - mis. =GAkan membuat indentasi semua kode dari baris saat ini ke akhir file. ==akan membuat indentasi baris saat ini.
Edd Steel
1
pastikan juga indent plugins sedang dimuat (mis. with :filetype indent on)
jw013
2
atur tw = 4 atur TEXTWIDTH ke 4
Steffen Roller
4

Indentasi Otomatis *.sh

Cukup tambahkan baris berikut di ~/.vimrc

filetype indent on
set smartindent
autocmd BufRead,BufWritePre *.sh normal gg=G
Rahul Patil
sumber
Apakah ini hanya berlaku untuk pengeditan dengan vim atau semua alat editor?
WM
1
~./vimrchanya berlaku untuk editor vim.
Rahul Patil
2

Plugin ini memudahkan untuk melakukan pemformatan pada kode Anda. Ini mengintegrasikan pemformat eksternal, dan memiliki fungsi mundur pada indentasi vim.

https://github.com/Chiel92/vim-autoformat

Juga, perhatikan perbedaan antara pemformatan dan indentasi. Mengorentasi hanya mengoreksi spasi putih sebelum setiap baris, sementara memformat juga berurusan dengan hal lain, seperti spasi putih di sekitar operator dll.

Chiel ten Brinke
sumber
2

Buat / edit ~/.vimrcfile dan tambahkan baris berikut:

set autoindent
Akshat Maheshwari
sumber
2
Ini tidak menambah jawaban yang ada ...
jasonwryan
@jasonwryan Sebenarnya jawaban Hai Vu menyebutkan :set autoindentyang memungkinkan indentasi otomatis hanya untuk file saat ini. Menambahkannya dalam .vimrcfile memungkinkan indentasi otomatis secara permanen.
Akshat Maheshwari
komentar Anda sudah disebutkan oleh jawaban Rahul, jadi pikirkan sebelum memposting
Indrajeet Gour
0

Dalam bash saya melakukan ini:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri| cut -c 5-|head --lines=-1|tail --lines=+3

ini menghilangkan komentar dan meng-reindents script "bash way". itu tidak akan berfungsi jika skrip berisi HEREDOCS tetapi jika Anda melakukan ini:

source <(echo "Zibri () {";cat script_to_be_reindented.sh; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3

ini akan bekerja dengan skrip apa pun tetapi keseluruhan skrip akan di-indentasi oleh 4 spasi. jangan ragu untuk memodifikasi tetapi mengutip nama saya di skrip Anda dan mempostingnya! : D

Zibri
sumber
Saya percaya ini mungkin melewatkan inti pertanyaan; Daripada membuat satu set garis, saya percaya OP ingin indentasi otomatis dalam VIM untuk berbagai bahasa. Sebagai tambahan, Anda mungkin dapat mencapai ini sedikit lebih langsung dengan sedjika Anda menginginkannya: cat script_to_be_reindented.sh | sed 's#^# #g'(er, well, SO penurunan harga adalah mengganti spasi dengan tab, tetapi Anda mendapatkan intinya)
eacousineau
0

Autoformat / indentasi vim bekerja cukup baik. Pertama, letakkan baris ini di ~/.vimrc:

filetype plugin indent on

Kemudian buka file dalam vim dan ketik gg=G

( ggmemindahkan kursor ke baris pertama. =menjalankan perintah indent. Gmemberi tahu perintah indent untuk berjalan dari sini ke baris terakhir.)

Jika autoformat terlihat sangat buruk, seperti setiap baris dibiarkan menjorok ke dalam, kemudian jalankan :scriptnamesdan periksa apakah .../indent/html.vim(atau bahasa apa pun yang Anda gunakan) ada dalam daftar. Jika tidak, pastikan Anda ~/.vimrcbenar. Atau jika Anda lari :filetype plugin indent ondari baris perintah vim, Anda harus membuka kembali file:e

wisbucky
sumber