diff --git a/doc/history/2026-09-10-4차.md b/doc/history/2026-09-10-4차.md index 0fa0799..ce58d9b 100644 --- a/doc/history/2026-09-10-4차.md +++ b/doc/history/2026-09-10-4차.md @@ -360,4 +360,32 @@ MERGED 바닥② 편집 0건 · 되돌리기 0건 · 남은 차이 10 라인 | | 두 패널 코드 높이 | 같다. 3-Way 네 칸도 같은 자리에 선다 | | 같은 숫자 두 번 | 없다 | -검사 571건 통과 · 빌드 경고 0 · 오류 0. \ No newline at end of file +검사 571건 통과 · 빌드 경고 0 · 오류 0. +--- + +## 곁들여. 엔터를 누르면 한참 뒤에 반응하던 것 — **완료** (2026-09-10) + +**사용자 지적** - "줄바꿈 엔터를 누르면 딜레이가 있어, 꽤 길게 체감된다." + +**원인** - 화면에 보이는 글자는 편집기가 아니라 아래 표시층이 그린다(편집기 글자는 투명이다). +글자를 칠 때는 `ShowTypedLineNow` 가 그 줄만 즉시 표시층에 옮겨 준다. 그런데 **줄 수가 달라지면** +(엔터 · 줄 합치기 · 여러 줄 붙여넣기) 아래 줄이 통째로 밀린 것이라 한 줄만 고쳐서는 맞지 않아 +그 함수가 손을 뗀다. 그러면 남는 것은 **0.6초짜리 재정렬 타이머**뿐이고, +그 동안 화면에는 아무것도 나오지 않는다. 글자는 즉시 나오는데 엔터만 느렸던 까닭이다. + +**고친 방법** - `ShowTypedLineNow` 가 맞췄는지 여부를 돌려주게 하고, +못 맞춘 경우에는 타이머를 기다리지 않고 **그 자리에서 재정렬**한다. +빠른 길이 통하는 보통 타이핑은 지금까지처럼 타이머로 미룬다. + +**재 본 값** (SendKeys 왕복 시간. 이 도구 자체가 한 번에 31ms 쯤 쓴다) + +| 상황 | 한 번당 | +|---|---| +| 200줄 파일 · 엔터 | 31 ms | +| 2000줄 파일 · 엔터 | 32 ms | +| 글자 치기(견줄 값) | 31 ms | + +**엔터가 글자 한 자와 구별되지 않는 수준이 됐다.** 예전에는 0.6초 동안 아무것도 안 나왔다. +2000줄에서도 200줄과 같은 값이 나오는 것을 보면 재정렬 자체는 이 크기에서 문제가 아니다. + +화면에서도 확인했다 - 엔터로 넣은 빈 줄이 양쪽 칸에 곧바로 나타나고 정렬이 어긋나지 않는다. \ No newline at end of file diff --git a/doc/history/changelog.md b/doc/history/changelog.md index 1a7fb66..5d75fba 100644 --- a/doc/history/changelog.md +++ b/doc/history/changelog.md @@ -8,6 +8,7 @@ | 날짜 | 항목 | 커밋 | |---|---|---| +| 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 | | 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 | | 2026-09-10 | **4차 C-1 다시** — 머리글을 파일 이름만으로 줄인 것이 잘못이었다. 두 경로에서 다른 부분만 남기게 고침 | 아래 | | 2026-09-10 | **4차 C-1** — 파일 비교에서 같은 경로가 나오던 세 자리를 하나로. 코드가 두 줄 더 보인다 | 아래 | @@ -34,6 +35,7 @@ | 날짜 | 문서 | 내용 | |---|---|---| +| 2026-09-10 | **엔터 반응 지연** — 줄 수가 바뀌면 0.6초 타이머만 기다리느라 화면이 비어 있었다. 그 자리에서 다시 맞추게 고침 | 아래 | | 2026-09-10 | **4차 C-2** — 아래쪽 세 군데 상태 정보를 창 아래 한 줄로. 두 패널 코드 높이가 저절로 맞는다 | 아래 | | 2026-09-10 | **4차 C-1 다시** — 머리글을 파일 이름만으로 줄인 것이 잘못이었다. 두 경로에서 다른 부분만 남기게 고침 | 아래 | | 2026-09-10 | **4차 C-1** — 파일 비교에서 같은 경로가 나오던 세 자리를 하나로. 코드가 두 줄 더 보인다 | 아래 | diff --git a/src/MergeHub/ViewModels/HomeViewModel.cs b/src/MergeHub/ViewModels/HomeViewModel.cs index cbe6451..b2e5738 100644 --- a/src/MergeHub/ViewModels/HomeViewModel.cs +++ b/src/MergeHub/ViewModels/HomeViewModel.cs @@ -1407,22 +1407,34 @@ namespace MergeHub.ViewModels { if (_syncingEditor) return; - ShowTypedLineNow(text, caretIndex); - - // 글자마다 다시 정렬하면 화면이 요동친다. 타이핑이 멈춘 뒤에 한 번만 한다. _reflowTimer.Stop(); - _reflowTimer.Start(); + + if (ShowTypedLineNow(text, caretIndex)) + { + // 지금 치는 줄은 이미 화면에 나왔다. 무거운 BASE 재정렬만 손이 멈춘 뒤로 미룬다. + _reflowTimer.Start(); + return; + } + + // 줄 수가 달라졌다 - 엔터 · 줄 합치기 · 여러 줄 붙여넣기. + // + // 한 줄만 고쳐서는 맞출 수 없는 경우인데, 예전에는 여기서도 타이머에만 맡겼다. + // 편집기 글자는 투명이라 그 0.6초 동안 화면에 아무것도 나오지 않았다 - + // "엔터를 누르면 한참 뒤에 반응한다"는 것의 정체가 이것이다. + // 지금은 그 자리에서 다시 맞춘다. 사람이 칠 수 있는 속도에서는 이쪽이 훨씬 싸다. + Reflow(); } /// /// 캐럿이 있는 줄 하나만 표시층에 바로 반영한다. /// /// 줄 수가 달라졌으면(엔터·줄 합치기) 아래 줄이 통째로 밀린 것이라 한 줄만 고쳐서는 - /// 맞지 않는다. 그때는 손대지 않고 재정렬에 맡긴다. + /// 맞지 않는다. 그때는 false 를 주고 부르는 쪽이 곧바로 재정렬하게 한다. /// - private void ShowTypedLineNow(string text, int caretIndex) + /// 이 자리에서 화면을 맞췄으면 true. + private bool ShowTypedLineNow(string text, int caretIndex) { - if (_editorLines.Length == 0 || Lines.Count != _editorLines.Length) return; + if (_editorLines.Length == 0 || Lines.Count != _editorLines.Length) return false; // 한 번만 훑으면서 (캐럿 줄 번호, 그 줄의 범위, 전체 줄 수)를 함께 구한다. int line = 0, start = 0, end = -1, count = 1; @@ -1438,14 +1450,17 @@ namespace MergeHub.ViewModels } if (end < 0) end = text.Length; - if (line >= _editorLines.Length || count != _editorLines.Length) return; + if (line >= _editorLines.Length || count != _editorLines.Length) return false; var value = text.Substring(start, end - start).TrimEnd('\r'); - if (string.Equals(_editorLines[line], value, StringComparison.Ordinal)) return; + + // 글자가 그대로면 그릴 것이 없다. 이것도 "맞춰 둔 것"이라 true 다. + if (string.Equals(_editorLines[line], value, StringComparison.Ordinal)) return true; _editorLines[line] = value; Lines[line].LocalText = value; DiffVersion++; + return true; } /// 타이핑이 멈췄다. 필러를 걷어내고 BASE 와 다시 맞춘다.