From 5439403146d027fd3eb0dd2a62e4d1f68e8ddbf2 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Wed, 25 Jun 2025 13:02:59 +1000 Subject: Introduce a Replace HighlightPass that runs before Wrap For WrapHighlighter to be able to take ReplaceRangesHighlighter into account, it needs to run afterwards, moreover, moving TabulationHighlighter to the replace pass means we should be able to remove any tabulation specific handling from WrapHighlighter Also move ShowWhitespaceHighlighter to this pass as it is designed to replace TabulationHighlighter by running before (as builtin highlighters run after non builtin ones for each passes) --- src/highlighter.hh | 9 +++++---- src/highlighters.cc | 6 +++--- src/window.cc | 8 ++++---- 3 files changed, 12 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/highlighter.hh b/src/highlighter.hh index 8a60c0c1..fbeef9e4 100644 --- a/src/highlighter.hh +++ b/src/highlighter.hh @@ -22,11 +22,12 @@ using BufferRange = Range; enum class HighlightPass { - Wrap = 1 << 0, - Move = 1 << 1, - Colorize = 1 << 2, + Replace = 1 << 0, + Wrap = 1 << 1, + Move = 1 << 2, + Colorize = 1 << 3, - All = Wrap | Move | Colorize, + All = Replace | Wrap | Move | Colorize, }; constexpr bool with_bit_ops(Meta::Type) { return true; } diff --git a/src/highlighters.cc b/src/highlighters.cc index 2044ccd5..fe92452c 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -790,7 +790,7 @@ constexpr StringView WrapHighlighter::ms_id; struct TabulationHighlighter : Highlighter { - TabulationHighlighter() : Highlighter{HighlightPass::Move} {} + TabulationHighlighter() : Highlighter{HighlightPass::Replace} {} void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange) override { @@ -881,7 +881,7 @@ const HighlighterDesc show_whitespace_desc = { struct ShowWhitespacesHighlighter : Highlighter { ShowWhitespacesHighlighter(String tab, String tabpad, String spc, String lf, String nbsp, String indent, bool only_trailing) - : Highlighter{HighlightPass::Move}, m_tab{std::move(tab)}, m_tabpad{std::move(tabpad)}, + : Highlighter{HighlightPass::Replace}, m_tab{std::move(tab)}, m_tabpad{std::move(tabpad)}, m_spc{std::move(spc)}, m_lf{std::move(lf)}, m_nbsp{std::move(nbsp)}, m_indent{std::move(indent)}, m_only_trailing{std::move(only_trailing)} {} @@ -1554,7 +1554,7 @@ const HighlighterDesc replace_ranges_desc = { "each spec is interpreted as a display line to display in place of the range", {} }; -struct ReplaceRangesHighlighter : OptionBasedHighlighter +struct ReplaceRangesHighlighter : OptionBasedHighlighter { using ReplaceRangesHighlighter::OptionBasedHighlighter::OptionBasedHighlighter; private: diff --git a/src/window.cc b/src/window.cc index 2b8d4be9..c65bebe8 100644 --- a/src/window.cc +++ b/src/window.cc @@ -144,8 +144,8 @@ const DisplayBuffer& Window::update_display_buffer(const Context& context) m_display_buffer.compute_range(); const BufferRange range{{0,0}, buffer().end_coord()}; - m_builtin_highlighters.highlight({context, setup, HighlightPass::Wrap, {}}, m_display_buffer, range); - m_builtin_highlighters.highlight({context, setup, HighlightPass::Move, {}}, m_display_buffer, range); + for (auto pass : {HighlightPass::Replace, HighlightPass::Wrap, HighlightPass::Move}) + m_builtin_highlighters.highlight({context, setup, pass, {}}, m_display_buffer, range); if (context.ensure_cursor_visible) { @@ -233,8 +233,8 @@ DisplaySetup Window::compute_display_setup(const Context& context) const win_pos.line = std::min(win_pos.line, buffer().line_count()-1); DisplaySetup setup{win_pos.line, m_dimensions.line, win_pos.column, 0_col, offset}; - m_builtin_highlighters.compute_display_setup({context, setup, HighlightPass::Move, {}}, setup); - m_builtin_highlighters.compute_display_setup({context, setup, HighlightPass::Wrap, {}}, setup); + for (auto pass : {HighlightPass::Move, HighlightPass::Wrap, HighlightPass::Replace}) + m_builtin_highlighters.compute_display_setup({context, setup, pass, {}}, setup); check_display_setup(setup, *this); return setup; -- cgit v1.2.3