실행 중일 때만 Task 종료 단축키 켜기
User keybindings.json에 when: "taskRunning"을 추가해 실행 중인 Task가 있을 때만 종료 단축키 규칙이 활성화되도록 만들고, 비활성·활성·종료 후 상태를 직접 확인합니다.
이번 편의 핵심
Task가 없을 때 taskRunning = false, 테스트 Task가 실행 중일 때 true, 종료 뒤 다시 false가 되고 단축키 규칙도 같은 순서로 비활성→활성→비활성으로 바뀌면 완료입니다.
when이 없는 종료 단축키는 Task가 없어도 키 조합 후보가 됩니다. taskRunning을 붙이면 실수로 눌렀을 때 이 규칙이 선택되는 범위를 줄일 수 있습니다.
1. 시작하기 전에
난이도는 초급입니다. 다만 User 단축키 파일은 모든 작업공간에 적용되고, 종료 명령은 실행 중 프로세스의 저장되지 않은 상태를 잃게 할 수 있으므로 복사본과 전용 테스트 Task를 먼저 준비합니다.
준비할 것
- Windows 11의 VS Code Stable 1.136.2 — 확인: Help → About 또는 PowerShell에서
code --version - 신뢰할 수 있는 빈 테스트 폴더 — 확인: Restricted Mode 배너가 없고 Tasks: Run Task를 사용할 수 있어야 합니다.
- 기존 User
keybindings.json복사본 — 확인: 원본과 다른 안전한 위치에 파일이 열리는지 확인합니다. - 이전 편에서 만든 종료 단축키 — 없으면 아래 예시 한 항목만 테스트 파일에 추가합니다.
적용 환경 한국어 초보자 · Windows 11 · VS Code Stable 1.136.2 · PowerShell 7 또는 Windows PowerShell. 메뉴 번역은 설치 언어에 따라 달라질 수 있으므로 명령 팔레트의 영문 command title도 함께 표기합니다.
keybindings.json은 전역 범위입니다. 먼저 전체 파일을 백업하고, 실제 빌드·서버 대신 이 글의 30초 heartbeat Task만 실행하세요. 중단 조건: 같은 키가 중요한 명령과 충돌하거나, 종료하면 안 되는 실제 Task가 이미 실행 중이거나, Workspace Trust를 확인할 수 없으면 변경하지 않습니다. 되돌리기: 추가한 한 규칙을 제거하거나 백업 파일로 원복한 뒤 VS Code에서 단축키 목록을 다시 확인합니다.2. 알아둘 핵심 개념
when 절
when은 단축키 규칙이 현재 상태에서 후보가 될 수 있는지를 정하는 선택적 문자열 표현식입니다. 값이 false이면 이 단축키 규칙은 비활성화되지만, 연결된 명령 자체가 삭제되거나 Task가 자동 종료되는 것은 아닙니다. when은 VS Code Settings의 설정 Key가 아니라 User keybindings.json 항목의 문자열 속성입니다.
taskRunning Context Key
VS Code Stable 소스는 taskRunning을 기본값 false인 Boolean Context Key로 정의하고, Task 시스템 상태 이벤트가 올 때 현재 Task 시스템의 활성 여부로 값을 갱신합니다. 즉 어떤 Task든 하나 이상 실행 중인지를 뜻하며, args에 적은 특정 Target이 실행 중인지는 구분하지 않습니다.
args와 when의 역할 차이
args: "JCOS Context Gate Target"은 종료할 Task label을 지정하고, when: "taskRunning"은 키 규칙의 활성 시점을 제한합니다. 다른 Task만 실행 중이면 taskRunning은 true지만 Target 직접 일치가 없으므로 종료 대상 선택 목록이 열릴 수 있습니다. 이 조건은 “Target 전용 실행 상태”가 아니라 “Task 전체 실행 상태” 안전장치입니다.
taskRunning = false → 이 규칙 비활성. Task 1개 이상 → true → 이 규칙 활성. 마지막 Task 종료 → 다시 false.3. 순서대로 진행하기
각 단계의 정상 결과를 확인한 뒤 다음 단계로 이동합니다.
1. User 단축키 파일을 백업하고 엽니다
목적 전역 단축키를 바꾸기 전에 보호 복사본과 정확한 편집 위치를 확보합니다.
- Ctrl+Shift+P →
Preferences: Open Keyboard Shortcuts (JSON)을 실행하고, 열린 파일을keybindings-before-task-running.json이라는 별도 파일로 복사합니다.
입력 위치 VS Code User keybindings.json. 프로젝트의 .vscode 폴더가 아닙니다.
편집 대상: User keybindings.json
백업 예시: keybindings-before-task-running.json
정상 결과 원본 User 파일과 수정하지 않을 백업 파일을 각각 열 수 있습니다.
확인 두 파일의 현재 내용이 같고 백업 파일이 원본과 다른 경로에 있는지 확인합니다.
실패 신호 기본 단축키 JSON이 읽기 전용으로 열리거나 프로젝트 .vscode 아래 파일을 편집하고 있습니다.
2. 사용할 키 조합의 충돌을 먼저 확인합니다
목적 새 조건을 추가해도 같은 키의 다른 규칙이 대신 실행되는 혼동을 줄입니다.
- Ctrl+K, Ctrl+S로 Keyboard Shortcuts 편집기를 열고 검색창 오른쪽의 키 기록 버튼을 누른 뒤 Ctrl+K, Ctrl+Alt+T를 입력합니다.
입력 위치 Keyboard Shortcuts 편집기의 Record Keys 검색.
ctrl+k ctrl+alt+t
정상 결과 동일 키 규칙이 보이면 command와 when 조건을 읽고, 중요한 명령과 겹치지 않음을 확인합니다.
확인 충돌이 있으면 이 글의 key 값을 미사용 chord로 바꾸고 이후 예시에도 같은 값을 사용합니다.
실패 신호 키 기록이 다른 배열로 표시되거나 필수 명령이 같은 키를 사용합니다.
3. 종료 규칙에 when을 추가합니다
목적 실행 중인 Task가 있을 때만 Target 종료 규칙을 활성화합니다.
- User
keybindings.json배열에 아래 항목을 넣고 저장합니다. 기존 종료 규칙이 있다면when한 줄만 추가합니다.
입력 위치 User keybindings.json 배열 내부.
[
{
"key": "ctrl+k ctrl+alt+t",
"command": "workbench.action.tasks.terminate",
"args": "JCOS Context Gate Target",
"when": "taskRunning"
}
]
정상 결과 빨간 JSON 구문 오류가 없고 Keyboard Shortcuts 편집기에서 command, key, when이 한 규칙으로 보입니다.
확인 when의 자료형은 String, 값은 대소문자를 포함해 정확히 taskRunning, 적용 범위는 User인지 확인합니다.
실패 신호 Expected comma, End of file expected 같은 오류 또는 taskrunning 오타가 보입니다.
4. 전용 테스트 Task를 준비합니다
목적 실제 서버나 빌드 대신 종료해도 안전한 heartbeat 프로세스로 상태 전환을 확인합니다.
- 신뢰할 수 있는 빈 폴더의
.vscode/tasks.json에 아래 Task를 저장합니다. 폴더가 없으면 Explorer에서.vscode폴더와tasks.json을 새로 만듭니다.
입력 위치 테스트 Workspace의 .vscode/tasks.json. 명령 Shell은 powershell.exe, 실행 위치는 열린 테스트 Workspace root입니다.
{
"version": "2.0.0",
"tasks": [
{
"label": "JCOS Context Gate Target",
"type": "process",
"command": "powershell.exe",
"args": [
"-NoProfile",
"-Command",
"$id=[guid]::NewGuid().ToString('N').Substring(0,8); Write-Output ('CONTEXT_GATE RUN_ID='+$id); for($i=0;$i -lt 30;$i++){ Write-Output ('CONTEXT_GATE HEARTBEAT='+$i); Start-Sleep -Seconds 1 }"
],
"problemMatcher": [],
"presentation": { "reveal": "always", "panel": "dedicated", "clear": true }
}
]
}
정상 결과 JSON 오류가 없고 Tasks: Run Task 목록에 JCOS Context Gate Target이 보입니다.
확인 label이 단축키 args와 문자 단위로 같은지 확인합니다.
실패 신호 Task가 목록에 없거나 powershell.exe를 찾지 못합니다.
.vscode/tasks.json을 삭제하거나 원래 파일을 복원합니다. 재합류: VSC41-S04.5. Task가 없을 때 false를 확인합니다
목적 변경 전 기준 상태에서 단축키 규칙이 비활성인지 확인합니다.
- Tasks: Show Running Tasks에서 실행 항목이 없음을 확인한 뒤 Developer: Inspect Context Keys를 실행하고 편집기 영역을 클릭합니다. Developer Tools Console에 출력된 객체에서
taskRunning을 찾습니다.
입력 위치 Command Palette와 Developer Tools Console. 파일 변경은 없습니다.
taskRunning: false
정상 결과 실행 중 Task가 0개이고 검사 결과가 false입니다.
확인 Keyboard Shortcuts 편집기에서 이 규칙의 조건이 충족되지 않은 상태인지 함께 확인합니다.
실패 신호 true이거나 키가 목록에 보이지 않습니다.
6. 테스트 Task를 실행해 true를 확인합니다
목적 실제 Task 활성 이벤트 뒤 Context Key와 단축키 규칙이 켜지는지 확인합니다.
- Tasks: Run Task → JCOS Context Gate Target을 실행하고 Terminal의 RUN_ID와 heartbeat를 기록한 뒤, 다시 Developer: Inspect Context Keys로
taskRunning을 확인합니다.
입력 위치 Command Palette. 실제 프로세스는 테스트 Workspace root에서 powershell.exe로 실행됩니다.
CONTEXT_GATE RUN_ID=<8자리 임의값>
CONTEXT_GATE HEARTBEAT=0
taskRunning: true
정상 결과 heartbeat 숫자가 늘고taskRunning이true입니다.
확인 <8자리 임의값>은 매 실행마다 달라지는 자리표시자이며, 실제 출력값을 기록합니다.
실패 신호 Task가 즉시 끝나거나 heartbeat가 늘지 않거나 검사값이 계속 false입니다.
7. 단축키로 Target을 종료하고 다시 false를 확인합니다
목적 조건이 참일 때만 규칙이 실행되고 마지막 Task 종료 뒤 비활성 상태로 돌아가는지 검증합니다.
- heartbeat가 증가하는 동안 Ctrl+K, Ctrl+Alt+T를 누릅니다. 출력 증가가 멈춘 뒤 Running Tasks가 비었는지와
taskRunning: false를 확인합니다.
입력 위치 VS Code 창 어디서나. 단축키 규칙은 User 범위입니다.
종료 전: taskRunning = true, heartbeat 증가
종료 후: taskRunning = false, heartbeat 정지
정상 결과 같은 RUN_ID의 출력이 더 늘지 않고 Running Tasks가 0개이며 Context Key가 다시 false입니다.
확인 Task가 없는 상태에서 같은 키를 다시 눌렀을 때 이 규칙이 dispatch되지 않는지 Keyboard Shortcuts Troubleshooting 로그로 확인합니다.
실패 신호 종료 대상 선택 목록이 열리거나 다른 command가 실행되거나 heartbeat가 계속 증가합니다.
taskRunning은 여전히 true이고 Target 불일치 때문에 선택 목록이 열릴 수 있습니다. 되돌리기: 선택 목록에서는 Esc를 누르고 아무 Task도 종료하지 않습니다. 재합류: Target label과 Running Tasks를 확인한 뒤 VSC41-S07.8. 규칙을 롤백하고 원래 상태를 확인합니다
목적 테스트가 끝난 뒤 User 단축키와 Workspace 파일을 정확히 원상복구합니다.
- User
keybindings.json에서 이번에 추가한 항목을 제거하거나 기존 규칙에서when한 줄만 제거합니다. 테스트용.vscode/tasks.json도 더 쓰지 않으면 삭제하고 파일을 다시 엽니다.
입력 위치 User keybindings.json과 테스트 Workspace의 .vscode/tasks.json.
// 롤백 대상
"when": "taskRunning"
정상 결과 백업과 비교했을 때 기존 단축키가 보존되고 테스트 Task가 Running 목록에 없습니다.
확인 Keyboard Shortcuts 편집기에서 chord를 다시 검색하고, User 규칙 수와 command가 테스트 전 상태와 같은지 확인합니다.
실패 신호 다른 User 규칙까지 사라졌거나 JSON 오류가 남아 있습니다.
keybindings.json에 복원합니다. 재합류: VSC41-S01의 백업 대조.4. 완료 확인하기
입력 화면과 독립된 방법을 포함해 결과를 교차 확인합니다.
- JSON 파싱 — User 단축키 규칙에 String
when: "taskRunning", command와 String args가 함께 있고 구문 오류가 없습니다. - 비활성 기준 — Running Tasks 0개일 때 Inspect Context Keys에서
taskRunning = false입니다. - 활성 기준 — 테스트 Task heartbeat가 증가할 때
taskRunning = true입니다. - 종료 결과 — 단축키로 Target을 종료하면 같은 RUN_ID 출력이 멈추고 마지막 Task 종료 뒤 값이 다시
false입니다. - 독립 확인 — Keyboard Shortcuts Troubleshooting 로그에서 활성 상태에는 해당 command가 match되고, 비활성 상태에는 이 규칙이 match되지 않습니다.
- 보호 대상 — 기존 User 단축키는 백업과 같고 실제 업무 Task는 실행·종료되지 않았습니다.
완료 기준 한 규칙의 when이 비활성→활성→비활성 상태와 일치하고, 테스트 Target만 종료되며, 롤백 뒤 User 단축키와 테스트 Workspace가 원래 상태로 돌아옵니다.
5. 문제가 생겼다면
taskRunning을 찾지 못합니다
먼저 확인 Developer: Inspect Context Keys 실행 뒤 실제 편집기나 Terminal 요소를 클릭했고 Developer Tools Console의 최신 객체를 보고 있는지 확인합니다. 공식 목록은 모든 Context Key를 열거하지 않으며 내부 Key는 바뀔 수 있습니다.
복구 VS Code 버전과 Stable commit을 기록하고, Task를 한 번 실행한 뒤 다시 검사합니다. 여전히 없으면 원인을 UNKNOWN으로 남기고 단축키 변경을 중단합니다.
재합류 VSC41-S05
Task가 없는데 다른 명령이 실행됩니다
먼저 확인 Keyboard Shortcuts 편집기에서 같은 chord를 사용하는 모든 규칙과 각각의 when을 확인하고 Keyboard Shortcuts Troubleshooting 로그 원문을 보존합니다.
복구 충돌 없는 새 chord를 정해 key만 바꾸거나 문제 규칙을 제거합니다. 기존 규칙을 임의 삭제하지 않습니다.
재합류 VSC41-S02
다른 Task만 실행 중인데 종료 목록이 열립니다
먼저 확인 taskRunning은 특정 Target이 아니라 모든 Task의 전역 Boolean이라는 점과 Running Tasks의 label을 확인합니다.
복구 Esc로 목록을 닫습니다. Target 전용 조건으로 오해하지 말고, 종료 전 Running Tasks label을 확인하는 Human Gate를 유지합니다.
재합류 VSC41-S07
단축키를 눌러도 Target이 계속 실행됩니다
먼저 확인 Task label과 args의 공백·대소문자, when 값, Troubleshooting 로그의 matched command와 원래 오류 문구를 확인합니다.
복구 label을 정확히 맞춘 뒤 Tasks: Terminate Task로 수동 종료하고, 상태가 false로 돌아온 뒤 다시 테스트합니다.
재합류 VSC41-S06
JSON 오류가 사라지지 않습니다
먼저 확인 쉼표, 배열 대괄호, 객체 중괄호와 큰따옴표를 확인하고 오류 원문과 줄 번호를 보존합니다.
복구 백업 파일로 전체를 복원한 뒤 한 항목만 다시 추가합니다. 원인을 확인하지 못하면 UNKNOWN으로 중단합니다.
재합류 VSC41-S03
taskRunning은 실행 상태 전체를 제한하는 안전장치이지 Target 식별자가 아닙니다. 원인을 확인하지 못하면 오류·로그·백업을 보존하고 임의 변경 없이 중단합니다.6. 핵심 정리와 공식 자료
when은 Userkeybindings.json규칙의 String 속성이며 Settings Key가 아닙니다.taskRunning은 기본false인 Boolean Context Key이며 어떤 Task든 실행 중이면true가 됩니다.args는 Target label,when은 규칙의 활성 시점을 담당합니다.- 다른 Task만 실행 중이면 Target 불일치로 선택 목록이 열릴 수 있으므로 종료 직전 label 확인은 유지합니다.
- 완료는 false→true→false 상태 전환, Target 출력 정지, 독립 로그 확인과 정확한 롤백으로 판정합니다.
공식 자료
아래 자료는 2026-09-09 Asia/Seoul에 확인했습니다. Stable API와 로컬 설치는 Windows x64 User Stable 1.136.2, commit 88e44fa0e00b08f7758b4f6d05632e4fd5e4df6f로 일치했습니다. 공식 Context Key 목록은 비완전 목록이며 내부 Context Key는 향후 변경될 수 있어 실제 환경 검사를 Human Gate로 남겼습니다.
- VS Code Stable Update API · Microsoft
- Keyboard shortcuts for Visual Studio Code · Microsoft
- when clause contexts · Microsoft
- Integrate with External Tools via Tasks · Microsoft
- Stable tasks.ts — taskRunning definition · Microsoft
- Stable taskService.ts — state update · Microsoft
- Stable abstractTaskService.ts — terminate target and fallback · Microsoft
when: "taskRunning && terminalFocus"로 Terminal에 포커스가 있을 때만 종료 단축키를 켜고, Editor와 Terminal 사이의 활성 상태·충돌·롤백을 확인합니다.'개발 > Visual Studio Code' 카테고리의 다른 글
| 커맨드 팔레트 43부: VS Code Task Terminal에서만 종료 단축키 켜기 (0) | 2026.09.12 |
|---|---|
| 커맨드 팔레트 42부: VS Code Terminal 포커스일 때만 Task 종료 단축키 켜기 (0) | 2026.09.11 |
| 커맨드 팔레트 40부: VS Code 실행 중 특정 Task만 단축키로 종료하기 (1) | 2026.09.08 |
| 커맨드 팔레트 39부: VS Code 자주 재시작하는 Task를 단축키로 바로 지정하기 (0) | 2026.09.08 |
| 커맨드 팔레트 38부: VS Code 실행 중 Task 하나만 새 정의로 재시작하기 (0) | 2026.09.07 |