it-swarm-vi.tech

Làm cách nào để tự động xóa khoảng trắng theo dõi trong Visual Studio 2008?

Có thể định cấu hình Visual Studio 2008 để tự động xóa các ký tự khoảng trắng ở cuối mỗi dòng khi lưu tệp không? Dường như không có tùy chọn tích hợp, vậy có tiện ích mở rộng nào để thực hiện việc này không?

120
ChrisN

CodeMaid là một phần mở rộng Visual Studio rất phổ biến và thực hiện điều này tự động cùng với các dọn dẹp hữu ích khác.

Tôi thiết lập nó để dọn sạch một tập tin khi lưu, mà tôi tin là mặc định.

65
arserbin3

Tìm/Thay thế bằng Biểu thức thông thường

Trong hộp thoại Tìm và Thay thế, mở rộng Tùy chọn Tìm, kiểm tra Sử dụng, chọn Biểu thức chính quy

Tìm gì: ":Zs#$"

Thay thế bằng: ""

nhấp Thay thế tất cả

Trong các trình soạn thảo khác (a bình thường Trình phân tích cú pháp biểu thức chính quy) ":Zs#$" Sẽ là "\s*$".

71
Greg Ogle

Bạn có thể tạo một macro thực thi sau khi lưu để làm điều này cho bạn.

Thêm phần sau vào Mô-đun Môi trường cho các macro của bạn.

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

Tôi đã sử dụng điều này một thời gian mà không có vấn đề gì. Tôi đã không tạo macro, nhưng đã sửa đổi nó từ một trong ace_guiances.vsmacros có thể tìm thấy bằng một tìm kiếm nhanh trên google.

30
Dyaus

Trước khi lưu, bạn có thể sử dụng phím tắt định dạng tự động CTRL+K+D.

16
Vyrotek

Bạn có thể làm điều này dễ dàng với ba hành động sau:

  • Ctrl + A (chọn tất cả văn bản)

  • Chỉnh sửa -> Nâng cao -> Xóa khoảng trắng ngang

  • Chỉnh sửa -> Nâng cao -> Chọn định dạng

Đợi vài giây và thực hiện.

Nó là Ctrl + Z'có thể trong trường hợp xảy ra sự cố.

9
iPixel

Lấy các yếu tố từ tất cả các câu trả lời đã được đưa ra, đây là mã tôi đã kết thúc. (Tôi chủ yếu viết mã C++, nhưng thật dễ dàng để kiểm tra các phần mở rộng tệp khác nhau, nếu cần.)

Cảm ơn những người đã đóng góp!

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
7
ChrisN

Bạn có thể sử dụng một macro như được mô tả trong Xóa khoảng trắng và viết lại nhận xét, sử dụng tìm kiếm regex

3
Jorge Ferreira

Tôi đang sử dụng VWD 2010 Express, nơi macro không được hỗ trợ, thật không may. Vì vậy, tôi chỉ cần sao chép/dán vào Notepad ++ menu trên cùng bên trái Edit> Blank Operations> Trim Trailing Space có những hoạt động liên quan khác có sẵn quá. Sau đó sao chép/dán lại vào Visual Studio.

Người ta cũng có thể sử dụng NetBeans thay vì Notepad ++, có "Xóa dấu cách" trong menu "Nguồn".

2
Evgenii

Trừ khi đây là dự án một người, đừng làm điều đó. Nó đã trở nên tầm thường để làm khác biệt các tệp cục bộ của bạn so với kho lưu trữ mã nguồn của bạn và việc xóa khoảng trắng sẽ thay đổi các dòng bạn không cần thay đổi. Tôi hoàn toàn hiểu; Tôi thích có được khoảng trắng của mình đồng phục - nhưng đây là thứ bạn nên từ bỏ vì sự hợp tác sạch sẽ hơn.

1
Kevin Conner

Tôi nghĩ rằng phiên bản Jeff Muir có thể được cải thiện một chút nếu nó chỉ cắt các tệp mã nguồn (trong trường hợp của tôi là C #, nhưng rất dễ để thêm nhiều tiện ích mở rộng). Ngoài ra, tôi đã thêm một kiểm tra để đảm bảo rằng cửa sổ tài liệu hiển thị vì một số tình huống không có kiểm tra đó cho tôi thấy các lỗi lạ (ví dụ: tệp LINQ to 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
1
David Abella

Cá nhân tôi thích Trailing Whitespace Visualizer Tiện ích mở rộng Visual Studio có hỗ trợ trở lại qua Visual Studio 2012.

1
pwhe23

Tôi sử dụng ArtisticStyle (C++) để làm điều này và cũng định dạng lại mã của tôi. Tuy nhiên, tôi đã phải thêm nó như một công cụ bên ngoài và bạn cần tự kích hoạt nó để bạn có thể không thích nó.

Tuy nhiên, tôi thấy thật tuyệt vời khi tôi có thể định dạng lại mã theo cách tùy chỉnh hơn (ví dụ: tham số hàm đa dòng) mà tôi có thể trả giá khi chạy mã bằng tay. Công cụ này là miễn phí.

0
Marcin Gil

Dựa trên câu trả lời của Dyaus và một biểu thức chính quy từ báo cáo kết nối , đây là một macro xử lý lưu tất cả, không thay thế các tab bằng dấu cách và không yêu cầu biến tĩnh. Nhược điểm của nó có thể? Có vẻ hơi chậm, có lẽ do nhiều cuộc gọi đến 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

Đối với bất kỳ ai khác đang cố gắng sử dụng điều này trong bổ trợ Visual Studio 2012, biểu thức thông thường tôi đã sử dụng là [ \t]+(?=\r?$) (đừng quên thoát dấu gạch chéo ngược nếu cần). Tôi đã đến đây sau một vài nỗ lực vô ích để khắc phục các sự cố với chuyển đổi thô của {:b}+$ Không khớp với lợi nhuận vận chuyển.

0
Michael Urman

Tôi nghĩ rằng tôi có một phiên bản của macro này sẽ không sập VS2010 trên bộ tái cấu trúc và cũng sẽ không treo IDE khi lưu các tệp không phải văn bản. Hãy thử điều này:

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
Julian