VS Code regex issue | Elixir snippets

Hi!

In this issue for my pull request in vscode-elixir-snippets, I could not find a solution to the problem.

My regex looks like this

${RELATIVE_FILEPATH/^([^\\/\\\\]+[\\/\\\\])|(\\.ex|\\.exs)$|([^._\\/\\\\]+)|_|([\\/\\\\])/${3:/capitalize}${4:+.}/g}

Works for defmod and ex_unit snippets, but not for supervisor, dynamic_supervisor and gen_server, and the regex is exactly the same!

As described in my question in stackoverflow., the output for lib/shop_web/live/product_live/index.ex should be ShopWeb.Live.ProductLive.Index

Here works perfectly:

 "dmod": {
    "prefix": ["dmod", "defmod"],
    "comments": [
      "Generates the namespace for a file.",
      "e.g. A file with the path `lib/foo/bar/baz/boing.ex` would resolve to Foo.Bar.Baz.Boing.",
    ],
    "body": [
      "defmodule ${RELATIVE_FILEPATH/^([^\\/\\\\]+[\\/\\\\])|(\\.ex|\\.exs)$|([^._\\/\\\\]+)|_|([\\/\\\\])/${3:/capitalize}${4:+.}/g} do",
      "\t$0",
      "end"
    ],
    "description": "def module",
    "scope": "source.elixir"
  },

But here not

 "Supervisor": {
    "prefix": "supervisor",
    "body": [
      "defmodule ${RELATIVE_FILEPATH/^([^\\/\\\\]+[\\/\\\\])|(\\.ex|\\.exs)$|([^._\\/\\\\]+)|_|([\\/\\\\])/${3:/capitalize}${4:+.}/g} do",
      "\tuse Supervisor",
      "",
      "\tdef start_link(${args}) do",
      "\t\tSupervisor.start_link(__MODULE__, [${args}], name: __MODULE__)",
      "\tend",
      "",
      "\tdef init([${args}]) do",
      "\t\tchildren = []",
      "",
      "\t\tSupervisor.init(children, strategy: :one_for_one)",
      "\tend",
      "end"
    ],
    "description": "Insert code for an OTP Supervisor",
    "scope": "source.elixir"
  },

The output for the supervisor snippet is

defmodule ${RELATIVE_FILEPATH/^([^/\]+[/\])|(\.ex|\.exs)$|([^._/\]+)|_|([/\])//capitalize,+./g} do
  use Supervisor

  def start_link(args) do
    Supervisor.start_link(__MODULE__, [args], name: __MODULE__)
  end

  def init([args]) do
    children = []

    Supervisor.init(children, strategy: :one_for_one)
  end
end

And the same issue is for dynamic_supervisor and gen_server snippets.

Can someone give me a help?

Found what I was missing.

e.g. Instead of ${args} the correct syntax is ${1:args}.

This solves the problem.

1 Like

@axelson any interest to implement this regex for vscode-elixir-ls as default for modules name?

This look like a handy snippet! Unfortunately it’s not likely to get included in vscode-elixir-ls because not everyone’s modules match that directory structure. Also that regex looks like it might take a lot of maintenance.

I believe that there are some Elixir-specific extensions that focus on providing snippets, maybe one of those would be a good fit for your snippet. Thanks for sharing it! :+1:

Ok. Thanks for the reply! :grin:

1 Like

It is easy to add code snippets to visual studio code both for your own use or to share with others on the public marketplace.

1 Like