diff --git a/qml/panels/EditorPanel.qml b/qml/panels/EditorPanel.qml index a980fb4..251da87 100644 --- a/qml/panels/EditorPanel.qml +++ b/qml/panels/EditorPanel.qml @@ -288,6 +288,8 @@ Item { selectByMouse: true background: Rectangle { color: Theme.editorBg } tabStopDistance: 32 + Component.onCompleted: forceActiveFocus() + onActiveFocusChanged: console.log("TextArea activeFocus", activeFocus, "focus", focus) // Для подсветки скобок property int bracketMatchPos: -1 property int bracketOrigPos: -1 @@ -368,7 +370,7 @@ Item { let indent = "" const m = line.match(/^(\s+)/) if (m) indent = m[1] - const trimmed = line.trimEnd() + const trimmed = line.trim() if (trimmed.endsWith("{") || trimmed.endsWith("[") || trimmed.endsWith("(") || trimmed.endsWith(":") || trimmed.endsWith(">")) { indent += " " } @@ -411,14 +413,37 @@ Item { let indent = "" const m = line.match(/^(\s+)/) if (m) indent = m[1] - const trimmed = line.trimEnd() + // Если текущая строка пуста (курсор в начале), берём отступ предыдущей строки + let effectiveLine = line + if (line.length === 0 && pos > 0) { + let prevEnd = pos - 1 + if (prevEnd >=0 && text[prevEnd] === "\n") prevEnd-- + let prevStart = text.lastIndexOf("\n", prevEnd-1) + 1 + if (prevStart < 0) prevStart = 0 + effectiveLine = text.substring(prevStart, prevEnd+1) + const m2 = effectiveLine.match(/^(\s+)/) + if (m2) indent = m2[1] + else indent = "" + } + const trimmed = effectiveLine.trim() if (trimmed.endsWith("{") || trimmed.endsWith("[") || trimmed.endsWith("(") || trimmed.endsWith(":") || trimmed.endsWith(">")) { indent += " " } + // Если курсор в начале строки с } (line пуста и next === }), то вставляем indent + "\n" перед }, а не "\n" + indent + if (line.length === 0 && pos < text.length) { + const next = text[pos] + if (next === "}" || next === "]" || next === ")") { + const ins2 = indent + "\n" + insert(pos, ins2) + cursorPosition = pos + indent.length + if (documentManager.activeIndex >=0) documentManager.updateContent(documentManager.activeIndex, text) + return + } + } let extra = "" if (pos < text.length) { const next = text[pos] - if (next === "}" || next === "]" || next === ")") { + if ((next === "}" || next === "]" || next === ")") && line.length > 0) { extra = "\n" + indent.substring(0, Math.max(0, indent.length-4)) } }