[hex-view] add a new view

pull/1205/head
Tim Stack 8 months ago
parent 930748a013
commit 21377958ca

@ -114,6 +114,8 @@ Features:
also jump to a particular file by focusing on the
breadcrumb bar, selecting the crumb, and then selecting
the desired file.
* Binary files are now displayed as a hex dump with ASCII
representation (where applicable).
Bug Fixes:
* Binary data piped into stdin should now be treated the same

@ -355,8 +355,13 @@
"title": "/ui/theme-defs/<theme_name>/styles/skewed-time",
"$ref": "#/definitions/style"
},
"file-offset": {
"description": "Styling for a file offset",
"title": "/ui/theme-defs/<theme_name>/styles/file-offset",
"$ref": "#/definitions/style"
},
"offset-time": {
"description": "Styling for hidden fields",
"description": "Styling for the elapsed time column",
"title": "/ui/theme-defs/<theme_name>/styles/offset-time",
"$ref": "#/definitions/style"
},
@ -528,6 +533,21 @@
"title": "/ui/theme-defs/<theme_name>/syntax-styles/symbol",
"$ref": "#/definitions/style"
},
"null": {
"description": "Styling for nulls in source files",
"title": "/ui/theme-defs/<theme_name>/syntax-styles/null",
"$ref": "#/definitions/style"
},
"ascii-control": {
"description": "Styling for ASCII control characters in source files",
"title": "/ui/theme-defs/<theme_name>/syntax-styles/ascii-control",
"$ref": "#/definitions/style"
},
"non-ascii": {
"description": "Styling for non-ASCII characters in source files",
"title": "/ui/theme-defs/<theme_name>/syntax-styles/non-ascii",
"$ref": "#/definitions/style"
},
"number": {
"description": "Styling for numbers in source files",
"title": "/ui/theme-defs/<theme_name>/syntax-styles/number",

@ -176,7 +176,7 @@ message showing the path to the captured input.
.. prompt:: bash
export PAGER="man -q"
export PAGER="lnav -q"
Searching
---------

@ -40,6 +40,11 @@ public:
class attr_guard {
public:
explicit attr_guard(attr_line_t& al)
: ag_line(al), ag_start(nonstd::nullopt)
{
}
attr_guard(attr_line_t& al, string_attr_pair sap)
: ag_line(al), ag_start(al.get_string().length()),
ag_attr(std::move(sap))
@ -51,7 +56,7 @@ public:
attr_guard& operator=(const attr_guard&) = delete;
attr_guard(attr_guard&& other) noexcept
: ag_line(other.ag_line), ag_start(other.ag_start),
: ag_line(other.ag_line), ag_start(std::move(other.ag_start)),
ag_attr(std::move(other.ag_attr))
{
other.ag_start = nonstd::nullopt;
@ -75,6 +80,8 @@ public:
string_attr_pair ag_attr;
};
attr_guard with_default() { return attr_guard{this->alb_line}; }
attr_guard with_attr(string_attr_pair sap)
{
return {this->alb_line, std::move(sap)};
@ -103,6 +110,14 @@ public:
return *this;
}
template<typename... Args>
attr_line_builder& appendf(Args... args)
{
this->alb_line.appendf(args...);
return *this;
}
attr_line_builder& indent(size_t amount)
{
auto pre = this->with_attr(SA_PREFORMATTED.value());

@ -354,8 +354,9 @@ public:
template<typename... Args>
attr_line_t& appendf(fmt::format_string<Args...> fstr, Args&&... args)
{
this->template append(
fmt::vformat(fstr, fmt::make_format_args(args...)));
fmt::vformat_to(std::back_inserter(this->al_string),
fstr,
fmt::make_format_args(args...));
return *this;
}

@ -59,6 +59,7 @@ enum class role_t : int32_t {
VCR_ADJUSTED_TIME,
VCR_SKEWED_TIME,
VCR_OFFSET_TIME,
VCR_FILE_OFFSET,
VCR_INVALID_MSG,
VCR_STATUS, /*< Normal status line text. */
VCR_WARN_STATUS,
@ -95,6 +96,9 @@ enum class role_t : int32_t {
VCR_DOC_DIRECTIVE,
VCR_VARIABLE,
VCR_SYMBOL,
VCR_NULL,
VCR_ASCII_CTRL,
VCR_NON_ASCII,
VCR_NUMBER,
VCR_RE_SPECIAL,
VCR_RE_REPEAT,
@ -308,6 +312,14 @@ ok(S str)
VC_ROLE.template value(role_t::VCR_OK));
}
template<typename S>
inline std::pair<S, string_attr_pair>
hidden(S str)
{
return std::make_pair(std::move(str),
VC_ROLE.template value(role_t::VCR_HIDDEN));
}
template<typename S>
inline std::pair<S, string_attr_pair>
file(S str)
@ -666,6 +678,13 @@ inline std::pair<std::string, string_attr_pair> operator"" _code_border(
VC_ROLE.template value(role_t::VCR_CODE_BORDER));
}
inline std::pair<std::string, string_attr_pair> operator"" _table_header(
const char* str, std::size_t len)
{
return std::make_pair(std::string(str, len),
VC_ROLE.template value(role_t::VCR_TABLE_HEADER));
}
inline std::pair<std::string, string_attr_pair> operator"" _table_border(
const char* str, std::size_t len)
{

@ -1251,6 +1251,7 @@ line_buffer::read_range(file_range fr)
const char* line_start;
file_ssize_t avail;
#if 0
if (this->lb_last_line_offset != -1
&& fr.fr_offset > this->lb_last_line_offset)
{
@ -1264,6 +1265,7 @@ line_buffer::read_range(file_range fr)
fr.fr_offset,
this->lb_last_line_offset));
}
#endif
if (!(this->in_range(fr.fr_offset)
&& this->in_range(fr.fr_offset + fr.fr_size - 1)))

@ -2847,6 +2847,9 @@ SELECT tbl_name FROM sqlite_master WHERE sql LIKE 'CREATE VIRTUAL TABLE%'
lnav_data.ld_views[LNV_LOG].set_reload_config_delegate(sel_reload_delegate);
lnav_data.ld_views[LNV_PRETTY].set_reload_config_delegate(
sel_reload_delegate);
auto text_header_source
= std::make_shared<textfile_header_overlay>(&lnav_data.ld_text_source);
lnav_data.ld_views[LNV_TEXT].set_overlay_source(text_header_source.get());
lnav_data.ld_views[LNV_TEXT].set_sub_source(&lnav_data.ld_text_source);
lnav_data.ld_views[LNV_TEXT].set_reload_config_delegate(
sel_reload_delegate);

@ -4985,14 +4985,16 @@ com_config(exec_context& ec,
static const auto INPUT_SRC = intern_string::lookup("input");
yajlpp_parse_context ypc(INPUT_SRC, &lnav_config_handlers);
std::vector<lnav::console::user_message> errors;
std::vector<lnav::console::user_message> errors, errors_ignored;
std::string option = args[1];
lnav_config = rollback_lnav_config;
ypc.set_path(option)
.with_obj(lnav_config)
.with_error_reporter([&errors](const auto& ypc, auto msg) {
errors.push_back(msg);
if (msg.um_level == lnav::console::user_message::level::error) {
errors.push_back(msg);
}
});
ypc.ypc_active_paths.insert(option);
ypc.update_callbacks();
@ -5094,8 +5096,18 @@ com_config(exec_context& ec,
return ec.make_error("unhandled type");
}
while (!errors.empty()) {
if (errors.back().um_level
== lnav::console::user_message::level::error)
{
break;
} else {
errors.pop_back();
}
}
if (!errors.empty()) {
return Err(errors[0]);
return Err(errors.back());
}
if (changed) {
@ -5105,10 +5117,20 @@ com_config(exec_context& ec,
= ec.ec_source.back().s_location;
reload_config(errors);
while (!errors.empty()) {
if (errors.back().um_level
== lnav::console::user_message::level::error)
{
break;
} else {
errors.pop_back();
}
}
if (!errors.empty()) {
lnav_config = rollback_lnav_config;
reload_config(errors);
return Err(errors[0]);
reload_config(errors_ignored);
return Err(errors.back());
}
if (!ec.ec_dry_run) {
retval = "info: changed config option -- " + option;

@ -652,8 +652,12 @@ static const struct json_path_container theme_styles_handlers = {
"Styling for timestamps that are different from the received time")
.for_child(&lnav_theme::lt_style_skewed_time)
.with_children(style_config_handlers),
yajlpp::property_handler("file-offset")
.with_description("Styling for a file offset")
.for_child(&lnav_theme::lt_style_file_offset)
.with_children(style_config_handlers),
yajlpp::property_handler("offset-time")
.with_description("Styling for hidden fields")
.with_description("Styling for the elapsed time column")
.for_child(&lnav_theme::lt_style_offset_time)
.with_children(style_config_handlers),
yajlpp::property_handler("invalid-msg")
@ -680,6 +684,12 @@ static const struct json_path_container theme_styles_handlers = {
.with_description("Styling for top-level headers")
.with_obj_provider<style_config, lnav_theme>(
[](const yajlpp_provider_context& ypc, lnav_theme* root) {
if (ypc.ypc_parse_context != nullptr
&& root->lt_style_header[0].pp_path.empty())
{
root->lt_style_header[0].pp_path
= ypc.ypc_parse_context->get_full_path();
}
return &root->lt_style_header[0].pp_value;
})
.with_children(style_config_handlers),
@ -687,6 +697,12 @@ static const struct json_path_container theme_styles_handlers = {
.with_description("Styling for 2nd-level headers")
.with_obj_provider<style_config, lnav_theme>(
[](const yajlpp_provider_context& ypc, lnav_theme* root) {
if (ypc.ypc_parse_context != nullptr
&& root->lt_style_header[1].pp_path.empty())
{
root->lt_style_header[1].pp_path
= ypc.ypc_parse_context->get_full_path();
}
return &root->lt_style_header[1].pp_value;
})
.with_children(style_config_handlers),
@ -694,6 +710,12 @@ static const struct json_path_container theme_styles_handlers = {
.with_description("Styling for 3rd-level headers")
.with_obj_provider<style_config, lnav_theme>(
[](const yajlpp_provider_context& ypc, lnav_theme* root) {
if (ypc.ypc_parse_context != nullptr
&& root->lt_style_header[2].pp_path.empty())
{
root->lt_style_header[2].pp_path
= ypc.ypc_parse_context->get_full_path();
}
return &root->lt_style_header[2].pp_value;
})
.with_children(style_config_handlers),
@ -701,6 +723,12 @@ static const struct json_path_container theme_styles_handlers = {
.with_description("Styling for 4th-level headers")
.with_obj_provider<style_config, lnav_theme>(
[](const yajlpp_provider_context& ypc, lnav_theme* root) {
if (ypc.ypc_parse_context != nullptr
&& root->lt_style_header[3].pp_path.empty())
{
root->lt_style_header[3].pp_path
= ypc.ypc_parse_context->get_full_path();
}
return &root->lt_style_header[3].pp_value;
})
.with_children(style_config_handlers),
@ -708,6 +736,12 @@ static const struct json_path_container theme_styles_handlers = {
.with_description("Styling for 5th-level headers")
.with_obj_provider<style_config, lnav_theme>(
[](const yajlpp_provider_context& ypc, lnav_theme* root) {
if (ypc.ypc_parse_context != nullptr
&& root->lt_style_header[4].pp_path.empty())
{
root->lt_style_header[4].pp_path
= ypc.ypc_parse_context->get_full_path();
}
return &root->lt_style_header[4].pp_value;
})
.with_children(style_config_handlers),
@ -715,6 +749,12 @@ static const struct json_path_container theme_styles_handlers = {
.with_description("Styling for 6th-level headers")
.with_obj_provider<style_config, lnav_theme>(
[](const yajlpp_provider_context& ypc, lnav_theme* root) {
if (ypc.ypc_parse_context != nullptr
&& root->lt_style_header[5].pp_path.empty())
{
root->lt_style_header[5].pp_path
= ypc.ypc_parse_context->get_full_path();
}
return &root->lt_style_header[5].pp_value;
})
.with_children(style_config_handlers),
@ -806,6 +846,19 @@ static const struct json_path_container theme_syntax_styles_handlers = {
.with_description("Styling for symbols in source files")
.for_child(&lnav_theme::lt_style_symbol)
.with_children(style_config_handlers),
yajlpp::property_handler("null")
.with_description("Styling for nulls in source files")
.for_child(&lnav_theme::lt_style_null)
.with_children(style_config_handlers),
yajlpp::property_handler("ascii-control")
.with_description(
"Styling for ASCII control characters in source files")
.for_child(&lnav_theme::lt_style_ascii_ctrl)
.with_children(style_config_handlers),
yajlpp::property_handler("non-ascii")
.with_description("Styling for non-ASCII characters in source files")
.for_child(&lnav_theme::lt_style_non_ascii)
.with_children(style_config_handlers),
yajlpp::property_handler("number")
.with_description("Styling for numbers in source files")
.for_child(&lnav_theme::lt_style_number)
@ -1803,20 +1856,25 @@ reload_config(std::vector<lnav::console::user_message>& errors)
auto loc_iter
= lnav_config_locations.find(intern_string::lookup(path));
auto has_loc = loc_iter != lnav_config_locations.end();
auto um
= lnav::console::user_message::error(
auto um = has_loc
? lnav::console::user_message::error(
attr_line_t()
.append(has_loc ? "invalid value for property "
: "missing value for property ")
.append("invalid value for property ")
.append_quoted(lnav::roles::symbol(path)))
.with_reason(errmsg)
.with_help(jph.get_help_text(path));
: errmsg;
um.with_help(jph.get_help_text(path));
if (has_loc) {
um.with_snippet(
lnav::console::snippet::from(loc_iter->second.sl_source,
"")
.with_line(loc_iter->second.sl_line_number));
} else {
um.um_message
= attr_line_t()
.append("missing value for property ")
.append_quoted(lnav::roles::symbol(path));
}
errors.emplace_back(um);

@ -601,6 +601,11 @@ logfile::rebuild_index(nonstd::optional<ui_clock::time_point> deadline)
this->lf_stat.st_mtime);
this->close();
return rebuild_result_t::NO_NEW_LINES;
}
if (this->lf_text_format == text_format_t::TF_BINARY) {
this->lf_index_size = st.st_size;
this->lf_stat = st;
} else if (this->lf_line_buffer.is_data_available(this->lf_index_size,
st.st_size))
{
@ -1023,6 +1028,12 @@ logfile::read_file()
return Ok(std::move(retval));
}
Result<shared_buffer_ref, std::string>
logfile::read_range(file_range fr)
{
return this->lf_line_buffer.read_range(fr);
}
void
logfile::read_full_message(logfile::const_iterator ll,
shared_buffer_ref& msg_out,

@ -252,6 +252,8 @@ public:
Result<std::string, std::string> read_file();
Result<shared_buffer_ref, std::string> read_range(file_range fr);
iterator line_base(iterator ll)
{
auto retval = ll;

@ -153,6 +153,12 @@ struct style_config {
std::string sc_background_color;
bool sc_underline{false};
bool sc_bold{false};
bool empty() const
{
return this->sc_color.empty() && this->sc_background_color.empty()
&& !this->sc_underline && !this->sc_bold;
}
};
struct highlighter_config {
@ -179,6 +185,7 @@ struct lnav_theme {
positioned_property<style_config> lt_style_adjusted_time;
positioned_property<style_config> lt_style_skewed_time;
positioned_property<style_config> lt_style_offset_time;
positioned_property<style_config> lt_style_file_offset;
positioned_property<style_config> lt_style_invalid_msg;
positioned_property<style_config> lt_style_status_title;
positioned_property<style_config> lt_style_status_title_hotkey;
@ -195,6 +202,9 @@ struct lnav_theme {
positioned_property<style_config> lt_style_doc_directive;
positioned_property<style_config> lt_style_variable;
positioned_property<style_config> lt_style_symbol;
positioned_property<style_config> lt_style_null;
positioned_property<style_config> lt_style_ascii_ctrl;
positioned_property<style_config> lt_style_non_ascii;
positioned_property<style_config> lt_style_number;
positioned_property<style_config> lt_style_function;
positioned_property<style_config> lt_style_type;

@ -30,10 +30,12 @@
#include "textfile_sub_source.hh"
#include "base/ansi_scrubber.hh"
#include "base/attr_line.builder.hh"
#include "base/fs_util.hh"
#include "base/injector.hh"
#include "base/itertools.hh"
#include "base/map_util.hh"
#include "base/math_util.hh"
#include "bound_tags.hh"
#include "config.h"
#include "lnav.events.hh"
@ -49,12 +51,20 @@ textfile_sub_source::text_line_count()
size_t retval = 0;
if (!this->tss_files.empty()) {
std::shared_ptr<logfile> lf = this->current_file();
auto lf = this->current_file();
auto rend_iter = this->tss_rendered_files.find(lf->get_filename());
if (rend_iter == this->tss_rendered_files.end()) {
auto* lfo = (line_filter_observer*) lf->get_logline_observer();
if (lfo != nullptr) {
retval = lfo->lfo_filter_state.tfs_index.size();
if (lf->get_text_format() == text_format_t::TF_BINARY) {
auto fsize = lf->get_stat().st_size;
retval = fsize / 16;
if (fsize % 16) {
retval += 1;
}
} else {
auto* lfo = (line_filter_observer*) lf->get_logline_observer();
if (lfo != nullptr) {
retval = lfo->lfo_filter_state.tfs_index.size();
}
}
} else {
retval = rend_iter->second.rf_text_source->text_line_count();
@ -70,49 +80,128 @@ textfile_sub_source::text_value_for_line(textview_curses& tc,
std::string& value_out,
text_sub_source::line_flags_t flags)
{
if (!this->tss_files.empty()) {
const auto lf = this->current_file();
auto rend_iter = this->tss_rendered_files.find(lf->get_filename());
if (rend_iter == this->tss_rendered_files.end()) {
auto* lfo = dynamic_cast<line_filter_observer*>(
lf->get_logline_observer());
if (lfo == nullptr || line < 0
|| line >= lfo->lfo_filter_state.tfs_index.size())
{
value_out.clear();
if (this->tss_files.empty() || line < 0) {
value_out.clear();
return;
}
const auto lf = this->current_file();
auto rend_iter = this->tss_rendered_files.find(lf->get_filename());
if (rend_iter != this->tss_rendered_files.end()) {
rend_iter->second.rf_text_source->text_value_for_line(
tc, line, value_out, flags);
return;
}
if (lf->get_text_format() == text_format_t::TF_BINARY) {
this->tss_hex_line.clear();
attr_line_builder alb(this->tss_hex_line);
auto fsize = lf->get_stat().st_size;
auto fr = file_range{line * 16};
fr.fr_size = std::min((file_ssize_t) 16, fsize - fr.fr_offset);
auto read_res = lf->read_range(fr);
if (read_res.isErr()) {
log_error("%s: failed to read range %lld:%lld -- %s",
lf->get_filename().c_str(),
fr.fr_offset,
fr.fr_size,
read_res.unwrapErr().c_str());
return;
}
auto sbr = read_res.unwrap();
auto sf = sbr.to_string_fragment();
{
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_FILE_OFFSET));
alb.appendf(FMT_STRING("{: >16x} "), fr.fr_offset);
}
auto byte_off = size_t{0};
for (auto ch : sf) {
if (byte_off == 8) {
alb.append(" ");
}
nonstd::optional<role_t> ro;
if (ch == '\0') {
ro = role_t::VCR_NULL;
} else if (isspace(ch) || iscntrl(ch)) {
ro = role_t::VCR_ASCII_CTRL;
} else if (!isprint(ch)) {
ro = role_t::VCR_NON_ASCII;
}
auto ag = ro.has_value() ? alb.with_attr(VC_ROLE.value(ro.value()))
: alb.with_default();
alb.appendf(FMT_STRING(" {:0>2x}"), ch);
byte_off += 1;
}
for (; byte_off < 16; byte_off++) {
if (byte_off == 8) {
alb.append(" ");
}
alb.append(" ");
}
alb.append(" ");
byte_off = 0;
for (auto ch : sf) {
if (byte_off == 8) {
alb.append(" ");
}
if (ch == '\0') {
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_NULL));
alb.append("\u22c4");
} else if (isspace(ch)) {
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_ASCII_CTRL));
alb.append("_");
} else if (iscntrl(ch)) {
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_ASCII_CTRL));
alb.append("\u2022");
} else if (isprint(ch)) {
this->tss_hex_line.get_string().push_back(ch);
} else {
auto ll = lf->begin() + lfo->lfo_filter_state.tfs_index[line];
auto read_result = lf->read_line(ll);
this->tss_line_indent_size = 0;
if (read_result.isOk()) {
value_out = to_string(read_result.unwrap());
for (const auto& ch : value_out) {
if (ch == ' ') {
this->tss_line_indent_size += 1;
} else if (ch == '\t') {
do {
this->tss_line_indent_size += 1;
} while (this->tss_line_indent_size % 8);
} else {
break;
}
}
if (lf->has_line_metadata()
&& this->tas_display_time_offset)
{
auto relstr = this->get_time_offset_for_line(
tc, vis_line_t(line));
value_out = fmt::format(
FMT_STRING("{: >12}|{}"), relstr, value_out);
}
}
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_NON_ASCII));
alb.append("\u00d7");
}
} else {
rend_iter->second.rf_text_source->text_value_for_line(
tc, line, value_out, flags);
byte_off += 1;
}
} else {
auto alt_row_index = line % 4;
if (alt_row_index == 2 || alt_row_index == 3) {
this->tss_hex_line.with_attr_for_all(
VC_ROLE.value(role_t::VCR_ALT_ROW));
}
value_out = this->tss_hex_line.get_string();
return;
}
auto* lfo = dynamic_cast<line_filter_observer*>(lf->get_logline_observer());
if (lfo == nullptr || line >= lfo->lfo_filter_state.tfs_index.size()) {
value_out.clear();
return;
}
auto ll = lf->begin() + lfo->lfo_filter_state.tfs_index[line];
auto read_result = lf->read_line(ll);
this->tss_line_indent_size = 0;
if (read_result.isOk()) {
value_out = to_string(read_result.unwrap());
for (const auto& ch : value_out) {
if (ch == ' ') {
this->tss_line_indent_size += 1;
} else if (ch == '\t') {
do {
this->tss_line_indent_size += 1;
} while (this->tss_line_indent_size % 8);
} else {
break;
}
}
if (lf->has_line_metadata() && this->tas_display_time_offset) {
auto relstr = this->get_time_offset_for_line(tc, vis_line_t(line));
value_out
= fmt::format(FMT_STRING("{: >12}|{}"), relstr, value_out);
}
}
}
@ -134,6 +223,8 @@ textfile_sub_source::text_attrs_for_line(textview_curses& tc,
if (rend_iter != this->tss_rendered_files.end()) {
rend_iter->second.rf_text_source->text_attrs_for_line(
tc, row, value_out);
} else if (lf->get_text_format() == text_format_t::TF_BINARY) {
value_out = this->tss_hex_line.get_attrs();
} else {
auto* lfo
= dynamic_cast<line_filter_observer*>(lf->get_logline_observer());
@ -502,7 +593,6 @@ textfile_sub_source::text_crumbs_for_line(
const auto initial_size = crumbs.size();
meta_iter->second.ms_metadata.m_sections_tree.visit_overlapping(
lf->get_line_content_offset(ll_iter),
end_offset,
[&crumbs,
initial_size,
@ -1065,3 +1155,51 @@ textfile_sub_source::text_accel_get_line(vis_line_t vl)
auto* lfo = dynamic_cast<line_filter_observer*>(lf->get_logline_observer());
return (lf->begin() + lfo->lfo_filter_state.tfs_index[vl]).base();
}
textfile_header_overlay::textfile_header_overlay(textfile_sub_source* src)
: tho_src(src)
{
}
bool
textfile_header_overlay::list_static_overlay(const listview_curses& lv,
int y,
int bottom,
attr_line_t& value_out)
{
if (y != 0) {
return false;
}
auto lf = this->tho_src->current_file();
if (lf == nullptr) {
return false;
}
if (lf->get_text_format() != text_format_t::TF_BINARY) {
return false;
}
{
attr_line_builder alb(value_out);
{
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_TABLE_HEADER));
alb.appendf(FMT_STRING("{:>16} "), "File Offset");
}
size_t byte_off = 0;
for (size_t lpc = 0; lpc < 16; lpc++) {
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_FILE_OFFSET));
if (byte_off == 8) {
alb.append(" ");
}
alb.appendf(FMT_STRING(" {:0>2x}"), lpc);
byte_off += 1;
}
{
auto ag = alb.with_attr(VC_ROLE.value(role_t::VCR_TABLE_HEADER));
alb.appendf(FMT_STRING(" {:^17}"), "ASCII");
}
}
value_out.with_attr_for_all(VC_STYLE.value(text_attrs{A_UNDERLINE}));
return true;
}

@ -189,6 +189,20 @@ private:
std::unordered_map<std::string, metadata_state> tss_doc_metadata;
size_t tss_line_indent_size{0};
bool tss_completed_last_scan{true};
attr_line_t tss_hex_line;
};
class textfile_header_overlay : public list_overlay_source {
public:
explicit textfile_header_overlay(textfile_sub_source* src);
bool list_static_overlay(const listview_curses& lv,
int y,
int bottom,
attr_line_t& value_out) override;
private:
textfile_sub_source* tho_src;
};
#endif

@ -22,6 +22,10 @@
"color": "Green",
"bold": true
},
"info": {
"color": "Maroon",
"bold": true
},
"error": {
"color": "Red",
"bold": true
@ -40,6 +44,10 @@
"bold": true,
"underline": true
},
"disabled-cursor-line": {
"color": "Cyan1",
"background-color": "#5f005f"
},
"adjusted-time": {
"color": "Maroon"
},
@ -49,6 +57,9 @@
"offset-time": {
"color": "Teal"
},
"file-offset": {
"color": "Silver"
},
"invalid-msg": {
"color": "Yellow"
},
@ -86,12 +97,39 @@
"h6": {
"underline": true
},
"hr": {
"color": "#444"
},
"hyperlink": {
"underline": true
},
"list-glyph": {
"color": "Yellow"
},
"breadcrumb": {
"color": "Teal"
},
"table-border": {
"color": "#444"
},
"table-header": {
"bold": true
},
"quote-border": {
"color": "#666",
"background-color": "#444"
},
"quoted-text": {
"background-color": "#444"
},
"footnote-border": {
"color": "Blue",
"background-color": "#444"
},
"footnote-text": {
"color": "#eee",
"background-color": "#444"
},
"snippet-border": {
"color": "Teal"
},
@ -100,8 +138,20 @@
}
},
"syntax-styles": {
"inline-code": {
"color": "Red",
"background-color": "#121212"
},
"quoted-code": {
"color": "Silver",
"background-color": "#121212"
},
"code-border": {
"color": "#444",
"background-color": "#121212"
},
"keyword": {
"color": "Blue"
"color": "#00f"
},
"string": {
"color": "Green",
@ -135,19 +185,37 @@
"color": "Maroon"
},
"spectrogram-low": {
"background-color": "$green"
"background-color": "Green"
},
"spectrogram-medium": {
"background-color": "$yellow"
"background-color": "Yellow"
},
"spectrogram-high": {
"background-color": "$red"
"background-color": "Red"
},
"file": {
"color": "Blue"
},
"null": {
"color": "Silver"
},
"ascii-control": {
"color": "Green"
},
"non-ascii": {
"color": "Yellow"
},
"number": {
"bold": true
},
"function": {
"color": "Cyan1"
},
"separators-references-accessors": {
"color": "Silver"
},
"type": {
"color": "Blue"
}
},
"status-styles": {

@ -66,6 +66,9 @@
"offset-time": {
"color": "$cyan"
},
"file-offset": {
"color": "#888"
},
"invalid-msg": {
"color": "$yellow"
},
@ -206,6 +209,15 @@
"file": {
"color": "$blue"
},
"null": {
"color": "#888"
},
"ascii-control": {
"color": "$green"
},
"non-ascii": {
"color": "$yellow"
},
"number": {
"bold": true
},

@ -30,6 +30,10 @@
"color": "$green",
"bold": true
},
"info": {
"color": "$magenta",
"bold": true
},
"error": {
"color": "$red",
"bold": true
@ -48,6 +52,10 @@
"bold": true,
"underline": true
},
"disabled-cursor-line": {
"color": "$cyan",
"background-color": "#5f005f"
},
"adjusted-time": {
"color": "$magenta"
},
@ -57,9 +65,20 @@
"offset-time": {
"color": "$cyan"
},
"file-offset": {
"color": "#888"
},
"invalid-msg": {
"color": "$yellow"
},
"focused": {
"color": "$black",
"background-color": "$white"
},
"disabled-focused": {
"color": "$white",
"background-color": "#333"
},
"popup": {
"color": "$black",
"background-color": "Grey37"
@ -86,11 +105,59 @@
"h6": {
"underline": true
},
"hr": {
"color": "#444"
},
"hyperlink": {
"underline": true
},
"list-glyph": {
"color": "$yellow"
},
"breadcrumb": {
"color": "#99a"
},
"table-border": {
"color": "#444"
},
"table-header": {
"bold": true
},
"quote-border": {
"color": "#666",
"background-color": "#444"
},
"quoted-text": {
"background-color": "#444"
},
"footnote-border": {
"color": "$blue",
"background-color": "#444"
},
"footnote-text": {
"color": "#eee",
"background-color": "#444"
},
"snippet-border": {
"color": "$cyan"
},
"indent-guide": {
"color": "#444"
}
},
"syntax-styles": {
"inline-code": {
"color": "$red",
"background-color": "#121212"
},
"quoted-code": {
"color": "#eee",
"background-color": "#121212"
},
"code-border": {
"color": "#444",
"background-color": "#121212"
},
"keyword": {
"color": "$yellow"
},
@ -139,9 +206,32 @@
},
"file": {
"color": "$blue"
},
"null": {
"color": "#888"
},
"ascii-control": {
"color": "$green"
},
"non-ascii": {
"color": "$yellow"
},
"function": {
"color": "$cyan"
},
"separators-references-accessors": {
"color": "$red"
},
"type": {
"color": "$blue"
}
},
"status-styles": {
"disabled-title": {
"color": "#5394ec",
"background-color": "#353535",
"bold": true
},
"title": {
"color": "$black",
"background-color": "$blue",
@ -172,6 +262,15 @@
"color": "$black",
"background-color": "Grey"
},
"title-hotkey": {
"color": "$black",
"background-color": "#5394ec",
"underline": true
},
"hotkey": {
"color": "#fff",
"underline": true
},
"inactive": {
"color": "$black",
"background-color": "Grey"

@ -31,6 +31,10 @@
"color": "$green",
"bold": true
},
"info": {
"color": "#aaa",
"bold": true
},
"error": {
"color": "$red",
"bold": true
@ -44,11 +48,15 @@
"bold": true
},
"cursor-line": {
"color": "$cyan",
"background-color": "$red",
"color": "#fff",
"background-color": "#555",
"bold": true,
"underline": true
},
"disabled-cursor-line": {
"color": "#888",
"background-color": "#333"
},
"adjusted-time": {
"color": "$magenta"
},
@ -58,6 +66,9 @@
"offset-time": {
"color": "$cyan"
},
"file-offset": {
"color": "#888"
},
"invalid-msg": {
"color": "$yellow"
},
@ -95,10 +106,66 @@
"h6": {
"underline": true
},
"hr": {
"color": "#444"
},
"hyperlink": {
"underline": true
},
"list-glyph": {
"color": "#444"
},
"breadcrumb": {
"color": "#999"
},
"table-border": {
"color": "#444"
},
"table-header": {
"bold": true
},
"quote-border": {
"color": "#666",
"background-color": "#444"
},
"quoted-text": {
"background-color": "#444"
},
"footnote-border": {
"color": "#888",
"background-color": "#444"
},
"footnote-text": {
"color": "#eee",
"background-color": "#444"
},
"snippet-border": {
"color": "#888"
},
"indent-guide": {
"color": "#444"
}
},
"syntax-styles": {
"comment": {
"color": "#888"
},
"doc-directive": {
"color": "#aaa"
},
"null": {
"color": "#888"
},
"ascii-control": {
"color": "#aaa"
},
"non-ascii": {
"color": "#ccc"
},
"number": {
"bold": true
}
},
"status-styles": {
"disabled-title": {
"color": "#5394ec",

@ -63,6 +63,9 @@
"offset-time": {
"color": "$cyan"
},
"file-offset": {
"color": "#888"
},
"invalid-msg": {
"color": "$yellow"
},
@ -202,6 +205,15 @@
"file": {
"color": "$blue"
},
"null": {
"color": "#888"
},
"ascii-control": {
"color": "$green"
},
"non-ascii": {
"color": "$yellow"
},
"number": {
"bold": true
},

@ -30,6 +30,10 @@
"color": "$green",
"bold": true
},
"info": {
"color": "$magenta",
"bold": true
},
"error": {
"color": "#ef5350",
"bold": true
@ -48,6 +52,10 @@
"bold": true,
"underline": true
},
"disabled-cursor-line": {
"color": "$cyan",
"background-color": "#5f005f"
},
"adjusted-time": {
"color": "$magenta"
},
@ -57,6 +65,9 @@
"offset-time": {
"color": "$cyan"
},
"file-offset": {
"color": "#888"
},
"invalid-msg": {
"color": "$yellow"
},
@ -94,11 +105,59 @@
"h6": {
"underline": true
},
"hr": {
"color": "#444"
},
"hyperlink": {
"underline": true
},
"list-glyph": {
"color": "$yellow"
},
"breadcrumb": {
"color": "#99a"
},
"table-border": {
"color": "#444"
},
"table-header": {
"bold": true
},
"quote-border": {
"color": "#666",
"background-color": "#444"
},
"quoted-text": {
"background-color": "#444"
},
"footnote-border": {
"color": "$blue",
"background-color": "#444"
},
"footnote-text": {
"color": "#eee",
"background-color": "#444"
},
"snippet-border": {
"color": "$cyan"
},
"indent-guide": {
"color": "#444"
}
},
"syntax-styles": {
"inline-code": {
"color": "$red",
"background-color": "#222"
},
"quoted-code": {
"color": "#eee",
"background-color": "#222"
},
"code-border": {
"color": "#444",
"background-color": "#222"
},
"keyword": {
"color": "#c792ea"
},
@ -147,6 +206,24 @@
},
"file": {
"color": "#82aaff"
},
"null": {
"color": "#888"
},
"ascii-control": {
"color": "$green"
},
"non-ascii": {
"color": "$yellow"
},
"function": {
"color": "$cyan"
},
"separators-references-accessors": {
"color": "$red"
},
"type": {
"color": "$blue"
}
},
"status-styles": {

@ -39,6 +39,10 @@
"color": "$green",
"bold": true
},
"info": {
"color": "$magenta",
"bold": true
},
"error": {
"color": "$red",
"bold": true
@ -57,6 +61,10 @@
"bold": true,
"underline": true
},
"disabled-cursor-line": {
"color": "$cyan",
"background-color": "#5f005f"
},
"adjusted-time": {
"color": "$magenta"
},
@ -66,6 +74,9 @@
"offset-time": {
"color": "$cyan"
},
"file-offset": {
"color": "#888"
},
"invalid-msg": {
"color": "$yellow"
},
@ -103,11 +114,59 @@
"h6": {
"underline": true
},
"hr": {
"color": "#444"
},
"hyperlink": {
"underline": true
},
"list-glyph": {
"color": "$yellow"
},
"breadcrumb": {
"color": "#99a"
},
"table-border": {
"color": "#444"
},
"table-header": {
"bold": true
},
"quote-border": {
"color": "#666",
"background-color": "#444"
},
"quoted-text": {
"background-color": "#444"
},
"footnote-border": {
"color": "$blue",
"background-color": "#444"
},
"footnote-text": {
"color": "#eee",
"background-color": "#444"
},
"snippet-border": {
"color": "$cyan"
},
"indent-guide": {
"color": "#444"
}
},
"syntax-styles": {
"inline-code": {
"color": "$red",
"background-color": "#121212"
},
"quoted-code": {
"color": "#eee",
"background-color": "#121212"
},
"code-border": {
"color": "#444",
"background-color": "#121212"
},
"keyword": {
"color": "$yellow"
},
@ -153,9 +212,35 @@
},
"file": {
"color": "$blue"
},
"null": {
"color": "#888"
},
"ascii-control": {
"color": "$green"
},
"non-ascii": {
"color": "$yellow"
},
"number": {
"bold": true
},
"function": {
"color": "$cyan"
},
"separators-references-accessors": {
"color": "$red"
},
"type": {
"color": "$blue"
}
},
"status-styles": {
"disabled-title": {
"color": "$base01",
"background-color": "$base03",
"bold": true
},
"title": {
"color": "$base02",
"background-color": "$blue",
@ -186,6 +271,15 @@
"color": "$base1",
"background-color": "$base02"
},
"title-hotkey": {
"color": "$black",
"background-color": "#5394ec",
"underline": true
},
"hotkey": {
"color": "#fff",
"underline": true
},
"inactive": {
"color": "$base1",
"background-color": "$base02"

@ -624,7 +624,12 @@ view_colors::to_attrs(const lnav_theme& lt,
std::string fg1, bg1, fg_color, bg_color;
intern_string_t role_class;
if (!pp_sc.pp_path.empty()) {
if (pp_sc.pp_path.empty()) {
#if 0
// too slow to do this now
reporter(&sc.sc_color, lnav::console::user_message::warning(""));
#endif
} else {
auto role_class_path
= ghc::filesystem::path(pp_sc.pp_path.to_string()).parent_path();
auto inner = role_class_path.filename().string();
@ -777,6 +782,8 @@ view_colors::init_roles(const lnav_theme& lt,
= this->to_attrs(lt, lt.lt_style_skewed_time, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_OFFSET_TIME)]
= this->to_attrs(lt, lt.lt_style_offset_time, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_FILE_OFFSET)]
= this->to_attrs(lt, lt.lt_style_file_offset, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_INVALID_MSG)]
= this->to_attrs(lt, lt.lt_style_invalid_msg, reporter);
@ -979,6 +986,12 @@ view_colors::init_roles(const lnav_theme& lt,
= this->to_attrs(lt, lt.lt_style_variable, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_SYMBOL)]
= this->to_attrs(lt, lt.lt_style_symbol, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_NULL)]
= this->to_attrs(lt, lt.lt_style_null, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_ASCII_CTRL)]
= this->to_attrs(lt, lt.lt_style_ascii_ctrl, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_NON_ASCII)]
= this->to_attrs(lt, lt.lt_style_non_ascii, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_NUMBER)]
= this->to_attrs(lt, lt.lt_style_number, reporter);
this->vc_role_attrs[lnav::enums::to_underlying(role_t::VCR_FUNCTION)]

@ -56,16 +56,14 @@
reason: parse error: premature EOF
 --> {test_dir}/bad-config2/formats/invalid-config/config.truncated.json:3
✘ error: missing value for property “/log/annotations/org.lnav.test.no-condition/condition”
reason: SQL expression is invalid
 |  reason: incomplete input
 |   --> /log/annotations/org.lnav.test.no-condition/condition
reason: incomplete input
 --> /log/annotations/org.lnav.test.no-condition/condition
 = help: Property Synopsis
/log/annotations/org.lnav.test.no-condition/condition <SQL-expression>
Description
The SQLite expression to execute for a log message that determines whether or not this annotation is applicable. The expression is evaluated the same way as a filter expression
✘ error: missing value for property “/log/annotations/org.lnav.test.no-handler/handler”
reason: no handler specified for annotation
 |  reason: Every annotation requires a handler
reason: Every annotation requires a handler
 = help: Property Synopsis
/log/annotations/org.lnav.test.no-handler/handler <script>
Description

@ -1,2 +1,3 @@
#Date: 3/9/3/0? 2
0
File Offset 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ASCII
0 23 44 61 74 65 3a 09 33 2f 39 2f 33 2f 30 85 20 #Date:_3 /9/3/0×_
10 32 0a 30 0a 2_0_

@ -1,2 +1,2 @@
#Fields: ? )
0
File Offset 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ASCII
0 23 46 69 65 6c 64 73 3a 20 f9 09 29 0a 30 0a #Fields: _×_)_0_

@ -1,2 +1,3 @@
#Date: 20?0-2-02
0
File Offset 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ASCII
0 23 44 61 74 65 3a 09 32 30 80 30 2d 32 2d 30 32 #Date:_2 0×0-2-02
10 0a 30 0a _0_

@ -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":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":[],"notes":[],"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":49},{"start":17,"end":21,"type":"role","value":48},{"start":8,"end":22,"type":"role","value":65}]},"reason":{"str":"unable to stat path: non-existent-link -- No such file or directory","attrs":[]},"snippets":[],"notes":[],"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":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":[],"notes":[],"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":49},{"start":17,"end":21,"type":"role","value":48},{"start":8,"end":22,"type":"role","value":65}]},"reason":{"str":"Could not get real path for non-existent-path -- No such file or directory","attrs":[]},"snippets":[],"notes":[],"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":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":[],"notes":[],"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":49},{"start":22,"end":26,"type":"role","value":48},{"start":28,"end":33,"type":"role","value":48},{"start":8,"end":34,"type":"role","value":65}]},"reason":{"str":"parse error: premature EOF\n [\"hi\", \"bye\", \"solong]\n (right here) ------^","attrs":[]},"snippets":[],"notes":[],"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":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":[],"notes":[],"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":49},{"start":20,"end":24,"type":"role","value":48},{"start":26,"end":31,"type":"role","value":48},{"start":8,"end":37,"type":"role","value":65}]},"reason":{"str":"Invalid JSON: parse error: premature EOF\n [null,\n (right here) ------^","attrs":[]},"snippets":[],"notes":[],"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":41}]}}],"notes":[],"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}]}}
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":42}]}}],"notes":[],"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":64},{"start":23,"end":29,"type":"role","value":49},{"start":33,"end":41,"type":"role","value":49},{"start":45,"end":53,"type":"role","value":49},{"start":57,"end":61,"type":"role","value":49},{"start":65,"end":69,"type":"role","value":49},{"start":73,"end":77,"type":"role","value":49},{"start":81,"end":86,"type":"role","value":49},{"start":90,"end":100,"type":"role","value":49},{"start":100,"end":101,"type":"role","value":49},{"start":105,"end":113,"type":"role","value":49}]}}

