라이브 한글 Enter 중복 보정

This commit is contained in:
2026-06-04 15:12:46 +09:00
parent 35b9893eab
commit 648ce5fbab
9 changed files with 43 additions and 11 deletions

View File

@@ -70,6 +70,11 @@ const props = defineProps({
type: Boolean,
default: false
},
/** 마지막 줄 아래 방향키로 외부 줄을 만들지 여부 */
arrowExitCreatesLine: {
type: Boolean,
default: false
},
/** ESC 등으로 이 줄의 슬래시 메뉴를 닫은 상태(문자 `/`는 유지) */
slashCommandSuppressed: {
type: Boolean,
@@ -103,8 +108,8 @@ const suppressBlurCommit = ref(false)
const splitLock = ref(false)
/** 조합 중 Enter 후 compositionend에서 분리할지 */
const pendingSplitAfterComposition = ref(false)
/** 조합 종료 직후 중복 Enter를 무시할 기준 시각 */
const suppressComposedEnterUntil = ref(0)
/** 조합 종료 직후 중복 Enter를 1회 무시할지 */
const suppressNextEnterAfterComposition = ref(false)
const showingRaw = ref(false)
/** @returns {string} Enter 동작 모드 */
@@ -528,7 +533,10 @@ const navigateToAdjacentBlock = (direction, column, caretMode = 'column') => {
const target = elements[currentIndex + direction]
if (!target) {
if (['insert-below', 'multiline'].includes(resolvedEnterMode.value) && direction === 1) {
if (
direction === 1
&& (resolvedEnterMode.value === 'multiline' || props.arrowExitCreatesLine)
) {
emit('insert-below', buildInsertBelowPayload())
}
@@ -873,11 +881,11 @@ const onKeydown = (event) => {
if (
event.key === 'Enter'
&& !event.shiftKey
&& suppressComposedEnterUntil.value
&& Date.now() < suppressComposedEnterUntil.value
&& suppressNextEnterAfterComposition.value
) {
event.preventDefault()
event.stopPropagation()
suppressNextEnterAfterComposition.value = false
return
}
@@ -898,7 +906,6 @@ const onKeydown = (event) => {
if (event.isComposing || event.keyCode === 229) {
pendingSplitAfterComposition.value = true
suppressComposedEnterUntil.value = Date.now() + 240
return
}
@@ -936,7 +943,6 @@ const onCompositionEnd = () => {
}
pendingSplitAfterComposition.value = false
suppressComposedEnterUntil.value = Date.now() + 240
const enterMode = showingRaw.value ? 'insert-below' : resolvedEnterMode.value
if (enterMode !== 'split-paragraph' && enterMode !== 'insert-below') {
@@ -944,7 +950,11 @@ const onCompositionEnd = () => {
}
nextTick(() => {
suppressNextEnterAfterComposition.value = true
scheduleEnterAction(enterMode === 'split-paragraph' ? 'split' : 'insert-below')
window.setTimeout(() => {
suppressNextEnterAfterComposition.value = false
}, 1200)
})
}

View File

@@ -2469,6 +2469,7 @@ onBeforeUnmount(() => {
:model-value="quoteLine.text"
enter-mode="insert-below"
allow-raw-toggle
arrow-exit-creates-line
:raw-line="getMarkdownLine(quoteLine.sourceLine)"
:source-line="quoteLine.sourceLine"
@commit="onQuoteLineInlineCommit(block, quoteLine.sourceIndex, $event)"