เป็นไปได้หรือไม่ที่จะกำหนดค่า Visual Studio 2008 ให้ลบอักขระช่องว่างที่ท้ายแต่ละบรรทัดโดยอัตโนมัติเมื่อบันทึกไฟล์ ดูเหมือนจะไม่มีตัวเลือกในตัวดังนั้นมีส่วนขยายใดบ้างที่สามารถทำได้
เป็นไปได้หรือไม่ที่จะกำหนดค่า Visual Studio 2008 ให้ลบอักขระช่องว่างที่ท้ายแต่ละบรรทัดโดยอัตโนมัติเมื่อบันทึกไฟล์ ดูเหมือนจะไม่มีตัวเลือกในตัวดังนั้นมีส่วนขยายใดบ้างที่สามารถทำได้
คำตอบ:
CodeMaid เป็นส่วนขยาย Visual Studio ที่ได้รับความนิยมมากและทำสิ่งนี้โดยอัตโนมัติพร้อมกับการล้างข้อมูลที่มีประโยชน์อื่น ๆ
ฉันตั้งค่าให้ล้างไฟล์ที่บันทึกซึ่งฉันเชื่อว่าเป็นค่าเริ่มต้น
ค้นหา / แทนที่โดยใช้นิพจน์ทั่วไป
ในการค้นหาและแทนโต้ตอบกล่องขยายค้นหาตัวเลือกการตรวจสอบการใช้งานให้เลือกนิพจน์ปกติ
ค้นหาอะไร : " :Zs#$
"
แทนที่ด้วย : ""
คลิกแทนที่ทั้งหมด
ในการแก้ไขอื่น ๆ (เป็นปกตินิพจน์ parser) " :Zs#$
" จะ " \s*$
"
[^\S\r\n]+(?=\r?$)
[:Zs\t]#$
เป็นการปรับเปลี่ยนที่มีประโยชน์
คุณสามารถสร้างมาโครที่ดำเนินการหลังจากบันทึกเพื่อทำสิ่งนี้ให้คุณได้
เพิ่มสิ่งต่อไปนี้ลงในโมดูล EnvironmentEvents สำหรับมาโครของคุณ
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
ฉันใช้สิ่งนี้มาระยะหนึ่งแล้วโดยไม่มีปัญหาใด ๆ ฉันไม่ได้สร้างมาโคร แต่แก้ไขจากมาโครใน ace_guidelines.vsmacros ซึ่งสามารถพบได้ด้วยการค้นหาโดย Google อย่างรวดเร็ว
ก่อนที่จะบันทึกคุณอาจจะสามารถที่จะใช้จัดรูปแบบอัตโนมัติทางลัดCTRL+ +KD
คุณสามารถทำได้อย่างง่ายดายด้วยการกระทำทั้งสามนี้:
Ctrl+ A(เลือกข้อความทั้งหมด)
แก้ไข -> ขั้นสูง -> ลบช่องว่างแนวนอน
แก้ไข -> ขั้นสูง -> การเลือกรูปแบบ
รอสักครู่แล้วเสร็จ
มันCtrl+ Z'สามารถในกรณีที่สิ่งที่ผิดพลาด
โดยใช้องค์ประกอบจากคำตอบทั้งหมดที่ให้ไปแล้วนี่คือรหัสที่ฉันลงท้ายด้วย (ส่วนใหญ่ฉันเขียนโค้ด C ++ แต่ตรวจสอบนามสกุลไฟล์ต่างๆได้ง่ายตามต้องการ)
ขอบคุณทุกคนที่มีส่วนร่วม!
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
คุณสามารถใช้มาโครตามที่อธิบายไว้ในการลบช่องว่างและเขียนความคิดเห็นใหม่โดยใช้การค้นหา regex
ฉันใช้VWD 2010 Express ซึ่งไม่รองรับมาโคร ดังนั้นผมจึงเพียงแค่ทำคัดลอก / วางลงในNotepad ++เมนูด้านซ้ายบนEdit
> Blank Operations
> Trim Trailing Space
มีการดำเนินงานที่เกี่ยวข้องอื่น ๆ ที่มีมากเกินไป จากนั้นคัดลอก / วางกลับลงใน Visual Studio
นอกจากนี้คุณยังสามารถใช้NetBeansแทน Notepad ++ ซึ่งมี "ลบช่องว่างต่อท้าย" ภายใต้เมนู "แหล่งที่มา"
เว้นเสียแต่ว่าเป็นโครงการคนเดียวอย่าทำ มันเป็นเรื่องเล็กน้อยที่จะทำให้ไฟล์ในเครื่องของคุณแตกต่างจากที่เก็บซอร์สโค้ดของคุณและการล้างช่องว่างจะเปลี่ยนบรรทัดที่คุณไม่จำเป็นต้องเปลี่ยน ฉันเข้าใจทั้งหมด; ฉันชอบที่จะได้ช่องว่างทั้งหมดของฉัน - แต่นี่เป็นสิ่งที่คุณควรยอมแพ้เพื่อประโยชน์ในการทำงานร่วมกันที่สะอาดยิ่งขึ้น
ฉันคิดว่าเวอร์ชันของJeff Muirอาจได้รับการปรับปรุงเล็กน้อยหากเพียงแค่ตัดแต่งไฟล์ซอร์สโค้ด (ในกรณีของฉันคือ C # แต่สามารถเพิ่มส่วนขยายได้ง่าย) นอกจากนี้ฉันยังเพิ่มการตรวจสอบเพื่อให้แน่ใจว่าหน้าต่างเอกสารสามารถมองเห็นได้เนื่องจากบางสถานการณ์ที่ไม่มีการตรวจสอบนั้นแสดงข้อผิดพลาดแปลก ๆ ให้ฉัน (ตัวอย่างเช่น LINQ เป็นไฟล์ SQL '* .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
โดยส่วนตัวแล้วฉันชอบส่วนขยายTrailing Whitespace Visualizer Visual Studio ซึ่งได้รับการสนับสนุนผ่าน Visual Studio 2012
ฉันคิดว่าฉันมีมาโครรุ่นนี้ที่จะไม่ขัดข้อง VS2010 บนตัวรีแฟคเตอร์และจะไม่แขวน IDE เมื่อบันทึกไฟล์ที่ไม่ใช่ข้อความ ลองสิ่งนี้:
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
ฉันใช้ArtisticStyle (C ++) เพื่อทำสิ่งนี้และฟอร์แมตโค้ดใหม่ด้วย อย่างไรก็ตามฉันต้องเพิ่มสิ่งนี้เป็นเครื่องมือภายนอกและคุณต้องเรียกใช้ด้วยตัวเองดังนั้นคุณอาจไม่ชอบ
อย่างไรก็ตามฉันพบว่ามันยอดเยี่ยมมากที่ฉันสามารถฟอร์แมตโค้ดด้วยวิธีที่กำหนดเองได้มากขึ้น (เช่นพารามิเตอร์ฟังก์ชันหลายบรรทัด) ซึ่งฉันสามารถจ่ายในราคาที่รันด้วยตนเองได้ เครื่องมือนี้ฟรี
จากคำตอบของ Dyaus และนิพจน์ทั่วไปจากรายงานการเชื่อมต่อนี่คือมาโครที่จัดการบันทึกทั้งหมดไม่แทนที่แท็บด้วยช่องว่างและไม่ต้องการตัวแปรคงที่ ข้อเสียที่เป็นไปได้? ดูเหมือนช้าเล็กน้อยอาจเป็นเพราะมีการโทรเข้าหลาย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
สำหรับใครก็ตามที่พยายามใช้สิ่งนี้ใน Add-in ของ Visual Studio 2012 นิพจน์ทั่วไปที่ฉันใช้คือ[ \t]+(?=\r?$)
(อย่าลืมหลีกเลี่ยงเครื่องหมายแบ็กสแลชหากจำเป็น) ฉันมาถึงที่นี่หลังจากความพยายามที่ไร้ประโยชน์หลายครั้งในการแก้ไขปัญหาด้วยการแปลงข้อมูลดิบว่า{:b}+$
ไม่ตรงกับการคืนค่าขนส่ง
นี่เป็นตัวอย่างที่ดีมากในการลบช่องว่างต่อท้าย มีบางสิ่งที่ฉันจะเปลี่ยนตามสิ่งที่ฉันค้นพบโดยใช้มาโครนี้ ก่อนอื่นมาโครจะแปลงแท็บเป็นช่องว่างโดยอัตโนมัติ สิ่งนี้ไม่เป็นที่ต้องการเสมอไปและอาจนำไปสู่การทำให้สิ่งต่างๆแย่ลงสำหรับผู้ที่ชื่นชอบแท็บ (โดยทั่วไปจะใช้ Linux) ปัญหาของแท็บไม่เหมือนกับปัญหาช่องว่างพิเศษ แต่อย่างใด ประการที่สองมาโครจะถือว่ามีการบันทึกไฟล์เพียงไฟล์เดียวพร้อมกัน หากคุณบันทึกหลายไฟล์พร้อมกันไฟล์นั้นจะไม่สามารถลบช่องว่างได้อย่างถูกต้อง เหตุผลง่ายๆคือ เอกสารปัจจุบันถือเป็นเอกสารที่คุณสามารถดูได้ ประการที่สามไม่มีข้อผิดพลาดในการตรวจสอบผลการค้นหา ผลลัพธ์เหล่านี้สามารถให้ข้อมูลที่ดีขึ้นเกี่ยวกับสิ่งที่ต้องทำต่อไป ตัวอย่างเช่นหากไม่พบช่องว่างและแทนที่ ไม่จำเป็นต้องบันทึกไฟล์อีกครั้ง โดยทั่วไปฉันไม่ชอบความจำเป็นในการตั้งค่าสถานะส่วนกลางเพื่อให้ได้รับความรอดหรือไม่ มีแนวโน้มที่จะขอปัญหาตามรัฐที่ไม่รู้จัก ฉันสงสัยว่ามีการเพิ่มแฟล็กเพื่อป้องกันการวนซ้ำแบบไม่สิ้นสุด
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
ฉันเพิ่มกล่องข้อความแก้ไขข้อบกพร่องเพื่อช่วยดูว่าเกิดอะไรขึ้น ทำให้ชัดเจนมากว่าการบันทึกไฟล์หลายไฟล์ไม่ทำงาน หากคุณต้องการเล่นกับพวกเขาให้ยกเลิกการใส่ข้อคิดเห็นเหล่านั้น
ความแตกต่างที่สำคัญคือการใช้ document.Activate () เพื่อบังคับให้เอกสารเป็นเอกสารปัจจุบันที่ใช้งานอยู่เบื้องหน้า หากผลลัพธ์เป็น 4 แสดงว่าข้อความนั้นถูกแทนที่ Zero หมายถึงไม่มีอะไรเกิดขึ้น คุณจะเห็นการบันทึกสองรายการสำหรับทุกไฟล์ ครั้งแรกจะแทนที่และครั้งที่สองจะไม่ทำอะไรเลย อาจมีปัญหาหากบันทึกไม่สามารถเขียนไฟล์ได้ แต่หวังว่าเหตุการณ์นี้จะไม่ถูกเรียกหากเกิดขึ้น
ก่อนสคริปต์ต้นฉบับฉันไม่ทราบว่าสคริปต์ทำงานอย่างไรใน Visual Studio เป็นที่น่าแปลกใจเล็กน้อยที่ใช้ Visual Basic เป็นอินเทอร์เฟซหลัก แต่ก็ใช้งานได้ดีสำหรับสิ่งที่ต้องทำ
เพิ่มเติมง่ายๆคือการลบการคืนแคร่ในระหว่างการบันทึก
' Remove all the carriage returns.
result = DTE.Find.FindReplace(vsFindAction.vsFindActionReplaceAll, _
"\x000d\x000a", _
vsFindOptions.vsFindOptionsRegularExpression, _
"\x000a", _
vsFindTarget.vsFindTargetCurrentDocument, , , _
vsFindResultsLocation.vsFindResultsNone)
กุญแจสำคัญในการทำงานนี้กำลังเปลี่ยน \ x000d \ x000a เป็น \ x000a คำนำหน้า \ x ระบุรูปแบบ Unicode ซึ่งจะทำให้กระบวนการเตรียมไฟล์ต้นฉบับพร้อมสำหรับระบบ Linux โดยอัตโนมัติ