Browse Source

Fix deleteLines behavior

xuty 3 năm trước cách đây
mục cha
commit
5c32d254bc
2 tập tin đã thay đổi với 69 bổ sung2 xóa
  1. 13 2
      lib/src/core/buffer/buffer.dart
  2. 56 0
      test/src/core/buffer/buffer_test.dart

+ 13 - 2
lib/src/core/buffer/buffer.dart

@@ -393,6 +393,9 @@ class Buffer {
     }
   }
 
+  /// Remove [count] lines starting at the current cursor position. Lines below
+  /// the removed lines are shifted up. This only affects the scrollable region.
+  /// Lines outside the scrollable region are not affected.
   void deleteLines(int count) {
     if (!isInVerticalMargin) {
       return;
@@ -400,9 +403,17 @@ class Buffer {
 
     setCursorX(0);
 
+    count = min(count, absoluteMarginBottom - absoluteCursorY + 1);
+
+    final linesToMove = absoluteMarginBottom - absoluteCursorY + 1 - count;
+
+    for (var i = 0; i < linesToMove; i++) {
+      final index = absoluteCursorY + i;
+      lines[index] = lines[index + count];
+    }
+
     for (var i = 0; i < count; i++) {
-      lines.insert(absoluteMarginBottom, _newEmptyLine());
-      lines.remove(absoluteCursorY);
+      lines[absoluteMarginBottom - i] = _newEmptyLine();
     }
   }
 

+ 56 - 0
test/src/core/buffer/buffer_test.dart

@@ -108,4 +108,60 @@ void main() {
       }
     });
   });
+
+  group('Buffer.deleteLines()', () {
+    test('works', () {
+      final terminal = Terminal();
+      terminal.resize(10, 10);
+
+      for (var i = 1; i <= 10; i++) {
+        terminal.write('line$i');
+
+        if (i < 10) {
+          terminal.write('\r\n');
+        }
+      }
+
+      terminal.setMargins(3, 7);
+      terminal.setCursor(0, 5);
+
+      terminal.buffer.deleteLines(1);
+
+      expect(terminal.buffer.lines[2].toString(), 'line3');
+      expect(terminal.buffer.lines[3].toString(), 'line4');
+      expect(terminal.buffer.lines[4].toString(), 'line5');
+      expect(terminal.buffer.lines[5].toString(), 'line7');
+      expect(terminal.buffer.lines[6].toString(), 'line8');
+      expect(terminal.buffer.lines[7].toString(), '');
+      expect(terminal.buffer.lines[8].toString(), 'line9');
+      expect(terminal.buffer.lines[9].toString(), 'line10');
+    });
+  });
+
+  test('does not delete lines beyond the scroll region', () {
+    final terminal = Terminal();
+    terminal.resize(10, 10);
+
+    for (var i = 1; i <= 10; i++) {
+      terminal.write('line$i');
+
+      if (i < 10) {
+        terminal.write('\r\n');
+      }
+    }
+
+    terminal.setMargins(3, 7);
+    terminal.setCursor(0, 5);
+
+    terminal.buffer.deleteLines(20);
+
+    expect(terminal.buffer.lines[2].toString(), 'line3');
+    expect(terminal.buffer.lines[3].toString(), 'line4');
+    expect(terminal.buffer.lines[4].toString(), 'line5');
+    expect(terminal.buffer.lines[5].toString(), '');
+    expect(terminal.buffer.lines[6].toString(), '');
+    expect(terminal.buffer.lines[7].toString(), '');
+    expect(terminal.buffer.lines[8].toString(), 'line9');
+    expect(terminal.buffer.lines[9].toString(), 'line10');
+  });
 }