Visual Studio 2008'de sondaki beyaz boşluk nasıl otomatik olarak kaldırılır?


122

Bir dosyayı kaydederken her satırın sonundaki boşluk karakterlerini otomatik olarak kaldıracak şekilde Visual Studio 2008'i yapılandırmak mümkün müdür? Yerleşik bir seçenek yok gibi görünüyor, bu yüzden bunu yapmak için herhangi bir uzantı var mı?


1
Bunu okuyanlar için Visual Studio 2010 kullananlara not: PowerCommands uzantısını Microsoft'tan yüklerseniz, dosyayı kaydederken belgenin otomatik olarak biçimlendirilmesini sağlayabilirsiniz (bu özelliği Araçlar / Seçenekler aracılığıyla açın). Bu, diğer şeylerin yanı sıra, gereksiz boşlukları ortadan kaldıracaktır.
steinar

Yanıtlar:


68

CodeMaid, çok popüler bir Visual Studio uzantısıdır ve bunu diğer yararlı temizlemelerle birlikte otomatik olarak yapar.

Varsayılan olduğunu düşündüğüm kaydederken bir dosyayı temizleyecek şekilde ayarladım.


1
Bu, bu sayfadaki en iyi çözümdür. Kolayca yapılandırılabilir, talep üzerine veya kaydedildiğinde sizin için otomatik olarak yapılır, VS ile güzel bir şekilde bütünleşir, diğer birçok kullanışlı özelliğe sahiptir. İyi bul arserbin3.
Chris R

Bu uzantıda tam kod biçimlendirmesini kapatmanın bir yolu yoktur, bu nedenle, örneğin özel girinti stilleri ile uyumlu değildir.
aemxdp

@Andriy Ne demek istediğini anlamıyorum. Visual Studio'da ayarladığınız özel girintiyi takip eder. Bunları Araçlar> Seçenekler> Metin Düzenleyici> [Dil]> Sekmelerde ayarlayın
arserbin3

@ arserbin3 Demek istediğim, kodunuzu bu şekilde biçimlendirmek istiyorsanız - pastebin.com/uJqBQ1u2 - şansınız , çünkü kaydettiğinizde pastebin.com/761Lzra7 gibi kodu veya buna benzer bir şeyi otomatik olarak yeniden biçimlendirir . seçenekler. Ve girinti kurallarını tamamen kapatma seçeneği yoktur. Ve kod yardımcısı olmadan dosya yeniden biçimlendirme otomatik olarak çalışmaz, böylece dosyanızı bu tür girintilerle kaydedebilirsiniz.
aemxdp

6
@ arserbin3 Andriy'nin noktasını kaçırdığınızı düşünüyorum. Devasa bir açık kaynak projesinde çalışıyorum. Ben yok kendi kod - kod katkıda ediyorum. Projenin girinti kılavuzlarını değiştiremiyorum. Bir dosyayı değiştirdiğimde VisualStudio'nun sondaki beyaz boşlukları kaldırmasını istiyorum ve dosyadaki başka herhangi bir şeyle (sekmeler, boşluklar, girinti vb.) Uğraşmak istemiyorum. Şimdiye kadar, VisualStudio bunu yapamayan üzerinde çalıştığım tek IDE. Diğer yarı pişmiş editörler (IDE'yi bir kenara) yapabilir. CodeMaid'i bazı biçimlendirmelere yapılandıramıyorum çünkü biçimlendirme değişiklik gösteriyor.
kliteyn

71

Normal İfadeleri Kullanarak Bulma / Değiştirme

Bul ve Değiştir iletişim kutusunda Bulma Seçenekleri'ni genişletin , Kullan'ı işaretleyin , Normal ifadeler'i seçin.

Neyi Bulun : " :Zs#$"

Şununla değiştir : ""

Tümünü Değiştir'i tıklayın

Diğer düzenleyicilerde ( normal bir Normal İfade ayrıştırıcı) ":Zs#$ ", " olacaktır \s*$.


44
VS2012'de şunu kullanırdım:[^\S\r\n]+(?=\r?$)
M. Dudley

4
Sekmeler kullanırsanız, [:Zs\t]#$kullanışlı bir uyarlamadır.
dlanod

Dosyayı Kaydederken Dosya olayına nasıl bağlarım, böylece bir dosyayı her kaydettiğimde yürütülmesi lütfen?
David Ferenczy Rogožan

30

Bunu sizin için yapmak için bir kaydetmeden sonra çalışan bir makro oluşturabilirsiniz.

Makrolarınız için aşağıdakileri EnvironmentEvents Modülüne ekleyin.

Private saved As Boolean = False
Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    If Not saved Then
        Try
            DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                                 "\t", _
                                 vsFindOptions.vsFindOptionsRegularExpression, _
                                 "  ", _
                                 vsFindTarget.vsFindTargetCurrentDocument, , , _
                                 vsFindResultsLocation.vsFindResultsNone)

            ' Remove all the trailing whitespaces.
            DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                                 ":Zs+$", _
                                 vsFindOptions.vsFindOptionsRegularExpression, _
                                 String.Empty, _
                                 vsFindTarget.vsFindTargetCurrentDocument, , , _
                                 vsFindResultsLocation.vsFindResultsNone)

            saved = True
            document.Save()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
        End Try
    Else
        saved = False
    End If
