개발/Visual Studio Code

커맨드 팔레트 58부: Notebook 입력 모드에서 출력 접기 단축키가 멈추는 이유

반응형
VS CODE 초보자 시리즈 · 커맨드 팔레트 58 부

Notebook 입력 모드에서 출력 접기 단축키가 멈추는 이유

저장된 출력이 있는 같은 셀에서 입력 모드와 Command Mode의 Context Keys를 비교해, inputFocus가 Collapse Cell Output 단축키의 When 결과를 어떻게 바꾸는지 확인합니다.

나머지 세 상태를 고정하고 inputFocus=true → false만 바뀔 때 Collapse keybinding When이 false → true로 바뀜을 설명할 수 있으면 완료입니다.

출력이 있는데도 단축키가 반응하지 않으면 명령 고장으로 단정하기 전에 코드 입력 caret이 살아 있는지 확인하세요.

1. 시작하기 전에

난이도는 초급입니다. Notebook 파일 편집이나 셀 실행 없이 포커스 전환, Context 조회, Boolean 계산만 합니다.

준비할 것

  • Windows 11과 VS Code Stable 1.139.1 — 확인: Help > About 또는 code --version
  • 저장된 출력 1건이 있는 격리 Notebook — 확인: 화면의 SAVED_OUTPUT_ONLY와 JSON의 outputs[0]
  • Developer Tools Console — 확인: Help > Toggle Developer Tools에서 Console 탭 표시

적용 환경 Windows 11 · VS Code Stable 1.139.1 · PowerShell 7 또는 Windows PowerShell

안전하게 시작하기 업무 Notebook과 현재 User 프로필은 보호 대상입니다. 셀 실행, 저장, 출력 접기 명령, 단축키 편집, 확장 설치를 하지 않습니다. 중단 조건: 저장된 출력이 사라지거나 실행 횟수·파일 해시가 달라지면 즉시 중단하고 원본을 보존합니다.

2. 알아둘 핵심 개념

When clause

Context key의 현재 값을 조합해 키 바인딩 같은 UI 규칙이 적용되는 조건을 표현합니다. &&는 모든 항목이 true여야 하고 !는 Boolean을 반전합니다.

inputFocus

공식 문서에서 텍스트 입력 영역이 포커스를 가지면 true인 Context key입니다. 코드 셀 편집 영역의 caret이 활성일 때 true이고, Esc로 셀 선택으로 돌아오면 false가 됩니다.

notebookCellHasOutputs

선택 셀에 출력이 있으면 true인 Notebook 내부 Context key입니다. 이번 두 Snapshot에서는 모두 true로 고정합니다.

notebookCellOutputIsCollapsed

출력 영역이 접힌 상태인지 나타냅니다. 이번 실습은 출력 접기 명령을 실행하지 않으므로 두 Snapshot에서 모두 false입니다.

확인 범위

이번 실습이 판정하는 것은 Collapse Cell Output 키 바인딩의 When 식입니다. Command Palette 노출이나 직접 명령 호출 가능 여부까지 일반화하지 않습니다.

3. 순서대로 진행하기

각 단계의 정상 결과를 확인한 뒤 다음 단계로 이동합니다.

1. 격리된 출력 포함 Notebook 확인

목적 업무 파일과 현재 User 프로필을 보호한 채 이미 저장된 출력 하나를 준비한다.

  1. 격리 폴더의 input-focus-context.ipynb를 열고 셀 실행·저장·단축키 편집을 하지 않기로 확인한다.

입력 위치 격리 폴더의 input-focus-context.ipynb

execution_count=1, outputs[0].text='SAVED_OUTPUT_ONLY'
정상 결과 코드 셀 아래에 SAVED_OUTPUT_ONLY 출력이 보이지만 새 실행은 일어나지 않는다.

확인 Notebook JSON의 outputs 배열 길이와 화면 출력 문구를 대조한다.

실패 신호 출력이 없거나 업무 Notebook을 열었거나 실행 표시가 바뀌었다.

복구와 재합류 저장하지 않고 닫은 뒤 제공된 격리 샘플에서 STEP-01로 재합류한다.

2. Collapse When 식 고정

목적 관찰 전에 판정 규칙을 정확히 적는다.

  1. 현재 Stable 소스의 Collapse Cell Output keybinding When 식을 실습 메모에 적는다.

입력 위치 공식 Stable cellCommands.ts

listFocused && !outputCollapsed && !inputFocus && hasOutputs
정상 결과 네 조건이 모두 true여야 해당 단축키 규칙이 활성이라는 식이 준비된다.

확인 명령 ID notebook.cell.collapseCellOutput와 네 Context key를 원문에서 대조한다.

실패 신호 inputFocus의 부정 연산자나 hasOutputs가 빠졌다.

복구와 재합류 Stable 커밋 원문을 다시 열고 STEP-02로 돌아온다.

3. Developer Tools Console 열기

