mirror of
https://github.com/tstack/lnav
synced 2024-11-01 21:40:34 +00:00
parent
3b0168025d
commit
a63cf003a0
@ -426,6 +426,7 @@ void filter_sub_source::rl_abort(readline_curses *rc)
|
|||||||
top_view->get_highlights().erase({highlight_source_t::PREVIEW, "preview"});
|
top_view->get_highlights().erase({highlight_source_t::PREVIEW, "preview"});
|
||||||
top_view->reload_data();
|
top_view->reload_data();
|
||||||
fs.delete_filter("");
|
fs.delete_filter("");
|
||||||
|
this->tss_view->reload_data();
|
||||||
this->fss_editor.set_visible(false);
|
this->fss_editor.set_visible(false);
|
||||||
this->fss_editing = false;
|
this->fss_editing = false;
|
||||||
this->tss_view->set_needs_update();
|
this->tss_view->set_needs_update();
|
||||||
|
@ -16,6 +16,7 @@ highlighter::highlighter(const highlighter &other)
|
|||||||
this->h_text_format = other.h_text_format;
|
this->h_text_format = other.h_text_format;
|
||||||
this->h_format_name = other.h_format_name;
|
this->h_format_name = other.h_format_name;
|
||||||
this->h_nestable = other.h_nestable;
|
this->h_nestable = other.h_nestable;
|
||||||
|
this->h_semantic = other.h_semantic;
|
||||||
}
|
}
|
||||||
|
|
||||||
highlighter &highlighter::operator=(const highlighter &other)
|
highlighter &highlighter::operator=(const highlighter &other)
|
||||||
@ -37,6 +38,7 @@ highlighter &highlighter::operator=(const highlighter &other)
|
|||||||
this->h_attrs = other.h_attrs;
|
this->h_attrs = other.h_attrs;
|
||||||
this->h_text_format = other.h_text_format;
|
this->h_text_format = other.h_text_format;
|
||||||
this->h_nestable = other.h_nestable;
|
this->h_nestable = other.h_nestable;
|
||||||
|
this->h_semantic = other.h_semantic;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -49,7 +51,7 @@ void highlighter::study()
|
|||||||
if (!this->h_code_extra && errptr) {
|
if (!this->h_code_extra && errptr) {
|
||||||
log_error("pcre_study error: %s", errptr);
|
log_error("pcre_study error: %s", errptr);
|
||||||
}
|
}
|
||||||
if (this->h_code_extra != NULL) {
|
if (this->h_code_extra != nullptr) {
|
||||||
pcre_extra *extra = this->h_code_extra;
|
pcre_extra *extra = this->h_code_extra;
|
||||||
|
|
||||||
extra->flags |= (PCRE_EXTRA_MATCH_LIMIT |
|
extra->flags |= (PCRE_EXTRA_MATCH_LIMIT |
|
||||||
@ -104,6 +106,10 @@ void highlighter::annotate(attr_line_t &al, int start) const
|
|||||||
if (this->h_attrs != -1) {
|
if (this->h_attrs != -1) {
|
||||||
attrs = this->h_attrs;
|
attrs = this->h_attrs;
|
||||||
}
|
}
|
||||||
|
if (this->h_semantic) {
|
||||||
|
attrs |= vc.attrs_for_ident(&line_start[lr.lr_start],
|
||||||
|
lr.length());
|
||||||
|
}
|
||||||
if (!this->h_fg.empty()) {
|
if (!this->h_fg.empty()) {
|
||||||
sa.emplace_back(lr,
|
sa.emplace_back(lr,
|
||||||
&view_curses::VC_FOREGROUND,
|
&view_curses::VC_FOREGROUND,
|
||||||
|
@ -40,12 +40,10 @@
|
|||||||
struct highlighter {
|
struct highlighter {
|
||||||
highlighter()
|
highlighter()
|
||||||
: h_code(nullptr),
|
: h_code(nullptr),
|
||||||
h_code_extra(nullptr),
|
h_code_extra(nullptr) { };
|
||||||
h_attrs(-1),
|
|
||||||
h_text_format(text_format_t::TF_UNKNOWN) { };
|
|
||||||
|
|
||||||
explicit highlighter(pcre *code)
|
explicit highlighter(pcre *code)
|
||||||
: h_code(code), h_attrs(-1), h_text_format(text_format_t::TF_UNKNOWN)
|
: h_code(code)
|
||||||
{
|
{
|
||||||
pcre_refcount(this->h_code, 1);
|
pcre_refcount(this->h_code, 1);
|
||||||
this->study();
|
this->study();
|
||||||
@ -107,6 +105,11 @@ struct highlighter {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
highlighter &with_semantic(bool val) {
|
||||||
|
this->h_semantic = val;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
int get_attrs() const
|
int get_attrs() const
|
||||||
{
|
{
|
||||||
ensure(this->h_attrs != -1);
|
ensure(this->h_attrs != -1);
|
||||||
@ -122,10 +125,11 @@ struct highlighter {
|
|||||||
rgb_color h_bg;
|
rgb_color h_bg;
|
||||||
pcre *h_code;
|
pcre *h_code;
|
||||||
pcre_extra *h_code_extra;
|
pcre_extra *h_code_extra;
|
||||||
int h_attrs;
|
int h_attrs{-1};
|
||||||
text_format_t h_text_format;
|
text_format_t h_text_format{text_format_t::TF_UNKNOWN};
|
||||||
intern_string_t h_format_name;
|
intern_string_t h_format_name;
|
||||||
bool h_nestable{true};
|
bool h_nestable{true};
|
||||||
|
bool h_semantic{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -150,6 +150,11 @@
|
|||||||
"title": "/ui/theme-defs/<theme_name>/syntax-styles/comment",
|
"title": "/ui/theme-defs/<theme_name>/syntax-styles/comment",
|
||||||
"$ref": "#/definitions/style"
|
"$ref": "#/definitions/style"
|
||||||
},
|
},
|
||||||
|
"doc-directive": {
|
||||||
|
"description": "Styling for documentation directives in source files",
|
||||||
|
"title": "/ui/theme-defs/<theme_name>/syntax-styles/doc-directive",
|
||||||
|
"$ref": "#/definitions/style"
|
||||||
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"description": "Styling for variables in text",
|
"description": "Styling for variables in text",
|
||||||
"title": "/ui/theme-defs/<theme_name>/syntax-styles/variable",
|
"title": "/ui/theme-defs/<theme_name>/syntax-styles/variable",
|
||||||
@ -252,6 +257,31 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
"highlights": {
|
||||||
|
"description": "Styles for text highlights.",
|
||||||
|
"title": "/ui/theme-defs/<theme_name>/highlights",
|
||||||
|
"type": "object",
|
||||||
|
"patternProperties": {
|
||||||
|
"(\\w+)": {
|
||||||
|
"title": "/ui/theme-defs/<theme_name>/highlights/<highlight_name>",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"pattern": {
|
||||||
|
"title": "/ui/theme-defs/<theme_name>/highlights/<highlight_name>/pattern",
|
||||||
|
"description": "The regular expression to highlight",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"style": {
|
||||||
|
"description": "The styling for the text that matches the associated pattern",
|
||||||
|
"title": "/ui/theme-defs/<theme_name>/highlights/<highlight_name>/style",
|
||||||
|
"$ref": "#/definitions/style"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
@ -318,6 +348,11 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"$$target": "#/definitions/style",
|
"$$target": "#/definitions/style",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
"semantic": {
|
||||||
|
"title": "/semantic",
|
||||||
|
"description": "Pick a color based on the text being highlighted",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
"color": {
|
"color": {
|
||||||
"title": "/color",
|
"title": "/color",
|
||||||
"description": "The foreground color value for this style. The value can be the name of an xterm color, the hexadecimal value, or a theme variable reference.",
|
"description": "The foreground color value for this style. The value can be the name of an xterm color, the hexadecimal value, or a theme variable reference.",
|
||||||
|
@ -449,6 +449,10 @@ static struct json_path_container global_var_handlers = {
|
|||||||
|
|
||||||
static struct json_path_container style_config_handlers =
|
static struct json_path_container style_config_handlers =
|
||||||
json_path_container{
|
json_path_container{
|
||||||
|
json_path_handler("semantic")
|
||||||
|
.with_description(
|
||||||
|
"Pick a color based on the text being highlighted")
|
||||||
|
.FOR_FIELD(style_config, sc_semantic),
|
||||||
json_path_handler("color")
|
json_path_handler("color")
|
||||||
.with_synopsis("#hex|color_name")
|
.with_synopsis("#hex|color_name")
|
||||||
.with_description(
|
.with_description(
|
||||||
@ -571,6 +575,12 @@ static struct json_path_container theme_syntax_styles_handlers = {
|
|||||||
return &root->lt_style_comment;
|
return &root->lt_style_comment;
|
||||||
})
|
})
|
||||||
.with_children(style_config_handlers),
|
.with_children(style_config_handlers),
|
||||||
|
json_path_handler("doc-directive")
|
||||||
|
.with_description("Styling for documentation directives in source files")
|
||||||
|
.with_obj_provider<style_config, lnav_theme>([](const yajlpp_provider_context &ypc, lnav_theme *root) {
|
||||||
|
return &root->lt_style_doc_directive;
|
||||||
|
})
|
||||||
|
.with_children(style_config_handlers),
|
||||||
json_path_handler("variable")
|
json_path_handler("variable")
|
||||||
.with_description("Styling for variables in text")
|
.with_description("Styling for variables in text")
|
||||||
.with_obj_provider<style_config, lnav_theme>([](const yajlpp_provider_context &ypc, lnav_theme *root) {
|
.with_obj_provider<style_config, lnav_theme>([](const yajlpp_provider_context &ypc, lnav_theme *root) {
|
||||||
@ -689,6 +699,36 @@ static struct json_path_container theme_log_level_styles_handlers = {
|
|||||||
.with_children(style_config_handlers)
|
.with_children(style_config_handlers)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct json_path_container highlighter_handlers = {
|
||||||
|
json_path_handler("pattern")
|
||||||
|
.with_synopsis("regular expression")
|
||||||
|
.with_description("The regular expression to highlight")
|
||||||
|
.FOR_FIELD(highlighter_config, hc_regex),
|
||||||
|
|
||||||
|
json_path_handler("style")
|
||||||
|
.with_description("The styling for the text that matches the associated pattern")
|
||||||
|
.with_obj_provider<style_config, highlighter_config>([](const yajlpp_provider_context &ypc, highlighter_config *root) {
|
||||||
|
return &root->hc_style;
|
||||||
|
})
|
||||||
|
.with_children(style_config_handlers),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct json_path_container theme_highlights_handlers = {
|
||||||
|
json_path_handler(pcrepp("(?<highlight_name>\\w+)"))
|
||||||
|
.with_obj_provider<highlighter_config, lnav_theme>([](const yajlpp_provider_context &ypc, lnav_theme *root) {
|
||||||
|
highlighter_config &hc = root->lt_highlights[
|
||||||
|
ypc.ypc_extractor.get_substr_i("highlight_name").get()];
|
||||||
|
|
||||||
|
return &hc;
|
||||||
|
})
|
||||||
|
.with_path_provider<lnav_theme>([](struct lnav_theme *cfg, vector<string> &paths_out) {
|
||||||
|
for (const auto& pair : cfg->lt_highlights) {
|
||||||
|
paths_out.emplace_back(pair.first);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.with_children(highlighter_handlers)
|
||||||
|
};
|
||||||
|
|
||||||
static struct json_path_container theme_vars_handlers = {
|
static struct json_path_container theme_vars_handlers = {
|
||||||
json_path_handler(pcrepp("(?<var_name>\\w+)"))
|
json_path_handler(pcrepp("(?<var_name>\\w+)"))
|
||||||
.with_synopsis("name")
|
.with_synopsis("name")
|
||||||
@ -720,7 +760,11 @@ static struct json_path_container theme_def_handlers = {
|
|||||||
|
|
||||||
json_path_handler("log-level-styles")
|
json_path_handler("log-level-styles")
|
||||||
.with_description("Styles for each log message level.")
|
.with_description("Styles for each log message level.")
|
||||||
.with_children(theme_log_level_styles_handlers)
|
.with_children(theme_log_level_styles_handlers),
|
||||||
|
|
||||||
|
json_path_handler("highlights")
|
||||||
|
.with_description("Styles for text highlights.")
|
||||||
|
.with_children(theme_highlights_handlers),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct json_path_container theme_defs_handlers = {
|
static struct json_path_container theme_defs_handlers = {
|
||||||
|
@ -116,12 +116,18 @@ struct term_color_palette {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct style_config {
|
struct style_config {
|
||||||
|
bool sc_semantic{false};
|
||||||
std::string sc_color;
|
std::string sc_color;
|
||||||
std::string sc_background_color;
|
std::string sc_background_color;
|
||||||
bool sc_underline{false};
|
bool sc_underline{false};
|
||||||
bool sc_bold{false};
|
bool sc_bold{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct highlighter_config {
|
||||||
|
std::string hc_regex;
|
||||||
|
style_config hc_style;
|
||||||
|
};
|
||||||
|
|
||||||
struct lnav_theme {
|
struct lnav_theme {
|
||||||
std::map<std::string, std::string> lt_vars;
|
std::map<std::string, std::string> lt_vars;
|
||||||
style_config lt_style_identifier;
|
style_config lt_style_identifier;
|
||||||
@ -141,6 +147,7 @@ struct lnav_theme {
|
|||||||
style_config lt_style_keyword;
|
style_config lt_style_keyword;
|
||||||
style_config lt_style_string;
|
style_config lt_style_string;
|
||||||
style_config lt_style_comment;
|
style_config lt_style_comment;
|
||||||
|
style_config lt_style_doc_directive;
|
||||||
style_config lt_style_variable;
|
style_config lt_style_variable;
|
||||||
style_config lt_style_symbol;
|
style_config lt_style_symbol;
|
||||||
style_config lt_style_number;
|
style_config lt_style_number;
|
||||||
@ -159,6 +166,7 @@ struct lnav_theme {
|
|||||||
style_config lt_style_inactive_status;
|
style_config lt_style_inactive_status;
|
||||||
style_config lt_style_file;
|
style_config lt_style_file;
|
||||||
std::map<log_level_t, style_config> lt_level_styles;
|
std::map<log_level_t, style_config> lt_level_styles;
|
||||||
|
std::map<std::string, highlighter_config> lt_highlights;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern term_color_palette xterm_colors;
|
extern term_color_palette xterm_colors;
|
||||||
|
@ -55,11 +55,6 @@ static pcre *xpcre_compile(const char *pattern, int options = 0)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static highlighter static_highlighter(const string ®ex) {
|
|
||||||
return highlighter(xpcre_compile(regex.c_str()))
|
|
||||||
.with_attrs(view_colors::singleton().attrs_for_ident(regex));
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup_highlights(textview_curses::highlight_map_t &hm)
|
void setup_highlights(textview_curses::highlight_map_t &hm)
|
||||||
{
|
{
|
||||||
hm[{highlight_source_t::INTERNAL, "python"}] = highlighter(xpcre_compile(
|
hm[{highlight_source_t::INTERNAL, "python"}] = highlighter(xpcre_compile(
|
||||||
@ -399,7 +394,6 @@ void setup_highlights(textview_curses::highlight_map_t &hm)
|
|||||||
"(?:java|a|o|so|c|cc|cpp|cxx|h|hh|hpp|hxx|py|pyc|rb):"
|
"(?:java|a|o|so|c|cc|cpp|cxx|h|hh|hpp|hxx|py|pyc|rb):"
|
||||||
"\\d+"))
|
"\\d+"))
|
||||||
.with_role(view_colors::VCR_FILE);
|
.with_role(view_colors::VCR_FILE);
|
||||||
hm[{highlight_source_t::INTERNAL, "xml"}] = static_highlighter("<(/?[^ >=]+)[^>]*>");
|
|
||||||
hm[{highlight_source_t::INTERNAL, "1.stringd"}] = highlighter(xpcre_compile(
|
hm[{highlight_source_t::INTERNAL, "1.stringd"}] = highlighter(xpcre_compile(
|
||||||
"\"(?:\\\\.|[^\"])*\""))
|
"\"(?:\\\\.|[^\"])*\""))
|
||||||
.with_role(view_colors::VCR_STRING);
|
.with_role(view_colors::VCR_STRING);
|
||||||
@ -418,12 +412,12 @@ void setup_highlights(textview_curses::highlight_map_t &hm)
|
|||||||
hm[{highlight_source_t::INTERNAL, "diffs"}] = highlighter(xpcre_compile(
|
hm[{highlight_source_t::INTERNAL, "diffs"}] = highlighter(xpcre_compile(
|
||||||
"^\\@@ .*"))
|
"^\\@@ .*"))
|
||||||
.with_role(view_colors::VCR_DIFF_SECTION);
|
.with_role(view_colors::VCR_DIFF_SECTION);
|
||||||
hm[{highlight_source_t::INTERNAL, "ip"}] = static_highlighter("\\d+\\.\\d+\\.\\d+\\.\\d+");
|
|
||||||
hm[{highlight_source_t::INTERNAL, "0.comment"}] = highlighter(xpcre_compile(
|
hm[{highlight_source_t::INTERNAL, "0.comment"}] = highlighter(xpcre_compile(
|
||||||
"(?<=[\\s;])//.*|/\\*.*\\*/|\\(\\*.*\\*\\)|^#.*|\\s+#.*|dnl.*"))
|
"(?<=[\\s;])//.*|/\\*.*\\*/|\\(\\*.*\\*\\)|^#.*|\\s+#.*|dnl.*"))
|
||||||
.with_role(view_colors::VCR_COMMENT);
|
.with_role(view_colors::VCR_COMMENT);
|
||||||
hm[{highlight_source_t::INTERNAL, "javadoc"}] = static_highlighter(
|
hm[{highlight_source_t::INTERNAL, "javadoc"}] = highlighter(xpcre_compile(
|
||||||
"@(?:author|deprecated|exception|file|param|return|see|since|throws|todo|version)");
|
"@(?:author|deprecated|exception|file|param|return|see|since|throws|todo|version)"))
|
||||||
|
.with_role(view_colors::VCR_DOC_DIRECTIVE);
|
||||||
hm[{highlight_source_t::INTERNAL, "var"}] = highlighter(xpcre_compile(
|
hm[{highlight_source_t::INTERNAL, "var"}] = highlighter(xpcre_compile(
|
||||||
"(?:"
|
"(?:"
|
||||||
"(?:var\\s+)?([\\-\\w]+)\\s*[!=+\\-*/|&^]?=|"
|
"(?:var\\s+)?([\\-\\w]+)\\s*[!=+\\-*/|&^]?=|"
|
||||||
|
@ -34,6 +34,8 @@
|
|||||||
|
|
||||||
#include <pcrecpp.h>
|
#include <pcrecpp.h>
|
||||||
|
|
||||||
|
#include "shlex.hh"
|
||||||
|
#include "fmt/format.h"
|
||||||
#include "pcrepp/pcrepp.hh"
|
#include "pcrepp/pcrepp.hh"
|
||||||
#include "lnav_util.hh"
|
#include "lnav_util.hh"
|
||||||
#include "data_parser.hh"
|
#include "data_parser.hh"
|
||||||
@ -120,8 +122,8 @@ string_attr_type textview_curses::SA_FORMAT("format");
|
|||||||
string_attr_type textview_curses::SA_REMOVED("removed");
|
string_attr_type textview_curses::SA_REMOVED("removed");
|
||||||
|
|
||||||
textview_curses::textview_curses()
|
textview_curses::textview_curses()
|
||||||
: tc_sub_source(NULL),
|
: tc_sub_source(nullptr),
|
||||||
tc_delegate(NULL),
|
tc_delegate(nullptr),
|
||||||
tc_selection_start(-1),
|
tc_selection_start(-1),
|
||||||
tc_selection_last(-1),
|
tc_selection_last(-1),
|
||||||
tc_selection_cleared(false),
|
tc_selection_cleared(false),
|
||||||
@ -130,10 +132,83 @@ textview_curses::textview_curses()
|
|||||||
this->set_data_source(this);
|
this->set_data_source(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
textview_curses::~textview_curses()
|
void textview_curses::reload_config(error_reporter &reporter)
|
||||||
{ }
|
{
|
||||||
|
static auto DEFAULT_THEME_NAME = string("default");
|
||||||
|
|
||||||
void textview_curses::reload_data(void)
|
for (auto iter = this->tc_highlights.begin();
|
||||||
|
iter != this->tc_highlights.end();) {
|
||||||
|
if (iter->first.first != highlight_source_t::THEME) {
|
||||||
|
++iter;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
iter = this->tc_highlights.erase(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& theme_name : {DEFAULT_THEME_NAME, lnav_config.lc_ui_theme}) {
|
||||||
|
auto theme_iter = lnav_config.lc_ui_theme_defs.find(theme_name);
|
||||||
|
|
||||||
|
if (theme_iter == lnav_config.lc_ui_theme_defs.end()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &hl_pair : theme_iter->second.lt_highlights) {
|
||||||
|
if (hl_pair.second.hc_regex.empty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *errptr;
|
||||||
|
pcre *code;
|
||||||
|
int eoff;
|
||||||
|
|
||||||
|
if ((code = pcre_compile(hl_pair.second.hc_regex.c_str(),
|
||||||
|
0,
|
||||||
|
&errptr,
|
||||||
|
&eoff,
|
||||||
|
nullptr)) == nullptr) {
|
||||||
|
reporter(&hl_pair.second.hc_regex,
|
||||||
|
fmt::format("invalid highlight regex: {} at {}",
|
||||||
|
errptr, eoff));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto &sc = hl_pair.second.hc_style;
|
||||||
|
string fg1, bg1, fg_color, bg_color, errmsg;
|
||||||
|
rgb_color fg, bg;
|
||||||
|
int attrs = 0;
|
||||||
|
|
||||||
|
fg1 = sc.sc_color;
|
||||||
|
bg1 = sc.sc_background_color;
|
||||||
|
shlex(fg1).eval(fg_color, theme_iter->second.lt_vars);
|
||||||
|
shlex(bg1).eval(bg_color, theme_iter->second.lt_vars);
|
||||||
|
|
||||||
|
if (!rgb_color::from_str(fg_color, fg, errmsg)) {
|
||||||
|
reporter(&sc.sc_color, errmsg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!rgb_color::from_str(bg_color, bg, errmsg)) {
|
||||||
|
reporter(&sc.sc_background_color, errmsg);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sc.sc_bold) {
|
||||||
|
attrs |= A_BOLD;
|
||||||
|
}
|
||||||
|
if (sc.sc_underline) {
|
||||||
|
attrs |= A_UNDERLINE;
|
||||||
|
}
|
||||||
|
this->tc_highlights[{highlight_source_t::THEME, hl_pair.first}] =
|
||||||
|
highlighter(code)
|
||||||
|
.with_pattern(hl_pair.second.hc_regex)
|
||||||
|
.with_attrs(attrs != 0 ? attrs : -1)
|
||||||
|
.with_color(fg, bg)
|
||||||
|
.with_semantic(sc.sc_semantic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void textview_curses::reload_data()
|
||||||
{
|
{
|
||||||
if (this->tc_sub_source != nullptr) {
|
if (this->tc_sub_source != nullptr) {
|
||||||
this->tc_sub_source->text_update_marks(this->tc_bookmarks);
|
this->tc_sub_source->text_update_marks(this->tc_bookmarks);
|
||||||
@ -343,7 +418,8 @@ void textview_curses::textview_value_for_row(vis_line_t row,
|
|||||||
|
|
||||||
for (auto &tc_highlight : this->tc_highlights) {
|
for (auto &tc_highlight : this->tc_highlights) {
|
||||||
bool internal_hl =
|
bool internal_hl =
|
||||||
tc_highlight.first.first == highlight_source_t::INTERNAL;
|
tc_highlight.first.first == highlight_source_t::INTERNAL ||
|
||||||
|
tc_highlight.first.first == highlight_source_t::THEME;
|
||||||
|
|
||||||
if (tc_highlight.second.h_text_format != text_format_t::TF_UNKNOWN &&
|
if (tc_highlight.second.h_text_format != text_format_t::TF_UNKNOWN &&
|
||||||
source_format != tc_highlight.second.h_text_format) {
|
source_format != tc_highlight.second.h_text_format) {
|
||||||
|
@ -568,6 +568,7 @@ public:
|
|||||||
|
|
||||||
enum class highlight_source_t {
|
enum class highlight_source_t {
|
||||||
INTERNAL,
|
INTERNAL,
|
||||||
|
THEME,
|
||||||
PREVIEW,
|
PREVIEW,
|
||||||
CONFIGURATION,
|
CONFIGURATION,
|
||||||
INTERACTIVE,
|
INTERACTIVE,
|
||||||
@ -581,7 +582,8 @@ class textview_curses
|
|||||||
: public listview_curses,
|
: public listview_curses,
|
||||||
public list_data_source,
|
public list_data_source,
|
||||||
public grep_proc_source<vis_line_t>,
|
public grep_proc_source<vis_line_t>,
|
||||||
public grep_proc_sink<vis_line_t> {
|
public grep_proc_sink<vis_line_t>,
|
||||||
|
public lnav_config_listener {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef view_action<textview_curses> action;
|
typedef view_action<textview_curses> action;
|
||||||
@ -597,7 +599,9 @@ public:
|
|||||||
static string_attr_type SA_REMOVED;
|
static string_attr_type SA_REMOVED;
|
||||||
|
|
||||||
textview_curses();
|
textview_curses();
|
||||||
virtual ~textview_curses();
|
virtual ~textview_curses() = default;
|
||||||
|
|
||||||
|
void reload_config(error_reporter &reporter);
|
||||||
|
|
||||||
void set_paused(bool paused) {
|
void set_paused(bool paused) {
|
||||||
this->tc_paused = paused;
|
this->tc_paused = paused;
|
||||||
|
@ -56,6 +56,9 @@
|
|||||||
"comment": {
|
"comment": {
|
||||||
"color": "Green"
|
"color": "Green"
|
||||||
},
|
},
|
||||||
|
"doc-directive": {
|
||||||
|
"color": "Teal"
|
||||||
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "Teal"
|
"color": "Teal"
|
||||||
},
|
},
|
||||||
@ -125,6 +128,20 @@
|
|||||||
"fatal": {
|
"fatal": {
|
||||||
"color": "Red"
|
"color": "Red"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"highlights": {
|
||||||
|
"ipv4": {
|
||||||
|
"pattern": "\\b(?<!\\d\\.)\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b(?!\\.\\d)",
|
||||||
|
"style": {
|
||||||
|
"semantic": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xml": {
|
||||||
|
"pattern": "</?([^ >=]+)[^>]*>",
|
||||||
|
"style": {
|
||||||
|
"semantic": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,6 +67,9 @@
|
|||||||
"comment": {
|
"comment": {
|
||||||
"color": "$cyan"
|
"color": "$cyan"
|
||||||
},
|
},
|
||||||
|
"doc-directive": {
|
||||||
|
"color": "$green"
|
||||||
|
},
|
||||||
"number": {
|
"number": {
|
||||||
"color": "$red"
|
"color": "$red"
|
||||||
},
|
},
|
||||||
|
@ -72,6 +72,9 @@
|
|||||||
"comment": {
|
"comment": {
|
||||||
"color": "#727072"
|
"color": "#727072"
|
||||||
},
|
},
|
||||||
|
"doc-directive": {
|
||||||
|
"color": "#a9dc76"
|
||||||
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#a9dc76"
|
"color": "#a9dc76"
|
||||||
},
|
},
|
||||||
|
@ -65,6 +65,9 @@
|
|||||||
"comment": {
|
"comment": {
|
||||||
"color": "#676e95"
|
"color": "#676e95"
|
||||||
},
|
},
|
||||||
|
"doc-directive": {
|
||||||
|
"color": "#addb67"
|
||||||
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "#addb67"
|
"color": "#addb67"
|
||||||
},
|
},
|
||||||
|
@ -76,6 +76,9 @@
|
|||||||
"comment": {
|
"comment": {
|
||||||
"color": "$base01"
|
"color": "$base01"
|
||||||
},
|
},
|
||||||
|
"doc-directive": {
|
||||||
|
"color": "$cyan"
|
||||||
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "$blue"
|
"color": "$blue"
|
||||||
},
|
},
|
||||||
|
@ -76,6 +76,9 @@
|
|||||||
"comment": {
|
"comment": {
|
||||||
"color": "$base1"
|
"color": "$base1"
|
||||||
},
|
},
|
||||||
|
"doc-directive": {
|
||||||
|
"color": "$blue"
|
||||||
|
},
|
||||||
"variable": {
|
"variable": {
|
||||||
"color": "$blue"
|
"color": "$blue"
|
||||||
},
|
},
|
||||||
|
@ -918,6 +918,8 @@ void view_colors::init_roles(const lnav_theme <,
|
|||||||
lt, lt.lt_style_string, lt.lt_style_text, reporter);
|
lt, lt.lt_style_string, lt.lt_style_text, reporter);
|
||||||
this->vc_role_colors[VCR_COMMENT] = this->to_attrs(color_pair_base,
|
this->vc_role_colors[VCR_COMMENT] = this->to_attrs(color_pair_base,
|
||||||
lt, lt.lt_style_comment, lt.lt_style_text, reporter);
|
lt, lt.lt_style_comment, lt.lt_style_text, reporter);
|
||||||
|
this->vc_role_colors[VCR_DOC_DIRECTIVE] = this->to_attrs(color_pair_base,
|
||||||
|
lt, lt.lt_style_doc_directive, lt.lt_style_text, reporter);
|
||||||
this->vc_role_colors[VCR_VARIABLE] = this->to_attrs(color_pair_base,
|
this->vc_role_colors[VCR_VARIABLE] = this->to_attrs(color_pair_base,
|
||||||
lt, lt.lt_style_variable, lt.lt_style_text, reporter);
|
lt, lt.lt_style_variable, lt.lt_style_text, reporter);
|
||||||
this->vc_role_colors[VCR_SYMBOL] = this->to_attrs(color_pair_base,
|
this->vc_role_colors[VCR_SYMBOL] = this->to_attrs(color_pair_base,
|
||||||
|
@ -172,37 +172,37 @@ private:
|
|||||||
* Class that encapsulates a method to execute and the object on which to
|
* Class that encapsulates a method to execute and the object on which to
|
||||||
* execute it.
|
* execute it.
|
||||||
*
|
*
|
||||||
* @param _Sender The type of object that will be triggering an action.
|
* @param Sender The type of object that will be triggering an action.
|
||||||
*/
|
*/
|
||||||
template<class _Sender>
|
template<class Sender>
|
||||||
class view_action {
|
class view_action {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param _Receiver The type of object that will be triggered by an action.
|
* @param Receiver The type of object that will be triggered by an action.
|
||||||
*/
|
*/
|
||||||
template<class _Receiver>
|
template<class Receiver>
|
||||||
class mem_functor_t {
|
class mem_functor_t {
|
||||||
public:
|
public:
|
||||||
mem_functor_t(_Receiver &receiver,
|
mem_functor_t(Receiver &receiver,
|
||||||
void(_Receiver::*selector)(_Sender *))
|
void(Receiver::*selector)(Sender *))
|
||||||
: mf_receiver(receiver),
|
: mf_receiver(receiver),
|
||||||
mf_selector(selector) { };
|
mf_selector(selector) { };
|
||||||
|
|
||||||
void operator()(_Sender *sender) const
|
void operator()(Sender *sender) const
|
||||||
{
|
{
|
||||||
(this->mf_receiver.*mf_selector)(sender);
|
(this->mf_receiver.*mf_selector)(sender);
|
||||||
};
|
};
|
||||||
|
|
||||||
static void invoke(mem_functor_t *self, _Sender *sender)
|
static void invoke(mem_functor_t *self, Sender *sender)
|
||||||
{
|
{
|
||||||
(*self)(sender);
|
(*self)(sender);
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
_Receiver & mf_receiver;
|
Receiver & mf_receiver;
|
||||||
void (_Receiver::*mf_selector)(_Sender *);
|
void (Receiver::*mf_selector)(Sender *);
|
||||||
};
|
};
|
||||||
|
|
||||||
class broadcaster
|
class broadcaster
|
||||||
@ -213,7 +213,7 @@ public:
|
|||||||
: b_functor(*this, &broadcaster::invoke) { };
|
: b_functor(*this, &broadcaster::invoke) { };
|
||||||
virtual ~broadcaster() = default;
|
virtual ~broadcaster() = default;
|
||||||
|
|
||||||
void invoke(_Sender *sender)
|
void invoke(Sender *sender)
|
||||||
{
|
{
|
||||||
typename std::vector<view_action>::iterator iter;
|
typename std::vector<view_action>::iterator iter;
|
||||||
|
|
||||||
@ -238,15 +238,15 @@ private:
|
|||||||
* parameters, the first being the value of the receiver pointer and the
|
* parameters, the first being the value of the receiver pointer and the
|
||||||
* second being the sender pointer as passed to invoke().
|
* second being the sender pointer as passed to invoke().
|
||||||
*/
|
*/
|
||||||
view_action(void(*invoker)(void *, _Sender *) = nullptr)
|
view_action(void(*invoker)(void *, Sender *) = nullptr)
|
||||||
: va_functor(nullptr),
|
: va_functor(nullptr),
|
||||||
va_invoker(invoker) { };
|
va_invoker(invoker) { };
|
||||||
|
|
||||||
template<class _Receiver>
|
template<class Receiver>
|
||||||
view_action(mem_functor_t<_Receiver> *mf)
|
view_action(mem_functor_t<Receiver> *mf)
|
||||||
: va_functor(mf),
|
: va_functor(mf),
|
||||||
va_invoker((void(*) (void *, _Sender *))
|
va_invoker((void(*) (void *, Sender *))
|
||||||
mem_functor_t<_Receiver>::invoke) { };
|
mem_functor_t<Receiver>::invoke) { };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs a shallow copy of another view_action.
|
* Performs a shallow copy of another view_action.
|
||||||
@ -258,8 +258,6 @@ private:
|
|||||||
: va_functor(va.va_functor),
|
: va_functor(va.va_functor),
|
||||||
va_invoker(va.va_invoker) { };
|
va_invoker(va.va_invoker) { };
|
||||||
|
|
||||||
~view_action() { };
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param rhs The view_action to shallow copy.
|
* @param rhs The view_action to shallow copy.
|
||||||
* @return *this
|
* @return *this
|
||||||
@ -277,7 +275,7 @@ private:
|
|||||||
*
|
*
|
||||||
* @param sender Pointer to the object that called this method.
|
* @param sender Pointer to the object that called this method.
|
||||||
*/
|
*/
|
||||||
void invoke(_Sender *sender)
|
void invoke(Sender *sender)
|
||||||
{
|
{
|
||||||
if (this->va_invoker != NULL) {
|
if (this->va_invoker != NULL) {
|
||||||
this->va_invoker(this->va_functor, sender);
|
this->va_invoker(this->va_functor, sender);
|
||||||
@ -289,7 +287,7 @@ private:
|
|||||||
/** The object to pass as the first argument to the selector function.*/
|
/** The object to pass as the first argument to the selector function.*/
|
||||||
void *va_functor;
|
void *va_functor;
|
||||||
/** The function to call when this action is invoke()'d. */
|
/** The function to call when this action is invoke()'d. */
|
||||||
void (*va_invoker)(void *functor, _Sender *sender);
|
void (*va_invoker)(void *functor, Sender *sender);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -339,6 +337,7 @@ public:
|
|||||||
VCR_KEYWORD,
|
VCR_KEYWORD,
|
||||||
VCR_STRING,
|
VCR_STRING,
|
||||||
VCR_COMMENT,
|
VCR_COMMENT,
|
||||||
|
VCR_DOC_DIRECTIVE,
|
||||||
VCR_VARIABLE,
|
VCR_VARIABLE,
|
||||||
VCR_SYMBOL,
|
VCR_SYMBOL,
|
||||||
VCR_NUMBER,
|
VCR_NUMBER,
|
||||||
@ -365,7 +364,7 @@ public:
|
|||||||
* called before this method, but the returned attributes cannot be used
|
* called before this method, but the returned attributes cannot be used
|
||||||
* with curses code until this method is called.
|
* with curses code until this method is called.
|
||||||
*/
|
*/
|
||||||
static void init(void);
|
static void init();
|
||||||
|
|
||||||
void init_roles(const lnav_theme <, lnav_config_listener::error_reporter &reporter);
|
void init_roles(const lnav_theme <, lnav_config_listener::error_reporter &reporter);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user