diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index f7fde973b4e4bd097d9e3289157e46578bea6ff1..708a5e839090f9c7933d142ec4408cbb4bbf1f22 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -310,13 +310,34 @@ export class TypeOperations { let lineText = model.getLineContent(range.startLineNumber); let indentation = strings.getLeadingWhitespace(lineText).substring(0, range.startColumn - 1); + if (ir) { - if (/^\s+$/.test(lineText) || indentation === config.normalizeIndentation(ir.beforeEnter)) { - return TypeOperations._typeCommand(range, '\n' + config.normalizeIndentation(ir.afterEnter), keepPosition); + let beforeText = '\n'; + let isSelectionEmpty = range.isEmpty(); + if (indentation !== config.normalizeIndentation(ir.beforeEnter)) { + beforeText = config.normalizeIndentation(ir.beforeEnter) + lineText.substring(indentation.length, range.startColumn - 1) + '\n'; + range = new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn); + } + + let newLineContent = model.getLineContent(range.endLineNumber); + let oldEndColumn = CursorColumns.visibleColumnFromColumn2(config, model, range.getEndPosition()); + if (!config.insertSpaces) { + oldEndColumn = Math.ceil(oldEndColumn / config.tabSize) + 1; + } + let firstNonWhitespace = strings.firstNonWhitespaceIndex(newLineContent); + if (firstNonWhitespace >= 0) { + range = range.setEndPosition(range.endLineNumber, Math.max(range.endColumn, firstNonWhitespace + 1)); + } else { + range = range.setEndPosition(range.endLineNumber, model.getLineMaxColumn(range.endLineNumber)); } - let beforeText = config.normalizeIndentation(ir.beforeEnter) + lineText.substring(indentation.length, range.startColumn - 1); - range = new Range(range.startLineNumber, 1, range.endLineNumber, range.endColumn); - return TypeOperations._typeCommand(range, beforeText + '\n' + config.normalizeIndentation(ir.afterEnter), keepPosition); + + if (keepPosition) { + return new ReplaceCommandWithoutChangingPosition(range, beforeText + config.normalizeIndentation(ir.afterEnter), true); + } else { + let offset = isSelectionEmpty ? oldEndColumn - config.normalizeIndentation(ir.afterEnter).length - 1 : 0; + return new ReplaceCommandWithOffsetCursorState(range, beforeText + config.normalizeIndentation(ir.afterEnter), 0, offset, true); + } + } else { return TypeOperations._typeCommand(range, '\n' + config.normalizeIndentation(indentation), keepPosition); } diff --git a/src/vs/editor/common/modes/languageConfigurationRegistry.ts b/src/vs/editor/common/modes/languageConfigurationRegistry.ts index b80e5bb60aa76d52bfa77a17d8d6fcc0ec29b24e..3fa864931d41389bc45f0fd6284b216191519e02 100644 --- a/src/vs/editor/common/modes/languageConfigurationRegistry.ts +++ b/src/vs/editor/common/modes/languageConfigurationRegistry.ts @@ -294,7 +294,7 @@ export class LanguageConfigurationRegistryImpl { return resultLineNumber; } let text = model.getLineContent(lastLineNumber); - if (indentRulesSupport.shouldIgnore(text) || text === '') { + if (indentRulesSupport.shouldIgnore(text) || /^\s+$/.test(text) || text === '') { resultLineNumber = lastLineNumber; continue; }