Task Terminal에서만 종료 단축키 켜기
일반 Terminal에서는 종료 단축키를 막고, Task가 만든 Terminal을 직접 선택했을 때만 연습 Target을 종료하도록 범위를 좁힙니다.
이번 편의 핵심
User keybindings.json의 when을 taskRunning && terminalFocus && taskTerminalActive로 바꾸고 일반 Terminal과 Task Terminal의 활성 상태를 비교합니다.
taskTerminalActive는 현재 활성 Terminal의 종류를 구분합니다. 다만 특정 Target의 존재까지 보장하지 않으므로 Target 부재 시 Quick Pick을 안전하게 취소하는 단계도 함께 확인합니다.
1. 시작하기 전에
난이도는 초급입니다. User 단축키와 실행 중 프로세스를 다루므로 백업, 충돌 확인, 종료 직전 Human Gate가 필요합니다.
준비할 것
- Windows 11의 VS Code Stable — Help > About에서 버전을 확인합니다. 2026-09-11 기준 최신 Windows x64 User Stable과 이 원고의 로컬 검증 환경은 모두 1.137.0입니다.
- PowerShell을 실행할 수 있는 신뢰 가능한 연습 폴더 — File > Open Folder로 열고 Restricted Mode가 아닌지 확인합니다.
- User
keybindings.json백업 — Preferences: Open Keyboard Shortcuts (JSON)으로 열어 전체를 별도 파일에 복사합니다. - 충돌하지 않는 예제 chord
ctrl+k ctrl+alt+t— Keyboard Shortcuts에서 검색하고 Show Same Keybindings를 확인합니다.
적용 환경 한국어 초보자 · Windows 11 · VS Code Stable 1.137.0 · PowerShell · User 범위 keybindings.json
2. 알아둘 핵심 개념
taskTerminalActive
현재 선택된 Terminal 인스턴스가 Task가 만든 Terminal이면 true인 Boolean Context Key입니다. 일반 Terminal과 Task Terminal을 구분하지만 “바로 이 Target Task가 실행 중”임을 뜻하지는 않습니다.
세 Context Key의 역할
taskRunning은 하나 이상의 Task 실행 여부, terminalFocus는 통합 Terminal의 키보드 포커스 여부, taskTerminalActive는 활성 Terminal의 Task 형식 여부를 나타냅니다.
&& gate
taskRunning && terminalFocus && taskTerminalActive는 세 상태를 모두 요구합니다. Editor와 일반 Terminal에서는 false이고 Task Terminal 본문에 포커스가 있을 때만 true가 됩니다.
Gate와 Target 선택은 별개입니다
when은 명령 실행 시점만 제한하고 args String이 종료 Target을 찾습니다. Guard Task Terminal에서도 세 조건이 true일 수 있으므로 Target이 없으면 Stable 구현이 실행 중 Task Quick Pick으로 fallback합니다.
3. 순서대로 진행하기
각 단계의 정상 결과를 확인한 뒤 다음 단계로 이동합니다. User 설정 저장과 실제 종료에는 Human Gate가 있습니다.
1. User 단축키를 백업하고 충돌 확인하기
목적 기존 개인 단축키를 보호하고 예제 chord의 현재 동작을 확인합니다.
- Ctrl+K Ctrl+S로 Keyboard Shortcuts를 열어
ctrl+k ctrl+alt+t를 검색하고 Show Same Keybindings를 확인합니다. 이어 Userkeybindings.json전체를 별도 백업 파일에 복사합니다.
입력 위치 Keyboard Shortcuts UI, User keybindings.json, 사용자가 선택한 로컬 폴더
C:\Users\<사용자이름>\Documents\keybindings.backup-20260911.json
<사용자이름>은 실제 Windows 계정 폴더명으로 바꿉니다.
정상 결과 같은 chord의 rule과 적용 조건을 확인했고 백업의 첫 줄과 마지막 줄이 보입니다.
확인 백업을 다시 열어 JSON 전체가 읽히는지 봅니다.
실패 신호 백업이 비어 있거나 중요 명령과 chord가 충돌합니다.
2. Target과 Guard 연습 Task 만들기
목적 실제 종료 Target과 Target 부재 확인용 Guard를 분리합니다.
- 연습 Workspace의
.vscode/tasks.json에 아래 두 객체를 저장합니다. 기존 파일이 있으면tasks배열에 객체만 병합합니다.
입력 위치 연습 Workspace의 .vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "JCOS Task Terminal Gate Target",
"type": "process",
"command": "powershell.exe",
"args": [
"-NoProfile",
"-Command",
"$id=[guid]::NewGuid().ToString('N').Substring(0,8); Write-Output ('TASK_TERMINAL_GATE RUN_ID='+$id); for($i=0;$i -lt 30;$i++){ Write-Output ('TASK_TERMINAL_GATE HEARTBEAT='+$i); Start-Sleep -Seconds 1 }"
],
"problemMatcher": [],
"presentation": { "reveal": "always", "panel": "dedicated", "clear": true }
},
{
"label": "JCOS Task Terminal Gate Guard",
"type": "process",
"command": "powershell.exe",
"args": [
"-NoProfile",
"-Command",
"$id=[guid]::NewGuid().ToString('N').Substring(0,8); Write-Output ('TASK_TERMINAL_GUARD RUN_ID='+$id); for($i=0;$i -lt 30;$i++){ Write-Output ('TASK_TERMINAL_GUARD HEARTBEAT='+$i); Start-Sleep -Seconds 1 }"
],
"problemMatcher": [],
"presentation": { "reveal": "always", "panel": "dedicated", "clear": true }
}
]
}
정상 결과 Tasks: Run Task 목록에 Target과 Guard 두 label이 보입니다.
확인 type은 process, args는 String Array, problemMatcher는 빈 Array인지 확인합니다.
실패 신호 “Expected comma”, “End of file expected” 또는 Task가 목록에 없습니다.
tasks 배열을 덮어쓰지 않습니다. 되돌리기: 예제 객체만 제거하고 오류 원문을 보존한 뒤 하나씩 다시 병합합니다.3. Target Task 실행하기
목적 Task Terminal과 관찰 가능한 RUN_ID·HEARTBEAT를 만듭니다.
- Ctrl+Shift+P → Tasks: Run Task → JCOS Task Terminal Gate Target을 선택합니다.
입력 위치 Command Palette와 자동으로 열린 전용 Terminal
TASK_TERMINAL_GATE RUN_ID=<8자리 값>
TASK_TERMINAL_GATE HEARTBEAT=0
TASK_TERMINAL_GATE HEARTBEAT=1
정상 결과 RUN_ID 뒤 HEARTBEAT가 1초마다 증가하고 Terminal 탭이 Target label로 식별됩니다.
확인 RUN_ID를 메모하고 2초 뒤 HEARTBEAT 증가를 확인합니다.
실패 신호 즉시 종료, PowerShell 경로·정책 오류, 다른 label.
4. 일반 Terminal과 Task Terminal 비교하기
목적 taskTerminalActive가 Terminal 종류를 구분하는지 눈으로 확인합니다.
- Terminal: Create New Terminal로 일반 PowerShell Terminal을 만들고 본문을 클릭합니다. Developer: Inspect Context Keys로 세 값을 기록한 뒤 Target Task Terminal 본문을 클릭해 다시 기록합니다.
입력 위치 Command Palette, Integrated Terminal, Developer Tools Console
일반 Terminal: taskRunning=true, terminalFocus=true, taskTerminalActive=false
Target Task Terminal: taskRunning=true, terminalFocus=true, taskTerminalActive=true
정상 결과 앞의 두 값은 유지되고 taskTerminalActive만 false에서 true로 바뀝니다.
확인 각 Terminal 본문을 직접 클릭한 뒤 결과를 별도로 캡처합니다.
실패 신호 탭을 전환하지 않았거나 다른 UI 요소의 Context Key를 검사했습니다.
5. 종료 rule에 세 조건 넣기
목적 Target 종료 명령을 Task Terminal 포커스에서만 활성화합니다.
- Preferences: Open Keyboard Shortcuts (JSON)에서 아래 객체를 User 배열에 추가합니다. 이전 편의 같은 객체가 있다면
when만 교체합니다.
입력 위치 User keybindings.json; Workspace settings.json이 아닙니다.
[
{
"key": "ctrl+k ctrl+alt+t",
"command": "workbench.action.tasks.terminate",
"args": "JCOS Task Terminal Gate Target",
"when": "taskRunning && terminalFocus && taskTerminalActive"
}
]
정상 결과 Keyboard Shortcuts 검색 결과에 명령, chord, 세 조건이 한 User rule로 표시됩니다.
확인 네 필드가 모두 String이고 && 앞뒤에 공백이 있는지 봅니다.
실패 신호 빨간 밑줄, 쉼표 오류, 중복 rule, taskTerminalActive 오탈자.
6. 일반 Terminal에서 종료가 막히는지 확인하기
목적 Task가 실행 중이어도 일반 Terminal에서는 rule이 dispatch되지 않음을 확인합니다.
- 일반 PowerShell Terminal 본문을 클릭하고 Developer: Toggle Keyboard Shortcuts Troubleshooting을 켠 뒤 chord를 누릅니다.
입력 위치 일반 Terminal과 Keyboard Shortcuts Troubleshooting Output
taskRunning=true
terminalFocus=true
taskTerminalActive=false
기대: 종료 rule 불일치, Target HEARTBEAT 계속 증가
정상 결과 종료 rule이 match되지 않고 Target의 동일 RUN_ID 출력이 계속 증가합니다.
확인 Troubleshooting 로그와 Target Terminal의 후속 HEARTBEAT를 교차 확인합니다.
실패 신호 Target 종료 또는 다른 명령 실행.
7. Target Task Terminal에서 종료하기
목적 세 조건이 모두 true일 때 Target만 종료되는지 확인합니다.
- Target Task Terminal 본문을 클릭하고 label과 RUN_ID를 다시 확인한 뒤 chord를 한 번 누릅니다.
입력 위치 Target Task Terminal
taskRunning=true
terminalFocus=true
taskTerminalActive=true
Human Gate: label과 RUN_ID 확인 후 한 번만 입력
정상 결과 Target만 종료되고 동일 RUN_ID의 HEARTBEAT가 더 이상 증가하지 않습니다.
확인 2초 뒤 출력 길이가 그대로이며 Tasks: Show Running Tasks에 Target이 없습니다.
실패 신호 Quick Pick, 다른 Task 종료, 새 RUN_ID.
args를 맞춘 뒤 Step 3부터 다시 수행합니다.8. Target 부재와 Guard Task Terminal 확인하기
목적 taskTerminalActive가 Target 존재를 보장하지 않는 한계를 안전하게 확인합니다.
- Target이 없는 상태에서 Guard Task를 실행하고 Guard Terminal 본문을 클릭합니다. 세 Context Key가 true인지 확인한 뒤 chord를 누르고 나타난 Quick Pick을 Esc로 닫습니다.
입력 위치 Guard Task Terminal과 Select a task to terminate Quick Pick
Target: 없음
Guard: 실행 중, Task Terminal 포커스
기대: 세 조건 true → Target 직접 매칭 실패 → Quick Pick → Esc
정상 결과 Quick Pick이 열리지만 취소 후 Guard의 같은 RUN_ID와 HEARTBEAT가 계속됩니다.
확인 Show Running Tasks에는 Guard만 있고 2초 뒤 Guard HEARTBEAT가 증가합니다.
실패 신호 Guard 종료 또는 All Running Tasks 선택.
9. 실습 설정 원복하기
목적 User 설정과 Workspace를 실습 전 상태로 되돌립니다.
- Guard를 Tasks: Terminate Task로 종료하고 User
keybindings.json의 예제 객체와tasks.json의 두 예제 객체를 제거합니다.
입력 위치 Command Palette, User keybindings.json, Workspace .vscode/tasks.json
확인할 잔여물:
ctrl+k ctrl+alt+t User rule = 없음
JCOS Task Terminal Gate Target = 없음
JCOS Task Terminal Gate Guard = 없음
정상 결과 실행 중 연습 Task와 예제 User rule이 없고 두 label이 Run Task 목록에서 사라집니다.
확인 Show Running Tasks, Keyboard Shortcuts @source:user, Problems를 교차 확인합니다.
실패 신호 heartbeat 지속, JSON 오류, User rule 또는 label 잔존.
4. 완료 확인하기
입력 화면과 독립된 Context Key, 출력, Running Tasks 목록을 함께 확인합니다.
- 일반 Terminal —
true / true / false이며 chord가 Target을 종료하지 않습니다. - Target Task Terminal — 세 값이 모두 true이며 chord가 Target만 종료합니다.
- Target 부재 + Guard Terminal — 세 값은 true일 수 있으나 Quick Pick을 Esc로 취소해 Guard를 보존합니다.
- 종료 후 — 동일 RUN_ID의 출력이 멈추고 Running Tasks에 Target이 없습니다.
- 원복 후 — 예제 User rule과 두 Task 객체가 없고 JSON 오류가 없습니다.
완료 기준 일반 Terminal과 Task Terminal의 gate 차이를 실제 Context Key와 출력으로 확인하고, Target 부재 fallback을 안전하게 취소하며, User 단축키와 Workspace Task를 원복했습니다.
5. 문제가 생겼다면
일반 Terminal에서도 taskTerminalActive=true
먼저 확인 실제 활성 탭 이름과 아이콘, Inspect Context Keys에서 클릭한 요소를 확인합니다.
복구 Terminal 본문을 다시 클릭해 검사합니다. 계속 재현되면 버전·확장 프로그램·Context 객체를 보존하고 원인 UNKNOWN으로 중단합니다.
재합류 Step 4
Task Terminal인데 rule이 match되지 않음
먼저 확인 세 Context Key, JSON 오탈자, Keyboard Shortcuts Troubleshooting 충돌 로그를 확인합니다.
복구 미사용 chord로 바꾸거나 rule을 백업 상태로 되돌린 뒤 객체 하나만 다시 추가합니다.
재합류 Step 5
Target이 없는데 Quick Pick이 열림
먼저 확인 args Target과 Running Tasks 목록을 비교합니다.
복구 정상 fallback일 수 있으므로 Esc로 닫고 아무 Task도 종료하지 않습니다.
재합류 Target을 다시 실행한 뒤 Step 7
다른 Task가 종료됨
먼저 확인 마지막 선택, label, RUN_ID, Troubleshooting 로그를 보존합니다.
복구 중요한 Task를 임의 재실행하지 말고 User rule을 제거한 뒤 백업을 복원합니다.
재합류 담당 복구 절차 완료 후 Step 1
6. 핵심 정리와 공식 자료
taskTerminalActive는 일반 Terminal과 Task가 만든 활성 Terminal을 구분합니다.- 세 조건의 AND gate는 Editor와 일반 Terminal에서 종료 rule을 막습니다.
- Gate는 Target 전용이 아니므로 Target 부재 Quick Pick은 Esc로 취소합니다.
- 실제 종료 전 label과 RUN_ID를 확인하고 실습 후 User/Workspace 설정을 원복합니다.
공식 자료
아래 자료는 2026-09-11 Asia/Seoul에 확인했습니다. 공식 Context Key 목록은 비완전 목록이며 일부 내부 Key는 향후 변경될 수 있어 Stable commit 고정 소스로 구현을 보완했습니다.
- VS Code Stable Update API · Microsoft
- Visual Studio Code 1.137 Release Notes · Microsoft
- Keyboard shortcuts for Visual Studio Code · Microsoft
- when clause contexts · Microsoft
- Integrate with External Tools via Tasks · Microsoft
- Stable 1.137 tasks.ts · Microsoft
- Stable 1.137 terminalTaskSystem.ts · Microsoft
- Stable 1.137 abstractTaskService.ts · Microsoft
!terminalTextSelected 조건을 추가해 복사와 종료 동작의 충돌을 줄입니다.'개발 > Visual Studio Code' 카테고리의 다른 글
| 커맨드 팔레트 45부: VS Code Terminal Find가 열려 있을 때 Task 종료 단축키 잠그기 (0) | 2026.09.13 |
|---|---|
| 커맨드 팔레트 44부: VS Code Terminal 텍스트 선택 중 Task 종료 단축키 잠그기 (0) | 2026.09.13 |
| 커맨드 팔레트 42부: VS Code Terminal 포커스일 때만 Task 종료 단축키 켜기 (0) | 2026.09.11 |
| 커맨드 팔레트 41부: VS Code Task 실행 중일 때만 종료 단축키 켜기추천 태그: (0) | 2026.09.10 |
| 커맨드 팔레트 40부: VS Code 실행 중 특정 Task만 단축키로 종료하기 (1) | 2026.09.08 |