From c1b4e860041687abb9e6810c1e68dbfe37343b9d Mon Sep 17 00:00:00 2001 From: AnotherTest Date: Thu, 14 Jan 2021 16:01:07 +0330 Subject: [PATCH] Shell: Add formatter for history events --- Userland/Shell/Formatter.cpp | 56 ++++++++++++++++++++++++++++++++++++ Userland/Shell/Formatter.h | 1 + 2 files changed, 57 insertions(+) diff --git a/Userland/Shell/Formatter.cpp b/Userland/Shell/Formatter.cpp index e12b7b9551..ee5a3ad28e 100644 --- a/Userland/Shell/Formatter.cpp +++ b/Userland/Shell/Formatter.cpp @@ -369,6 +369,62 @@ void Formatter::visit(const AST::Glob* node) visited(node); } +void Formatter::visit(const AST::HistoryEvent* node) +{ + will_visit(node); + test_and_update_output_cursor(node); + + current_builder().append('!'); + switch (node->selector().event.kind) { + case AST::HistorySelector::EventKind::ContainingStringLookup: + current_builder().append('?'); + current_builder().append(node->selector().event.text); + break; + case AST::HistorySelector::EventKind::StartingStringLookup: + current_builder().append(node->selector().event.text); + break; + case AST::HistorySelector::EventKind::IndexFromStart: + current_builder().append(node->selector().event.text); + break; + case AST::HistorySelector::EventKind::IndexFromEnd: + if (node->selector().event.index == 0) + current_builder().append('!'); + else + current_builder().append(node->selector().event.text); + break; + } + + auto& range = node->selector().word_selector_range; + if (!range.end.has_value() + || range.end.value().kind != AST::HistorySelector::WordSelectorKind::Last + || range.start.kind != AST::HistorySelector::WordSelectorKind::Index || range.start.selector != 0) { + + auto append_word = [this](auto& selector) { + switch (selector.kind) { + case AST::HistorySelector::WordSelectorKind::Index: + if (selector.selector == 0) + current_builder().append('^'); + else + current_builder().appendff("{}", selector.selector); + break; + case AST::HistorySelector::WordSelectorKind::Last: + current_builder().append('$'); + break; + } + }; + + current_builder().append(':'); + append_word(range.start); + + if (range.end.has_value()) { + current_builder().append('-'); + append_word(range.end.value()); + } + } + + visited(node); +} + void Formatter::visit(const AST::Execute* node) { will_visit(node); diff --git a/Userland/Shell/Formatter.h b/Userland/Shell/Formatter.h index a4e0318b8c..838d4fc354 100644 --- a/Userland/Shell/Formatter.h +++ b/Userland/Shell/Formatter.h @@ -71,6 +71,7 @@ private: virtual void visit(const AST::FunctionDeclaration*) override; virtual void visit(const AST::ForLoop*) override; virtual void visit(const AST::Glob*) override; + virtual void visit(const AST::HistoryEvent*) override; virtual void visit(const AST::Execute*) override; virtual void visit(const AST::IfCond*) override; virtual void visit(const AST::Join*) override;