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ı?
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ı?
Yanıtlar:
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.
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*$
.
[^\S\r\n]+(?=\r?$)
[:Zs\t]#$
kullanışlı bir uyarlamadır.
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.
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.
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
Normal ifade aramalarını kullanarak beyaz boşlukları kaldırma ve yorumları yeniden yazma konusunda açıklandığı gibi bir makro kullanabilirsiniz.
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.
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.
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
Şahsen , Visual Studio 2012 aracılığıyla destek sağlayan Trailing Whitespace Visualizer Visual Studio uzantısını seviyorum .
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
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.
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.
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.
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.