lineNumbers function
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,
);
},
),
]);
}