Kötü girintili kodun yeniden girilmesi


39

Vim'in akıllı girintili özelliğini seviyorum, iyi girintili kod blokları oluşturmama izin veriyor.

Kodları düzenli aralıklarla arabelleklere kopyalarım / yapıştırırım, ancak bu kod genellikle kötü biçimlendirilmiş.

İdeal olan, kodu akıllı girinti sistemi üzerinden "yeniden işlemek" olacaktır.

Böyle bir şey mümkün mü?

Örneğin, aşağıdaki kodu nasıl 'düzeltmek' istiyorsunuz (daha büyük bir bloğun özü - her satırı el ile düzeltmek istemiyorum ...):

    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
Başlangıçta zayıf girintili olan veya Vim'e yapıştırdığınızda değişen düzgün girintili olan kodu yapıştırmaktan mı bahsediyorsunuz?
jamessan

Yapıştırılan kod başlamak için zayıf girintili. Bana bir örnek
ekleyeyim

Yanıtlar:


48

Bunu iki yoldan biriyle yapıyorum.

Girintili ayarlanmış macun

Öncelikle, tampondaki kod biçimlendirilmişse, ancak farklı bir girinti düzeyinde ise , kodu olduğu gibi yapıştıran ]pyerine kullanırım p, ancak girintili olarak yapıştırılan ilk satırın I ile aynı derinlikte olduğu şekilde kaydırılır hadi.

EG kaynağı tampon belleğe kopyalandı

while (1) {
    dostuff();
}

EG ile yapıştırma sonucu ]p

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

vim, süreyi, aynı girinti seviyesine getirir int i. Bu hızlıdır, ancak yalnızca kopyalanan kod kendi içinde uygun şekilde girintili olduğunda çalışır.

Yapıştırdıktan sonra yeniden biçimlendirme

=Vim yeniden biçimlendirir operatörü yapılandırılan biçimlendirme kurallara dayalı kodu. Kısa yapıştırma pasajları için görsel moda geçeceğim, yapıştırdığım vçizgileri seçeceğim ve ardından =yeniden biçimlendirmek için basacağım.

Daha büyük macunlar için, imlecin ilk yapıştırılan satıra gitmesi ve vim'in "84 satır daha" gibi bir şey söylemesinden faydalanırım. Daha sonra 84==bu 84 çizgiyi yeniden akıtmak için girebilirim (tabii ki, gerçekten yapıştırdığınız satırların sayısı ile 84).

Referanslar

:help ]p düzeltilmiş girinti pastası için

:help =kapaklar ={motion}, [count]==ve {Visual}=özel geçmesi veya girinti kuralları yerleşik filtrelemek için


6
Görsel modda yapıştırdığınız kodu `[v`]
craigp

1
@Badger Sadece netleştirmek için, bu backtick-braketi-v-backtick-braketi mi?
phatskat

1
yup .. textarea backticks hakkında çıldırdı, bu yüzden bir kod bloğuna
koyamadım

Vim'deki = işleci, yapabilirsem +100 olarak verdiğim yapılandırılmış biçimlendirme kurallarını temel alarak kodu yeniden biçimlendirir . Günleri kurtarabilirdim.
Woss name

1
Yapıştırma modunda <control + R> kullanıyorum, böylece ekleme modundan çıkmak zorunda kalmıyorum.
A --- B

15

=Komut reindent kullanılabilir.

Çoğu normal mod komutunda olduğu gibi, bir harekete uygulanabilir, böylece yeni yapıştırılan kodu yeniden ekleyebilirsiniz =']. Bu, mevcut imleç pozisyonundan ']macunun son satırı olan işarete yeniden bağlanır.

= görsel moddan da kullanılabilir.

Diğer bir yararlı komut, ]pgeçerli satırla aynı girinti düzeyinde yapıştırılandır. Bu, çevreleyen metne göre farklı girintili bir derinlikte olmasına rağmen, girintili metni düzgün bir şekilde yapıştırmaya yardımcı olabilir.


7

Kullanmak =ap (mnemonic 'paragrafı formatlamaktır') mevcut paragrafı otomatik olarak biçimlendirmeye çalışacaktır.

Potansiyel olarak yeniden biçimlendirdiğiniz şeye dikkat etmek istiyorsanız vap, geçerli paragrafı görsel olarak seçmenin (size yeniden biçimlendirilen öğenin görsel bir gösterimini verir) ve ardından görsel olarak kullanmanın daha akıllıca ve daha hızlı olduğunu görebilirsiniz =. Bunu vim'in yanlış biçimlendireceğini bildiğim dosyalarda faydalı buluyorum ve diğer satırları yanlışlıkla yanlış biçimlendirmek istemiyorum.


4

