User-defined keyboard shortcut on highlighted text in vscode - visual-studio-code

I need to create a shortcut that does the following:
I want to highlight text (say TEXT is highlighted) in the editor in vscode, and on triggering a keyboard shortcut, I need to replace it with say [\something TEXT]. How can I do this?
I tried adding the following to keybindings.json, of course, this does not work:
{
"key": "ctrl+r",
"command": "type",
"args":{
"text":"{\\color{red}%TEXT%}"
},
"when": "editorTextFocus"
}

Just make it a keybinding that inserts a snippet. Then you can use variables like $TM_SELECTED_TEXT.
{
"key": "ctrl+r",
"command": "editor.action.insertSnippet",
"args": {
"snippet": "{\\color{red}${TM_SELECTED_TEXT}}"
},
"when": "editorTextFocus"
}
Select your text (Ctrl+D or double-click it) and then trigger the keybinding above.
You could use the command type but you need to use it twice in a macro: once before the keyword and once after, so it is easier to just use the insertSnippet version.

You can use extension Regex Text Generator
{
"key": "ctrl+r",
"when": "editorTextFocus",
"command": "regexTextGen.generateText",
"args": {
"generatorRegex" : "\\{\\color\\{red\\}{{0}}\\}",
}
}

Related

How can I use shortcut add markdown codeblock to selection text in vscode?

I am working on some documents in words and evernote, need convert the contents to markdown and save to obsidian.
What I usually do is manually add code block :
```python
import xxx
some_content = 'balabala'
more = ....
```
As you know ctrl + # is add comment to every line.
So I wonder if there is any way to
use cursor make selection of text
hit a shortcut to wrap that text with
```language
selected text
```
I have search in google but nothing useful found.
Does this key binding help
{
"key": "ctrl+i 1", // or any other combo
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "```python\n$TM_SELECTED_TEXT\n```\n$0"
}
}
You can add a language selection:
{
"key": "ctrl+i 1",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "```${1|python,javascript|}\n$TM_SELECTED_TEXT\n```\n$0"
}
}

VS Code Keybinding for Line Break

I would like to add a key binding for inserting a line break in the editor (textInputFocus). Normally the Return key does this (VS Code calls the key Enter). Which command in VS Code can I use?
There is lineBreakInsert but this does not behave exactly the same as Enter normally does - it inserts a line break but keeps the cursor in the same position.
Is this what you are looking for:
{
"key": "ctrl+o",
"command": "type",
"args": {
"text": "\n"
},
"when": "textInputFocus"
}
Currently this is my workaround, but it's not a perfect solution:
I installed multi-command and added this binding (in keybindings.json):
{
"key": "ctrl+o",
"command": "extension.multiCommand.execute",
"args": {
"sequence": [
"lineBreakInsert",
"cursorDown",
"cursorHome"
]
},
"when": "textInputFocus"
}

VS Code creating custom shortcuts for common methods with line break (e.g. dd($var) or console.log($var))

First, I have a shortcut on VSCode to Wrap a text with the thing I'm typing.
<div>
Hello World
</div>
If I select "World" and use the Emmet: Wrap with Abbreviation shortcut and type span I can make this:
<div>
Hello <span>World</span>
</div>
But here's the thing :
I know we can create custom wrapping that are not the same on each side of the word we selected (source: VS Code : create custom snippet/shortcut)
{
"key": "ctrl+i",
"command": "editor.action.insertSnippet",
"args": {
"snippet": "{something}$TM_SELECTED_TEXT{/some other thing}"
},
"when": "editorTextFocus && editorHasSelection"
}
What I would like is to select my variable, then use the shortcut, and it will print what I need UNDER the selected line, and whitout breaking the current line where I come from.
For this example, I'm selecting the var $user_id, press shortcut, and then boom it will add the second line.
$user_id = User::where('user_name', $user_name)->get()->first()->id;
dd($user_id);
Here's a start:
{
"key": "ctrl+alt+c",
"command": "editor.action.insertSnippet",
"args": {
"snippet": " ==> here we need to find how to line break without spliting the code and then: <==
{console.log(}$TM_SELECTED_TEXT{)}"
},
"when": "editorTextFocus && editorHasSelection"
}
Do you think it is possible ? Maybe the solution is to use Keyboard Macro separately from VSCode ?
I came up with this solution, thanks to #Mark in comments, related to this thread : How can I insert a snippet on a new line with vscode?
Install Multi-command VSCode extension
Open the settings file of the extension (settings.json)
Implement your code (here's mine with console.log() and dd() )
"multiCommand.commands": [
{
"command": "multiCommand.console.log",
"sequence": [
"editor.action.clipboardCopyAction",
"editor.action.insertLineAfter",
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "console.log(\"$CLIPBOARD: \", $$CLIPBOARD)\n$0"
}
},
]
},
{
"command": "multiCommand.dd",
"sequence": [
"editor.action.clipboardCopyAction",
"editor.action.insertLineAfter",
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "dd($$CLIPBOARD);"
}
},
]
}
Implement the shortcut in your VSCode settings (keybindings.json)
{
"key": "ctrl+1",
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.console.log" }
},
{
"key": "ctrl+2",
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.dd" }
}
If I'm understanding your question correctly, you can probably just use $0 to show where your cursor will end and use \n to insert a line break.
However, I'm not entirely sure if this works when creating a snippet from the Keyboard Shortcut file, but it works from the snippet file so I'm assuming it'll work here.

