개발/Visual Studio Code

커맨드 팔레트 45부: VS Code Terminal Find가 열려 있을 때 Task 종료 단축키 잠그기

반응형
커맨드 팔레트 45부

커맨드 팔레트 45부: VS Code Terminal Find가 열려 있을 때 Task 종료 단축키 잠그기

Terminal Find가 보이는 동안 연습 Task의 종료 단축키를 잠그고, 검색창을 닫은 뒤에만 다시 사용할 수 있게 만듭니다.

검색창 닫힘 → ON, 검색창 열림 → OFF, 검색창을 둔 채 Terminal 본문에 포커스 → OFF, 검색창 닫기 → ON을 확인하고 연습 Target만 종료한 뒤 설정을 원복합니다.

Find 입력에서 본문으로 돌아와도 검색창이 보이면 종료 잠금을 유지합니다.

1. 시작하기 전에

이번 글은 앞선 텍스트 선택 잠금에 검색창 표시 조건을 더하는 실습입니다. JSON 객체를 배열에 병합할 수 있는 초보자를 대상으로 하며 예상 시간은 15~20분입니다. 이전 편을 따라 했어도 아래 선수 조건부터 다시 확인하세요.

적용 환경: Windows 11 · VS Code Stable 1.137.0 · Windows PowerShell powershell.exe · 단일 로컬 연습 Workspace. 조사 시점은 2026-09-13 Asia/Seoul입니다. 영어 UI 명칭을 기준으로 쓰며 한국어 표시가 다르면 영어 명령이나 command ID로 확인합니다.

준비할 것

  • 중요한 코드나 실행 중 빌드가 없는 새 연습 폴더를 File > Open Folder로 열어 둡니다. Explorer의 최상위 폴더 이름을 확인하세요. JCOS 저장소나 업무 폴더를 실습 폴더로 사용하지 않습니다.
  • 현재 Profile의 User keybindings.json을 열 수 있어야 합니다. Ctrl+Shift+P에서 Preferences: Open Keyboard Shortcuts (JSON)을 실행해 파일이 배열인지 확인합니다. 파일 경로를 추측해서 직접 덮어쓰지 않습니다. [S3]
  • PowerShell Terminal에서 Get-Command powershell.exe를 실행해 CommandType과 Source가 표시되는지 확인합니다. 실행 위치는 열린 연습 폴더이며 이 명령은 조회만 합니다. 없으면 중단하고 설치나 정책 변경을 시도하지 않습니다.
  • 기존 keybindings.json과 .vscode/tasks.json이 있다면 원문 전체를 연습 폴더 밖의 백업 파일로 복사하고 다시 열어 내용이 같은지 확인합니다. 파일이 없던 상태도 메모합니다. Settings Sync가 켜져 있다면 User 단축키 변경이 다른 환경에 반영될 수 있으므로 사용하는 Profile과 동기화 상태를 먼저 확인합니다.
안전하게 시작하기: 이 실습은 User 단축키와 Workspace Task 객체를 추가하며 짧은 PowerShell 프로세스를 실행·종료합니다. 종료된 프로세스의 상태는 되살릴 수 없으므로 업무 Task에는 적용하지 않습니다. 연습 Task는 출력만 만들고 약 5분 뒤 자연 종료합니다. presentation.clear=true는 재실행 시 해당 전용 Terminal의 기존 출력을 지우므로 필요한 RUN_ID와 로그를 먼저 복사합니다. 외부 전송·설치·권한 변경·자동 실행은 필요하지 않습니다.
Human Gate: 첫 저장 전 백업을 열어 확인하고, Task 시작 전 명령이 출력과 대기만 하는지 읽고, 종료 chord를 누르기 전 label과 RUN_ID가 연습 Target인지 직접 확인합니다. 중요한 프로세스, 백업 실패, 예상하지 못한 command 매칭, 다른 Task가 보이는 선택창이 나타나면 중단합니다. 선택창은 Esc로 취소하며 All Running Tasks를 선택하지 않습니다.

