VSCode change key binding for cancel signal in terminal - visual-studio-code

Not sure if it's called the "cancel signal" but I'm talking about ctrl+c when you want to stop something running. I actually want Terminal: Copy Selection to be ctrl+c, and this I can change in Keyboard Shortcuts. But then I have no way of changing the cancel signal to what I want, which is: ctrl+shift+c. That's because I can't seem to find that key binding.

Ctrl+C is only valid for shells, which for VSCOde only run in terminal panes. The other key bindings you speak of apply to the VSCode IDE in general, not to any shell running in a terminal pane that might exist.
When a terminal pane has focus you should find that Ctrl+C works as usual. I do not think that key binding is reassignable since it is built into the shell running in the terminal pane.
However, VSCode provides the ability to kill the active terminal, or to relaunch it. Maybe you would like to assign hotkeys to those actions?
BTW, you can set the behavior for terminal panes, so they copy to clipboard whenever text is selected. No keystroke required. You can enable that feature by editing settings.json and adding this line:
"terminal.integrated.copyOnSelection": true,

You can send a control sequence to the terminal, see send text to a terminal like this:
{
"key": "ctrl+shift+c",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\u0003\u000D" // Ctrl+C
},
// "when": "terminalFocus && !terminalTextSelected"
},
Use the when clause if you want it available only when the terminal has focus and with or without a selection.
\u003 is Ctrl+C see
/** End of Text (Caret = ^C) */
export const ETX = '\x03';
from escape sequences
and \u000D is a return from the same source.
And then your other code to set Ctrl+C to copy terminal text:
{
"key": "ctrl+c",
"command": "workbench.action.terminal.copySelection",
"when": "terminalFocus && terminalProcessSupported && terminalTextSelected && terminalTextSelected"
},
{
"key": "ctrl+shift+c",
"command": "-workbench.action.terminal.copySelection",
"when": "terminalFocus && terminalProcessSupported && terminalTextSelected && terminalTextSelected"
}
Demo already running a serve task :

Related

Add shell command into vscode command palette

I have pandoc installed on my device. I want to add the pandoc export command so I can create PDF file by compiling that command in one click in vscode command palette (No need to type that long command again and again). Is there a simple way to do it besides creating my own extension?
In the Command Pallete, search for Preferences: Open Keyboard Shortcuts (JSON) - there are some similar ones so chose this one specifically. Then, in the file that it will open - keybindings.json - , add the below keybinding. There will be an outer [] surrounding all of the keybindings together.
Then, using whatever keybinding you chose, here alt+b and focus is in the terminal, it should print out that command. You will need to hit Return/Enter to actually run the command.
{
"key": "alt+b", // whatever keybinding you wish
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "pandoc '${file}' --pdf-engine=xelatex -o example13.pdf"
},
"when": "terminalFocus && !terminalTextSelected"
}
Use whatever your pandoc command is. ${file} is the current file.
You don't really need the "whwn" clause if you want to trigger it whether the terminal has focus or not - so you could comment that out if you used a unique "key". Also, if you want it to run without having to hit the Enter after it is printed into your terminal just add a \u000D (which is a Return) to the end like this:
"text": "pandoc '${file}' --pdf-engine=xelatex -o example13.pdf\u000D"
Create a custom task in VS Code that executes your pandoc command.
Then use the command palette (Tasks: Run Task) to execute it or create a keyboard binding for the task.
A task that converts the file currently opened in the editor would look like this:
{
"label": "Pandoc: Convert current file",
"type": "shell",
"command": "pandoc '${file}' ...",
"problemMatcher": []
}
Adjust the "pandoc '${file}' ..." command as required.
You can also reference other variables predefined by VS Code.

vs-code: unable to reverse search on built-in terminal

