Re-indentasi kode indentasi buruk


39

Saya suka fitur indentasi pintar dari Vim, ini memungkinkan saya untuk membuat blok kode yang terindentasi dengan baik.

Saya secara teratur menyalin / menempel kode ke buffer, tetapi kode itu sering diformat dengan buruk.

Apa yang ideal adalah "memproses ulang" kode melalui sistem indentasi pintar.

Apakah hal seperti itu mungkin?

Misalnya, bagaimana Anda 'memperbaiki' kode berikut (ekstrak dari blok yang lebih besar - Saya tidak ingin memperbaiki setiap baris secara manual ...):

    else 
                {
                        m[c] = 5;
                Finished = true;
std::cout<<"(ID,R,E)"<<"-->"<<"("<<g[c]<<","<<r[c]<<","<<E1 <<")"<< std::endl;
std::cout << "\n"<<"finish-->" << r[c] << "\t" <<"E1-->"<< E1 <<"\n" ;
                }
        }

1
Apakah Anda berbicara tentang menempelkan kode yang awalnya indentasi buruk atau kode indentasi yang benar yang berubah ketika Anda menempelkannya ke Vim?
jamessan

Kode yang disisipkan dengan buruk indentasi untuk memulai. Biarkan saya sertakan sebuah contoh ....
rolfl

Jawaban:


48

Saya melakukan ini salah satu dari dua cara.

Indent pasta yang disesuaikan

Pertama, jika kode dalam buffer diformat, tetapi pada tingkat lekukan yang berbeda, saya menggunakan ]palih-alih p, yang menempelkan kode seperti apa adanya, tetapi dengan lekukan yang digeser sedemikian rupa sehingga baris pertama yang dilekatkan memiliki kedalaman yang sama dengan baris I sedang.

Sumber EG disalin ke buffer

while (1) {
    dostuff();
}

EG hasil menempelkannya dengan ]p

int myfunc() {
    int i = 5; /* Cursor on this line before paste */
    while (1) {
        dostuff();
    }
 }

vim menempatkan sementara pada tingkat indentasi yang sama dengan int i. Ini cepat, tetapi hanya berfungsi jika kode yang disalin dimasukkan dengan benar di dalamnya.

Memformat ulang setelah menempel

The =operator dalam memformat vim kode berdasarkan aturan memformat dikonfigurasi. Untuk cuplikan singkat tempelan, saya akan masuk ke mode visual dengan v, pilih garis yang baru saja saya tempel dan kemudian tekan =untuk memformat ulang mereka.

Untuk pasta yang lebih besar, saya mengambil keuntungan dari fakta bahwa kursor mengarah ke baris yang disisipkan pertama, dan vim itu mengatakan sesuatu seperti "84 lebih banyak baris". Saya kemudian bisa masuk 84==untuk mem-reflow 84 baris tersebut (tentu saja, gantikan 84 dengan jumlah baris yang Anda tempelkan).

Referensi

:help ]p untuk indent paste yang disesuaikan

:help =penutup ={motion}, [count]==dan {Visual}=untuk memfilter melalui aturan indentasi khusus atau bawaan


6
Anda dapat dengan baik memilih kode yang Anda tempel dalam mode visual menggunakan `[v`]
craigp

1
@ Bard Hanya untuk memperjelas, apakah itu backtick-bracket-v-backtick-bracket?
phatskat

1
ya .. textarea panik tentang backticks, jadi saya tidak bisa memasukkannya ke dalam blok kode: P
craigp

Operator = di vim memformat ulang kode berdasarkan aturan pemformatan yang dikonfigurasi yang saya berikan +100 jika saya bisa. Saya bisa menyelamatkan hari.
Wossname

1
Saya menggunakan <control + R> "untuk menempelkan, sehingga saya tidak harus meninggalkan mode penyisipan. Apakah yang setara dengan p untuk <control + R>"?
A --- B

15

The =perintah dapat digunakan untuk reindent.

Seperti kebanyakan perintah mode normal, ini dapat diterapkan ke gerakan, sehingga Anda dapat mengaktifkan kembali kode yang hanya ditempelkan =']. Ini reindents dari posisi kursor saat ini ke ']tanda, yang merupakan baris terakhir dari paste.

= juga dapat digunakan dari mode visual.

Perintah lain yang bermanfaat adalah ]p, yang menempel pada level indent yang sama dengan baris saat ini. Ini dapat membantu menempelkan teks dengan indentasi yang benar, meskipun pada kedalaman indentasi yang berbeda, sesuai dengan teks di sekitarnya.


7

Menggunakan =ap (mnemonic adalah 'memformat paragraf') akan memiliki upaya vim untuk mengatur otomatis paragraf saat ini.