Rollback: 연습 Task만 label을 확인해 수동 종료하고, 추가한 User rule과 두 Task 객체만 제거합니다. 기존 배열은 백업과 비교해 보존합니다. 이전 편 rule을 교체했다면 그 객체만 복원합니다. 원래 없었던 파일은 다른 내용이 생기지 않았는지 확인한 뒤 연습 파일만 제거할 수 있습니다. 실행 중인 업무 Task는 임의 재시작하지 않습니다.

2. 알아둘 핵심 개념

FACT — Context Key와 when

Context Key는 VS Code가 UI 상태에 따라 제공하는 값입니다. User keybindings.json의 when은 String인 조건식이며 설정 settings.json의 Key가 아닙니다. 이 글의 다섯 Context 값은 Boolean입니다. &&는 모든 항이 참이어야 통과하고 !는 참·거짓을 뒤집습니다. [S3][S4][S7]

FACT — visible과 focus

terminalFindVisible은 활성 Terminal의 Find 위젯이 보이는지 나타내며 기본값은 false입니다. 검색 입력란의 포커스는 별도 값으로 관리됩니다. 따라서 검색창을 열고 본문으로 돌아왔다는 이유만으로 검색창이 닫힌 것은 아닙니다. show/reveal은 표시 값을 true로, hide는 기본 false로 되돌립니다. [S7][S9]

EXAMPLE — 이번 조건식

taskRunning && terminalFocus && taskTerminalActive && !terminalTextSelected && !terminalFindVisible
뜻은 실행 중 Task가 있고, Terminal 본문에 포커스가 있으며, 활성 Terminal이 Task Terminal이고, 출력 선택과 검색창 표시가 모두 없는 경우입니다. 앞선 조건은 유지하고 마지막 조건만 이번 독자 목표에 추가합니다.

FACT — Target 지정과 한계

args는 종료할 Task label과 같은 String입니다. taskRunning은 특정 Target의 존재를 뜻하지 않고 taskTerminalActive도 Target 전용 조건이 아닙니다. 다른 Task만 실행 중이면 args 매칭이 실패해 선택창으로 넘어갈 수 있습니다. 이때 Esc로 취소합니다. [S10]

RECOMMENDATION — chord

ctrl+k ctrl+alt+t는 이 글의 예시이며 기본 VS Code 종료 단축키가 아닙니다. Ctrl+K를 눌렀다 놓고 Ctrl+Alt+T를 누르는 두 단계 입력입니다. 충돌이 있으면 확인한 미사용 조합으로 key만 바꾸고 모든 실습에서 같은 조합을 사용합니다.

관찰표 (앞의 네 조건이 통과할 때): Find 닫힘·terminalFindVisible=false → ON / Find 열림·terminalFindVisible=true → OFF / Find 열림 상태로 본문에 포커스 → OFF / Hide Find 후 false → ON. Find 입력란 포커스에서는 terminalFocus가 달라질 수 있으므로 Find 열림+본문 포커스 비교가 마지막 항을 검증하는 핵심입니다. 검색 결과 강조와 마우스로 선택한 출력 텍스트도 구분하세요.

3. 순서대로 진행하기

1. 백업과 실습 폴더 확정

목적 첫 변경을 안전하게 되돌릴 준비를 합니다.

  1. 시작하기 전 목록을 확인한 뒤 현재 User JSON과 기존 Workspace Task 파일의 원문을 별도 백업에 복사합니다.

입력 위치 현재 Profile User keybindings.json과 연습 폴더 .vscode/tasks.json

Artifact 백업 파일과 원래 파일 존재 여부 메모

정상 결과 백업을 다시 열었을 때 원문과 일치합니다.

확인 Explorer 폴더 이름·Profile·백업 내용·powershell.exe 조회 결과를 대조합니다.

