Есть ли способ заставить Visual Studio прекратить делать отступы в пространствах имен? - PullRequest
60 голосов
/ 16 сентября 2010

Visual Studio продолжает пытаться отступить код внутри пространств имен.

Например:

namespace Foo
{
   void Bar();

   void Bar()
   {

   }

}

Теперь, если я сделаю отступ вручную, он останется таким. Но, к сожалению, если я добавлю что-то прямо перед void Bar(); - например, комментарий - VS будет пытаться сделать отступ.

Это так раздражает, что в основном по этой единственной причине я почти никогда не использую пространства имен в C ++. Я не могу понять, почему он пытается сделать отступ (отступ в 1 или даже 5 вкладок всего файла ?) Или как его остановить.

Есть ли способ остановить это поведение? Параметр конфигурации, надстройка, параметр реестра, и даже хак, который напрямую изменяет devenv.exe.

Ответы [ 7 ]

44 голосов
/ 18 ноября 2014

Как указывает KindDragon, в Visual Studio 2013 Update 2 есть возможность остановить отступ.

Вы можете снять флажки ИНСТРУМЕНТЫ -> Параметры -> Текстовый редактор -> C / C ++ -> Форматирование -> Отступы ->Отступ для содержимого пространства имен.

30 голосов
/ 16 сентября 2010

Только не вставляйте ничего перед первой строкой кода.Вы можете попробовать следующий подход для вставки пустой строки кода (кажется, что он работает в VS2005):

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

Это, кажется, подавляет отступ, но компиляторы могут выдавать предупреждения, а рецензенты / сопровождающие кода могутудивлены!(И совершенно правильно, в обычном случае!)

13 голосов
/ 24 сентября 2010

Вот макрос, который может вам помочь.Он удалит отступы, если обнаружит, что вы в данный момент создаете 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

Поскольку он работает все время, вам необходимо убедиться, что вы устанавливаете макрос внутри вашего EnvironmentEvents элемента проекта внутри MyMacros.Вы можете получить доступ к этому модулю только в Macro Explorer (Инструменты-> Macros-> Macro Explorer).

Одно примечание, в настоящее время он не поддерживает "упакованные" пространства имен, такие как

namespace A { namespace B {
...
}
}

РЕДАКТИРОВАТЬ

Для поддержки "упакованных" пространств имен, таких как пример выше, и / или поддержки комментариев после пространства имен, таких как namespace A { /* Example */, вы можете попробовать использовать следующую строкувместо этого:

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

У меня еще не было возможности его протестировать, но, похоже, он работает.

12 голосов
/ 16 сентября 2010

Возможно, это не то, что вы хотели услышать, но многие люди обходят это, используя макросы:

#define BEGIN_NAMESPACE(x) namespace x {
#define END_NAMESPACE }

Звучит глупо, но вы удивитесь, сколько системных заголовков используют это.(Например, для glbc stl implentation есть _GLIBCXX_BEGIN_NAMESPACE().)

Я на самом деле предпочитаю этот способ, потому что я всегда склонен сжиматься, когда вижу строки с отступом после {.Это только я.

7 голосов
/ 15 июня 2012

Вы можете также объявить ваши типы (или что-то еще) внутри пространства имен, а затем реализовать их снаружи следующим образом:

3 голосов
/ 16 сентября 2010

Я понимаю проблему, когда есть вложенные пространства имен. Раньше я упаковывал все namespace в одну строку, чтобы избежать множественного отступа. Это оставит один уровень, но это не так плохо, как много уровней. Прошло так много времени с тех пор, как я использовал VS, и я почти не помню те дни.

namespace outer { namespace middle { namespace inner {
    void Test();
    .....
}}}
0 голосов
/ 23 января 2018

Visual Studio 2017

Меню отступов пространства имен VS2017

Вы можете перейти к этой настройке «Отступ содержимого пространства имен» в меню «Инструменты» -> «Параметры», затем «Текстовый редактор» -> «C / C ++» -> «Форматирование»> «Отступ». Он глубоко в меню, но очень полезен, когда его найдут.

...