codemirror-lang-lilypond
v0.0.2
Published
LilyPond language support for CodeMirror 6
Downloads
253
Maintainers
Readme
codemirror-lang-lilypond
LilyPond language support for CodeMirror 6, backed by a Lezer parser.
This first version parses the parts an editor needs while text is being written:
- line and block comments
- strings, commands, identifiers, and assignments
- notes, octave marks, rests, durations, and multipliers
- note chords, sequential music, and simultaneous music
- common music operators
- nested Scheme lists and LilyPond blocks inside Scheme
- built-in command completion from the pinned LilyPond 2.27.2 source
The parser stays open to user-defined commands. LilyPond resolves command
types, command arguments, markup signatures, and pitch names from its live
Scheme state, so a static editor parser cannot settle all of those cases.
The parser marks LilyPond's default Dutch note names as pitches. Note names
from another \language still parse as identifiers.
Install
npm install codemirror codemirror-lang-lilypondUse
import {EditorView, basicSetup} from "codemirror"
import {lilypond} from "codemirror-lang-lilypond"
new EditorView({
doc: "\\relative c' { c4 d e f }",
extensions: [basicSetup, lilypond()],
parent: document.querySelector("#editor"),
})basicSetup includes CodeMirror's completion UI. Typing a LilyPond command
prefix such as \rel now offers \relative. The package also exports
lilypondCompletionSource, lilypondCompletions, and
lilypondCommandNames for custom editor setups.
Develop
npm install
npm testThe grammar is in src/syntax.grammar. Parser fixtures are in test.
The first grammar was checked against the lexer and parser in LilyPond 2.27.2. It follows the layout of the CodeMirror language package example.
Command completion data comes from LilyPond's
scripts/build/lilypond-words.py at the same pinned revision. To refresh it:
# Run this from the root of the pinned LilyPond source checkout.
mkdir -p /tmp/lilypond-words
python3 scripts/build/lilypond-words.py \
--words \
--dir=/tmp/lilypond-words
# Then run this from codemirror-lang-lilypond.
npm run generate:completions -- /tmp/lilypond-words/lilypond-wordsThis first completion pass covers built-in backslash commands. Context names, engravers, properties, and language-specific pitches need syntax-aware completion and will follow separately.
License
GPL-3.0-or-later
