diff --git a/app/src/main/java/com/termux/terminal/TerminalBuffer.java b/app/src/main/java/com/termux/terminal/TerminalBuffer.java index 03460238..c499ee3d 100644 --- a/app/src/main/java/com/termux/terminal/TerminalBuffer.java +++ b/app/src/main/java/com/termux/terminal/TerminalBuffer.java @@ -127,10 +127,14 @@ public final class TerminalBuffer { mLines[externalToInternalRow(row)].mLineWrap = true; } - private boolean getLineWrap(int row) { + public boolean getLineWrap(int row) { return mLines[externalToInternalRow(row)].mLineWrap; } + public void clearLineWrap(int row) { + mLines[externalToInternalRow(row)].mLineWrap = false; + } + /** * Resize the screen which this transcript backs. Currently, this only works if the number of columns does not * change or the rows expand (that is, it only works when shrinking the number of rows). diff --git a/app/src/main/java/com/termux/terminal/TerminalEmulator.java b/app/src/main/java/com/termux/terminal/TerminalEmulator.java index f3cb0456..109501e7 100644 --- a/app/src/main/java/com/termux/terminal/TerminalEmulator.java +++ b/app/src/main/java/com/termux/terminal/TerminalEmulator.java @@ -475,7 +475,15 @@ public final class TerminalEmulator { mSession.onBell(); break; case 8: // Backspace (BS, ^H). - setCursorCol(Math.max(mLeftMargin, mCursorCol - 1)); + if (mLeftMargin == mCursorCol) { + // Jump to previous line if it was auto-wrapped. + if (mCursorRow > 0 && mScreen.getLineWrap(mCursorRow-1)) { + mScreen.clearLineWrap(mCursorRow - 1); + setCursorRowCol(mCursorRow-1,mRightMargin-1); + } + } else { + setCursorCol(mCursorCol - 1); + } break; case 9: // Horizontal tab (HT, \t) - move to next tab stop, but not past edge of screen // XXX: Should perhaps use color if writing to new cells. Try with diff --git a/app/src/test/java/com/termux/terminal/CursorAndScreenTest.java b/app/src/test/java/com/termux/terminal/CursorAndScreenTest.java index 6e39ed19..5584d74a 100644 --- a/app/src/test/java/com/termux/terminal/CursorAndScreenTest.java +++ b/app/src/test/java/com/termux/terminal/CursorAndScreenTest.java @@ -218,4 +218,13 @@ public class CursorAndScreenTest extends TerminalTestCase { " -"); } + public void testBackspaceAcrossWrappedLines() { + // Backspace should not go to previous line if not auto-wrapped: + withTerminalSized(3, 3).enterString("hi\r\n\b\byou").assertLinesAre("hi ", "you", " "); + // Backspace should go to previous line if auto-wrapped: + withTerminalSized(3, 3).enterString("hi y").assertLinesAre("hi ", "y ", " ").enterString("\b\b#").assertLinesAre("hi#", "y ", " "); + // Initial backspace should do nothing: + withTerminalSized(3, 3).enterString("\b\b\b\bhi").assertLinesAre("hi ", " ", " "); + } + }