This Engineering Notebook post discusses how to support Leonine syntax coloring in vs-code. This post will focus only on the biggest picture. Details must wait until various experiments are complete.
Present status
At present, leoInteg defines Leo-specific syntax in syntaxes/leoBody.tmLanguage.json. This is a start, but it doesn't color non-Leonine syntax.
What must be done
1. Make Leonine syntax available in every node, regardless of what @language directive is in effect, while retaining the normal syntax coloring that should be done for each language.
2. Handle multiple @language directives in a single body text.
Two strategies
There seem to be two possible ways forward:
Strategy 1: Use vs-code's syntax-coloring services, enhanced with Leonine features.
Strategy 2: Use Leo's existing syntax-coloring code, and communicate the results back to vs-code.
Happily, leoInteg can probably combine the best features of both strategies!
The Language Server Protocol
Using an LSP is more complicated than implementing a vscode.language hook, but LSP has important advantages:
1. The Language Server can be written in any language.
2. The Language Server can be reused to provide smart editing [or coloring] features for multiple editors.
Bingo! We can repackage (parts of?) Leo's existing syntax coloring code as a language server!
The details are fuzzy. It might be possible to use "leo" as the language, and have the server handle all aspects of coloring. Or it might be more convenient to have the server modify only Leonine constructs such as Leo directives and section references.
Summary
We want to support multiple @language directives in body panes, as well as all Leonine syntax. Aside from that, we want to default to vs-code's
syntax coloring. That is, we want to "interweave" Leonine coloring with vs-code's standard coloring.
We don't want to write a new json colorizer description for each
language that vs-code supports. Nor do we want to create a bespoke vscode.language hook for every language that vs-code supports. Instead, leoInteg's colorizing code will likely use an LSP. The LSP can be written in python, which means a repackaging of Leo's existing colorizing code may be possible.
Significant new invention will be required. However, the LSP was designed for just such task. I am fairly confident that leoInteg will be able to do Leonine syntax coloring quickly enough.
Edward