146 lines
4.7 KiB
Lua
146 lines
4.7 KiB
Lua
--- @module "config.rocks"
|
|
--- This module bootstraps rocks.nvim.
|
|
--- Rocks is a package manager for Neovim.
|
|
-- ╭─────────────────────────────────────────────────────────╮
|
|
-- │ ROCKS │
|
|
-- ╰─────────────────────────────────────────────────────────╯
|
|
local M = {}
|
|
|
|
-- ━━━━━━━━━━━━━━━━━━━━━━━━ Bootstrap rocks.nvim ━━━━━━━━━━━━━━━━━━━━━
|
|
function M.bootstrap()
|
|
do
|
|
local rocks_config = {
|
|
rocks_path = vim.env.HOME .. '/.local/share/nvim/rocks',
|
|
}
|
|
|
|
vim.g.rocks_nvim = rocks_config
|
|
|
|
local luarocks_path = {
|
|
vim.fs.joinpath(rocks_config.rocks_path, 'share', 'lua', '5.1', '?.lua'),
|
|
vim.fs.joinpath(
|
|
rocks_config.rocks_path,
|
|
'share',
|
|
'lua',
|
|
'5.1',
|
|
'?',
|
|
'init.lua'
|
|
),
|
|
}
|
|
package.path = package.path .. ';' .. table.concat(luarocks_path, ';')
|
|
|
|
local luarocks_cpath = {
|
|
vim.fs.joinpath(rocks_config.rocks_path, 'lib', 'lua', '5.1', '?.so'),
|
|
vim.fs.joinpath(rocks_config.rocks_path, 'lib64', 'lua', '5.1', '?.so'),
|
|
-- Remove the dylib and dll paths if you do not need macos or windows support
|
|
vim.fs.joinpath(rocks_config.rocks_path, 'lib', 'lua', '5.1', '?.dylib'),
|
|
vim.fs.joinpath(
|
|
rocks_config.rocks_path,
|
|
'lib64',
|
|
'lua',
|
|
'5.1',
|
|
'?.dylib'
|
|
),
|
|
vim.fs.joinpath(rocks_config.rocks_path, 'lib', 'lua', '5.1', '?.dll'),
|
|
vim.fs.joinpath(rocks_config.rocks_path, 'lib64', 'lua', '5.1', '?.dll'),
|
|
}
|
|
package.cpath = package.cpath .. ';' .. table.concat(luarocks_cpath, ';')
|
|
|
|
vim.opt.runtimepath:append(
|
|
vim.fs.joinpath(
|
|
rocks_config.rocks_path,
|
|
'lib',
|
|
'luarocks',
|
|
'rocks-5.1',
|
|
'rocks.nvim',
|
|
'*'
|
|
)
|
|
)
|
|
end
|
|
|
|
-- If rocks.nvim is not installed then install it!
|
|
if not pcall(require, 'rocks') then
|
|
local rocks_location =
|
|
---@diagnostic disable-next-line: param-type-mismatch
|
|
vim.fs.joinpath(vim.fn.stdpath('cache'), 'rocks.nvim')
|
|
|
|
if not vim.uv.fs_stat(rocks_location) then
|
|
-- Pull down rocks.nvim
|
|
vim.fn.system({
|
|
'git',
|
|
'clone',
|
|
'--filter=blob:none',
|
|
'https://github.com/nvim-neorocks/rocks.nvim',
|
|
rocks_location,
|
|
})
|
|
end
|
|
|
|
-- If the clone was successful then source the bootstrapping script
|
|
assert(
|
|
vim.v.shell_error == 0,
|
|
'rocks.nvim installation failed. Try exiting and re-entering Neovim!'
|
|
)
|
|
|
|
vim.cmd.source(vim.fs.joinpath(rocks_location, 'bootstrap.lua'))
|
|
|
|
vim.fn.delete(rocks_location, 'rf')
|
|
end
|
|
end
|
|
|
|
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━ Ensure Luarocks ━━━━━━━━━━━━━━━━━━━━━━━
|
|
function M.ensure_luarocks()
|
|
-- Check if 'luarocks' command is available
|
|
if os.execute('luarocks --version') ~= 0 then
|
|
-- 'luarocks' is not installed, set up 'luarocks.nvim' plugin
|
|
local status_ok, lazy = pcall(require, 'lazy')
|
|
if not status_ok then
|
|
vim.notify(
|
|
'Lazy.nvim not found. Please install it to manage plugins.',
|
|
vim.log.levels.ERROR
|
|
)
|
|
return
|
|
end
|
|
|
|
lazy.setup({
|
|
{
|
|
'vhyrro/luarocks.nvim',
|
|
priority = 1000, -- Ensure this plugin loads first
|
|
opts = {
|
|
rocks = { 'magick' }, -- Example of a rock that you want to install
|
|
},
|
|
config = function()
|
|
-- Restart Neovim to apply changes after 'luarocks.nvim' sets up
|
|
vim.cmd('source $MYVIMRC | qa')
|
|
end,
|
|
},
|
|
})
|
|
end
|
|
end
|
|
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━ Rocks plugin spec ━━━━━━━━━━━━━━━━━━━━━━
|
|
M.plugin_spec = {
|
|
'vhyrro/luarocks.nvim',
|
|
priority = 1000, -- Very high priority is required
|
|
opts = {
|
|
rocks = { 'magick' }, -- specifies a list of rocks to install
|
|
},
|
|
}
|
|
|
|
-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Load plugins ━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
-- Load rocks package manager
|
|
M.load_rocks = function()
|
|
require('rocks')
|
|
end
|
|
|
|
-- Perform setup
|
|
M.setup = function()
|
|
if not vim.g.is_termux then
|
|
M.bootstrap()
|
|
M.ensure_luarocks()
|
|
M.load_rocks()
|
|
end
|
|
end
|
|
|
|
-- Execute the setup function
|
|
M.setup()
|
|
|
|
return M
|