From 77d4b6e435caf6ae70109e4c0ae062fa39a3039e Mon Sep 17 00:00:00 2001 From: Rok Povsic Date: Mon, 11 Jan 2021 22:22:27 +0100 Subject: [PATCH] VimEditingEngine: Add handling { and } to move between empty lines --- .../Libraries/LibGUI/VimEditingEngine.cpp | 46 +++++++++++++++++++ Userland/Libraries/LibGUI/VimEditingEngine.h | 2 + 2 files changed, 48 insertions(+) diff --git a/Userland/Libraries/LibGUI/VimEditingEngine.cpp b/Userland/Libraries/LibGUI/VimEditingEngine.cpp index 646476993d..cef0a059b6 100644 --- a/Userland/Libraries/LibGUI/VimEditingEngine.cpp +++ b/Userland/Libraries/LibGUI/VimEditingEngine.cpp @@ -184,6 +184,12 @@ bool VimEditingEngine::on_key_in_normal_mode(const KeyEvent& event) move_one_up(event); switch_to_insert_mode(); break; + case (KeyCode::Key_LeftBrace): + move_to_previous_empty_lines_block(); + break; + case (KeyCode::Key_RightBrace): + move_to_next_empty_lines_block(); + break; default: break; } @@ -519,4 +525,44 @@ void VimEditingEngine::put(const GUI::KeyEvent& event) } } +void VimEditingEngine::move_to_previous_empty_lines_block() +{ + VERIFY(!m_editor.is_null()); + size_t line_idx = m_editor->cursor().line(); + bool skipping_initial_empty_lines = true; + while (line_idx > 0) { + if (m_editor->document().line(line_idx).is_empty()) { + if (!skipping_initial_empty_lines) + break; + } else { + skipping_initial_empty_lines = false; + } + line_idx--; + } + + TextPosition new_cursor = { line_idx, 0 }; + + m_editor->set_cursor(new_cursor); +}; + +void VimEditingEngine::move_to_next_empty_lines_block() +{ + VERIFY(!m_editor.is_null()); + size_t line_idx = m_editor->cursor().line(); + bool skipping_initial_empty_lines = true; + while (line_idx < m_editor->line_count() - 1) { + if (m_editor->document().line(line_idx).is_empty()) { + if (!skipping_initial_empty_lines) + break; + } else { + skipping_initial_empty_lines = false; + } + line_idx++; + } + + TextPosition new_cursor = { line_idx, 0 }; + + m_editor->set_cursor(new_cursor); +}; + } diff --git a/Userland/Libraries/LibGUI/VimEditingEngine.h b/Userland/Libraries/LibGUI/VimEditingEngine.h index a15ebe176e..7c57e9ebb5 100644 --- a/Userland/Libraries/LibGUI/VimEditingEngine.h +++ b/Userland/Libraries/LibGUI/VimEditingEngine.h @@ -47,6 +47,8 @@ private: void switch_to_visual_mode(); void move_half_page_up(const KeyEvent& event); void move_half_page_down(const KeyEvent& event); + void move_to_previous_empty_lines_block(); + void move_to_next_empty_lines_block(); bool on_key_in_insert_mode(const KeyEvent& event); bool on_key_in_normal_mode(const KeyEvent& event);