Shell: Add builtin command to reset the internal state
The new builtin command "reset" now resets the entire internal state by virtually destructing the Shell state and re-constructing it. This helps for example when setting a new hostname and wanting to view it in the current Shell program.
This commit is contained in:
parent
489fce0ed2
commit
fb60db7b00
Notes:
sideshowbarker
2024-07-17 07:14:09 +09:00
Author: https://github.com/supercomputer7 Commit: https://github.com/SerenityOS/serenity/commit/fb60db7b00 Pull-request: https://github.com/SerenityOS/serenity/pull/20491 Reviewed-by: https://github.com/alimpfard
3 changed files with 27 additions and 3 deletions
|
@ -149,6 +149,17 @@ ErrorOr<int> Shell::builtin_where(Main::Arguments arguments)
|
|||
return at_least_one_succeded ? 0 : 1;
|
||||
}
|
||||
|
||||
ErrorOr<int> Shell::builtin_reset(Main::Arguments)
|
||||
{
|
||||
destroy();
|
||||
initialize(m_is_interactive);
|
||||
|
||||
// NOTE: As the last step before returning, clear (flush) the shell text entirely.
|
||||
fprintf(stderr, "\033[3J\033[H\033[2J");
|
||||
fflush(stderr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ErrorOr<int> Shell::builtin_alias(Main::Arguments arguments)
|
||||
{
|
||||
Vector<DeprecatedString> aliases;
|
||||
|
|
|
@ -2258,9 +2258,7 @@ Shell::Shell()
|
|||
cache_path();
|
||||
}
|
||||
|
||||
Shell::Shell(Line::Editor& editor, bool attempt_interactive, bool posix_mode)
|
||||
: m_in_posix_mode(posix_mode)
|
||||
, m_editor(editor)
|
||||
void Shell::initialize(bool attempt_interactive)
|
||||
{
|
||||
uid = getuid();
|
||||
tcsetpgrp(0, getpgrp());
|
||||
|
@ -2305,11 +2303,22 @@ Shell::Shell(Line::Editor& editor, bool attempt_interactive, bool posix_mode)
|
|||
m_editor->load_history(get_history_path());
|
||||
cache_path();
|
||||
}
|
||||
}
|
||||
|
||||
Shell::Shell(Line::Editor& editor, bool attempt_interactive, bool posix_mode)
|
||||
: m_in_posix_mode(posix_mode)
|
||||
, m_editor(editor)
|
||||
{
|
||||
initialize(attempt_interactive);
|
||||
start_timer(3000);
|
||||
}
|
||||
|
||||
Shell::~Shell()
|
||||
{
|
||||
destroy();
|
||||
}
|
||||
|
||||
void Shell::destroy()
|
||||
{
|
||||
if (m_default_constructed)
|
||||
return;
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
__ENUMERATE_SHELL_BUILTIN(wait, InAllModes) \
|
||||
__ENUMERATE_SHELL_BUILTIN(dump, InAllModes) \
|
||||
__ENUMERATE_SHELL_BUILTIN(kill, InAllModes) \
|
||||
__ENUMERATE_SHELL_BUILTIN(reset, InAllModes) \
|
||||
__ENUMERATE_SHELL_BUILTIN(noop, InAllModes) \
|
||||
__ENUMERATE_SHELL_BUILTIN(break, OnlyInPOSIXMode) \
|
||||
__ENUMERATE_SHELL_BUILTIN(continue, OnlyInPOSIXMode) \
|
||||
|
@ -414,6 +415,9 @@ private:
|
|||
Shell();
|
||||
virtual ~Shell() override;
|
||||
|
||||
void destroy();
|
||||
void initialize(bool attempt_interactive);
|
||||
|
||||
RefPtr<AST::Node> parse(StringView, bool interactive = false, bool as_command = true) const;
|
||||
|
||||
void timer_event(Core::TimerEvent&) override;
|
||||
|
|
Loading…
Add table
Reference in a new issue