nvim-config/init.lua

96 lines
3.7 KiB
Lua

-- NOTE: Welcome to your neovim configuration!
-- The first 100ish lines are setup,
-- the rest is usage of lze and various core plugins!
vim.loader.enable() -- <- bytecode caching
do
-- Set up a global in a way that also handles non-nix compat
local ok
ok, _G.nixInfo = pcall(require, vim.g.nix_info_plugin_name)
if not ok then
package.loaded[vim.g.nix_info_plugin_name] = setmetatable({}, {
__call = function (_, default) return default end
})
_G.nixInfo = require(vim.g.nix_info_plugin_name)
-- If you always use the fetcher function to fetch nix values,
-- rather than indexing into the tables directly,
-- it will use the value you specified as the default
-- TODO: for non-nix compat, vim.pack.add in another file and require here.
end
nixInfo.isNix = vim.g.nix_info_plugin_name ~= nil
---@module 'lzextras'
---@type lzextras | lze
nixInfo.lze = setmetatable(require('lze'), getmetatable(require('lzextras')))
function nixInfo.get_nix_plugin_path(name)
return nixInfo(nil, "plugins", "lazy", name) or nixInfo(nil, "plugins", "start", name)
end
end
nixInfo.lze.register_handlers {
{
-- adds an `auto_enable` field to lze specs
-- if true, will disable it if not installed by nix.
-- if string, will disable if that name was not installed by nix.
-- if a table of strings, it will disable if any were not.
spec_field = "auto_enable",
set_lazy = false,
modify = function(plugin)
if vim.g.nix_info_plugin_name then
if type(plugin.auto_enable) == "table" then
for _, name in pairs(plugin.auto_enable) do
if not nixInfo.get_nix_plugin_path(name) then
plugin.enabled = false
break
end
end
elseif type(plugin.auto_enable) == "string" then
if not nixInfo.get_nix_plugin_path(plugin.auto_enable) then
plugin.enabled = false
end
elseif type(plugin.auto_enable) == "boolean" and plugin.auto_enable then
if not nixInfo.get_nix_plugin_path(plugin.name) then
plugin.enabled = false
end
end
end
return plugin
end,
},
{
-- we made an options.settings.cats with the value of enable for our top level specs
-- give for_cat = "name" to disable if that one is not enabled
spec_field = "for_cat",
set_lazy = false,
modify = function(plugin)
if vim.g.nix_info_plugin_name then
if type(plugin.for_cat) == "string" then
plugin.enabled = nixInfo(false, "settings", "cats", plugin.for_cat)
end
end
return plugin
end,
},
-- From lzextras. This one makes it so that
-- you can set up lsps within lze specs,
-- and trigger lspconfig setup hooks only on the correct filetypes
-- It is (unfortunately) important that it be registered after the above 2,
-- as it also relies on the modify hook, and the value of enabled at that point
nixInfo.lze.lsp,
}
-- NOTE: This config uses lzextras.lsp handler https://github.com/BirdeeHub/lzextras?tab=readme-ov-file#lsp-handler
-- Because we have the paths, we can set a more performant fallback function
-- for when you don't provide a filetype to trigger on yourself.
-- If you do provide a filetype, this will never be called.
nixInfo.lze.h.lsp.set_ft_fallback(function(name)
local lspcfg = nixInfo.get_nix_plugin_path "nvim-lspconfig"
if lspcfg then
local ok, cfg = pcall(dofile, lspcfg .. "/lsp/" .. name .. ".lua")
return (ok and cfg or {}).filetypes or {}
else
-- the less performant thing we are trying to avoid at startup
return (vim.lsp.config[name] or {}).filetypes or {}
end
end)
require('opts')
require('keys')
require('plugins')