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 namespace
s 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.
'IT박스' 카테고리의 다른 글
div contenteditable 요소에 초점 설정 (0) | 2020.12.01 |
---|---|
Android 앱의 유료 및 무료 버전을 얻는 가장 좋은 방법 (0) | 2020.12.01 |
중괄호 일치를위한 IntelliJ IDEA 바로 가기 키맵 (0) | 2020.12.01 |
JavaScript가 if 문에서 쉼표를 허용하는 이유는 무엇입니까? (0) | 2020.12.01 |
URL에 공백이 있습니까? (0) | 2020.12.01 |