6차 B-4: 네 칸 줄 여백을 66px 로 넓혀 MERGED 줄 번호가 잘리지 않게 한다

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
김승준 2026-09-14 12:47:34 +09:00
parent 21a2dc9b79
commit ddce51d375
4 changed files with 68 additions and 9 deletions

View File

@ -467,3 +467,55 @@ B-1 확인 때는 늘 파일 비교 탭을 먼저 열어 두었다. 순서를
| 저장소를 새로 만들어 병합 → 파일을 열어 칸이 채워진 채로 충돌을 풀고 **앱을 끄지 않고** [병합 커밋] | 커밋 메시지 같은 한 줄, `#` 줄 0개, 부모 2개. **파일 비교 탭 메시지 칸이 비워짐** | | 저장소를 새로 만들어 병합 → 파일을 열어 칸이 채워진 채로 충돌을 풀고 **앱을 끄지 않고** [병합 커밋] | 커밋 메시지 같은 한 줄, `#` 줄 0개, 부모 2개. **파일 비교 탭 메시지 칸이 비워짐** |
화면 확인 **7건 통과**. 빌드 경고 0 · 오류 0. 화면 확인 **7건 통과**. 빌드 경고 0 · 오류 0.
## B-4. MERGED 칸 줄 번호가 네 자리에서 잘린다 (2026-09-14, 완료)
### 고치기 전에 다시 났다
새로 만든 저장소(충돌 23개)를 병합하고 `Motion/Unit0.cs`(3,363줄)를 네 칸으로 열어 편집기에서 Ctrl+End 를 눌렀다.
| 칸 | 보인 번호 |
|---|---|
| LOCAL · BASE · REMOTE | `2949` · `2950` 온전 |
| **MERGED** | **`294` · `295` · `295`** — 2949 · 2950 · 2951 줄 |
### 무엇이 원인이었나
줄 여백 폭은 네 칸 모두 54px 로 같지만 **나눈 방법이 달랐다.**
| 칸 | 여백 나눔 | 번호 글자 자리 |
|---|---|---|
| BASE | 번호 54 (오른쪽 띄움 8) | 46px |
| LOCAL 원본 · REMOTE | 번호 34 (띄움 4) + [&lt;]/[&gt;] 20 | 30px |
| MERGED | 북마크 10 + 번호 24 (띄움 4) + [&gt;] 20 | **20px** |
Consolas 12 는 한 글자 약 6.6px 라 20px 에는 세 자리만 들어간다. MERGED 칸만 북마크 막대 자리를 따로 떼어 번호가 가장 좁았다.
### 고친 것 (`Views/HomeView.xaml` 만)
여백을 네 칸 모두 **66px** 로 넓혔다. 칸마다 폭이 같아야 워드랩에서 접히는 자리가 같다(한 칸만 넓히면 행이 어긋난다).
| 자리 | 전 | 후 | 번호 글자 자리 |
|---|---|---|---|
| BASE 템플릿 | 54 | 66 | 58px |
| LOCAL 원본 · REMOTE 템플릿 | 34 + 20 | 46 + 20 | 42px |
| MERGED 템플릿 | 10 + 24 + 20 | **6 + 40 + 20** | **36px** — 다섯 자리(99,999줄)까지 |
| 위에 겹친 편집기 `LocalEditor` 왼쪽 여백 | 54 | 66 | — 아래층 글자와 x 가 같아야 캐럿이 맞는다 |
북마크 막대는 너비 4 · 좌우 띄움 1 이라 6px 로 모자람이 없다. 칸마다 코드 자리가 12px 줄었다.
### 확인한 것
| 확인 | 결과 |
|---|---|
| C-1 저장소 `Motion/Unit0.cs` 네 칸, Ctrl+End | MERGED `2949` · `2950` · `2951` 온전. 확대해 보니 [&gt;] 단추와도 안 겹친다. 위 세 칸도 온전 |
| 만든 저장소(`Big7479.cs` 7,479줄, 2950 · 7470 줄 양쪽이 다르게 고침)를 MergeHub 로 병합, 네 칸, Ctrl+End | **네 칸 모두** `7462` ~ `7470` 온전. 충돌 2 |
| 7,479줄 두 파일을 `--merge` 인자로 열기(두 칸) | BASE · LOCAL `7440` ~ `7479` 온전 |
| 편집기와 아래층이 맞는가 | 7468 줄에서 Ctrl+Shift+→ 로 `public ` 을 고르니(UIA 로 읽은 선택 글도 `public `) 선택 영역이 아래층의 `public` 글자에 딱 겹친다 |
빌드 경고 0 · 오류 0. 고친 파일은 XAML 뿐이라 검사 하네스는 영향이 없다.
### 확인하다 본 것 (고치지 않음)
- 3분할에서 Ctrl+End 를 누르면 캐럿이 파일 끝이 아니라 **마지막 충돌 줄**(2951 · 7470)에 서고, 네 칸 모두 **그 아래가 빈 채**로 그려진다. 고치기 전 화면에서도 같았다 — B-4 와 무관하다.
- 저장소 밖 파일을 `--merge --base --local --remote --merged` 로 넘기면 네 칸이 아니라 BASE · LOCAL 두 칸으로 열린다.

