ksj09406 101deb2627 12차 E-1 - 저장하지 않은 편집이 껐다 켜도 남는다 (notepad++ 식)
E-2 가 만든 보관함(탭이 사라져도 고친 글이 짝 이름으로 남는 자리)을 그대로 파일로
옮겨 적는 일이다. 새로 정할 것은 언제 쓰고 언제 되살리는가뿐이었다.

어디에 · 어떤 모양으로

  {설정 폴더}\Session\MergeHub\
      목록.txt        차례 · 짝 경로 · 캐럿 · 스크롤 · 저장 형식 · 보고 있던 탭 · 그때 파일의 자취
      01-오른쪽.txt    저장하지 않은 오른쪽 글(있을 때만)
      01-왼쪽.txt      저장하지 않은 왼쪽 글(12차 B-1, 있을 때만)

11차 F-9 백업과 다른 자리다 - 백업은 "저장하기 전 파일", 이것은 "저장하지 않은 편집" 이라
뜻도 수명도 다르다.

- JSON 을 쓰지 않는다(최근 목록과 같은 까닭). 사람이 열어 보고 고칠 수 있고, 무엇보다
  글 안에 무엇이 들었든(따옴표 · 줄바꿈 · 제어 문자) 본문을 따로 파일로 두면 탈이 없다
- 원본 글은 담지 않는다. 파일에서 다시 읽으면 되고, 담아 두면 그 사이 파일이 바뀌었을 때
  낡은 것을 보여 준다. 대신 그때 파일의 길이 · 마지막으로 쓴 때(FileStamp)만 적어 둔다
- 목록은 맨 나중에 쓴다 - 목록이 있다는 것이 곧 글 파일이 다 있다는 뜻이다
- 못 읽거나 못 써도 조용히 넘어간다. 보관 때문에 프로그램이 안 켜지면 안 된다

언제 쓰나

- 글자가 멈춘 뒤 2초에 한 번(DispatcherTimer)
- 탭을 옮길 때 · 닫을 때 · 새 짝을 열 때는 그 자리에서 바로 - 그 순간이 곧 끄기 직전일 수 있다
- 쓰는 일은 다른 실로 넘긴다(Task.Run). 화면 상태를 뜰 때 ParkCurrentTab 을 쓰지 않는다 -
  그쪽은 되돌리기 목록을 글 단위로 눌러 담는데, 2초마다 이력을 주무를 까닭이 없다.
  보관할 것은 글과 자리뿐이고 되돌리기 이력은 되살리지 않기로 정했다(사용자 결정)

언제 되살리나

켤 때 묻지 않고 그대로(사용자 결정). 다만 사용자가 지금 열라고 한 것이 먼저다 -
충돌 파일 열기 · git mergetool · 폴더 비교에서 고른 파일. 설정의 기본 저장소 · 기본 짝보다는 앞선다.
원본 글은 파일에서 다시 읽고 그 위에 편집을 얹는다(E-2 의 ResumePendingTab 그대로).
원본이 그 사이 바뀌었으면 되살리고 알린다 - "연 시점" 은 새로 읽은 글로 두어
[전체 되돌리기] 가 지금 파일로 가고, 고친 글은 편집으로 남는다.
두 파일이 다 없어진 짝은 되살릴 자리가 없으므로 버린다.

확인

하네스 SessionTest 65건 새로 만듦(글로 옮기고 되읽기 · 빈칸/한글/UNC 경로 ·
알아볼 수 없는 줄 건너뛰기 · 보관할 것 없으면 치우기 · 옛 글 파일 치우기 ·
글 파일이 없어져도 넘어가기 · FileStamp · 보관함 주고받기). 전체 28벌 1,852건 · 실패 0.

화면 24건: 두 짝을 고치고 작업 관리자로 끄듯 강제로 끝낸 뒤 다시 켜면 묻지 않고
탭 2개가 이름 · 차례 · 글 그대로 되살아나고, 한쪽을 저장하면 가운뎃점이 2->1,
둘 다 저장하면 보관본이 사라지고, 다시 켜면 되살릴 것이 없다.
원본이 그 사이 바뀌면 되살리고 "저장하면 바뀐 파일을 덮어씁니다" 를 알린다.

빠르기에 대해: 5,003줄(113KB) 짝에서 글자당 31ms 로 4줄짜리와 같았다(앱이 입력에 밀리지 않는다).
다만 "친 뒤 화면에 보이기까지" 는 값으로 확정하지 못했다 - 그것을 재려면 편집기 글을
UIA 로 읽어야 하는데 5,003줄 창에서는 그 읽기가 타이핑보다 훨씬 오래 걸려 값이 오염된다.
재는 법을 따로 마련해야 한다.

