浏览代码

VimEditingEngine: Handle arrow, Home/End and Page keys

This patch adds handling of the arrow, Home/End, and PageUp/PageDown
keys to the Vim emulation mode.  Home acts as 0, End acts as $, arrow
keys act as their HJKL variants, and PageUp/Down behaves as you would
expect.

This patch also moves the default handling of the aforementioned keys
to insert mode, since regular EditingEngine semantics are more
appropriate there.
sin-ack 4 年之前
父节点
当前提交
ace2c337dc
共有 1 个文件被更改,包括 30 次插入8 次删除
  1. 30 8
      Userland/Libraries/LibGUI/VimEditingEngine.cpp

+ 30 - 8
Userland/Libraries/LibGUI/VimEditingEngine.cpp

@@ -168,6 +168,13 @@ void VimMotion::add_key_code(KeyCode key, [[maybe_unused]] bool ctrl, bool shift
 
 #undef DIGIT
 
+    // Home means to the beginning of the line.
+    case KeyCode::Key_Home:
+        m_unit = Unit::Character;
+        m_amount = START_OF_LINE;
+        m_is_complete = true;
+        break;
+
     // If 0 appears while amount is 0, then it means beginning of line.
     // Otherwise, it adds 0 to the amount.
     case KeyCode::Key_0:
@@ -180,8 +187,9 @@ void VimMotion::add_key_code(KeyCode key, [[maybe_unused]] bool ctrl, bool shift
         }
         break;
 
-    // $ means end of line.
+    // End or $ means end of line.
     // TODO: d2$ in vim deletes to the end of the line and then the next line.
+    case KeyCode::Key_End:
     case KeyCode::Key_Dollar:
         m_unit = Unit::Character;
         m_amount = END_OF_LINE;
@@ -196,9 +204,9 @@ void VimMotion::add_key_code(KeyCode key, [[maybe_unused]] bool ctrl, bool shift
         m_is_complete = true;
         break;
 
-    // j, up or + operates on this line and amount line(s) after.
+    // j, down or + operates on this line and amount line(s) after.
     case KeyCode::Key_J:
-    case KeyCode::Key_Up:
+    case KeyCode::Key_Down:
     case KeyCode::Key_Plus:
         m_unit = Unit::Line;
 
@@ -208,9 +216,9 @@ void VimMotion::add_key_code(KeyCode key, [[maybe_unused]] bool ctrl, bool shift
         m_is_complete = true;
         break;
 
-    // k, down or - operates on this line and amount line(s) before.
+    // k, up or - operates on this line and amount line(s) before.
     case KeyCode::Key_K:
-    case KeyCode::Key_Down:
+    case KeyCode::Key_Up:
     case KeyCode::Key_Minus:
         m_unit = Unit::Line;
 
@@ -732,9 +740,6 @@ CursorWidth VimEditingEngine::cursor_width() const
 
 bool VimEditingEngine::on_key(const KeyEvent& event)
 {
-    if (EditingEngine::on_key(event))
-        return true;
-
     switch (m_vim_mode) {
     case (VimMode::Insert):
         return on_key_in_insert_mode(event);
@@ -751,6 +756,9 @@ bool VimEditingEngine::on_key(const KeyEvent& event)
 
 bool VimEditingEngine::on_key_in_insert_mode(const KeyEvent& event)
 {
+    if (EditingEngine::on_key(event))
+        return true;
+
     if (event.key() == KeyCode::Key_Escape || (event.ctrl() && event.key() == KeyCode::Key_LeftBracket) || (event.ctrl() && event.key() == KeyCode::Key_C)) {
         if (m_editor->cursor().column() > 0)
             move_one_left();
@@ -968,6 +976,12 @@ bool VimEditingEngine::on_key_in_normal_mode(const KeyEvent& event)
             case (KeyCode::Key_P):
                 put();
                 return true;
+            case (KeyCode::Key_PageUp):
+                move_page_up();
+                return true;
+            case (KeyCode::Key_PageDown):
+                move_page_down();
+                return true;
             default:
                 break;
             }
@@ -1083,6 +1097,14 @@ bool VimEditingEngine::on_key_in_visual_mode(const KeyEvent& event)
             yank(Selection);
             switch_to_normal_mode();
             return true;
+        case (KeyCode::Key_PageUp):
+            move_page_up();
+            update_selection_on_cursor_move();
+            return true;
+        case (KeyCode::Key_PageDown):
+            move_page_down();
+            update_selection_on_cursor_move();
+            return true;
         default:
             break;
         }