6.7 KiB
Adding new builtin languages for syntax highlighting
Should you find that a particular syntax is not available within bat and think it should be included in bat by default, you can follow the instructions outlined below.
bat uses the excellent syntect library to highlight source
code. As a basis, syntect uses Sublime Text syntax definitions
in the .sublime-syntax format.
Important: Before proceeding, verify that the syntax you wish to add meets the criteria for inclusion.
-
Find a Sublime Text syntax for the given language, preferably in a separate Git repository which can be included as a submodule (under
assets/syntaxes) usinggit submodule add <https github link> ./assets/syntaxes/02_Extra/<repo name>, replacing the contents of the angle brackets as appropriate. -
If the Sublime Text syntax is only available as a
.tmLanguagefile, open the file in Sublime Text and convert it to a.sublime-syntaxfile via Tools -> Developer -> New Syntax from XXX.tmLanguage.... Save the new file in theassets/syntaxesfolder. If only.tmLanguage.jsonor.tmLanguage.ymlfile is available, use PackageDev to convert it to.tmLanguage.plistformat and then rename the converted file to.tmLanguagefile. -
Run the
assets/create.shscript. It callsbat cache --buildto parse all available.sublime-syntaxfiles and serialize them to asyntaxes.binfile. -
Re-compile
bat. At compilation time, thesyntaxes.binfile will be stored inside thebatbinary. -
Use
bat --list-languagesto check if the new languages are available. You may want to do something likeexport PATH="`pwd`/target/debug:$PATH"to ensure the locally compiled version is the one being used. -
Add a syntax test for the new language. See below for details.
-
If you send a pull request with your changes, please do not include the changed
syntaxes.binfile. A new binary cache file will be created once before every new release ofbat. This avoids bloating the repository size unnecessarily.
Syntax tests
bat has a set of syntax highlighting regression tests in tests/syntax-tests. The main idea is
make sure that we do not run into issues we had in the past where either (1) syntax highlighting
for some language is suddenly not working anymore or (2) bat suddenly crashes for some input (due
to regex incompatibilities between syntect and Sublime Text).
In order to add a new test file, please follow these steps (let's take "Ruby" as an example):
- Make sure that you are running the latest version of
batand thatbatis available on the path. If you are creating a syntax test for a new builtin syntax (see above), make sure that your version ofbatalready has the new syntax builtin. - Find an example Ruby source file or write one yourself. If possible, the file should aim to be "comprehensive" (i.e. include a lot of the possible syntax), but this is not strictly necessary. A simple file is better than none at all. Also, the files shouldn't be gigantic.
- Save the file in
tests/syntax-tests/source/Ruby(adapt for your language). The file name could betest.rb(adapt extension) but can also be adapted if that is necessary in order forbatto highlight it correctly (e.g.Makefile). - If you have copied the file from somewhere else, please make sure that the file may be copied
under the respective license and that the license is compatible with
bats license. If it requires attribution, please add aLICENSE.mdin the same folder with a text like this:The `test.rb` file has been added from [enter source here] under the following license: [add license text here] - Go to
tests/syntax-testsand run theupdate.shBash script. A new file should be generated in thehighlightedfolder (e.g.highlighted/Ruby/test.rb). - Use
catorbat --language=txtto display the content of this file and make sure that the syntax highlighting looks correct. git addthe new files in thesourcefolder as well as the autogenerated files in thehighlightedfolder.
Troubleshooting
Make sure that the local cache does not interfere with the internally stored syntaxes and
themes (bat cache --clear).
Criteria for inclusion of new syntaxes
- More than 10,000 downloads at Package Control
Manual modifications
The following files have been manually modified after converting from a .tmLanguage file:
Apache.sublime_syntax=> removedconfandCONFfile types.Dart.sublime-syntax=> removed#regex.dartinclude.DotENV.sublime-syntax=> added.env.template,envandenv.*file types (upstream PR).INI.sublime-syntax=> added.coveragerc,.pylintrc,.gitlint,.hgrc,hgrc, anddesktopfile types and support for comments after section headers.Org mode.sublime-syntax=> removedtaskfile type.Robot.sublime_syntax=> changed name to "Robot Framework", added.resourceextension.SML.sublime_syntax=> removedmlfile type.wgsl.sublime-syntax=> addedwgslfile extension.
Non-submodule additions
Assembly (x86_64)has been manually added from https://github.com/13xforever/x86-assembly-textmate-bundle due togit clonerecursion problemsNim.sublime-syntaxhas been added manually from https://github.com/getzola/zola/blob/master/sublime_syntaxes/Nim.sublime-syntax as there was no suitable Git repository for it. The original syntax seems to originate from https://github.com/Varriount/NimLimeRego.sublime-syntaxhas been added manually from https://github.com/open-policy-agent/opa/blob/master/misc/syntax/sublime/rego.sublime-syntax as it is not kept in a standalone repository. The file is generated from https://github.com/open-policy-agent/opa/blob/master/misc/syntax/textmate/Rego.tmLanguageSML.sublime_syntaxhas been added manually from https://github.com/seanjames777/SML-Language-Definitiona as it is not kept in a standalone repository. The file generated is from https://github.com/seanjames777/SML-Language-Definition/blob/master/sml.tmLanguageCabal.sublime_syntaxhas been added manually from https://github.com/SublimeHaskell/SublimeHaskell/ - we don't want to include the whole submodule because it includes other syntaxes ("Haskell improved") as well.Lean.sublime-syntaxhas been added manually from https://github.com/leanprover/vscode-lean4/blob/master/vscode-lean4/syntaxes/lean4.json via conversion.