목적 Inspect Context Keys 결과가 출력될 위치를 준비한다.

  1. Command Palette에서 Developer: Toggle Developer Tools를 실행하고 Console 탭을 선택한다.

입력 위치 Command Palette → Developer Tools

Console 탭
정상 결과 Console 입력·출력 영역이 보인다.

확인 Developer Tools 상단에서 Console이 선택됐는지 확인한다.

실패 신호 별도 창이나 Console 탭을 찾을 수 없다.

복구와 재합류 Help > Toggle Developer Tools로 다시 열고 STEP-03에 재합류한다.

4. 입력 모드 Snapshot A 만들기

목적 출력은 유지하고 코드 입력 영역에 포커스를 둔다.

  1. 같은 코드 셀의 편집 영역을 한 번 클릭해 caret이 깜박이는 입력 모드로 만든다.

입력 위치 Notebook 코드 셀 입력 영역

SAVED_OUTPUT_ONLY 표시 / caret 표시 / 출력 펼침
정상 결과 코드 caret과 저장된 출력이 동시에 보인다.

확인 다른 파일이나 출력 영역이 아닌 같은 셀 입력 영역인지 확인한다.

실패 신호 caret이 없거나 출력이 보이지 않는다.

복구와 재합류 출력을 접지 말고 같은 셀 입력 영역을 다시 클릭해 STEP-04를 반복한다.

5. Snapshot A 수집

목적 입력 모드의 네 Context 값을 한 객체에서 읽는다.

  1. Developer: Inspect Context Keys를 실행하고 같은 코드 입력 영역을 한 번 클릭한다.

입력 위치 Command Palette → selected code input

Snapshot A
정상 결과 Console에 Context 객체 하나가 추가된다.

확인 객체에서 notebookCellListFocused, inputFocus, notebookCellHasOutputs, notebookCellOutputIsCollapsed를 찾는다.

실패 신호 객체가 없거나 네 key 중 하나가 없다.

복구와 재합류 클릭 대상과 오류 원문을 보존하고 STEP-04부터 다시 측정한다.

6. 입력 모드의 When 계산

목적 inputFocus=true가 어느 항목을 막는지 확인한다.

  1. Snapshot A 값을 Collapse When 식에 왼쪽부터 대입한다.

입력 위치 실습 메모

true && !false && !true && true
정상 결과 중간값은 true, true, false, true이고 전체 결과는 false다.

확인 hasOutputs=true와 outputCollapsed=false가 유지됐는지 같은 객체에서 대조한다.

실패 신호 hasOutputs=false이거나 outputCollapsed=true다.

복구와 재합류 대상 셀 또는 출력 상태 차이를 UNKNOWN으로 기록하고 STEP-01부터 다시 확인한다.

7. Command Mode Snapshot B 만들기

목적 파일·출력은 그대로 두고 inputFocus만 false로 바꾼다.

  1. Esc를 눌러 caret을 없앤 뒤 같은 셀의 왼쪽 여백을 선택한다.

입력 위치 같은 Notebook 셀

SAVED_OUTPUT_ONLY 표시 / caret 없음 / 셀 선택 표시
정상 결과 출력은 펼쳐진 채이고 코드 입력 caret만 사라진다.

확인 출력 문구와 셀 선택 표시를 함께 확인한다.

실패 신호 출력이 접혔거나 다른 셀이 선택됐다.

복구와 재합류 Collapse 명령을 실행하지 말고 필요하면 저장하지 않은 채 다시 열어 STEP-04부터 반복한다.

8. Snapshot B 수집과 비교

목적 같은 셀에서 포커스 전환 뒤 Context 값을 읽는다.

  1. Developer: Inspect Context Keys를 실행하고 선택된 셀 컨테이너를 한 번 클릭한다.

입력 위치 Command Palette → selected cell container

Snapshot B
정상 결과 Console에 두 번째 Context 객체가 추가된다.

확인 A와 B에서 listFocused=true, hasOutputs=true, outputCollapsed=false가 같고 inputFocus만 true→false인지 확인한다.

실패 신호 둘 이상의 key가 바뀌거나 Snapshot 대상이 다르다.

복구와 재합류 원인을 UNKNOWN으로 기록하고 같은 셀에서 STEP-04부터 두 Snapshot을 다시 수집한다.

9. Command Mode의 When 계산

목적 inputFocus=false가 보호 조건을 통과시키는지 확인한다.

  1. Snapshot B 값을 같은 Collapse When 식에 대입한다.

입력 위치 실습 메모

true && !false && !false && true
정상 결과 네 중간값이 모두 true이고 전체 결과도 true다.

확인 Snapshot A의 false와 Snapshot B의 true를 나란히 비교한다.

실패 신호 A와 B의 결과가 같거나 계산 항목이 네 개가 아니다.

복구와 재합류 원문 식과 두 객체를 다시 대조하고 STEP-06과 STEP-09를 재계산한다.

10. 변경 0건 독립 확인

목적 관찰 과정이 파일과 User 설정을 바꾸지 않았는지 확인한다.

  1. 실습 전후 Notebook SHA-256과 격리 User keybindings.json을 비교한다.

