Change:
This has bugged me for years but wasn't sure how we should handle it. I think we should do this: ctrl+shift+c: works as it does now, when there is a selection this will copy the selection and retain it ctrl+c: if this is bound to copy when there is a selection (Windows), it should copy the selection and clear it, such that the next ctrl+c will send an interrupt.
On Unix (MacOS and Linux), is used alongside to control the run sending intetrupt signal to the process for the first and suspend for the other. I ended up on this ticket because Ctrl-C was not working to stop the Python debugger with CTRL-C in vscode. Windows version of the debugger uses Ctrl-D for that, but don't be confused that is only for Windows. Clearly something wrong is happening with Ctrl-C on vscode terminal for sure. While looking at this bug may it be possible to address the Ctrl-C not being send to the terminal?
ctrl+c does send SIGINT, it works a little differently on Windows though; if there is a selection it will copy. The proposal here is to copy and clear the selection, such that the next ctrl+ sends SIGINT. You can verify that ctrl+c is sending SIGINT by running the toggle escape sequence logging command as that will show what gets sent to the process.
This is a minor feature that would be good to call out in the release notes.

Discussion:
// TODO: Why is copy still showing up when text isn't selected? precondition: ContextKeyExpr.and(ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalContextKeys.textSelected), keybinding: [{ <del> primary: KeyMod.CtrlCmd | KeyCode.KeyC, win: { primary: KeyMod.CtrlCmd | KeyCode.KeyC, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyC] }, linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyC }, </del> <ins> primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KeyC, mac: { primary: KeyMod.CtrlCmd | KeyCode.KeyC }, </ins> weight: KeybindingWeight.WorkbenchContrib, when: ContextKeyExpr.and(TerminalContextKeys.textSelected, TerminalContextKeys.focus) }]

registerAction2(class extends Action2 { constructor() { super({ <ins> id: TerminalCommandId.CopyAndClearSelection, title: { value: localize('workbench.action.terminal.copyAndClearSelection', "Copy and Clear Selection"), original: 'Copy and Clear Selection' }, f1: true, category, precondition: ContextKeyExpr.and(ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalContextKeys.textSelected), keybinding: [{ win: { primary: KeyMod.CtrlCmd | KeyCode.KeyC }, weight: KeybindingWeight.WorkbenchContrib, when: ContextKeyExpr.and(TerminalContextKeys.textSelected, TerminalContextKeys.focus) }] }); } async run(accessor: ServicesAccessor) { const instance = accessor.get(ITerminalService).activeInstance; await instance?.copySelection(); instance?.clearSelection(); } }); registerAction2(class extends Action2 { constructor() { super({ </ins> id: TerminalCommandId.CopySelectionAsHtml, title: { value: localize('workbench.action.terminal.copySelectionAsHtml', "Copy Selection as HTML"), original: 'Copy Selection as HTML' }, f1: true,

RunRecentCommand = 'workbench.action.terminal.runRecentCommand', CopyLastCommand = 'workbench.action.terminal.copyLastCommand', GoToRecentDirectory = 'workbench.action.terminal.goToRecentDirectory', <ins> CopyAndClearSelection = 'workbench.action.terminal.copyAndClearSelection', </ins> CopySelection = 'workbench.action.terminal.copySelection', CopySelectionAsHtml = 'workbench.action.terminal.copySelectionAsHtml', SelectAll = 'workbench.action.terminal.selectAll',

export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [ TerminalCommandId.ClearSelection, TerminalCommandId.Clear, <ins> TerminalCommandId.CopyAndClearSelection, </ins> TerminalCommandId.CopySelection, TerminalCommandId.CopySelectionAsHtml, TerminalCommandId.CopyLastCommand,