it-swarm-pt.tech

Como remover automaticamente o espaço em branco à direita no Visual Studio 2008?

É possível configurar o Visual Studio 2008 para remover automaticamente caracteres de espaço em branco no final de cada linha ao salvar um arquivo? Parece não haver uma opção interna, existem extensões disponíveis para isso?

120
ChrisN

O CodeMaid é uma extensão do Visual Studio muito popular e faz isso automaticamente junto com outras limpezas úteis.

Eu o configurei para limpar um arquivo ao salvar, que acredito ser o padrão.

65
arserbin3

Localizar/substituir usando expressões regulares

Na caixa de diálogo Localizar e substituir, expanda Opções de localização, marque sar, escolha Expressões regulares

Encontre o que: ":Zs#$"

Substitua por: ""

clique em Substituir tudo

Em outros editores (um normal Analisador de expressão regular) ":Zs#$" seria "\s*$".

71
Greg Ogle

Você pode criar uma macro que é executada após um salvamento para fazer isso por você.

Adicione o seguinte ao módulo EnvironmentEvents para suas macros.

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

Estou usando isso há algum tempo agora sem problemas. Eu não criei a macro, mas a modifiquei de ace_guidelines.vsmacros, que pode ser encontrada com uma rápida pesquisa no Google.

30
Dyaus

Antes de salvar, você poderá usar o atalho de formatação automática CTRL+K+D.

16
Vyrotek

Você pode fazer isso facilmente com estas três ações:

  • Ctrl + A (selecione todo o texto)

  • Editar -> Avançado -> Excluir espaço em branco horizontal

  • Editar -> Avançado -> Seleção de Formato

Aguarde alguns segundos e pronto.

Está Ctrl + Zpossível caso algo dê errado.

9
iPixel

Tomando elementos de todas as respostas já dadas, aqui está o código que eu acabei com. (Eu escrevo principalmente código C++, mas é fácil verificar diferentes extensões de arquivo, conforme necessário.)

Obrigado a todos que contribuíram!

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
3
Jorge Ferreira

Estou usando VWD 2010 Express, onde macros não são suportadas, infelizmente. Então eu apenas copio/colo em Notepad ++ menu superior esquerdo Edit> Blank Operations> Trim Trailing Space também existem outras operações relacionadas disponíveis. Em seguida, copie/cole novamente no Visual Studio.

Também é possível usar NetBeans em vez do Notepad ++, que possui "Remover espaços finais" no menu "Origem".

2
Evgenii

A menos que seja um projeto de uma pessoa, não faça isso. Deve ser trivial diferenciar seus arquivos locais do seu repositório de código-fonte, e limpar o espaço em branco alteraria as linhas que você não precisa alterar. Eu compreendo totalmente; Eu amo uniformizar meu espaço em branco - mas isso é algo que você deve desistir por uma colaboração mais limpa.

1
Kevin Conner

Eu acho que a versão Jeff Muir poderia ser um pouco melhorada se apenas aparasse os arquivos de código-fonte (no meu caso, C #, mas é fácil adicionar mais extensões). Também adicionei uma verificação para garantir que a janela do documento esteja visível, porque algumas situações sem essa verificação me mostram erros estranhos (arquivos LINQ to SQL '* .dbml', por exemplo).

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

Eu, pessoalmente, adoro a extensão Visual Studio Trailing Whitespace Visual Studio, que tem suporte no Visual Studio 2012.

1
pwhe23

Eu uso ArtisticStyle (C++) para fazer isso e também reformatar meu código. No entanto, eu tive que adicionar isso como uma ferramenta externa e você precisa ativá-lo para não gostar.

No entanto, acho excelente que eu possa reformatar o código de maneira mais personalizada (por exemplo, parâmetros de função de várias linhas) que eu possa pagar o preço de executá-lo manualmente. A ferramenta é gratuita.

0
Marcin Gil

Com base na resposta de Dyaus e na expressão regular de um relatório de conexão , aqui está uma macro que trata de salvar tudo, não substitui abas por espaços e não requer uma variável estática. Sua possível desvantagem? Parece um pouco lento, talvez devido a várias chamadas para 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

Para qualquer outra pessoa que tente usar isso em um suplemento do Visual Studio 2012, a expressão regular que acabei usando é [ \t]+(?=\r?$) (não se esqueça de escapar das barras invertidas, se necessário). Cheguei aqui depois de várias tentativas fúteis de corrigir os problemas com um conversão bruta de {:b}+$ falhando em corresponder ao retorno de carro.

0
Michael Urman

Acho que tenho uma versão dessa macro que não trava o VS2010 no refator e também não trava o IDE ao salvar arquivos que não são de texto. Tente o seguinte:

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