Task #260: Ctrl/Cmd+Arrow 커서 이동 — 줄/문서 시작·끝#746
Conversation
handleCtrlKey에 Arrow 키 처리 추가: - Ctrl/Cmd+Left: 줄 시작 (Home과 동일) - Ctrl/Cmd+Right: 줄 끝 (End와 동일) - Ctrl/Cmd+Up: 문서 시작 (Ctrl+Home과 동일) - Ctrl/Cmd+Down: 문서 끝 (Ctrl+End와 동일) 모든 방향에 Shift 조합 선택 지원. macOS Cmd+Arrow 및 Windows Ctrl+Arrow 모두 동일 동작. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Ctrl/Cmd+Arrow 조합이 macOS/Windows에서 줄 시작·끝 및 문서 시작·끝 이동으로 동작하도록 handleCtrlKey()에 방향키 처리를 추가하는 PR입니다. 기존 Home/End, Ctrl+Home/End에 대응되는 동작을 Ctrl/Cmd+Arrow로도 제공해 키보드 네비게이션 UX를 개선합니다.
Changes:
Ctrl/Cmd + ←/→입력 시 줄 시작/끝으로 이동 처리 추가 (Shift 조합 시 선택 확장)Ctrl/Cmd + ↑/↓입력 시 문서 시작/끝으로 이동 처리 추가 (Shift 조합 시 선택 확장)- 관련 주석 갱신 (직접 처리 범위에 Ctrl/Cmd+Arrow 포함)
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| case 'arrowleft': { | ||
| e.preventDefault(); | ||
| if (e.shiftKey) this.cursor.setAnchor(); | ||
| else this.cursor.clearSelection(); | ||
| this.cursor.moveToLineStart(); | ||
| this.updateCaret(); | ||
| if (e.shiftKey) this.updateSelection(); | ||
| break; |
| case 'arrowright': { | ||
| e.preventDefault(); | ||
| if (e.shiftKey) this.cursor.setAnchor(); | ||
| else this.cursor.clearSelection(); | ||
| this.cursor.moveToLineEnd(); | ||
| this.updateCaret(); | ||
| if (e.shiftKey) this.updateSelection(); | ||
| break; |
| case 'arrowup': { | ||
| e.preventDefault(); | ||
| if (e.shiftKey) this.cursor.setAnchor(); | ||
| else this.cursor.clearSelection(); | ||
| this.cursor.moveToDocumentStart(); | ||
| this.updateCaret(); | ||
| if (e.shiftKey) this.updateSelection(); | ||
| break; |
| case 'arrowdown': { | ||
| e.preventDefault(); | ||
| if (e.shiftKey) this.cursor.setAnchor(); | ||
| else this.cursor.clearSelection(); | ||
| this.cursor.moveToDocumentEnd(); | ||
| this.updateCaret(); | ||
| if (e.shiftKey) this.updateSelection(); | ||
| break; |
updateCaret()가 내부에서 updateSelection()을 호출하므로 Shift+Arrow 분기의 추가 updateSelection() 호출은 불필요. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Copilot 리뷰 피드백 반영 (c99e492): updateCaret()가 내부에서 updateSelection()을 호출하므로 중복 호출 제거. |
PR #746 (@oksure) 옵션 A 처리 — 2 commits cherry-pick + no-ff merge. 본질 정정 (1 file, +33/-1): - rhwp-studio/src/engine/input-handler-keyboard.ts: handleCtrlKey() 영역 영역 Arrow 키 처리 추가 · Ctrl/Cmd + ← → 줄 시작 (cursor.moveToLineStart) · Ctrl/Cmd + → → 줄 끝 (cursor.moveToLineEnd) · Ctrl/Cmd + ↑ → 문서 시작 (cursor.moveToDocumentStart) · Ctrl/Cmd + ↓ → 문서 끝 (cursor.moveToDocumentEnd) · Shift 조합으로 선택 범위 확장 (cursor.setAnchor / clearSelection) 채택 접근: - 기존 Ctrl+Home/End 패턴 정합 — 인프라 재사용 - cursor.moveTo* 기존 메서드 재호출 — 신규 인프라 도입 부재 영역 영역 위험 좁힘 Copilot 리뷰 반영 (commit ad7e6b4): updateSelection() 중복 호출 제거 자기 검증: - cherry-pick 충돌 0건 - tsc --noEmit ✅ 통과 - cargo test --release ✅ ALL GREEN - 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 ✅ (TypeScript 영역 영역 SVG 무영향) - WASM 빌드 4.66 MB - 작업지시자 웹 에디터 인터랙션 검증 ✅ 통과 (4가지 Arrow + Shift 조합 정합) 후속 분리 (PR 본문 명시): - Issue #260 의 첫 단계 — 본 PR 영역 영역 Ctrl/Cmd+Arrow 만 - Option+Arrow (단어 단위 이동) — 단어 경계 감지 로직 필요 영역 영역 후속 작업 Part of #260
- mydocs/pr/archives/pr_746_review.md: 검토 문서 archives 이동 - mydocs/pr/archives/pr_746_report.md: 처리 보고서 작성 · Ctrl/Cmd+Arrow 커서 이동 (Issue #260 Part of) · 인프라 재사용 (handleCtrlKey 패턴 + cursor 메서드 재호출) · 작업지시자 웹 에디터 인터랙션 검증 ✅ 통과 · Option+Arrow 후속 작업 분리 (Issue #260 OPEN 유지) - mydocs/orders/20260510.md: PR #746 항목 추가 (5/10 사이클 영역 영역 18건 처리)
|
@oksure 님, 검토 + 머지 완료했습니다. 처리 결과옵션 A (2 commits cherry-pick + no-ff merge `20c0e5d4`) 로 처리. 충돌 0건. 자기 검증
작업지시자 웹 에디터 인터랙션 검증 ✅ 통과dev server 영역 영역 4가지 Arrow + Shift 조합 정합 동작:
인프라 재사용기존 `Ctrl+Home/End` 패턴 정합 + `cursor.moveTo*` 기존 메서드 재호출 영역 영역 신규 인프라 도입 부재 영역 영역 위험 좁힘 (`feedback_process_must_follow` 정합). 후속 분리 (PR 본문 명시 정합)
처리 보고서: `mydocs/pr/archives/pr_746_report.md`. @oksure 님 20+ 사이클 컨트리뷰션 영역 — 5/10 사이클 영역 영역 PR #720/#723/#725/#728/#729/#730/#732/#734/#735/#737/#738/#739/#740/#742/#743/#744/#745/#746 영역 18건 처리 완료 영역. |
기존 Alt+N (새 문서) 패턴 정합 — setupGlobalShortcuts + shortcut-map 영역 영역 동일 패턴 적용: - Ctrl/Cmd+O → file:open (문서 미로드 상태에서도 동작) - 한글 IME 매핑: Ctrl+ㅐ (Alt+ㅜ 패턴 정합) 검증: - tsc --noEmit ✅ - cargo test --release ALL GREEN - 광범위 sweep 170/170 same - WASM 4.66 MB - 웹 에디터 인터랙션 검증 ✅ 통과 Issue #223 OPEN 유지 — Cmd+Arrow / Opt+Arrow 등 후속 단계 잔존 (PR #746 의 Ctrl/Cmd+Arrow 영역 별도 단계)
PR #746 (Ctrl/Cmd+Arrow 줄/문서 시작·끝) 후속 영역 영역 Issue #223 의 다음 단계. 4 단축키: - Option+←/→: 단어 단위 커서 이동 - Option+Shift+←/→: 단어 단위 선택 확장 - Option+Backspace: 이전 단어 삭제 - Option+Delete: 다음 단어 삭제 신규 인프라 — CursorState.moveToWordBoundary: - 본문 (getTextRange) + 표 셀 (getTextInCell) 양 경로 지원 - 문자 클래스 5종 (공백/한글/Latin/Digit/Punct) - 슬라이스 50 char cap (성능 가드) 본 환경 자기 정정 commit (7c0418f) — Alt+Delete 영역 영역 충돌 정정: - shortcut-map.ts:97 영역 영역 Alt+Delete → table:delete-col 매핑 (이전 등록) 영역 영역 일반 편집 영역 영역 dispatcher silently fail + return → 단어 삭제 미동작. - 정정: 표 안/외 분기 (옵션 1 작업지시자 결정): - 표 안 + Alt+Delete: table:delete-col (칸 지우기, 기존 동작 보존) - 표 외 + Alt+Delete: 다음 단어 삭제 (PR #794 본질) - Alt+Backspace / Alt+Arrow: 항상 단어 삭제/이동 검증: - tsc --noEmit ✅ - cargo test --release ALL GREEN - 광범위 sweep 170/170 same - WASM 4.68 MB 재빌드 - 작업지시자 시각 검증 ✅ 통과 (자기 정정 후) Part of #223
작업지시자 시각 검증 영역 영역 발견: Ctrl+↓ 영역 영역 문서 끝 영역 영역 이동 (한 문단씩 이동 기대). PR #746 (Task #260) 영역 영역 매핑 영역 영역 macOS 표준 (Cmd+↑/↓ = 문서 시작/끝) 영역 영역만 정합, 한컴 표준 (Ctrl+↑/↓ = 이전/다음 문단) 영역 영역 어긋남. 본 정정: - cursor.ts 영역 영역 `moveToParagraphBoundary(direction)` 신규 - 본문 경로: 현재 문단 charOffset > 0 영역 영역 시작 영역 영역 / 0 영역 영역 이전·다음 문단 시작 영역 영역 / 구역 경계 영역 영역 인접 구역 정합 - 표 셀 경로: cellParaIndex 이동 (셀 내부 문단 경계) - atLineEnd = false 초기화 - input-handler-keyboard.ts 영역 영역 ArrowUp/Down 분기: - macOS Cmd+↑/↓ (e.metaKey && !e.ctrlKey) = 문서 시작/끝 (macOS 표준 보존) - Windows/Linux Ctrl+↑/↓ = moveToParagraphBoundary (한컴 표준)
@oksure — Issue #784 (PR #746 시각 검증 중 발견된 오랜 잠재 결함): moveToDocumentEnd 의 const sec = 0 하드코드 → 다중 구역 문서 (aift.hwp 3 구역) 에서 잘못된 위치로 cursor rect 미발견 오류. 본질 (2 commits): - WasmBridge.getSectionCount() TypeScript 래퍼 추가 (WASM 측 이미 노출) - moveToDocumentEnd 의 sec=0 하드코드를 getSectionCount()-1 로 정정 + 빈 문서 폴백 (secCount > 0 ? secCount - 1 : 0) 함께 정리 — 자기 정정 commit (f2ab6e0): 작업지시자 시각 검증 중 발견 — Ctrl+↓ 가 한 문단씩 이동이 아니라 문서 끝으로 이동 (PR #746 매핑이 macOS 표준만 정합, 한컴 표준 어긋남). cursor.ts 에 moveToParagraphBoundary 신규 + input-handler-keyboard.ts 분기: - macOS Cmd+↑/↓ (e.metaKey && !e.ctrlKey) = 문서 시작/끝 (macOS 표준 보존) - Windows/Linux Ctrl+↑/↓ = 이전/다음 문단 (한컴 표준) - 본문/표 셀 양 경로 + 구역 경계 정합 자기 검증: tsc + cargo test ALL GREEN, WASM 재빌드 불필요 (TypeScript 단일) 시각 판정: 작업지시자 인터랙션 검증 ✅ 통과 - aift.hwp Ctrl+End 콘솔 오류 부재 + 마지막 구역 마지막 문단 끝 - Ctrl+↓ 한 문단씩 이동 정상 별 Issue 로 분리 후속: - 빈 문단 캐럿 미표시 (마우스 클릭 + 화살표 진입 모두 — 본 PR 무관 기존 결함) CI: ✅ Build & Test + CodeQL (js-ts/python/rust) + Canvas visual diff
문제
macOS에서
Cmd+Arrow조합이 처리되지 않아 줄 시작/끝, 문서 시작/끝으로 이동할 수 없습니다. Windows의Ctrl+Arrow도 마찬가지입니다.수정 내용
handleCtrlKey()에 Arrow 키 처리 추가:모든 방향에
Shift조합으로 선택 범위 확장을 지원합니다.범위
검증
cargo test— 전체 통과감사합니다.