Vim'de 2 boşluk girintisini 4 boşluk olarak değiştirin


93

2 boşluk girintili internetten kopyaladım ve 4 boşluk girintili olarak değiştirmek istiyorum. Acaba vim betiği yazmak zorunda kalmadan görevi tamamlamak için kısa bir vim rutini var mı? Bunu şu anda bir HTML dosyasıyla şu şekilde yapıyorum:

  • Bir makro kaydedin
  • Satırın başına git
  • Görsel "<" karakterinin ilk oluşumuna kadar tüm boşlukları seçin
  • Tüm beyaz boşlukları çekin ve yapıştırın (temelde ikiye katlamak için)
  • Makroyu dosyanın sonuna kadar yeniden oynatın

Kısacası qa0vt<yp<esc>jq

Tuzaklar:

Makro, boş bir satır veya "<" ile başlamayan bir satır için başarısız olur. Ve bu çözümü HTML olmayan bir dosyaya nasıl genişleteceğime dair hiçbir fikrim yok.

Yanıtlar:


175

Girintiyi değiştirmenin genel bir yolu, sekme çubuğunu değiştirmektir:

Dosyanızı boş bir arabelleğe yapıştırın, ardından:

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

Bu, her 2 boşlukta bir SEKME karakterine dönüşür, ardından:

:set ts=4 sts=4 et
:retab

Bu, her SEKME'yi 4 boşluğa değiştirir.

Bu yöntemin avantajı, örneğin 4'ten 2 boşluğa dönüştürmek için başka bir şekilde de kullanabilmenizdir.


16
@ XavierT. Aslında bu cevabın anlaşılması oldukça kolay olduğunu düşünüyorum. Kısa komut adı tam adıyla değiştirin Ve eğer belki daha net olacak: ts: = tabstop, sts: = softtabstopve [no]et: = [no]expandtab.
YaOzI

Hangi durumda retabargümanı faydalı olur ve neden onu bu görev için kullanamıyoruz?
joeytwiddle

Anladığım kadarıyla @joeytwiddle, sen verebilir kullanan ve kullanarak bu yanıt olarak aynı etkiyi elde :set sts=2 noetve :retab! 2o şekilde ki (belki daha az okunabilir olsa) biraz daha kısa olacağını bu yüzden.
Daan Bakker

Bu yöntem aynı zamanda satırın başlangıcı yerine dizge değişmezleri ve diğer yerlerdeki 2-boşluğu 4-boşluk olarak değiştirir.
nacitar sevaht

3
Hepsini bir araya getirin: :set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!ve ardından @:aynı eylemi hızla uygulamak için farklı dosyalarda kullanın.
L__

59

O ile mümkün olabilir :set shiftwidth=4ve gg=G.


Bu işe yaramazsa, girinti üzerinde başka bir etkiye sahip olan bir modun etkinleştirilebileceğini unutmayın.
Dav Clark

1
Soru genel bir çözümle ilgili olmasa da, bunun her zaman, özellikle python koduyla çalışmadığını lütfen unutmayın.
0xc0de

5
Tam olarak ne anlama gg=Ggeliyor? Bunun gg"1,1'e git" ve G"son satıra git" anlamına geldiğini anlıyorum .
Jonathan Reinhart

5
@JonathonReinhart =girintileme yapıyor, bu yüzden metnin başından sonuna kadar girintilemek anlamına geliyor
alex

%retabdizge değişmezlerinin içine gömülü boşlukları yanlış dönüştüren daha iyi çalıştı .
Alnitak

34

Yaptığım şey esneider ve cforbish'in yaklaşımlarına çok benziyor, ancak yazmak biraz daha hızlı:

:%s/^\s*/&&

Baştaki boşluğu (boşluklar veya sekmeler) iki kat daha fazla ön boşlukla değiştirir ( &eşleşen ifadeyle değiştirilir).


2
Bu kullanışlıdır çünkü görsel seçim (V) ile çalışır, sadece %.
Trevor Robinson

1
Bunu da beğendim, çünkü yorumlarda sahip olduğum tabloların manuel olarak hizalanmasıyla
karışmaz

@TrevorRobinson En iyi iki yanıt, aralıklar üzerinde de işe yarıyor.
Brian McCutchon

