[file_collection] handle large file counts better

pull/1205/head
Tim Stack 9 months ago
parent 6fdb56cd4e
commit 01c973868d

@ -165,9 +165,10 @@ status bar.
* - Keypress
- Description
* - :kbd:`\``
- Focus on the breadcrumb bar.
* - :kbd:`ENTER`
- Focus on the breadcrumb bar. Or, if the bar is currently focused,
accept the selected value and drop focus.
- If the bar is currently focused, accept the selected value and drop focus.
* - :kbd:`Escape`
- Drop focus on the breadcrumb bar.
* - :kbd:`←`

@ -290,18 +290,17 @@ struct same_file {
* @param fd An already-opened descriptor for 'filename'.
* @param required Specifies whether or not the file must exist and be valid.
*/
std::future<file_collection>
nonstd::optional<std::future<file_collection>>
file_collection::watch_logfile(const std::string& filename,
logfile_open_options& loo,
bool required)
{
file_collection retval;
struct stat st;
int rc;
auto filename_key = loo.loo_filename.empty() ? filename : loo.loo_filename;
if (this->fc_closed_files.count(filename)) {
return lnav::futures::make_ready_future(std::move(retval));
return nonstd::nullopt;
}
if (loo.loo_temp_file) {
@ -320,20 +319,23 @@ file_collection::watch_logfile(const std::string& filename,
if (this->fc_file_names.find(wilddir) == this->fc_file_names.end())
{
file_collection retval;
retval.fc_file_names.emplace(
wilddir,
logfile_open_options()
.with_non_utf_visibility(false)
.with_visible_size_limit(256 * 1024));
return lnav::futures::make_ready_future(std::move(retval));
}
return lnav::futures::make_ready_future(std::move(retval));
return nonstd::nullopt;
}
if (!S_ISREG(st.st_mode)) {
if (required) {
rc = -1;
errno = EINVAL;
} else {
return lnav::futures::make_ready_future(std::move(retval));
return nonstd::nullopt;
}
}
{
@ -353,14 +355,16 @@ file_collection::watch_logfile(const std::string& filename,
log_error("failed to open required file: %s -- %s",
filename.c_str(),
strerror(errno));
file_collection retval;
retval.fc_name_to_errors->writeAccess()->emplace(
filename,
file_error_info{
time(nullptr),
std::string(strerror(errno)),
});
return lnav::futures::make_ready_future(std::move(retval));
}
return lnav::futures::make_ready_future(std::move(retval));
return nonstd::nullopt;
}
if (this->fc_new_stats | lnav::itertools::find_if([&st](const auto& elem) {
@ -369,7 +373,7 @@ file_collection::watch_logfile(const std::string& filename,
{
// this file is probably a link that we have already scanned in this
// pass.
return lnav::futures::make_ready_future(std::move(retval));
return nonstd::nullopt;
}
this->fc_new_stats.emplace_back(st);
@ -379,7 +383,7 @@ file_collection::watch_logfile(const std::string& filename,
if (file_iter == this->fc_files.end()) {
if (this->fc_other_files.find(filename) != this->fc_other_files.end()) {
return lnav::futures::make_ready_future(std::move(retval));
return nonstd::nullopt;
}
require(this->fc_progress.get() != nullptr);
@ -566,10 +570,13 @@ file_collection::watch_logfile(const std::string& filename,
/* The file is already loaded, but has been found under a different
* name. We just need to update the stored file name.
*/
file_collection retval;
retval.fc_renamed_files.emplace_back(lf, filename);
return lnav::futures::make_ready_future(std::move(retval));
}
return lnav::futures::make_ready_future(std::move(retval));
return nonstd::nullopt;
}
/**
@ -701,11 +708,15 @@ file_collection::expand_filename(
}
if (required || access(iter->second.c_str(), R_OK) == 0) {
if (fq.push_back(watch_logfile(iter->second, loo, required))
== lnav::futures::future_queue<
file_collection>::processor_result_t::interrupt)
{
break;
auto future_opt = watch_logfile(iter->second, loo, required);
if (future_opt) {
auto fut = std::move(future_opt.value());
if (fq.push_back(std::move(fut))
== lnav::futures::future_queue<
file_collection>::processor_result_t::interrupt)
{
break;
}
}
}
}
@ -727,8 +738,9 @@ file_collection::rescan_files(bool required)
log_error("unknown exception thrown by rescan future");
}
if (this->fc_files.size() + retval.fc_files.size()
< get_limits().l_open_files)
if (retval.fc_files.size() < 100
&& this->fc_files.size() + retval.fc_files.size()
< get_limits().l_open_files)
{
return lnav::futures::future_queue<
file_collection>::processor_result_t::ok;

@ -55,6 +55,11 @@ struct tailer_progress {
struct scan_progress {
std::list<archive_manager::extract_progress> sp_extractions;
std::map<std::string, tailer_progress> sp_tailers;
bool empty() const
{
return this->sp_extractions.empty() && this->sp_tailers.empty();
}
};
using safe_scan_progress = safe::Safe<scan_progress>;
@ -175,6 +180,14 @@ struct file_collection {
file_collection copy();
bool empty() const
{
return this->fc_name_to_errors->readAccess()->empty()
&& this->fc_file_names.empty() && this->fc_files.empty()
&& this->fc_progress->readAccess()->empty()
&& this->fc_other_files.empty();
}
void clear()
{
this->fc_name_to_errors->writeAccess()->clear();
@ -197,9 +210,8 @@ struct file_collection {
logfile_open_options& loo,
bool required);
std::future<file_collection> watch_logfile(const std::string& filename,
logfile_open_options& loo,
bool required);
nonstd::optional<std::future<file_collection>> watch_logfile(
const std::string& filename, logfile_open_options& loo, bool required);
void merge(file_collection& other);

@ -302,7 +302,8 @@ handle_paging_key(int ch)
} else {
alerter::singleton().chime("no more search hits to the right");
}
} break;
break;
}
case '<':
if (tc->get_left() == 0) {
@ -726,19 +727,6 @@ handle_paging_key(int ch)
}
break;
case 'T':
if (text_accel_p != nullptr
&& text_accel_p->is_time_offset_supported())
{
text_accel_p->toggle_time_offset();
if (text_accel_p->is_time_offset_enabled()) {
lnav_data.ld_rl_view->set_alt_value(HELP_MSG_2(
s, S, "to move forward/backward through slow downs"));
}
tc->reload_data();
}
break;
case 'I': {
auto& hist_tc = lnav_data.ld_views[LNV_HISTOGRAM];
@ -916,15 +904,6 @@ handle_paging_key(int ch)
}
break;
case 'x':
if (tc->toggle_hide_fields()) {
lnav_data.ld_rl_view->set_value("Showing hidden fields");
} else {
lnav_data.ld_rl_view->set_value("Hiding hidden fields");
}
tc->set_needs_update();
break;
case 'r':
case 'R':
if (lss != nullptr) {
@ -976,13 +955,6 @@ handle_paging_key(int ch)
}
break;
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'):
lnav_data.ld_preview_hidden = !lnav_data.ld_preview_hidden;
break;

@ -13,7 +13,8 @@
"keymap_def_clear": "Press ${ansi_bold}C${ansi_norm} to clear marked messages",
"keymap_def_prev_location": "Press ${ansi_bold}{${ansi_norm} to move to the previous location in history",
"keymap_def_next_location": "Press ${ansi_bold}}${ansi_norm} to move to the next location in history",
"keymap_def_next_mark": "Press ${ansi_bold}c${ansi_norm} to copy marked lines to the clipboard; press ${ansi_bold}C${ansi_norm} to clear marked lines"
"keymap_def_next_mark": "Press ${ansi_bold}c${ansi_norm} to copy marked lines to the clipboard; press ${ansi_bold}C${ansi_norm} to clear marked lines",
"keymap_def_time_offset": "Press ${ansi_bold}s${ansi_norm}/${ansi_bold}S${ansi_norm} to move forward/backward through slow downs"
},
"ui": {
"keymap-defs": {
@ -131,9 +132,19 @@
"command": ":next-mark search",
"alt-msg": "${keymap_def_scroll_horiz}"
},
"x54": {
"command": ";UPDATE lnav_views SET options = json_set(options, '$.row-time-offset', CASE jget(options, '/row-time-offset', 'hide') WHEN 'hide' THEN 'show' ELSE 'hide' END) WHERE name = (SELECT name FROM lnav_top_view)",
"alt-msg": "${keymap_def_time_offset}"
},
"x70": {
"command": ";UPDATE lnav_views SET options = json_set(options, '$.row-details', CASE jget(options, '/row-details', 'hide') WHEN 'hide' THEN 'show' ELSE 'hide' END) WHERE name = (SELECT name FROM lnav_top_view)"
},
"x78": {
"command": ";UPDATE lnav_views SET options = json_set(options, '$.hidden-fields', CASE jget(options, '/hidden-fields', 'hide') WHEN 'hide' THEN 'show' ELSE 'hide' END) WHERE name = (SELECT name FROM lnav_top_view)"
},
"x17": {
"command": ";UPDATE lnav_views SET options = json_set(options, '$.word-wrap', CASE jget(options, '/word-wrap', 'none') WHEN 'none' THEN 'normal' ELSE 'none' END) WHERE name = (SELECT name FROM lnav_top_view)"
},
"x75": {
"command": ":next-mark",
"alt-msg": "${keymap_def_next_mark}"

@ -1564,15 +1564,12 @@ looper()
== std::future_status::ready)
{
auto new_files = rescan_future.get();
if (!initial_rescan_completed && new_files.fc_file_names.empty()
&& new_files.fc_files.empty()
&& lnav_data.ld_active_files.fc_progress->readAccess()
->sp_tailers.empty())
{
if (!initial_rescan_completed && new_files.empty()) {
initial_rescan_completed = true;
log_debug("initial rescan rebuild");
changes += rebuild_indexes(loop_deadline);
auto rebuild_res = rebuild_indexes(loop_deadline);
changes += rebuild_res.rir_changes;
load_session();
if (session_data.sd_save_time) {
std::string ago;
@ -1630,7 +1627,8 @@ looper()
if (initial_rescan_completed) {
if (ui_now >= next_rebuild_time) {
auto text_file_count = lnav_data.ld_text_source.size();
changes += rebuild_indexes(loop_deadline);
auto rebuild_res = rebuild_indexes(loop_deadline);
changes += rebuild_res.rir_changes;
if (!changes && ui_clock::now() < loop_deadline) {
next_rebuild_time = ui_clock::now() + 333ms;
}
@ -1861,15 +1859,8 @@ looper()
timer.start_fade(index_counter, 3);
}
// log_debug("initial build rebuild");
changes += rebuild_indexes(loop_deadline);
if (!lnav_data.ld_initial_build
&& lnav_data.ld_log_source.text_line_count() == 0
&& lnav_data.ld_text_source.text_line_count() > 0)
{
ensure_view(&lnav_data.ld_views[LNV_TEXT]);
lnav_data.ld_rl_view->set_alt_value(HELP_MSG_2(
f, F, "to switch to the next/previous file"));
}
auto rebuild_res = rebuild_indexes(loop_deadline);
changes += rebuild_res.rir_changes;
if (lnav_data.ld_view_stack.top().value_or(nullptr)
== &lnav_data.ld_views[LNV_TEXT]
&& lnav_data.ld_text_source.empty()
@ -1905,9 +1896,10 @@ looper()
{
lnav_data.ld_initial_build = true;
}
if (lnav_data.ld_log_source.text_line_count() > 0
|| lnav_data.ld_text_source.text_line_count() > 0
|| !lnav_data.ld_active_files.fc_other_files.empty())
if (rebuild_res.rir_completed
&& (lnav_data.ld_log_source.text_line_count() > 0
|| lnav_data.ld_text_source.text_line_count() > 0
|| !lnav_data.ld_active_files.fc_other_files.empty()))
{
lnav_data.ld_initial_build = true;
}
@ -1945,7 +1937,7 @@ looper()
}
}
if (session_stage == 1
if (session_stage == 1 && lnav_data.ld_initial_build
&& (lnav_data.ld_active_files.fc_file_names.empty()
|| lnav_data.ld_log_source.text_line_count() > 0
|| lnav_data.ld_text_source.text_line_count() > 0
@ -1953,6 +1945,14 @@ looper()
{
lnav::session::restore_view_states();
if (lnav_data.ld_mode == ln_mode_t::FILES) {
if (lnav_data.ld_log_source.text_line_count() == 0
&& lnav_data.ld_text_source.text_line_count() > 0)
{
log_debug("no logs, just text...");
ensure_view(&lnav_data.ld_views[LNV_TEXT]);
lnav_data.ld_rl_view->set_alt_value(HELP_MSG_2(
f, F, "to switch to the next/previous file"));
}
if (lnav_data.ld_active_files.fc_name_to_errors
->readAccess()
->empty())
@ -2004,10 +2004,10 @@ looper()
}
if (lnav_data.ld_sigint_count > 0) {
bool found_piper = false;
lnav_data.ld_sigint_count = 0;
if (lnav_data.ld_view_stack.empty()) {
lnav_data.ld_looping = false;
} else {
if (!lnav_data.ld_view_stack.empty()) {
auto* tc = *lnav_data.ld_view_stack.top();
if (tc->get_inner_height() > 0_vl) {
@ -2018,7 +2018,6 @@ looper()
auto& sa = rows[0].get_attrs();
auto line_attr_opt
= get_string_attr(sa, logline::L_FILE);
bool found = false;
if (line_attr_opt) {
auto lf = line_attr_opt.value().get();
@ -2035,15 +2034,15 @@ looper()
if (lf->get_filename() == cp_name.value()) {
log_debug("found it, sending signal!");
cp.send_sigint();
found = true;
found_piper = true;
}
}
}
if (!found) {
lnav_data.ld_looping = false;
}
}
}
if (!found_piper) {
lnav_data.ld_looping = false;
}
}
}
} catch (readline_curses::error& e) {

@ -188,14 +188,14 @@ public:
bool did_promotion{false};
};
size_t
rebuild_indexes_result_t
rebuild_indexes(nonstd::optional<ui_clock::time_point> deadline)
{
logfile_sub_source& lss = lnav_data.ld_log_source;
textview_curses& log_view = lnav_data.ld_views[LNV_LOG];
textview_curses& text_view = lnav_data.ld_views[LNV_TEXT];
bool scroll_downs[LNV__MAX];
size_t retval = 0;
rebuild_indexes_result_t retval;
for (auto lpc : {LNV_LOG, LNV_TEXT}) {
auto& view = lnav_data.ld_views[lpc];
@ -220,9 +220,13 @@ rebuild_indexes(nonstd::optional<ui_clock::time_point> deadline)
auto* tss = &lnav_data.ld_text_source;
textfile_callback cb;
if (tss->rescan_files(cb, deadline)) {
auto rescan_res = tss->rescan_files(cb, deadline);
if (rescan_res.rr_new_data) {
text_view.reload_data();
retval += 1;
retval.rir_changes += rescan_res.rr_new_data;
}
if (!rescan_res.rr_scan_completed) {
retval.rir_completed = false;
}
if (cb.front_file != nullptr) {
@ -333,7 +337,7 @@ rebuild_indexes(nonstd::optional<ui_clock::time_point> deadline)
}
}
retval += 1;
retval.rir_changes += 1;
}
for (auto lpc : {LNV_LOG, LNV_TEXT}) {
@ -362,7 +366,7 @@ rebuild_indexes(nonstd::optional<ui_clock::time_point> deadline)
}
}
if (retval > 0) {
if (retval.rir_changes > 0) {
auto* tss = tc->get_sub_source();
lnav_data.ld_filter_status_source.update_filtered(tss);
lnav_data.ld_scroll_broadcaster(tc);
@ -375,7 +379,9 @@ rebuild_indexes(nonstd::optional<ui_clock::time_point> deadline)
void
rebuild_indexes_repeatedly()
{
for (size_t attempt = 0; attempt < 10 && rebuild_indexes() > 0; attempt++) {
for (size_t attempt = 0; attempt < 10 && rebuild_indexes().rir_changes > 0;
attempt++)
{
log_info("continuing to rebuild indexes...");
}
}

@ -35,8 +35,14 @@
#include "optional.hpp"
void rebuild_hist();
size_t rebuild_indexes(nonstd::optional<ui_clock::time_point> deadline
= nonstd::nullopt);
struct rebuild_indexes_result_t {
size_t rir_changes{0};
bool rir_completed{true};
};
rebuild_indexes_result_t rebuild_indexes(
nonstd::optional<ui_clock::time_point> deadline = nonstd::nullopt);
void rebuild_indexes_repeatedly();
bool rescan_files(bool required = false);
bool update_active_files(file_collection& new_files);

@ -603,7 +603,7 @@ textfile_sub_source::text_crumbs_for_line(
}
}
bool
textfile_sub_source::rescan_result_t
textfile_sub_source::rescan_files(
textfile_sub_source::scan_callback& callback,
nonstd::optional<ui_clock::time_point> deadline)
@ -611,7 +611,7 @@ textfile_sub_source::rescan_files(
static auto& lnav_db = injector::get<auto_sqlite3&>();
file_iterator iter;
bool retval = false;
rescan_result_t retval;
if (this->tss_view == nullptr || this->tss_view->is_paused()) {
return retval;
@ -619,6 +619,12 @@ textfile_sub_source::rescan_files(
std::vector<std::shared_ptr<logfile>> closed_files;
for (iter = this->tss_files.begin(); iter != this->tss_files.end();) {
if (deadline && ui_clock::now() > deadline.value()) {
log_info("rescan_files() deadline reached, breaking...");
retval.rr_scan_completed = false;
break;
}
std::shared_ptr<logfile> lf = (*iter);
if (lf->is_closed()) {
@ -644,10 +650,17 @@ textfile_sub_source::rescan_files(
continue;
}
if (!this->tss_completed_last_scan && lf->size() > 0) {
++iter;
continue;
}
bool new_data = false;
switch (new_text_data) {
case logfile::rebuild_result_t::NEW_LINES:
case logfile::rebuild_result_t::NEW_ORDER:
retval = true;
new_data = true;
retval.rr_new_data += 1;
break;
default:
break;
@ -774,7 +787,7 @@ textfile_sub_source::rescan_files(
continue;
}
if (!retval && lf->is_indexing()
if (!new_data && lf->is_indexing()
&& lf->get_text_format() != text_format_t::TF_BINARY)
{
auto ms_iter = this->tss_doc_metadata.find(lf->get_filename());
@ -851,9 +864,10 @@ textfile_sub_source::rescan_files(
callback.closed_files(closed_files);
}
if (retval) {
if (retval.rr_new_data) {
this->tss_view->search_new_data();
}
this->tss_completed_last_scan = retval.rr_scan_completed;
return retval;
}

@ -117,9 +117,14 @@ public:
virtual void scanned_file(const std::shared_ptr<logfile>& lf) = 0;
};
bool rescan_files(scan_callback& callback,
nonstd::optional<ui_clock::time_point> deadline
= nonstd::nullopt);
struct rescan_result_t {
size_t rr_new_data{0};
bool rr_scan_completed{true};
};
rescan_result_t rescan_files(scan_callback& callback,
nonstd::optional<ui_clock::time_point> deadline
= nonstd::nullopt);
void text_filters_changed() override;
@ -182,6 +187,7 @@ private:
std::unordered_map<std::string, rendered_file> tss_rendered_files;
std::unordered_map<std::string, metadata_state> tss_doc_metadata;
size_t tss_line_indent_size{0};
bool tss_completed_last_scan{true};
};
#endif

@ -721,6 +721,14 @@ public:
bool get_hide_fields() const { return this->tc_hide_fields; }
void set_hide_fields(bool val)
{
if (this->tc_hide_fields != val) {
this->tc_hide_fields = val;
this->set_needs_update();
}
}
void execute_search(const std::string& regex_orig);
void redo_search();

@ -178,14 +178,25 @@ enum class row_details_t {
show,
};
enum class word_wrap_t {
none,
normal,
};
struct view_options {
nonstd::optional<row_details_t> vo_row_details;
nonstd::optional<row_details_t> vo_row_time_offset;
nonstd::optional<int32_t> vo_overlay_focus;
nonstd::optional<word_wrap_t> vo_word_wrap;
nonstd::optional<row_details_t> vo_hidden_fields;
bool empty() const
{
return !this->vo_row_details.has_value()
&& !this->vo_overlay_focus.has_value();
&& !this->vo_row_time_offset.has_value()
&& !this->vo_overlay_focus.has_value()
&& !this->vo_word_wrap.has_value()
&& !this->vo_hidden_fields.has_value();
}
};
@ -196,15 +207,36 @@ static const json_path_handler_base::enum_value_t ROW_DETAILS_ENUM[] = {
json_path_handler_base::ENUM_TERMINATOR,
};
static const json_path_handler_base::enum_value_t WORD_WRAP_ENUM[] = {
{"none", word_wrap_t::none},
{"normal", word_wrap_t::normal},
json_path_handler_base::ENUM_TERMINATOR,
};
static const typed_json_path_container<view_options> view_options_handlers = {
yajlpp::property_handler("row-details")
.with_enum_values(ROW_DETAILS_ENUM)
.with_description(
"Show or hide the details overlay for the focused row")
.for_field(&view_options::vo_row_details),
yajlpp::property_handler("row-time-offset")
.with_enum_values(ROW_DETAILS_ENUM)
.with_description(
"Show or hide the time-offset from a row to the previous mark")
.for_field(&view_options::vo_row_time_offset),
yajlpp::property_handler("hidden-fields")
.with_enum_values(ROW_DETAILS_ENUM)
.with_description(
"Show or hide fields that have been hidden by the user")
.for_field(&view_options::vo_hidden_fields),
yajlpp::property_handler("overlay-focused-line")
.with_description("The focused line in an overlay")
.for_field(&view_options::vo_overlay_focus),
yajlpp::property_handler("word-wrap")
.with_enum_values(WORD_WRAP_ENUM)
.with_description("How to break long lines")
.for_field(&view_options::vo_word_wrap),
};
struct lnav_views : public tvt_iterator_cursor<lnav_views> {
@ -380,8 +412,15 @@ CREATE TABLE lnav_views (
sqlite3_result_int(ctx, (int) tc.get_selection());
break;
case 13: {
auto* text_accel_p
= dynamic_cast<text_accel_source*>(tc.get_sub_source());
auto vo = view_options{};
vo.vo_word_wrap = tc.get_word_wrap() ? word_wrap_t::normal
: word_wrap_t::none;
vo.vo_hidden_fields = tc.get_hide_fields()
? row_details_t::hide
: row_details_t::show;
if (tc.get_overlay_source()) {
auto ov_sel = tc.get_overlay_selection();
@ -393,6 +432,12 @@ CREATE TABLE lnav_views (
vo.vo_overlay_focus = ov_sel.value();
}
}
if (text_accel_p != nullptr) {
vo.vo_row_time_offset
= text_accel_p->is_time_offset_enabled()
? row_details_t::show
: row_details_t::hide;
}
if (vo.empty()) {
sqlite3_result_null(ctx);
@ -440,6 +485,8 @@ CREATE TABLE lnav_views (
auto& tc = lnav_data.ld_views[index];
auto* time_source
= dynamic_cast<text_time_translator*>(tc.get_sub_source());
auto* text_accel_p
= dynamic_cast<text_accel_source*>(tc.get_sub_source());
view_options vo;
if (options) {
@ -590,6 +637,23 @@ CREATE TABLE lnav_views (
if (vo.vo_overlay_focus && tc.get_overlay_source()) {
tc.set_overlay_selection(vis_line_t(vo.vo_overlay_focus.value()));
}
if (vo.vo_word_wrap) {
tc.set_word_wrap(vo.vo_word_wrap.value() == word_wrap_t::normal);
}
if (vo.vo_hidden_fields) {
tc.set_hide_fields(vo.vo_hidden_fields.value()
== row_details_t::hide);
}
if (text_accel_p != nullptr && vo.vo_row_time_offset) {
switch (vo.vo_row_time_offset.value()) {
case row_details_t::show:
text_accel_p->set_time_offset(true);
break;
case row_details_t::hide:
text_accel_p->set_time_offset(false);
break;
}
}
tc.set_left(left);
tc.set_paused(is_paused);
tc.execute_search(search);

@ -4476,6 +4476,10 @@
"command": ";UPDATE lnav_views SET top = top - (height / 2), selection = (CASE movement WHEN 'top' THEN selection ELSE top - (height / 2) + (selection - top) END) WHERE name = (SELECT name FROM lnav_top_view)",
"alt-msg": ""
},
"x17": {
"command": ";UPDATE lnav_views SET options = json_set(options, '$.word-wrap', CASE jget(options, '/word-wrap', 'none') WHEN 'none' THEN 'normal' ELSE 'none' END) WHERE name = (SELECT name FROM lnav_top_view)",
"alt-msg": ""
},
"x18": {
"command": ";UPDATE lnav_views SET movement = (CASE movement WHEN 'top' THEN 'cursor' ELSE 'top' END) WHERE name = (SELECT name FROM lnav_top_view)",
"alt-msg": ""
@ -4568,6 +4572,10 @@
"command": "|lnav-pop-view ${keyseq}",
"alt-msg": ""
},
"x54": {
"command": ";UPDATE lnav_views SET options = json_set(options, '$.row-time-offset', CASE jget(options, '/row-time-offset', 'hide') WHEN 'hide' THEN 'show' ELSE 'hide' END) WHERE name = (SELECT name FROM lnav_top_view)",
"alt-msg": "${keymap_def_time_offset}"
},
"x55": {
"command": ":prev-mark",
"alt-msg": ""
@ -4628,6 +4636,10 @@
"command": ":next-mark warning",
"alt-msg": "${keymap_def_alt_hour_boundary}"
},
"x78": {
"command": ";UPDATE lnav_views SET options = json_set(options, '$.hidden-fields', CASE jget(options, '/hidden-fields', 'hide') WHEN 'hide' THEN 'show' ELSE 'hide' END) WHERE name = (SELECT name FROM lnav_top_view)",
"alt-msg": ""
},
"x7b": {
"command": ":prev-location",
"alt-msg": "${keymap_def_next_location}"
@ -4828,6 +4840,7 @@
"keymap_def_prev_location": "Press ${ansi_bold}{${ansi_norm} to move to the previous location in history",
"keymap_def_scroll_horiz": "Press \\'${ansi_bold}>${ansi_norm}\\' or \\'${ansi_bold}<${ansi_norm}\\' to scroll horizontally to a search result",
"keymap_def_text_view": "Press ${ansi_bold}t${ansi_norm} to switch to the text view",
"keymap_def_time_offset": "Press ${ansi_bold}s${ansi_norm}/${ansi_bold}S${ansi_norm} to move forward/backward through slow downs",
"keymap_def_zoom": "Press ${ansi_bold}z${ansi_norm}/${ansi_bold}Z${ansi_norm} to zoom in/out"
}
}

@ -10,6 +10,7 @@
/global/keymap_def_prev_location -> default-keymap.json:14
/global/keymap_def_scroll_horiz -> default-keymap.json:6
/global/keymap_def_text_view -> default-keymap.json:10
/global/keymap_def_time_offset -> default-keymap.json:17
/global/keymap_def_zoom -> default-keymap.json:12
/log/annotations/com.vmware.vmacore.backtrace/condition -> root-config.json:20
/log/annotations/com.vmware.vmacore.backtrace/description -> root-config.json:19
@ -68,65 +69,69 @@
/ui/keymap-defs/de/x37/command -> de-keymap.json:25
/ui/keymap-defs/de/x38/command -> de-keymap.json:28
/ui/keymap-defs/de/xc2xa7/command -> de-keymap.json:37
/ui/keymap-defs/default/x04/command -> default-keymap.json:76
/ui/keymap-defs/default/x06/command -> default-keymap.json:64
/ui/keymap-defs/default/x0c/command -> default-keymap.json:67
/ui/keymap-defs/default/x12/command -> default-keymap.json:70
/ui/keymap-defs/default/x15/command -> default-keymap.json:79
/ui/keymap-defs/default/x18/command -> default-keymap.json:73
/ui/keymap-defs/default/x21/command -> default-keymap.json:46
/ui/keymap-defs/default/x23/command -> default-keymap.json:52
/ui/keymap-defs/default/x24/command -> default-keymap.json:55
/ui/keymap-defs/default/x25/command -> default-keymap.json:58
/ui/keymap-defs/default/x2f/command -> default-keymap.json:94
/ui/keymap-defs/default/x31/command -> default-keymap.json:22
/ui/keymap-defs/default/x32/command -> default-keymap.json:25
/ui/keymap-defs/default/x33/command -> default-keymap.json:28
/ui/keymap-defs/default/x34/command -> default-keymap.json:31
/ui/keymap-defs/default/x35/command -> default-keymap.json:34
/ui/keymap-defs/default/x36/command -> default-keymap.json:37
/ui/keymap-defs/default/x37/command -> default-keymap.json:40
/ui/keymap-defs/default/x38/command -> default-keymap.json:43
/ui/keymap-defs/default/x3a/command -> default-keymap.json:88
/ui/keymap-defs/default/x3b/command -> default-keymap.json:97
/ui/keymap-defs/default/x3d/command -> default-keymap.json:82
/ui/keymap-defs/default/x3f/command -> default-keymap.json:153
/ui/keymap-defs/default/x40/command -> default-keymap.json:49
/ui/keymap-defs/default/x45/alt-msg -> default-keymap.json:101
/ui/keymap-defs/default/x45/command -> default-keymap.json:100
/ui/keymap-defs/default/x4e/alt-msg -> default-keymap.json:128
/ui/keymap-defs/default/x4e/command -> default-keymap.json:127
/ui/keymap-defs/default/x50/alt-msg -> default-keymap.json:161
/ui/keymap-defs/default/x50/command -> default-keymap.json:160
/ui/keymap-defs/default/x51/command -> default-keymap.json:170
/ui/keymap-defs/default/x55/command -> default-keymap.json:142
/ui/keymap-defs/default/x57/alt-msg -> default-keymap.json:109
/ui/keymap-defs/default/x57/command -> default-keymap.json:108
/ui/keymap-defs/default/x58/command -> default-keymap.json:85
/ui/keymap-defs/default/x5e/command -> default-keymap.json:61
/ui/keymap-defs/default/x63/alt-msg -> default-keymap.json:117
/ui/keymap-defs/default/x63/command -> default-keymap.json:116
/ui/keymap-defs/default/x65/alt-msg -> default-keymap.json:105
/ui/keymap-defs/default/x65/command -> default-keymap.json:104
/ui/keymap-defs/default/x67/command -> default-keymap.json:120
/ui/keymap-defs/default/x69/alt-msg -> default-keymap.json:157
/ui/keymap-defs/default/x69/command -> default-keymap.json:156
/ui/keymap-defs/default/x6d/alt-msg -> default-keymap.json:124
/ui/keymap-defs/default/x6d/command -> default-keymap.json:123
/ui/keymap-defs/default/x6e/alt-msg -> default-keymap.json:132
/ui/keymap-defs/default/x6e/command -> default-keymap.json:131
/ui/keymap-defs/default/x70/command -> default-keymap.json:135
/ui/keymap-defs/default/x71/command -> default-keymap.json:167
/ui/keymap-defs/default/x75/alt-msg -> default-keymap.json:139
/ui/keymap-defs/default/x75/command -> default-keymap.json:138
/ui/keymap-defs/default/x76/command -> default-keymap.json:164
/ui/keymap-defs/default/x77/alt-msg -> default-keymap.json:113
/ui/keymap-defs/default/x77/command -> default-keymap.json:112
/ui/keymap-defs/default/x7b/alt-msg -> default-keymap.json:150
/ui/keymap-defs/default/x7b/command -> default-keymap.json:149
/ui/keymap-defs/default/x7c/command -> default-keymap.json:91
/ui/keymap-defs/default/x7d/alt-msg -> default-keymap.json:146
/ui/keymap-defs/default/x7d/command -> default-keymap.json:145
/ui/keymap-defs/default/x04/command -> default-keymap.json:77
/ui/keymap-defs/default/x06/command -> default-keymap.json:65
/ui/keymap-defs/default/x0c/command -> default-keymap.json:68
/ui/keymap-defs/default/x12/command -> default-keymap.json:71
/ui/keymap-defs/default/x15/command -> default-keymap.json:80
/ui/keymap-defs/default/x17/command -> default-keymap.json:146
/ui/keymap-defs/default/x18/command -> default-keymap.json:74
/ui/keymap-defs/default/x21/command -> default-keymap.json:47
/ui/keymap-defs/default/x23/command -> default-keymap.json:53
/ui/keymap-defs/default/x24/command -> default-keymap.json:56
/ui/keymap-defs/default/x25/command -> default-keymap.json:59
/ui/keymap-defs/default/x2f/command -> default-keymap.json:95
/ui/keymap-defs/default/x31/command -> default-keymap.json:23
/ui/keymap-defs/default/x32/command -> default-keymap.json:26
/ui/keymap-defs/default/x33/command -> default-keymap.json:29
/ui/keymap-defs/default/x34/command -> default-keymap.json:32
/ui/keymap-defs/default/x35/command -> default-keymap.json:35
/ui/keymap-defs/default/x36/command -> default-keymap.json:38
/ui/keymap-defs/default/x37/command -> default-keymap.json:41
/ui/keymap-defs/default/x38/command -> default-keymap.json:44
/ui/keymap-defs/default/x3a/command -> default-keymap.json:89
/ui/keymap-defs/default/x3b/command -> default-keymap.json:98
/ui/keymap-defs/default/x3d/command -> default-keymap.json:83
/ui/keymap-defs/default/x3f/command -> default-keymap.json:164
/ui/keymap-defs/default/x40/command -> default-keymap.json:50
/ui/keymap-defs/default/x45/alt-msg -> default-keymap.json:102
/ui/keymap-defs/default/x45/command -> default-keymap.json:101
/ui/keymap-defs/default/x4e/alt-msg -> default-keymap.json:129
/ui/keymap-defs/default/x4e/command -> default-keymap.json:128
/ui/keymap-defs/default/x50/alt-msg -> default-keymap.json:172
/ui/keymap-defs/default/x50/command -> default-keymap.json:171
/ui/keymap-defs/default/x51/command -> default-keymap.json:181
/ui/keymap-defs/default/x54/alt-msg -> default-keymap.json:137
/ui/keymap-defs/default/x54/command -> default-keymap.json:136
/ui/keymap-defs/default/x55/command -> default-keymap.json:153
/ui/keymap-defs/default/x57/alt-msg -> default-keymap.json:110
/ui/keymap-defs/default/x57/command -> default-keymap.json:109
/ui/keymap-defs/default/x58/command -> default-keymap.json:86
/ui/keymap-defs/default/x5e/command -> default-keymap.json:62
/ui/keymap-defs/default/x63/alt-msg -> default-keymap.json:118
/ui/keymap-defs/default/x63/command -> default-keymap.json:117
/ui/keymap-defs/default/x65/alt-msg -> default-keymap.json:106
/ui/keymap-defs/default/x65/command -> default-keymap.json:105
/ui/keymap-defs/default/x67/command -> default-keymap.json:121
/ui/keymap-defs/default/x69/alt-msg -> default-keymap.json:168
/ui/keymap-defs/default/x69/command -> default-keymap.json:167
/ui/keymap-defs/default/x6d/alt-msg -> default-keymap.json:125
/ui/keymap-defs/default/x6d/command -> default-keymap.json:124
/ui/keymap-defs/default/x6e/alt-msg -> default-keymap.json:133
/ui/keymap-defs/default/x6e/command -> default-keymap.json:132
/ui/keymap-defs/default/x70/command -> default-keymap.json:140
/ui/keymap-defs/default/x71/command -> default-keymap.json:178
/ui/keymap-defs/default/x75/alt-msg -> default-keymap.json:150
/ui/keymap-defs/default/x75/command -> default-keymap.json:149
/ui/keymap-defs/default/x76/command -> default-keymap.json:175
/ui/keymap-defs/default/x77/alt-msg -> default-keymap.json:114
/ui/keymap-defs/default/x77/command -> default-keymap.json:113
/ui/keymap-defs/default/x78/command -> default-keymap.json:143
/ui/keymap-defs/default/x7b/alt-msg -> default-keymap.json:161
/ui/keymap-defs/default/x7b/command -> default-keymap.json:160
/ui/keymap-defs/default/x7c/command -> default-keymap.json:92
/ui/keymap-defs/default/x7d/alt-msg -> default-keymap.json:157
/ui/keymap-defs/default/x7d/command -> default-keymap.json:156
/ui/keymap-defs/fr/x22/command -> fr-keymap.json:13
/ui/keymap-defs/fr/x26/command -> fr-keymap.json:7
/ui/keymap-defs/fr/x27/command -> fr-keymap.json:16

Loading…
Cancel
Save