Zaten arabellekte bulunan bir dosyayı yeniden göndermek için, şunu kullanın gg=G: Bkz. Girinti Düzeltme

Bir dosyanın bir kısmını yeniden yerleştirmek için, =filtreye çeşitli sınırlar uygulanabilir (örneğin, ==yalnızca geçerli satırı düzeltir).

Metni yapıştırırken girintiyi değiştirmemek için, metni :set pastetampona yapıştırmadan önce yapabilirsiniz , bu vim'in henüz yapıştırdığınız metni otomatik olarak girmesini engeller. Bir şeyler yapıştırdıktan sonra, set :nopasteişleminiz bittiğinde tekrar kullanabilirsiniz. Vimdoc'u burada görün .

Sık sık bir şeyler yapıştırarak bulursanız, bu ipucunu VimWiki'de kullanmak ve bu satırları kendinize ekleyerek "yapıştırma modu" geçişi için bir anahtar ayarlamak iyi bir fikirdir .vimrc:

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

<F2>Yapıştırma modu geçiş yapmak için daha sonra vurabilirsiniz . Yapıştırma modu etkinken vim, durum satırında "PASTE" yazısını gösterir.


2
Bu soru kod girintili yapıştırma hakkında değil, zayıf girintili kodu düzeltme hakkında.
rolf

4
Gönderdiğiniz yorumu görmedim. Ancak, gg=Gtüm dosyayı yeniden göndermek için hala kullanabilirsiniz .
Bhargav Bhat,

@rolfl Genelde bu gibi durumlarda başladığım yer: gg=Gsonra vimyanlış olan kısımlara bakın .
muru

Daha fazla kontrol almak istiyorsanız (veya tekrarlanan güçlüğü azaltın), astylebir tamponu kaydettiğinizde olduğu gibi bir kod formatlama aracını çağırmak için bir otomatik komut eklemeyi düşünün . Ayrıntılar için bu soruya bakınız.
Bhargav Bhat

2

Desteklenmiş veya desteklenmiş bir bloğun tüm bloğunu otomatik olarak yeniden girintili yapmak için, imlecinizi braketin bulunduğu aynı satıra yerleştirin ve deneyin =%. Öteleme genişliğinizi değiştirmek için örn :set sw=2.

Bu beklendiği gibi çalışmazsa, girintiyi manuel olarak azaltmak için ( outdent ), (gerekirse) <%ile tekrar etmeye çalışın .. >%Karşıt için kullanın .

Yani:

else
       {
         // some code
       }

dönüşür:

else
{
  // some code
}

Belirli bir kod için bir ya da birkaç satırı otomatik olarak tekrar girin, şunu deneyin:

  • == geçerli satırı tekrar girintili yapmak için
  • 5== 5 satırı tekrar girintili yapmak

Bir satır veya birkaç satır için girintiyi manuel olarak artırmak / azaltmak için şunu deneyin:

  • << mevcut çizgiyi vardiya genişliği boşluklarıyla girintili çıkarmak
  • 5<< 5 genişlikte boşlukları ile 5 satır girintili
  • >> mevcut çizgiyi shiftwidth boşluklarla girintilemek
  • 5>> vardiya genişliği boşluklarıyla 5 satır girintili
  • . gerekirse tekrarlamak

Girintiyi görsel modda ( v) metin seçip =(otomatik girintili), <(girintili) veya >(girintili) tuşuna basarak da yapabilirsiniz .

Başka bir hile ile tüm dosyanın doğru girinti şudur: gg=G.

Boşluk yerine sekmeniz varsa, şunu kullanın: :retabhangisi tüm Sekmeleri boşluklarla değiştirir (Bkz: Sekmeleri boşluklarla nasıl değiştirirsiniz? ).


Dış yöntemler için deneyebilirsiniz:

  • reformat Python kodu için pythonTidy , örneğin:

    :%!pythonTidy
    

İlgili:


1

Son zamanlarda vim-makarnayı kurdum ( https://github.com/sickill/vim-pasta ) ve bu yapıştırdığımda kod girintisini arttırıyor gibi görünüyor. README ayrıca çeşitli kod yapıştırma stratejileri hakkında bazı iyi tartışmalara sahiptir.


1

Mevcut cevaplarda zaten çok fazla şey var. Girinti için çok sık kullandığım bir harita eklemek istiyorum.

nnoremap <Leader>i  mzgg=G`z

Bu harita ile bazı vimrc gördüm ===.

Her iki durumda da olması gereken harika bir haritalama ve bunu neredeyse her zaman özellikle başka bir yerden kopyalanan kodu yapıştırırken kullanırım.

Ya da daha iyisi autocmd, Vim'in değişiklikleri diske yazmadan hemen önce girintili yapması için yerleştirin.

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.