End Sub

Bunu bir süredir sorunsuz kullanıyorum. Makroyu ben oluşturmadım, ancak ace_guidelines.vsmacros içinde hızlı bir google aramasıyla bulunabilen makroyu değiştirdim.


8
Bunun ayrıca sekmeleri iki boşlukla değiştirdiğini unutmayın.
crdx

Bu belge olay betiklerini nereye koyuyorsunuz?
xagyg

Bunu kaydetmeden önce yapmak daha iyi olmaz mıydı, "Hey, metin son kayıttan bu yana değişti. Yeniden yüklemek istiyor musun?"
jedmao

2
Ne yazık ki VS 2013'te artık makro yok.
Nathan Baulch

17

Kaydetmeden önce, CTRL+ K+ otomatik biçim kısayolunu kullanabilirsiniz D.


11

Bunu şu üç eylemle kolayca yapabilirsiniz:

  • Ctrl+ A(tüm metni seçin)

  • Düzenle -> Gelişmiş -> Yatay Beyaz Boşluğu Sil

  • Düzen -> Gelişmiş -> Biçim Seçimi

Birkaç saniye bekleyin ve bitti.

Bir şeyler ters gittiğinde Ctrl+ Z'mümkün.


1
Bunu yapmak için bir kısayol var: ctrl + w, a sonra Edit.RemoveHorizontalWhitespace
Josh

8

Daha önce verilen tüm cevaplardan unsurlar alarak, işte bulduğum kod. (Çoğunlukla C ++ kodu yazıyorum, ancak gerektiğinde farklı dosya uzantılarını kontrol etmek kolaydır.)

Katkı yapan herkese teşekkür ederiz!

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
    Handles DocumentEvents.DocumentSaved
    Dim fileName As String
    Dim result As vsFindResult

    Try
        fileName = document.Name.ToLower()

        If fileName.EndsWith(".cs") _
        Or fileName.EndsWith(".cpp") _
        Or fileName.EndsWith(".c") _
        Or fileName.EndsWith(".h") Then
            ' Remove trailing whitespace
            result = DTE.Find.FindReplace( _
                vsFindAction.vsFindActionReplaceAll, _
                "{:b}+$", _
                vsFindOptions.vsFindOptionsRegularExpression, _
                String.Empty, _
                vsFindTarget.vsFindTargetFiles, _
                document.FullName, _
                "", _
                vsFindResultsLocation.vsFindResultsNone)

            If result = vsFindResult.vsFindResultReplaced Then
                ' Triggers DocumentEvents_DocumentSaved event again
                document.Save()
            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub


2

