Search code examples
visual-studio-codevscode-snippets

Is there a way to add a blank option with VS Code snippets placeholder choices?


I am trying to create a snippet that gives me choices for optional attributes. I have used this approach in the past where I just put a blank space as a choice in the placeholder. That works when there is only one option between other parts of the snippet but like in the following example if I wanted to skip both placeholders (optional attributes on the adorn) there would be multiple spaces in the generated code which I would have to delete manually.

"Adorn": 
  "prefix": ["adorn"],
  "body": [
    "<%= adorn${1| , color: :blue, color: :white|}${2| , inline: true|} do |a| %>",
      "\t$0",
        "\t<%= a.adornment %>",
          "\t\t",
        "\t<% end %>",
    "<% end %>"
  ],
  "description": "An adorn"
},

From what I can see in the documentation it doesn't seem possible to do what I want using placeholders and choices. I thought I could use a variable and just have it resolve to empty string but the grammar doesn't seem to allow for that.

Is there any other way to accomplish what I am trying to do?


Solution

  • You can use some unicode characters in snippets, so I tried backspace (did not work) but \u200B which is a "zero-width space" does. So you can do this in your choices:

    {1|\u200B, color: :blue, color: :white|}${2|\u200B, inline: true|}

    and if you choose the blanks (i.e., the \u200B's) a zero-width space will be inserted. And you get what you want - no spaces to be deleted.

    But I leave it to you to see if there are any parsing or other problems with having that character in your code. Maybe it is or isn't a problem in your language. See the open issue (which I found after posting this answer initially) https://github.com/microsoft/vscode/issues/34368 ("Allow "empty" as a choice in snippets ") where the zero-width space option is warned against and may cause problems - so test it. It doesn't look like there is any other option but a regular space which you have tried.

    I tried "null" \u0000 and it wasn't recognized by vscode.