When I do ^R on the terminal to reverse search, I get the following:
(^R) was pressed. Waiting for second key of chord...
How do I fix this? I'm on OS X.
Also see Run recent command as a replacement for reverse search from the v1.70 Release Notes:
When shell integration is enabled, we're aiming run recent command to
be a cross-shell drop in replacement for the shell's reverse search
(kbstyle(Ctrl+R)). There is a new contiguous search mode that is the
default when triggering the command. This behaves like kbstyle(Ctrl+R)
in most shells, with the option of switching back to fuzzy search:
The new inTerminalRunCommandPicker context key is available that
allows setting up a keybinding like kbStyle(Ctrl+R) to go to the next
match. For example, the following keybindings are now a fairly
complete replacement for your shell's reverse search, with
kbstyle(Ctrl+Alt+R) as a fallback to the old behavior:
{ "key": "ctrl+r", "command": "workbench.action.terminal.runRecentCommand", "when": "terminalFocus" },
{ "key": "ctrl+alt+r", "command": "workbench.action.terminal.sendSequence", "args": { "text": "\u0012"/*^R*/ }, "when": "terminalFocus" },
{ "key": "ctrl+r", "command": "workbench.action.quickOpenNavigateNextInViewPicker", "when": "inQuickOpen && inTerminalRunCommandPicker" },
{ "key": "ctrl+c", "command": "workbench.action.closeQuickOpen", "when": "inQuickOpen && inTerminalRunCommandPicker" },
Perhaps you actually want both! Terminal keybindings that are of the form
Ctrl+R Ctrl+something else
that is, keybindings that are chords AND still use
Ctrl+R (a non-chord keybinding) to trigger a reverse search in the terminal.
You can have both - add this keybinding to your keybindings.json:
{
"key": "ctrl+r",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u0012" },
"when": "terminalFocus"
},
That sends a "Ctrl+R" to the terminal and thus starts a reverse search. Even if you have other terminal keychords that starts with Ctrl+R, the terminal will not wait for the second part of a keybinding.
Note if you have a frequently used search you can add text to the command like:
"args": { "text": "\u0012node" },
where it will already have started the search for commands with node in them.
I realized that this started happening with me after I installed "Visual Studio Keymap" extension.
That is how I solved:
Ctrl + Shift + P for the command. There write: "Settings JSON" and select the option that says "Preferences: Open Settings (JSON)"
There, write the following setting:
"terminal.integrated.allowChords": false
Save and be happy
The setting that fixed it for me:
"terminal.integrated.sendKeybindingsToShell": true
When you make a clean vscode install, there will be a popup that explains what is going on with editor and terminal shortcuts. There you can configure your settings.
I used this when I had your same problem. It should work for OS X since it's just about key bindings.

How can I make cmd+c send ctrl+c in VS Code's terminal, in macOS?

I'd like for cmd+c to have the same effect as pressing ctrl+c in the VS Code terminal in macOS (so that it terminates the current process and drops me back into a new command prompt).
How can I do that?
You can add a keybinding for cmd+c that triggers the workbench.action.terminal.sendSequence command:
{
"key": "cmd+c",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u0003" },
"when": "terminalFocus"
}
When the above keybinding is added to your keybindings.json file (F1, "keybindings") cmd+c will send the character \u0003 which is ^C (ETX), but only when you have focused the terminal.
You can find more documentation on this command in the official documentation.

Create a new keybinding that will send a Ctrl-C to VSCode terminal

I'm trying to add a new command for "Control C" on the integrated terminal but for some reason It just work when the terminal is not focused.
Here's the configuration:
{
"key": "shift+backspace",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u0003" },
}
I've also tried to remove the default command for "shift+backspace"
{
"key": "shift+backspace",
"command": "-deleteLeft",
"when": "textInputFocus && !editorReadonly"
}
Any ideas why it doesn't work?
The issue is that the integrated terminal "consumes" many keystrokes (like ctrl-c) preventing them from being used for keybindings since they are never passed to VScode when the integrated terminal has focus.
Basically, bind the key(s) you want to the desired command, like (in keybindings.json or using the keyboard short cut editor)
...
{
"key": "ctrl-x o",
"command": "workbench.action.focusActiveEditorGroup",
"when": "terminalFocus"
},
...
Then add the COMMAND (workbench.action.focusActiveEditorGroup here) to the setting Commands To Skip Shell. In this example, ctrl-x would not be passed to the terminal after this. (What does ctrl-x do, anyway? ) Note that this can remove the ability to send signals to the integrated terminal.
See the setting Terminal › Integrated: Commands To Skip Shell and the documentation at https://code.visualstudio.com/docs/editor/integrated-terminal#_forcing-key-bindings-to-pass-through-the-terminal for more information.
Some keychords seem to be consumed by vscode and never get to the terminal. I haven't been able to figure out which ones. I couldn't get Shift-backspace to work either, but other keychords do such as the following:
{
"key": "ctrl+shift+c",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\u0003"
},
}
Perhaps you are ultimately trying to do something like terminate a process with a keybinding?

toggleSidebarVisibility when terminalFocus

My most used action is ctrl+b which toggles the sidebars visibility. However when I am focused in the terminal and I press Ctrl + b it types ^B instead of toggling the focus.
I tried add this to my keybindings:
{ "key": "ctrl+b", "command": "workbench.action.toggleSidebarVisibility", "when": "terminalFocus" }
Notice the terminalFocus however it still types the ^B, is it possible to make ctrl+b work when terminal is focused?
The issue is the terminal captures the key input before vscode has a chance to handle it. According the vscode user and workspace settings documentation there is an option to allow certain commands to skip the terminal. You are going to want to add your command to the list of commands to skip the shell:
"terminal.integrated.commandsToSkipShell": [
"workbench.action.toggleSidebarVisibility",
...
],