12nvim内置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
你可以根据自己的需要来修改,后面的配置文件中会用到这个路径。
新增配置文件
~/.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
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', 'lua vim.lsp.buf.declaration()', opts)
buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts)
--buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts)
buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts)
--buf_set_keymap('i', '', 'lua vim.lsp.buf.signature_help()', opts)
buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts)
buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts)
buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts)
buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts)
--重命名
buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts)
--智能提醒,比如:自动导包 已经用lspsaga里的功能替换了
--buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts)
buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts)
buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts)
--buf_set_keymap('n', '', 'lua vim.lsp.diagnostic.goto_prev()', opts)
buf_set_keymap('n', '', 'lua vim.lsp.diagnostic.goto_next()', opts)
buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts)
buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts)
-- 代码保存自动格式化formatting
if client.resolved_capabilities.document_formatting then
vim.api.nvim_command [[augroup Format]]
vim.api.nvim_command [[autocmd! * ]]
vim.api.nvim_command [[autocmd BufWritePre 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
安装成功。
安装用于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
)