12_[nvim0.5+从0单排]_nvim内置lsp搭建lua IDE

视频与目录

项目
教程目录 https://blog.csdn.net/lxyoucan/article/details/120641546
视频全屏 https://www.bilibili.com/video/BV14h411b77b/
视频

12nvim内置lsp搭建lua IDE

12_[nvim0.5+从0单排]_nvim内置lsp搭建lua IDE

大家好,本期内容主要是说如何手动搭建lua的开发环境。

其他开发语言的手动配置教程可以参考下面链接:
https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md

自动安装

自动安装很简单:LspInstall lua一行命令搞定。但是今天主要请的并不是自动安装,而是手动安装。

详情请参考
《09_[nvim0.5+从0单排]_nvim内置lsp搭建python IDE》
https://www.bilibili.com/video/BV1cQ4y1z7J3/

手动安装

下载lua-language-server.zip并解压

这个文件我是从github上下载的,没做任何修改。为了方便一些github访问慢的朋友,可以从我的百度云分享中下载。

链接: https://pan.baidu.com/s/1K7PB3J538iL-1nWZNJT6HQ
提取码: yiqn
在这里插入图片描述

下载以后解压到本地任意路径,我这里的解压路径是:

~/.local/share/nvim/lsp/lua-language-server

你可以根据自己的需要来修改,后面的配置文件中会用到这个路径。
在这里插入图片描述

lsp配置

新增配置文件

~/.config/nvim/lua/lspconf/lua.lua

文件内容如下:

local nvim_lsp = require('lspconfig')

-- 在语言服务器附加到当前缓冲区之后
-- 使用 on_attach 函数仅映射以下键
 Itkey_on_attach = function(client, bufnr)
	local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
	local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end

	--Enable completion triggered by <c-x><c-o>
	buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')

	-- Mappings.
	local opts = {
    
     noremap=true, silent=true }

	-- See `:help vim.lsp.*` for documentation on any of the below functions
	buf_set_keymap('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts)
	buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
	--buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts)
	buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts)
	--buf_set_keymap('i', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
	buf_set_keymap('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts)
	buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts)
	buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts)
	buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts)
	--重命名
	buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
	--智能提醒,比如:自动导包 已经用lspsaga里的功能替换了
	--buf_set_keymap('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts)
	buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts)
	buf_set_keymap('n', '<space>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts)
	--buf_set_keymap('n', '<C-j>', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
	buf_set_keymap('n', '<S-C-j>', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts)
	buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts)
	buf_set_keymap("n", "<leader>f", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)

	-- 代码保存自动格式化formatting
	if client.resolved_capabilities.document_formatting then
		vim.api.nvim_command [[augroup Format]]
		vim.api.nvim_command [[autocmd! * <buffer>]]
		vim.api.nvim_command [[autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_seq_sync()]]
		vim.api.nvim_command [[augroup END]]
	end
end

-- Add additional capabilities supported by nvim-cmp
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities.textDocument.completion.completionItem.documentationFormat = {
    
     'markdown', 'plaintext' }
capabilities.textDocument.completion.completionItem.snippetSupport = true
capabilities.textDocument.completion.completionItem.preselectSupport = true
capabilities.textDocument.completion.completionItem.insertReplaceSupport = true
capabilities.textDocument.completion.completionItem.labelDetailsSupport = true
capabilities.textDocument.completion.completionItem.deprecatedSupport = true
capabilities.textDocument.completion.completionItem.commitCharactersSupport = true
capabilities.textDocument.completion.completionItem.tagSupport = {
    
     valueSet = {
    
     1 } }
capabilities.textDocument.completion.completionItem.resolveSupport = {
    
    
	properties = {
    
    
		'documentation',
		'detail',
		'additionalTextEdits',
	},
}
Itkey_capabilities = capabilities
---------------分割线-------------
local system_name
if vim.fn.has("mac") == 1 then
  system_name = "macOS"
elseif vim.fn.has("unix") == 1 then
  system_name = "Linux"
elseif vim.fn.has("win32") == 1 then
  system_name = "Windows"
else
  print("Unsupported system for sumneko")
end
-- set the path to the sumneko installation; if you previously installed via the now deprecated :LspInstall, use
--local sumneko_root_path = vim.fn.stdpath('config')..'/lsp/lua-language-server'
local sumneko_root_path = vim.fn.stdpath("data") .. "/lsp/lua-language-server"
--local sumneko_root_path = vim.fn.stdpath('cache')..'/lsp/lua-language-server'
local sumneko_binary = sumneko_root_path .. "/bin/" .. system_name .. "/lua-language-server"
local runtime_path = vim.split(package.path, ";")
table.insert(runtime_path, "lua/?.lua")
table.insert(runtime_path, "lua/?/init.lua")

require "lspconfig".sumneko_lua.setup {
    
    
  on_attach = Itkey_on_attach,
  cmd = {
    
    sumneko_binary, "-E", sumneko_root_path .. "/main.lua", "--locale=zh-cn"},
  settings = {
    
    
    Lua = {
    
    
      runtime = {
    
    
        -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
        version = "LuaJIT",
        -- Setup your lua path
        path = runtime_path
      },
      diagnostics = {
    
    
        -- Get the language server to recognize the `vim` global
        globals = {
    
    "vim"}
      },
      workspace = {
    
    
        -- Make the server aware of Neovim runtime files
        library = vim.api.nvim_get_runtime_file("", true)
      },
      -- Do not send telemetry data containing a randomized but unique identifier
      telemetry = {
    
    
        enable = false
      }
    }
  },
  capabilities = Itkey_capabilities
}

配置nvim-cmp

~/.config/nvim/after/plugin/nvim-cmp.lua

增加如下一行:

require("lspconf.lua")

代码格式化

因为lua 的lsp没有自带代码格式化的功能,所以我们使用第三方的插件来格式化lua的代码。
packer插件管理器安装方法

修改~/.config/nvim/lua/plugins.lua文件,并在use 'wbthomason/packer.nvim'增加如下内容:

--代码格式化工具,主要用于lua语法格式化
use "mhartington/formatter.nvim"

:wq退出重新打开nvim后,执行:PackerInstall 安装成功。

配置 formatter.nvim

安装用于lua代码格式化的命令行程序

npm i -g lua-fmt

新增配置文件

~/.config/nvim/after/plugin/formatter.lua

内容如下:


local status, formatter = pcall(require, "formatter")
if (not status) then
  return
end
formatter.setup(
  {
    
    
    filetype = {
    
    
      lua = {
    
    
        -- luafmt
        function()
          return {
    
    
            exe = "luafmt",
            args = {
    
    "--indent-count", 2, "--stdin"},
            stdin = true
          }
        end
      },
      sql = {
    
    
        -- sqlformat
        -- 安装方法:pip3 install --upgrade sqlparse
        function()
          return {
    
    
            exe = "sqlformat",
            -- upper|lower
            args = {
    
    "-k", "lower", "-i", "lower", "-r", "-"},
            stdin = true
          }
        end
      }
    }
  }
)

--配置保存文件自动格式化代码
vim.api.nvim_exec(
  [[
augroup FormatAutogroup
  autocmd!
  autocmd BufWritePost *.rs,*.lua FormatWrite
augroup END
]],
  true
)

猜你喜欢

转载自blog.csdn.net/lxyoucan/article/details/120855847
IDE