How do I disable inserting a new empty line when I press Enter when the cursor is in brackets?

Steps to reproduce:
simple code:
if () {}
cursor is between {}
i press Enter
result:
if () {
}
expected result:
if () {
}
I want a empty line not to be inserted.
It may be that it works by default(adds a empty line), and when Alt+Enter it doesn't add a empty line.
I did not find settings in vscode. I didn't find anything on google.
I tried this:
{
"key": "alt+enter",
"command": "type",
"args": {
"text": "\n"
},
"when": "editorTextFocus"
}
Because Alt+Enter does nothing by default.
However, the onEnterRules function used with the editor.autoIndent option detects the addition of the \n character and adds an extra empty line anyway. :(
I want to use editor.autoIndent. But I want to turn off (do not turn on) using the shortcut Alt+Enter.
Worst option: look for an extension that does exactly the same as editor.autoIndent, but has the ability to create a shortcut Alt+Enter to work the way I want.
You can use the extension multi-command and construct a command that does what you want.
Add this to your settings.json (global or workspace)
"multiCommand.commands": {
"multiCommand.lineBreakNoEmptyline": {
"sequence": [
"lineBreakInsert",
"deleteWordRight",
"cursorRight",
"cursorHome"
]
}
}
Add this to your keybindings.json:
{
"key": "alt+enter",
"command": "multiCommand.lineBreakNoEmptyline",
"when": "editorTextFocus"
}
Or using the keybinding only method
{
"key": "alt+enter",
"command": "extension.multiCommand.execute",
"args": {
"sequence": [
"lineBreakInsert",
"deleteWordRight",
"cursorRight",
"cursorHome"
]
},
"when": "editorTextFocus"
}
I'll show the info from my comment here so that it is clearer. This keybinding:
{
"key": "alt+enter", // whatever keybinding you want
"command": "extension.multiCommand.execute",
"args": {
"sequence": [
// "lineBreakInsert",
{
"command": "type",
"args": {
"text": "\n"
}
},
"editor.action.clipboardCutAction"
]
},
}
The type command acts differently than a lineBreakInsert command so it is a little easier to then delete that extra line as the cursor is already there. It is just a small improvement, 2 less commands.
Demo:

VSCode: Assigning key binding to snippet not working

I want to use a snippet to convert '.' to '_'. I want to bind this snippet to a shortcut key.
I included the following to keybindings.json file.
//keybindings.json
//Snippet-1
{
"key": "alt+u",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "${1/[.]/_/g}",
},
},
Pressing alt+u does not insert the snippet.
However the following works:
//keybindings.json
// Snippet-2
{
"key": "alt+u",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "${1/[.]/_/g}_more_text",
},
},
When there is some text in the snippet it works, but fails when there is no text in the snippet.
Any help would be appreciated.
EDIT 2020/09/03:
This snippet work in a global snippet file (as below). It fails only when I use it in a keybinding.
//Snippet-3
"snake_case": {
"prefix": "sn",
"body":"${1/[.]/_/g}"
},
Usually in a bracketed alternation group you do not need to escape literal dots, but apparently you do in snippets. Vscode's documentation, see transform examples. So i tried:
"snippet": "${1/[\\.]/_/g}"
and it works as you expect. But I still think there is a bug here as merely adding a space makes your version work!