74 个版本

0.8.1 2024 年 8 月 17 日
0.7.9 2024 年 7 月 21 日
0.6.20 2024 年 3 月 7 日
0.6.17 2023 年 12 月 3 日
0.2.4 2022 年 7 月 17 日

4文本编辑器

Download history 1374/week @ 2024-05-03 1008/week @ 2024-05-10 2099/week @ 2024-05-17 1366/week @ 2024-05-24 2665/week @ 2024-05-31 1412/week @ 2024-06-07 2078/week @ 2024-06-14 2026/week @ 2024-06-21 1773/week @ 2024-06-28 1517/week @ 2024-07-05 1324/week @ 2024-07-12 1682/week @ 2024-07-19 1167/week @ 2024-07-26 1729/week @ 2024-08-02 1019/week @ 2024-08-09 1595/week @ 2024-08-16

每月下载量 5,739

MIT 许可证

3.5MB
5.5K SLoC

基于 Tower 和 Tree-sitter 的 CMake LSP 实现

Crates.io

智能代码补全:通过深度分析 CMake 文件提供精确的代码补全建议,提高开发效率。

  • 实时错误检测:集成代码检查功能,检查代码中的潜在问题,帮助保持代码质量。
  • 支持 Neovim Emacs VSCode Helix:兼容这些流行编辑器,满足不同开发者的需求。
  • 简单配置:易于设置和使用,最小化配置时间,以便您可以专注于开发。
  • CLI 工具集成:不仅是一个 LSP,还包括用于代码格式化的命令行工具,方便不同环境。

目录

  1. 简介
  2. 功能
  3. 安装
  4. 编辑器支持
  5. 功能
  6. 用户反馈
  7. 视觉示例

安装

cargo install neocmakelsp

编辑器支持

neovim 配置

neocmakelsp 的配置位于 nvim-lsp-config 中,因此只需遵循 nvim-lsp-config 来设置它

neocmakelsp 有两种启动方式:stdioTcpTcp 用于调试。如果您想帮助我并调试,应该使用 Tcp 方式启动。

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
                },
                lint = {
                    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

helix 配置

Tcp

[[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"]

emacs 配置

使用 eglot 与 neocmakelsp

(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))))

功能

  • watchfile
  • complete
  • symbol_provider
  • 悬停
  • 格式化
  • 转到定义
    • find_package
    • include
  • 搜索 CLI
  • 获取项目结构
  • 它也是一个用于格式化的 CLI 工具
  • 代码检查

代码检查 6.0.27 版本

在项目的根目录下放置一个名为 .neocmakelint.toml 的文件。

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

然后它会检查命令是否全部为大写。

外部cmake-lint

cmake-lint被安装时,neocmakelsp会利用它在每次文件保存时提供代码检查和分析。此功能可以在.neocmakelint.toml文件中启用或禁用

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

如果enable_external_cmake_lint被打开但cmake-lint未安装,外部代码检查不会报告任何错误信息。

如果您想在neovim中使用watchfile,设置

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

    },

}

它将检查CMakeCache.txt,并获取包是否存在

代码片段支持

capabilities = {
   textDocument = {
       completion = {
           completionItem = {
               snippetSupport = true
           }
       }
   }
}

lsp初始化选项

init_options = {
    format = {
        enable = true, -- to use lsp format
    },
    lint = {
        enable = true
    },
    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
}

待办事项

  • 未定义函数检查

视觉示例

Search

符号

Symbol

完成和符号支持

Complete CompleteFindpackage

悬停

onHover

转到定义

Show JumpToFile

TreeShow

格式化命令行工具

注意:当格式化文件时,请确保您的.editorconfig文件位于工作目录中

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

它将读取.editorconfig文件来格式化文件,只需设置如下

[CMakeLists.txt]
indent_style = space
indent_size = 4

注意

格式只做最小的事情,只做trim,并通过您设置的缩进来将第一行放置在正确的位置,这意味着

function(A)

        set(A
        B
            C
        )

    endfunction()

它将变成


function(A)

    set(A
        B
            C
        )

endfunction()

它只删除结尾的空格,将每一行的开头\t替换为 ,如果设置了indent_size为空格,并将第一行格式化到正确的位置。它做得很少,但我认为这已经足够了。

用户反馈

  • 我不知道所有功能是否都能在mac和windows上工作,所以如果有人在mac或windows上使用,请帮助我并向此项目发送pr。
  • 我想找一个熟悉mac、windows和lsp的comaintainer。

依赖关系

~16-28MB
~415K SLoC