diff --git a/python/src/com/jetbrains/python/editor/PythonBackspaceHandler.java b/python/src/com/jetbrains/python/editor/PythonBackspaceHandler.java index 256cc5605dc6..e542b001cb22 100644 --- a/python/src/com/jetbrains/python/editor/PythonBackspaceHandler.java +++ b/python/src/com/jetbrains/python/editor/PythonBackspaceHandler.java @@ -23,8 +23,11 @@ public class PythonBackspaceHandler extends BackspaceHandlerDelegate { if (myTargetPosition != null) { // Remove all the following spaces before moving to targetPosition final int offset = editor.getCaretModel().getOffset(); - editor.getSelectionModel().setSelection(offset - editor.getCaretModel().getVisualPosition().column + myTargetPosition.column, offset); - EditorModificationUtil.deleteSelectedText(editor); + if (EditorModificationUtil.calcAfterLineEnd(editor) == 0) { + int delta = editor.getCaretModel().getVisualPosition().column - myTargetPosition.column; + editor.getSelectionModel().setSelection(offset - delta, offset); + EditorModificationUtil.deleteSelectedText(editor); + } editor.getCaretModel().moveToLogicalPosition(myTargetPosition); myTargetPosition = null; return true; diff --git a/python/testSrc/com/jetbrains/python/PyEditingTest.java b/python/testSrc/com/jetbrains/python/PyEditingTest.java index 7bf28fce8ed4..e148d7fb6f50 100644 --- a/python/testSrc/com/jetbrains/python/PyEditingTest.java +++ b/python/testSrc/com/jetbrains/python/PyEditingTest.java @@ -1,6 +1,9 @@ package com.jetbrains.python; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.CommandProcessor; +import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiFile; import com.jetbrains.python.fixtures.PyLightFixtureTestCase; @@ -23,6 +26,18 @@ public class PyEditingTest extends PyLightFixtureTestCase { assertEquals("r''", doTestTyping("r", 1, '\'')); } + public void testGreedyBackspace() throws Exception { // PY-254 + myFixture.configureByFile("/editing/py254.py"); + myFixture.getEditor().getCaretModel().moveToLogicalPosition(new LogicalPosition(4, 8)); + CommandProcessor.getInstance().executeCommand(myFixture.getProject(), new Runnable() { + public void run() { + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_BACKSPACE); + } + }, "", null); + // this should not modify the text, so we can check against the same file + myFixture.checkResultByFile("/editing/py254.py", true); + } + private String doTestTyping(final String text, final int offset, final char character) { final PsiFile file = ApplicationManager.getApplication().runWriteAction(new Computable() { public PsiFile compute() {