При создании фрагмента VSCode, как я могу преобразовать переменную в case-case (например, TitleCase)?

https://code.visualstudio.com/docs/editor/userdefinedsnippets

Моя цель состоит в том, чтобы автоматически установить имя класса в контексте вставляемого фрагмента. VSCode изначально не поддерживает имена классов или методов, но поддерживает имя файла.

Мои имена файлов близко имитируют имя класса:

foo-bar.ts за class FooBar,

Вот мой текущий фрагмент кода, в котором я могу преобразовать "foo-bar" в "Foo-bar" используя собственную грамматику "прописных букв", предоставленную VSCode. TM_FILENAME_BASE является нативной переменной, которая извлекает имя файла без расширения:

"My Snippet": {
    "scope": "typescript",
    "prefix": "snippet",
    "body": [
        "${1}() {",
        "\treturn this.get(${TM_FILENAME_BASE/(.*)/${1:/capitalize}/}.FIELD.${3});",
        "}",
        "",
        "$0"
    ],
    "description": "Creates a function wrapper for a model's attribute."
}

Я хотел бы преобразовать "foo-bar" в "FooBar".

3 ответа

Решение

Попробуй это:

  "My Snippet": {
    "scope": "typescript",
    "prefix": "snippet",
    "body": [
      "${1}() {",
      "\treturn this.get(${TM_FILENAME_BASE/([a-z]*)-*([a-z]*)/${1:/capitalize}${2:/capitalize}/g}.FIELD.${3});",
      "}",
      "",
      "$0"
    ],
    "description": "Creates a function wrapper for a model's attribute."
  }

Это работает, если ваши файлы имеют длину два или более сегмента, например, foo-bar.ts или foo-bar-zoo.ts и т. Д.

См. Также преобразование фрагмента в CamelCase.

TM_FILENAME_BASE: имя файла текущего документа без его расширений.

${1:/upcase}: перейти к верхнему регистру.

g: используется для глобальной замены.

      "My Snippet": {
    "scope": "typescript",
    "prefix": "snippet",
    "body": [
        "${TM_FILENAME_BASE/(?:^|-|_|\\.)(\\w)/${1:/upcase}/g}"
    ],
    "description": "Creates a function wrapper for a model's attribute."
}

UserDefinedSnippetsVariablesSRC

Thought it might be useful to supplement Mark's excellent answer with another example.

In my case, I wanted to take a name - as selected text - and convert it to Swift code that would instantiate a new class passing in variables name and email address.

So for example I select John Smith as first name, last name and convert to:

let johnSmith = User(name: "John Smith", email: "john.smith@foorbar.com")

Code snippet for this would be as follows:

"User": {
        "prefix": "u",
        "body": [
            "\tlet ${TM_SELECTED_TEXT/([a-zA-Z]*) *([a-zA-Z]*)/${1:/downcase}$2/} = User(name: \"${TM_SELECTED_TEXT}\", email: \"${TM_SELECTED_TEXT/([a-zA-Z]*) *([a-zA-Z]*)/${1:/downcase}.${2:/downcase}/}@foobar.com\")\n",
        ],
        "description": "Create User with name and email"
    }
Другие вопросы по тегам