실패 신호 업무 폴더, 저장 실패, 파일 위치 불명

복구와 재합류 변경을 하지 않고 올바른 연습 폴더를 연 뒤 Step 1부터 다시 확인합니다.

주의·되돌리기 User 설정은 다른 Workspace에도 영향을 줍니다. 백업 확인이 첫 저장의 Human Gate입니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

2. 두 연습 Task 객체 저장

목적 종료 대상과 부재 확인용 대조군을 만듭니다.

  1. 아래 Task 정의를 연습 .vscode/tasks.json에 병합해 저장합니다. 파일이 없을 때만 전체 예시를 사용하고 기존 파일은 tasks 배열 안에 두 객체만 추가합니다.

입력 위치 Workspace 범위 .vscode/tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "JCOS Find Lock Target",
      "type": "process",
      "command": "powershell.exe",
      "args": [
        "-NoProfile",
        "-Command",
        "$id=[guid]::NewGuid().ToString('N').Substring(0,8); Write-Output ('FIND_LOCK_TARGET RUN_ID='+$id); for($i=0;$i -lt 300;$i++){ Write-Output ('FIND_LOCK_TARGET HEARTBEAT='+$i); Start-Sleep -Seconds 1 }"
      ],
      "problemMatcher": [],
      "presentation": {
        "reveal": "always",
        "panel": "dedicated",
        "clear": true
      }
    },
    {
      "label": "JCOS Find Lock Guard",
      "type": "process",
      "command": "powershell.exe",
      "args": [
        "-NoProfile",
        "-Command",
        "$id=[guid]::NewGuid().ToString('N').Substring(0,8); Write-Output ('FIND_LOCK_GUARD RUN_ID='+$id); for($i=0;$i -lt 300;$i++){ Write-Output ('FIND_LOCK_GUARD HEARTBEAT='+$i); Start-Sleep -Seconds 1 }"
      ],
      "problemMatcher": [],
      "presentation": {
        "reveal": "always",
        "panel": "dedicated",
        "clear": true
      }
    }
  ]
}
정상 결과 Tasks: Run Task 목록에 JCOS Find Lock Target과 Guard가 표시됩니다.

확인 JSON 오류가 없고 두 label·process·powershell.exe·args가 예시와 일치하는지 확인합니다.

실패 신호 빨간 밑줄, 쉼표 오류, Task 목록 누락

복구와 재합류 오류 원문과 줄 번호를 복사한 뒤 추가 객체만 제거하고 백업과 비교합니다. JSON을 복구하고 Step 2로 재합류합니다.

주의·되돌리기 실행은 아직 하지 않습니다. args는 String Array, problemMatcher는 빈 Array, presentation은 Object이며 panel은 String dedicated, clear는 Boolean true입니다. 코드의 $id·$i는 내부 변수입니다. 치환할 Placeholder는 없으며 label을 바꾸면 args도 함께 맞춥니다. [S6] 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

3. 단축키 충돌 확인

목적 잠금 상태에서 다른 명령이 실행될 가능성을 확인합니다.

  1. Ctrl+K Ctrl+S로 Keyboard Shortcuts를 열어 ctrl+k ctrl+alt+t를 검색하고 결과가 있으면 Show Same Keybindings로 command·when·source를 확인합니다.

입력 위치 Keyboard Shortcuts 편집기

Artifact 사용할 key와 기존 rule 기록

정상 결과 이번 조합을 사용하는 rule과 영향을 파악했습니다.

확인 동일 chord의 User rule을 포함해 비교합니다. 이전 편 종료 rule이 있으면 백업한 해당 객체를 교체 대상으로 표시합니다. [S3]

실패 신호 같은 chord의 광범위한 rule, 기존 정의를 설명할 수 없음

복구와 재합류 새 미사용 조합을 확인하거나 기존 rule을 보존한 채 중단합니다. 충돌을 정리한 후 Step 3부터 반복합니다.

