[listview] use ctrl-] to focus on overlays

pull/1161/merge
Tim Stack 10 months ago
parent cdb5760b5d
commit cc445cc78f

@ -340,6 +340,11 @@
"title": "/ui/theme-defs/<theme_name>/styles/cursor-line",
"$ref": "#/definitions/style"
},
"disabled-cursor-line": {
"description": "Styling for the cursor line when it is disabled",
"title": "/ui/theme-defs/<theme_name>/styles/disabled-cursor-line",
"$ref": "#/definitions/style"
},
"adjusted-time": {
"description": "Styling for timestamps that have been adjusted",
"title": "/ui/theme-defs/<theme_name>/styles/adjusted-time",

@ -49,6 +49,7 @@ add_library(
is_utf8.hh
isc.hh
itertools.hh
keycodes.hh
line_range.hh
lnav.console.hh
lnav.console.into.hh

@ -45,6 +45,7 @@ noinst_HEADERS = \
is_utf8.hh \
isc.hh \
itertools.hh \
keycodes.hh \
line_range.hh \
lnav_log.hh \
lnav.console.hh \

@ -0,0 +1,42 @@
/**
* Copyright (c) 2023, Timothy Stack
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of Timothy Stack nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef lnav_keycodes_hh
#define lnav_keycodes_hh
inline constexpr int
KEY_CTRL(char k)
{
return k & 0x1f;
}
#define KEY_ESCAPE 0x1b
#define KEY_DELETE 0x7f
#endif

@ -55,6 +55,7 @@ enum class role_t : int32_t {
VCR_ALT_ROW, /*< Highlight for alternating rows in a list */
VCR_HIDDEN,
VCR_CURSOR_LINE,
VCR_DISABLED_CURSOR_LINE,
VCR_ADJUSTED_TIME,
VCR_SKEWED_TIME,
VCR_OFFSET_TIME,

@ -283,4 +283,10 @@ time_range::duration() const
std::chrono::seconds(diff.tv_sec))
+ std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::microseconds(diff.tv_usec));
}
}
bool
time_range::contains_inclusive(const timeval& tv) const
{
return (this->tr_begin <= tv) && (tv <= this->tr_end);
}

@ -155,7 +155,7 @@ operator<(const struct timeval& left, const struct timeval& right)
inline bool
operator<=(const struct timeval& left, const struct timeval& right)
{
return left.tv_sec <= right.tv_sec
return left.tv_sec < right.tv_sec
|| ((left.tv_sec == right.tv_sec) && (left.tv_usec <= right.tv_usec));
}
@ -240,6 +240,9 @@ struct time_range {
}
time_range& operator|=(const time_range& rhs);
bool contains_inclusive(const timeval& tv) const;
void extend_to(const timeval& tv);
std::chrono::milliseconds duration() const;
};

