32

I want to create an snippet when triggered it will surround the given text. Currently my snippet is:

{ 
  "Function Creator Helper": {
    "prefix": "_w",
    "body": [
      "public function $TM_SELECTED_TEXT () {",
      "  $1",
      "}",
    ],
    "description": "Creates a function given the text selection"
  }
}

This results on:

Wrapping snippet

What I do is:

  1. Select the text.
  2. Write the prefix (_w)
  3. Press Tab

This results on:

public function  () {

}

But I was expecting

public function person () {

}

Any ideas on how can I make this snippet or how can I triggered it correctly?

1
  • If I follow yous instructions and the correct answer, and select (highlight) the text to wrap and then type my prefix (rf) it will replace the text, not wrap it. Commented Oct 8, 2018 at 12:02

7 Answers 7

26

See https://stackoverflow.com/a/48676522/836330 Your example will work, as of vscode v1.49, as you have it. Vscode snippets have been updated to "remember" your selected text even though you seemingly overwrite it with your snippet prefix.

selected text wrap


Older answer:

You can use $TM_SELECTED_TEXT if you trigger it with a hotkey:

{
  "key": "cmd+k 1",
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
    //  "langId": "csharp",
    "name": "Function Creator Helper"
  }
}
Sign up to request clarification or add additional context in comments.

1 Comment

As a side note : when using this method ${TM_SELECTED_TEXT} works too.
16

The currently selected text is exposed as ${TM_SELECTED_TEXT}, not $TM_SELECTED_TEXT.

edit: As commented below, this is not the case for this particular use-case

2 Comments

This is not true, both versions work, see code.visualstudio.com/docs/editor/…. If you are doing transforms on those variables then you need to use the ${} form obviously but otherwise either is fine.
${TM_SELECTED_TEXT} worked for me in version 1.32.3, but ${selectedText} didn't
4

I was just struggling with this myself. In order to get this to work, the only thing you have to do is press F1, run the Insert Snippet command and then select your snippet from the list.

5 Comments

Didn't work, I open the command dialog but I didn't found the command ("_w" or by its name "Function Creator Helper")
Where did you add the snippet? Could it be it's under a different language than the source file you are trying to use it?
This works for me. Why doesn't it work when pressing CTRL + space though?
This is correct answer but unfortunate, this snippet is not that useful though. Textmate said, its most useful !!!
Code 1.41.1 here, Doesn't work. Plus this solution is not very interesting for snippet you want to type fast.
2

${TM_SELECTED_TEXT} does not work for me either.

${selectedText} has been added as a Snippet Editor Variable: https://github.com/Microsoft/vscode/pull/39483#issuecomment-383552677

Example:

"JS Block Quote": {
    "prefix": "c2",
    "body": [
        "/* ${selectedText} */",
    ],
    "description": "JS Block Quote"
}

At this time it is not correctly documented: https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables

NOTE: In a multi-line selection, ${selectedText} is truncated to the first line. An alternative is to use the the clipboard and the ${CLIPBOARD} variable. An extra step :(

1 Comment

code.visualstudio.com/docs/editor/variables-reference : ${selectedText} is a task or launch variable only. It does not work in snippets which have their own variables. It wouldn't make sense to have ${selectedText} and ${TM_SELECTED_TEXT} as both variables for snippets.
2

from Mitches example:

"JS Block Quote": {
    "prefix": "c2",
    "body": [
        "/* $TM_SELECTED_TEXT */",
    ],
    "description": "JS Block Quote" }

from the article: https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables the docs must have been ahead of the release.

This works fine in vscode v1.30.2

Comments

1

If somebody wants to know, it works like that for me :

I created two same snippet which only matches when I'm in html or php file (just create two snippets files in your snippets folder "php.json" and "html.json" it works for any languages) and added this code inside :

   "unicommentary": {
        "prefix": "unicommentary",
        "body": "<?php /* ${TM_SELECTED_TEXT} */ ?> ${0}",
        "description": "Creates a universal comment to disable both html and php."
    }

The ${TM_SELECTED_TEXT} tag works when you select some text and trigger your snippet by the Insert Snippet command, you can't just write on selected text.

When you want to use this, select the text you want in your snippet, press Ctrl + Shift + P and select Insert snippet then, type the name of your snippet, press enter and there you go !

Comments

0

Press F1. choose the emmet option. And then use the emmet short cut. For example, to insert your selected text into a span with class decimal, you type span.decimal. That'll do the trick

1 Comment

This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.