주의·되돌리기 조건 false는 이 rule을 제외할 뿐 다른 rule이나 셸 입력까지 막지 않습니다. 종료용 command를 가진 중복 rule을 남기지 않습니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

4. 다섯 조건 종료 rule 저장

목적 Find가 표시되면 종료 rule을 제외합니다.

  1. User keybindings.json 배열 안에 아래 객체 하나를 추가하거나 앞선 편의 해당 종료 객체를 이 객체로 교체해 저장합니다.

입력 위치 Preferences: Open Keyboard Shortcuts (JSON) · User 범위

[
  {
    "key": "ctrl+k ctrl+alt+t",
    "command": "workbench.action.tasks.terminate",
    "args": "JCOS Find Lock Target",
    "when": "taskRunning && terminalFocus && taskTerminalActive && !terminalTextSelected && !terminalFindVisible"
  }
]
정상 결과 한 User rule에 정확한 when과 Target args가 저장됩니다.

확인 key·command·args·when은 모두 String입니다. 마지막 항이 && !terminalFindVisible인지 확인하고 JSON 오류가 없는지 봅니다. [S3][S4]

실패 신호 terminalFindVisible 철자 오류, 중복 rule, 배열 전체 덮어쓰기

복구와 재합류 추가 rule을 제거하거나 해당 백업 객체를 복원합니다. 원문 오류를 기록하고 Step 4에서 객체 하나만 다시 병합합니다.

주의·되돌리기 배열 전체 예시는 새 파일용입니다. 기존 단축키 배열을 지우지 않습니다. command ID는 workbench.action.tasks.terminate이며 args의 Target label을 임의로 바꾸지 않습니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

5. Target 실행과 기준 상태 기록

목적 실제 출력과 검색창 닫힘 기준선을 만듭니다.

  1. Ctrl+Shift+P > Tasks: Run Task에서 JCOS Find Lock Target을 실행하고 열린 Target Terminal 본문을 클릭합니다.

입력 위치 연습 Workspace Command Palette와 Target 전용 Terminal

Artifact FIND_LOCK_TARGET RUN_ID=<실제 8자리 값> 및 HEARTBEAT=<증가 숫자>

정상 결과 RUN_ID 한 줄 뒤 약 1초마다 HEARTBEAT가 증가합니다. Find와 마우스 텍스트 선택이 없습니다.

확인 Developer: Inspect Context Keys를 실행해 Terminal 본문을 검사합니다. 기대값은 taskRunning=true, terminalFocus=true, taskTerminalActive=true, terminalTextSelected=false, terminalFindVisible=false입니다. 검사 종료 후 본문을 다시 클릭합니다. [S4][S7]

실패 신호 즉시 종료, 다른 label, Context 불일치

복구와 재합류 오류 원문을 보존하고 연습 Target만 수동 정리합니다. 정의는 Step 2, 실행은 Step 5로 돌아갑니다. 약 5분 자연 종료라면 다시 시작해 새 RUN_ID 기준으로 Step 5부터 재확인합니다.

주의·되돌리기 시작 전 args를 읽는 Human Gate입니다. <실제 8자리 값>은 출력에서 읽는 Placeholder이며 입력할 명령이 아닙니다. 다른 프로세스와 혼동하면 종료하지 않습니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

6. Terminal Find에서 출력 검색

목적 검색 흐름이 유지되는지 확인합니다.

  1. Target Terminal에서 Ctrl+F를 눌러 Find를 열고 FIND_LOCK_TARGET을 검색 입력란에 입력합니다.

입력 위치 Target Terminal Find 입력란

Artifact 검색어 FIND_LOCK_TARGET와 일치 결과 강조

정상 결과 Find가 보이고 출력의 같은 문자열이 강조됩니다.

