Возникла ситуация, что не получается установить phpactor в neovim посредством пакетного менеджера Lazy.
Многочисленные поиски сводятся к тому, что вместо него устанавливается intelephense через npm
npm i intelephense -g
Но это условно-бесплатная альтернатива, т.е. больше функционала доступно лишь по подписке, а оно мне не нужно.
Версии исполняемых файлов
- Composer 2.7.8
- PHP 8.3.11
- Phpactor 2024.06.30.0
Cтруктура init.lua
-- Basic
require('core.plugins')
require('core.mappings')
require('core.configs')
-- Plugins
require('plugins.treesitter')
require('plugins.lspconfig')
require('plugins.cmp')
require('plugins.lint')
require('plugins.mason')
require('plugins.lualine')
Cтруктура lspconfig.lua
-- Setup language servers.
local lspconfig = require('lspconfig')
lspconfig.pylsp.setup {}
lspconfig.clangd.setup {}
lspconfig.phpactor.setup {
on_attach = on_attach,
init_options = {
["language_server_phpstan.enabled"] = false,
["language_server_psalm.enabled"] = false,
}
}
lspconfig.html.setup {}
-- Global mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist)
-- Use LspAttach autocommand to only map the following keys
-- after the language server attaches to the current buffer
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
callback = function(ev)
-- Enable completion triggered by <c-x><c-o>
vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'
-- Buffer local mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local opts = { buffer = ev.buf }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts)
vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, opts)
vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, opts)
vim.keymap.set('n', '<space>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts)
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, opts)
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, opts)
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
vim.keymap.set('n', '<space>f', function()
vim.lsp.buf.format { async = true }
end, opts)
end,
})
Конфигурация plugins.lua (конфигурация урезана в целях компактности)
require("lazy").setup({
{ 'nvim-treesitter/nvim-treesitter' },
{ 'neovim/nvim-lspconfig', },
-- mason
{ "williamboman/mason.nvim", },
{ "williamboman/mason-lspconfig.nvim" }
-- completion
{ 'hrsh7th/cmp-nvim-lsp' },
{ 'hrsh7th/cmp-buffer' },
{ 'hrsh7th/cmp-path' },
{ 'hrsh7th/cmp-cmdline' },
{ 'hrsh7th/nvim-cmp' },
})
Как можно заметить, у меня установлен mason.nvim, через него установлен phpactor, который лежит в ~/.local/share/nvim/mason/packages/phpactor/phpactor.
Исполняемый файл работает хорошо, видит команды, но не получилось запустить его так же гладко, как случилось с clangd, в котором автокомплит работает великолепно.
Фрагмент файла cmp.lua
local cmp = require'cmp'
cmp.setup({
snippet = {
expand = function(args)
require('luasnip').lsp_expand(args.body) -- For `luasnip` users.
end,
},
window = {
-- completion = cmp.config.window.bordered(),
-- documentation = cmp.config.window.bordered(),
},
mapping = cmp.mapping.preset.insert({
["<C-k>"] = cmp.mapping.select_prev_item(), -- previous suggestion
["<C-j>"] = cmp.mapping.select_next_item(), -- next suggestion
["<C-b>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<C-Space>"] = cmp.mapping.complete(), -- show completion suggestions
["<C-e>"] = cmp.mapping.abort(), -- close completion window
["<CR>"] = cmp.mapping.confirm({ select = false }),
}),
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'luasnip' }, -- For luasnip users.
{ name = 'buffer' },
{ name = 'path' }, -- For vsnip users.
}),
})
cmp.setup.cmdline({ '/', '?' }, {
mapping = cmp.mapping.preset.cmdline(),
sources = {
{ name = 'buffer' }
}
})
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({ { name = 'path' } },
{ { name = 'cmdline' } })
})
-- Set up lspconfig.
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local phpactor_capabilities = vim.lsp.protocol.make_client_capabilities()
phpactor_capabilities.textDocument.foldingRange = {
dynamicRegistration = false,
lineFoldingOnly = true
}
phpactor_capabilities['textDocument']['codeAction'] = {}
require('lspconfig')['phpactor'].setup {
capabilities = phpactor_capabilities,
on_attach = on_attach
}
Структура configs.lua
vim.wo.number = true
vim.wo.relativenumber = true
vim.opt.shell = "/usr/bin/zsh"
vim.opt.number = true
vim.opt.swapfile = false
vim.opt.mouse = "a"
vim.opt.mousefocus = true
vim.opt.clipboard = "unnamedplus"
vim.opt.termguicolors = true
vim.cmd('colorscheme retrobox')
-- Indent Settings
vim.opt.expandtab = true
vim.opt.shiftwidth = 4
vim.opt.tabstop = 4
vim.opt.softtabstop = 4
vim.opt.smartindent = true
Послесловие. Возможно трудности с конфигурацией phpactor, которую так и не понял, либо composer.