doc/assets.md
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) using
git 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 .tmLanguage file, open the file in
Sublime Text and convert it to a .sublime-syntax file via Tools -> Developer ->
New Syntax from XXX.tmLanguage.... Save the new file in the assets/syntaxes folder.
If only .tmLanguage.json or .tmLanguage.yml file is available, use
PackageDev to convert it to .tmLanguage.plist
format and then rename the converted file to .tmLanguage file.
Run the assets/create.sh script. It calls bat cache --build to parse all available
.sublime-syntax files and serialize them to a syntaxes.bin file.
Re-compile bat. At compilation time, the syntaxes.bin file will be stored inside the
bat binary.
Use bat --list-languages to check if the new languages are available. You may want to do something like export 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.bin
file. A new binary cache file will be created once before every new release of bat. This
avoids bloating the repository size unnecessarily.
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):
bat and that bat is available on
the path. If you are creating a syntax test for a new builtin syntax (see above), make sure that
your version of bat already has the new syntax builtin.tests/syntax-tests/source/Ruby (adapt for your language). The file name could
be test.rb (adapt extension) but can also be adapted if that is necessary in order for bat to
highlight it correctly (e.g. Makefile).bats license. If it
requires attribution, please add a LICENSE.md in 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]
tests/syntax-tests and run the update.sh Bash script. A new file should be generated
in the highlighted folder (e.g. highlighted/Ruby/test.rb).cat or bat --language=txt to display the content of this file and make sure that the
syntax highlighting looks correct.git add the new files in the source folder as well as the autogenerated files in the
highlighted folder.Make sure that the local cache does not interfere with the internally stored syntaxes and
themes (bat cache --clear).
The following files have been manually modified after converting from a .tmLanguage file:
Apache.sublime_syntax=> removed conf and CONF file types.Dart.sublime-syntax => removed #regex.dart include.DotENV.sublime-syntax => added .env.template, env and env.* file types (upstream PR).INI.sublime-syntax => added .coveragerc, .pylintrc, .gitlint, .hgrc, hgrc, and desktop file types and support for comments after section headers.Org mode.sublime-syntax => removed task file type.Robot.sublime_syntax => changed name to "Robot Framework", added .resource extension.SML.sublime_syntax => removed ml file type.wgsl.sublime-syntax => added wgsl file extension.Assembly (x86_64) has been manually added from https://github.com/13xforever/x86-assembly-textmate-bundle due to git clone recursion problemsNim.sublime-syntax has 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-syntax has 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_syntax has 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_syntax has 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-syntax has been added manually from https://github.com/leanprover/vscode-lean4/blob/master/vscode-lean4/syntaxes/lean4.json via conversion.