View File

@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 | | 날짜 | 항목 | 커밋 |
|---|---|---| |---|---|---|
| 2026-09-14 | **6차 B-4** — 3분할 MERGED 칸 줄 번호 자리가 20px 라 2949 가 "294" 로 잘리던 것을 고침. 네 칸 여백을 54 → 66px 로 맞춰 넓혀 다섯 자리까지 보인다 | 아래 |
| 2026-09-14 | **6차 B-3** — 병합 커밋 기본 메시지를 `Merge branch '상대' into 내 브랜치` 로. 첫 파일 이름이 굳어 남던 것, 커밋에 `#Conflicts:` 줄 24개와 해시 첫 줄이 들어가던 것을 고침. 병합이 끝나면 스스로 채운 글만 지운다 | 아래 | | 2026-09-14 | **6차 B-3** — 병합 커밋 기본 메시지를 `Merge branch '상대' into 내 브랜치` 로. 첫 파일 이름이 굳어 남던 것, 커밋에 `#Conflicts:` 줄 24개와 해시 첫 줄이 들어가던 것을 고침. 병합이 끝나면 스스로 채운 글만 지운다 | 아래 |
| 2026-09-14 | **6차 B-2** — 파일을 바꿀 때 확인 창이 고친 파일 이름을 대고, [저장하고 계속] 이 엉뚱한 파일(새로 고른 파일)에 쓰던 것을 막음. [취소] 뒤 콤보가 제자리로. 저장소를 먼저 열면 목록이 0개이던 B-1 빈틈도 | 아래 | | 2026-09-14 | **6차 B-2** — 파일을 바꿀 때 확인 창이 고친 파일 이름을 대고, [저장하고 계속] 이 엉뚱한 파일(새로 고른 파일)에 쓰던 것을 막음. [취소] 뒤 콤보가 제자리로. 저장소를 먼저 열면 목록이 0개이던 B-1 빈틈도 | 아래 |
| 2026-09-14 | **6차 B-1** — 새로고침 뒤 파일 목록을 게이트가 풀릴 때까지 기다렸다 세움(병합 뒤 304개 → 23개). 충돌 목록 두 번 누르기·Enter·[3분할로 열기] 로 파일 비교 탭 네 칸에서 연다. 없는 '홈 탭' 글을 고침 | 아래 | | 2026-09-14 | **6차 B-1** — 새로고침 뒤 파일 목록을 게이트가 풀릴 때까지 기다렸다 세움(병합 뒤 304개 → 23개). 충돌 목록 두 번 누르기·Enter·[3분할로 열기] 로 파일 비교 탭 네 칸에서 연다. 없는 '홈 탭' 글을 고침 | 아래 |

View File