@ -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":48}]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"{\"unknown\":\"abc\"}","attrs":[{"start":0,"end":-1,"type":"role","value":41}]}}],"notes":[],"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}]}}
error: sqlite3_exec failed -- lnav-error:{"level":"warning","message":{"str":"unexpected value for property “/unknown”","attrs":[{"start":33,"end":41,"type":"role","value":49}]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"{\"unknown\":\"abc\"}","attrs":[{"start":0,"end":-1,"type":"role","value":42}]}}],"notes":[],"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":64},{"start":23,"end":29,"type":"role","value":49},{"start":33,"end":41,"type":"role","value":49},{"start":45,"end":53,"type":"role","value":49},{"start":57,"end":61,"type":"role","value":49},{"start":65,"end":69,"type":"role","value":49},{"start":73,"end":77,"type":"role","value":49},{"start":81,"end":86,"type":"role","value":49},{"start":90,"end":100,"type":"role","value":49},{"start":100,"end":101,"type":"role","value":49},{"start":105,"end":113,"type":"role","value":49}]}}

@ -1 +1 @@
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}]}}],"notes":[],"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}]}}
error: sqlite3_exec failed -- lnav-error:{"level":"warning","message":{"str":"unexpected value for property “/#”","attrs":[{"start":33,"end":35,"type":"role","value":49}]},"reason":{"str":"","attrs":[]},"snippets":[{"source":"arg","line":1,"content":{"str":"[1, 2, 3]","attrs":[{"start":0,"end":-1,"type":"role","value":42}]}}],"notes":[],"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":64},{"start":23,"end":29,"type":"role","value":49},{"start":33,"end":41,"type":"role","value":49},{"start":45,"end":53,"type":"role","value":49},{"start":57,"end":61,"type":"role","value":49},{"start":65,"end":69,"type":"role","value":49},{"start":73,"end":77,"type":"role","value":49},{"start":81,"end":86,"type":"role","value":49},{"start":90,"end":100,"type":"role","value":49},{"start":100,"end":101,"type":"role","value":49},{"start":105,"end":113,"type":"role","value":49}]}}

