From e2fe8730496eb8019e8f8ace211eeaa596534942 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Wed, 15 Jan 2014 01:01:25 -0800 Subject: [PATCH] Change highlight colors from a bitmask into a combination enum / bitmask so that we can support more than 16 color specifications. --- fish_tests.cpp | 120 ++++++++++++------------ highlight.cpp | 241 ++++++++++++++++++++++++------------------------- highlight.h | 109 +++++++++------------- reader.cpp | 17 ++-- reader.h | 3 +- screen.cpp | 4 +- screen.h | 9 +- 7 files changed, 237 insertions(+), 266 deletions(-) diff --git a/fish_tests.cpp b/fish_tests.cpp index 26a6f5b11..0144d3f8e 100644 --- a/fish_tests.cpp +++ b/fish_tests.cpp @@ -2546,134 +2546,134 @@ static void test_highlighting(void) const highlight_component_t components1[] = { - {L"echo", HIGHLIGHT_COMMAND}, - {L"/tmp/fish_highlight_test/foo", HIGHLIGHT_PARAM | HIGHLIGHT_VALID_PATH}, - {L"&", HIGHLIGHT_END}, + {L"echo", highlight_spec_command}, + {L"/tmp/fish_highlight_test/foo", highlight_spec_param | highlight_modifier_valid_path}, + {L"&", highlight_spec_statement_terminator}, {NULL, -1} }; const highlight_component_t components2[] = { - {L"command", HIGHLIGHT_COMMAND}, - {L"echo", HIGHLIGHT_COMMAND}, - {L"abc", HIGHLIGHT_PARAM}, - {L"/tmp/fish_highlight_test/foo", HIGHLIGHT_PARAM | HIGHLIGHT_VALID_PATH}, - {L"&", HIGHLIGHT_END}, + {L"command", highlight_spec_command}, + {L"echo", highlight_spec_command}, + {L"abc", highlight_spec_param}, + {L"/tmp/fish_highlight_test/foo", highlight_spec_param | highlight_modifier_valid_path}, + {L"&", highlight_spec_statement_terminator}, {NULL, -1} }; const highlight_component_t components3[] = { - {L"if command ls", HIGHLIGHT_COMMAND}, - {L"; ", HIGHLIGHT_END}, - {L"echo", HIGHLIGHT_COMMAND}, - {L"abc", HIGHLIGHT_PARAM}, - {L"; ", HIGHLIGHT_END}, - {L"/bin/definitely_not_a_command", HIGHLIGHT_ERROR}, - {L"; ", HIGHLIGHT_END}, - {L"end", HIGHLIGHT_COMMAND}, + {L"if command ls", highlight_spec_command}, + {L"; ", highlight_spec_statement_terminator}, + {L"echo", highlight_spec_command}, + {L"abc", highlight_spec_param}, + {L"; ", highlight_spec_statement_terminator}, + {L"/bin/definitely_not_a_command", highlight_spec_error}, + {L"; ", highlight_spec_statement_terminator}, + {L"end", highlight_spec_command}, {NULL, -1} }; /* Verify that cd shows errors for non-directories */ const highlight_component_t components4[] = { - {L"cd", HIGHLIGHT_COMMAND}, - {L"/tmp/fish_highlight_test", HIGHLIGHT_PARAM | HIGHLIGHT_VALID_PATH}, + {L"cd", highlight_spec_command}, + {L"/tmp/fish_highlight_test", highlight_spec_param | highlight_modifier_valid_path}, {NULL, -1} }; const highlight_component_t components5[] = { - {L"cd", HIGHLIGHT_COMMAND}, - {L"/tmp/fish_highlight_test/foo", HIGHLIGHT_ERROR}, + {L"cd", highlight_spec_command}, + {L"/tmp/fish_highlight_test/foo", highlight_spec_error}, {NULL, -1} }; const highlight_component_t components6[] = { - {L"cd", HIGHLIGHT_COMMAND}, - {L"--help", HIGHLIGHT_PARAM}, - {L"-h", HIGHLIGHT_PARAM}, - {L"definitely_not_a_directory", HIGHLIGHT_ERROR}, + {L"cd", highlight_spec_command}, + {L"--help", highlight_spec_param}, + {L"-h", highlight_spec_param}, + {L"definitely_not_a_directory", highlight_spec_error}, {NULL, -1} }; // Command substitutions const highlight_component_t components7[] = { - {L"echo", HIGHLIGHT_COMMAND}, - {L"param1", HIGHLIGHT_PARAM}, - {L"(", HIGHLIGHT_OPERATOR}, - {L"ls", HIGHLIGHT_COMMAND}, - {L"param2", HIGHLIGHT_PARAM}, - {L")", HIGHLIGHT_OPERATOR}, + {L"echo", highlight_spec_command}, + {L"param1", highlight_spec_param}, + {L"(", highlight_spec_operator}, + {L"ls", highlight_spec_command}, + {L"param2", highlight_spec_param}, + {L")", highlight_spec_operator}, {NULL, -1} }; // Redirections substitutions const highlight_component_t components8[] = { - {L"echo", HIGHLIGHT_COMMAND}, - {L"param1", HIGHLIGHT_PARAM}, + {L"echo", highlight_spec_command}, + {L"param1", highlight_spec_param}, /* Input redirection */ - {L"<", HIGHLIGHT_REDIRECTION}, - {L"/bin/echo", HIGHLIGHT_REDIRECTION}, + {L"<", highlight_spec_redirection}, + {L"/bin/echo", highlight_spec_redirection}, /* Output redirection to a valid fd */ - {L"1>&2", HIGHLIGHT_REDIRECTION}, + {L"1>&2", highlight_spec_redirection}, /* Output redirection to an invalid fd */ - {L"2>&", HIGHLIGHT_REDIRECTION}, - {L"LOL", HIGHLIGHT_ERROR}, + {L"2>&", highlight_spec_redirection}, + {L"LOL", highlight_spec_error}, /* Just a param, not a redirection */ - {L"/tmp/blah", HIGHLIGHT_PARAM}, + {L"/tmp/blah", highlight_spec_param}, /* Input redirection from directory */ - {L"<", HIGHLIGHT_REDIRECTION}, - {L"/tmp/", HIGHLIGHT_ERROR}, + {L"<", highlight_spec_redirection}, + {L"/tmp/", highlight_spec_error}, /* Output redirection to an invalid path */ - {L"3>", HIGHLIGHT_REDIRECTION}, - {L"/not/a/valid/path/nope", HIGHLIGHT_ERROR}, + {L"3>", highlight_spec_redirection}, + {L"/not/a/valid/path/nope", highlight_spec_error}, /* Output redirection to directory */ - {L"3>", HIGHLIGHT_REDIRECTION}, - {L"/tmp/nope/", HIGHLIGHT_ERROR}, + {L"3>", highlight_spec_redirection}, + {L"/tmp/nope/", highlight_spec_error}, /* Redirections to overflow fd */ - {L"99999999999999999999>&2", HIGHLIGHT_ERROR}, - {L"2>&", HIGHLIGHT_REDIRECTION}, - {L"99999999999999999999", HIGHLIGHT_ERROR}, + {L"99999999999999999999>&2", highlight_spec_error}, + {L"2>&", highlight_spec_redirection}, + {L"99999999999999999999", highlight_spec_error}, /* Output redirection containing a command substitution */ - {L"4>", HIGHLIGHT_REDIRECTION}, - {L"(", HIGHLIGHT_OPERATOR}, - {L"echo", HIGHLIGHT_COMMAND}, - {L"/tmp/somewhere", HIGHLIGHT_PARAM}, - {L")", HIGHLIGHT_OPERATOR}, + {L"4>", highlight_spec_redirection}, + {L"(", highlight_spec_operator}, + {L"echo", highlight_spec_command}, + {L"/tmp/somewhere", highlight_spec_param}, + {L")", highlight_spec_operator}, /* Just another param */ - {L"param2", HIGHLIGHT_PARAM}, + {L"param2", highlight_spec_param}, {NULL, -1} }; const highlight_component_t components9[] = { - {L"end", HIGHLIGHT_ERROR}, - {L";", HIGHLIGHT_END}, - {L"if", HIGHLIGHT_COMMAND}, - {L"end", HIGHLIGHT_ERROR}, + {L"end", highlight_spec_error}, + {L";", highlight_spec_statement_terminator}, + {L"if", highlight_spec_command}, + {L"end", highlight_spec_error}, {NULL, -1} }; const highlight_component_t components10[] = { - {L"echo", HIGHLIGHT_COMMAND}, - {L"'single_quote", HIGHLIGHT_ERROR}, + {L"echo", highlight_spec_command}, + {L"'single_quote", highlight_spec_error}, {NULL, -1} }; @@ -2704,7 +2704,7 @@ static void test_highlighting(void) } assert(expected_colors.size() == text.size()); - std::vector colors(text.size()); + std::vector colors(text.size()); highlight_shell(text, colors, 20, NULL, env_vars_snapshot_t()); if (expected_colors.size() != colors.size()) diff --git a/highlight.cpp b/highlight.cpp index 32a8a27d7..3878a208c 100644 --- a/highlight.cpp +++ b/highlight.cpp @@ -44,11 +44,9 @@ */ #define VAR_COUNT ( sizeof(highlight_var)/sizeof(wchar_t *) ) -static void highlight_universal_internal(const wcstring &buff, std::vector &color, size_t pos); +static void highlight_universal_internal(const wcstring &buff, std::vector &color, size_t pos); -/** - The environment variables used to specify the color of different tokens. -*/ +/** The environment variables used to specify the color of different tokens. This matchest the order in highlight_spec_t */ static const wchar_t * const highlight_var[] = { L"fish_color_normal", @@ -63,7 +61,6 @@ static const wchar_t * const highlight_var[] = L"fish_color_escape", L"fish_color_quote", L"fish_color_redirection", - L"fish_color_valid_path", L"fish_color_autosuggestion" }; @@ -354,22 +351,15 @@ bool plain_statement_get_expanded_command(const wcstring &src, const parse_node_ } -rgb_color_t highlight_get_color(int highlight, bool is_background) +rgb_color_t highlight_get_color(highlight_spec_t highlight, bool is_background) { - size_t idx=0; - rgb_color_t result; + rgb_color_t result = rgb_color_t::normal(); - if (highlight < 0) - return rgb_color_t::normal(); - if (highlight > (1<= VAR_COUNT) { - if (highlight & (1< &colors, wcstring_list_t *error) +static void highlight_parameter(const wcstring &buffstr, std::vector &colors, wcstring_list_t *error) { const wchar_t * const buff = buffstr.c_str(); enum {e_unquoted, e_single_quoted, e_double_quoted} mode = e_unquoted; @@ -432,7 +423,7 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w { if (in_pos == 1) { - colors.at(start_pos) = HIGHLIGHT_ESCAPE; + colors.at(start_pos) = highlight_spec_escape; colors.at(in_pos+1) = normal_status; } } @@ -440,18 +431,18 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w { if (bracket_count) { - colors.at(start_pos) = HIGHLIGHT_ESCAPE; + colors.at(start_pos) = highlight_spec_escape; colors.at(in_pos+1) = normal_status; } } else if (wcschr(L"abefnrtv*?$(){}[]'\"<>^ \\#;|&", buff[in_pos])) { - colors.at(start_pos)=HIGHLIGHT_ESCAPE; + colors.at(start_pos)= highlight_spec_escape; colors.at(in_pos+1)=normal_status; } else if (wcschr(L"c", buff[in_pos])) { - colors.at(start_pos)=HIGHLIGHT_ESCAPE; + colors.at(start_pos) = highlight_spec_escape; if (in_pos+2 < colors.size()) colors.at(in_pos+2)=normal_status; } @@ -515,12 +506,12 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w if ((res <= max_val)) { - colors.at(start_pos) = HIGHLIGHT_ESCAPE; + colors.at(start_pos) = highlight_spec_escape; colors.at(in_pos+1) = normal_status; } else { - colors.at(start_pos) = HIGHLIGHT_ERROR; + colors.at(start_pos) = highlight_spec_error; colors.at(in_pos+1) = normal_status; } } @@ -535,7 +526,7 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w { if (in_pos == 0) { - colors.at(in_pos) = HIGHLIGHT_OPERATOR; + colors.at(in_pos) = highlight_spec_operator; colors.at(in_pos+1) = normal_status; } break; @@ -544,7 +535,7 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w case L'$': { wchar_t n = buff[in_pos+1]; - colors.at(in_pos) = (n==L'$'||wcsvarchr(n))? HIGHLIGHT_OPERATOR:HIGHLIGHT_ERROR; + colors.at(in_pos) = (n==L'$'||wcsvarchr(n))? highlight_spec_operator:highlight_spec_error; colors.at(in_pos+1) = normal_status; break; } @@ -555,14 +546,14 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w case L'(': case L')': { - colors.at(in_pos) = HIGHLIGHT_OPERATOR; + colors.at(in_pos) = highlight_spec_operator; colors.at(in_pos+1) = normal_status; break; } case L'{': { - colors.at(in_pos) = HIGHLIGHT_OPERATOR; + colors.at(in_pos) = highlight_spec_operator; colors.at(in_pos+1) = normal_status; bracket_count++; break; @@ -570,7 +561,7 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w case L'}': { - colors.at(in_pos) = HIGHLIGHT_OPERATOR; + colors.at(in_pos) = highlight_spec_operator; colors.at(in_pos+1) = normal_status; bracket_count--; break; @@ -580,7 +571,7 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w { if (bracket_count) { - colors.at(in_pos) = HIGHLIGHT_OPERATOR; + colors.at(in_pos) = highlight_spec_operator; colors.at(in_pos+1) = normal_status; } @@ -589,14 +580,14 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w case L'\'': { - colors.at(in_pos) = HIGHLIGHT_QUOTE; + colors.at(in_pos) = highlight_spec_quote; mode = e_single_quoted; break; } case L'\"': { - colors.at(in_pos) = HIGHLIGHT_QUOTE; + colors.at(in_pos) = highlight_spec_quote; mode = e_double_quoted; break; } @@ -619,8 +610,8 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w case '\\': case L'\'': { - colors.at(start_pos) = HIGHLIGHT_ESCAPE; - colors.at(in_pos+1) = HIGHLIGHT_QUOTE; + colors.at(start_pos) = highlight_spec_escape; + colors.at(in_pos+1) = highlight_spec_quote; break; } @@ -669,8 +660,8 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w case L'$': case '"': { - colors.at(start_pos) = HIGHLIGHT_ESCAPE; - colors.at(in_pos+1) = HIGHLIGHT_QUOTE; + colors.at(start_pos) = highlight_spec_escape; + colors.at(in_pos+1) = highlight_spec_quote; break; } } @@ -680,8 +671,8 @@ static void highlight_param(const wcstring &buffstr, std::vector &colors, w case '$': { wchar_t n = buff[in_pos+1]; - colors.at(in_pos) = (n==L'$'||wcsvarchr(n))? HIGHLIGHT_OPERATOR:HIGHLIGHT_ERROR; - colors.at(in_pos+1) = HIGHLIGHT_QUOTE; + colors.at(in_pos) = (n==L'$'||wcsvarchr(n))? highlight_spec_operator:highlight_spec_error; + colors.at(in_pos+1) = highlight_spec_quote; break; } @@ -869,7 +860,7 @@ bool autosuggest_validate_from_history(const history_item_t &item, file_detectio } // This function does I/O -static void tokenize(const wchar_t * const buff, std::vector &color, const size_t pos, wcstring_list_t *error, const wcstring &working_directory, const env_vars_snapshot_t &vars) +static void tokenize(const wchar_t * const buff, std::vector &color, const size_t pos, wcstring_list_t *error, const wcstring &working_directory, const env_vars_snapshot_t &vars) { ASSERT_IS_BACKGROUND_THREAD(); @@ -888,7 +879,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const if (buff[0] == L'\0') return; - std::fill(color.begin(), color.end(), -1); + std::fill(color.begin(), color.end(), (highlight_spec_t)highlight_spec_invalid); tokenizer_t tok(buff, TOK_SHOW_COMMENTS | TOK_SQUASH_ERRORS); for (; tok_has_next(&tok); tok_next(&tok)) @@ -909,23 +900,23 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const if (wcscmp(param, L"--") == 0) { accept_switches = 0; - color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; + color.at(tok_get_pos(&tok)) = highlight_spec_param; } else if (accept_switches) { if (complete_is_valid_option(last_cmd, param, error, false /* no autoload */)) - color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; + color.at(tok_get_pos(&tok)) = highlight_spec_param; else - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; } else { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; + color.at(tok_get_pos(&tok)) = highlight_spec_param; } } else { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; + color.at(tok_get_pos(&tok)) = highlight_spec_param; } if (cmd == L"cd") @@ -936,19 +927,19 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const int is_help = string_prefixes_string(dir, L"--help") || string_prefixes_string(dir, L"-h"); if (!is_help && ! is_potential_cd_path(dir, working_directory, PATH_EXPAND_TILDE, NULL)) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; } } } - /* Highlight the parameter. highlight_param wants to write one more color than we have characters (hysterical raisins) so allocate one more in the vector. But don't copy it back. */ + /* Highlight the parameter. highlight_parameter wants to write one more color than we have characters (hysterical raisins) so allocate one more in the vector. But don't copy it back. */ const wcstring param_str = param; size_t tok_pos = tok_get_pos(&tok); - std::vector::const_iterator where = color.begin() + tok_pos; - std::vector subcolors(where, where + param_str.size()); - subcolors.push_back(-1); - highlight_param(param_str, subcolors, error); + std::vector::const_iterator where = color.begin() + tok_pos; + std::vector subcolors(where, where + param_str.size()); + subcolors.push_back(highlight_spec_invalid); + highlight_parameter(param_str, subcolors, error); /* Copy the subcolors back into our colors array */ std::copy(subcolors.begin(), subcolors.begin() + param_str.size(), color.begin() + tok_pos); @@ -962,14 +953,14 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const bool expanded = expand_one(cmd, EXPAND_SKIP_CMDSUBST | EXPAND_SKIP_VARIABLES | EXPAND_SKIP_JOBS); if (! expanded || has_expand_reserved(cmd)) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; } else { bool is_cmd = false; int is_subcommand = 0; int mark = tok_get_pos(&tok); - color.at(tok_get_pos(&tok)) = use_builtin ? HIGHLIGHT_COMMAND : HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = use_builtin ? highlight_spec_command : highlight_spec_error; if (parser_keywords_is_subcommand(cmd)) { @@ -1011,7 +1002,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const { if (sw == ARG_SKIP) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_PARAM; + color.at(tok_get_pos(&tok)) = highlight_spec_param; mark = tok_get_pos(&tok); } @@ -1064,7 +1055,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const if (is_cmd) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_COMMAND; + color.at(tok_get_pos(&tok)) = highlight_spec_command; } else { @@ -1072,7 +1063,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const { error->push_back(format_string(L"Unknown command \'%ls\'", cmd.c_str())); } - color.at(tok_get_pos(&tok)) = (HIGHLIGHT_ERROR); + color.at(tok_get_pos(&tok)) = (highlight_spec_error); } had_cmd = 1; } @@ -1095,7 +1086,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const { if (!had_cmd) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; if (error) error->push_back(L"Redirection without a command"); break; @@ -1104,7 +1095,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const wcstring target_str; const wchar_t *target=NULL; - color.at(tok_get_pos(&tok)) = HIGHLIGHT_REDIRECTION; + color.at(tok_get_pos(&tok)) = highlight_spec_redirection; tok_next(&tok); /* @@ -1131,7 +1122,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const size_t pos = tok_get_pos(&tok); if (pos < color.size()) { - color.at(pos) = HIGHLIGHT_ERROR; + color.at(pos) = highlight_spec_error; } if (error) error->push_back(L"Invalid redirection"); @@ -1153,7 +1144,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const dir.resize(slash_idx); if (wstat(dir, &buff) == -1) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; if (error) error->push_back(format_string(L"Directory \'%ls\' does not exist", dir.c_str())); @@ -1169,7 +1160,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const { if (wstat(target, &buff) == -1) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; if (error) error->push_back(format_string(L"File \'%ls\' does not exist", target)); } @@ -1178,7 +1169,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const { if (wstat(target, &buff) != -1) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; if (error) error->push_back(format_string(L"File \'%ls\' exists", target)); } @@ -1192,7 +1183,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const { if (had_cmd) { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_END; + color.at(tok_get_pos(&tok)) = highlight_spec_statement_terminator; had_cmd = 0; use_command = 1; use_function = 1; @@ -1201,7 +1192,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const } else { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; if (error) error->push_back(L"No job to put in background"); } @@ -1211,7 +1202,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const case TOK_END: { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_END; + color.at(tok_get_pos(&tok)) = highlight_spec_statement_terminator; had_cmd = 0; use_command = 1; use_function = 1; @@ -1222,7 +1213,7 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const case TOK_COMMENT: { - color.at(tok_get_pos(&tok)) = HIGHLIGHT_COMMENT; + color.at(tok_get_pos(&tok)) = highlight_spec_comment; break; } @@ -1234,14 +1225,14 @@ static void tokenize(const wchar_t * const buff, std::vector &color, const */ if (error) error->push_back(tok_last(&tok)); - color.at(tok_get_pos(&tok)) = HIGHLIGHT_ERROR; + color.at(tok_get_pos(&tok)) = highlight_spec_error; break; } } } } -void highlight_shell(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) +void highlight_shell(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) { if (1) { @@ -1254,7 +1245,7 @@ void highlight_shell(const wcstring &buff, std::vector &color, size_t pos, } // PCA This function does I/O, (calls is_potential_path, path_get_path, maybe others) and so ought to only run on a background thread -void highlight_shell_classic(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) +void highlight_shell_classic(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) { ASSERT_IS_BACKGROUND_THREAD(); @@ -1265,7 +1256,7 @@ void highlight_shell_classic(const wcstring &buff, std::vector &color, size if (length == 0) return; - std::fill(color.begin(), color.end(), -1); + std::fill(color.begin(), color.end(), (highlight_spec_t)highlight_spec_invalid); /* Do something sucky and get the current working directory on this background thread. This should really be passed in. */ const wcstring working_directory = env_get_pwd_slash(); @@ -1296,7 +1287,7 @@ void highlight_shell_classic(const wcstring &buff, std::vector &color, size //our subcolors start at color + (begin-subbuff)+1 size_t start = begin - subbuff + 1, len = wcslen(begin + 1); - std::vector subcolors(len, -1); + std::vector subcolors(len, highlight_spec_invalid); highlight_shell(begin+1, subcolors, -1, error, vars); @@ -1307,7 +1298,7 @@ void highlight_shell_classic(const wcstring &buff, std::vector &color, size assert(end >= subbuff); if ((size_t)(end - subbuff) < length) { - color.at(end-subbuff)=HIGHLIGHT_OPERATOR; + color.at(end-subbuff)=highlight_spec_operator; } if (done) @@ -1324,8 +1315,8 @@ void highlight_shell_classic(const wcstring &buff, std::vector &color, size int last_val=0; for (size_t i=0; i < buff.size(); i++) { - int ¤t_val = color.at(i); - if (current_val >= 0) + highlight_spec_t ¤t_val = color.at(i); + if (current_val != highlight_spec_invalid) { last_val = current_val; } @@ -1360,10 +1351,10 @@ void highlight_shell_classic(const wcstring &buff, std::vector &color, size { for (ptrdiff_t i=tok_begin-cbuff; i < (tok_end-cbuff); i++) { - // Don't color HIGHLIGHT_ERROR because it looks dorky. For example, trying to cd into a non-directory would show an underline and also red. - if (!(color.at(i) & HIGHLIGHT_ERROR)) + // Don't color highlight_spec_error because it looks dorky. For example, trying to cd into a non-directory would show an underline and also red. + if (highlight_get_primary(color.at(i)) != highlight_spec_error) { - color.at(i) |= HIGHLIGHT_VALID_PATH; + color.at(i) |= highlight_modifier_valid_path; } } } @@ -1387,10 +1378,10 @@ void highlight_shell_classic(const wcstring &buff, std::vector &color, size } /* This function is a disaster badly in need of refactoring. */ -static void color_argument_internal(const wcstring &buffstr, std::vector::iterator colors) +static void color_argument_internal(const wcstring &buffstr, std::vector::iterator colors) { const size_t buff_len = buffstr.size(); - std::fill(colors, colors + buff_len, HIGHLIGHT_PARAM); + std::fill(colors, colors + buff_len, (highlight_spec_t)highlight_spec_param); enum {e_unquoted, e_single_quoted, e_double_quoted} mode = e_unquoted; int bracket_count=0; @@ -1403,7 +1394,7 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i { if (c == L'\\') { - int fill_color = HIGHLIGHT_ESCAPE; //may be set to HIGHLIGHT_ERROR + int fill_color = highlight_spec_escape; //may be set to highlight_error const size_t backslash_pos = in_pos; size_t fill_end = backslash_pos; @@ -1414,7 +1405,7 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i if (escaped_char == L'\0') { fill_end = in_pos; - fill_color = HIGHLIGHT_ERROR; + fill_color = highlight_spec_error; } else if (wcschr(L"~%", escaped_char)) { @@ -1502,7 +1493,7 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i // It's an error if we exceeded the max value if (res > max_val) - fill_color = HIGHLIGHT_ERROR; + fill_color = highlight_spec_error; // Subtract one from in_pos, so that the increment in the loop will move to the next character in_pos--; @@ -1520,7 +1511,7 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i { if (in_pos == 0) { - colors[in_pos] = HIGHLIGHT_OPERATOR; + colors[in_pos] = highlight_spec_operator; } break; } @@ -1528,12 +1519,12 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i case L'$': { assert(in_pos < buff_len); - int dollar_color = HIGHLIGHT_ERROR; + int dollar_color = highlight_spec_error; if (in_pos + 1 < buff_len) { wchar_t next = buffstr.at(in_pos + 1); if (next == L'$' || wcsvarchr(next)) - dollar_color = HIGHLIGHT_OPERATOR; + dollar_color = highlight_spec_operator; } colors[in_pos] = dollar_color; break; @@ -1545,20 +1536,20 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i case L'(': case L')': { - colors[in_pos] = HIGHLIGHT_OPERATOR; + colors[in_pos] = highlight_spec_operator; break; } case L'{': { - colors[in_pos] = HIGHLIGHT_OPERATOR; + colors[in_pos] = highlight_spec_operator; bracket_count++; break; } case L'}': { - colors[in_pos] = HIGHLIGHT_OPERATOR; + colors[in_pos] = highlight_spec_operator; bracket_count--; break; } @@ -1567,7 +1558,7 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i { if (bracket_count > 0) { - colors[in_pos] = HIGHLIGHT_OPERATOR; + colors[in_pos] = highlight_spec_operator; } break; @@ -1575,14 +1566,14 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i case L'\'': { - colors[in_pos] = HIGHLIGHT_QUOTE; + colors[in_pos] = highlight_spec_quote; mode = e_single_quoted; break; } case L'\"': { - colors[in_pos] = HIGHLIGHT_QUOTE; + colors[in_pos] = highlight_spec_quote; mode = e_double_quoted; break; } @@ -1597,7 +1588,7 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i */ case e_single_quoted: { - colors[in_pos] = HIGHLIGHT_QUOTE; + colors[in_pos] = highlight_spec_quote; if (c == L'\\') { // backslash @@ -1606,8 +1597,8 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i const wchar_t escaped_char = buffstr.at(in_pos + 1); if (escaped_char == L'\\' || escaped_char == L'\'') { - colors[in_pos] = HIGHLIGHT_ESCAPE; //backslash - colors[in_pos + 1] = HIGHLIGHT_ESCAPE; //escaped char + colors[in_pos] = highlight_spec_escape; //backslash + colors[in_pos + 1] = highlight_spec_escape; //escaped char in_pos += 1; //skip over backslash } } @@ -1624,7 +1615,7 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i */ case e_double_quoted: { - colors[in_pos] = HIGHLIGHT_QUOTE; + colors[in_pos] = highlight_spec_quote; switch (c) { case L'"': @@ -1641,8 +1632,8 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i const wchar_t escaped_char = buffstr.at(in_pos + 1); if (escaped_char == L'\\' || escaped_char == L'\'' || escaped_char == L'$') { - colors[in_pos] = HIGHLIGHT_ESCAPE; //backslash - colors[in_pos + 1] = HIGHLIGHT_ESCAPE; //escaped char + colors[in_pos] = highlight_spec_escape; //backslash + colors[in_pos + 1] = highlight_spec_escape; //escaped char in_pos += 1; //skip over backslash } } @@ -1651,12 +1642,12 @@ static void color_argument_internal(const wcstring &buffstr, std::vector::i case L'$': { - int dollar_color = HIGHLIGHT_ERROR; + int dollar_color = highlight_spec_error; if (in_pos + 1 < buff_len) { wchar_t next = buffstr.at(in_pos + 1); if (next == L'$' || wcsvarchr(next)) - dollar_color = HIGHLIGHT_OPERATOR; + dollar_color = highlight_spec_operator; } colors[in_pos] = dollar_color; break; @@ -1685,7 +1676,7 @@ class highlighter_t const wcstring working_directory; /* The resulting colors */ - typedef std::vector color_array_t; + typedef std::vector color_array_t; color_array_t color_array; /* The parse tree of the buff */ @@ -1766,9 +1757,9 @@ void highlighter_t::color_argument(const parse_node_t &node) /* Highlight the parens. The open paren must exist; the closed paren may not if it was incomplete. */ assert(cmdsub_start < arg_str.size()); - this->color_array.at(arg_subcmd_start) = HIGHLIGHT_OPERATOR; + this->color_array.at(arg_subcmd_start) = highlight_spec_operator; if (arg_subcmd_end < this->buff.size()) - this->color_array.at(arg_subcmd_end) = HIGHLIGHT_OPERATOR; + this->color_array.at(arg_subcmd_end) = highlight_spec_operator; /* Compute the cursor's position within the cmdsub. We must be past the open paren (hence >) but can be at the end of the string or closed paren (hence <=) */ size_t cursor_subpos = CURSOR_POSITION_INVALID; @@ -1843,7 +1834,7 @@ void highlighter_t::color_arguments(const parse_node_t &list_node) bool is_help = string_prefixes_string(param, L"--help") || string_prefixes_string(param, L"-h"); if (!is_help && ! is_potential_cd_path(param, working_directory, PATH_EXPAND_TILDE, NULL)) { - this->color_node(*child, HIGHLIGHT_ERROR); + this->color_node(*child, highlight_spec_error); } } } @@ -1865,7 +1856,7 @@ void highlighter_t::color_redirection(const parse_node_t &redirection_node) const enum token_type redirect_type = this->parse_tree.type_for_redirection(redirection_node, this->buff, NULL, &target); /* We may get a TOK_NONE redirection type, e.g. if the redirection is invalid */ - this->color_node(*redirection_primitive, redirect_type == TOK_NONE ? HIGHLIGHT_ERROR : HIGHLIGHT_REDIRECTION); + this->color_node(*redirection_primitive, redirect_type == TOK_NONE ? highlight_spec_error : highlight_spec_redirection); /* Check if the argument contains a command substitution. If so, highlight it as a param even though it's a command redirection, and don't try to do any other validation. */ if (parse_util_locate_cmdsubst(target.c_str(), NULL, NULL, true) != 0) @@ -1969,7 +1960,7 @@ void highlighter_t::color_redirection(const parse_node_t &redirection_node) if (redirection_target != NULL) { - this->color_node(*redirection_target, target_is_valid ? HIGHLIGHT_REDIRECTION : HIGHLIGHT_ERROR); + this->color_node(*redirection_target, target_is_valid ? highlight_spec_redirection : highlight_spec_error); } } } @@ -2089,16 +2080,16 @@ const highlighter_t::color_array_t & highlighter_t::highlight() case symbol_decorated_statement: case symbol_if_statement: { - this->color_children(node, parse_token_type_string, HIGHLIGHT_COMMAND); + this->color_children(node, parse_token_type_string, highlight_spec_command); // Color the 'end' - this->color_children(node, symbol_end_command, HIGHLIGHT_COMMAND); + this->color_children(node, symbol_end_command, highlight_spec_command); } break; case parse_token_type_background: case parse_token_type_end: { - this->color_node(node, HIGHLIGHT_END); + this->color_node(node, highlight_spec_statement_terminator); } break; @@ -2120,7 +2111,7 @@ const highlighter_t::color_array_t & highlighter_t::highlight() { is_valid_cmd = command_is_valid(cmd, decoration, working_directory, vars); } - this->color_node(*cmd_node, is_valid_cmd ? HIGHLIGHT_COMMAND : HIGHLIGHT_ERROR); + this->color_node(*cmd_node, is_valid_cmd ? highlight_spec_command : highlight_spec_error); } } break; @@ -2140,11 +2131,11 @@ const highlighter_t::color_array_t & highlighter_t::highlight() case parse_special_type_parse_error: case parse_special_type_tokenizer_error: - this->color_node(node, HIGHLIGHT_ERROR); + this->color_node(node, highlight_spec_error); break; case parse_special_type_comment: - this->color_node(node, HIGHLIGHT_COMMENT); + this->color_node(node, highlight_spec_comment); break; default: @@ -2172,10 +2163,10 @@ const highlighter_t::color_array_t & highlighter_t::highlight() /* It is, underline it. */ for (size_t i=node.source_start; i < node.source_start + node.source_length; i++) { - /* Don't color HIGHLIGHT_ERROR because it looks dorky. For example, trying to cd into a non-directory would show an underline and also red. */ - if (! (this->color_array.at(i) & HIGHLIGHT_ERROR)) + /* Don't color highlight_spec_error because it looks dorky. For example, trying to cd into a non-directory would show an underline and also red. */ + if (highlight_get_primary(this->color_array.at(i)) != highlight_spec_error) { - this->color_array.at(i) |= HIGHLIGHT_VALID_PATH; + this->color_array.at(i) |= highlight_modifier_valid_path; } } } @@ -2186,7 +2177,7 @@ const highlighter_t::color_array_t & highlighter_t::highlight() return color_array; } -void highlight_shell_new_parser(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) +void highlight_shell_new_parser(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) { /* Do something sucky and get the current working directory on this background thread. This should really be passed in. */ const wcstring working_directory = env_get_pwd_slash(); @@ -2199,7 +2190,7 @@ void highlight_shell_new_parser(const wcstring &buff, std::vector &color, s /** Perform quote and parenthesis highlighting on the specified string. */ -static void highlight_universal_internal(const wcstring &buffstr, std::vector &color, size_t pos) +static void highlight_universal_internal(const wcstring &buffstr, std::vector &color, size_t pos) { assert(buffstr.size() == color.size()); if (pos < buffstr.size()) @@ -2246,8 +2237,8 @@ static void highlight_universal_internal(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) +void highlight_universal(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars) { assert(buff.size() == color.size()); std::fill(color.begin(), color.end(), 0); diff --git a/highlight.h b/highlight.h index 40a535518..7c6000b17 100644 --- a/highlight.h +++ b/highlight.h @@ -9,66 +9,47 @@ #include "env.h" #include "util.h" -#include "screen.h" #include "color.h" -/** - Internal value representing highlighting of normal text -*/ -#define HIGHLIGHT_NORMAL 0x1 -/** - Internal value representing highlighting of an error -*/ -#define HIGHLIGHT_ERROR 0x2 -/** - Internal value representing highlighting of a command -*/ -#define HIGHLIGHT_COMMAND 0x4 -/** - Internal value representing highlighting of a process separator -*/ -#define HIGHLIGHT_END 0x8 -/** - Internal value representing highlighting of a regular command parameter -*/ -#define HIGHLIGHT_PARAM 0x10 -/** - Internal value representing highlighting of a comment -*/ -#define HIGHLIGHT_COMMENT 0x20 -/** - Internal value representing highlighting of a matching parenteses, etc. -*/ -#define HIGHLIGHT_MATCH 0x40 -/** - Internal value representing highlighting of a search match -*/ -#define HIGHLIGHT_SEARCH_MATCH 0x80 -/** - Internal value representing highlighting of an operator -*/ -#define HIGHLIGHT_OPERATOR 0x100 -/** - Internal value representing highlighting of an escape sequence -*/ -#define HIGHLIGHT_ESCAPE 0x200 -/** - Internal value representing highlighting of a quoted string -*/ -#define HIGHLIGHT_QUOTE 0x400 -/** - Internal value representing highlighting of an IO redirection -*/ -#define HIGHLIGHT_REDIRECTION 0x800 -/** - Internal value representing highlighting a potentially valid path -*/ -#define HIGHLIGHT_VALID_PATH 0x1000 +/* Internally, we specify highlight colors using a set of bits. Each highlight_spec is a 32 bit uint. We divide this into low 16 (foreground) and high 16 (background). Each half we further subdivide into low 8 (primary) and high 8 (modifiers). The primary is not a bitmask; specify exactly one. The modifiers are a bitmask; specify any number */ +enum +{ + /* The following values are mutually exclusive; specify at most one */ + highlight_spec_normal = 0, // normal text + highlight_spec_error, // error + highlight_spec_command, //command + highlight_spec_statement_terminator, //process separator + highlight_spec_param, //command parameter (argument) + highlight_spec_comment, //comment + highlight_spec_match, //matching parenthesis, etc. + highlight_spec_search_match, //search match + highlight_spec_operator, //operator + highlight_spec_escape, //escape sequences + highlight_spec_quote, //quoted string + highlight_spec_redirection, //redirection + highlight_spec_autosuggestion, //autosuggestion + + HIGHLIGHT_SPEC_PRIMARY_MASK = 0xFF, + + /* The following values are modifiers */ + highlight_modifier_valid_path = 0x100, + + /* Very special value */ + highlight_spec_invalid = 0xFFFF + +}; +typedef uint32_t highlight_spec_t; + +inline highlight_spec_t highlight_get_primary(highlight_spec_t val) +{ + return val & HIGHLIGHT_SPEC_PRIMARY_MASK; +} + +inline highlight_spec_t highlight_make_background(highlight_spec_t val) +{ + return val << 16; +} -/** - Internal value representing highlighting an autosuggestion -*/ -#define HIGHLIGHT_AUTOSUGGESTION 0x2000 class history_item_t; struct file_detection_context_t; @@ -83,8 +64,8 @@ struct file_detection_context_t; \param pos the cursor position. Used for quote matching, etc. \param error a list in which a description of each error will be inserted. May be 0, in whcich case no error descriptions will be generated. */ -void highlight_shell(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); -void highlight_shell_new_parser(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); +void highlight_shell(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); +void highlight_shell_new_parser(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); /** Perform syntax highlighting for the text in buff. Matching quotes and paranthesis are highlighted. The result is @@ -96,7 +77,7 @@ void highlight_shell_new_parser(const wcstring &buffstr, std::vector &color \param pos the cursor position. Used for quote matching, etc. \param error a list in which a description of each error will be inserted. May be 0, in whcich case no error descriptions will be generated. */ -void highlight_universal(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); +void highlight_universal(const wcstring &buffstr, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); /** Translate from HIGHLIGHT_* to FISH_COLOR_* according to environment @@ -105,10 +86,10 @@ void highlight_universal(const wcstring &buffstr, std::vector &color, size_ Example: If the environment variable FISH_FISH_COLOR_ERROR is set to 'red', a - call to highlight_get_color( HIGHLIGHT_ERROR) will return + call to highlight_get_color( highlight_error) will return FISH_COLOR_RED. */ -rgb_color_t highlight_get_color(int highlight, bool is_background); +rgb_color_t highlight_get_color(highlight_spec_t highlight, bool is_background); /** Given a command 'str' from the history, try to determine whether we ought to suggest it by specially recognizing the command. Returns true if we validated the command. If so, returns by reference whether the suggestion is valid or not. @@ -135,8 +116,8 @@ typedef unsigned int path_flags_t; bool is_potential_path(const wcstring &const_path, const wcstring_list_t &directories, path_flags_t flags, wcstring *out_path = NULL); /* For testing */ -void highlight_shell_classic(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); -void highlight_shell_new_parser(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); +void highlight_shell_classic(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); +void highlight_shell_new_parser(const wcstring &buff, std::vector &color, size_t pos, wcstring_list_t *error, const env_vars_snapshot_t &vars); #endif diff --git a/reader.cpp b/reader.cpp index 6cf77ae41..d7f5086a0 100644 --- a/reader.cpp +++ b/reader.cpp @@ -180,9 +180,6 @@ static volatile unsigned int s_generation_count; /* This pthreads generation count is set when an autosuggestion background thread starts up, so it can easily check if the work it is doing is no longer useful. */ static pthread_key_t generation_count_key; -/* A color is an int */ -typedef int color_t; - static void set_command_line_and_position(const wcstring &new_str, size_t pos); /** @@ -274,7 +271,7 @@ public: color[i] is the classification (according to the enum in highlight.h) of buff[i]. */ - std::vector colors; + std::vector colors; /** An array defining the block level at each character. */ std::vector indents; @@ -528,8 +525,8 @@ static void reader_repaint() if (len < 1) len = 1; - std::vector colors = data->colors; - colors.resize(len, HIGHLIGHT_AUTOSUGGESTION); + std::vector colors = data->colors; + colors.resize(len, highlight_spec_autosuggestion); std::vector indents = data->indents; indents.resize(len); @@ -637,7 +634,7 @@ void reader_data_t::command_line_changed() size_t len = command_length(); /* When we grow colors, propagate the last color (if any), under the assumption that usually it will be correct. If it is, it avoids a repaint. */ - color_t last_color = colors.empty() ? color_t() : colors.back(); + highlight_spec_t last_color = colors.empty() ? highlight_spec_t() : colors.back(); colors.resize(len, last_color); indents.resize(len); @@ -1523,7 +1520,7 @@ static void reader_flash() for (size_t i=0; ibuff_pos; i++) { - data->colors.at(i) = HIGHLIGHT_SEARCH_MATCH<<16; + data->colors.at(i) = highlight_spec_search_match<<16; } reader_repaint(); @@ -2621,7 +2618,7 @@ public: const wcstring string_to_highlight; /** Color buffer */ - std::vector colors; + std::vector colors; /** The position to use for bracket matching */ const size_t match_highlight_pos; @@ -2676,7 +2673,7 @@ static void highlight_search(void) size_t end = match_pos + needle.size(); for (size_t i=match_pos; i < end; i++) { - data->colors.at(i) |= (HIGHLIGHT_SEARCH_MATCH<<16); + data->colors.at(i) |= (highlight_spec_search_match<<16); } } } diff --git a/reader.h b/reader.h index e028e2f03..cd32e751b 100644 --- a/reader.h +++ b/reader.h @@ -16,6 +16,7 @@ #include "io.h" #include "common.h" #include "complete.h" +#include "highlight.h" class parser_t; class completion_t; @@ -173,7 +174,7 @@ void reader_set_complete_function(complete_function_t); The type of a highlight function. */ class env_vars_snapshot_t; -typedef void (*highlight_function_t)(const wcstring &, std::vector &, size_t, wcstring_list_t *, const env_vars_snapshot_t &vars); +typedef void (*highlight_function_t)(const wcstring &, std::vector &, size_t, wcstring_list_t *, const env_vars_snapshot_t &vars); /** Specify function for syntax highlighting. The function must take these arguments: diff --git a/screen.cpp b/screen.cpp index 711aebabd..68b78ebff 100644 --- a/screen.cpp +++ b/screen.cpp @@ -668,7 +668,7 @@ static void s_move(screen_t *s, data_buffer_t *b, int new_x, int new_y) /** Set the pen color for the terminal */ -static void s_set_color(screen_t *s, data_buffer_t *b, int c) +static void s_set_color(screen_t *s, data_buffer_t *b, highlight_spec_t c) { scoped_buffer_t scoped_buffer(b); @@ -1232,7 +1232,7 @@ void s_write(screen_t *s, const wcstring &right_prompt, const wcstring &commandline, size_t explicit_len, - const int *colors, + const highlight_spec_t *colors, const int *indent, size_t cursor_pos) { diff --git a/screen.h b/screen.h index ef74383d7..96f9706af 100644 --- a/screen.h +++ b/screen.h @@ -13,6 +13,7 @@ #define FISH_SCREEN_H #include +#include "highlight.h" /** A class representing a single line of a screen. @@ -20,7 +21,7 @@ struct line_t { std::vector text; - std::vector colors; + std::vector colors; bool is_soft_wrapped; line_t() : text(), colors(), is_soft_wrapped(false) @@ -33,7 +34,7 @@ struct line_t colors.clear(); } - void append(wchar_t txt, int color) + void append(wchar_t txt, highlight_spec_t color) { text.push_back(txt); colors.push_back(color); @@ -49,7 +50,7 @@ struct line_t return text.at(idx); } - int color_at(size_t idx) const + highlight_spec_t color_at(size_t idx) const { return colors.at(idx); } @@ -187,7 +188,7 @@ void s_write(screen_t *s, const wcstring &right_prompt, const wcstring &commandline, size_t explicit_len, - const int *colors, + const highlight_spec_t *colors, const int *indent, size_t cursor_pos);