Bagaimana cara menggeser indentasi baris ke nilai tertentu?

11

Berkali-kali saya menemukan situasi di mana garis tidak diindentasi dengan benar. Eter melalui pasta, plugin indentasi buruk / tidak disukai, atau paling sering ruang ekstra mengimbangi nilai indentasi. Saya biasanya memperbaiki ini dengan <<atau >>garis beberapa kali untuk memperbaikinya. Dalam hal ruang tambahan saya akan melakukan 100<<a >>untuk setiap tingkat indent yang saya inginkan.

Pertanyaannya adalah, seperti |gerakan yang memungkinkan Anda mengatur kolom dengan angka 10|mengirimkan kursor ke kolom ke-10. Bagaimana cara menentukan tingkat indentasi?

Contoh (ini tidak berfungsi) dengan shiftwidth=4 expandtab:

The quick (indent level 0)
••••Brown Fox (indent level 1)
••••••••••Jumped over the lazy dog (indent level 2 with two extra spaces)

Dalam hal ini saya saat ini harus menghitung level indent dari baris terakhir (2) dan menambahkan satu untuk spasi tambahan kemudian ketik 3<<kemudian hitung level indent dari apa yang saya 1>>(atau gunakan autoindentdan ==perintah).

Saya meminta sesuatu seperti 1==memaksa indentasi menjadi indentasi level 1. Atau dalam beberapa kasus 0==menghapus indentasi bersama-sama.

Saya menyadari contoh di atas melakukan indentasi otomatis pada 1 atau 0 baris (masing-masing) dan tidak melakukan apa yang saya inginkan tetapi berharap itu akan membantu menggambarkan pertanyaan dengan lebih baik.

Sukima
sumber

Jawaban:

18

Anda dapat menggunakan :leftperintah:

:[range]le[ft] [indent]
Sejajarkan garis di [range]. Atur indent pada baris ke [indent](default 0). {tidak dalam Vi}

Catatan yang :leftmengatur indentasi ke n spasi, dan tidak mengetahui shiftwidthatau tabstop, jadi menggunakan :left 8akan menggunakan 8 spasi.

Jika Anda ingin mengatur level indentasi, Anda dapat dengan mudah mendefinisikan perintah:

command! -nargs=1 Left execute 'left ' . &sw * <args>

Gunakan :Left 2akan mengatur lekukan ke 8 spasi.

Untuk memetakan ini <Leader>=, Anda dapat menggunakan:

noremap <expr> <Leader>= ':left ' . str2nr(nr2char(getchar())) * &sw . '<CR>'

Saya tidak yakin apakah ini cara terbaik, tapi itu satu-satunya cara saya dapat mengatur ... \=2akan membuat indentasi baris saat ini menjadi 8 spasi, dan 5\=3akan membuat indentasi 5 baris berikutnya menjadi 12 spasi.


Petunjuk terkait yang juga memecahkan masalah Anda adalah mengatur shiftroundopsi. Dari:help 'shiftround'

Bulatkan indentasi ke beberapa 'shiftwidth'. Berlaku untuk >dan < perintah. CTRL-T dan CTRL-D dalam mode Insert selalu membulatkan indentasi ke beberapa 'shiftwidth'(ini kompatibel dengan Vi).

Dalam contoh Anda, yang pertama <<akan "membulatkan" ke 8 spasi. Jadi masalah Anda (menggunakan 3<<dan kemudian >>) terpecahkan. Dan seperti yang dikatakan halaman bantuan, Anda juga dapat menggunakan <C-d>dari mode insert.

Martin Tournoij
sumber
Luar biasa! Solusi ini berfungsi sempurna.
Sukima