입력 위치 PowerShell · Run 폴더에서 실행

Get-FileHash .\_qa\notebook-fixture\input-focus-context.ipynb -Algorithm SHA256
정상 결과 Notebook 해시는 동일하고 격리 keybindings.json은 [] 그대로다.

확인 전후 해시 문자열과 keybindings.json 원문을 비교한다.

실패 신호 해시가 달라지거나 keybindings.json에 항목이 생겼다.

복구와 재합류 변경 파일을 보존하고 원인을 UNKNOWN으로 기록한 뒤 새 격리 복사본에서 STEP-01로 돌아간다.

11. 완료 조건 재확인

목적 두 Snapshot·판정·무변경 증거를 한 번에 닫는다.

  1. Snapshot A/B, 두 Boolean 계산, 파일 비교 결과를 체크리스트로 확인한다.

입력 위치 실습 체크리스트

A: true/true/true/false · B: true/false/true/false · When: false→true · SHA-256
정상 결과 inputFocus만 true에서 false로 바뀌고 Collapse keybinding When이 false에서 true로 바뀌며 파일 변경은 0건이다.

확인 각 항목이 Evidence에 독립적으로 있는지 확인한다.

실패 신호 한 항목이라도 누락되거나 값이 다르다.

복구와 재합류 PASS를 금지하고 누락 항목의 이전 단계로 돌아가 다시 확인한다.

4. 완료 확인하기

두 Context 객체와 독립된 파일 비교를 함께 사용해 결과를 교차 확인합니다.

  • Snapshot A · 입력 모드 — listFocused=true / inputFocus=true / hasOutputs=true / outputCollapsed=false
  • Snapshot B · Command Mode — listFocused=true / inputFocus=false / hasOutputs=true / outputCollapsed=false
  • Boolean 계산 — A는 true && true && false && true = false, B는 true && true && true && true = true입니다.
  • Notebook SHA-256 — 실습 전후가 같습니다.
  • 격리 User keybindings.json — [] 그대로입니다.
완료 기준 같은 출력 포함 셀에서 inputFocus만 true에서 false로 바뀌고, Collapse Cell Output 키 바인딩 When 결과가 false에서 true로 바뀌며 파일·키 바인딩 변경이 0건임을 설명할 수 있습니다.

5. 문제가 생겼다면

Snapshot A의 inputFocus가 false다

먼저 확인 코드 입력 caret이 실제로 깜박이는지 봅니다.

복구 같은 셀의 코드 입력 영역을 클릭하고 다시 측정합니다.

재합류 STEP-04

Snapshot B의 inputFocus가 true다

먼저 확인 Esc 뒤에도 코드 입력 caret이 남았는지 봅니다.

복구 Esc를 누르고 같은 셀 왼쪽 여백을 선택합니다.

재합류 STEP-07

notebookCellHasOutputs가 false다

먼저 확인 SAVED_OUTPUT_ONLY가 같은 셀 아래에 보이는지 확인합니다.

복구 파일을 수정하지 말고 제공된 출력 포함 격리 샘플을 다시 엽니다.

재합류 STEP-01

Inspect 결과에 key가 없다

먼저 확인 Snapshot A에서는 코드 입력 영역, B에서는 셀 컨테이너를 클릭했는지 확인합니다.

복구 대상과 오류 원문을 보존하고 원인을 확정할 수 없으면 UNKNOWN으로 기록합니다.

재합류 STEP-04

파일 해시가 달라졌다

먼저 확인 자동 저장, 수동 저장, 셀 실행 여부를 확인합니다.

복구 변경본을 덮어쓰지 말고 별도로 보존한 뒤 새 격리 복사본으로 다시 시작합니다.

재합류 STEP-01

핵심 판단 원인을 확인하지 못하면 상태와 Evidence를 보존하고 임의 변경 없이 중단합니다.

6. 핵심 정리와 공식 자료

  • 코드 입력 caret이 살아 있으면 inputFocus=true입니다.
  • Collapse keybinding은 !inputFocus를 요구하므로 입력 모드에서는 When 결과가 false입니다.
  • Esc 뒤 같은 셀을 선택하면 inputFocus=false가 되어 나머지 조건이 같을 때 결과가 true가 됩니다.
  • When 결과는 해당 키 바인딩 규칙의 판정이며 명령 전체의 존재 여부로 확대하지 않습니다.

공식 자료

아래 자료는 2026-09-26 KST에 확인했습니다. Stable 1.139.1·커밋 04c0d99f4fb0d8afe6ce4f0c58e31e183ac3e4b1 기준이며 내부 Notebook Context key는 향후 변경될 수 있습니다.

다음 편 예고 커맨드 팔레트 59부에서는 출력 영역에 포커스가 있을 때 Esc와 셀 선택으로 안전하게 돌아오는 경로를 Context Keys로 확인합니다.
반응형
이 글이 유용했다면 링크를 공유해 보세요.