From 26fe71c022816f3c965cc8f518342cdb59f02f67 Mon Sep 17 00:00:00 2001 From: TheGeneralist <180094941+thegeneralist01@users.noreply.github.com> Date: Sun, 3 Aug 2025 14:58:05 +0200 Subject: [PATCH] packages: add libiconv for mac, fix nvim lsp --- modules/common/rust.nix | 41 +- .../nvim/lua/thegeneralist/lazy/lsp.lua | 543 +++++++++--------- 2 files changed, 299 insertions(+), 285 deletions(-) diff --git a/modules/common/rust.nix b/modules/common/rust.nix index 6d1a306..134b8ae 100644 --- a/modules/common/rust.nix +++ b/modules/common/rust.nix @@ -1,16 +1,31 @@ -{ pkgs, ... }: { +{ + pkgs, + lib, + config, + ... +}: +{ # TODO: check these out: https://github.com/RGBCube/ncc/blob/86212e148b2642a51814e873a81be73fbc494e86/modules/common/rust.nix#L15-L24 - environment.systemPackages = with pkgs; [ - (fenix.complete.withComponents [ - "cargo" - "clippy" - "rust-src" - "rustc" - "rustfmt" - ]) - rust-analyzer-nightly + environment = { + variables = { + LIBRARY_PATH = lib.mkIf (!config.onLinux) <| lib.makeLibraryPath [ pkgs.libiconv ]; + }; - nixd - nixfmt-rfc-style - ]; + systemPackages = with pkgs; [ + (fenix.complete.withComponents [ + "cargo" + "clippy" + "rust-src" + "rustc" + "rustfmt" + ]) + rust-analyzer-nightly + + # for nil + nixd + nixfmt-rfc-style + + libiconv + ]; + }; } diff --git a/modules/dotfiles/nvim/lua/thegeneralist/lazy/lsp.lua b/modules/dotfiles/nvim/lua/thegeneralist/lazy/lsp.lua index c7bf665..4437046 100644 --- a/modules/dotfiles/nvim/lua/thegeneralist/lazy/lsp.lua +++ b/modules/dotfiles/nvim/lua/thegeneralist/lazy/lsp.lua @@ -1,287 +1,286 @@ return { - { - "neovim/nvim-lspconfig", - dependencies = { - "saghen/blink.cmp", - -- "folke/neodev.nvim", - "williamboman/mason.nvim", - "mason-org/mason-registry", - "williamboman/mason-lspconfig.nvim", - "hrsh7th/cmp-nvim-lsp", - "hrsh7th/cmp-buffer", - "hrsh7th/cmp-path", - "hrsh7th/cmp-cmdline", - -- "hrsh7th/nvim-cmp", - "L3MON4D3/LuaSnip", - "saadparwaiz1/cmp_luasnip", - "j-hui/fidget.nvim", - }, - config = function() - local lspkind = require("lspkind") - -- local cmp = require("cmp") - -- local cmp_lsp = require("cmp_nvim_lsp") - -- local capabilities = vim.tbl_deep_extend( - -- "force", - -- {}, - -- vim.lsp.protocol.make_client_capabilities(), - -- cmp_lsp.default_capabilities() - -- ) + { + "neovim/nvim-lspconfig", + dependencies = { + "saghen/blink.cmp", + -- "folke/neodev.nvim", + "williamboman/mason.nvim", + "mason-org/mason-registry", + "williamboman/mason-lspconfig.nvim", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "hrsh7th/cmp-cmdline", + -- "hrsh7th/nvim-cmp", + "L3MON4D3/LuaSnip", + "saadparwaiz1/cmp_luasnip", + "j-hui/fidget.nvim", + }, + config = function() + local lspkind = require("lspkind") + -- local cmp = require("cmp") + -- local cmp_lsp = require("cmp_nvim_lsp") + -- local capabilities = vim.tbl_deep_extend( + -- "force", + -- {}, + -- vim.lsp.protocol.make_client_capabilities(), + -- cmp_lsp.default_capabilities() + -- ) - require("fidget").setup({}) - require("mason").setup() + require("fidget").setup({}) + require("mason").setup() - -- local vue_typescript_plugin = require("mason-registry") - -- .get_package("vue-language-server") - -- :get_install_path() .. "/node_modules/@vue/language-server" .. "/node_modules/@vue/typescript-plugin" + -- local vue_typescript_plugin = require("mason-registry") + -- .get_package("vue-language-server") + -- :get_install_path() .. "/node_modules/@vue/language-server" .. "/node_modules/@vue/typescript-plugin" - local capabilities = require("blink.cmp").get_lsp_capabilities() - vim.lsp.enable("nil_ls") - require("mason-lspconfig").setup({ - automatic_enable = true, - ensure_installed = { - "lua_ls", - "rust_analyzer", - "ts_ls", - "cssls", - "tailwindcss", - "pyright", - }, - handlers = { - function(server_name) -- default handler (optional) - -- if server_name == "rust_analyzer" then - -- return - -- end - require("lspconfig")[server_name].setup({ - capabilities = capabilities, - }) - end, + local capabilities = require("blink.cmp").get_lsp_capabilities() + vim.lsp.enable("nil_ls") + require("mason-lspconfig").setup({ + automatic_enable = true, + ensure_installed = { + "lua_ls", + "ts_ls", + "cssls", + "tailwindcss", + "pyright", + }, + handlers = { + function(server_name) -- default handler (optional) + -- if server_name == "rust_analyzer" then + -- return + -- end + require("lspconfig")[server_name].setup({ + capabilities = capabilities, + }) + end, - ["lua_ls"] = function() - local lspconfig = require("lspconfig") - lspconfig.lua_ls.setup({ - capabilities = capabilities, - settings = { - Lua = { - diagnostics = { - globals = { "vim", "it", "describe", "before_each", "after_each" }, - }, - }, - }, - }) - end, + ["lua_ls"] = function() + local lspconfig = require("lspconfig") + lspconfig.lua_ls.setup({ + capabilities = capabilities, + settings = { + Lua = { + diagnostics = { + globals = { "vim", "it", "describe", "before_each", "after_each" }, + }, + }, + }, + }) + end, - ["ts_ls"] = function() - local lspconfig = require("lspconfig") - lspconfig.ts_ls.setup({ - capabilities = capabilities, - -- settings = { - -- }, - -- init_options = { - -- plugins = { - -- { - -- name = "@vue/typescript-plugin", - -- location = vue_typescript_plugin, - -- languages = { "vue" }, - -- }, - -- }, - -- }, - filetypes = { - "javascript", - "javascriptreact", - "javascript.jsx", - "typescript", - "typescriptreact", - "typescript.tsx", - -- "vue", - }, - }) - end, - }, - }) + ["ts_ls"] = function() + local lspconfig = require("lspconfig") + lspconfig.ts_ls.setup({ + capabilities = capabilities, + -- settings = { + -- }, + -- init_options = { + -- plugins = { + -- { + -- name = "@vue/typescript-plugin", + -- location = vue_typescript_plugin, + -- languages = { "vue" }, + -- }, + -- }, + -- }, + filetypes = { + "javascript", + "javascriptreact", + "javascript.jsx", + "typescript", + "typescriptreact", + "typescript.tsx", + -- "vue", + }, + }) + end, + }, + }) - vim.api.nvim_create_autocmd("LspAttach", { - callback = function(args) - local c = vim.lsp.get_client_by_id(args.data.client_id) - if not c then - return - end + vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + local c = vim.lsp.get_client_by_id(args.data.client_id) + if not c then + return + end - if vim.bo.filetype == "lua" then - -- Format the current buffer on save - vim.api.nvim_create_autocmd("BufWritePre", { - buffer = args.buf, - callback = function() - vim.lsp.buf.format({ bufnr = args.buf, id = c.id }) - end, - }) - end - end, - }) + if vim.bo.filetype == "lua" then + -- Format the current buffer on save + vim.api.nvim_create_autocmd("BufWritePre", { + buffer = args.buf, + callback = function() + vim.lsp.buf.format({ bufnr = args.buf, id = c.id }) + end, + }) + end + end, + }) - -- local cmp_select = { behavior = cmp.SelectBehavior.Select } + -- local cmp_select = { behavior = cmp.SelectBehavior.Select } - --- Select item next/prev, taking into account whether the cmp window is - --- top-down or bottoom-up so that the movement is always in the same direction. - -- local select_item_smart = function(dir, opts) - -- return function(fallback) - -- if cmp.visible() then - -- opts = opts or { behavior = cmp.SelectBehavior.Select } - -- if cmp.core.view.custom_entries_view:is_direction_top_down() then - -- ({ next = cmp.select_next_item, prev = cmp.select_prev_item })[dir](opts) - -- else - -- ({ prev = cmp.select_next_item, next = cmp.select_prev_item })[dir](opts) - -- end - -- else - -- fallback() - -- end - -- end - -- end + --- Select item next/prev, taking into account whether the cmp window is + --- top-down or bottoom-up so that the movement is always in the same direction. + -- local select_item_smart = function(dir, opts) + -- return function(fallback) + -- if cmp.visible() then + -- opts = opts or { behavior = cmp.SelectBehavior.Select } + -- if cmp.core.view.custom_entries_view:is_direction_top_down() then + -- ({ next = cmp.select_next_item, prev = cmp.select_prev_item })[dir](opts) + -- else + -- ({ prev = cmp.select_next_item, next = cmp.select_prev_item })[dir](opts) + -- end + -- else + -- fallback() + -- end + -- end + -- end - -- cmp.setup({ - -- snippet = { - -- expand = function(args) - -- require("luasnip").lsp_expand(args.body) -- For `luasnip` users. - -- end, - -- }, - -- completion = { - -- completeopt = "menu,menuone,noinsert", - -- }, - -- -- No idea what this is - -- matching = { - -- disallow_fuzzy_matching = false, - -- disallow_fullfuzzy_matching = false, - -- disallow_partial_fuzzy_matching = false, - -- }, - -- performance = { - -- -- debounce = 50, - -- debounce = 25, - -- -- max_view_entries = 20, - -- }, - -- That crazy window - -- window = { - -- completion = cmp.config.window.bordered({ - -- border = "single", - -- side_padding = 2, - -- col_offset = -3, - -- max_width = 80, - -- }), - -- documentation = cmp.config.window.bordered({ - -- max_width = 50, - -- }), - -- }, - -- mapping = cmp.mapping.preset.insert({ - -- [""] = select_item_smart("prev", cmp_select), - -- [""] = select_item_smart("next", cmp_select), - -- [""] = cmp.mapping.close(), - -- [""] = cmp.mapping.confirm({ select = true }), - -- [""] = cmp.mapping.confirm({ select = true }), - -- [""] = cmp.mapping.complete(), - -- [""] = cmp.mapping.scroll_docs(-3), - -- [""] = cmp.mapping.scroll_docs(3), - -- [""] = cmp.mapping.abort(), - -- }), - -- sorting = { - -- comparators = { - -- cmp.config.compare.locality, - -- cmp.config.compare.offset, - -- cmp.config.compare.recently_used, - -- cmp.config.compare.exact, - -- cmp.config.compare.order, - -- cmp.config.compare.length, - -- function(entry1, entry2) - -- local _, entry1_under = entry1.completion_item.label:find("^_+") - -- local _, entry2_under = entry2.completion_item.label:find("^_+") - -- entry1_under = entry1_under or 0 - -- entry2_under = entry2_under or 0 - -- if entry1_under > entry2_under then - -- return false - -- elseif entry1_under < entry2_under then - -- return true - -- end - -- end, - -- cmp.config.compare.kind, - -- cmp.config.compare.sort_text, - -- }, - -- }, - -- sources = cmp.config.sources({ - -- { name = "neopyter" }, - -- { name = "nvim_lsp" }, - -- { name = "codeium" }, - -- { name = "luasnip" }, -- For luasnip users. - -- }, { - -- { name = "buffer" }, - -- }), - -- formatting = { - -- fields = { - -- "abbr", - -- "kind", - -- "menu", - -- }, - -- expandable_indicator = true, - -- format = lspkind.cmp_format({ - -- mode = "symbol_text", - -- maxwidth = 50, - -- ellipsis_char = "...", - -- menu = { - -- neopyter = "[Neopyter]", - -- }, - -- symbol_map = { - -- -- specific complete item kind icon - -- ["Magic"] = "🪄", - -- ["Path"] = "📁", - -- ["Dict key"] = "🔑", - -- ["Instance"] = "󱃻", - -- ["Statement"] = "󱇯", - -- }, - -- }), - -- }, - -- }) + -- cmp.setup({ + -- snippet = { + -- expand = function(args) + -- require("luasnip").lsp_expand(args.body) -- For `luasnip` users. + -- end, + -- }, + -- completion = { + -- completeopt = "menu,menuone,noinsert", + -- }, + -- -- No idea what this is + -- matching = { + -- disallow_fuzzy_matching = false, + -- disallow_fullfuzzy_matching = false, + -- disallow_partial_fuzzy_matching = false, + -- }, + -- performance = { + -- -- debounce = 50, + -- debounce = 25, + -- -- max_view_entries = 20, + -- }, + -- That crazy window + -- window = { + -- completion = cmp.config.window.bordered({ + -- border = "single", + -- side_padding = 2, + -- col_offset = -3, + -- max_width = 80, + -- }), + -- documentation = cmp.config.window.bordered({ + -- max_width = 50, + -- }), + -- }, + -- mapping = cmp.mapping.preset.insert({ + -- [""] = select_item_smart("prev", cmp_select), + -- [""] = select_item_smart("next", cmp_select), + -- [""] = cmp.mapping.close(), + -- [""] = cmp.mapping.confirm({ select = true }), + -- [""] = cmp.mapping.confirm({ select = true }), + -- [""] = cmp.mapping.complete(), + -- [""] = cmp.mapping.scroll_docs(-3), + -- [""] = cmp.mapping.scroll_docs(3), + -- [""] = cmp.mapping.abort(), + -- }), + -- sorting = { + -- comparators = { + -- cmp.config.compare.locality, + -- cmp.config.compare.offset, + -- cmp.config.compare.recently_used, + -- cmp.config.compare.exact, + -- cmp.config.compare.order, + -- cmp.config.compare.length, + -- function(entry1, entry2) + -- local _, entry1_under = entry1.completion_item.label:find("^_+") + -- local _, entry2_under = entry2.completion_item.label:find("^_+") + -- entry1_under = entry1_under or 0 + -- entry2_under = entry2_under or 0 + -- if entry1_under > entry2_under then + -- return false + -- elseif entry1_under < entry2_under then + -- return true + -- end + -- end, + -- cmp.config.compare.kind, + -- cmp.config.compare.sort_text, + -- }, + -- }, + -- sources = cmp.config.sources({ + -- { name = "neopyter" }, + -- { name = "nvim_lsp" }, + -- { name = "codeium" }, + -- { name = "luasnip" }, -- For luasnip users. + -- }, { + -- { name = "buffer" }, + -- }), + -- formatting = { + -- fields = { + -- "abbr", + -- "kind", + -- "menu", + -- }, + -- expandable_indicator = true, + -- format = lspkind.cmp_format({ + -- mode = "symbol_text", + -- maxwidth = 50, + -- ellipsis_char = "...", + -- menu = { + -- neopyter = "[Neopyter]", + -- }, + -- symbol_map = { + -- -- specific complete item kind icon + -- ["Magic"] = "🪄", + -- ["Path"] = "📁", + -- ["Dict key"] = "🔑", + -- ["Instance"] = "󱃻", + -- ["Statement"] = "󱇯", + -- }, + -- }), + -- }, + -- }) - -- -- menu item highlight - -- vim.api.nvim_set_hl(0, "CmpItemKindMagic", { bg = "NONE", fg = "#D4D434" }) - -- vim.api.nvim_set_hl(0, "CmpItemKindPath", { link = "CmpItemKindFolder" }) - -- vim.api.nvim_set_hl(0, "CmpItemKindDictkey", { link = "CmpItemKindKeyword" }) - -- vim.api.nvim_set_hl(0, "CmpItemKindInstance", { link = "CmpItemKindVariable" }) - -- vim.api.nvim_set_hl(0, "CmpItemKindStatement", { link = "CmpItemKindVariable" }) + -- -- menu item highlight + -- vim.api.nvim_set_hl(0, "CmpItemKindMagic", { bg = "NONE", fg = "#D4D434" }) + -- vim.api.nvim_set_hl(0, "CmpItemKindPath", { link = "CmpItemKindFolder" }) + -- vim.api.nvim_set_hl(0, "CmpItemKindDictkey", { link = "CmpItemKindKeyword" }) + -- vim.api.nvim_set_hl(0, "CmpItemKindInstance", { link = "CmpItemKindVariable" }) + -- vim.api.nvim_set_hl(0, "CmpItemKindStatement", { link = "CmpItemKindVariable" }) - -- vim.diagnostic.config({ - -- -- update_in_insert = true, -- Update diagnostics in Insert mode - -- -- ^ (if false, diagnostics are updated on InsertLeave) - -- - -- underline = true, - -- - -- virtual_text = true, - -- - -- severity_sort = true, -- high -> low - -- - -- -- float = { - -- -- focusable = false, - -- -- style = "minimal", - -- -- border = "rounded", - -- -- source = true, - -- -- header = { "  Diagnostics", "String" }, - -- -- prefix = function(_, _, _) - -- -- return "  ", "String" - -- -- end, - -- -- }, - -- }) + -- vim.diagnostic.config({ + -- -- update_in_insert = true, -- Update diagnostics in Insert mode + -- -- ^ (if false, diagnostics are updated on InsertLeave) + -- + -- underline = true, + -- + -- virtual_text = true, + -- + -- severity_sort = true, -- high -> low + -- + -- -- float = { + -- -- focusable = false, + -- -- style = "minimal", + -- -- border = "rounded", + -- -- source = true, + -- -- header = { "  Diagnostics", "String" }, + -- -- prefix = function(_, _, _) + -- -- return "  ", "String" + -- -- end, + -- -- }, + -- }) - -- treesitter jupyter notebook stuff - -- require("nvim-treesitter.configs").setup({ - -- textobjects = { - -- move = { - -- enable = true, - -- goto_next_start = { - -- ["]j"] = "@cellseparator", - -- ["]c"] = "@cellcontent", - -- }, - -- goto_previous_start = { - -- ["[j"] = "@cellseparator", - -- ["[c"] = "@cellcontent", - -- }, - -- }, - -- }, - -- }) - end, - }, + -- treesitter jupyter notebook stuff + -- require("nvim-treesitter.configs").setup({ + -- textobjects = { + -- move = { + -- enable = true, + -- goto_next_start = { + -- ["]j"] = "@cellseparator", + -- ["]c"] = "@cellcontent", + -- }, + -- goto_previous_start = { + -- ["[j"] = "@cellseparator", + -- ["[c"] = "@cellcontent", + -- }, + -- }, + -- }, + -- }) + end, + }, }