Skip to content

Task #260: Ctrl/Cmd+Arrow 커서 이동 — 줄/문서 시작·끝#746

Closed
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/ctrl-arrow-navigation
Closed

Task #260: Ctrl/Cmd+Arrow 커서 이동 — 줄/문서 시작·끝#746
oksure wants to merge 2 commits into
edwardkim:develfrom
oksure:contrib/ctrl-arrow-navigation

Conversation

@oksure
Copy link
Copy Markdown
Contributor

@oksure oksure commented May 9, 2026

문제

macOS에서 Cmd+Arrow 조합이 처리되지 않아 줄 시작/끝, 문서 시작/끝으로 이동할 수 없습니다. Windows의 Ctrl+Arrow도 마찬가지입니다.

수정 내용

handleCtrlKey()에 Arrow 키 처리 추가:

키 조합 동작 기존 대응 키
Ctrl/Cmd + ← 줄 시작 Home
Ctrl/Cmd + → 줄 끝 End
Ctrl/Cmd + ↑ 문서 시작 Ctrl+Home
Ctrl/Cmd + ↓ 문서 끝 Ctrl+End

모든 방향에 Shift 조합으로 선택 범위 확장을 지원합니다.

범위

  • 이 PR은 #260의 첫 단계로, Ctrl/Cmd+Arrow 방향키에 대한 커서 이동만 구현합니다.
  • Option+Arrow (단어 단위 이동)은 단어 경계 감지 로직이 필요하여 후속 작업으로 남겨둡니다.

검증

  • TypeScript 타입 체크 통과 (WASM 모듈 import 제외)
  • cargo test — 전체 통과

감사합니다.

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>
Copilot AI review requested due to automatic review settings May 9, 2026 14:08
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +921 to +928
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;
Comment on lines +930 to +937
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;
Comment on lines +939 to +946
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;
Comment on lines +948 to +955
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>
@oksure
Copy link
Copy Markdown
Contributor Author

oksure commented May 9, 2026

Copilot 리뷰 피드백 반영 (c99e492): updateCaret()가 내부에서 updateSelection()을 호출하므로 중복 호출 제거.

edwardkim added a commit that referenced this pull request May 10, 2026
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
edwardkim added a commit that referenced this pull request May 10, 2026
- 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건 처리)
@edwardkim
Copy link
Copy Markdown
Owner

@oksure 님, 검토 + 머지 완료했습니다.

처리 결과

옵션 A (2 commits cherry-pick + no-ff merge `20c0e5d4`) 로 처리. 충돌 0건.

자기 검증

  • cherry-pick 충돌 0건
  • `tsc --noEmit` ✅ 통과
  • `cargo test --release` ✅ ALL GREEN
  • 광범위 sweep (7 fixture / 170 페이지) ✅ 170 same / 0 diff (TypeScript 영역 영역 SVG 무영향)
  • WASM 빌드 ✅ 4.66 MB

작업지시자 웹 에디터 인터랙션 검증 ✅ 통과

dev server 영역 영역 4가지 Arrow + Shift 조합 정합 동작:

  • Ctrl/Cmd + ← / → → 줄 시작 / 끝
  • Ctrl/Cmd + ↑ / ↓ → 문서 시작 / 끝
  • Shift 조합 영역 영역 선택 범위 확장

인프라 재사용

기존 `Ctrl+Home/End` 패턴 정합 + `cursor.moveTo*` 기존 메서드 재호출 영역 영역 신규 인프라 도입 부재 영역 영역 위험 좁힘 (`feedback_process_must_follow` 정합).

후속 분리 (PR 본문 명시 정합)

처리 보고서: `mydocs/pr/archives/pr_746_report.md`.

@oksure20+ 사이클 컨트리뷰션 영역 — 5/10 사이클 영역 영역 PR #720/#723/#725/#728/#729/#730/#732/#734/#735/#737/#738/#739/#740/#742/#743/#744/#745/#746 영역 18건 처리 완료 영역.

@edwardkim edwardkim closed this May 10, 2026
edwardkim added a commit that referenced this pull request May 10, 2026
기존 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 영역 별도 단계)
edwardkim added a commit that referenced this pull request May 11, 2026
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
edwardkim added a commit that referenced this pull request May 11, 2026
작업지시자 시각 검증 영역 영역 발견: 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 (한컴 표준)
edwardkim added a commit that referenced this pull request May 11, 2026
@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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants