Вопрос или проблема
Я недавно перешел с менеджера плагинов Packer на Lazy.
Использую LSP, LspConfig, Mason, MasonLspConfig с несколькими языковыми серверами для программирования.
Проблема в том, что Neovim испытывает трудности с доступом к этим серверам. Это работало с менеджером пакетов Packer. Возможно, я что-то неправильно сконфигурировал, но я не имею представления, в чем может быть проблема.
Языковые серверы установлены и добавлены в PATH.
Запуск языкового сервера с командой: `lua-language-server` не удался с сообщением об ошибке: EACCES: доступ запрещен
Команда “lua-language-server” как таковая доступна.
Я использую Fish shell в качестве стандартного шелла.
Вот мой файл конфигурации плагинов:
return {
{ "lvimuser/lsp-inlayhints.nvim" },
{
"neovim/nvim-lspconfig",
dependencies = { "lvimuser/lsp-inlayhints.nvim" },
config = function()
local lspconfig = require("lspconfig")
lspconfig.gopls.setup({
on_attach = function(client, bufnr)
require("settings/shared").on_attach(client, bufnr)
require("lsp-inlayhints").setup({
inlay_hints = {
type_hints = {
prefix = "=> "
},
},
})
require("lsp-inlayhints").on_attach(client, bufnr)
require("illuminate").on_attach(client)
end,
settings = {
gopls = {
analyses = {
nilness = true,
unusedparams = true,
unusedwrite = true,
useany = true,
},
experimentalPostfixCompletions = true,
gofumpt = true,
staticcheck = true,
usePlaceholders = true,
hints = {
assignVariableTypes = true,
compositeLiteralFields = true,
compositeLiteralTypes = true,
constantValues = true,
functionTypeParameters = true,
parameterNames = true,
rangeVariableTypes = true,
}
},
},
})
end
},
{ "williamboman/mason.nvim" },
{ "Afourcat/treesitter-terraform-doc.nvim" },
{ "williamboman/mason-lspconfig.nvim",
dependencies = { "williamboman/mason.nvim" },
config = function()
local mason_lspconfig = require("mason-lspconfig")
mason_lspconfig.setup({
PATH = "prepend",
ensure_installed = {
"eslint",
"gopls", -- ВНИМАНИЕ: Это может быть проблема с переключением goenv.
"marksman",
"rust_analyzer",
"sumneko_lua",
"terraformls",
"tflint",
"tsserver",
"yamlls",
}
})
mason_lspconfig.setup_handlers({
function(server_name)
require("lspconfig")[server_name].setup({
on_attach = function(client, bufnr)
require("settings/shared").on_attach(client, bufnr)
require("illuminate").on_attach(client)
if server_name == "terraformls" then
require("treesitter-terraform-doc").setup()
end
end
})
end
})
end
},
{ "simrat39/symbols-outline.nvim",
config = function()
require("symbols-outline").setup({
auto_close = false,
highlight_hovered_item = true,
position = "left",
width = 15,
symbols = {
File = { icon = "", hl = "GruvboxAqua" },
Module = { icon = "", hl = "GruvboxBlue" },
Namespace = { icon = "", hl = "GruvboxBlue" },
Package = { icon = "", hl = "GruvboxBlue" },
Class = { icon = "𝓒", hl = "GruvboxGreen" },
Method = { icon = "ƒ", hl = "GruvboxOrange" },
Property = { icon = "", hl = "GruvboxOrange" },
Field = { icon = "", hl = "GruvboxRed" },
Constructor = { icon = "", hl = "TSConstructor" },
Enum = { icon = "ℰ", hl = "GruvboxGreen" },
Interface = { icon = "ﰮ", hl = "GruvboxGreen" },
Function = { icon = "", hl = "GruvboxYellow" },
Variable = { icon = "", hl = "GruvboxPurple" },
Constant = { icon = "", hl = "GruvboxPurple" },
String = { icon = "𝓐", hl = "GruvboxGray" },
Number = { icon = "#", hl = "TSNumber" },
Boolean = { icon = "⊨", hl = "TSBoolean" },
Array = { icon = "", hl = "GruvboxPurple" },
Object = { icon = "⦿", hl = "GruvboxGreen" },
Key = { icon = "🔐", hl = "GruvboxGreen" },
Null = { icon = "NULL", hl = "GruvboxGreen" },
EnumMember = { icon = "", hl = "GruvboxRed" },
Struct = { icon = "𝓢", hl = "GruvboxGreen" },
Event = { icon = "🗲", hl = "GruvboxGreen" },
Operator = { icon = "+", hl = "TSOperator" },
TypeParameter = { icon = "𝙏", hl = "GruvboxRed" }
},
})
end
},
{ "mfussenegger/nvim-lint",
config = function()
local lint = require("lint")
lint.linters_by_ft = {
go = { "golangcilint" },
}
end
},
}
После перезагрузки системы lsp-config обнаружил lua-language-server
.
Думаю, что PATH не был правильно подключен.
Для тех, у кого похожие проблемы — убедитесь, что языковые серверы установлены, добавлены в PATH правильно, и не забудьте подключить ваш файл конфигурации с переменными.
Вот мои переменные для lua-language-server
и сервера gopls
в формате fish shell:
# Lua
set -gx PATH ~/.config/lsp/lua-language-server/bin $PATH
# Go
set -gx GOPATH ~/go
set -gx PATH /usr/local/go/bin $PATH
set -gx PATH $GOPATH/bin $PATH
А вот они в формате bash:
# Lua
export PATH=$PATH:$HOME/.config/lsp/lua-language-server/bin
# Go
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin
export PATH=$PATH:$GOPATH/bin
Ответ или решение
Диагностика проблемы с запуском lua-language-server в Neovim и пути решения
Проблема, связанная с запуском lua-language-server через команду lua-language-server
, сопровождаемая ошибкой EACCES: permission denied, указывает на то, что Neovim не может получить доступ к необходимым ресурсам из-за ограничений прав. Возможно, это связано с неправильной настройкой PATH или прав доступа к исполняемым файлам.
Анализ проблемной ситуации
Вы столкнулись с проблемой после перехода с менеджера плагинов Packer на Lazy, и хотя сам lua-language-server установлен и доступен в PATH, ошибка указывает на нарушение прав доступа. Важно убедиться в корректности переноса конфигурации и что все настройки произведены правильно в новой среде.
Шаги по устранению неисправностей
-
Проверка прав доступа
Убедитесь, что у fish shell есть необходимые права на исполняемый файл lua-language-server. Проверьте права с помощью командыls -l
, и если требуется, измените их черезchmod +x
. -
Назначение и проверка переменной PATH
Убедитесь, что директория сlua-language-server
действительно добавлена в PATH. В fish shell необходимо использовать команду:set -gx PATH ~/.config/lsp/lua-language-server/bin $PATH
Перепроверьте текущие значения PATH через:
echo $PATH
Важной проверкой будет сравнение текущих настроек PATH с теми, которые были в Packer.
-
Проверка конфигурации Neovim
Отредактируйте конфигурационный файл для Neovim. Убедитесь, что mason-lspconfig и lspconfig правильно сконфигурированы для работы с lua-language-server:local lspconfig = require("lspconfig") lspconfig.sumneko_lua.setup({ on_attach = on_attach, settings = { Lua = { runtime = { version = 'LuaJIT', }, diagnostics = { globals = {'vim'}, }, workspace = { library = vim.api.nvim_get_runtime_file("", true), }, telemetry = { enable = false, }, }, }, })
-
Перезапуск и проверка окружения
После каждой правки конфигураций окружения перезапускайте fish shell или используйте командуsource
для применения изменений. -
Диагностика через bash
Если проблема сохраняется, временно переключитесь на bash для проверки функциональности lua-language-server:export PATH=$PATH:$HOME/.config/lsp/lua-language-server/bin
Если server запускается корректно, проблема может быть связана с использованием fish shell.
Рекомендации и последующие шаги
Для предотвращения подобных проблем в будущем, разработайте процедуру переноса конфигураций при смене менеджеров плагинов и добавлении новых плагинов. Это поможет сохранить интеграцию всех используемых инструментов и сред без сбоев в их работе.
Также рекомендуется документировать все изменения в конфигурациях и переменных сред окружения, чтобы в случае возникновения проблем можно было быстрее выявить и устранить их причину.
Заключение
Следуя вышеописанным шагам и рекомендациям, вы сможете устранить текущие проблемы с lua-language-server. Контроль прав доступа, корректность настроек пути PATH и конфигураций Neovim являются ключевыми действиями для функциональной работы LSP в среде разработки. Это обеспечит стабильный и надежный процесс разработки с использованием новых инструментов и плагинов.