Jika Anda ingin memperhatikan dengan hati-hati apa yang berpotensi vapAnda format ulang, Anda mungkin merasa lebih waras dan lebih cepat digunakan untuk memilih secara visual paragraf saat ini (memberi Anda indikasi visual tentang apa yang sedang diformat ulang), diikuti oleh =. Saya menemukan ini berguna dalam file di mana saya tahu bahwa vim akan memformat ulang secara tidak benar, dan saya tidak ingin salah memformat baris lain.


4

Untuk memasang kembali file yang sudah ada di buffer, gunakan gg=G: Lihat Memperbaiki Indentasi

Untuk pengindeksan ulang sebagian file, berbagai batasan dapat diterapkan pada =filter (misalnya, ==memperbaiki hanya baris saat ini).

Agar indentasi tidak berubah saat menempelkan teks :set pastesebelum Anda dapat menempelkan teks ke dalam buffer, ini akan mencegah vim dari teks indentasi otomatis yang baru saja Anda tempel. Setelah menempelkan barang, Anda dapat kembali menggunakan set :nopastesetelah selesai. Lihat vimdoc di sini .

Jika Anda sering menempelkan barang, sebaiknya gunakan tip ini di VimWiki dan atur kunci untuk mode tempel "tempel" dengan menambahkan baris ini ke .vimrc:

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

Anda kemudian dapat menekan <F2>untuk beralih mode tempel. vim akan menampilkan kata "PASTE" di baris status ketika mode tempel aktif.


2
Pertanyaan ini bukan tentang menempelkan kode dengan indentasi, ini tentang memperbaiki kode yang indentasi buruk.
rolfl

4
Saya tidak melihat komentar yang Anda poskan. Namun, Anda masih dapat menggunakan gg=Guntuk meng-reindent seluruh file.
Bhargav Bhat

@rolfl Di situlah saya biasanya memulai dalam kasus-kasus seperti:, gg=Glalu lihat bagian-bagian yang vimsalah.
muru

Jika Anda ingin lebih banyak kontrol (atau mengurangi kerumitan yang berulang) pertimbangkan untuk menambahkan perintah-otomatis untuk memanggil alat pemformatan kode seperti astyleketika Anda menyimpan buffer. Lihat pertanyaan ini di SO untuk detailnya.
Bhargav Bhat

2

Untuk memasang kembali seluruh blok dari blok yang dikuatkan atau dikurung secara otomatis, tempatkan kursor Anda pada baris yang sama di mana adalah kurung, dan coba =%. Untuk mengubah lebar shift Anda, gunakan misalnya :set sw=2.

Jika ini tidak bekerja seperti yang diharapkan, untuk mengurangi indentasi manual ( outdent ), coba <%dan ulangi dengan .(jika perlu). Gunakan >%untuk sebaliknya.

Begitu:

else
       {
         // some code
       }

menjadi:

else
{
  // some code
}

Untuk kode tertentu, untuk indentasi ulang satu baris atau beberapa baris secara otomatis, coba:

  • == untuk indentasi ulang baris saat ini
  • 5== untuk memasang kembali 5 baris

Untuk menambah / mengurangi indentasi secara manual untuk satu baris atau beberapa baris, coba:

  • << untuk menghapus indentasi garis saat ini dengan ruang shiftwidth
  • 5<< untuk menghapus indentasi 5 baris dengan ruang shiftwidth
  • >> untuk indentasi garis saat ini dengan ruang shiftwidth
  • 5>> untuk membuat 5 baris dengan ruang shiftwidth
  • . untuk mengulang jika perlu

Anda juga dapat melakukan lekukan dalam mode visual ( v) dengan memilih teks dan menekan =(indentasi otomatis), <(menghapus indentasi) atau >(indentasi).

Trik lain adalah dengan lekukan yang benar dari seluruh file oleh: gg=G.

Jika Anda memiliki tab alih-alih spasi, gunakan: :retabyang akan mengganti semua Tab dengan spasi (Lihat: Bagaimana cara mengganti tab dengan spasi? ).


Untuk metode eksternal, Anda dapat mencoba:

  • pythonTidy untuk memformat ulang kode Python, misalnya:

    :%!pythonTidy
    

Terkait:



1

Sudah ada banyak hal yang tercakup dalam jawaban yang ada. Saya hanya ingin menambahkan satu pemetaan yang sering saya gunakan untuk lekukan.

nnoremap <Leader>i  mzgg=G`z

Saya telah melihat beberapa vimrc dengan ini dipetakan ke ===.

Either way ini adalah pemetaan yang bagus untuk dimiliki dan saya menggunakan ini hampir setiap saat terutama ketika menempelkan kode yang disalin dari tempat lain.

Atau bahkan lebih baik memasukkan ini ke dalam autocmdsehingga Vim indentasi itu tepat sebelum Anda menulis perubahan ke disk.

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.