diff --git a/src/builtin_fg.cpp b/src/builtin_fg.cpp index 3dfdc2141..9bf1a5b4a 100644 --- a/src/builtin_fg.cpp +++ b/src/builtin_fg.cpp @@ -98,7 +98,7 @@ int builtin_fg(parser_t &parser, io_streams_t &streams, wchar_t **argv) { std::fwprintf(stderr, FG_MSG, job->job_id(), job->command_wcstr()); } - const wcstring ft = tok_first(job->command()); + const wcstring ft = tok_command(job->command()); // For compatibility with fish 2.0's $_, now replaced with `status current-command` if (!ft.empty()) parser.vars().set_one(L"_", ENV_EXPORT, ft); reader_write_title(job->command(), parser); diff --git a/src/reader.cpp b/src/reader.cpp index 8757eeff8..2a0c3d274 100644 --- a/src/reader.cpp +++ b/src/reader.cpp @@ -2099,7 +2099,7 @@ void set_env_cmd_duration(struct timeval *after, struct timeval *before, env_sta void reader_run_command(parser_t &parser, const wcstring &cmd) { struct timeval time_before, time_after; - wcstring ft = tok_first(cmd); + wcstring ft = tok_command(cmd); // For compatibility with fish 2.0's $_, now replaced with `status current-command` if (!ft.empty()) parser.vars().set_one(L"_", ENV_GLOBAL, ft); diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index d2f3d7760..9ac6946cf 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -665,6 +665,21 @@ wcstring tok_first(const wcstring &str) { return {}; } +wcstring tok_command(const wcstring &str) { + tokenizer_t t(str.c_str(), 0); + while (auto token = t.next()) { + if (token->type != token_type_t::string) { + return {}; + } + wcstring text = t.text_of(*token); + if (variable_assignment_equals_pos(text)) { + continue; + } + return text; + } + return {}; +} + bool move_word_state_machine_t::consume_char_punctuation(wchar_t c) { enum { s_always_one = 0, s_rest, s_whitespace_rest, s_whitespace, s_alphanumeric, s_end }; diff --git a/src/tokenizer.h b/src/tokenizer.h index a588c2ca6..a6e88cffb 100644 --- a/src/tokenizer.h +++ b/src/tokenizer.h @@ -144,6 +144,9 @@ class tokenizer_t { /// returns the empty string. wcstring tok_first(const wcstring &str); +/// Like to tok_first, but skip variable assignments like A=B. +wcstring tok_command(const wcstring &str); + /// Struct wrapping up a parsed pipe or redirection. struct pipe_or_redir_t { // The redirected fd, or -1 on overflow. diff --git a/tests/checks/status.fish b/tests/checks/status.fish index 26de571d6..ef6c26332 100644 --- a/tests/checks/status.fish +++ b/tests/checks/status.fish @@ -43,6 +43,9 @@ status job-control none status current-function #CHECK: Not a function +a=b status current-command +#CHECK: status + function test_function status current-function end