lineNumbers function

Extension lineNumbers([
  1. LineNumberConfig config = const LineNumberConfig()
])

Create a line number gutter extension.

Implementation

Extension lineNumbers([LineNumberConfig config = const LineNumberConfig()]) {
  return ExtensionList([
    _lineNumberConfig.of(config),
    gutters(),
    activeGutters.compute(
      [_lineNumberConfig],
      (facetState) {
        final state = facetState as EditorState;

        return ResolvedGutterConfig(
          className: 'cm-lineNumbers',
          renderEmptyElements: false,
          markers: (state) {
            final markerSets = state.facet(lineNumberMarkers);
            return markerSets.isEmpty
                ? RangeSet.empty()
                : RangeSet.join(markerSets);
          },
          lineMarker: (state, line, others) {
            // If there's already a NumberMarker (e.g. custom line number), don't add
            if (others.any((m) => m is NumberMarker)) return null;
            final lineNum = state.doc.lineAt(line.from).number;
            // Get style from theme for this state
            final currentTheme = getEditorTheme(state);
            return NumberMarker(
              _formatNumber(state, lineNum),
              style: currentTheme.lineNumberStyle,
            );
          },
          widgetMarker: (state, widget, block) {
            for (final m in state.facet(lineNumberWidgetMarker)) {
              final result = m(state, widget, block);
              if (result != null) return result;
            }
            return null;
          },
          lineMarkerChange: (update) =>
              update.startState.facet(_lineNumberConfig) !=
              update.state.facet(_lineNumberConfig),
          initialSpacer: (state) {
            final currentTheme = getEditorTheme(state);
            return NumberMarker(
              _formatNumber(state, _maxLineNumber(state.doc.lines)),
              style: currentTheme.lineNumberStyle,
            );
          },
          updateSpacer: (spacer, update) {
            final max = _formatNumber(
              update.state,
              _maxLineNumber(update.state.doc.lines),
            );
            final currentTheme = getEditorTheme(update.state);
            return max == (spacer as NumberMarker).number
                ? spacer
                : NumberMarker(max, style: currentTheme.lineNumberStyle);
          },
          eventHandlers: state.facet(_lineNumberConfig).eventHandlers,
          side: GutterSide.before,
        );
      },
    ),
  ]);
}