확인 검색어가 남고 결과가 보이며 Target heartbeat가 계속 증가하는지 확인합니다. terminalFindVisible=true를 검사하되 입력란 포커스의 terminalFocus 값은 본문과 다를 수 있습니다. [S5][S7]

실패 신호 Editor Find가 열림, 결과 없음, Task 자연 종료

복구와 재합류 Find를 닫고 Target Terminal 본문을 선택한 뒤 Step 6을 반복합니다. 출력이 끝났으면 Step 5에서 다시 실행합니다.

주의·되돌리기 Ctrl+F 기본 바인딩이 바뀌었다면 Command Palette의 Terminal: Focus Find(command ID workbench.action.terminal.focusFind)를 확인합니다. 검색 입력란에 종료 chord를 반복 입력하지 않습니다. [S8] 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

7. Find를 둔 채 본문에서 잠금 검증

목적 포커스를 본문으로 돌려도 표시 조건이 계속 잠그는지 확인합니다.

  1. Find를 닫지 않고 Target Terminal 본문 빈 곳을 한 번 클릭한 뒤 확인을 마치고 종료 chord를 한 번 입력합니다.

입력 위치 Target Task Terminal 본문과 Keyboard Shortcuts Troubleshooting 로그

Artifact Find가 보이는 본문 상태, 종료 입력 전후 heartbeat와 원문 로그

정상 결과 Find는 열린 채이며 Target 출력이 계속 증가하고 이 종료 rule이 호출되지 않습니다.

확인 먼저 Developer: Toggle Keyboard Shortcuts Troubleshooting을 켜고 다시 본문에 포커스합니다. 앞의 네 조건 통과와 terminalFindVisible=true를 검사합니다. chord 후 2초 출력 증가와 실제 매칭 command를 로그에서 비교합니다. 검사 화면을 닫으면 본문 포커스를 다시 확인합니다. [S3][S9]

실패 신호 Find가 닫힘, 다른 command 실행, Target 종료, 앞의 조건 불일치

복구와 재합류 추가 chord 입력을 멈추고 로그·Context·RUN_ID를 보존합니다. 충돌은 Step 3, 문자열은 Step 4, 자연 종료는 Step 5로 재합류합니다. 원인 확인 전 임의 설정을 바꾸지 않습니다.

주의·되돌리기 종료 시험 전 label/RUN_ID가 연습용인지 직접 확인합니다. 로그를 연 상태는 포커스가 바뀌므로 실제 입력 전에 본문으로 돌아옵니다. 이 비교가 Find 입력 포커스로 이미 막힌 경우와 구분되는 핵심 검증입니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

8. Find 닫기와 재활성 확인

목적 검색이 끝나면 조건이 다시 통과하는지 확인합니다.

  1. Target Terminal에서 Terminal: Hide Find를 실행해 검색창을 닫고 본문에 다시 포커스합니다.

입력 위치 Command Palette · workbench.action.terminal.hideFind · Target Terminal 본문

Artifact terminalFindVisible true→false 기록

정상 결과 Find가 사라지고 앞의 네 조건도 통과해 종료 rule이 다시 후보가 됩니다.

확인 다섯 Context 값을 다시 확인합니다. 출력 선택이 남으면 Escape로 선택을 해제한 뒤 검사합니다. 기본 Escape도 Find를 닫지만 포커스와 사용자 바인딩에 따라 다른 동작이 먼저 일어날 수 있습니다. [S7][S8][S9]

실패 신호 검색창 잔존, terminalTextSelected=true, 앞의 조건 false

복구와 재합류 command ID로 Hide Find를 확인하고 본문 포커스와 선택을 정리합니다. 여전히 다르면 Evidence를 보존해 Step 8을 반복하거나 UNKNOWN으로 중단합니다.

주의·되돌리기 검색창 닫기만으로 모든 항이 참이 된다고 단정하지 않습니다. 이 단계에서는 아직 종료 chord를 누르지 않습니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

