diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/IVT100EmulatorBackend.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/IVT100EmulatorBackend.java index c835bb817c4..1323f3a1f35 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/IVT100EmulatorBackend.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/IVT100EmulatorBackend.java @@ -227,4 +227,11 @@ public interface IVT100EmulatorBackend { * scroll region. */ void processReverseLineFeed(); + + /** + * Replaces characters from the cursor position with space characters. + * + * @param n number of characters to replace + */ + void eraseCharacters(int n); } diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java index 615a7d6f618..013beb1c189 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100BackendTraceDecorator.java @@ -211,4 +211,9 @@ public class VT100BackendTraceDecorator implements IVT100EmulatorBackend { fBackend.processReverseLineFeed(); } + @Override + public void eraseCharacters(int n) { + fWriter.println("eraseCharacters(" + n + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + fBackend.eraseCharacters(n); + } } diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java index 56970c23a63..af7eadd8254 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100Emulator.java @@ -617,8 +617,7 @@ public class VT100Emulator implements ControlListener { case 'X': // Erase character. - // Emacs, vi, and GNU readline don't seem to use this command, so we ignore - // it for now. + processAnsiCommand_X(); break; case 'Z': @@ -1238,6 +1237,13 @@ public class VT100Emulator implements ControlListener { text.scrollDown(getAnsiParameter(0)); } + /** + * Erases n characters from cursor (default = 1 character) + */ + private void processAnsiCommand_X() { + text.eraseCharacters(getAnsiParameter(0)); + } + private void processDecPrivateCommand_h() { int param = getAnsiParameter(0); switch (param) { diff --git a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java index 514ec7c6a0f..14d79198ce1 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java +++ b/terminal/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackend.java @@ -490,4 +490,15 @@ public class VT100EmulatorBackend implements IVT100EmulatorBackend { fTerminal.scroll(line, nLines, n); } } + + @Override + public void eraseCharacters(int n) { + synchronized (fTerminal) { + int line = toAbsoluteLine(fCursorLine); + int end = Math.min(fCursorColumn + n, fColumns); + for (int col = fCursorColumn; col < end; col++) { + fTerminal.setChar(line, col, '\000', null); + } + } + } } diff --git a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackendTest.java b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackendTest.java index 3be4b5209ca..de6bec1f900 100644 --- a/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackendTest.java +++ b/terminal/plugins/org.eclipse.tm.terminal.test/src/org/eclipse/tm/internal/terminal/emulator/VT100EmulatorBackendTest.java @@ -926,4 +926,24 @@ public class VT100EmulatorBackendTest extends TestCase { assertEquals("ghi", new String(term.getChars(5))); } + public void testEraseCharacters() { + ITerminalTextData term = makeITerminalTextData(); + IVT100EmulatorBackend vt100 = makeBakend(term); + vt100.setDimensions(4, 4); + String s = "aaaa\n" + "bcde\n" + "1234\n" + "5678"; + fill(term, s); + vt100.setCursor(0, 0); + vt100.eraseCharacters(1); + assertEqualsTerm(" aaa\n" + "bcde\n" + "1234\n" + "5678", toMultiLineText(term)); + + fill(term, s); + vt100.setCursor(1, 0); + vt100.eraseCharacters(1); + assertEqualsTerm("aaaa\n" + " cde\n" + "1234\n" + "5678", toMultiLineText(term)); + + fill(term, s); + vt100.setCursor(2, 1); + vt100.eraseCharacters(2); + assertEqualsTerm("aaaa\n" + "bcde\n" + "1 4\n" + "5678", toMultiLineText(term)); + } }