Фрагмент VSCODE для создания нового класса С# с объявлением пространства имен

Теперь мы можем создать только новые file или folder. И очень раздражает писать пространства имен каждый раз, когда вы создаете декларацию класса.

Но возможно ли создать новый файл класса С# с автоматическим созданием соответствующих пространств имен внутри? Или, может быть, какой-то фрагмент?

Ответ 1

Это в настоящее время невозможно. У вас нет возможности получить текущее имя файла, каталог или другую информацию в файле объявления фрагмента кода Visual Studio.

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

 "Namespace and class": {
    "prefix": "namespaceAndClass",
    "body": [
        "namespace $1",
        "{",
        "   class $2",
        "   {",
        "",
        "   }",
        "}"
    ],
    "description": "Create a namespace block with a class"
 }

Если вам действительно нужен фрагмент, который заполняет правильное пространство имен и имя класса на основе пути к файлу, вы можете взглянуть на проект OmniSharp. Это может дать вам представление о том, как улучшить расширение csharp-o, чтобы предоставить правильные данные в качестве подсказки из плагина. Но я думаю, что это гораздо более сложная задача, чем ввод пространства имен и классов самостоятельно.

Ответ 2

Это расширение предоставляет кнопку контекстного меню для добавления нового класса, который будет автоматически заполнять пространство имен.

Код Visual Studio немного изменился с момента последнего ответа. Теперь он предоставляет переменную TM_DIRECTORY во фрагментах, но это абсолютный путь. Я отправил запрос на улучшение, чтобы указать относительный путь, который можно преобразовать в пространство имен. Но, честно говоря, я думаю, что вышеупомянутое расширение удовлетворяет мои потребности (и контекстное меню является плюсом)

Ответ 3

Умеренно грязное решение с текущей переменной и системой регулярных выражений vscode выглядит следующим образом:

Предполагая, что у вас есть все ваши проекты в /your/projects/directory/

Итак, проект № 1 находится в /your/projects/directory/Project1/
И проект № 2 находится в /your/projects/directory/Project2/
и т.п.

Следующий фрагмент создаст реализацию пространства имен для всех подкаталогов:

Linux/MacOS

"Namespace declaration":
{
    "prefix": "name",
    "description": "Creates a new namespace declaration.",
    "body":
    [
        "namespace ${TM_DIRECTORY/^\\/your\\/projects\\/directory(\\/([^\\/]+))(\\/([^\\/]+))?(\\/([^\\/]+))?(\\/([^\\/]+))?(\\/([^\\/]+))?(\\/([^\\/]+))?(\\/([^\\/]+))?(\\/([^\\/]+))?(\\/([^\\/]+))?(\\/([^\\/]+))?/$2${3:+.}$4${5:+.}$6${7:+.}$8${9:+.}$10${11:+.}$12${13:+.}$14${15:+.}$16${17:+.}$18${19:+.}$20/gi}",
        "{",
        "}"
    ]
}

Windows

"Namespace declaration":
{
    "prefix": "name",
    "description": "Creates a new namespace declaration.",
    "body":
    [
        "namespace ${TM_DIRECTORY/^c:\\\\your\\\\projects\\\\directory(\\\\([^\\\\]+))(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?(\\\\([^\\\\]+))?/$2${3:+.}$4${5:+.}$6${7:+.}$8${9:+.}$10${11:+.}$12${13:+.}$14${15:+.}$16${17:+.}$18${19:+.}$20/gi}",
        "{",
        "}"
    ]
}

объяснение

  1. Фрагмент соответствует вашему базовому каталогу и до десяти подкаталогов (первый каталог является обязательным (\\/([^\\/]+)), в то время как все остальные девять необязательны (\\/([^\\/]+))?)
  2. Затем создается директива пространства имен с первым соответствующим каталогом
  3. За каждое успешное совпадение дополнительного подкаталога ставится точка . вставляется (${3:+.}) с под-соответствием этой группы ($4); для неудачных групп точка не вставлена, а подстатья пуста

Наслаждаться :)