9. Target만 종료 확인

목적 허용된 상태에서 실제 종료 동작을 검증합니다.

  1. Find·텍스트 선택이 없고 Target label과 RUN_ID가 맞을 때 종료 chord를 한 번 입력합니다.

입력 위치 Target Task Terminal 본문

Artifact 마지막 heartbeat와 workbench.action.tasks.terminate 매칭 로그

정상 결과 Target 출력이 멈추고 자동으로 새 RUN_ID가 생기지 않습니다.

확인 2초 뒤 동일 RUN_ID 출력이 증가하지 않고 Tasks: Show Running Tasks 목록에 Target이 없는지 교차 확인합니다. 자연 종료 시점 근처라면 로그를 함께 봅니다. [S10]

실패 신호 선택창 열림, 다른 Task 종료, 새 RUN_ID

복구와 재합류 선택창은 Esc로 취소합니다. args와 label을 맞춘 뒤 Step 5부터 전체 비교를 다시 수행합니다. 다른 업무 Task가 종료됐다면 임의 재시작하지 않고 해당 운영 절차를 따릅니다.

주의·되돌리기 종료는 되돌릴 수 없습니다. 연습 Target 외에는 선택하지 않는 Human Gate를 통과해야 합니다. 필요하면 연습 Target을 새로 실행할 수 있으나 RUN_ID는 새 기준입니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

10. Target 부재 선택창 취소

목적 UI gate가 특정 Target 존재를 보장하지 않는 한계를 확인합니다.

  1. Target이 없는 상태에서 JCOS Find Lock Guard만 실행하고 Find와 선택이 없는 Guard 본문에서 chord를 한 번 입력한 뒤 나타난 선택창을 Esc로 취소합니다.

입력 위치 Guard Task Terminal과 종료 Task 선택창

Artifact FIND_LOCK_GUARD RUN_ID=<실제 값>·heartbeat와 선택창 취소 기록

정상 결과 args Target을 찾지 못해 선택창으로 넘어갈 수 있으며 취소 뒤 Guard가 계속 실행됩니다.

확인 Guard heartbeat 증가와 Target 부재를 확인합니다. 실행 중 Task 목록에 Guard만 있는지 대조합니다. [S10]

실패 신호 Guard 종료, All Running Tasks 선택, 예상치 못한 다른 Task

복구와 재합류 즉시 추가 입력을 멈추고 로그를 보존합니다. 모든 항목 선택을 피하고 Esc로 취소합니다. Step 3/4에서 충돌·args를 점검한 후 연습 환경에서만 Step 10을 반복합니다.

주의·되돌리기 Guard 실행도 출력 전용 명령을 읽고 진행합니다. 이 실습에서는 다른 Task가 실행 중이면 부재 시험을 중단합니다. args를 terminateAll로 바꾸지 않습니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

11. Guard 수동 종료

목적 설정 정리 전에 연습 프로세스를 멈춥니다.

  1. Tasks: Terminate Task에서 JCOS Find Lock Guard label을 확인해 해당 연습 Task만 종료합니다.

입력 위치 Command Palette의 Task 종료 선택창

Artifact Guard 마지막 heartbeat와 실행 목록

정상 결과 Guard 출력이 멈추고 실행 중 연습 Task가 없습니다.

확인 Tasks: Show Running Tasks와 2초 뒤 Guard 출력 정지를 대조합니다.

실패 신호 다른 label, 연습 Task 잔존

복구와 재합류 선택을 Esc로 취소하고 연습 label을 다시 확인한 뒤 Step 11로 재합류합니다. 원인 불명일 때 프로세스 전체 강제 종료를 하지 않습니다.

주의·되돌리기 User rule을 지워도 실행 중인 Task는 별도로 남을 수 있으므로 프로세스를 먼저 정리합니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

12. User rule과 연습 객체 원복

