GithubHelp home page GithubHelp logo

xntebli / null-ls.nvim Goto Github PK

View Code? Open in Web Editor NEW

This project forked from jose-elias-alvarez/null-ls.nvim

0.0 0.0 0.0 1.41 MB

Use Neovim as a language server to inject LSP diagnostics, code actions, and more via Lua.

License: The Unlicense

Makefile 0.08% Lua 99.86% JavaScript 0.03% Shell 0.01% Vim Script 0.03%

null-ls.nvim's Introduction

null-ls.nvim

Use Neovim as a language server to inject LSP diagnostics, code actions, and more via Lua.

Motivation

Neovim's LSP ecosystem is growing, and plugins like telescope.nvim and trouble.nvim make it a joy to work with LSP features like code actions and diagnostics.

Unlike the VS Code and coc.nvim ecosystems, Neovim doesn't provide a way for non-LSP sources to hook into its LSP client. null-ls is an attempt to bridge that gap and simplify the process of creating, sharing, and setting up LSP sources using pure Lua.

null-ls is also an attempt to reduce the boilerplate required to set up general-purpose language servers and improve performance by removing the need for external processes.

Status

null-ls is in beta status. Please see below for steps to follow if something doesn't work the way you expect (or doesn't work at all).

At the moment, null-is is compatible with Neovim 0.5.1 (stable) and 0.6 (head), but some features and performance improvements are exclusive to the latest version.

Note that null-ls development takes place primarily on macOS and Linux and may not work as expected (or at all) on Windows. Contributions to expand Windows support are welcome, but since I don't work on Windows, my ability to diagnose or fix Windows issues is nonexistent.

Features

null-ls sources are able to hook into the following LSP features:

  • Code actions

  • Diagnostics

  • Formatting (including range formatting)

  • Hover

  • Completion

null-ls includes built-in sources for each of these features to provide out-of-the-box functionality. See BUILTINS for instructions on how to set up sources and a list of available sources.

null-ls also provides helpers to streamline the process of spawning and transforming the output of command-line processes into an LSP-friendly format. If you want to create your own source, either for personal use or for a plugin, see HELPERS for details.

Setup

Install null-ls using your favorite package manager. The plugin depends on plenary.nvim and nvim-lspconfig, both of which you are (probably) already using.

Please see CONFIG for information about setting up and configuring null-ls.

To get started, you must register at least one source and set up the plugin's integration with nvim-lspconfig, as in this example:

-- example configuration! (see CONFIG above to make your own)
require("null-ls").config({
    sources = {
        require("null-ls").builtins.formatting.stylua,
        require("null-ls").builtins.completion.spell,
    },
})
require("lspconfig")["null-ls"].setup({
    on_attach = my_custom_on_attach,
})

Documentation

The definitive source for information about null-ls is its documentation, which contains information about how null-ls works, how to set it up, and how to create sources.

Contributing

Contributions to add new features and built-ins for any language are always welcome. See CONTRIBUTING for guidelines.

Examples

Parsing buffer content

The following example demonstrates a diagnostic source that will parse the current buffer's content and show instances of the word really as LSP warnings.

local null_ls = require("null-ls")
local api = vim.api

local no_really = {
    method = null_ls.methods.DIAGNOSTICS,
    filetypes = { "markdown", "txt" },
    generator = {
        fn = function(params)
            local diagnostics = {}
            -- sources have access to a params object
            -- containing info about the current file and editor state
            for i, line in ipairs(params.content) do
                local col, end_col = line:find("really")
                if col and end_col then
                    -- null-ls fills in undefined positions
                    -- and converts source diagnostics into the required format
                    table.insert(diagnostics, {
                        row = i,
                        col = col,
                        end_col = end_col,
                        source = "no-really",
                        message = "Don't use 'really!'",
                        severity = 2,
                    })
                end
            end
            return diagnostics
        end,
    },
}

null_ls.register(no_really)

Parsing CLI program output

null-ls includes helpers to simplify the process of spawning and capturing the output of CLI programs. This example shows how to pass the content of the current buffer to markdownlint via stdin and convert its output (which it sends to stderr) into LSP diagnostics:

local null_ls = require("null-ls")
local helpers = require("null-ls.helpers")

