zolrath / elixir-tools.nvim

Neovim plugin for Elixir

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

elixir-tools.nvim

Overview

Discord

elixir-tools.nvim provides a nice experience for writing Elixir applications with Neovim.

Note: This plugin does not provide autocompletion, I recommend using nvim-cmp.

Note: This plugin does not provide syntax highlighting, I recommend using nvim-treesitter.

Features

Install

Requires 0.8

lazy.nvim

{
  "elixir-tools/elixir-tools.nvim",
  event = { "BufReadPre", "BufNewFile" },
  config = function()
    local elixir = require("elixir")
    local elixirls = require("elixir.elixirls")

    elixir.setup {
      credo = {},
      elixirls = {
        enabled = true,
        settings = elixirls.settings {
          dialyzerEnabled = false,
          enableTestLenses = false,
        },
        on_attach = function(client, bufnr)
          vim.keymap.set("n", "<space>fp", ":ElixirFromPipe<cr>", { buffer = true, noremap = true })
          vim.keymap.set("n", "<space>tp", ":ElixirToPipe<cr>", { buffer = true, noremap = true })
          vim.keymap.set("v", "<space>em", ":ElixirExpandMacro<cr>", { buffer = true, noremap = true })
        end,
      }
    }
  end,
  dependencies = {
    "nvim-lua/plenary.nvim",
  },
}

packer.nvim

use({ "elixir-tools/elixir-tools.nvim", requires = { "nvim-lua/plenary.nvim" }})

Getting Started

Minimal Setup

The minimal setup will configure both ElixirLS and credo-language-server.

require("elixir").setup()

ElixirLS and credo-language-server can be disabled by setting the enabled flag in the respective options table.

require("elixir").setup({
  credo = {enable = false},
  elixirls = {enable = false},
})

Advanced Setup

While the plugin works with a minimal setup, it is much more useful if you add some personal configuration.

Note: For ElixirLS, not specifying the repo, branch, or tag options will default to the latest release.

local elixir = require("elixir")
local elixirls = require("elixir.elixirls")

elixir.setup {
  credo = {
    port = 9000, -- connect via TCP with the given port. mutually exclusive with `cmd`
    cmd = "path/to/credo-language-server", -- path to the executable. mutually exclusive with `port`
    on_attach = function(client, bufnr)
      -- custom keybinds
    end
  },
  elixirls = {
    -- specify a repository and branch
    repo = "mhanberg/elixir-ls", -- defaults to elixir-lsp/elixir-ls
    branch = "mh/all-workspace-symbols", -- defaults to nil, just checkouts out the default branch, mutually exclusive with the `tag` option
    tag = "v0.13.0", -- defaults to nil, mutually exclusive with the `branch` option

    -- alternatively, point to an existing elixir-ls installation (optional)
    -- not currently supported by elixirls, but can be a table if you wish to pass other args `{"path/to/elixirls", "--foo"}`
    cmd = "/usr/local/bin/elixir-ls.sh",

    -- default settings, use the `settings` function to override settings
    settings = elixirls.settings {
      dialyzerEnabled = true,
      fetchDeps = false,
      enableTestLenses = false,
      suggestSpecs = false,
    },
    on_attach = function(client, bufnr)
      vim.keymap.set("n", "<space>fp", ":ElixirFromPipe<cr>", { buffer = true, noremap = true })
      vim.keymap.set("n", "<space>tp", ":ElixirToPipe<cr>", { buffer = true, noremap = true })
      vim.keymap.set("v", "<space>em", ":ElixirExpandMacro<cr>", { buffer = true, noremap = true })
    end
  }
}

Features

ElixirLS

Automatic Installation

When a compatible installation of ELixirLS is not found, you will be prompted to install it. The plugin will download the source code to the .elixir_ls directory and compile it using the Elixir and OTP versions used by your current project.

Caveat: This assumes you are developing your project locally (outside of something like Docker) and they will be available.

Caveat: This currently downloads the language server into the .elixir_ls directory in your repository, but it does install it into ~/.cache and will re-use it when needed.

auto-install-elixirls

Root Path Detection

elixir-tools.nvim should be able to properly set the root directory for umbrella and non-umbrella apps. The nvim-lspconfig project's root detection doesn't properly account for umbrella projects.

Run Tests

ElixirLS provides a codelens to identify and run your tests. If you configure enableTestLenses = true in the settings table, you will see the codelens as virtual text in your editor and can run them with vim.lsp.codelens.run().

elixir-test-lens

Commands

:ElixirFromPipe

: Convert pipe operator to nested expressions.

:ElixirToPipe

: Convert nested expressions to the pipe operator.

manipulate_pipes

:[range]ElixirExpandMacro

: For the given [range], expand any macros and display it in a floating window.

expand_macro

:ElixirRestart

: Restart ElixirLS, you must then reconnect your buffer with :edit.

:ElixirOutputPanel

: Open the output panel that displays logs and compiler information from the server.

require("elixir").open_output_panel()
require("elixir").open_output_panel({ window = "split" })
require("elixir").open_output_panel({ window = "vsplit" })
require("elixir").open_output_panel({ window = "float" })

credo-language-server

Note: The credo-language-server integration utilizes Mix.install/2, so you must be running Elixir >= 1.12

  • Uses your project's Credo version.
  • Full project diagnostics
  • Code Actions

Mix

You can run any mix command in your project, complete with... autocomplete!

:Mix {args}

: Run any mix command.

elixir-nvim-mix-demo

Projectionist

vim-projectionist definitions are provided for:

  • Elixir files
  • Phoenix Views
  • Phoenix Controllers
  • Phoenix Channels
  • Wallaby/Hound Feature tests

About

Neovim plugin for Elixir

License:MIT License


Languages

Language:Lua 96.3%Language:Shell 1.4%Language:Scheme 1.1%Language:Elixir 1.0%Language:Vim Script 0.1%