목적 실습 이전 설정 상태로 돌아갑니다.

  1. 추가한 종료 rule과 두 Task 객체만 제거하고 이전 편 객체를 교체했다면 백업의 그 객체를 복원해 저장합니다.

입력 위치 User keybindings.json과 연습 .vscode/tasks.json

Artifact 백업과 비교한 최종 JSON 및 Troubleshooting 로그

정상 결과 추가한 label과 새 rule이 없고 기존 설정 내용이 보존됩니다.

확인 Problems에 JSON 오류가 없고 Keyboard Shortcuts에서 해당 새 User rule이 없으며 실행 중 연습 Task가 없음을 확인합니다. Troubleshooting은 같은 명령을 다시 실행해 끕니다.

실패 신호 JSON 오류, 기존 rule 손실, 예제 label 잔존

복구와 재합류 오류 원문을 저장하고 영향을 받은 객체를 백업과 대조해 복구합니다. Step 12를 반복한 뒤 완료 확인을 전부 다시 수행합니다.

주의·되돌리기 원래 없던 연습 파일을 지울 때는 다른 내용이 추가되지 않았는지 확인하고 그 파일만 제거합니다. 폴더 전체 삭제나 User 배열 전체 덮어쓰기는 하지 않습니다. 문제가 생기면 해당 단계의 복구 경로 또는 Step 12의 원복을 따릅니다.

4. 완료 확인하기

검색창 닫힘: 앞의 네 조건 통과와 terminalFindVisible=false를 확인합니다.
검색창 열림: 검색어가 유지되고 일치 결과가 보입니다. 입력란 포커스 상태만으로 마지막 항의 효과를 단정하지 않습니다.
열림+본문 포커스: 앞의 네 조건이 통과해도 terminalFindVisible=true로 rule이 제외됩니다. 원문 매칭 로그와 동일 RUN_ID heartbeat 증가로 교차 확인합니다.
닫기: Find가 사라지고 선택 없음·본문 포커스 상태에서 terminalFindVisible=false가 됩니다.
허용 후 종료: 로그의 종료 command, 동일 RUN_ID 출력 정지, 실행 중 Task 목록에서 Target 제거를 함께 확인합니다.
Target 부재: Guard만 있을 때 선택창을 Esc로 취소하고 Guard 출력을 보존합니다.
원복: 실행 중 연습 Task·새 User rule·두 연습 객체가 없고 기존 JSON과 Problems가 정상입니다.

자동화 검증 범위: 이 Run은 JSON 파싱, 원문 PowerShell 명령 실행, 조건식의 Boolean 모델 및 HTML/Cover 렌더를 검사합니다. 실제 VS Code Context 전환·chord dispatch·검색 강조는 사용자가 위 절차로 확인할 관찰 항목입니다. 모델 통과를 실제 UI 시험 통과로 표기하지 않습니다. UNCONFIRMED — 확장 프로그램·개별 User rule이 있는 독자 환경의 매칭 결과는 로컬 로그 확인 전 미확인입니다.

5. 문제가 생겼다면

Ctrl+F가 Editor Find 또는 셸로 전달됨

먼저 확인 현재 포커스와 실제 매칭 command를 확인합니다.

복구 Target Terminal 본문을 클릭하고 Terminal: Focus Find ID로 실행합니다. 사용자 변경이 의심되면 원문 로그를 보존하고 기본 설정을 추측해 바꾸지 않습니다.

재합류 Step 6

Find가 보이는데 terminalFindVisible=false

먼저 확인 활성 Terminal이 Target인지, 검사한 요소가 본문인지 확인합니다. Find 표시와 입력 포커스는 별도입니다.

복구 동일 Target에서 Hide Find→Focus Find를 한 번 비교하고 값·버전·확장 목록을 보존합니다. 재현되면 원인 UNKNOWN으로 중단합니다.

재합류 Step 6 또는 7

Find 열림 상태에서 Target이 종료됨

