Generate files/folders based on templates.
-
Add the filed
allowExistingFolder
to template config.If
allowExistingFolder
is set totrue
, when trying to create a directory that is already existing, the existing directory will just be used.If set to
false
or not configured, when trying to create a existing directory, aFileAlreadyExistsError
will be thrown.
-
Template describes the shape of the file content as well as the folder structure.
-
Destination folder path can be specified via right-click context or active editor, and be modified in user input interface.
-
Folders that do not exist can be cerated recursively.
-
Allow variables in file content as well as file/folder names.
-
Support multiple identifier styles.
-
Case style
Case Example camelCase myLovelyCat
pascalCase MyLovelyCat
snakeCase my_lovely_cat
kebabCase my-lovely-cat
snakeUpperCase MY_LOVELY_CAT
snakePascalCase My_Lovely_Cat
kebabUpperCase MY-LOVELY-CAT
kebabPascalCase My-Lovely-Cat
upperCase MYLOVELYCAT
lowerCase mylovelycat
-
Prefix and suffix
Identifiers can be prefixed or suffixed with any visible characters.
-
-
Globally and template-level configuration of file encoding.
-
Globally and template-level configuration of file ignorance list (glob pattern).
-
Template-level configuration of processing mode for already existing directories.
-
template: Edit Templates
Open the templates folder in a new window.
-
template: Reload Templates
Remember to call this command to update templates metadata cached in memory after editing templates config files, adding new templates or deleting existing templates.
-
template: New File / Folder From Template
To select a template and generate codes based on it.
-
Open
command palette
and input a command. -
Right click code area of the active editor and pick a command from the popup menu.
-
Right click file/folder names or space area of the explorer window and pick a command from the popup menu.
-
The initial destination folder may be the active editor's folder, right clicked folder, right clicked file's folder, workspace folder or user home folder based on the
template: New File / Folder From Template
�command's invocation mode. -
Destination folder will show and can be changed in user input interface.
All templates should be defined in the templates folder (Specified by the setting codeTemplateTool.templatesPath
.)
If the specified folder does not exist, it will be auto created.
By default, it's {homedir}/.vscode/templates
.
+ exampleTemplate // template define folder
- template.config.json // template configuration file
- {other files and folders} // template content
-
Template content
Template content support variables.
By default, a variable in template content is like this:
___var___
. It takes___
as it's left boundary and right boundary.You can set variables' boundaries via the
codeTemplateTool.variable.leftBoundary
andcodeTemplate.variable.rightBoundary
fields in user settings.For example, if you set
codeTemplateTool.variable.leftBoundary
to{_
andcodeTemplateTool.variable.rightBoundary
to_}
, a variable will be like{_var_}
Example1:
// The template content is a folder and what it contains. + ___PageName___Page // folder with variable in it's name - index.js // file with fixed name - ___PageName___Page.js // file with variable in it's name - ___pageName___Page.css - ___pageName__Model.js + components // sub folder with fixed name
___PageName___Page.js
import React from 'react' import { connectModel } from 'reduxModel' import ___pageName___Model from './___pageName___Model' import './___pageName___Style.scss' class ___PageName___Page extends React.Component { componentDidMount() { } render() { return ( <div className="___page-name___"> </div> ) } } export default connectModel(___pageName___Model, state => ({ ___pageName___: state.___pageName___, }))(___PageName___Page)
___pageName___Model.js
import { createModel, ___initialStateType___InitialState, ___reducerType___Reducer, } from 'reduxModel' const ___pageName___Model = createModel({ name: '___pageName___', initialState: ___initialStateType___InitialState, asyncOperations: [ { get___PageName___: (success, fail) => ({ api: { success, fail, }, }), reducers: ___reducerType___Reducer, }, ], syncOperations: [ { reset___PageName___: () => {}, reducer: () => ___initialStateType___InitialState, }, ], }) export default ___pageName___Model
...other files
If the configuration file is:
template.config.json
{ "name": "Common Page Template", "variables": ["pageName", "initialStateType", "reducerType"] }
or
template.config.json
{ "name": "Common Page Template", "variables": [ { "name": "pageName", "style": { "case": "auto" } }, { "name": "initialStateType", "style": { "case": "auto" } }, { "name": "reducerType", "style": { "case": "auto" } }, ] }
and the user inputs are as follows:
pageName: lovelyCats initialStateType: list reducerType: list
Then the generated content will be:
// Folder structure + LovelyCatsPage - index.js - LovelyCatsPage.js - lovelyCatsPage.css - lovelyCatsModel.js + components
LovelyCatsPage.js
import React from 'react' import { connectModel } from 'reduxModel' import lovelyCatsModel from './lovelyCatsModel' import './lovelyCatsPage.scss' class LovelyCatsPage extends React.Component { componentDidMount() { } render() { return ( <div className="lovely-cats"> </div> ) } } export default connectModel(lovelyCatsModel, state => ({ lovelyCats: state.lovelyCats, }))(LovelyCatsPage)
lovelyCatsModel.js
import { createModel, listInitialState, listReducer, } from 'reduxModel' const lovelyCatsModel = createModel({ name: 'lovelyCats', initialState: listInitialState, asyncOperations: [ { getLovelyCats: (success, fail) => ({ api: { success, fail, }, }), reducers: listReducer, }, ], syncOperations: [ { resetLovelyCats: () => {}, reducer: () => listInitialState, }, ], }) export default lovelyCatsModel
...other files
Example2:
// The template content is two files and their content. - ___componentName___.js // file with variable in it's name - ___componentName___.css
-
Template configuration file
The name of template configuration file can be specified via the user settings filed
codeTemplateTool.configFile
. By default, it'stemplate.config.json
.The content of template configuration file should be a json object.
Example:
template.config.json
{ "name": "Template Example", "variables": [ "{variable configuration}", "{variable configuration}", "..." ], "encoding": "utf8", // string, optional "ignore": ["{glob pattern}", "{glob pattern}", "..."], // array of string, optional "allowExistingFolder": false, // boolean, optional }
-
The
name
field specifies template's name showed in the template select list. -
Variable configuration
Examples:
// Simplified configuration "variableName" // just a variable name string
// Full configuration { "name": "variableName", // required "defaultValue": "variableDefaultValue", // optional "style": { // optional // All fields of style are optional. "noTransformation": false, "keepUpperCase": false, "case": "camelCase", "prefix": "$$", "suffix": "___" } }
-
The
encoding
filed specifies the encoding used when reading from template files and writing to target files.If not configured, the filed
codeTemplateTool.encoding
in user settings will be used. Usually, it'sutf8
. -
The
ignore
filed can be used to filter files/folders by glob patterns.The final ignore list is the merged result of the
ignore
filed configured here and the filedcodeTemplateTool.ignore
configured in user settings. -
If the
allowExistingFolder
filed is set totrue
, when trying to create a directory that is already existing, the existing directory will just be used.If set to
false
or not configured, when trying to create a existing directory, aFileAlreadyExistsError
will be thrown.
-
-
A variable in template content has a left boundary and a right boundary to distinguish from non variable content. By default, variables' left boundary and right boundary are both
___
(three underscores).The boundary can be customized by setting the fields
codeTemplateTool.variable.leftBoundary
andcodeTemplateTool.variable.rightBoundary
in user settings. -
Take
myPet
as an example of variable name, in template configuration files, you can use any ofmyPet, MyPet, my_pet, my-pet, My_Pet, MY_PET, My-Pet, MY-PET
to represent any one of___myPet___, ___MyPet___, ___my_pet___, ___my-pet___, ___My_Pet___, ___MY_PET___, ___My-Pet___ and ___MY-PET___
in corresponding template content.Actually,
myPet, MyPet, my_pet, my-pet, My_Pet, MY_PET, My-Pet, MY-PET
can be clearly �separated into the same case ignore string list["my", "pet"]
, so they are treated as the same variable with different styles. -
Valid character sets for variables:
-
For variables' name:
a-zA-Z0-9
-
For variable's value:
-
If
style.noTransformation
istrue
:a-zA-Z0-9
-
Else: any characters
-
-
-
If
style.noTransformation
istrue
, The placeholders in template content will be replaced with the raw user input value. -
If
style.keepUpperCase
istrue
, uppercase words in user input will not be transformed to other cases,they will stay uppercase when joined with other words.Example
words transform to keepUpperCase is false keepUpperCase is true "XML HTTP request" pascalCase XmlHttpRequest
XMLHTTPRequest
"new customer ID" camelCase newCustomerId
newCustomerID
-
Common transformation process of identifier styles
-
Any of the input variable values
lovelyCat, LovelyCat, LovelyCat, lovely_cat, Lovely_Cat, lovely-cat, Lovely-Cat, lovely cat, Lovely Cat
yields the same result in generated content. -
If variable configuration is a string or it's
style.case
field isauto
, the actualcase
will be parsed from the corresponding placeholder.Example:
Template content:
other content___MyPet___Other content other content ___myPet___ Other content other content ___my_pet___ Other content other content ___My_Pet___ Other content other content ___MY_PET___ Other content other content ___my-pet___ Other content other content ___My-Pet___ Other content other content ___MY-PET___ Other content
Template configuration:
{ "name": "Template Example", "variables": [ { "name": "myPet", "style": { "case": "auto" } } ] }
or
{ "name": "Template Example", "variables": ["myPet"] }
Possible user inputs for the variable
myPet
:lovelyCat LovelyCat lovely_cat Lovely_cat LOVELY_CAT lovely-cat Lovely-Cat LOVELY-CAT lovely cat Lovely Cat LOVELY CAT
Generated content:
other contentLovelyCatOther content other content lovelyCat Other content other content lovely_cat Other content other content Lovely_Cat Other content other content LOVELY_CAT Other content other content lovely-cat Other content other content Lovely-Cat Other content other content LOVELY-CAT Other content
-
After case transformation,
style.prefix
andstyle.suffix
will be added to the variable value.Example:
Template content:
other content ___myPet___ other content
Template config file:
{ "name": "Template Example", "variables": [ { "name": "myPet", "case": "pascalCase", "prefix": "__", "suffix": "$$", } ] }
User input for the variable
myPet
:lovely cat
Generated content:
other content __LovelyCat$$ other content
-
-
codeTemplateTool.templatesPath
Default:
~/.vscode/templates
Should be an local absolute path.
Variables:
-
{home}
: User home directory. -
{workspace}
: Your workspace directory. That is the directory currently open in your vscode instance. If no directory is open currently,{workspace}
will be resolved as user home directory.
You can also use
~/
to reference user home directory.Example:
Your home dir: /users/superman Your current workspace: /users/superman/path/to/project {home}/.vscode/templates -> /users/superman/.vscode/templates {workspace}/templates -> /users/superman/path/to/project/templates ~/.vscode/templates -> /users/superman/.vscode/templates
-
-
codeTemplateTool.configFile
Default:
template.config.json
-
codeTemplateTool.encoding
Default:
utf8
-
codeTemplateTool.ignore
Default:
[".DS_Store"]
An array of glob patterns. Files and folders that match one of the specified patterns will be ignored.
-
codeTemplateTool.variable.noTransformation
Default:
false
Control variable transformation globally. If set to true, raw user input will be used to replace the placeholders in template content. Can be overwritten by the
style.noTransformation
filed in variable configuration. -
codeTemplateTool.variable.keepUpperCase
Default:
false
If set to
true
, uppercase words in user input variable value will not be transformed to other cases. Can be overwritten by thestyle.keepUpperCase
field in variable configuration. -
codeTemplateTool.variable.leftBoundary
Default:
___
-
codeTemplateTool.variable.rightBoundary
Default:
___
-
codeTemplateTool.userInput.confirmOnEnter
Default:
false
If set to
true
, you can pressEnter
key to confirm creation. -
codeTemplateTool.userInput.cancelOnEscape
Default:
false
If set to
true
, you can pressESC
key to cancel creation.
MIT