Bu ayrıca, onu kullanmak için genişletip sedbir dizindeki tüm dosyalara uygulayabilmeniz için ek bir yarara da sahiptir. Superuser.com/a/159286/41494
icc97

3

Bu normal ifadeyi kullandım (öndeki boşlukların sayısını iki katına çıkarır):

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

gelmez %s/\s\+/&&/aynı şeyi yapmak? Btw, gbayrağın gereksiz olduğunu düşünüyorum (birincisi, ^patternher satırda sadece 1 maç olurdu , hayır?)
doubleDown

"&" İşaretini işaret ettiğiniz için teşekkürler. Sizinkinde küçük bir düzeltme yaptım çünkü '^' %s/^\s\+/&&/gnin daha yakın olduğunu unuttunuz .
cforbish

1
Bu, spro'nun cevabına benzer, ancak biraz daha karmaşık bir şey yapmanız gerektiğinde daha kolay tweek yapmanıza izin verdiği için cevabı takdir ediyorum.
stephenmm

3

Bu çok eski bir soru, ancak tüm cevaplar ... yanlış ... Vim'in tüm dosyayı geri almanın çok kolay bir yolu var. Bunu yapmak için kendi işlevimi yazdıktan sonra öğrendim, bu yüzden aynı cehalet teknesindeyim;)

tip

gg=G

bu, sekme durdurucunuzun istediğiniz şeye ayarlandığını varsayar (bu nedenle, OP için ts = 4 olacaktır)

Ben ögrendik http://vim.wikia.com/wiki/Fix_indentation bahseder ki,

Normal modda, gg = G yazmak tüm dosyayı yeniden başlatır. Bu özel bir durumdur; = bir operatördür. Tıpkı d veya y gibi, bir imleç hareket komutuyla hareket ettirdiğiniz herhangi bir metne etki edecektir. Bu durumda, gg imleci ilk satıra konumlandırır, ardından = G mevcut imleç konumundan arabelleğin sonuna kadar yeniden girintiler.


2
1. En alta kaydırırsanız, gg = G'den bahseden bir cevap göreceksiniz. 2. Her zaman işe yaramaz.
Lim H.

1

Cforbish'in cevabına benzer (ancak biraz daha basit), bu normal ifade baştaki boşlukları çoğaltacaktır

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

Veya bu diğer normal ifadeyi tek boşlukları (ve genel olarak tek sayıları) koruyarak 2 boşluğu 4 boşluğa dönüştürmek için kullanabilirsiniz.

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

Yani,

  • 1 boşluk ⇢ 1 boşluk
  • 2 boşluk ⇢ 4 boşluk
  • 3 boşluk ⇢ 5 boşluk
  • 4 boşluk ⇢ 8 boşluk

1

@ Spro'nun cevabına ek olarak, bunu benim .vimrc

command! -range=% Format :<line1>,<line2>s/^\s*/&&

Sadece yazın :Format.

Görsel seçim ile bu yalnızca seçilen satırları biçimlendirir.

Görsel seçim olmadan bu, tüm dosyayı biçimlendirir.


0

Bu, normal ifadeye dayalı yanıtların bir çeşididir.

Yerel bin dizinimde, bir satırın başındaki boşluk miktarını iki katına çıkaran bir bash betiğim var. Giriş, stdin veya bir dosya olabilir:

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

file=${1--}

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

Bunu vim içinde görsel olarak bir satır seçerek ve aşağıdaki komutu vererek kullanıyorum:

:'<,'>!dblsp

Bu beni normal ifadeyi yazma (veya hatırlama) ihtiyacından kurtarıyor.

Ayrıca aşağıdaki gibi haritalarda da kullanıyorum:

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

bunu yakın zamanda yapıştırılmış bir metin bloğuna uygulayacaktır. Yapıştırmak için genellikle aşağıdaki haritayı kullanırım:set paste

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

Her zamanki iş akışım:

  • kod parçacığını seçin (ör . bu sayfadaki örnek kod 2 boşluktur, ancak 4 istiyorum)
  • kod parçacığını yapıştır (, p)
  • aralığı değiştir (,])

veya basitçe başka bir tampondan yapıştırılan yanmış bloklardaki girintiyi değiştirmek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.