먼저 확인 when 마지막 항과 동일 chord의 다른 User rule, 로그의 실제 source/command를 확인합니다. 5분 자연 종료인지도 RUN_ID와 시간으로 구분합니다.

복구 추가 입력을 멈추고 원문 로그·오류 메시지·Context·마지막 heartbeat를 복사합니다. 확인된 충돌만 최소 수정하고 새 RUN_ID로 전체 비교를 반복합니다.

재합류 Step 3→4→5

Hide Find 후에도 종료 rule이 통과하지 않음

먼저 확인 taskRunning·terminalFocus·taskTerminalActive·terminalTextSelected를 하나씩 봅니다. 검사 UI 자체가 포커스를 옮겼을 수 있습니다.

복구 선택을 지우고 살아 있는 Target 본문으로 포커스합니다. 자연 종료했다면 Target을 다시 시작합니다. 오류 원문을 유지한 채 확인된 항목만 복구합니다.

재합류 Step 5 또는 8

Target 부재에서 선택창이 열림

먼저 확인 다른 Task만 실행 중인지, args label이 정확한지 봅니다.

복구 정상 fallback일 수 있으므로 Esc로 취소합니다. All Running Tasks나 Guard를 선택하지 말고 실제 Target을 새로 시작한 뒤 재검증합니다.

재합류 Step 5→9

JSON 오류 또는 단축키 원복 실패

먼저 확인 Problems의 실제 메시지와 줄·쉼표·배열 구조를 기록합니다.

복구 해당 추가 객체만 제거하고 백업과 대조합니다. 원인을 못 찾으면 UNKNOWN으로 두고 새 변경을 중단합니다. 복구 뒤 실행 목록과 완료 기준을 다시 확인합니다.

재합류 Step 12

원인 확인이 안 되면 UNKNOWN으로 기록하고 Evidence를 보존한 뒤 추가 변경을 중단합니다.

6. 핵심 정리와 공식 자료

terminalFindVisible은 활성 Terminal의 검색창 표시 여부입니다. !terminalFindVisible을 추가해 검색창이 열린 동안 종료 rule을 제외합니다. 검색창을 둔 채 본문에 포커스를 돌린 비교가 핵심이며, 닫은 뒤에도 다른 네 조건을 확인해야 합니다. args Target이 없으면 선택창을 취소하고, 실습 뒤 프로세스와 설정을 원복합니다.

이번 주제의 새 독자 목표는 검색 UI가 표시된 동안의 종료 잠금입니다. 앞선 44부의 마우스 출력 선택·복사 잠금과 달리 Find 표시/비표시 및 표시 유지+본문 포커스 비교를 완료 상태로 삼습니다. 단축키 등록·Task 실행은 이번 목표의 준비 절차입니다.

다음 편 예고: 커맨드 팔레트 46부에서는 Keyboard Shortcuts Troubleshooting 원문 로그로 받은 chord와 실제 선택된 command·source·when을 비교해 충돌 rule 하나를 찾아 최소 수정합니다. 또 다른 Context Key를 덧붙이는 글이 아니라 매칭 실패 원인을 증거로 진단하는 독자 목표입니다.

공식 자료

2026-09-13 Asia/Seoul 확인. 모두 Microsoft 공식 자료·저장소에 접근했습니다. 문서는 현재 내용, 구현은 1.137.0 commit 고정입니다. 내부 Context Key의 향후 버전 안정성은 보장되지 않습니다.

다음 편 예고 커맨드 팔레트 46부 — Task 종료 단축키의 실제 매칭 과정을 로그로 진단하기 — Developer: Toggle Keyboard Shortcuts Troubleshooting, received chord versus resolved command, source and when comparison, diagnose one conflicting User rule, preserve raw logs, minimal repair and rollback; exclude basic shortcut registration and another context gate
반응형
이 글이 유용했다면 링크를 공유해 보세요.