엔터를 누르면 한참 뒤에 반응하던 것
줄 수가 바뀌면 한 줄만 고치는 빠른 길이 손을 떼고 0.6초 타이머만 남았다. 편집기 글자는 투명이라 그동안 화면에 아무것도 안 나왔다. 못 맞춘 경우 그 자리에서 재정렬하게 했다. 엔터가 글자 한 자와 같은 값이 됐다.
This commit is contained in:
parent
cbf9e64539
commit
06de091735
@ -360,4 +360,32 @@ MERGED 바닥② 편집 0건 · 되돌리기 0건 · 남은 차이 10 라인 |
|
||||
| 두 패널 코드 높이 | 같다. 3-Way 네 칸도 같은 자리에 선다 |
|
||||
| 같은 숫자 두 번 | 없다 |
|
||||
|
||||
검사 571건 통과 · 빌드 경고 0 · 오류 0.
|
||||
검사 571건 통과 · 빌드 경고 0 · 오류 0.
|
||||
---
|
||||
|
||||
## 곁들여. 엔터를 누르면 한참 뒤에 반응하던 것 — **완료** (2026-09-10)
|
||||
|
||||
**사용자 지적** - "줄바꿈 엔터를 누르면 딜레이가 있어, 꽤 길게 체감된다."
|
||||
|
||||
**원인** - 화면에 보이는 글자는 편집기가 아니라 <b>아래 표시층</b>이 그린다(편집기 글자는 투명이다).
|
||||
글자를 칠 때는 `ShowTypedLineNow` 가 그 줄만 즉시 표시층에 옮겨 준다. 그런데 **줄 수가 달라지면**
|
||||
(엔터 · 줄 합치기 · 여러 줄 붙여넣기) 아래 줄이 통째로 밀린 것이라 한 줄만 고쳐서는 맞지 않아
|
||||
그 함수가 손을 뗀다. 그러면 남는 것은 **0.6초짜리 재정렬 타이머**뿐이고,
|
||||
그 동안 화면에는 아무것도 나오지 않는다. 글자는 즉시 나오는데 엔터만 느렸던 까닭이다.
|
||||
|
||||
**고친 방법** - `ShowTypedLineNow` 가 <b>맞췄는지 여부를 돌려주게</b> 하고,
|
||||
못 맞춘 경우에는 타이머를 기다리지 않고 **그 자리에서 재정렬**한다.
|
||||
빠른 길이 통하는 보통 타이핑은 지금까지처럼 타이머로 미룬다.
|
||||
|
||||
**재 본 값** (SendKeys 왕복 시간. 이 도구 자체가 한 번에 31ms 쯤 쓴다)
|
||||
|
||||
| 상황 | 한 번당 |
|
||||
|---|---|
|
||||
| 200줄 파일 · 엔터 | 31 ms |
|
||||
| 2000줄 파일 · 엔터 | 32 ms |
|
||||
| 글자 치기(견줄 값) | 31 ms |
|
||||
|
||||
**엔터가 글자 한 자와 구별되지 않는 수준이 됐다.** 예전에는 0.6초 동안 아무것도 안 나왔다.
|
||||
2000줄에서도 200줄과 같은 값이 나오는 것을 보면 재정렬 자체는 이 크기에서 문제가 아니다.
|
||||
|
||||
화면에서도 확인했다 - 엔터로 넣은 빈 줄이 양쪽 칸에 곧바로 나타나고 정렬이 어긋나지 않는다.
|
||||
@ -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** — 파일 비교에서 같은 경로가 나오던 세 자리를 하나로. 코드가 두 줄 더 보인다 | 아래 |
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
// 줄 수가 달라졌다 - 엔터 · 줄 합치기 · 여러 줄 붙여넣기.
|
||||
//
|
||||
// 한 줄만 고쳐서는 맞출 수 없는 경우인데, 예전에는 여기서도 타이머에만 맡겼다.
|
||||
// 편집기 글자는 투명이라 <b>그 0.6초 동안 화면에 아무것도 나오지 않았다</b> -
|
||||
// "엔터를 누르면 한참 뒤에 반응한다"는 것의 정체가 이것이다.
|
||||
// 지금은 그 자리에서 다시 맞춘다. 사람이 칠 수 있는 속도에서는 이쪽이 훨씬 싸다.
|
||||
Reflow();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 캐럿이 있는 줄 하나만 표시층에 바로 반영한다.
|
||||
///
|
||||
/// 줄 수가 달라졌으면(엔터·줄 합치기) 아래 줄이 통째로 밀린 것이라 한 줄만 고쳐서는
|
||||
/// 맞지 않는다. 그때는 손대지 않고 재정렬에 맡긴다.
|
||||
/// 맞지 않는다. 그때는 <b>false 를 주고</b> 부르는 쪽이 곧바로 재정렬하게 한다.
|
||||
/// </summary>
|
||||
private void ShowTypedLineNow(string text, int caretIndex)
|
||||
/// <returns>이 자리에서 화면을 맞췄으면 true.</returns>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>타이핑이 멈췄다. 필러를 걷어내고 BASE 와 다시 맞춘다.</summary>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user