Maalesef makroların desteklenmediği VWD 2010 Express kullanıyorum . Sadece kopya yapmak Yani / yapıştırma Not Defteri ++ üst sol menüde Edit> Blank Operations>Trim Trailing Space mevcut diğer ilgili işlemler de vardır. Ardından Visual Studio'ya kopyalayıp yapıştırın.

Ayrıca , "Kaynak" menüsü altında "Sondaki boşlukları kaldır" bulunan Notepad ++ yerine NetBeans kullanılabilir.


Sadece bul / değiştir: b + $ ile boş dizge ve bunu VS'nin hızlı sürümlerinde yapabilirsiniz.
yasallaştır

1

Bu tek kişilik bir proje değilse, yapmayın. Yerel dosyalarınızı kaynak kod deponuza göre ayırmak önemsiz olmalı ve boşlukları temizlemek, değiştirmeniz gerekmeyen satırları değiştirecektir. Tamamen anlıyorum; Beyaz alanımın tamamen tek tip olmasını seviyorum - ancak bu, daha temiz bir işbirliği uğruna vazgeçmeniz gereken bir şey.


17
Çoğu iyi diff aracı, takip eden beyaz boşluk gibi önemsiz farklılıkları göz ardı eder.
Aracınız

19
Şirketteki / projedeki herkes bunu yaparsa, farklar temiz olacaktır. Tüm beyaz alanları bir kez temizlemeniz gerekecek. O zaman, yalnızca boşlukları düzelten tek bir işleminiz olur ve gelecekte boşluk sorunu yaşamazsınız.
ThiefMaster

Bu doğru. Ancak bu sineklerin olup olmadığı takıma bağlı olacaktır. Herkesin işine fazladan bir adım eklemek, hatta senkronize tutmak için fazladan bir ayar eklemek gereksiz sürtüşme yaratma eğilimindedir. Eğer takım değişebilirse veya takım üyeleri kendi IDE'lerini seçebilirlerse, o zaman boşlukları bırakmanızı öneririm. O kadar büyük bir anlaşma değil.
Kevin Conner

3
Beyaz boşluk ve girinti temizlemeyle ilgili sorun, açıklama ekleme gibi kaynak denetimi özelliklerinin etkinliğini azaltmasıdır ve bu, Karşılaştırmanın Ötesinde'nin çözemeyeceği bir sorundur. İlk seferinde doğru yapmak daha iyi.
jammycakes

4
@KevinConner Yanlış boşlukları tutarlı tutmak , projenin başlangıcında dev bir boşluk taahhüdü ile bir kez düzeltmekten çok daha zor görünüyor . Ardından, editörü aptal ve bozuk olan herkes, taahhütte bulunmadan önce farklarını kontrol ettiklerinde bunu anlayacaktır.
Dan Bechard

1

