Elixir/Phoenix VSCode snippets

3 years ago

Here's my current Elixir VSCode snippets elixir.json file.

You can add it to VSCode by Ctrl/Cmd+Shift+P and choosing Preferences : Configure User Snippets, then opening elixir.json. If you don't have one yet, you can create a new snippet file in the same place.

Supported snippets:

  • gs: GenServer
  • gscast: GenServer Cast Function
  • gscall: GenServer Call Function
  • lv: Phoenix LiveView
  • lvc: Phoenix LiveComponent
  • lvhe: Phoenix LiveView Handle Event Function
  • lvhi: Phoenix LiveView Handle Info Function

Hope that's useful, here's the file:

{
    "My GenServer": {
        "prefix": "gs",
        "body": [
            "defmodule ${4:package}.${1:name} do",
            "\tuse GenServer",
            "\trequire Logger",
            "",
            "\t@me __MODULE__",
            "",
            "\tdef start_link(${2:opts}) do",
            "\t\t{:ok, pid} = result = GenServer.start_link(@me, ${2:opts}, name: @me)",
            "\t\tLogger.debug(\"#{@me} GenServer started with# #{inspect(pid)}.\")",
            "\t\tresult",
            "\tend",
            "",
            "\tdef init(${3:initial_state}) do",
            "\t\t{:ok, ${3:initial_state}}",
            "\tend",
            "",
            "\t$0",
            "end"
        ],
        "description": "My GenServer"
    },
    "GenServer Cast": {
        "prefix": "gscast",
        "body": [
            "def ${1:function}() do",
            "\tGenServer.cast(@me, :${1:function})",
            "end",
            "",
            "${0}"
        ],
        "description": "GenServer cast function"
    },
    "GenServer Call": {
        "prefix": "gscall",
        "body": [
            "def ${1:function}() do",
            "\tGenServer.call(@me, :${1:function})",
            "end",
            "",
            "${0}"
        ],
        "description": "GenServer call function"
    },
    "LiveViewLiveComponent": {
        "prefix": "lvc",
        "body": [
            "defmodule ${1:module} do",
            "\t@moduledoc \"\"\"",
            "\t${2:module_doc}",
            "\t\"\"\"",
            "\tuse Phoenix.LiveComponent",
            "",
            "\t@impl true",
            "\tdef update(_assigns, socket) do",
            "\t\t{:ok, socket}",
            "\tend",
            "",
            "\t@impl true",
            "\tdef render(assigns) do",
            "\t\t~L\"\"\"",
            "\t\t${0}",
            "\t\t\"\"\"",
            "\tend",
            "end",
        ]
    },
    "LiveView": {
        "prefix": "lv",
        "body": [
            "defmodule ${1:module} do",
            "\t@moduledoc \"\"\"",
            "\t${2:module_doc}",
            "\t\"\"\"",
            "\tuse Phoenix.LiveView",
            "",
            "\t@impl true",
            "\tdef mount(_params, _session, socket) do",
            "\t\t{:ok, socket}",
            "\tend",
            "",
            "\t@impl true",
            "\tdef handle_params(_params, _url, socket) do",
            "\t\t{:noreply, socket}",
            "\tend",
            "",
            "\t@impl true",
            "\tdef render(assigns) do",
            "\t\t~L\"\"\"",
            "\t\t${0}",
            "\t\t\"\"\"",
            "\tend",
            "end",
        ]
    },
    "LiveViewHandleEvent": {
        "prefix": "lvhe",
        "body": [
            "@impl true",
            "def handle_event(\"${1:event}\", %{\"${2:var}\" => ${2:var}} = _event, socket) do",
            "\t${0}",
            "\t{:noreply, socket}",
            "end"
        ]
    },
    "LiveViewHandleInfo": {
        "prefix": "lvhi",
        "body": [
            "@impl true",
            "def handle_info(${1:event}, socket) do",
            "\t${0}",
            "\t{:noreply, socket}",
            "end"
        ]
    }
}

Happy Elixir'ing