--- @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