라이브 한글 Enter 중복 보정
This commit is contained in:
@@ -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)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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)"
|
||||
|
||||
Reference in New Issue
Block a user