From b2e4fe1299bd57b4ab4bb7ea0e0133038db52b26 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 25 Oct 2020 23:25:41 +0000 Subject: [PATCH] Shell+LibLine: Move Shell::{load,save}_history() to Line::Editor This allows us to easily re-use history loading and saving in other programs using Line::Editor, as well as implementing universally recognized HISTCONTROL. --- Libraries/LibLine/Editor.cpp | 27 +++++++++++++++++++++++++++ Libraries/LibLine/Editor.h | 4 +++- Shell/Builtin.cpp | 2 +- Shell/Shell.cpp | 28 ++-------------------------- Shell/Shell.h | 4 ++-- Shell/main.cpp | 2 +- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/Libraries/LibLine/Editor.cpp b/Libraries/LibLine/Editor.cpp index 28f66ce7181..c103d5ccf9e 100644 --- a/Libraries/LibLine/Editor.cpp +++ b/Libraries/LibLine/Editor.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -212,6 +213,32 @@ void Editor::add_to_history(const String& line) m_history.append(line); } +bool Editor::load_history(const String& path) +{ + auto history_file = Core::File::construct(path); + if (!history_file->open(Core::IODevice::ReadOnly)) + return false; + while (history_file->can_read_line()) { + auto b = history_file->read_line(1024); + // skip the newline and terminating bytes + add_to_history(String(reinterpret_cast(b.data()), b.size() - 2)); + } + return true; +} + +bool Editor::save_history(const String& path) +{ + auto file_or_error = Core::File::open(path, Core::IODevice::WriteOnly, 0600); + if (file_or_error.is_error()) + return false; + auto& file = *file_or_error.value(); + for (const auto& line : m_history) { + file.write(line); + file.write("\n"); + } + return true; +} + void Editor::clear_line() { for (size_t i = 0; i < m_cursor; ++i) diff --git a/Libraries/LibLine/Editor.h b/Libraries/LibLine/Editor.h index 076acdc8306..f2513fbe6c3 100644 --- a/Libraries/LibLine/Editor.h +++ b/Libraries/LibLine/Editor.h @@ -143,7 +143,9 @@ public: void initialize(); - void add_to_history(const String&); + void add_to_history(const String& line); + bool load_history(const String& path); + bool save_history(const String& path); const Vector& history() const { return m_history; } void register_key_input_callback(const KeyBinding&); diff --git a/Shell/Builtin.cpp b/Shell/Builtin.cpp index ee71a4e6db5..c719abef32a 100644 --- a/Shell/Builtin.cpp +++ b/Shell/Builtin.cpp @@ -267,7 +267,7 @@ int Shell::builtin_exit(int argc, const char** argv) } } stop_all_jobs(); - save_history(); + m_editor->save_history(get_history_path()); if (m_is_interactive) printf("Good-bye!\n"); exit(exit_code); diff --git a/Shell/Shell.cpp b/Shell/Shell.cpp index 36899a30f42..05fe1f66a69 100644 --- a/Shell/Shell.cpp +++ b/Shell/Shell.cpp @@ -966,30 +966,6 @@ String Shell::get_history_path() return builder.to_string(); } -void Shell::load_history() -{ - auto history_file = Core::File::construct(get_history_path()); - if (!history_file->open(Core::IODevice::ReadOnly)) - return; - while (history_file->can_read_line()) { - auto b = history_file->read_line(1024); - // skip the newline and terminating bytes - m_editor->add_to_history(String(reinterpret_cast(b.data()), b.size() - 2)); - } -} - -void Shell::save_history() -{ - auto file_or_error = Core::File::open(get_history_path(), Core::IODevice::WriteOnly, 0600); - if (file_or_error.is_error()) - return; - auto& file = *file_or_error.value(); - for (const auto& line : m_editor->history()) { - file.write(line); - file.write("\n"); - } -} - String Shell::escape_token(const String& token) { StringBuilder builder; @@ -1559,7 +1535,7 @@ Shell::Shell(Line::Editor& editor) } directory_stack.append(cwd); - load_history(); + m_editor->load_history(get_history_path()); cache_path(); } @@ -1569,7 +1545,7 @@ Shell::~Shell() return; stop_all_jobs(); - save_history(); + m_editor->save_history(get_history_path()); } void Shell::stop_all_jobs() diff --git a/Shell/Shell.h b/Shell/Shell.h index 4f61942fe8b..d485979c73f 100644 --- a/Shell/Shell.h +++ b/Shell/Shell.h @@ -109,6 +109,8 @@ public: String format(const StringView&, ssize_t& cursor) const; + RefPtr editor() const { return m_editor; } + struct LocalFrame { HashMap> local_variables; }; @@ -154,8 +156,6 @@ public: void kill_job(const Job*, int sig); String get_history_path(); - void load_history(); - void save_history(); void print_path(const String& path); bool read_single_line(); diff --git a/Shell/main.cpp b/Shell/main.cpp index 4ab4805a5b6..cc2c08d308c 100644 --- a/Shell/main.cpp +++ b/Shell/main.cpp @@ -57,7 +57,7 @@ int main(int argc, char** argv) for (auto& it : s_shell->jobs) s_shell->kill_job(it.value.ptr(), SIGHUP); - s_shell->save_history(); + s_shell->editor()->save_history(s_shell->get_history_path()); }); editor = Line::Editor::construct();