@ -215,7 +215,7 @@ breadcrumb_curses::handle_key(int ch)
bool retval = false;
switch (ch) {
case KEY_CTRL_A:
case KEY_CTRL('a'):
if (this->bc_selected_crumb) {
this->bc_selected_crumb = 0;
this->bc_current_search.clear();
@ -223,7 +223,7 @@ breadcrumb_curses::handle_key(int ch)
}
retval = true;
break;
case KEY_CTRL_E:
case KEY_CTRL('e'):
if (this->bc_selected_crumb) {
this->bc_selected_crumb = this->bc_focused_crumbs.size() - 1;
this->bc_current_search.clear();
@ -295,7 +295,7 @@ breadcrumb_curses::handle_key(int ch)
listview_curses::shift_amount_t::down_line);
retval = true;
break;
case 0x7f:
case KEY_DELETE:
case KEY_BACKSPACE:
if (!this->bc_current_search.empty()) {
this->bc_current_search.pop_back();

@ -639,15 +639,28 @@ field_overlay_source::list_header_for_overlay(const listview_curses& lv,
retval.append(this->fos_lss.get_filename_offset(), ' ');
if (this->fos_contexts.top().c_show) {
return retval
retval
.appendf(FMT_STRING("\u258C Line {:L} parser details. "
"(Press '"),
"Press "),
(int) vl)
.append("p"_hotkey)
.append("' to toggle this view)");
.append(" to hide this panel.");
} else {
retval.append("\u258C Line ")
.append(
lnav::roles::number(fmt::format(FMT_STRING("{:L}"), (int) vl)))
.append(" metadata");
}
if (lv.get_overlay_selection()) {
retval.append(" Press ")
.append("Esc"_hotkey)
.append(" to exit this panel.");
} else {
retval.append(" Press ")
.append("CTRL-]"_hotkey)
.append(" to focus on this panel");
}
return retval.append("\u258C Line ")
.append(lnav::roles::number(fmt::format(FMT_STRING("{:L}"), (int) vl)))
.append(" metadata");
return retval;
}

@ -75,7 +75,8 @@ filter_sub_source::list_input_handle_key(listview_curses& lv, int ch)
{
if (this->fss_editing) {
switch (ch) {
case KEY_CTRL_RBRACKET:
case KEY_ESCAPE:
case KEY_CTRL(']'):
this->fss_editor->abort();
return true;
default:

@ -318,7 +318,14 @@ nonstd::optional<attr_line_t>
gantt_header_overlay::list_header_for_overlay(const listview_curses& lv,
vis_line_t line)
{
return attr_line_t("\u258C Sub-operations:");
if (lv.get_overlay_selection()) {
return attr_line_t("\u258C Sub-operations: Press ")
.append("Esc"_hotkey)
.append(" to exit this panel");
}
return attr_line_t("\u258C Sub-operations: Press ")
.append("CTRL-]"_hotkey)
.append(" to focus on this panel");
}
gantt_source::gantt_source(textview_curses& log_view,
@ -695,18 +702,48 @@ gantt_source::rebuild_indexes()
nonstd::optional<vis_line_t>
gantt_source::row_for_time(struct timeval time_bucket)
{
auto iter
= std::lower_bound(this->gs_time_order.begin(),
this->gs_time_order.end(),
time_bucket,
[](const opid_row& lhs, const timeval& rhs) {
return lhs.or_value.otr_range.tr_begin < rhs;
});
if (iter == this->gs_time_order.end()) {
return nonstd::nullopt;
auto iter = this->gs_time_order.begin();
while (true) {
if (iter == this->gs_time_order.end()) {
return nonstd::nullopt;
}
if (iter->or_value.otr_range.contains_inclusive(time_bucket)) {
break;
}
++iter;
}
return vis_line_t(std::distance(this->gs_time_order.begin(), iter));
auto closest_iter = iter;
auto closest_diff = time_bucket - iter->or_value.otr_range.tr_begin;
for (; iter != this->gs_time_order.end(); ++iter) {
if (time_bucket < iter->or_value.otr_range.tr_begin) {
break;
}
if (!iter->or_value.otr_range.contains_inclusive(time_bucket)) {
continue;
}
auto diff = time_bucket - iter->or_value.otr_range.tr_begin;
if (diff < closest_diff) {
closest_iter = iter;
closest_diff = diff;
}
for (const auto& sub : iter->or_value.otr_sub_ops) {
if (!sub.ostr_range.contains_inclusive(time_bucket)) {
continue;
}
diff = time_bucket - sub.ostr_range.tr_begin;
if (diff < closest_diff) {
closest_iter = iter;
closest_diff = diff;
}
}
}
return vis_line_t(std::distance(this->gs_time_order.begin(), closest_iter));
}
nonstd::optional<struct timeval>
@ -716,7 +753,17 @@ gantt_source::time_for_row(vis_line_t row)
return nonstd::nullopt;
}
return this->gs_time_order[row].or_value.otr_range.tr_begin;
const auto& otr = this->gs_time_order[row].or_value;
if (this->tss_view->get_selection() == row) {
auto ov_sel = this->tss_view->get_overlay_selection();
if (ov_sel && ov_sel.value() < otr.otr_sub_ops.size()) {
return otr.otr_sub_ops[ov_sel.value()].ostr_range.tr_begin;
}
}
return otr.otr_range.tr_begin;
}
size_t
@ -738,9 +785,16 @@ gantt_source::text_selection_changed(textview_curses& tc)
}
const auto& row = this->gs_time_order[sel];
auto low_vl = this->gs_lss.row_for_time(row.or_value.otr_range.tr_begin);
auto low_tv = row.or_value.otr_range.tr_begin;
auto high_tv = row.or_value.otr_range.tr_end;
auto ov_sel = tc.get_overlay_selection();
if (ov_sel) {
const auto& sub = row.or_value.otr_sub_ops[ov_sel.value()];
low_tv = sub.ostr_range.tr_begin;
high_tv = sub.ostr_range.tr_end;
}
high_tv.tv_sec += 1;
auto low_vl = this->gs_lss.row_for_time(low_tv);
auto high_vl = this->gs_lss.row_for_time(high_tv).value_or(
this->gs_lss.text_line_count());

@ -127,7 +127,7 @@ public:
class gantt_header_overlay : public list_overlay_source {
public:
gantt_header_overlay(std::shared_ptr<gantt_source> src);
explicit gantt_header_overlay(std::shared_ptr<gantt_source> src);
bool list_static_overlay(const listview_curses& lv,
int y,

@ -981,14 +981,14 @@ handle_paging_key(int ch)
}
break;
case KEY_CTRL_W:
case KEY_CTRL('w'):
execute_command(ec,
lnav_data.ld_views[LNV_LOG].get_word_wrap()
? "disable-word-wrap"
: "enable-word-wrap");
break;
case KEY_CTRL_P:
case KEY_CTRL('p'):
lnav_data.ld_preview_hidden = !lnav_data.ld_preview_hidden;
break;

@ -100,7 +100,8 @@ input_dispatcher::new_input(const struct timeval& current_time, int ch)
switch (this->id_escape_matcher(keyseq.data())) {
case escape_match_t::NONE: {
for (int lpc = 0; this->id_escape_buffer[lpc];
lpc++) {
lpc++)
{
handled = this->id_key_handler(
this->id_escape_buffer[lpc]);
}
@ -149,7 +150,7 @@ input_dispatcher::poll(const struct timeval& current_time)
timersub(&current_time, &this->id_escape_start_time, &diff);
if (escape_threshold < diff) {
this->id_key_handler(KEY_CTRL_RBRACKET);
this->id_key_handler(KEY_ESCAPE);
this->id_escape_index = 0;
}
}

@ -36,8 +36,7 @@
#include <sys/types.h>
#define KEY_ESCAPE 0x1b
#define KEY_CTRL_RBRACKET 0x1d
#include "base/keycodes.hh"
class input_dispatcher {
public:
@ -45,10 +44,7 @@ public:
void poll(const struct timeval& current_time);
bool in_escape() const
{
return this->id_escape_index > 0;
}
bool in_escape() const { return this->id_escape_index > 0; }
enum class escape_match_t {
NONE,

@ -98,12 +98,14 @@ listview_curses::reload_data()
if (this->lv_source == nullptr) {
this->lv_top = 0_vl;
this->lv_focused_overlay_top = 0_vl;
this->lv_focused_overlay_selection = 0_vl;
this->lv_left = 0;
} else {
if (this->lv_top >= this->get_inner_height()) {
this->lv_top
= std::max(0_vl, vis_line_t(this->get_inner_height() - 1));
this->lv_focused_overlay_top = 0_vl;
this->lv_focused_overlay_selection = 0_vl;
}
if (this->lv_selectable) {
if (this->get_inner_height() == 0) {
@ -169,10 +171,35 @@ listview_curses::handle_key(int ch)
this->shift_selection(shift_amount_t::up_line);
break;
case 'q':
case KEY_ESCAPE:
if (this->lv_overlay_focused) {
this->lv_overlay_focused = false;
this->set_needs_update();
} else {
retval = false;
}
break;
case KEY_CTRL(']'):
if (this->lv_overlay_source != nullptr && !this->lv_overlay_focused)
{
std::vector<attr_line_t> overlay_content;
this->lv_overlay_source->list_value_for_overlay(
*this, this->get_selection(), overlay_content);
if (!overlay_content.empty()) {
this->lv_overlay_focused = !this->lv_overlay_focused;
this->set_needs_update();
}
} else {
retval = false;
}
break;
case 'b':
case KEY_BACKSPACE:
case KEY_PPAGE:
if (this->lv_focused_overlay_top != 0_vl) {
if (this->lv_overlay_focused) {
this->shift_selection(shift_amount_t::up_page);
break;
}
@ -246,20 +273,23 @@ listview_curses::handle_key(int ch)
} else {
this->set_top(tail_bottom);
}
} break;
break;
}
case ']': {
double tenth = ((double) this->get_inner_height()) / 10.0;
this->shift_top(vis_line_t((int) tenth));
} break;
break;
}
case '[':
case 'B': {
double tenth = ((double) this->get_inner_height()) / 10.0;
this->shift_top(vis_line_t((int) -tenth));
} break;
break;
}
default:
retval = false;
@ -273,11 +303,31 @@ vis_line_t
listview_curses::get_overlay_top(vis_line_t row, size_t count, size_t total)
{
if (row == this->get_selection()) {
return this->lv_focused_overlay_top;
}
if (this->lv_focused_overlay_selection >= total) {
this->lv_focused_overlay_selection = vis_line_t(total) - 1_vl;
}
if (this->lv_focused_overlay_selection < 0_vl) {
this->lv_focused_overlay_selection = 0_vl;
}
auto max_top = vis_line_t(total - count);
if (this->lv_focused_overlay_selection <= this->lv_focused_overlay_top)
{
this->lv_focused_overlay_top = this->lv_focused_overlay_selection;
if (this->lv_focused_overlay_top > 0_vl) {
this->lv_focused_overlay_top -= 1_vl;
}
}
if (this->lv_focused_overlay_selection
> (this->lv_focused_overlay_top + vis_line_t(count) - 2_vl))
{
this->lv_focused_overlay_top
= this->lv_focused_overlay_selection - vis_line_t(count) + 2_vl;
}
if (this->lv_focused_overlay_top > max_top) {
this->lv_focused_overlay_top = max_top;
}
if (this->get_selection() > row && count < total) {
return vis_line_t{static_cast<int>(total - count)};
return this->lv_focused_overlay_top;
}
return 0_vl;
@ -393,6 +443,14 @@ listview_curses::do_update()
}
auto overlay_y = y;
while (ov_height_remaining > 0 && y < bottom) {
if (this->lv_overlay_focused
&& row == this->lv_selection
&& overlay_row
== this->lv_focused_overlay_selection)
{
row_overlay_content[overlay_row].with_attr_for_all(
VC_ROLE.value(role_t::VCR_CURSOR_LINE));
}
mvwattrline(this->lv_window,
y,
this->lv_x,
@ -551,93 +609,56 @@ listview_curses::shift_selection(shift_amount_t sa)
unsigned long width;
this->get_dimensions(height, width);
if (this->lv_focused_overlay_top > 0
&& (sa == shift_amount_t::up_line || sa == shift_amount_t::up_page))
{
if (this->lv_overlay_focused) {
vis_line_t focused = this->get_selection();
std::vector<attr_line_t> overlay_content;
this->lv_overlay_source->list_value_for_overlay(
*this, focused, overlay_content);
auto overlay_height
= this->get_overlay_height(overlay_content.size(), height);
auto ov_top_for_last = vis_line_t{
static_cast<int>(overlay_content.size() - overlay_height)};
switch (sa) {
case shift_amount_t::up_line:
this->lv_focused_overlay_top -= 1_vl;
if (this->lv_focused_overlay_selection > 0_vl) {
this->lv_focused_overlay_selection -= 1_vl;
}
break;
case shift_amount_t::up_page: {
std::vector<attr_line_t> overlay_content;
this->lv_overlay_source->list_value_for_overlay(
*this, this->get_selection(), overlay_content);
auto overlay_height
= this->get_overlay_height(overlay_content.size(), height);
if (this->lv_focused_overlay_top > overlay_height) {
this->lv_focused_overlay_top
if (this->lv_focused_overlay_selection > overlay_height) {
this->lv_focused_overlay_selection
-= vis_line_t{static_cast<int>(overlay_height - 1)};
} else {
this->lv_focused_overlay_top = 0_vl;
this->lv_focused_overlay_selection = 0_vl;
}
break;
}
default:
case shift_amount_t::down_line:
if (this->lv_focused_overlay_selection + 1
< overlay_content.size())
{
this->lv_focused_overlay_selection += 1_vl;
}
break;
}
this->set_needs_update();
return;
}
if (this->get_selection() > 0 && this->lv_overlay_source != nullptr) {
vis_line_t focused = this->get_selection();
std::vector<attr_line_t> overlay_content;
bool is_up = false;
switch (sa) {
case shift_amount_t::up_line:
case shift_amount_t::up_page:
focused -= 1_vl;
is_up = true;
case shift_amount_t::down_page: {
if (this->lv_focused_overlay_selection + overlay_height - 1
>= ov_top_for_last)
{
this->lv_focused_overlay_selection
= vis_line_t(overlay_content.size() - 1);
} else {
this->lv_focused_overlay_selection
+= vis_line_t{static_cast<int>(overlay_height - 1)};
}
break;
}
default:
break;
}
this->lv_overlay_source->list_value_for_overlay(
*this, focused, overlay_content);
if (!overlay_content.empty()) {
auto overlay_height
= this->get_overlay_height(overlay_content.size(), height);
auto ov_top_for_last = vis_line_t{
static_cast<int>(overlay_content.size() - overlay_height)};
if (is_up) {
this->set_selection(focused);
this->lv_focused_overlay_top = ov_top_for_last;
this->set_needs_update();
return;
}
if (this->lv_focused_overlay_top + 1 + overlay_height
<= overlay_content.size())
{
switch (sa) {
case shift_amount_t::down_line:
this->lv_focused_overlay_top += 1_vl;
break;
case shift_amount_t::down_page: {
if (this->lv_focused_overlay_top + overlay_height - 1
>= ov_top_for_last)
{
this->lv_focused_overlay_top = ov_top_for_last;
} else {
this->lv_focused_overlay_top += vis_line_t{
static_cast<int>(overlay_height - 1)};
}
break;
}
default:
break;
}
this->set_needs_update();
return;
}
if (overlay_height < overlay_content.size()) {
sa = shift_amount_t::down_line;
}
}
this->lv_focused_overlay_top = 0_vl;
this->lv_source->listview_selection_changed(*this);
this->set_needs_update();
return;
}
auto offset = 0_vl;
@ -806,6 +827,7 @@ listview_curses::set_top(vis_line_t top, bool suppress_flash)
auto old_top = this->lv_top;
this->lv_top = top;
this->lv_focused_overlay_top = 0_vl;
this->lv_focused_overlay_selection = 0_vl;
if (this->lv_selectable) {
if (this->lv_selection < 0_vl) {
} else if (this->lv_selection < top) {
@ -894,7 +916,9 @@ listview_curses::set_selection(vis_line_t sel)
}
if (sel == -1_vl) {
this->lv_selection = sel;
this->lv_overlay_focused = false;
this->lv_focused_overlay_top = 0_vl;
this->lv_focused_overlay_selection = 0_vl;
this->lv_source->listview_selection_changed(*this);
this->set_needs_update();
this->invoke_scroll();
@ -930,7 +954,9 @@ listview_curses::set_selection(vis_line_t sel)
if (this->lv_sync_selection_and_top) {
this->lv_top = sel;
}
this->lv_overlay_focused = false;
this->lv_focused_overlay_top = 0_vl;
this->lv_focused_overlay_selection = 0_vl;
this->lv_source->listview_selection_changed(*this);
this->set_needs_update();
this->invoke_scroll();

@ -238,6 +238,15 @@ public:
return this->lv_top;
}
nonstd::optional<vis_line_t> get_overlay_selection() const
{
if (this->lv_overlay_focused) {
return this->lv_focused_overlay_selection;
}
return nonstd::nullopt;
}
void set_sync_selection_and_top(bool value)
{
this->lv_sync_selection_and_top = value;
@ -561,7 +570,9 @@ protected:
vis_line_t lv_top{0}; /*< The line at the top of the view. */
unsigned int lv_left{0}; /*< The column at the left of the view. */
vis_line_t lv_height{0}; /*< The abs/rel height of the view. */
vis_line_t lv_focused_overlay_top{0};
bool lv_overlay_focused{false};
vis_line_t lv_focused_overlay_top{0_vl};
vis_line_t lv_focused_overlay_selection{0_vl};
int lv_history_position{0};
bool lv_overlay_needs_update{true};
bool lv_show_scrollbar{true}; /*< Draw the scrollbar in the view. */

@ -469,11 +469,12 @@ handle_rl_key(int ch)
switch (ch) {
case KEY_PPAGE:
case KEY_NPAGE:
case KEY_CTRL_P:
case KEY_CTRL('p'):
handle_paging_key(ch);
break;
case KEY_CTRL_RBRACKET:
case KEY_ESCAPE:
case KEY_CTRL(']'):
lnav_data.ld_rl_view->abort();
break;
@ -932,7 +933,8 @@ handle_key(int ch)
case ln_mode_t::BUSY:
switch (ch) {
case KEY_CTRL_RBRACKET:
case KEY_ESCAPE:
case KEY_CTRL(']'):
log_vtab_data.lvd_looping = false;
break;
}
@ -1360,6 +1362,8 @@ looper()
lnav_data.ld_views[lpc].set_scroll_action(sb);
lnav_data.ld_views[lpc].set_search_action(update_hits);
lnav_data.ld_views[lpc].tc_cursor_role = role_t::VCR_CURSOR_LINE;
lnav_data.ld_views[lpc].tc_disabled_cursor_role
= role_t::VCR_DISABLED_CURSOR_LINE;
lnav_data.ld_views[lpc].tc_state_event_handler = event_handler;
}

@ -639,6 +639,10 @@ static const struct json_path_container theme_styles_handlers = {
.with_description("Styling for the cursor line in the main view")
.for_child(&lnav_theme::lt_style_cursor_line)
.with_children(style_config_handlers),
yajlpp::property_handler("disabled-cursor-line")
.with_description("Styling for the cursor line when it is disabled")
.for_child(&lnav_theme::lt_style_disabled_cursor_line)
.with_children(style_config_handlers),
yajlpp::property_handler("adjusted-time")
.with_description("Styling for timestamps that have been adjusted")
.for_child(&lnav_theme::lt_style_adjusted_time)

@ -102,7 +102,7 @@ spectrogram_source::list_input_handle_key(listview_curses& lv, int ch)
return true;
}
case KEY_CTRL_A: {
case KEY_CTRL('a'): {
if (this->ss_value_source != nullptr) {
this->ss_cursor_column = 0;
this->text_selection_changed((textview_curses&) lv);
@ -111,7 +111,7 @@ spectrogram_source::list_input_handle_key(listview_curses& lv, int ch)
return true;
}
case KEY_CTRL_E: {
case KEY_CTRL('e'): {
if (this->ss_value_source != nullptr) {
this->ss_cursor_column = INT_MAX;
this->text_selection_changed((textview_curses&) lv);

@ -175,6 +175,7 @@ struct lnav_theme {
positioned_property<style_config> lt_style_scrollbar;
positioned_property<style_config> lt_style_hidden;
positioned_property<style_config> lt_style_cursor_line;
positioned_property<style_config> lt_style_disabled_cursor_line;
positioned_property<style_config> lt_style_adjusted_time;
positioned_property<style_config> lt_style_skewed_time;
positioned_property<style_config> lt_style_offset_time;

@ -505,10 +505,14 @@ textview_curses::textview_value_for_row(vis_line_t row, attr_line_t& value_out)
}
if (this->is_selectable() && row == this->get_selection()
&& this->tc_cursor_role)
&& this->tc_cursor_role && this->tc_disabled_cursor_role)
{
auto role = this->get_overlay_selection()
? this->tc_disabled_cursor_role.value()
: this->tc_cursor_role.value();
sa.emplace_back(line_range{orig_line.lr_start, -1},
VC_ROLE.value(this->tc_cursor_role.value()));
VC_ROLE.value(role));
}
for (auto& tc_highlight : this->tc_highlights) {

@ -781,6 +781,7 @@ public:
std::function<void(textview_curses&)> tc_state_event_handler;
nonstd::optional<role_t> tc_cursor_role;
nonstd::optional<role_t> tc_disabled_cursor_role;
protected:
class grep_highlighter {

@ -47,9 +47,13 @@
},
"cursor-line": {
"color": "$cyan",
"background-color": "#d7005f",
"background-color": "#7f005f",
"bold": true
},
"disabled-cursor-line": {
"color": "$cyan",
"background-color": "#5f005f"
},
"adjusted-time": {
"color": "$magenta"
},

@ -753,6 +753,9 @@ view_colors::init_roles(const lnav_theme& lt,
= this->to_attrs(lt, lt.lt_style_hidden, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_CURSOR_LINE)]
= this->to_attrs(lt, lt.lt_style_cursor_line, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(
role_t::VCR_DISABLED_CURSOR_LINE)]
= this->to_attrs(lt, lt.lt_style_disabled_cursor_line, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_ADJUSTED_TIME)]
= this->to_attrs(lt, lt.lt_style_adjusted_time, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_SKEWED_TIME)]

@ -61,6 +61,7 @@
#include "base/attr_line.hh"
#include "base/enum_util.hh"
#include "base/keycodes.hh"
#include "base/lnav_log.hh"
#include "base/lrucache.hpp"
#include "base/opt_util.hh"
@ -69,14 +70,6 @@
#include "optional.hpp"
#include "styling.hh"
#define KEY_CTRL_A 0x01
#define KEY_CTRL_E 0x05
#define KEY_CTRL_G 7
#define KEY_CTRL_L 12
#define KEY_CTRL_P 16
#define KEY_CTRL_R 18
#define KEY_CTRL_W 23
class view_curses;
/**
@ -405,7 +398,7 @@ protected:
bool vc_visible{true};
/** Flag to indicate if a display update is needed. */
bool vc_needs_update{true};
long vc_width;
long vc_width{0};
std::vector<view_curses*> vc_children;
role_t vc_default_role{role_t::VCR_TEXT};
};

@ -179,6 +179,12 @@
"underline": true,
"bold": true
},
"disabled-cursor-line": {
"color": "",
"background-color": "",
"underline": false,
"bold": false
},
"adjusted-time": {
"color": "Maroon",
"background-color": "",
@ -706,6 +712,12 @@
"underline": true,
"bold": true
},
"disabled-cursor-line": {
"color": "",
"background-color": "",
"underline": false,
"bold": false
},
"adjusted-time": {
"color": "$magenta",
"background-color": "",
@ -1198,6 +1210,12 @@
"underline": true,
"bold": true
},
"disabled-cursor-line": {
"color": "",
"background-color": "",
"underline": false,
"bold": false
},
"adjusted-time": {
"color": "$magenta",
"background-color": "",
@ -1686,10 +1704,16 @@
},
"cursor-line": {
"color": "$cyan",
"background-color": "#d7005f",
"background-color": "#7f005f",
"underline": false,
"bold": true
},
"disabled-cursor-line": {
"color": "$cyan",
"background-color": "#5f005f",
"underline": false,
"bold": false
},
"adjusted-time": {
"color": "$magenta",
"background-color": "",
@ -2182,6 +2206,12 @@
"underline": true,
"bold": true
},
"disabled-cursor-line": {
"color": "",
"background-color": "",
"underline": false,
"bold": false
},
"adjusted-time": {
"color": "$magenta",
"background-color": "",
@ -2683,6 +2713,12 @@
"underline": true,
"bold": true
},
"disabled-cursor-line": {
"color": "",
"background-color": "",
"underline": false,
"bold": false
},
"adjusted-time": {
"color": "$magenta",
"background-color": "",
@ -3184,6 +3220,12 @@
"underline": true,
"bold": true
},
"disabled-cursor-line": {
"color": "",
"background-color": "",
"underline": false,
"bold": false
},
"adjusted-time": {
"color": "$magenta",
"background-color": "",

@ -417,111 +417,113 @@
/ui/theme-defs/grayscale/vars/red -> grayscale.json:8
/ui/theme-defs/grayscale/vars/white -> grayscale.json:14
/ui/theme-defs/grayscale/vars/yellow -> grayscale.json:10
/ui/theme-defs/monocai/log-level-styles/critical/color -> monocai.json:260
/ui/theme-defs/monocai/log-level-styles/error/color -> monocai.json:257
/ui/theme-defs/monocai/log-level-styles/fatal/color -> monocai.json:263
/ui/theme-defs/monocai/log-level-styles/warning/color -> monocai.json:254
/ui/theme-defs/monocai/status-styles/active/background-color -> monocai.json:241
/ui/theme-defs/monocai/status-styles/active/color -> monocai.json:240
/ui/theme-defs/monocai/status-styles/alert/background-color -> monocai.json:237
/ui/theme-defs/monocai/status-styles/alert/color -> monocai.json:236
/ui/theme-defs/monocai/status-styles/disabled-title/background-color -> monocai.json:201
/ui/theme-defs/monocai/status-styles/disabled-title/bold -> monocai.json:202
/ui/theme-defs/monocai/status-styles/disabled-title/color -> monocai.json:200
/ui/theme-defs/monocai/status-styles/hotkey/color -> monocai.json:224
/ui/theme-defs/monocai/status-styles/hotkey/underline -> monocai.json:225
/ui/theme-defs/monocai/status-styles/inactive-alert/background-color -> monocai.json:249
/ui/theme-defs/monocai/status-styles/inactive-alert/color -> monocai.json:248
/ui/theme-defs/monocai/status-styles/inactive/background-color -> monocai.json:245
/ui/theme-defs/monocai/status-styles/inactive/color -> monocai.json:244
/ui/theme-defs/monocai/status-styles/info/background-color -> monocai.json:216
/ui/theme-defs/monocai/status-styles/info/color -> monocai.json:215
/ui/theme-defs/monocai/status-styles/subtitle/background-color -> monocai.json:211
/ui/theme-defs/monocai/status-styles/subtitle/bold -> monocai.json:212
/ui/theme-defs/monocai/status-styles/subtitle/color -> monocai.json:210
/ui/theme-defs/monocai/status-styles/text/background-color -> monocai.json:229
/ui/theme-defs/monocai/status-styles/text/color -> monocai.json:228
/ui/theme-defs/monocai/status-styles/title-hotkey/background-color -> monocai.json:220
/ui/theme-defs/monocai/status-styles/title-hotkey/color -> monocai.json:219
/ui/theme-defs/monocai/status-styles/title-hotkey/underline -> monocai.json:221
/ui/theme-defs/monocai/status-styles/title/background-color -> monocai.json:206
/ui/theme-defs/monocai/status-styles/title/bold -> monocai.json:207
/ui/theme-defs/monocai/status-styles/title/color -> monocai.json:205
/ui/theme-defs/monocai/status-styles/warn/background-color -> monocai.json:233
/ui/theme-defs/monocai/status-styles/warn/color -> monocai.json:232
/ui/theme-defs/monocai/styles/adjusted-time/color -> monocai.json:54
/ui/theme-defs/monocai/log-level-styles/critical/color -> monocai.json:264
/ui/theme-defs/monocai/log-level-styles/error/color -> monocai.json:261
/ui/theme-defs/monocai/log-level-styles/fatal/color -> monocai.json:267
/ui/theme-defs/monocai/log-level-styles/warning/color -> monocai.json:258
/ui/theme-defs/monocai/status-styles/active/background-color -> monocai.json:245
/ui/theme-defs/monocai/status-styles/active/color -> monocai.json:244
/ui/theme-defs/monocai/status-styles/alert/background-color -> monocai.json:241
/ui/theme-defs/monocai/status-styles/alert/color -> monocai.json:240
/ui/theme-defs/monocai/status-styles/disabled-title/background-color -> monocai.json:205
/ui/theme-defs/monocai/status-styles/disabled-title/bold -> monocai.json:206
/ui/theme-defs/monocai/status-styles/disabled-title/color -> monocai.json:204
/ui/theme-defs/monocai/status-styles/hotkey/color -> monocai.json:228
/ui/theme-defs/monocai/status-styles/hotkey/underline -> monocai.json:229
/ui/theme-defs/monocai/status-styles/inactive-alert/background-color -> monocai.json:253
/ui/theme-defs/monocai/status-styles/inactive-alert/color -> monocai.json:252
/ui/theme-defs/monocai/status-styles/inactive/background-color -> monocai.json:249
/ui/theme-defs/monocai/status-styles/inactive/color -> monocai.json:248
/ui/theme-defs/monocai/status-styles/info/background-color -> monocai.json:220
/ui/theme-defs/monocai/status-styles/info/color -> monocai.json:219
/ui/theme-defs/monocai/status-styles/subtitle/background-color -> monocai.json:215
/ui/theme-defs/monocai/status-styles/subtitle/bold -> monocai.json:216
/ui/theme-defs/monocai/status-styles/subtitle/color -> monocai.json:214
/ui/theme-defs/monocai/status-styles/text/background-color -> monocai.json:233
/ui/theme-defs/monocai/status-styles/text/color -> monocai.json:232
/ui/theme-defs/monocai/status-styles/title-hotkey/background-color -> monocai.json:224
/ui/theme-defs/monocai/status-styles/title-hotkey/color -> monocai.json:223
/ui/theme-defs/monocai/status-styles/title-hotkey/underline -> monocai.json:225
/ui/theme-defs/monocai/status-styles/title/background-color -> monocai.json:210
/ui/theme-defs/monocai/status-styles/title/bold -> monocai.json:211
/ui/theme-defs/monocai/status-styles/title/color -> monocai.json:209
/ui/theme-defs/monocai/status-styles/warn/background-color -> monocai.json:237
/ui/theme-defs/monocai/status-styles/warn/color -> monocai.json:236
/ui/theme-defs/monocai/styles/adjusted-time/color -> monocai.json:58
/ui/theme-defs/monocai/styles/alt-text/background-color -> monocai.json:26
/ui/theme-defs/monocai/styles/breadcrumb/color -> monocai.json:111
/ui/theme-defs/monocai/styles/breadcrumb/color -> monocai.json:115
/ui/theme-defs/monocai/styles/cursor-line/background-color -> monocai.json:50
/ui/theme-defs/monocai/styles/cursor-line/bold -> monocai.json:51
/ui/theme-defs/monocai/styles/cursor-line/color -> monocai.json:49
/ui/theme-defs/monocai/styles/disabled-focused/background-color -> monocai.json:71
/ui/theme-defs/monocai/styles/disabled-focused/color -> monocai.json:70
/ui/theme-defs/monocai/styles/disabled-cursor-line/background-color -> monocai.json:55
/ui/theme-defs/monocai/styles/disabled-cursor-line/color -> monocai.json:54
/ui/theme-defs/monocai/styles/disabled-focused/background-color -> monocai.json:75
/ui/theme-defs/monocai/styles/disabled-focused/color -> monocai.json:74
/ui/theme-defs/monocai/styles/error/bold -> monocai.json:38
/ui/theme-defs/monocai/styles/error/color -> monocai.json:37
/ui/theme-defs/monocai/styles/focused/background-color -> monocai.json:67
/ui/theme-defs/monocai/styles/focused/color -> monocai.json:66
/ui/theme-defs/monocai/styles/footnote-border/background-color -> monocai.json:128
/ui/theme-defs/monocai/styles/footnote-border/color -> monocai.json:127
/ui/theme-defs/monocai/styles/footnote-text/background-color -> monocai.json:132
/ui/theme-defs/monocai/styles/footnote-text/color -> monocai.json:131
/ui/theme-defs/monocai/styles/h1/bold -> monocai.json:83
/ui/theme-defs/monocai/styles/h1/color -> monocai.json:82
/ui/theme-defs/monocai/styles/h2/color -> monocai.json:86
/ui/theme-defs/monocai/styles/h2/underline -> monocai.json:87
/ui/theme-defs/monocai/styles/h3/color -> monocai.json:90
/ui/theme-defs/monocai/styles/h4/underline -> monocai.json:93
/ui/theme-defs/monocai/styles/h5/underline -> monocai.json:96
/ui/theme-defs/monocai/styles/h6/underline -> monocai.json:99
/ui/theme-defs/monocai/styles/focused/background-color -> monocai.json:71
/ui/theme-defs/monocai/styles/focused/color -> monocai.json:70
/ui/theme-defs/monocai/styles/footnote-border/background-color -> monocai.json:132
/ui/theme-defs/monocai/styles/footnote-border/color -> monocai.json:131
/ui/theme-defs/monocai/styles/footnote-text/background-color -> monocai.json:136
/ui/theme-defs/monocai/styles/footnote-text/color -> monocai.json:135
/ui/theme-defs/monocai/styles/h1/bold -> monocai.json:87
/ui/theme-defs/monocai/styles/h1/color -> monocai.json:86
/ui/theme-defs/monocai/styles/h2/color -> monocai.json:90
/ui/theme-defs/monocai/styles/h2/underline -> monocai.json:91
/ui/theme-defs/monocai/styles/h3/color -> monocai.json:94
/ui/theme-defs/monocai/styles/h4/underline -> monocai.json:97
/ui/theme-defs/monocai/styles/h5/underline -> monocai.json:100
/ui/theme-defs/monocai/styles/h6/underline -> monocai.json:103
/ui/theme-defs/monocai/styles/hidden/bold -> monocai.json:46
/ui/theme-defs/monocai/styles/hidden/color -> monocai.json:45
/ui/theme-defs/monocai/styles/hr/color -> monocai.json:102
/ui/theme-defs/monocai/styles/hyperlink/underline -> monocai.json:105
/ui/theme-defs/monocai/styles/hr/color -> monocai.json:106
/ui/theme-defs/monocai/styles/hyperlink/underline -> monocai.json:109
/ui/theme-defs/monocai/styles/identifier/color -> monocai.json:19
/ui/theme-defs/monocai/styles/info/bold -> monocai.json:34
/ui/theme-defs/monocai/styles/info/color -> monocai.json:33
/ui/theme-defs/monocai/styles/invalid-msg/color -> monocai.json:63
/ui/theme-defs/monocai/styles/list-glyph/color -> monocai.json:108
/ui/theme-defs/monocai/styles/offset-time/color -> monocai.json:60
/ui/theme-defs/monocai/styles/invalid-msg/color -> monocai.json:67
/ui/theme-defs/monocai/styles/list-glyph/color -> monocai.json:112
/ui/theme-defs/monocai/styles/offset-time/color -> monocai.json:64
/ui/theme-defs/monocai/styles/ok/bold -> monocai.json:30
/ui/theme-defs/monocai/styles/ok/color -> monocai.json:29
/ui/theme-defs/monocai/styles/popup/background-color -> monocai.json:75
/ui/theme-defs/monocai/styles/popup/color -> monocai.json:74
/ui/theme-defs/monocai/styles/quote-border/background-color -> monocai.json:121
/ui/theme-defs/monocai/styles/quote-border/color -> monocai.json:120
/ui/theme-defs/monocai/styles/quoted-text/background-color -> monocai.json:124
/ui/theme-defs/monocai/styles/scrollbar/background-color -> monocai.json:79
/ui/theme-defs/monocai/styles/scrollbar/color -> monocai.json:78
/ui/theme-defs/monocai/styles/skewed-time/color -> monocai.json:57
/ui/theme-defs/monocai/styles/snippet-border/color -> monocai.json:135
/ui/theme-defs/monocai/styles/table-border/color -> monocai.json:114
/ui/theme-defs/monocai/styles/table-header/bold -> monocai.json:117
/ui/theme-defs/monocai/styles/popup/background-color -> monocai.json:79
/ui/theme-defs/monocai/styles/popup/color -> monocai.json:78
/ui/theme-defs/monocai/styles/quote-border/background-color -> monocai.json:125
/ui/theme-defs/monocai/styles/quote-border/color -> monocai.json:124
/ui/theme-defs/monocai/styles/quoted-text/background-color -> monocai.json:128
/ui/theme-defs/monocai/styles/scrollbar/background-color -> monocai.json:83
/ui/theme-defs/monocai/styles/scrollbar/color -> monocai.json:82
/ui/theme-defs/monocai/styles/skewed-time/color -> monocai.json:61
/ui/theme-defs/monocai/styles/snippet-border/color -> monocai.json:139
/ui/theme-defs/monocai/styles/table-border/color -> monocai.json:118
/ui/theme-defs/monocai/styles/table-header/bold -> monocai.json:121
/ui/theme-defs/monocai/styles/text/background-color -> monocai.json:23
/ui/theme-defs/monocai/styles/text/color -> monocai.json:22
/ui/theme-defs/monocai/styles/warning/bold -> monocai.json:42
/ui/theme-defs/monocai/styles/warning/color -> monocai.json:41
/ui/theme-defs/monocai/syntax-styles/code-border/background-color -> monocai.json:145
/ui/theme-defs/monocai/syntax-styles/code-border/color -> monocai.json:144
/ui/theme-defs/monocai/syntax-styles/comment/color -> monocai.json:156
/ui/theme-defs/monocai/syntax-styles/diff-add/color -> monocai.json:177
/ui/theme-defs/monocai/syntax-styles/diff-delete/color -> monocai.json:174
/ui/theme-defs/monocai/syntax-styles/diff-section/color -> monocai.json:180
/ui/theme-defs/monocai/syntax-styles/doc-directive/color -> monocai.json:159
/ui/theme-defs/monocai/syntax-styles/file/color -> monocai.json:192
/ui/theme-defs/monocai/syntax-styles/keyword/bold -> monocai.json:149
/ui/theme-defs/monocai/syntax-styles/keyword/color -> monocai.json:148
/ui/theme-defs/monocai/syntax-styles/number/bold -> monocai.json:195
/ui/theme-defs/monocai/syntax-styles/quoted-code/background-color -> monocai.json:141
/ui/theme-defs/monocai/syntax-styles/quoted-code/color -> monocai.json:140
/ui/theme-defs/monocai/syntax-styles/re-repeat/color -> monocai.json:171
/ui/theme-defs/monocai/syntax-styles/re-special/color -> monocai.json:168
/ui/theme-defs/monocai/syntax-styles/spectrogram-high/background-color -> monocai.json:189
/ui/theme-defs/monocai/syntax-styles/spectrogram-low/background-color -> monocai.json:183
/ui/theme-defs/monocai/syntax-styles/spectrogram-medium/background-color -> monocai.json:186
/ui/theme-defs/monocai/syntax-styles/string/bold -> monocai.json:153
/ui/theme-defs/monocai/syntax-styles/string/color -> monocai.json:152
/ui/theme-defs/monocai/syntax-styles/symbol/color -> monocai.json:165
/ui/theme-defs/monocai/syntax-styles/variable/color -> monocai.json:162
/ui/theme-defs/monocai/syntax-styles/code-border/background-color -> monocai.json:149
/ui/theme-defs/monocai/syntax-styles/code-border/color -> monocai.json:148
/ui/theme-defs/monocai/syntax-styles/comment/color -> monocai.json:160
/ui/theme-defs/monocai/syntax-styles/diff-add/color -> monocai.json:181
/ui/theme-defs/monocai/syntax-styles/diff-delete/color -> monocai.json:178
/ui/theme-defs/monocai/syntax-styles/diff-section/color -> monocai.json:184
/ui/theme-defs/monocai/syntax-styles/doc-directive/color -> monocai.json:163
/ui/theme-defs/monocai/syntax-styles/file/color -> monocai.json:196
/ui/theme-defs/monocai/syntax-styles/keyword/bold -> monocai.json:153
/ui/theme-defs/monocai/syntax-styles/keyword/color -> monocai.json:152
/ui/theme-defs/monocai/syntax-styles/number/bold -> monocai.json:199
/ui/theme-defs/monocai/syntax-styles/quoted-code/background-color -> monocai.json:145
/ui/theme-defs/monocai/syntax-styles/quoted-code/color -> monocai.json:144
/ui/theme-defs/monocai/syntax-styles/re-repeat/color -> monocai.json:175
/ui/theme-defs/monocai/syntax-styles/re-special/color -> monocai.json:172
/ui/theme-defs/monocai/syntax-styles/spectrogram-high/background-color -> monocai.json:193
/ui/theme-defs/monocai/syntax-styles/spectrogram-low/background-color -> monocai.json:187
/ui/theme-defs/monocai/syntax-styles/spectrogram-medium/background-color -> monocai.json:190
/ui/theme-defs/monocai/syntax-styles/string/bold -> monocai.json:157
/ui/theme-defs/monocai/syntax-styles/string/color -> monocai.json:156
/ui/theme-defs/monocai/syntax-styles/symbol/color -> monocai.json:169
/ui/theme-defs/monocai/syntax-styles/variable/color -> monocai.json:166
/ui/theme-defs/monocai/vars/black -> monocai.json:7
/ui/theme-defs/monocai/vars/blue -> monocai.json:11
/ui/theme-defs/monocai/vars/cyan -> monocai.json:13

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to readlink(path) failed","attrs":[{"start":8,"end":16,"type":"role","value":47},{"start":17,"end":21,"type":"role","value":46},{"start":8,"end":22,"type":"role","value":60}]},"reason":{"str":"unable to stat path: non-existent-link -- No such file or directory","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to readlink(path) failed","attrs":[{"start":8,"end":16,"type":"role","value":48},{"start":17,"end":21,"type":"role","value":47},{"start":8,"end":22,"type":"role","value":61}]},"reason":{"str":"unable to stat path: non-existent-link -- No such file or directory","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to realpath(path) failed","attrs":[{"start":8,"end":16,"type":"role","value":47},{"start":17,"end":21,"type":"role","value":46},{"start":8,"end":22,"type":"role","value":60}]},"reason":{"str":"Could not get real path for non-existent-path -- No such file or directory","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to realpath(path) failed","attrs":[{"start":8,"end":16,"type":"role","value":48},{"start":17,"end":21,"type":"role","value":47},{"start":8,"end":22,"type":"role","value":61}]},"reason":{"str":"Could not get real path for non-existent-path -- No such file or directory","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to json_contains(json, value) failed","attrs":[{"start":8,"end":21,"type":"role","value":47},{"start":22,"end":26,"type":"role","value":46},{"start":28,"end":33,"type":"role","value":46},{"start":8,"end":34,"type":"role","value":60}]},"reason":{"str":"parse error: premature EOF\n [\"hi\", \"bye\", \"solong]\n (right here) ------^","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to json_contains(json, value) failed","attrs":[{"start":8,"end":21,"type":"role","value":48},{"start":22,"end":26,"type":"role","value":47},{"start":28,"end":33,"type":"role","value":47},{"start":8,"end":34,"type":"role","value":61}]},"reason":{"str":"parse error: premature EOF\n [\"hi\", \"bye\", \"solong]\n (right here) ------^","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to json_concat(json, value, ...) failed","attrs":[{"start":8,"end":19,"type":"role","value":47},{"start":20,"end":24,"type":"role","value":46},{"start":26,"end":31,"type":"role","value":46},{"start":8,"end":37,"type":"role","value":60}]},"reason":{"str":"Invalid JSON: parse error: premature EOF\n [null,\n (right here) ------^","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to json_concat(json, value, ...) failed","attrs":[{"start":8,"end":19,"type":"role","value":48},{"start":20,"end":24,"type":"role","value":47},{"start":26,"end":31,"type":"role","value":47},{"start":8,"end":37,"type":"role","value":61}]},"reason":{"str":"Invalid JSON: parse error: premature EOF\n [null,\n (right here) ------^","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"unexpected JSON value","attrs":[]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"123","attrs":[{"start":0,"end":-1,"type":"role","value":40}]}}],"help":{"str":"Available Properties\n scheme \n username \n password \n host \n port \n path \n query \n parameters/ \n fragment","attrs":[{"start":0,"end":20,"type":"role","value":59},{"start":23,"end":29,"type":"role","value":47},{"start":33,"end":41,"type":"role","value":47},{"start":45,"end":53,"type":"role","value":47},{"start":57,"end":61,"type":"role","value":47},{"start":65,"end":69,"type":"role","value":47},{"start":73,"end":77,"type":"role","value":47},{"start":81,"end":86,"type":"role","value":47},{"start":90,"end":100,"type":"role","value":47},{"start":100,"end":101,"type":"role","value":47},{"start":105,"end":113,"type":"role","value":47}]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"unexpected JSON value","attrs":[]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"123","attrs":[{"start":0,"end":-1,"type":"role","value":41}]}}],"help":{"str":"Available Properties\n scheme \n username \n password \n host \n port \n path \n query \n parameters/ \n fragment","attrs":[{"start":0,"end":20,"type":"role","value":60},{"start":23,"end":29,"type":"role","value":48},{"start":33,"end":41,"type":"role","value":48},{"start":45,"end":53,"type":"role","value":48},{"start":57,"end":61,"type":"role","value":48},{"start":65,"end":69,"type":"role","value":48},{"start":73,"end":77,"type":"role","value":48},{"start":81,"end":86,"type":"role","value":48},{"start":90,"end":100,"type":"role","value":48},{"start":100,"end":101,"type":"role","value":48},{"start":105,"end":113,"type":"role","value":48}]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"warning","message":{"str":"unexpected value for property “/unknown”","attrs":[{"start":33,"end":41,"type":"role","value":47}]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"{\"unknown\":\"abc\"}","attrs":[{"start":0,"end":-1,"type":"role","value":40}]}}],"help":{"str":"Available Properties\n scheme \n username \n password \n host \n port \n path \n query \n parameters/ \n fragment","attrs":[{"start":0,"end":20,"type":"role","value":59},{"start":23,"end":29,"type":"role","value":47},{"start":33,"end":41,"type":"role","value":47},{"start":45,"end":53,"type":"role","value":47},{"start":57,"end":61,"type":"role","value":47},{"start":65,"end":69,"type":"role","value":47},{"start":73,"end":77,"type":"role","value":47},{"start":81,"end":86,"type":"role","value":47},{"start":90,"end":100,"type":"role","value":47},{"start":100,"end":101,"type":"role","value":47},{"start":105,"end":113,"type":"role","value":47}]}}
error: sqlite3_exec failed -- lnav-error:{"level":"warning","message":{"str":"unexpected value for property “/unknown”","attrs":[{"start":33,"end":41,"type":"role","value":48}]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"{\"unknown\":\"abc\"}","attrs":[{"start":0,"end":-1,"type":"role","value":41}]}}],"help":{"str":"Available Properties\n scheme \n username \n password \n host \n port \n path \n query \n parameters/ \n fragment","attrs":[{"start":0,"end":20,"type":"role","value":60},{"start":23,"end":29,"type":"role","value":48},{"start":33,"end":41,"type":"role","value":48},{"start":45,"end":53,"type":"role","value":48},{"start":57,"end":61,"type":"role","value":48},{"start":65,"end":69,"type":"role","value":48},{"start":73,"end":77,"type":"role","value":48},{"start":81,"end":86,"type":"role","value":48},{"start":90,"end":100,"type":"role","value":48},{"start":100,"end":101,"type":"role","value":48},{"start":105,"end":113,"type":"role","value":48}]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"warning","message":{"str":"unexpected value for property “/#”","attrs":[{"start":33,"end":35,"type":"role","value":47}]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"[1, 2, 3]","attrs":[{"start":0,"end":-1,"type":"role","value":40}]}}],"help":{"str":"Available Properties\n scheme \n username \n password \n host \n port \n path \n query \n parameters/ \n fragment","attrs":[{"start":0,"end":20,"type":"role","value":59},{"start":23,"end":29,"type":"role","value":47},{"start":33,"end":41,"type":"role","value":47},{"start":45,"end":53,"type":"role","value":47},{"start":57,"end":61,"type":"role","value":47},{"start":65,"end":69,"type":"role","value":47},{"start":73,"end":77,"type":"role","value":47},{"start":81,"end":86,"type":"role","value":47},{"start":90,"end":100,"type":"role","value":47},{"start":100,"end":101,"type":"role","value":47},{"start":105,"end":113,"type":"role","value":47}]}}
error: sqlite3_exec failed -- lnav-error:{"level":"warning","message":{"str":"unexpected value for property “/#”","attrs":[{"start":33,"end":35,"type":"role","value":48}]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"[1, 2, 3]","attrs":[{"start":0,"end":-1,"type":"role","value":41}]}}],"help":{"str":"Available Properties\n scheme \n username \n password \n host \n port \n path \n query \n parameters/ \n fragment","attrs":[{"start":0,"end":20,"type":"role","value":60},{"start":23,"end":29,"type":"role","value":48},{"start":33,"end":41,"type":"role","value":48},{"start":45,"end":53,"type":"role","value":48},{"start":57,"end":61,"type":"role","value":48},{"start":65,"end":69,"type":"role","value":48},{"start":73,"end":77,"type":"role","value":48},{"start":81,"end":86,"type":"role","value":48},{"start":90,"end":100,"type":"role","value":48},{"start":100,"end":101,"type":"role","value":48},{"start":105,"end":113,"type":"role","value":48}]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to regexp_match(re, str) failed","attrs":[{"start":8,"end":20,"type":"role","value":47},{"start":21,"end":23,"type":"role","value":46},{"start":25,"end":28,"type":"role","value":46},{"start":8,"end":29,"type":"role","value":60}]},"reason":{"str":"regular expression does not have any captures","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to regexp_match(re, str) failed","attrs":[{"start":8,"end":20,"type":"role","value":48},{"start":21,"end":23,"type":"role","value":47},{"start":25,"end":28,"type":"role","value":47},{"start":8,"end":29,"type":"role","value":61}]},"reason":{"str":"regular expression does not have any captures","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"invalid URL: https://example.com:100000","attrs":[{"start":13,"end":39,"type":"role","value":51}]},"reason":{"str":"Port number was not a decimal number between 0 and 65535","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"invalid URL: https://example.com:100000","attrs":[{"start":13,"end":39,"type":"role","value":52}]},"reason":{"str":"Port number was not a decimal number between 0 and 65535","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"“(” is not a valid regular expression","attrs":[]},"reason":{"str":"missing closing parenthesis","attrs":[]},"snippets":[{"source":"pattern","line":0,"content":{"str":"(\n ^ missing closing parenthesis","attrs":[{"start":0,"end":1,"type":"role","value":3},{"start":0,"end":1,"type":"style","value":2359296},{"start":0,"end":1,"type":"role","value":5},{"start":3,"end":5,"type":"role","value":5},{"start":5,"end":32,"type":"role","value":5},{"start":0,"end":-1,"type":"role","value":40}]}}],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"“(” is not a valid regular expression","attrs":[]},"reason":{"str":"missing closing parenthesis","attrs":[]},"snippets":[{"source":"pattern","line":0,"content":{"str":"(\n ^ missing closing parenthesis","attrs":[{"start":0,"end":1,"type":"role","value":3},{"start":0,"end":1,"type":"style","value":2359296},{"start":0,"end":1,"type":"role","value":5},{"start":3,"end":5,"type":"role","value":5},{"start":5,"end":32,"type":"role","value":5},{"start":0,"end":-1,"type":"role","value":41}]}}],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to timeslice(time, slice) failed","attrs":[{"start":8,"end":17,"type":"role","value":47},{"start":18,"end":22,"type":"role","value":46},{"start":24,"end":29,"type":"role","value":46},{"start":8,"end":30,"type":"role","value":60}]},"reason":{"str":"unable to parse time slice value: blah -- Unrecognized input","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to timeslice(time, slice) failed","attrs":[{"start":8,"end":17,"type":"role","value":48},{"start":18,"end":22,"type":"role","value":47},{"start":24,"end":29,"type":"role","value":47},{"start":8,"end":30,"type":"role","value":61}]},"reason":{"str":"unable to parse time slice value: blah -- Unrecognized input","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to timeslice(time, slice) failed","attrs":[{"start":8,"end":17,"type":"role","value":47},{"start":18,"end":22,"type":"role","value":46},{"start":24,"end":29,"type":"role","value":46},{"start":8,"end":30,"type":"role","value":60}]},"reason":{"str":"no time slice value given","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"call to timeslice(time, slice) failed","attrs":[{"start":8,"end":17,"type":"role","value":48},{"start":18,"end":22,"type":"role","value":47},{"start":24,"end":29,"type":"role","value":47},{"start":8,"end":30,"type":"role","value":61}]},"reason":{"str":"no time slice value given","attrs":[]},"snippets":[],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"Invalid XPath expression","attrs":[]},"reason":{"str":"Unrecognized node test","attrs":[]},"snippets":[{"source":"xpath","line":1,"content":{"str":"/abc[\n ^ Unrecognized node test","attrs":[{"start":0,"end":5,"type":"role","value":40},{"start":11,"end":13,"type":"role","value":74},{"start":13,"end":35,"type":"role","value":5},{"start":6,"end":35,"type":"role","value":40},{"start":35,"end":35,"type":"role","value":40}]}}],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"Invalid XPath expression","attrs":[]},"reason":{"str":"Unrecognized node test","attrs":[]},"snippets":[{"source":"xpath","line":1,"content":{"str":"/abc[\n ^ Unrecognized node test","attrs":[{"start":0,"end":5,"type":"role","value":41},{"start":11,"end":13,"type":"role","value":75},{"start":13,"end":35,"type":"role","value":5},{"start":6,"end":35,"type":"role","value":41},{"start":35,"end":35,"type":"role","value":41}]}}],"help":{"str":"","attrs":[]}}

@ -1 +1 @@
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"Invalid XML document","attrs":[]},"reason":{"str":"Error parsing start element tag","attrs":[]},"snippets":[{"source":"xmldoc","line":1,"content":{"str":"<abc\n ^ Error parsing start element tag","attrs":[{"start":0,"end":4,"type":"role","value":40},{"start":8,"end":10,"type":"role","value":74},{"start":10,"end":41,"type":"role","value":5},{"start":5,"end":41,"type":"role","value":40},{"start":41,"end":41,"type":"role","value":40}]}}],"help":{"str":"","attrs":[]}}
error: sqlite3_exec failed -- lnav-error:{"level":"error","message":{"str":"Invalid XML document","attrs":[]},"reason":{"str":"Error parsing start element tag","attrs":[]},"snippets":[{"source":"xmldoc","line":1,"content":{"str":"<abc\n ^ Error parsing start element tag","attrs":[{"start":0,"end":4,"type":"role","value":41},{"start":8,"end":10,"type":"role","value":75},{"start":10,"end":41,"type":"role","value":5},{"start":5,"end":41,"type":"role","value":41},{"start":41,"end":41,"type":"role","value":41}]}}],"help":{"str":"","attrs":[]}}

Loading…
Cancel
Save