@ -106,7 +106,7 @@
| **완료** | B-1 충돌 목록에서 3분할 화면까지 가는 길이 끊겨 있다 — 병합 뒤 목록이 바로 서고, 두 번 누르기·Enter·[3분할로 열기] | | **완료** | B-1 충돌 목록에서 3분할 화면까지 가는 길이 끊겨 있다 — 병합 뒤 목록이 바로 서고, 두 번 누르기·Enter·[3분할로 열기] |
| **완료** | B-2 확인 창이 엉뚱한 파일 이름을 댄다 — 이름·[저장하고 계속] 모두 실린 파일 기준, [취소] 뒤 콤보도 돌아온다 | | **완료** | B-2 확인 창이 엉뚱한 파일 이름을 댄다 — 이름·[저장하고 계속] 모두 실린 파일 기준, [취소] 뒤 콤보도 돌아온다 |
| **완료** | B-3 커밋 메시지가 엉뚱하게 남는다 — 기본값 `Merge branch '상대' into 내 브랜치`, `#` 줄 뺌, 병합이 끝나면 칸을 비움 | | **완료** | B-3 커밋 메시지가 엉뚱하게 남는다 — 기본값 `Merge branch '상대' into 내 브랜치`, `#` 줄 뺌, 병합이 끝나면 칸을 비움 |
| 대기 | B-4 MERGED 칸 줄 번호가 네 자리에서 잘린다 | | **완료** | B-4 MERGED 칸 줄 번호가 네 자리에서 잘린다 — 네 칸 여백을 66px 로, MERGED 번호 자리 20 → 36px(다섯 자리) |
| 대기 | B-5 머지 주석은 소스에 넣고, 병합 뒤에는 그 줄을 무시한다 | | 대기 | B-5 머지 주석은 소스에 넣고, 병합 뒤에는 그 줄을 무시한다 |
| 대기 | B-6 충돌 탭에서 하나씩 누를 때마다 오래 기다린다 | | 대기 | B-6 충돌 탭에서 하나씩 누를 때마다 오래 기다린다 |
| 대기 | B-7 상태바가 병합 중에 믿을 수 없는 값을 보인다 | | 대기 | B-7 상태바가 병합 중에 믿을 수 없는 값을 보인다 |

View File

