Make ESCAPE_ALL the default and call its inverse ESCAPE_NO_PRINTABLES

ESCAPE_ALL is not really a helpful name. Also it's the most common flag.
Let's make it the default so we can remove this unhelpful name.

While at it, let's add a default value for the flags argument, which helps
most callers.

The absence of ESCAPE_ALL makes it only escape nonprintable characters
(with some exceptions). We use this for displaying strings in the completion
pager as well as for the human-readable output of "set", "set -S", "bind"
and "functions".

No functional change.
This commit is contained in:
Johannes Altmanninger 2022-07-25 16:25:04 +02:00
parent e5d5391687
commit 8729623cec
23 changed files with 72 additions and 83 deletions

View File

@ -218,7 +218,7 @@ void autoload_t::perform_autoload(const wcstring &path, parser_t &parser) {
// - we source the file.
// We don't create a buffer or check ifs or create a read_limit
wcstring script_source = L"source " + escape_string(path, ESCAPE_ALL);
wcstring script_source = L"source " + escape_string(path);
auto prev_statuses = parser.get_last_statuses();
const cleanup_t put_back([&] { parser.set_last_statuses(prev_statuses); });
parser.eval(script_source, io_chain_t{});

View File

@ -149,11 +149,11 @@ void builtin_print_help(parser_t &parser, const io_streams_t &streams, const wch
wcstring *error_message) {
// This won't ever work if no_exec is set.
if (no_exec()) return;
const wcstring name_esc = escape_string(name, ESCAPE_ALL);
const wcstring name_esc = escape_string(name);
wcstring cmd = format_string(L"__fish_print_help %ls ", name_esc.c_str());
io_chain_t ios;
if (error_message) {
cmd.append(escape_string(*error_message, ESCAPE_ALL));
cmd.append(escape_string(*error_message));
// If it's an error, redirect the output of __fish_print_help to stderr
ios.push_back(std::make_shared<io_fd_t>(STDOUT_FILENO, STDERR_FILENO));
}

View File

@ -83,14 +83,12 @@ bool builtin_bind_t::list_one(const wcstring &seq, const wcstring &bind_mode, bo
streams.out.append(L" --preset");
}
if (bind_mode != DEFAULT_BIND_MODE) {
const wcstring emode = escape_string(bind_mode, ESCAPE_ALL);
streams.out.append(L" -M ");
streams.out.append(emode);
streams.out.append(escape_string(bind_mode));
}
if (!sets_mode.empty() && sets_mode != bind_mode) {
const wcstring esets_mode = escape_string(sets_mode, ESCAPE_ALL);
streams.out.append(L" -m ");
streams.out.append(esets_mode);
streams.out.append(escape_string(sets_mode));
}
// Append the name.
@ -100,15 +98,14 @@ bool builtin_bind_t::list_one(const wcstring &seq, const wcstring &bind_mode, bo
streams.out.append_format(L" -k %ls", tname.c_str());
} else {
// No key name, so no -k; we show the escape sequence directly.
const wcstring eseq = escape_string(seq, ESCAPE_ALL);
const wcstring eseq = escape_string(seq);
streams.out.append_format(L" %ls", eseq.c_str());
}
// Now show the list of commands.
for (const auto &ecmd : ecmds) {
const wcstring escaped_ecmd = escape_string(ecmd, ESCAPE_ALL);
streams.out.push_back(' ');
streams.out.append(escaped_ecmd);
streams.out.append(escape_string(ecmd));
}
streams.out.push_back(L'\n');
@ -171,7 +168,7 @@ bool builtin_bind_t::get_terminfo_sequence(const wcstring &seq, wcstring *out_se
return true;
}
wcstring eseq = escape_string(seq, 0);
wcstring eseq = escape_string(seq, ESCAPE_NO_PRINTABLES);
if (!opts->silent) {
if (errno == ENOENT) {
streams.err.append_format(_(L"%ls: No key with name '%ls' found\n"), L"bind",
@ -283,7 +280,7 @@ bool builtin_bind_t::insert(int optind, int argc, const wchar_t **argv, io_strea
}
if (!list_one(seq, opts->bind_mode, opts->user, opts->preset, streams)) {
wcstring eseq = escape_string(argv[optind], 0);
wcstring eseq = escape_string(argv[optind], ESCAPE_NO_PRINTABLES);
if (!opts->silent) {
if (opts->use_terminfo) {
streams.err.append_format(_(L"%ls: No binding found for key '%ls'\n"), cmd,

View File

@ -152,7 +152,7 @@ static int report_function_metadata(const wcstring &funcname, bool verbose, io_s
path = L"stdin";
}
shadows_scope = props->shadow_scope ? L"scope-shadowing" : L"no-scope-shadowing";
description = escape_string(props->description, ESCAPE_NO_QUOTED);
description = escape_string(props->description, ESCAPE_NO_PRINTABLES | ESCAPE_NO_QUOTED);
}
if (metadata_as_comments) {

View File

@ -380,7 +380,7 @@ static int validate_read_args(const wchar_t *cmd, read_cmd_opts_t &opts, int arg
}
if (opts.prompt_str) {
opts.prompt_cmd = L"echo " + escape_string(opts.prompt_str, ESCAPE_ALL);
opts.prompt_cmd = L"echo " + escape_string(opts.prompt_str);
opts.prompt = opts.prompt_cmd.c_str();
} else if (!opts.prompt) {
opts.prompt = DEFAULT_READ_PROMPT;

View File

@ -545,7 +545,7 @@ static void show_scope(const wchar_t *var_name, int scope, io_streams_t &streams
if (i >= 50 && i < vals.size() - 50) continue;
}
const wcstring value = vals[i];
const wcstring escaped_val = escape_string(value, ESCAPE_NO_QUOTED, STRING_STYLE_SCRIPT);
const wcstring escaped_val = escape_string(value, ESCAPE_NO_PRINTABLES | ESCAPE_NO_QUOTED);
streams.out.append_format(_(L"$%ls[%d]: |%ls|\n"), var_name, i + 1, escaped_val.c_str());
}
}
@ -569,7 +569,7 @@ static int builtin_set_show(const wchar_t *cmd, const set_cmd_opts_t &opts, int
auto inherited = inheriteds.find(name);
if (inherited != inheriteds.end()) {
const wcstring escaped_val =
escape_string(inherited->second, ESCAPE_NO_QUOTED, STRING_STYLE_SCRIPT);
escape_string(inherited->second, ESCAPE_NO_PRINTABLES | ESCAPE_NO_QUOTED);
streams.out.append_format(_(L"$%ls: originally inherited as |%ls|\n"), name.c_str(),
escaped_val.c_str());
}
@ -597,7 +597,7 @@ static int builtin_set_show(const wchar_t *cmd, const set_cmd_opts_t &opts, int
auto inherited = inheriteds.find(arg);
if (inherited != inheriteds.end()) {
const wcstring escaped_val =
escape_string(inherited->second, ESCAPE_NO_QUOTED, STRING_STYLE_SCRIPT);
escape_string(inherited->second, ESCAPE_NO_PRINTABLES | ESCAPE_NO_QUOTED);
streams.out.append_format(_(L"$%ls: originally inherited as |%ls|\n"), arg,
escaped_val.c_str());
}
@ -738,12 +738,9 @@ static int builtin_set_set(const wchar_t *cmd, set_cmd_opts_t &opts, int argc, c
streams.err.append_format(BUILTIN_ERR_VARNAME, cmd, split->varname.c_str());
auto pos = split->varname.find(L'=');
if (pos != wcstring::npos) {
streams.err.append_format(
L"%ls: Did you mean `set %ls %ls`?", cmd,
escape_string(split->varname.substr(0, pos), ESCAPE_ALL, STRING_STYLE_SCRIPT)
.c_str(),
escape_string(split->varname.substr(pos + 1), ESCAPE_ALL, STRING_STYLE_SCRIPT)
.c_str());
streams.err.append_format(L"%ls: Did you mean `set %ls %ls`?", cmd,
escape_string(split->varname.substr(0, pos)).c_str(),
escape_string(split->varname.substr(pos + 1)).c_str());
}
builtin_print_error_trailer(parser, streams.err, cmd);
return STATUS_INVALID_ARGS;

View File

@ -61,7 +61,7 @@ maybe_t<int> builtin_source(parser_t &parser, io_streams_t &streams, const wchar
} else {
opened_fd = autoclose_fd_t(wopen_cloexec(argv[optind], O_RDONLY));
if (!opened_fd.valid()) {
wcstring esc = escape_string(argv[optind], ESCAPE_ALL);
wcstring esc = escape_string(argv[optind]);
streams.err.append_format(_(L"%ls: Error encountered while sourcing file '%ls':\n"),
cmd, esc.c_str());
builtin_wperror(cmd, streams);
@ -70,7 +70,7 @@ maybe_t<int> builtin_source(parser_t &parser, io_streams_t &streams, const wchar
fd = opened_fd.fd();
if (fstat(fd, &buf) == -1) {
wcstring esc = escape_string(argv[optind], ESCAPE_ALL);
wcstring esc = escape_string(argv[optind]);
streams.err.append_format(_(L"%ls: Error encountered while sourcing file '%ls':\n"),
cmd, esc.c_str());
builtin_wperror(L"source", streams);
@ -78,7 +78,7 @@ maybe_t<int> builtin_source(parser_t &parser, io_streams_t &streams, const wchar
}
if (!S_ISREG(buf.st_mode)) {
wcstring esc = escape_string(argv[optind], ESCAPE_ALL);
wcstring esc = escape_string(argv[optind]);
streams.err.append_format(_(L"%ls: '%ls' is not a file\n"), cmd, esc.c_str());
return STATUS_CMD_ERROR;
}
@ -106,9 +106,10 @@ maybe_t<int> builtin_source(parser_t &parser, io_streams_t &streams, const wchar
parser.pop_block(sb);
if (retval != STATUS_CMD_OK) {
wcstring esc = escape_string(fn_intern, ESCAPE_ALL);
streams.err.append_format(_(L"%ls: Error while reading file '%ls'\n"), cmd,
fn_intern == intern_static(L"-") ? L"<stdin>" : esc.c_str());
wcstring esc = escape_string(fn_intern);
streams.err.append_format(
_(L"%ls: Error while reading file '%ls'\n"), cmd,
escape_string(fn_intern) == intern_static(L"-") ? L"<stdin>" : esc.c_str());
} else {
retval = parser.get_last_status();
}

View File

@ -705,9 +705,8 @@ static int string_escape(parser_t &parser, io_streams_t &streams, int argc, cons
// Currently, only the script style supports options.
// Ignore them for other styles for now.
escape_flags_t flags = 0;
if (opts.escape_style == STRING_STYLE_SCRIPT) {
flags = ESCAPE_ALL;
if (opts.no_quoted) flags |= ESCAPE_NO_QUOTED;
if (opts.escape_style == STRING_STYLE_SCRIPT && opts.no_quoted) {
flags |= ESCAPE_NO_QUOTED;
}
int nesc = 0;

View File

@ -869,7 +869,7 @@ wcstring escape_string_for_double_quotes(wcstring in) {
static void escape_string_script(const wchar_t *orig_in, size_t in_len, wcstring &out,
escape_flags_t flags) {
const wchar_t *in = orig_in;
const bool escape_all = static_cast<bool>(flags & ESCAPE_ALL);
const bool escape_printables = !(flags & ESCAPE_NO_PRINTABLES);
const bool no_quoted = static_cast<bool>(flags & ESCAPE_NO_QUOTED);
const bool no_tilde = static_cast<bool>(flags & ESCAPE_NO_TILDE);
const bool no_qmark = feature_test(features_t::qmark_noglob);
@ -981,7 +981,7 @@ static void escape_string_script(const wchar_t *orig_in, size_t in_len, wcstring
bool char_is_normal = (c == L'~' && no_tilde) || (c == L'?' && no_qmark);
if (!char_is_normal) {
need_escape = true;
if (escape_all) out += L'\\';
if (escape_printables) out += L'\\';
}
out += *in;
break;
@ -1016,7 +1016,7 @@ static void escape_string_script(const wchar_t *orig_in, size_t in_len, wcstring
}
// Use quoted escaping if possible, since most people find it easier to read.
if (!no_quoted && need_escape && !need_complex_escape && escape_all) {
if (!no_quoted && need_escape && !need_complex_escape && escape_printables) {
wchar_t single_quote = L'\'';
out.clear();
out.reserve(2 + in_len);

View File

@ -138,11 +138,12 @@ enum {
};
typedef unsigned int unescape_flags_t;
// Flags for the escape_string() and escape_string() functions. These are only applicable when the
// escape style is "script" (i.e., STRING_STYLE_SCRIPT).
// Flags for the escape_string() function. These are only applicable when the escape style is
// "script" (i.e., STRING_STYLE_SCRIPT).
enum {
/// Escape all characters, including magic characters like the semicolon.
ESCAPE_ALL = 1 << 0,
/// Do not escape special fish syntax characters like the semicolon. Only escape nonprintable
/// characters and backslashes.
ESCAPE_NO_PRINTABLES = 1 << 0,
/// Do not try to use 'simplified' quoted escapes, and do not use empty quotes as the empty
/// string.
ESCAPE_NO_QUOTED = 1 << 1,
@ -477,9 +478,9 @@ ssize_t read_loop(int fd, void *buff, size_t count);
/// \param in The string to be escaped
/// \param flags Flags to control the escaping
/// \return The escaped string
wcstring escape_string(const wchar_t *in, escape_flags_t flags,
wcstring escape_string(const wchar_t *in, escape_flags_t flags = 0,
escape_string_style_t style = STRING_STYLE_SCRIPT);
wcstring escape_string(const wcstring &in, escape_flags_t flags,
wcstring escape_string(const wcstring &in, escape_flags_t flags = 0,
escape_string_style_t style = STRING_STYLE_SCRIPT);
/// Escape a string so that it may be inserted into a double-quoted string.

View File

@ -564,7 +564,7 @@ void completer_t::complete_cmd_desc(const wcstring &str) {
}
wcstring lookup_cmd(L"__fish_describe_command ");
lookup_cmd.append(escape_string(cmd, ESCAPE_ALL));
lookup_cmd.append(escape_string(cmd));
// First locate a list of possible descriptions using a single call to apropos or a direct
// search if we know the location of the whatis database. This can take some time on slower
@ -722,7 +722,7 @@ void completer_t::complete_from_args(const wcstring &str, const wcstring &args,
ctx.parser->set_last_statuses(status);
}
this->complete_strings(escape_string(str, ESCAPE_ALL), const_desc(desc), possible_comp, flags);
this->complete_strings(escape_string(str), const_desc(desc), possible_comp, flags);
}
static size_t leading_dash_count(const wchar_t *str) {
@ -1721,11 +1721,11 @@ completion_list_t complete(const wcstring &cmd_with_subcmds, completion_request_
/// wcstring, but only if \c argument isn't an empty string.
static void append_switch(wcstring &out, wchar_t opt, const wcstring &arg) {
if (arg.empty()) return;
append_format(out, L" -%lc %ls", opt, escape_string(arg, ESCAPE_ALL).c_str());
append_format(out, L" -%lc %ls", opt, escape_string(arg).c_str());
}
static void append_switch(wcstring &out, const wcstring &opt, const wcstring &arg) {
if (arg.empty()) return;
append_format(out, L" --%ls %ls", opt.c_str(), escape_string(arg, ESCAPE_ALL).c_str());
append_format(out, L" --%ls %ls", opt.c_str(), escape_string(arg).c_str());
}
static void append_switch(wcstring &out, wchar_t opt) { append_format(out, L" -%lc", opt); }
static void append_switch(wcstring &out, const wcstring &opt) {
@ -1753,7 +1753,7 @@ static wcstring completion2string(const completion_key_t &key, const complete_en
append_switch(out, L'p', cmd);
else {
out.append(L" ");
out.append(escape_string(cmd, ESCAPE_ALL));
out.append(escape_string(cmd));
}
switch (o.type) {
@ -1833,7 +1833,7 @@ wcstring complete_print(const wcstring &cmd) {
if (!cmd.empty() && src != cmd) continue;
for (const wcstring &target : entry.second) {
out.append(L"complete ");
out.append(escape_string(src, ESCAPE_ALL));
out.append(escape_string(src));
append_switch(out, L"wraps", target);
out.append(L"\n");
}

View File

@ -297,7 +297,7 @@ static void event_fire_internal(parser_t &parser, const event_t &event) {
wcstring buffer = handler->function_name;
for (const wcstring &arg : event.arguments) {
buffer.push_back(L' ');
buffer.append(escape_string(arg, ESCAPE_ALL));
buffer.append(escape_string(arg));
}
// Event handlers are not part of the main flow of code, so they are marked as

View File

@ -154,7 +154,7 @@ wcstring expand_escape_variable(const env_var_t &var) {
buff.append(el);
buff.append(L"'");
} else {
buff.append(escape_string(el, 1));
buff.append(escape_string(el));
}
}
@ -169,7 +169,7 @@ wcstring expand_escape_string(const wcstring &el) {
buff.append(el);
buff.append(L"'");
} else {
buff.append(escape_string(el, 1));
buff.append(escape_string(el));
}
return buff;
}
@ -770,7 +770,7 @@ static expand_result_t expand_cmdsubst(wcstring input, const operation_context_t
}
for (const wcstring &sub_item : sub_res) {
wcstring sub_item2 = escape_string(sub_item, ESCAPE_ALL);
wcstring sub_item2 = escape_string(sub_item);
for (const completion_t &tail_item : tail_expand) {
wcstring whole_item;
whole_item.reserve(paren_begin + 1 + sub_item2.size() + 1 +

View File

@ -223,8 +223,7 @@ static void source_config_in_directory(parser_t &parser, const wcstring &dir) {
// test and the execution of the 'source' command. However, that is not a security problem in
// this context so we ignore it.
const wcstring config_pathname = dir + L"/config.fish";
const wcstring escaped_dir = escape_string(dir, ESCAPE_ALL);
const wcstring escaped_pathname = escaped_dir + L"/config.fish";
const wcstring escaped_pathname = escape_string(dir) + L"/config.fish";
if (waccess(config_pathname, R_OK) != 0) {
FLOGF(config, L"not sourcing %ls (not readable or does not exist)",
escaped_pathname.c_str());

View File

@ -405,7 +405,7 @@ static void test_escape_crazy() {
random_string.push_back((random() % ESCAPE_TEST_CHAR) + 1);
}
escaped_string = escape_string(random_string, ESCAPE_ALL);
escaped_string = escape_string(random_string);
unescaped_success = unescape_string(escaped_string, &unescaped_string, UNESCAPE_DEFAULT);
if (!unescaped_success) {
@ -418,10 +418,9 @@ static void test_escape_crazy() {
}
}
// Verify that not using `ESCAPE_ALL` also escapes backslashes so we don't regress on issue
// #3892.
// Verify that ESCAPE_NO_PRINTABLES also escapes backslashes so we don't regress on issue #3892.
random_string = L"line 1\\n\nline 2";
escaped_string = escape_string(random_string, ESCAPE_NO_QUOTED);
escaped_string = escape_string(random_string, ESCAPE_NO_PRINTABLES | ESCAPE_NO_QUOTED);
unescaped_success = unescape_string(escaped_string, &unescaped_string, UNESCAPE_DEFAULT);
if (!unescaped_success) {
err(L"Failed to unescape string <%ls>", escaped_string.c_str());
@ -5775,7 +5774,7 @@ static void run_one_string_test(const wchar_t *const *argv_raw, int expected_rc,
wcstring args;
for (const wcstring &arg : argv_list) {
args += escape_string(arg, ESCAPE_ALL) + L' ';
args += escape_string(arg) + L' ';
}
args.resize(args.size() - 1);
@ -5785,8 +5784,7 @@ static void run_one_string_test(const wchar_t *const *argv_raw, int expected_rc,
args.c_str(), expected_rc, got.c_str());
} else if (outs.contents() != expected_out) {
err(L"Test failed on line %lu: [%ls]: expected [%ls] but got [%ls]", __LINE__, args.c_str(),
escape_string(expected_out, ESCAPE_ALL).c_str(),
escape_string(outs.contents(), ESCAPE_ALL).c_str());
escape_string(expected_out).c_str(), escape_string(outs.contents()).c_str());
}
}

View File

@ -294,19 +294,18 @@ wcstring function_properties_t::annotated_definition(const wcstring &name) const
// But if the function name starts with a -, we'll need to output it after all the options.
bool defer_function_name = (name.at(0) == L'-');
if (!defer_function_name) {
out.append(escape_string(name, ESCAPE_ALL));
out.append(escape_string(name));
}
// Output wrap targets.
for (const wcstring &wrap : complete_get_wrap_targets(name)) {
out.append(L" --wraps=");
out.append(escape_string(wrap, ESCAPE_ALL));
out.append(escape_string(wrap));
}
if (!desc.empty()) {
wcstring esc_desc = escape_string(desc, ESCAPE_ALL);
out.append(L" --description ");
out.append(esc_desc);
out.append(escape_string(desc));
}
if (!this->shadow_scope) {
@ -358,7 +357,7 @@ wcstring function_properties_t::annotated_definition(const wcstring &name) const
// Output the function name if we deferred it.
if (defer_function_name) {
out.append(L" -- ");
out.append(escape_string(name, ESCAPE_ALL));
out.append(escape_string(name));
}
// Output any inherited variables as `set -l` lines.
@ -367,9 +366,8 @@ wcstring function_properties_t::annotated_definition(const wcstring &name) const
// so we do what fish_indent would.
append_format(out, L"\n set -l %ls", kv.first.c_str());
for (const auto &arg : kv.second) {
wcstring earg = escape_string(arg, ESCAPE_ALL);
out.push_back(L' ');
out.append(earg);
out.append(escape_string(arg));
}
}
out.push_back('\n');

View File

@ -310,7 +310,8 @@ static comp_info_list_t process_completions_into_infos(const completion_list_t &
comp_t *comp_info = &result.at(i);
// Append the single completion string. We may later merge these into multiple.
comp_info->comp.push_back(escape_string(comp.completion, ESCAPE_NO_QUOTED));
comp_info->comp.push_back(
escape_string(comp.completion, ESCAPE_NO_PRINTABLES | ESCAPE_NO_QUOTED));
// Append the mangled description.
comp_info->desc = comp.description;

View File

@ -766,7 +766,7 @@ end_execution_reason_t parse_execution_context_t::handle_command_not_found(
buffer = L"fish_command_not_found";
for (const wcstring &arg : event_args) {
buffer.push_back(L' ');
buffer.append(escape_string(arg, ESCAPE_ALL));
buffer.append(escape_string(arg));
}
auto prev_statuses = parser->get_last_statuses();
@ -781,7 +781,7 @@ end_execution_reason_t parse_execution_context_t::handle_command_not_found(
error = _(L"Unknown command:");
if (!event_args.empty()) {
error.push_back(L' ');
error.append(escape_string(event_args[0], ESCAPE_ALL));
error.append(escape_string(event_args[0]));
}
}

View File

@ -554,7 +554,7 @@ wchar_t parse_util_get_quote_type(const wcstring &cmd, size_t pos) {
wcstring parse_util_escape_string_with_quote(const wcstring &cmd, wchar_t quote, bool no_tilde) {
wcstring result;
if (quote == L'\0') {
escape_flags_t flags = ESCAPE_ALL | ESCAPE_NO_QUOTED | (no_tilde ? ESCAPE_NO_TILDE : 0);
escape_flags_t flags = ESCAPE_NO_QUOTED | (no_tilde ? ESCAPE_NO_TILDE : 0);
result = escape_string(cmd, flags);
} else {
// Here we are going to escape a string with quotes.

View File

@ -222,7 +222,7 @@ static void append_block_description_to_stack_trace(const parser_t &parser, cons
// We can't quote the arguments because we print this in quotes.
// As a special-case, add the empty argument as "".
if (!arg.empty()) {
args_str.append(escape_string(arg, ESCAPE_ALL | ESCAPE_NO_QUOTED));
args_str.append(escape_string(arg, ESCAPE_NO_QUOTED));
} else {
args_str.append(L"\"\"");
}

View File

@ -557,7 +557,7 @@ wcstring summary_command(const job_ref_t &j, const process_ptr_t &p = nullptr) {
// Command.
buffer.push_back(L' ');
buffer.append(escape_string(j->command(), ESCAPE_ALL));
buffer.append(escape_string(j->command()));
if (!p) {
// No process, we are summarizing the whole job.
@ -567,17 +567,17 @@ wcstring summary_command(const job_ref_t &j, const process_ptr_t &p = nullptr) {
// Arguments are the signal name and description.
int sig = p->status.signal_code();
buffer.push_back(L' ');
buffer.append(escape_string(sig2wcs(sig), ESCAPE_ALL));
buffer.append(escape_string(sig2wcs(sig)));
buffer.push_back(L' ');
buffer.append(escape_string(signal_get_desc(sig), ESCAPE_ALL));
buffer.append(escape_string(signal_get_desc(sig)));
// If we have multiple processes, we also append the pid and argv.
if (j->processes.size() > 1) {
append_format(buffer, L" %d", p->pid);
buffer.push_back(L' ');
buffer.append(escape_string(p->argv0(), ESCAPE_ALL));
buffer.append(escape_string(p->argv0()));
}
}
return buffer;

View File

@ -1330,8 +1330,7 @@ void reader_write_title(const wcstring &cmd, parser_t &parser, bool reset_cursor
fish_title_command = L"fish_title";
if (!cmd.empty()) {
fish_title_command.append(L" ");
fish_title_command.append(
escape_string(cmd, ESCAPE_ALL | ESCAPE_NO_QUOTED | ESCAPE_NO_TILDE));
fish_title_command.append(escape_string(cmd, ESCAPE_NO_QUOTED | ESCAPE_NO_TILDE));
}
}
@ -1650,8 +1649,8 @@ wcstring completion_apply_to_command_line(const wcstring &val, complete_flags_t
wcstring sb(buff, begin - buff);
if (do_escape) {
wcstring escaped = escape_string(
val, ESCAPE_ALL | ESCAPE_NO_QUOTED | (no_tilde ? ESCAPE_NO_TILDE : 0));
wcstring escaped =
escape_string(val, ESCAPE_NO_QUOTED | (no_tilde ? ESCAPE_NO_TILDE : 0));
sb.append(escaped);
move_cursor = escaped.size();
} else {
@ -2858,8 +2857,7 @@ expand_result_t::result_t reader_data_t::try_expand_wildcard(wcstring wc, size_t
} else {
complete_flags_t tildeflag =
(match.flags & COMPLETE_DONT_ESCAPE_TILDES) ? ESCAPE_NO_TILDE : 0;
joined.append(
escape_string(match.completion, ESCAPE_ALL | ESCAPE_NO_QUOTED | tildeflag));
joined.append(escape_string(match.completion, ESCAPE_NO_QUOTED | tildeflag));
}
joined.push_back(L' ');
}

View File

@ -29,7 +29,7 @@ void trace_argv(const parser_t &parser, const wchar_t *command, const wcstring_l
}
for (const wcstring &arg : argv) {
trace_text.push_back(L' ');
trace_text.append(escape_string(arg, ESCAPE_ALL));
trace_text.append(escape_string(arg));
}
trace_text.push_back(L'\n');
log_extra_to_flog_file(trace_text);