diff --git a/src/highlighters.cc b/src/highlighters.cc index 912c41fe..6309b0b7 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -1082,11 +1082,12 @@ private: struct LineNumbersHighlighter : Highlighter { - LineNumbersHighlighter(bool relative, bool hl_cursor_line, String separator, int min_digits) + LineNumbersHighlighter(bool relative, bool hl_cursor_line, String separator, Optional separator_cursor, int min_digits) : Highlighter{HighlightPass::Move}, m_relative{relative}, m_hl_cursor_line{hl_cursor_line}, m_separator{std::move(separator)}, + m_separator_cursor{std::move(separator_cursor)}, m_min_digits{min_digits} {} static std::unique_ptr create(HighlighterParameters params, Highlighter*) @@ -1094,6 +1095,7 @@ struct LineNumbersHighlighter : Highlighter static const ParameterDesc param_desc{ { { "relative", { false, "" } }, { "separator", { true, "" } }, + { "separator-cursor", { true, "" } }, { "min-digits", { true, "" } }, { "hlcursor", { false, "" } } }, ParameterDesc::Flags::None, 0, 0 @@ -1104,13 +1106,23 @@ struct LineNumbersHighlighter : Highlighter if (separator.length() > 10) throw runtime_error("separator length is limited to 10 bytes"); + Optional separator_cursor = parser.get_switch("separator-cursor"); + if (separator_cursor.value_or(separator).length() != separator.length()) { + // Throw runtime error instead? + write_to_debug_buffer("line-numbers: Separator for active line should have the same length as seperator"); + separator_cursor.reset(); + } + + // Effectively separator_cursor?.str(), except idk how to code in C++ + Optional separator_cursor_str = separator_cursor ? separator_cursor->str() : Optional{}; + int min_digits = parser.get_switch("min-digits").map(str_to_int).value_or(2); if (min_digits < 0) throw runtime_error("min digits must be positive"); if (min_digits > 10) throw runtime_error("min digits is limited to 10"); - return std::make_unique((bool)parser.get_switch("relative"), (bool)parser.get_switch("hlcursor"), separator.str(), min_digits); + return std::make_unique((bool)parser.get_switch("relative"), (bool)parser.get_switch("hlcursor"), separator.str(), separator_cursor_str, min_digits); } private: @@ -1142,7 +1154,10 @@ private: const auto atom_face = last_line == current_line ? face_wrapped : ((m_hl_cursor_line and is_cursor_line) ? face_absolute : face); line.insert(line.begin(), {buffer, atom_face}); - line.insert(line.begin() + 1, {m_separator, face}); + + const auto separator = is_cursor_line && m_separator_cursor ? *m_separator_cursor + : m_separator; + line.insert(line.begin() + 1, {separator, face}); last_line = current_line; } @@ -1174,6 +1189,7 @@ private: const bool m_relative; const bool m_hl_cursor_line; const String m_separator; + const Optional m_separator_cursor; const int m_min_digits; }; @@ -2272,7 +2288,7 @@ void register_highlighters() "number-lines", { LineNumbersHighlighter::create, "Display line numbers \n" - "Parameters: -relative, -hlcursor, -separator , -min-digits \n" } }); + "Parameters: -relative, -hlcursor, -separator , -separator-cursor , -min-digits \n" } }); registry.insert({ "show-matching", { create_matching_char_highlighter,