@codincod/codemirror-lang-nix
v0.1.1
Published
Nix language support for the CodeMirror code editor
Maintainers
Readme
@codincod/codemirror-lang-nix
This package implements Nix language support for the CodeMirror code editor, using the Lezer grammar Replit wrote for @replit/codemirror-lang-nix, with the parse fixes below on top of it.
Written in part for CodinCod, a competitive coding platform, where it colours the editor people solve puzzles in.
This code is released under an MIT license.
Usage
import { EditorView, basicSetup } from "codemirror"
import { nix } from "@codincod/codemirror-lang-nix"
const view = new EditorView({
parent: document.body,
doc: `{ lib, stdenv }:
stdenv.mkDerivation {
pname = "hello";
version = "2.12.1";
meta = with lib; {
license = licenses.gpl3Plus;
};
}`,
extensions: [basicSetup, nix()],
})What changed
Five parse fixes over the published 6.0.1, each with grammar tests:
- the escapes of an indented string.
''$,'''and''\neach ended the string early, which broke every derivation carrying a shell script; - a trailing comma in a formal argument set, which is how nixfmt writes one that spans lines;
true,false,null,builtinsandoras attribute and argument names, which Nix allows and the grammar did not;- an inherit that names nothing, as in
inherit (x);; ++tokenizing as two+, which a rebuild with a current @lezer/generator otherwise reintroduces.
The same five sit on the upstream branch, without the comments, for a pull
request to Replit.
Tests
npm test builds the parser and runs the grammar tests in test/*.txt.
npm run corpus <directory> parses every .nix file under a directory and
reports how many produce no error node. Against nixpkgs 25.05, 31646 files,
that is 99.99%. The two it does not read are a file nixpkgs keeps
deliberately unparseable as a fixture for its own tests, and one path
interpolation.
Known gaps
A path may interpolate, as in ./${name}/default.nix. A path is one token
here, so that one reads as an error.
