浏览代码

Shell: Support forward delete

Conrad Pankoff 5 年之前
父节点
当前提交
36e3e7b75a
共有 2 个文件被更改,包括 24 次插入0 次删除
  1. 23 0
      Shell/LineEditor.cpp
  2. 1 0
      Shell/LineEditor.h

+ 23 - 0
Shell/LineEditor.cpp

@@ -72,6 +72,22 @@ String LineEditor::get_line(const String& prompt)
             exit(2);
             exit(2);
         }
         }
 
 
+        auto do_delete = [&] {
+            if (m_cursor == m_buffer.size()) {
+                fputc('\a', stdout);
+                fflush(stdout);
+                return;
+            }
+            m_buffer.remove(m_cursor - 1);
+            fputs("\033[3~", stdout);
+            fflush(stdout);
+            vt_save_cursor();
+            vt_clear_to_end_of_line();
+            for (int i = m_cursor; i < m_buffer.size(); ++i)
+                fputc(m_buffer[i], stdout);
+            vt_restore_cursor();
+        };
+
         for (ssize_t i = 0; i < nread; ++i) {
         for (ssize_t i = 0; i < nread; ++i) {
             char ch = keybuf[i];
             char ch = keybuf[i];
             if (ch == 0)
             if (ch == 0)
@@ -136,12 +152,19 @@ String LineEditor::get_line(const String& prompt)
                     }
                     }
                     m_state = InputState::Free;
                     m_state = InputState::Free;
                     continue;
                     continue;
+                case '3':
+                    do_delete();
+                    m_state = InputState::ExpectTerminator;
+                    continue;
                 default:
                 default:
                     dbgprintf("Shell: Unhandled final: %b (%c)\n", ch, ch);
                     dbgprintf("Shell: Unhandled final: %b (%c)\n", ch, ch);
                     m_state = InputState::Free;
                     m_state = InputState::Free;
                     continue;
                     continue;
                 }
                 }
                 break;
                 break;
+            case InputState::ExpectTerminator:
+                m_state = InputState::Free;
+                continue;
             case InputState::Free:
             case InputState::Free:
                 if (ch == 27) {
                 if (ch == 27) {
                     m_state = InputState::ExpectBracket;
                     m_state = InputState::ExpectBracket;

+ 1 - 0
Shell/LineEditor.h

@@ -32,6 +32,7 @@ private:
         Free,
         Free,
         ExpectBracket,
         ExpectBracket,
         ExpectFinal,
         ExpectFinal,
+        ExpectTerminator,
     };
     };
     InputState m_state { InputState::Free };
     InputState m_state { InputState::Free };
 };
 };