local markdownlint = {
    method = null_ls.methods.DIAGNOSTICS,
    filetypes = { "markdown" },
    -- null_ls.generator creates an async source
    -- that spawns the command with the given arguments and options
    generator = null_ls.generator({
        command = "markdownlint",
        args = { "--stdin" },
        to_stdin = true,
        from_stderr = true,
        -- choose an output format (raw, json, or line)
        format = "line",
        check_exit_code = function(code)
            return code <= 1
        end,
        -- use helpers to parse the output from string matchers,
        -- or parse it manually with a function
        on_output = helpers.diagnostics.from_patterns({
            {
                pattern = [[:(%d+):(%d+) [%w-/]+ (.*)]],
                groups = { "row", "col", "message" },
            },
            {
                pattern = [[:(%d+) [%w-/]+ (.*)]],
                groups = { "row", "message" },
            },
        }),
    }),
}

null_ls.register(markdownlint)

FAQ

Something isn't working! What do I do?

  1. Make sure your configuration is in line with the latest version of this document.
  2. Enable debug mode (see below) and check the output of your source(s). If the CLI program is not properly configured or is otherwise not running as expected, that's an issue with the program, not null-ls.
  3. Check the documentation for available configuration options that might solve your issue.
  4. If you're having trouble configuring null-ls or want to know how to achieve a specific result, open a discussion.
  5. If you believe the issue is with null-ls itself or you want to request a new feature, open an issue and provide all the requested information.

Please do not link to or post your entire Neovim configuration. null-ls is in beta status, and if you cannot make the effort to isolate your issue, then I recommend using another solution.

How do I format files?

null-ls formatters run when you call vim.lsp.buf.formatting() or vim.lsp.buf.formatting_sync(). If a source supports it, you can run range formatting by visually selecting part of the buffer and calling vim.lsp.buf.range_formatting().

How do I stop Neovim from asking me which server I want to use for formatting?

See this wiki page.

How do I format files on save?

See the following snippet:

-- add to a specific server's on_attach,
-- or to a common on_attach callback to enable for all supported filetypes
on_attach = function(client)
    if client.resolved_capabilities.document_formatting then
        vim.cmd("autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_sync()")
    end
end

How do I enable debug mode and get debug output?

  1. Set debug flag to true in the config like so:

    require("null-ls").config({
        debug = true
    })
  2. Use :NullLsInfo to get the path to your debug log, which you can open direclty in Neovim or with another program.

As with LSP logging, debug will slow down Neovim. Make sure to disable the option after you've collected the information you're looking for.

How do I set the path to the Neovim binary?

Set it when calling the lspconfig setup method for null-ls.

require("lspconfig")["null-ls"].setup({ cmd = { "/path/to/nvim" }, ... })

Does it work with (other plugin)?

In most cases, yes. null-ls tries to act like an actual LSP server as much as possible, so it should work seamlessly with most LSP-related plugins. If you run into problems, please try to determine which plugin is causing them and open an issue.

This wiki page mentions plugins that require specific configuration options / tweaks to work with null-ls.

How does it work?

Thanks to hard work by @folke, the plugin wraps the mechanism Neovim uses to spawn language servers to start a client entirely in-memory. The client attaches to buffers that match defined sources and receives and responds to requests, document changes, and other events from Neovim.

Will it affect my performance?

More testing is necessary, but since null-ls uses pure Lua and runs entirely in memory without any external processes, in most cases it should run faster than similar solutions. If you notice that performance is worse with null-ls than with an alternative, please open an issue!

Debugging

  1. Enable debug logging

    require("null-ls").config({
       debug = true,
    })
    
  2. Use :NullLsLog to open the log file.

As with LSP logging, debug will slow down Neovim. Make sure to disable the option after you've collected the information you're looking for.

Tests

The test suite includes unit and integration tests and depends on plenary.nvim. Run make test in the root of the project to run the suite or FILE=filename_spec.lua make test-file to test an individual file.

E2E tests expect the latest Neovim master.

Alternatives

null-ls.nvim's People

Contributors

abzcoding avatar aileot avatar aoswalt avatar carrascomj avatar cenobantur avatar disrupted avatar figsoda avatar folke avatar furkanzmc avatar gbprod avatar gelio avatar jbarap avatar lewis6991 avatar mange avatar meck avatar mks1508 avatar mtoohey31 avatar muniftanjim avatar nawordar avatar numtostr avatar oncomouse avatar pasibergman avatar raviqqe avatar sandersantema avatar sirbrillig avatar ssbanerje avatar tastyep avatar ultra-code avatar vuki656 avatar zack9433 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.