Two methods to support a new language. (Normal user see here)
Suggest: Change the user settings: Un-check msr.quiet
(and check msr.debug
if need) when you're debugging this extension.
For developer/contributors: package.json
Take finding definition for batch files (*.bat
and *.cmd
) as an example.
If you only want to support finding definition for *.bat
files other than all batch
script (*.bat
+ *.cmd
):
Add lower case extension name
: "msr.{extension}.definition" (here {extension}
= bat ) into the file.
"msr.bat.definition": {
"description": "Batch file extension of *.bat file only (Not support *.cmd file).",
"default": "^\\s*:\\s*(%1)\\b|(^|\\s)set\\s+(/a\\s+)?\\\"?(%1)="
}
- Add lower case
language name
(as you want): "msr.fileExtensionMap.{Name}
" (here{Name}
= batch ) into the file:
"msr.fileExtensionMap.batch": {
"description": "Batch file extensions (*.bat + *.cmd files)",
"default": "bat cmd"
}
- Add Regex match pattern to find definition (lower case name
msr.batch.definition
):
"msr.batch.definition": {
"description": "Regex pattern to search batch file definitions of a function or variable.",
"default": "^\\s*:\\s*(%1)\\b|(^|\\s)set\\s+(/a\\s+)?\\\"?(%1)="
}
- Batch script's function definition match pattern (Functions are often written at the head of a line):
^\s*:MyFunction
to match functions like:{MyFunction}
at head of lines.
- Batch script's variable definition match pattern:
- String variable:
set Folder=
to match variables likeset Folder=D:\TEMP
- Quoted strings:
set \"PATH=
to match variables likeset "PATH=Value"
- Numeric variable:
set /a Count=
to match variables likeset /a Count=3
- String variable:
- So the merged Regex pattern is:
^\s*:\w+|set \w+=|set \"\w+=|set /a \w+=
- We need to capture/replace the name of
functions
orvariables
under mouse/cursor, use%1
as aplace holder
:^\s*:%1|set %1=|set \"%1=|set /a %1=
- More robust Regex to be:
^\s*:\s*(%1)\b|(^|\s)set\s+(/a\\s+)?\\"?(%1)=
- Finally, escape the slash
\
to\\
for JSON file content:"^\\s*:\\s*(%1)\\b|(^|\\s)set\\s+(/a\\s+)?\\\"?(%1)="
For example, if you want to overwrite default.skip.definition
for batch files, add "msr.{name}.skip.definition" into the file:
"msr.batch.skip.definition": {
"default": ""
}
- Specific type of definition searching Regex like:
- C# class:
msr.cs.class.definition
- C# method:
msr.cs.method.definition
- C# enumerate:
msr.cs.enum.definition
- Python class:
msr.py.class.definition
- C# class:
- Skip definition Regex (exclude some search results from search patterns like
msr.py.class.definition
):- Java:
msr.java.skip.definition
forJava
+Scala
(seemsr.fileExtensionMap.java
) - C#:
msr.cs.skip.definition
forC#
(*.cs
+*.cshtml
) (seemsr.fileExtensionMap.cs
) - UI:
msr.ui.skip.definition
forJavaScript
+TypeScript
+Vue
(seemsr.fileExtensionMap.ui
)
- Java:
- Specific type of checking Regex before searching (to determine which Regex patterns to use:
class
,method
andenum
etc.):- Python class check:
msr.py.isFindClass
- Python member check:
ms.py.isFindMember
(for a classmembers
, likeproperty
/field
in C#)
- Python class check:
Explicit/Specific settings will overwrite general settings in the file.
For bat
/batch
file example as above: bat
= *.bat file
, batch
= *.bat + *.cmd files
, so the override results as following:
msr.bat.definition
overridesmsr.batch.definition
overridesmsr.default.definition
msr.bat.skip.definition
overridesmsr.batch.skip.definition
overridesmsr.default.skip.definition
Take skipFolders
of finding definition
as an example, priority order as below: ({subKey}
= definition
, {tailKey}
= skipFolders
)
msr.{rootFolderName}.{extension}.{subKey}.{tailKey}
likemsr.MyRepoName.bat.definition.skipFolders
msr.{rootFolderName}.{mappedExt}.{subKey}.{tailKey}
likemsr.MyRepoName.batch.definition.skipFolders
msr.{rootFolderName}.{extension}.{tailKey}
likemsr.MyRepoName.bat.skipFolders
msr.{rootFolderName}.{mappedExt}.{tailKey}
likemsr.MyRepoName.batch.skipFolders
msr.{rootFolderName}.{tailKey}
likemsr.MyRepoName.skipFolders
msr.{extension}.{subKey}.{tailKey}
likemsr.bat.definition.skipFolders
msr.{mappedExt}.{subKey}.{tailKey}
likemsr.batch.definition.skipFolders
msr.{extension}.{tailKey}
likemsr.bat.skipFolders
msr.{mappedExt}.{tailKey}
likemsr.batch.skipFolders
msr.default.{subKey}.{tailKey}
likemsr.default.definition.skipFolders
msr.default.{tailKey}
likemsr.default.skipFolders
Note:
- The
{rootFolderName}
is the localsave folder name
of agit repository
, it's better to no white spaces. mappedExt
is a general name for a language likecpp
orjava
, you can name it to anything as you want:msr.fileExtensionMap.{mappedExt}
.extension
is one file extension ofmappedExt
likecpp
/h
/hpp
.- Some config value maybe no
{subKey}
, follow the same priority order above, just ignore/remove{subKey}
.