@ -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":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":[],"notes":[],"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":49},{"start":21,"end":23,"type":"role","value":48},{"start":25,"end":28,"type":"role","value":48},{"start":8,"end":29,"type":"role","value":65}]},"reason":{"str":"regular expression does not have any captures","attrs":[]},"snippets":[],"notes":[],"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":52}]},"reason":{"str":"Port number was not a decimal number between 0 and 65535","attrs":[]},"snippets":[],"notes":[],"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":56}]},"reason":{"str":"Port number was not a decimal number between 0 and 65535","attrs":[]},"snippets":[],"notes":[],"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":41}]}}],"notes":[],"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":42}]}}],"notes":[],"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":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":[],"notes":[],"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":49},{"start":18,"end":22,"type":"role","value":48},{"start":24,"end":29,"type":"role","value":48},{"start":8,"end":30,"type":"role","value":65}]},"reason":{"str":"unable to parse time slice value: blah -- Unrecognized input","attrs":[]},"snippets":[],"notes":[],"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":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":[],"notes":[],"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":49},{"start":18,"end":22,"type":"role","value":48},{"start":24,"end":29,"type":"role","value":48},{"start":8,"end":30,"type":"role","value":65}]},"reason":{"str":"no time slice value given","attrs":[]},"snippets":[],"notes":[],"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":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}]}}],"notes":[],"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":42},{"start":11,"end":13,"type":"role","value":79},{"start":13,"end":35,"type":"role","value":5},{"start":6,"end":35,"type":"role","value":42},{"start":35,"end":35,"type":"role","value":42}]}}],"notes":[],"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":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}]}}],"notes":[],"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":42},{"start":8,"end":10,"type":"role","value":79},{"start":10,"end":41,"type":"role","value":5},{"start":5,"end":41,"type":"role","value":42},{"start":41,"end":41,"type":"role","value":42}]}}],"notes":[],"help":{"str":"","attrs":[]}}

Loading…
Cancel
Save