diff --git a/src/common.cpp b/src/common.cpp index 0c052282f..84d2cdd8e 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -51,6 +51,7 @@ static pthread_t main_thread_id = 0; static bool thread_asserts_cfg_for_testing = false; wchar_t ellipsis_char; +const wchar_t *ellipsis_str = nullptr; wchar_t omitted_newline_char; wchar_t obfuscation_read_char; bool g_profiling_active = false; @@ -507,7 +508,14 @@ void fish_setlocale() { // true/false value since the code points are in the BMP but we're going to be paranoid. This // is also technically wrong if we're not in a Unicode locale but we expect (or hope) // can_be_encoded() will return false in that case. - ellipsis_char = can_be_encoded(L'\u2026') ? L'\u2026' : L'$'; // "horizontal ellipsis" + if (can_be_encoded(L'\u2026')) { + ellipsis_char = L'\u2026'; + ellipsis_str = L"\u2026"; + } + else { + ellipsis_char = L'$'; // "horizontal ellipsis" + ellipsis_str = L"..."; + } omitted_newline_char = can_be_encoded(L'\u23CE') ? L'\u23CE' : L'~'; // "return" obfuscation_read_char = can_be_encoded(L'\u25CF') ? L'\u25CF' : L'#'; // "black circle" } diff --git a/src/common.h b/src/common.h index 9320c8e3d..a5b4bb18e 100644 --- a/src/common.h +++ b/src/common.h @@ -183,6 +183,8 @@ extern struct termios shell_modes; /// The character to use where the text has been truncated. Is an ellipsis on unicode system and a $ /// on other systems. extern wchar_t ellipsis_char; +/// The character or string to use where text has been truncated (ellipsis if possible, otherwise ...) +extern const wchar_t *ellipsis_str; /// Character representing an omitted newline at the end of text. extern wchar_t omitted_newline_char; @@ -766,7 +768,7 @@ void assert_is_not_forked_child(const char *who); /// Detect if we are Windows Subsystem for Linux by inspecting /proc/sys/kernel/osrelease /// and checking if "Microsoft" is in the first line. -/// See https://github.com/Microsoft/WSL/issues/423 and Microsoft/WSL#2997 +/// See https://github.com/Microsoft/WSL/issues/423 and Microsoft/WSL#2997 constexpr bool is_windows_subsystem_for_linux() { #ifdef WSL return true; diff --git a/src/pager.cpp b/src/pager.cpp index 702ca0888..a5f0bfcd3 100644 --- a/src/pager.cpp +++ b/src/pager.cpp @@ -481,16 +481,13 @@ bool pager_t::completion_try_print(size_t cols, const wcstring &prefix, const co assert(stop_row - start_row <= term_height); completion_print(cols, width_by_column, start_row, stop_row, prefix, lst, rendering); - // Ellipsis helper string. Either empty or containing the ellipsis char. - const wchar_t ellipsis_string[] = {ellipsis_char == L'\x2026' ? L'\x2026' : L'\0', L'\0'}; - // Add the progress line. It's a "more to disclose" line if necessary, or a row listing if // it's scrollable; otherwise ignore it. // We should never have one row remaining to disclose (else we would have just disclosed it) wcstring progress_text; assert(rendering->remaining_to_disclose != 1); if (rendering->remaining_to_disclose > 1) { - progress_text = format_string(_(L"%lsand %lu more rows"), ellipsis_string, + progress_text = format_string(_(L"%lsand %lu more rows"), ellipsis_str, (unsigned long)rendering->remaining_to_disclose); } else if (start_row > 0 || stop_row < row_count) { // We have a scrollable interface. The +1 here is because we are zero indexed, but want diff --git a/src/parse_execution.cpp b/src/parse_execution.cpp index c9bcd6f58..17843b679 100644 --- a/src/parse_execution.cpp +++ b/src/parse_execution.cpp @@ -664,13 +664,10 @@ parse_execution_result_t parse_execution_context_t::handle_command_not_found( if (!args.empty()) { const wcstring argument = get_source(args.at(0)); - wcstring ellipsis_str = wcstring(1, ellipsis_char); - if (ellipsis_str == L"$") ellipsis_str = L"..."; - // Looks like a command. this->report_error(statement, ERROR_BAD_EQUALS_IN_COMMAND5, argument.c_str(), name_str.c_str(), val_str.c_str(), argument.c_str(), - ellipsis_str.c_str()); + ellipsis_str); } else { wcstring assigned_val = reconstruct_orig_str(val_str); this->report_error(statement, ERROR_BAD_COMMAND_ASSIGN_ERR_MSG, name_str.c_str(), diff --git a/src/proc.cpp b/src/proc.cpp index b349aaf63..b7fb937ae 100644 --- a/src/proc.cpp +++ b/src/proc.cpp @@ -452,8 +452,7 @@ static wcstring truncate_command(const wcstring &cmd) { } // Truncation required. - const bool ellipsis_is_unicode = (ellipsis_char == L'\x2026'); - const size_t ellipsis_length = ellipsis_is_unicode ? 1 : 3; + const size_t ellipsis_length = wcslen(ellipsis_str); //no need for wcwidth size_t trunc_length = max_len - ellipsis_length; // Eat trailing whitespace. while (trunc_length > 0 && iswspace(cmd.at(trunc_length - 1))) { @@ -461,11 +460,7 @@ static wcstring truncate_command(const wcstring &cmd) { } wcstring result = wcstring(cmd, 0, trunc_length); // Append ellipsis. - if (ellipsis_is_unicode) { - result.push_back(ellipsis_char); - } else { - result.append(L"..."); - } + result.append(ellipsis_str); return result; }