시험 도구: E-1 이 도니 지난 시험이 남긴 편집이 다음 시험에서 되살아나 화면이 달라졌다
(e3-verify 가 왼쪽 7줄 대신 14줄을 봤다). 시험마다 보관 자리를 치우고 시작해 끝에
되돌리도록 고쳤다 - 기능이 제대로 도는 증거이기도 하다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 14:53:23 +09:00

158 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 12차 작업지시 — 폴더 비교를 읽기 쉽게 · 양방향 머지 · 화면 안내 (2026-09-23 사용자 요청)
11차가 끝난 뒤 쓰면서 나온 요청을 모았다. 사용자가 한 줄씩 말한 것을 물어 정한 결과가 아래 "정한 것"이다.
원칙은 11차와 같다.
- **먼저 재현하고 값으로 적는다.** 고치기 전 화면 · 숫자를 남긴다.
- 계산은 화면 없이 검사할 수 있게 떼어 내고 **하네스를 먼저** 쓴다.
- 빌드는 경고 0 · 오류 0.
- 끝내면 `history/2026-09-23-12차.md` · `진행상황.md` · `history/changelog.md` 세 곳에 남기고 로컬 커밋한다(푸시 없음).
- 플랫폼을 고치면 영향과 함께 **사용자 확인 뒤** 배포한다.
---
## A. 폴더 비교를 읽기 쉽게
### A-1. 폴더 줄의 크기가 늘 0B
- 지금은: 크기를 **파일에만** 채운다(`FolderComparer` 의 파일 루프). 폴더 줄은 `LeftSize` · `RightSize` 가 0 이라 화면에 0B 로 나온다.
- **정한 것**: 폴더 줄에는 **안에 든 파일 크기 합계**를 적는다(하위 폴더까지). 양쪽을 따로 더해 어느 쪽이 큰지 보이게.
- **판정 기준**: 하위 폴더가 여러 겹인 시험 재료에서 폴더 합계가 탐색기 속성과 같다. 한쪽에만 있는 폴더는 그쪽만 합계. 걸러 낸 파일(포함 · 제외 규칙)은 합계에서도 빠진다. 큰 폴더에서 비교 시간이 눈에 띄게 늘지 않는다.
### A-2. 좌우로 나눠 보이기
- 지금은: 트리 하나에 좌우 열이 붙어 있다.
- **정한 것**: **왼쪽 목록 · 오른쪽 목록을 나란히** 두고 같은 줄에 맞춘다. 가운데에 상태(같음 · 다름 · 왼쪽만 · 오른쪽만)를 적고, 한쪽에 없는 줄은 반대편을 비워 둔다(11차 F-10 파일 비교와 같은 모양).
- **판정 기준**: 같은 이름이 같은 높이에 온다. 한쪽만 있는 항목이 어느 쪽인지 한눈에 보인다. 접기 · 펼치기, 복사 · 삭제 단추, 걸러 보기(같은 것만 · 왼쪽만 · 오른쪽만)가 그대로 동작한다.
## B. 파일 비교 화면
### B-1. 2-Way 에서 양쪽으로 머지
- 지금은: 반영이 BASE → LOCAL 한 방향뿐이고, 저장도 LOCAL(오른쪽) 파일에만 쓴다.
- **정한 것**: **칸마다 저장 단추**. 왼쪽(BASE) 칸에도 반영 단추 `[<]` 와 [왼쪽 저장] 을 둔다. 양쪽을 각각 고치고 각각 저장한다. 저장할 것이 없는 쪽 단추는 꺼진다.
- **정할 것**: Git 모드에서 왼쪽은 지난 커밋이라 고칠 수 없다 — 두 파일 비교에서만 양방향인지, Git 워킹트리 비교에서도 되는지.
- **판정 기준**: 왼쪽 파일에 반영 · 저장이 되고 오른쪽은 그대로다. 되돌리기(11차 F-8)가 양쪽 모두에서 동작한다. 저장할 때 백업(11차 F-9)도 양쪽 모두.
### B-2. 프로그램 정보 창
- **정한 것**: [단축키] 옆에 단추를 두고, 누르면 **이 프로그램 설명 · 만든 사람 · 버전**을 보여 주는 창을 연다(관리 목적).
- **정할 것**: 창에 넣을 항목(프로그램 이름 · 버전 · 빌드 날짜 · 만든 사람 · 사내 문의처 · 플랫폼 버전 · 저장소 경로 · 로그 폴더 열기 등)과 버전을 어디서 읽을지.
- **판정 기준**: 버전 · 빌드 날짜가 실제 실행 파일 값과 같다. 창을 닫아도 화면 상태가 그대로다.
### B-3. 칸 아래에 무엇이 달라졌는지
- 지금은: 요약이 창 맨 아래 상태 줄 한 곳에만 있다.
- **정한 것**: **칸마다 요약**(그 파일의 줄 수 · 추가 · 삭제 · 수정)을 칸 아래에 적고, **가운데에 진행**(남은 차이 · 지금 몇 번째 차이)을 적는다.
- **판정 기준**: 반영 · 되돌리기 · 저장을 할 때마다 숫자가 따라간다. 3분할에서도 칸마다 맞는 숫자가 나온다. 긴 파일에서 느려지지 않는다.
## C. 플랫폼 (버전 올릴 때 함께 — 지금은 대기)
### C-1. 트레이 아이콘
- **정한 것**: **최소화하면 트레이로** 내려가고, 아이콘을 누르면 다시 뜬다. 우클릭 메뉴는 [열기] · [종료]. [X] 는 지금처럼 종료.
- 셸(플랫폼) 쪽 기능이라 모든 사내 프로그램에 영향이 간다. 플랫폼 버전을 올릴 때 함께 한다.
### C-2. 탭 줄 크기 줄이기
- 지금 탭 줄 높이 95px(배율 1.2). 한 단계 작게.
- 역시 플랫폼 쪽이라 버전 올릴 때 함께.
### C-3. 상단 헤더 줄도 접을 수 있게 (2026-09-28 사용자 요청)
- 지금은: 맨 위 헤더 줄(UbiSam 로고 · 프로그램 이름 · 가운데 아이콘 · 날짜 · 시계)이 늘 자리를 차지한다. 2560×1600 · 배율 150% 에서 약 68px.
- **정한 것**: 아래 탭 줄 접기(11차 F-4)와 **같은 방식**으로 접을 수 있게 — 접으면 얇은 띠만 남고, 띠를 누르거나 단축키로 다시 편다. 접은 상태는 다음에 켤 때도 그대로.
- 새 플랫폼(`D:\Sorce\ubsrepo`) 쪽이라 **모든 사내 프로그램에 함께 간다**. 배포는 사용자 확인 뒤.
- **정할 것**: 단축키(아래 탭 줄이 F11 이니 F10 또는 Ctrl+F11), 접었을 때 시계 · 프로그램 이름을 띠에 남길지.
- **판정 기준**: 접으면 코드 칸이 그만큼 높아진다(값으로 잰다). 다시 켜도 접힌 채다. 창 끌기 · 최대화 · 두 번 누르기가 그대로 동작한다 — 헤더가 창을 끄는 자리라 접은 띠에서도 끌 수 있어야 한다.
## D. 폴더 비교 화면 다시 만들기 (2026-09-28 사용자 요청)
### D-1. 위쪽을 한 줄로 · 옵션은 서랍으로
- 지금은: 경로 줄 · 옵션 줄 · 찾기 줄 · 색 구분 범례까지 **네 줄**이 약 160px 을 차지한다. 비교 전에도 그대로다. 자주 쓰는 [비교] 가 옵션 줄 끝에 묻혀 있다.
- **정한 것**(사용자가 그림으로 고름 — "디자인을 깔끔하게 아예"):
- **위 한 줄**: `왼쪽 경로 ⇄ 오른쪽 경로 [비교] [옵션 ▾]`. 좌우 바꾸기(⇄)도 여기에 둔다.
- **옵션 서랍**: 빠른 비교 · 하위 폴더 포함 · 보기(다른 것만 …) · 포함 · 제외 규칙을 [옵션 ▾] 안으로. 켜 둔 옵션은 한 줄에 작은 표시로 알려 준다.
- **찾기**: 늘 보이는 줄을 없애고 **Ctrl+F 로 뜨는 줄**로(파일 비교의 찾기와 같은 방식).
- **색 구분 범례**: 위에서 빼고 아래 상태 줄로 옮긴다.
- **아래 상태 줄**: `다름 12 · 왼쪽만 3 · 오른쪽만 1 · 같음 240` 처럼 결과 요약.
- 목표: 위쪽 160px → **약 48px**.
- **판정 기준**: 지금 되는 것이 하나도 없어지지 않는다(폴더 고르기 · 최근 · 빠른 비교 · 하위 폴더 포함 · 보기 거르기 · 포함/제외 규칙 · 폴더 안 찾기 · 결과 내보내기 · 복사/삭제 단추 · 줄 단위 비교). 위쪽 높이를 값으로 재서 줄어든 것을 확인한다. 좁은 창(1280 DIP)에서도 한 줄이 접히거나 잘리지 않는다.
## E. 저장하지 않아도 남는 편집 (2026-09-28 사용자 요청)
### E-1. 꺼도 작업 내용이 남아 있게 (notepad++ 식)
- 지금은: 창을 닫거나 다른 파일을 열 때 "저장하지 않은 편집이 있습니다" 를 묻고, [버리고 계속] 을 고르면 **글이 사라진다**. 다시 켜면 아무것도 없다.
- **정한 것**:
- **되살릴 범위**: 마지막에 **열려 있던 탭 전부**(E-2) — 탭마다 파일 짝 + 저장하지 않은 편집 글, 캐럿 자리 · 스크롤 위치, 어느 탭을 보고 있었는지. 되돌리기(Undo) 이력은 되살리지 않는다.
- **되살리는 순간**: 묻지 않고 그대로 되살린다(notepad++ 처럼). 상태 줄에 "되살림" 을 잠깐 띄운다.
- **보관 대상**: **두 파일 비교만**. Git 탭 · 병합 중은 git 이 이미 상태를 들고 있어 건드리지 않는다.
- **만들면서 정한 것**:
- **언제 보관할지**: 글자가 멈춘 뒤 **2초**에 한 번. 탭을 옮길 때 · 닫을 때 · 새 짝을 열 때는 **그 자리에서 바로**
(그 순간이 곧 끄기 직전일 수 있다). 쓰는 일은 다른 실로 넘긴다.
- **보관 자리**: `{설정 폴더}\Session\MergeHub\` — 차례 · 자리는 `목록.txt` 에 탭으로 나눈 글,
편집한 글은 짝마다 따로 파일. **원본 글은 담지 않는다**(파일에서 다시 읽는다).
- **원본이 그 사이 바뀌면**: **되살리고 알린다**. "파일을 연 시점" 은 새로 읽은 글로 두어
[전체 되돌리기] 가 지금 파일로 가고, 고친 글은 편집으로 남는다 — 어느 쪽도 잃지 않는다.
- **오래된 보관본**: 저장해서 고친 것이 없어지면 그 몫이 빠지고, 하나도 안 남으면 자리를 통째로 치운다.
닫힌 짝의 편집은 E-2 보관함 한도(짝 50개)를 따른다. 두 파일이 다 없어진 짝은 켤 때 버린다.
- **판정 기준**:
- 짝 두세 개를 탭으로 열어 고치고 **저장하지 않은 채** 창을 닫았다가 다시 켜면, 탭이 그 수·그 순서로 열리고 글이 그대로다(글자 · 줄 수 · 캐럿 자리를 값으로 대조).
- 저장한 뒤 닫으면 되살릴 것이 없다(보관본이 치워진다).
- 원본 파일이 그 사이 바뀐 경우가 정한 대로 동작한다.
- 앱을 강제로 끝내도(작업 관리자) 마지막 보관 시점까지는 남는다.
- 보관 때문에 타이핑이 느려지지 않는다(큰 파일에서 값으로 잰다).
### E-2. 여러 짝을 동시에 (문서 탭) — E-1 의 앞단계 (2026-09-28 사용자 지적)
- 지금은: 파일 비교 탭이 **한 번에 한 짝**만 든다(`◀ 이전 파일` · `다음 파일 ▶` 로 목록을 걷는 방식). 짝을 바꾸는 순간 앞 짝의 편집 글이 갈 곳이 없어서 "버리고 계속" 을 묻는다. notepad++ 처럼 되려면 **탭이 먼저** 있어야 E-1 이 뜻을 가진다.
- **정한 것**:
- **자리**: 파일 비교 화면 맨 위에 **문서 탭 줄 한 줄**(약 28px). 플랫폼 서브탭이 아니라 MergeHub 안에 둔다 — 플랫폼 배포와 엮이지 않게.
- **탭 이름**: 파일 이름. 양쪽 이름이 다르면 `왼 ↔ 오`. **저장하지 않은 탭은 이름 앞에 `•`**. 같은 이름이 여럿이면 위 폴더 한 겹을 덧붙인다.
- **닫기**: 탭마다 [×] · 가운데 단추로도 닫기. 저장 안 한 탭을 닫아도 **묻지 않는다** — 글은 그대로 보관되고 E-1 이 되살린다.
- **넘기기**: Ctrl+Tab · Ctrl+Shift+Tab.
- **◀ 이전 파일 · 다음 파일 ▶**: 지금처럼 **지금 탭을 다음 짝으로 바꾼다**(탭이 늘지 않아 목록을 훑기 좋다).
- **폴더 비교에서 줄을 두 번 누르기**: **새 탭으로 연다**(앞에 보던 것이 사라지지 않는다).
- **탭 하나가 드는 것**: 왼쪽 · 오른쪽 파일 경로, 편집 글, 캐럿 자리, 스크롤, 되돌리기 · 다시하기 이력(11차 F-8), 반영 상태, 저장 형식 · 비교 규칙.
- **만들면서 정한 것**: 탭 상한 **20**(넘으면 저장할 것 없는 탭 가운데 가장 오래 안 본 것을 닫는다 · 고친 탭은 절대 닫지 않는다) · 한 줄을 넘치면 **가로 스크롤** · Git 탭 충돌 목록은 **탭으로 열지 않는다** · 탭이 사라져도 고친 글은 **보관함**에 남아 다시 열면 되살아난다(짝 50개).
- **판정 기준**:
- 짝 두 개를 열어 양쪽 다 고쳐도 글이 서로 섞이지 않는다(양쪽을 값으로 대조).
- 탭을 옮겨 갔다 돌아오면 캐럿 자리 · 스크롤이 그 자리다.
- 되돌리기 · 다시하기가 **탭마다 따로** 동작한다(한 탭에서 Undo 해도 다른 탭은 그대로).
- 칸 아래 요약(B-3) · 아래 상태 줄이 **지금 탭 것만** 보여 준다.
- 저장하면 그 탭의 `•` 만 사라진다. 저장할 것이 없는 탭의 저장 단추는 꺼진다.
- 탭 20개를 열어도 넘기기 · 타이핑이 느려지지 않는다(값으로 잰다).
## F. 메모장 탭 (2026-09-28 사용자 요청)
### F-1. 하단 탭에 메모장 자리를 새로 만든다
- 하고 싶은 것: 하단 탭(폴더 비교 · 파일 비교 · Git) 옆에 **메모장 탭**을 하나 더 두고, 거기서 notepad++ 처럼 쓴다.
- **정한 것**:
- **성격**: **메모 + 파일 열기 둘 다**. 기본은 이름 없는 메모 여러 장이고, 원하면 파일로 여닫고 저장도 한다.
- **보관**: **자동으로 계속** — 쓰는 도중 알아서 보관하고, 껐다 켜도 그대로 있다(E-1 과 같은 생각). 저장 단추를 눌러야 남는 방식이 아니다.
- 탭 줄 · 저장 안 한 표시 `•` · Ctrl+Tab 넘기기는 **E-2 문서 탭과 같은 것을 쓴다**(같은 모양이어야 배우는 것이 하나다).
- **정할 것**:
- 메모 보관 자리(`{설정 폴더}\Memo\` 또는 E-1 의 `Session\` 아래 같이 둘지).
- 이름 없는 메모의 탭 이름(`메모 1` · 첫 줄 몇 자 · 사용자가 붙이기).
- 파일로 연 메모와 이름 없는 메모를 같은 탭 줄에 섞을지.
- 어디까지 파일 비교와 같게 할지 — 줄 번호 · 문법 강조 · 찾기/바꾸기 · 글자 크기(Ctrl+휠) · 줄바꿈.
- 메모를 파일 비교로 보내는 길이 필요한지(메모 두 장을 견주기).
- **판정 기준**:
- 메모를 여러 장 만들어 각각 쓰고 껐다 켜면 장 수 · 순서 · 글이 그대로다(값으로 대조).
- 이름 없는 메모도 저장 단추 없이 남는다. 강제로 끝내도 마지막 보관 시점까지 남는다.
- 파일로 연 메모는 저장하면 파일이 바뀌고, 저장 전에는 `•` 가 붙는다.
- 메모 탭이 다른 탭(폴더 비교 · 파일 비교 · Git)의 동작을 건드리지 않는다.
- 큰 글(수천 줄)에서도 타이핑이 느려지지 않는다.
---
## 이번 지시서에서 하지 않는 것
- 실제 업무 저장소로 시험하지 않는다(시험 재료는 만들어 쓴다).
- 푸시하지 않는다.
- 플랫폼 배포는 사용자 확인 뒤에만.