IT박스

Visual Studio에서 네임 스페이스 들여 쓰기를 중지하도록하는 방법이 있습니까?

itboxs 2020. 12. 1. 07:48
반응형

Visual Studio에서 네임 스페이스 들여 쓰기를 중지하도록하는 방법이 있습니까?


Visual Studio는 네임 스페이스 내에서 코드를 계속 들여 쓰려고합니다.

예를 들면 :

namespace Foo
{
   void Bar();

   void Bar()
   {

   }

}

이제 수동으로 들여 쓰기를 해제하면 그대로 유지됩니다. 그러나 불행히도 void Bar();코멘트와 같은 것을 바로 앞에 추가하면 VS는 계속 들여 쓰기를 시도합니다.

이것은 기본적으로 C ++에서 네임 스페이스를 거의 사용하지 않는 유일한 이유 때문입니다. 들여 쓰기를 시도하는 이유 ( 전체 파일의 1 개 또는 5 개 탭 들여 쓰기의 요점은 무엇 입니까?) 또는 중지하는 방법을 이해할 수 없습니다.

이 동작을 중지하는 방법이 있습니까? 구성 옵션, 추가 기능, 레지스트리 설정, devenv.exe를 직접 수정하는 해킹도 마찬가지입니다.


다음은 도움이 될 수있는 매크로입니다. 현재 .NET Framework를 만들고 있음을 감지하면 들여 쓰기를 제거합니다 namespace. 완벽하지는 않지만 지금까지 작동하는 것 같습니다.

Public Sub aftekeypress(ByVal key As String, ByVal sel As TextSelection, ByVal completion As Boolean) _
        Handles TextDocumentKeyPressEvents.AfterKeyPress
    If (Not completion And key = vbCr) Then
        'Only perform this if we are using smart indent
        If DTE.Properties("TextEditor", "C/C++").Item("IndentStyle").Value = 2 Then
            Dim textDocument As TextDocument = DTE.ActiveDocument.Object("TextDocument")
            Dim startPoint As EditPoint = sel.ActivePoint.CreateEditPoint()
            Dim matchPoint As EditPoint = sel.ActivePoint.CreateEditPoint()
            Dim findOptions As Integer = vsFindOptions.vsFindOptionsMatchCase + vsFindOptions.vsFindOptionsMatchWholeWord + vsFindOptions.vsFindOptionsBackwards
            If startPoint.FindPattern("namespace", findOptions, matchPoint) Then
                Dim lines = matchPoint.GetLines(matchPoint.Line, sel.ActivePoint.Line)
                ' Make sure we are still in the namespace {} but nothing has been typed
                If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace[\s\w]+)?[\s\{]+$") Then
                    sel.Unindent()
                End If
            End If
        End If
    End If
End Sub

항상 실행되기 때문에 MyMacros 내부 EnvironmentEvents프로젝트 항목 에 매크로를 설치하고 있는지 확인해야합니다 . 이 모듈은 매크로 탐색기 (도구-> 매크로-> 매크로 탐색기)에서만 액세스 할 수 있습니다.

참고로, 현재 다음과 같은 "포장 된"네임 스페이스를 지원하지 않습니다.

namespace A { namespace B {
...
}
}

편집하다

위의 예와 같은 "포장 된"네임 스페이스를 지원하고 / 또는 네임 스페이스 뒤의 주석 (예 :)을 지원하려면 namespace A { /* Example */대신 다음 줄을 사용할 수 있습니다.

 If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace.+)?[\s\{]+$") Then

아직 많이 테스트 할 기회가 없었지만 작동하는 것 같습니다.


KindDragon이 지적했듯이 Visual Studio 2013 업데이트 2에는 들여 쓰기를 중지하는 옵션이 있습니다.

TOOLS-> Options-> Text Editor-> C / C ++-> Formatting-> Indentation-> Indent namespace contents 선택을 취소 할 수 있습니다.


코드의 첫 줄 앞에 아무것도 삽입하지 마십시오. 다음 방법을 사용하여 null 코드 줄을 삽입 할 수 있습니다 (VS2005에서 작동하는 것 같습니다).

namespace foo
{; // !<---
void Test();
}

이것은 들여 쓰기를 억제하는 것처럼 보이지만 컴파일러는 경고를 발행 할 수 있으며 코드 검토 자 / 관리자는 놀랄 수 있습니다! (그리고 보통의 경우에요!)


아마 당신이 듣고 싶었던 것은 아니지만 많은 사람들이 매크로를 사용하여이 문제를 해결합니다.

#define BEGIN_NAMESPACE (x) 네임 스페이스 x {
#END_NAMESPACE 정의}

바보 같지만 얼마나 많은 시스템 헤더가 이것을 사용하는지 놀랄 것입니다. (예를 들어 glibc의 stl 표현은이 _GLIBCXX_BEGIN_NAMESPACE()를 위해 있습니다.)

I actually prefer this way, because I always tend to cringe when I see un-indented lines following a {. That's just me though.


You could also forward declare your types (or whatever) inside the namespace then implement outside like this:

namespace test {
    class MyClass;
}

class test::MyClass {
//...
};

I understand the problem when there are nested namespaces. I used to pack all the namespaces in a single line to avoid the multiple indentation. It will leave one level, but that's not as bad as many levels. It's been so long since I have used VS that I hardly remember those days.

namespace outer { namespace middle { namespace inner {
    void Test();
    .....
}}}

Visual Studio 2017

Namespace Indention Menu VS2017

You can get to this "Indent namespace contents" setting under Tools->Options then Text Editor->C/C++->Formatting->Indention. It's deep in the menus but extremely helpful once found.

참고URL : https://stackoverflow.com/questions/3727862/is-there-any-way-to-make-visual-studio-stop-indenting-namespaces

반응형