Skip to content

Decodetalkers/neocmakelsp

Repository files navigation

CMake LSP implementation based on Tower and Tree-sitter

Crates.io

It is a CMake lsp based on tower-lsp and treesitter

Install

cargo install neocmakelsp

Setup For neovim

The config of neocmakelsp is in nvim-lsp-config, so just follow nvim-lsp-config to setup it

neocmakelsp has two start ways: stdio and Tcp. Tcp is for debug. If you want to help me and debug is , you should start it with Tcp way.

Stdio

local configs = require("lspconfig.configs")
local nvim_lsp = require("lspconfig")
if not configs.neocmake then
    configs.neocmake = {
        default_config = {
            cmd = { "neocmakelsp", "--stdio" },
            filetypes = { "cmake" },
            root_dir = function(fname)
                return nvim_lsp.util.find_git_ancestor(fname)
            end,
            single_file_support = true,-- suggested
            on_attach = on_attach, -- on_attach is the on_attach function you defined
            init_options = {
                format = {
                    enable = true
                },
                scan_cmake_in_package = true -- default is true
            }
        }
    }
    nvim_lsp.neocmake.setup({})
end

Tcp

if not configs.neocmake then
    configs.neocmake = {
        default_config = {
            cmd = vim.lsp.rpc.connect('127.0.0.1','9257'),
            filetypes = { "cmake" },
            root_dir = function(fname)
                return nvim_lsp.util.find_git_ancestor(fname)
            end,
            single_file_support = true,-- suggested
            on_attach = on_attach, -- on_attach is the on_attach function you defined
            init_options = {
                format = {
                    enable = true
                }
            }
        }
    }
    nvim_lsp.neocmake.setup({})
end

Setup for helix

Tcp (good for debug)

[[language]]
name = "neocmake"
auto-format = true
language-servers = [{ name = "neocmakelsp" }]

[language-server.neocmakelsp]
command = "nc"
args = ["localhost", "9257"]

Stdio

[[language]]
name = "cmake"
auto-format = true
language-servers = [{ name = "neocmakelsp" }]

[language-server.neocmakelsp]
command = "neocmakelsp"
args = ["--stdio"]

Setup for emacs

To use neocmakelsp with eglot:

(use-package cmake-ts-mode
  :config
  (add-hook 'cmake-ts-mode-hook
    (defun setup-neocmakelsp ()
      (require 'eglot)
      (add-to-list 'eglot-server-programs `((cmake-ts-mode) . ("neocmakelsp" "--stdio")))
      (eglot-ensure))))

Help needed

  • I do not know if all features will work on mac and windows, so if someone use mac or windows, please help me and send pr for this project.
  • I want a comaintainer, who is familiar with mac, windows, and lsp.

Features

  • watchfile
  • complete
  • symbol_provider
  • On hover
  • Format
  • GO TO Definitation
    • find_package
    • include
  • Search cli
  • Get the project struct
  • It is also a cli tool to format
  • Lint

Lint form 6.0.27

Put a file named .neocmakelint.toml under the root of the project.

command_upcase = "ignore" # "lowercase", "upcase"

Then it will check whether the command is all upcase.

External cmake-lint

When cmake-lint is installed, neocmakelsp will utilize it to offer linting and code analysis each time the file is saved. This functionality can be enabled or disabled in the .neocmakelint.toml file:

enable_external_cmake_lint = true # true to use external cmake-lint, or false to disable it

If enable_external_cmake_lint is turned on but cmake-lint is not installed, external linting will not report any error message.

If you want to use watchfile in neovim, set

capabilities = {
    workspace = {
        didChangeWatchedFiles = {
            dynamicRegistration = true,
        },
    },
}

It will check CMakeCache.txt, and get weather the package is exist

lsp init_options

init_options = {
    format = {
        enable = true, -- to use lsp format

    },
    scan_cmake_in_package = false, -- it will deeply check the cmake file which found when search cmake packages.
    semantic_token = false,
    -- semantic_token heighlight. if you use treesitter highlight, it is suggested to set with false. it can be used to make better highlight for vscode which only has textmate highlight
}

TODO

  • Undefined function check

Show

Search

Search

symbol

Symbol

Complete and symbol support

Complete CompleteFindpackage

OnHover

onHover

GoToDefinition

Show JumpToFile

Tree

TreeShow

Format cli

Note: When formatting files, make sure that your .editorconfig file is in your working directory

format the file

Usage: neocmakelsp {format|--format|-F} [OPTIONS] <FormatPath>...

Arguments:
  <FormatPath>...  file or folder to format

Options:
  -o, --override  override
  -h, --help      Print help

It will read .editorconfig file to format files, just set like

[CMakeLists.txt]
indent_style = space
indent_size = 4

Note

The format do the min things, just do trim and place the first line to the right place by the indent you set, this means

function(A)

        set(A
        B
            C
        )

    endfunction()

it will just become

function(A)

    set(A
        B
            C
        )

endfunction()

It just remove the space in the end, replace \t at the begin of each line to , if set indent_size to space, and format the first line to right place. It does little, but I think it is enough.