Ben düşünüyorum Jeff Muir sürümü sadece (benim durumda C #, ancak daha fazla uzantıları eklemek kolaydır) kaynak kod dosyaları kırpar eğer biraz geliştirilmiş olabilir. Ayrıca belge penceresinin görünür olduğundan emin olmak için bir kontrol ekledim çünkü bu kontrolün olmadığı bazı durumlar bana garip hatalar gösteriyor (örneğin LINQ to SQL dosyaları '* .dbml').

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) Handles DocumentEvents.DocumentSaved
    Dim result As vsFindResult
    Try
        If (document.ActiveWindow Is Nothing) Then
            Return
        End If
        If (document.Name.ToLower().EndsWith(".cs")) Then
            document.Activate()
            result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, ":Zs+$", vsFindOptions.vsFindOptionsRegularExpression, String.Empty, vsFindTarget.vsFindTargetCurrentDocument, , , vsFindResultsLocation.vsFindResultsNone)
            If result = vsFindResult.vsFindResultReplaced Then
                document.Save()
            End If
        End If
    Catch ex As Exception
        MsgBox(ex.Message & Chr(13) & "Document: " & document.FullName, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub


0

Sanırım bu makronun VS2010'u refactor üzerinde çökertmeyecek ve ayrıca metin olmayan dosyaları kaydederken IDE'yi kilitlemeyecek bir sürümüne sahibim. Bunu dene:

Private Sub DocumentEvents_DocumentSaved( _
    ByVal document As EnvDTE.Document) _
    Handles DocumentEvents.DocumentSaved
    ' See if we're saving a text file
    Dim textDocument As EnvDTE.TextDocument = _
        TryCast(document.Object(), EnvDTE.TextDocument)

    If textDocument IsNot Nothing Then
        ' Perform search/replace on the text document directly
        ' Convert tabs to spaces
        Dim convertedTabs = textDocument.ReplacePattern("\t", "    ", _
            vsFindOptions.vsFindOptionsRegularExpression)

        ' Remove trailing whitespace from each line
        Dim removedTrailingWS = textDocument.ReplacePattern(":Zs+$", "", _
            vsFindOptions.vsFindOptionsRegularExpression)

        ' Re-save the document if either replace was successful
        ' (NOTE: Should recurse only once; the searches will fail next time)
        If convertedTabs Or removedTrailingWS Then
            document.Save()
        End If
    End If
End Sub

0

Bunu yapmak için ArtisticStyle (C ++) kullanıyorum ve ayrıca kodumu yeniden biçimlendiriyorum. Ancak, bunu harici bir araç olarak eklemek zorunda kaldım ve beğenmeyebilmeniz için onu kendiniz tetiklemeniz gerekiyor.

Bununla birlikte, kodu daha özel bir şekilde (örneğin, çok satırlı işlev parametreleri) elle çalıştırmanın bedelini ödeyebilecek şekilde yeniden biçimlendirebilmeyi mükemmel buluyorum. Araç ücretsizdir.


0

Dyaus'un cevabını ve bir bağlantı raporundan düzenli bir ifadeyi temel alan işte, tümünü kaydetmeyi işleyen, sekmeleri boşluklarla değiştirmeyen ve statik bir değişken gerektirmeyen bir makro. Olası dezavantajı? Belki birden çok çağrı nedeniyle biraz yavaş görünüyor FindReplace.

Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    Try
        ' Remove all the trailing whitespaces.
        If vsFindResult.vsFindResultReplaced = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                             "{:b}+$", _
                             vsFindOptions.vsFindOptionsRegularExpression, _
                             String.Empty, _
                             vsFindTarget.vsFindTargetFiles, _
                             document.FullName, , _
                             vsFindResultsLocation.vsFindResultsNone) Then
            document.Save()
        End If
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try
End Sub

Bunu bir Visual Studio 2012 eklentisinde kullanmaya çalışan başka biri için, kullandığım normal ifade şudur [ \t]+(?=\r?$)(gerekirse ters eğik çizgilerden kaçmayı unutmayın). Ben ilgili sorunları çözmeye birkaç sonuçsuz denemeden sonra buraya geldi ham dönüşüm ait {:b}+$satırbaşı maç için başarısız.


-1