@ -139,10 +139,11 @@
코드 본문에는 <b>툴팁을 달지 않는다</b> - 글이 이미 보이는데 그 위에 같은 글이 상자로 코드 본문에는 <b>툴팁을 달지 않는다</b> - 글이 이미 보이는데 그 위에 같은 글이 상자로
겹쳐 뜨면 가리기만 한다. 잘려서 안 보이는 부분은 가로 스크롤로 본다. --> 겹쳐 뜨면 가리기만 한다. 잘려서 안 보이는 부분은 가로 스크롤로 본다. -->
<DataTemplate x:Key="BaseLineTemplate"> <DataTemplate x:Key="BaseLineTemplate">
<!-- 여백 폭(54)을 LOCAL 과 맞춘다. 접히는 자리가 같아야 워드랩에서도 행이 어긋나지 않는다. --> <!-- 여백 폭(66)을 LOCAL 과 맞춘다. 접히는 자리가 같아야 워드랩에서도 행이 어긋나지 않는다.
66 인 까닭은 LocalLineTemplate 에 적었다(6차 B-4). -->
<Grid MinHeight="{Binding SourceRowHeight}"> <Grid MinHeight="{Binding SourceRowHeight}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="54"/> <ColumnDefinition Width="66"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding BaseNumberText}" Style="{StaticResource Mono}" <TextBlock Grid.Column="0" Text="{Binding BaseNumberText}" Style="{StaticResource Mono}"
@ -181,7 +182,7 @@
<DataTemplate x:Key="OriginalLocalLineTemplate"> <DataTemplate x:Key="OriginalLocalLineTemplate">
<Grid MinHeight="{Binding SourceRowHeight}"> <Grid MinHeight="{Binding SourceRowHeight}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="34"/> <ColumnDefinition Width="46"/>
<ColumnDefinition Width="20"/> <ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
@ -231,7 +232,7 @@
<DataTemplate x:Key="RemoteLineTemplate"> <DataTemplate x:Key="RemoteLineTemplate">
<Grid MinHeight="{Binding SourceRowHeight}"> <Grid MinHeight="{Binding SourceRowHeight}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="34"/> <ColumnDefinition Width="46"/>
<ColumnDefinition Width="20"/> <ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
@ -283,14 +284,19 @@
대신 가로로 밀 때 여백까지 밀리면 안 되므로, 본문 글자만 대신 가로로 밀 때 여백까지 밀리면 안 되므로, 본문 글자만
TextShiftX(편집기의 가로 스크롤 값)만큼 밀고 열 안에서 잘라낸다. TextShiftX(편집기의 가로 스크롤 값)만큼 밀고 열 안에서 잘라낸다.
글자를 고치는 일은 이 위에 겹쳐 놓은 편집기(LocalEditor)가 맡는다. 글자를 고치는 일은 이 위에 겹쳐 놓은 편집기(LocalEditor)가 맡는다.
여백 폭은 66 = 북마크 6 + 줄 번호 40 + [>] 20. 네 칸이 모두 66 이다(6차 B-4).
예전에는 54 = 10 + 24 + 20 이라 줄 번호 글자 자리가 20px(Consolas 12 로 세 자리)뿐이어서
2949 가 "294" 로 잘렸다. 위의 세 칸은 번호 자리가 30px 이상이라 멀쩡했다.
지금은 번호 자리 36px 로 다섯 자리(99,999줄)까지 들어간다.
--> -->
<DataTemplate x:Key="LocalLineTemplate"> <DataTemplate x:Key="LocalLineTemplate">
<Grid Background="Transparent" <Grid Background="Transparent"
MinHeight="{Binding RowHeight}" MinHeight="{Binding RowHeight}"
MouseLeftButtonDown="Gutter_MouseLeftButtonDown"> MouseLeftButtonDown="Gutter_MouseLeftButtonDown">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/> <ColumnDefinition Width="6"/>
<ColumnDefinition Width="24"/> <ColumnDefinition Width="40"/>
<ColumnDefinition Width="20"/> <ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
@ -1210,7 +1216,7 @@
편집기 글자는 투명이라 아래층 색이 그대로 보이고, 캐럿·선택 영역만 편집기가 그린다. 편집기 글자는 투명이라 아래층 색이 그대로 보이고, 캐럿·선택 영역만 편집기가 그린다.
둘의 글꼴·줄 높이가 정확히 같아야 어긋나지 않는다. 둘의 글꼴·줄 높이가 정확히 같아야 어긋나지 않는다.
편집기는 여백 폭(54)만큼 왼쪽을 비워 두어, 그 자리의 [>] 버튼과 편집기는 여백 폭(66)만큼 왼쪽을 비워 두어, 그 자리의 [>] 버튼과
북마크 더블클릭이 아래층까지 닿게 한다. 북마크 더블클릭이 아래층까지 닿게 한다.
--> -->
<Grid Grid.Column="0"> <Grid Grid.Column="0">
@ -1232,7 +1238,7 @@
세로 스크롤 막대를 늘 띄워 두는 이유 - 나타났다 사라지면 글 너비가 바뀌어 세로 스크롤 막대를 늘 띄워 두는 이유 - 나타났다 사라지면 글 너비가 바뀌어
워드랩 접히는 자리가 아래층과 어긋난다. 워드랩 접히는 자리가 아래층과 어긋난다.
--> -->
<TextBox x:Name="LocalEditor" Style="{x:Null}" Margin="54,0,0,0" <TextBox x:Name="LocalEditor" Style="{x:Null}" Margin="66,0,0,0"
FontFamily="Consolas" FontSize="12" FontFamily="Consolas" FontSize="12"
TextBlock.LineHeight="{StaticResource CodeLineHeight}" TextBlock.LineHeight="{StaticResource CodeLineHeight}"
TextBlock.LineStackingStrategy="BlockLineHeight" TextBlock.LineStackingStrategy="BlockLineHeight"