diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy index e13424b72c51..39a6009d79cd 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy @@ -1478,4 +1478,28 @@ java.util.List list; } }}''' } + + void "test home end go outside template fragments if already on their bounds"() { + myFixture.configureByText 'a.txt', ' g' + + TemplateManager manager = TemplateManager.getInstance(getProject()) + Template template = manager.createTemplate("empty", "user", '$VAR$') + template.addVariable("VAR", "", '"foo"', true) + manager.startTemplate(myFixture.editor, template) + + myFixture.checkResult ' foo g' + + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_LINE_START) + myFixture.checkResult ' foo g' + + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_LINE_START) + myFixture.checkResult ' foo g' + + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_CARET_RIGHT) + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_LINE_END) + myFixture.checkResult ' foo g' + + myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_LINE_END) + myFixture.checkResult ' foo g' + } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TemplateLineStartEndHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TemplateLineStartEndHandler.java index 4bae932550d7..23b6b24cc0d6 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TemplateLineStartEndHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/editorActions/TemplateLineStartEndHandler.java @@ -56,7 +56,7 @@ public abstract class TemplateLineStartEndHandler extends EditorActionHandler { if (templateState != null && !templateState.isFinished()) { final TextRange range = templateState.getCurrentVariableRange(); final int caretOffset = editor.getCaretModel().getOffset(); - if (range != null && range.containsOffset(caretOffset)) { + if (range != null && shouldStayInsideVariable(range, caretOffset)) { int selectionOffset = editor.getSelectionModel().getLeadSelectionOffset(); int offsetToMove = myIsHomeHandler ? range.getStartOffset() : range.getEndOffset(); editor.getCaretModel().moveToOffset(offsetToMove); @@ -72,4 +72,9 @@ public abstract class TemplateLineStartEndHandler extends EditorActionHandler { } myOriginalHandler.execute(editor, caret, dataContext); } + + private boolean shouldStayInsideVariable(TextRange varRange, int caretOffset) { + return varRange.containsOffset(caretOffset) && + caretOffset != (myIsHomeHandler ? varRange.getStartOffset() : varRange.getEndOffset()); + } }