Bu, sondaki beyaz boşluğun nasıl kaldırılacağına dair gerçekten iyi bir örnektir. Bu makroyu kullanarak keşfettiğim şeye bağlı olarak değiştirebileceğim birkaç şey var. İlk olarak, makro otomatik olarak sekmeleri boşluklara dönüştürür. Bu her zaman arzu edilen bir durum değildir ve sekmeleri seven (tipik olarak Linux tabanlı) insanlar için işleri daha da kötüleştirebilir. Sekme problemi zaten fazladan boşluk problemiyle aynı değil. İkinci olarak, makro aynı anda yalnızca bir dosyanın kaydedildiğini varsayar. Aynı anda birden çok dosya kaydederseniz, boşluklar doğru şekilde kaldırılmaz. Nedeni basit. Mevcut belge, görebileceğiniz belge olarak kabul edilir. Üçüncüsü, bulma sonuçlarında hata kontrolü yapmaz. Bu sonuçlar, bir sonraki adımda ne yapılması gerektiği konusunda daha iyi bilgi verebilir. Örneğin, boşluk bulunmazsa ve değiştirilmezse, dosyayı yeniden kaydetmeye gerek yoktur. Genel olarak, küresel bayrağın kurtarılıp kurtarılmamasını sevmedim. Bilinmeyen durumlara dayanarak sorun arama eğilimindedir. Bayrağın yalnızca sonsuz bir döngüyü önlemek için eklendiğinden şüpheleniyorum.

    Private Sub DocumentEvents_DocumentSaved(ByVal document As EnvDTE.Document) _
                                         Handles DocumentEvents.DocumentSaved
    Dim result As vsFindResult
    'Dim nameresult As String

    Try
        document.Activate()

        ' Remove all the trailing whitespaces.
        result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                             ":Zs+$", _
                             vsFindOptions.vsFindOptionsRegularExpression, _
                             String.Empty, _
                             vsFindTarget.vsFindTargetCurrentDocument, , , _
                             vsFindResultsLocation.vsFindResultsNone)

        'nameresult = document.Name & " " & Str$(result)

        'MsgBox(nameresult, , "Filename and result")

        If result = vsFindResult.vsFindResultReplaced Then
            'MsgBox("Document Saved", MsgBoxStyle.OkOnly, "Saved Macro")
            document.Save()
        Else
            'MsgBox("Document Not Saved", MsgBoxStyle.OkOnly, "Saved Macro")
        End If

    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.OkOnly, "Trim White Space exception")
    End Try

End Sub

Neler olduğunu görmek için hata ayıklama mesaj kutuları ekledim. Birden çok dosya kaydetmenin çalışmadığını açıkça ortaya koydu. Onlarla oynamak istiyorsanız, bu replikleri kaldırın.

Temel fark, belgeyi aktif mevcut belgenin ön planına zorlamak için document.Activate () kullanmaktır. Sonuç 4 ise, bu metnin değiştirildiği anlamına gelir. Sıfır, hiçbir şey olmadığı anlamına gelir. Her dosya için iki kayıt göreceksiniz. Birincisi yerini alacak ve ikincisi hiçbir şey yapmayacaktır. Kaydetme dosyayı yazamazsa potansiyel olarak sorun olabilir, ancak umarım bu olay olursa bu olay çağrılmaz.

Orijinal komut dosyasından önce, komut dosyalarının Visual Studio'da nasıl çalıştığından habersizdim. Ana arayüz olarak Visual Basic'i kullanması biraz şaşırtıcıdır, ancak yapması gerekenler için gayet iyi çalışıyor.


Bunda yapılan bir değişiklik, kaydetme başladığında odaklanmış olan pencereye odağı kaydetmeyi ve geri yüklemeyi desteklemektir. Etkin belgeyi Try'dan sonra (currdoc = DTE.ActiveDocument kullanarak) ve belgeden önce kaydedin.Activate (). Kaydetme işlemi tamamlandıktan sonra, orijinal belgeyi etkinleştirmeniz yeterlidir (currdoc.Activate ()). Kaydetme sırasında odak değiştirildiğinde biraz komik görünüyor, ancak bakmadığınız koda odaklanmayı kaybetmekten daha iyidir.
Jeff Muir

-1

Basit bir ekleme, kaydetme sırasında satır başlarını kaldırmaktır.

' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
                             "\x000d\x000a", _
                             vsFindOptions.vsFindOptionsRegularExpression, _
                             "\x000a", _
                             vsFindTarget.vsFindTargetCurrentDocument, , , _
                             vsFindResultsLocation.vsFindResultsNone)

Bu çalışmanın anahtarı \ x000d \ x000a'yı \ x000a olarak değiştirmektir. \ X öneki bir Unicode modelini belirtir. Bu, kaynak dosyaları Linux sistemleri için hazırlama sürecini otomatikleştirecektir.

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.