视频与目录
项目 | 值 |
---|---|
教程目录 | 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
)