Pertanyaan Ubah 2-space indent ke 4-space di vim


Saya sudah beberapa kode disalin dari Internet yang memiliki 2-ruang indentasi dan saya ingin mengubahnya menjadi 4-ruang indentasi. Saya ingin tahu apakah ada rutin vim singkat untuk menyelesaikan tugas tanpa harus menulis skrip vim? Berikut adalah cara saya saat ini melakukannya dengan file HTML:

  • Rekam makro
  • Pergi ke awal baris
  • Visual pilih semua spasi putih sampai munculnya pertama "<"
  • Yank dan tempel semua spasi putih (pada dasarnya untuk menggandakannya)
  • Putar ulang makro hingga akhir file

Pendeknya qa0vt<yp<esc>jq

Kesalahan:

Makro gagal untuk garis kosong atau garis yang tidak dimulai dengan "<". Dan saya tidak tahu cara memperpanjang solusi ini ke file non-HTML.


75
2018-06-03 00:37


asal


Jawaban:


Cara umum mengubah indentasi adalah dengan mengubah tabstop:

Tempel file Anda ke dalam buffer kosong, maka:

:set ts=2 sts=2 noet
:retab!

Ini mengubah setiap 2 spasi ke karakter TAB, lalu:

:set ts=4 sts=4 et
:retab

Ini mengubah setiap TAB menjadi 4 spasi.

Keuntungan dari metode ini adalah Anda juga dapat menggunakannya dengan cara lain, untuk mengkonversi dari 4 ke 2 ruang misalnya.


145
2018-06-03 07:42



Dimungkinkan dengan :set shiftwidth=4 dan gg=G.


48
2018-06-03 00:46



Apa yang saya lakukan sangat mirip dengan pendekatan esneider dan cforbish, tetapi sedikit lebih cepat untuk mengetik:

:%s/^\s*/&&

Cukup mengganti ruang utama (spasi atau tab) dengan dua kali lebih banyak ruang terdepan (& diganti dengan ekspresi yang cocok).


23
2017-09-24 03:24



Saya menggunakan ekspresi reguler ini (itu menggandakan jumlah spasi utama):

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g

2
2018-06-03 01:00



Mirip (tetapi lebih sederhana) untuk jawaban cforbish, regex ini akan menduplikasi ruang terkemuka

:%s/^\( \+\)/\1\1

Atau Anda dapat menggunakan regex lainnya ini untuk mengubah 2-spasi menjadi 4-spasi, melestarikan ruang tunggal (dan jumlah ganjil pada umumnya)

:%s/^\(\(  \)\+\)/\1\1

Itu adalah,

  • 1 ruang ⇢ 1 ruang
  • 2 spasi ⇢ 4 spasi
  • 3 spasi ⇢ 5 spasi
  • 4 spasi ⇢ 8 spasi

1
2018-06-04 04:11



Ini adalah varian dari jawaban berbasis regex.

Saya memiliki skrip bash di direktori bin lokal saya yang akan menggandakan jumlah spasi di awal baris. Masukan dapat berupa stdin atau file:

$ cat ~/bin/dblsp
#!/bin/bash

file=${1--}

while IFS= read -r line; do
    echo "$line" | sed 's/\s*/&&/'
done < <(cat -- "$file")

Saya menggunakan ini dalam vim dengan memilih secara visual baris dan mengeluarkan perintah berikut:

:'<,'>!dblsp

Ini menghemat kebutuhan untuk mengetik (atau mengingat) regex.

Saya juga menggunakannya di peta seperti berikut:

nnoremap <leader>] `[V`]!dblsp<CR>

yang akan menerapkannya ke blok teks yang baru saja disisipkan. Saya biasanya menggunakan peta berikut untuk menempel bukan :set paste

nnoremap <leader>p :r !xclip -o<CR>

Alur kerja saya yang biasa adalah:

  • pilih potongan kode (misalnya kode contoh di halaman ini adalah 2 spasi tapi saya ingin 4)
  • tempel cuplikan kode (, p)
  • ubah jarak (,])

atau hanya mengubah indentasi pada blok yang disisipkan dari buffer lain.


0
2018-03-28 02:40



Ini adalah pertanyaan yang sangat lama, namun semua jawabannya ... salah ... Vim memiliki cara yang sangat mudah untuk mengembalikan seluruh file. Saya belajar ini setelah menulis fungsi saya sendiri untuk melakukannya, jadi saya berada di perahu ketidaktahuan yang sama;)

mengetik

gg=G

ini diasumsikan bahwa Anda memiliki set tabstop Anda untuk apa yang Anda suka, (jadi untuk OP itu akan menjadi ts = 4)

Saya belajar ini dari http://vim.wikia.com/wiki/Fix_indentation , yang menyebutkan

Dalam mode normal, mengetik gg = G akan mengembalikan seluruh file. Ini adalah kasus khusus; = adalah operator. Sama seperti d atau y, ia akan bertindak pada teks apa pun yang Anda pindahkan dengan perintah gerakan kursor. Dalam hal ini, gg memposisikan kursor pada baris pertama, kemudian = G kembali indentasi dari posisi kursor saat ini ke ujung buffer.


-1
2018-02-18 02:12