diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 75ee6b713..1c7e9246d 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ -blank_issues_enabled: false +blank_issues_enabled: true contact_links: - name: GitHub Discussions url: https://github.com/ayamir/nvimdots/discussions/new/choose - about: Any issue that does not fall into the above categories shall go here. + about: Any issue that does not fall into the above categories shall go here - name: GitHub Wiki url: https://github.com/ayamir/nvimdots/wiki - about: Make sure you have checked our documentation first. To be explicit, the "Issues" section. + about: Make sure you have checked our documentation first. To be explicit, the "Issues" section \ No newline at end of file diff --git a/README.md b/README.md index 9ce3fc4cf..b93c1ddff 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ NeoVim Version Capability + src="https://img.shields.io/badge/Supports%20Nvim-v0.9-A6D895?style=for-the-badge&colorA=363A4F&logo=neovim&logoColor=D9E0EE"> -| Branch | Completion Solution | -| :----: | :------------------------: | -| main | config for nvim 0.8 stable | -| 0.7 | config for nvim 0.7 stable | +| Branch | Supported neovim version | +| :----: | :----------------------: | +| main | nvim 0.9 stable | +| 0.8 | nvim 0.8 | +| 0.7 | nvim 0.7 | diff --git a/lua/core/init.lua b/lua/core/init.lua index 3b3f75bff..7411191cf 100644 --- a/lua/core/init.lua +++ b/lua/core/init.lua @@ -62,6 +62,9 @@ local disable_distribution_plugins = function() -- Disable sql omni completion. vim.g.loaded_sql_completion = 1 + -- Disable EditorConfig support + vim.g.editorconfig = 1 + -- Disable remote plugins -- NOTE: Disabling rplugin.vim will show error for `wilder.nvim` in :checkhealth, -- NOTE: but since it's config doesn't require python rtp, it's fine to ignore. @@ -112,6 +115,34 @@ local clipboard_config = function() end end +local shell_config = function() + if global.is_windows then + if not (vim.fn.executable("pwsh") or vim.fn.executable("powershell")) then + vim.notify( + [[ +Failed to setup terminal config + +PowerShell is either not installed, missing from PATH, or not executable; +cmd.exe will be used instead for `:!` (shell bang) and toggleterm.nvim. + +You're recommended to install PowerShell for better experience.]], + vim.log.levels.WARN, + { title = "[core] Runtime error" } + ) + return + end + + local basecmd = "-NoLogo -MTA -ExecutionPolicy RemoteSigned" + local ctrlcmd = "-Command [console]::InputEncoding = [console]::OutputEncoding = [System.Text.Encoding]::UTF8" + vim.api.nvim_set_option_value("shell", vim.fn.executable("pwsh") and "pwsh" or "powershell", {}) + vim.api.nvim_set_option_value("shellcmdflag", string.format("%s %s;", basecmd, ctrlcmd), {}) + vim.api.nvim_set_option_value("shellredir", "-RedirectStandardOutput %s -NoNewWindow -Wait", {}) + vim.api.nvim_set_option_value("shellpipe", "2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode", {}) + vim.api.nvim_set_option_value("shellquote", nil, {}) + vim.api.nvim_set_option_value("shellxquote", nil, {}) + end +end + local load_core = function() createdir() disable_distribution_plugins() @@ -119,6 +150,7 @@ local load_core = function() neovide_config() clipboard_config() + shell_config() require("core.options") require("core.mapping") diff --git a/lua/core/mapping.lua b/lua/core/mapping.lua index da5820db7..2103b0f64 100644 --- a/lua/core/mapping.lua +++ b/lua/core/mapping.lua @@ -5,17 +5,14 @@ local map_cmd = bind.map_cmd local core_map = { -- Suckless - ["n|"] = map_cr("normal za"):with_noremap():with_silent():with_desc("editn: Toggle code fold"), - ["n|"] = map_cu("write"):with_noremap():with_silent():with_desc("editn: Save file"), - ["n|"] = map_cmd("execute 'silent! write !sudo tee % >/dev/null' edit!") - :with_silent() - :with_noremap() - :with_desc("editn: Save file using sudo"), - ["n|Y"] = map_cmd("y$"):with_desc("editn: Yank text to EOL"), - ["n|D"] = map_cmd("d$"):with_desc("editn: Delete text to EOL"), - ["n|n"] = map_cmd("nzzzv"):with_noremap():with_desc("editn: Next search result"), - ["n|N"] = map_cmd("Nzzzv"):with_noremap():with_desc("editn: Prev search result"), - ["n|J"] = map_cmd("mzJ`z"):with_noremap():with_desc("editn: Join next line"), + ["n|"] = map_cr("normal za"):with_noremap():with_silent():with_desc("edit: Toggle code fold"), + ["n|"] = map_cu("write"):with_noremap():with_silent():with_desc("edit: Save file"), + ["n|Y"] = map_cmd("y$"):with_desc("edit: Yank text to EOL"), + ["n|D"] = map_cmd("d$"):with_desc("edit: Delete text to EOL"), + ["n|n"] = map_cmd("nzzzv"):with_noremap():with_desc("edit: Next search result"), + ["n|N"] = map_cmd("Nzzzv"):with_noremap():with_desc("edit: Prev search result"), + ["n|J"] = map_cmd("mzJ`z"):with_noremap():with_desc("edit: Join next line"), + ["n|"] = map_cr("noh"):with_noremap():with_silent():with_desc("edit: Clear search highlight"), ["n|"] = map_cmd("h"):with_noremap():with_desc("window: Focus left"), ["n|"] = map_cmd("l"):with_noremap():with_desc("window: Focus right"), ["n|"] = map_cmd("j"):with_noremap():with_desc("window: Focus down"), @@ -28,30 +25,34 @@ local core_map = { ["n|"] = map_cr("vertical resize +5"):with_silent():with_desc("window: Resize +5 vertically"), ["n|"] = map_cr("resize -2"):with_silent():with_desc("window: Resize -2 horizontally"), ["n|"] = map_cr("resize +2"):with_silent():with_desc("window: Resize +2 horizontally"), - ["n|"] = map_cmd(":wq"):with_desc("editn: Save file and quit"), - ["n|"] = map_cmd(":q!"):with_desc("editn: Force quit"), - ["n|o"] = map_cr("setlocal spell! spelllang=en_us"):with_desc("editn: Toggle spell check"), + ["n|"] = map_cr("wq"):with_desc("edit: Save file and quit"), + ["n|"] = map_cr("q!"):with_desc("edit: Force quit"), + ["n|o"] = map_cr("setlocal spell! spelllang=en_us"):with_desc("edit: Toggle spell check"), + ["n|tn"] = map_cr("tabnew"):with_noremap():with_silent():with_desc("tab: Create a new tab"), + ["n|tk"] = map_cr("tabnext"):with_noremap():with_silent():with_desc("tab: Move to next tab"), + ["n|tj"] = map_cr("tabprevious"):with_noremap():with_silent():with_desc("tab: Move to previous tab"), + ["n|to"] = map_cr("tabonly"):with_noremap():with_silent():with_desc("tab: Only keep current tab"), -- Insert mode - ["i|"] = map_cmd("u"):with_noremap():with_desc("editi: Delete previous block"), - ["i|"] = map_cmd(""):with_noremap():with_desc("editi: Move cursor to left"), - ["i|"] = map_cmd("^i"):with_noremap():with_desc("editi: Move cursor to line start"), - ["i|"] = map_cmd(":w"):with_desc("editi: Save file"), - ["i|"] = map_cmd(":wq"):with_desc("editi: Save file and quit"), + ["i|"] = map_cmd("u"):with_noremap():with_desc("edit: Delete previous block"), + ["i|"] = map_cmd(""):with_noremap():with_desc("edit: Move cursor to left"), + ["i|"] = map_cmd("^i"):with_noremap():with_desc("edit: Move cursor to line start"), + ["i|"] = map_cmd(":w"):with_desc("edit: Save file"), + ["i|"] = map_cmd(":wq"):with_desc("edit: Save file and quit"), -- Command mode - ["c|"] = map_cmd(""):with_noremap():with_desc("editc: Left"), - ["c|"] = map_cmd(""):with_noremap():with_desc("editc: Right"), - ["c|"] = map_cmd(""):with_noremap():with_desc("editc: Home"), - ["c|"] = map_cmd(""):with_noremap():with_desc("editc: End"), - ["c|"] = map_cmd(""):with_noremap():with_desc("editc: Delete"), - ["c|"] = map_cmd(""):with_noremap():with_desc("editc: Backspace"), + ["c|"] = map_cmd(""):with_noremap():with_desc("edit: Left"), + ["c|"] = map_cmd(""):with_noremap():with_desc("edit: Right"), + ["c|"] = map_cmd(""):with_noremap():with_desc("edit: Home"), + ["c|"] = map_cmd(""):with_noremap():with_desc("edit: End"), + ["c|"] = map_cmd(""):with_noremap():with_desc("edit: Delete"), + ["c|"] = map_cmd(""):with_noremap():with_desc("edit: Backspace"), ["c|"] = map_cmd([[=expand("%:p:h") . "/" ]]) :with_noremap() - :with_desc("editc: Complete path of current file"), + :with_desc("edit: Complete path of current file"), -- Visual mode - ["v|J"] = map_cmd(":m '>+1gv=gv"):with_desc("editv: Move this line down"), - ["v|K"] = map_cmd(":m '<-2gv=gv"):with_desc("editv: Move this line up"), - ["v|<"] = map_cmd(""] = map_cmd(">gv"):with_desc("editv: Increase indent"), + ["v|J"] = map_cmd(":m '>+1gv=gv"):with_desc("edit: Move this line down"), + ["v|K"] = map_cmd(":m '<-2gv=gv"):with_desc("edit: Move this line up"), + ["v|<"] = map_cmd(""] = map_cmd(">gv"):with_desc("edit: Increase indent"), } bind.nvim_load_mapping(core_map) diff --git a/lua/core/options.lua b/lua/core/options.lua index 2462f1252..647a25005 100644 --- a/lua/core/options.lua +++ b/lua/core/options.lua @@ -25,7 +25,7 @@ local function load_options() conceallevel = 0, cursorcolumn = true, cursorline = true, - diffopt = "filler,iwhite,internal,algorithm:patience", + diffopt = "filler,iwhite,internal,linematch:60,algorithm:patience", display = "lastline", encoding = "utf-8", equalalways = false, @@ -58,7 +58,7 @@ local function load_options() relativenumber = true, ruler = true, scrolloff = 2, - sessionoptions = "curdir,help,tabpages,winsize", + sessionoptions = "buffers,curdir,help,tabpages,winsize", shada = "!,'300,<50,@100,s10,h", shiftround = true, shiftwidth = 4, @@ -73,6 +73,7 @@ local function load_options() smarttab = true, softtabstop = 4, splitbelow = true, + splitkeep = "cursor", splitright = true, startofline = false, swapfile = false, @@ -124,7 +125,7 @@ local function load_options() -- Fix sqlite3 missing-lib issue on Windows if global.is_windows then -- Download the DLLs form https://www.sqlite.org/download.html - vim.g.sqlite_clib_path = global.home .. "/Documents/sqlite-dll-win64-x64-3400100/sqlite3.dll" + vim.g.sqlite_clib_path = global.home .. "/Documents/sqlite-dll-win64-x64-3400200/sqlite3.dll" end end diff --git a/lua/core/settings.lua b/lua/core/settings.lua index 6b834a6ee..a1250fd0e 100644 --- a/lua/core/settings.lua +++ b/lua/core/settings.lua @@ -32,6 +32,10 @@ settings["palette_overwrite"] = {} ---@type string settings["colorscheme"] = "catppuccin" +-- Set it to true if your terminal has transparent background. +---@type boolean +settings["transparent_background"] = false + -- Set background color to use here. -- Useful if you would like to use a colorscheme that has a light and dark variant like `edge`. -- Valid values are: `dark`, `light`. @@ -79,7 +83,6 @@ settings["lsp_deps"] = { settings["null_ls_deps"] = { "black", "clang_format", - "editorconfig_checker", "prettier", "rustfmt", "shfmt", diff --git a/lua/keymap/editor.lua b/lua/keymap/editor.lua index b98235aaf..37f56aeab 100644 --- a/lua/keymap/editor.lua +++ b/lua/keymap/editor.lua @@ -84,6 +84,9 @@ local plug_map = { -- Plugin: tabout ["i|"] = map_cmd("(TaboutMulti)"):with_silent():with_noremap():with_desc("edit: Goto end of pair"), ["i|"] = map_cmd("(TaboutBackMulti)"):with_silent():with_noremap():with_desc("edit: Goto begin of pair"), + + -- Plugin suda.vim + ["n|"] = map_cu("SudaWrite"):with_silent():with_noremap():with_desc("editn: Save file using sudo"), } bind.nvim_load_mapping(plug_map) diff --git a/lua/modules/configs/completion/cmp.lua b/lua/modules/configs/completion/cmp.lua index 6c134d298..b83b1843e 100644 --- a/lua/modules/configs/completion/cmp.lua +++ b/lua/modules/configs/completion/cmp.lua @@ -41,7 +41,35 @@ return function() return (diff < 0) end - local lspkind = require("lspkind") + local function cmp_format(opts) + opts = opts or {} + + return function(entry, vim_item) + if opts.before then + vim_item = opts.before(entry, vim_item) + end + + local kind_symbol = opts.symbol_map[vim_item.kind] or icons.kind.Undefined + local source_symbol = opts.symbol_map[entry.source.name] or icons.cmp.undefined + + vim_item.menu = " " .. source_symbol .. " |" + vim_item.kind = string.format(" 〔 %s %s 〕", kind_symbol, vim_item.kind) + + if opts.maxwidth ~= nil then + if opts.ellipsis_char == nil then + vim_item.abbr = string.sub(vim_item.abbr, 1, opts.maxwidth) + else + local label = vim_item.abbr + local truncated_label = vim.fn.strcharpart(label, 0, opts.maxwidth) + if truncated_label ~= label then + vim_item.abbr = truncated_label .. opts.ellipsis_char + end + end + end + return vim_item + end + end + local cmp = require("cmp") cmp.setup({ @@ -72,16 +100,13 @@ return function() }, }, formatting = { - fields = { "kind", "abbr", "menu" }, + fields = { "menu", "abbr", "kind" }, format = function(entry, vim_item) - local kind = lspkind.cmp_format({ - mode = "symbol_text", + local kind_map = vim.tbl_deep_extend("force", icons.kind, icons.type, icons.cmp) + local kind = cmp_format({ maxwidth = 50, - symbol_map = vim.tbl_deep_extend("force", icons.kind, icons.type, icons.cmp), + symbol_map = kind_map, })(entry, vim_item) - local strings = vim.split(kind.kind, "%s", { trimempty = true }) - kind.kind = " " .. strings[1] .. " " - kind.menu = " (" .. strings[2] .. ")" return kind end, }, @@ -123,7 +148,17 @@ return function() { name = "nvim_lua" }, { name = "luasnip" }, { name = "path" }, - { name = "treesitter" }, + { + name = "treesitter", + entry_filter = function(entry) + local ignore_list = { + "Error", + "Comment", + } + local kind = entry:get_completion_item().cmp.kind_text + return not vim.tbl_contains(ignore_list, kind) + end, + }, { name = "spell" }, { name = "tmux" }, { name = "orgmode" }, diff --git a/lua/modules/configs/completion/formatting.lua b/lua/modules/configs/completion/formatting.lua index 66b7bbd5e..42dfe4c3d 100644 --- a/lua/modules/configs/completion/formatting.lua +++ b/lua/modules/configs/completion/formatting.lua @@ -15,7 +15,7 @@ vim.api.nvim_create_user_command("FormatterToggleFt", function(opts) vim.notify( string.format("[LSP] Formatter for [%s] has been recorded in list and disabled.", opts.args), vim.log.levels.WARN, - { title = "LSP Formatter Warning!" } + { title = "LSP Formatter Warning" } ) block_list[opts.args] = true else @@ -39,14 +39,17 @@ function M.enable_format_on_save(is_configured) group = "format_on_save", pattern = opts.pattern, callback = function() - require("completion.formatting").format({ timeout_ms = opts.timeout, filter = M.format_filter }) + require("completion.formatting").format({ + timeout_ms = opts.timeout, + filter = M.format_filter, + }) end, }) if not is_configured then vim.notify( "Successfully enabled format-on-save", vim.log.levels.INFO, - { title = "Settings modification success!" } + { title = "Settings modification success" } ) end end @@ -54,7 +57,11 @@ end function M.disable_format_on_save() pcall(vim.api.nvim_del_augroup_by_name, "format_on_save") if format_on_save then - vim.notify("Disabled format-on-save", vim.log.levels.INFO, { title = "Settings modification success!" }) + vim.notify( + "Successfully disabled format-on-save", + vim.log.levels.INFO, + { title = "Settings modification success" } + ) end end @@ -95,6 +102,11 @@ function M.format(opts) local cwd = vim.fn.getcwd() for i = 1, #disabled_workspaces do if cwd.find(cwd, disabled_workspaces[i]) ~= nil then + vim.notify( + string.format("[LSP] Formatting support for all files under [%s] is disabled.", disabled_workspaces[i]), + vim.log.levels.WARN, + { title = "LSP Formatter Warning" } + ) return end end @@ -122,7 +134,7 @@ function M.format(opts) vim.notify( "[LSP] Format request failed, no matching language servers.", vim.log.levels.WARN, - { title = "Formatting Failed!" } + { title = "Formatting Failed" } ) end @@ -136,7 +148,7 @@ function M.format(opts) vim.bo.filetype ), vim.log.levels.WARN, - { title = "LSP Formatter Warning!" } + { title = "LSP Formatter Warning" } ) return end @@ -145,15 +157,15 @@ function M.format(opts) if result and result.result then vim.lsp.util.apply_text_edits(result.result, bufnr, client.offset_encoding) vim.notify( - string.format("[LSP] Format successfully with [%s]!", client.name), + string.format("[LSP] Format successfully with %s!", client.name), vim.log.levels.INFO, - { title = "LSP Format Success!" } + { title = "LSP Format Success" } ) elseif err then vim.notify( string.format("[LSP][%s] %s", client.name, err), vim.log.levels.ERROR, - { title = "LSP Format Error!" } + { title = "LSP Format Error" } ) end end diff --git a/lua/modules/configs/completion/lspsaga.lua b/lua/modules/configs/completion/lspsaga.lua index 7bf4aab99..feb371ef6 100644 --- a/lua/modules/configs/completion/lspsaga.lua +++ b/lua/modules/configs/completion/lspsaga.lua @@ -119,6 +119,7 @@ return function() frequency = 12, }, ui = { + title = false, border = "single", -- Can be single, double, rounded, solid, shadow. winblend = 0, actionfix = icons.ui.Spell, diff --git a/lua/modules/configs/editor/suda.lua b/lua/modules/configs/editor/suda.lua new file mode 100644 index 000000000..bf77b65b1 --- /dev/null +++ b/lua/modules/configs/editor/suda.lua @@ -0,0 +1,3 @@ +return function() + vim.g["suda#prompt"] = "Enter administrator password: " +end diff --git a/lua/modules/configs/tool/project.lua b/lua/modules/configs/tool/project.lua index 281f1a25e..153d023ee 100644 --- a/lua/modules/configs/tool/project.lua +++ b/lua/modules/configs/tool/project.lua @@ -3,7 +3,7 @@ return function() manual_mode = false, detection_methods = { "lsp", "pattern" }, patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json" }, - ignore_lsp = { "efm", "copilot" }, + ignore_lsp = { "null-ls", "copilot" }, exclude_dirs = {}, show_hidden = false, silent_chdir = true, diff --git a/lua/modules/configs/ui/alpha.lua b/lua/modules/configs/ui/alpha.lua index ddd22a5dd..aad83724d 100644 --- a/lua/modules/configs/ui/alpha.lua +++ b/lua/modules/configs/ui/alpha.lua @@ -1,6 +1,7 @@ return function() local alpha = require("alpha") local dashboard = require("alpha.themes.dashboard") + require("modules.utils").gen_alpha_hl() dashboard.section.header.val = { [[⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]], @@ -23,7 +24,7 @@ return function() [[⠿⠛⠛⠛⠛⠛⠛⠻⢿⣿⣿⣿⣿⣯⣟⠷⢷⣿⡿⠋⠀⠀⠀⠀⣵⡀⢠⡿⠋⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]], [[⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠛⢿⣿⣿⠂⠀⠀⠀⠀⠀⢀⣽⣿⣿⣿⣿⣿⣿⣿⣍⠛⠿⣿⣿⣿⣿⣿⣿]], } - dashboard.section.header.opts.hl = "Type" + dashboard.section.header.opts.hl = "AlphaHeader" local function button(sc, txt, leader_txt, keybind, keybind_opts) local sc_after = sc:gsub("%s", ""):gsub(leader_txt, "") @@ -34,7 +35,8 @@ return function() cursor = 5, width = 50, align_shortcut = "right", - hl_shortcut = "Keyword", + hl = "AlphaButton", + hl_shortcut = "AlphaAttr", } if nil == keybind then @@ -116,7 +118,7 @@ return function() end, }), } - dashboard.section.buttons.opts.hl = "String" + dashboard.section.buttons.opts.hl = "AlphaButton" local function footer() local stats = require("lazy").stats() @@ -136,7 +138,7 @@ return function() end dashboard.section.footer.val = footer() - dashboard.section.footer.opts.hl = "Function" + dashboard.section.footer.opts.hl = "AlphaFooter" local head_butt_padding = 2 local occu_height = #dashboard.section.header.val + 2 * #dashboard.section.buttons.val + head_butt_padding diff --git a/lua/modules/configs/ui/bufferline.lua b/lua/modules/configs/ui/bufferline.lua index d2045fa50..68f76f426 100644 --- a/lua/modules/configs/ui/bufferline.lua +++ b/lua/modules/configs/ui/bufferline.lua @@ -14,7 +14,6 @@ return function() color_icons = true, show_buffer_icons = true, show_buffer_close_icons = true, - show_buffer_default_icon = true, show_close_icon = true, show_tab_indicators = true, enforce_regular_tabs = true, diff --git a/lua/modules/configs/ui/catppuccin.lua b/lua/modules/configs/ui/catppuccin.lua index db7c632ba..6cb07aa21 100644 --- a/lua/modules/configs/ui/catppuccin.lua +++ b/lua/modules/configs/ui/catppuccin.lua @@ -1,6 +1,4 @@ return function() - local transparent_background = false -- Set background transparency here! - require("catppuccin").setup({ flavour = "mocha", -- Can be one of: latte, frappe, macchiato, mocha background = { light = "latte", dark = "mocha" }, @@ -11,7 +9,7 @@ return function() shade = "dark", percentage = 0.15, }, - transparent_background = transparent_background, + transparent_background = require("core.settings").transparent_background, show_end_of_buffer = false, -- show the '~' characters after the end of buffers term_colors = true, compile_path = vim.fn.stdpath("cache") .. "/catppuccin", @@ -77,7 +75,7 @@ return function() nvimtree = true, overseer = false, pounce = false, - semantic_tokens = false, + semantic_tokens = true, symbols_outline = false, telekasten = false, telescope = true, @@ -150,6 +148,17 @@ return function() -- For trouble.nvim TroubleNormal = { bg = cp.base }, + -- For lsp semantic tokens + ["@lsp.type.comment"] = { fg = cp.overlay0 }, + ["@lsp.type.enum"] = { link = "@type" }, + ["@lsp.type.property"] = { link = "@property" }, + ["@lsp.type.macro"] = { link = "@constant" }, + ["@lsp.typemod.function.defaultLibrary"] = { fg = cp.blue, style = { "bold", "italic" } }, + ["@lsp.typemod.function.defaultLibrary.c"] = { fg = cp.blue, style = { "bold" } }, + ["@lsp.typemod.function.defaultLibrary.cpp"] = { fg = cp.blue, style = { "bold" } }, + ["@lsp.typemod.method.defaultLibrary"] = { link = "@lsp.typemod.function.defaultLibrary" }, + ["@lsp.typemod.variable.defaultLibrary"] = { fg = cp.flamingo }, + -- For treesitter. ["@field"] = { fg = cp.rosewater }, ["@property"] = { fg = cp.yellow }, diff --git a/lua/modules/configs/ui/edge.lua b/lua/modules/configs/ui/edge.lua index 216899a8e..6f63356be 100644 --- a/lua/modules/configs/ui/edge.lua +++ b/lua/modules/configs/ui/edge.lua @@ -4,5 +4,5 @@ return function() vim.g.edge_disable_italic_comment = 1 vim.g.edge_show_eob = 1 vim.g.edge_better_performance = 1 - vim.g.edge_transparent_background = 1 + vim.g.edge_transparent_background = require("core.settings").transparent_background and 2 or 0 end diff --git a/lua/modules/configs/ui/nord.lua b/lua/modules/configs/ui/nord.lua index 522d3f7c0..17f535539 100644 --- a/lua/modules/configs/ui/nord.lua +++ b/lua/modules/configs/ui/nord.lua @@ -2,7 +2,7 @@ return function() vim.g.nord_contrast = true vim.g.nord_borders = false vim.g.nord_cursorline_transparent = true - vim.g.nord_disable_background = false + vim.g.nord_disable_background = require("core.settings").transparent_background vim.g.nord_enable_sidebar_background = true vim.g.nord_italic = true end diff --git a/lua/modules/configs/ui/paint.lua b/lua/modules/configs/ui/paint.lua index 1fda36cb1..434355659 100644 --- a/lua/modules/configs/ui/paint.lua +++ b/lua/modules/configs/ui/paint.lua @@ -12,7 +12,7 @@ return function() }, { filter = { filetype = "python" }, - pattern = "%s*(%w+:)", + pattern = "%s*([_%w]+:)", hl = "Constant", }, }, diff --git a/lua/modules/plugins/completion.lua b/lua/modules/plugins/completion.lua index 2487742c0..3ed980d0d 100644 --- a/lua/modules/plugins/completion.lua +++ b/lua/modules/plugins/completion.lua @@ -9,7 +9,7 @@ completion["neovim/nvim-lspconfig"] = { { "williamboman/mason.nvim" }, { "williamboman/mason-lspconfig.nvim" }, { - "glepnir/lspsaga.nvim", + "nvimdev/lspsaga.nvim", config = require("completion.lspsaga"), }, }, @@ -33,7 +33,6 @@ completion["hrsh7th/nvim-cmp"] = { dependencies = { "rafamadriz/friendly-snippets" }, config = require("completion.luasnip"), }, - { "onsails/lspkind.nvim" }, { "lukas-reineke/cmp-under-comparator" }, { "saadparwaiz1/cmp_luasnip" }, { "hrsh7th/cmp-nvim-lsp" }, @@ -43,7 +42,7 @@ completion["hrsh7th/nvim-cmp"] = { { "f3fora/cmp-spell" }, { "hrsh7th/cmp-buffer" }, { "kdheepak/cmp-latex-symbols" }, - { "ray-x/cmp-treesitter", commit = "c8e3a74" }, + { "ray-x/cmp-treesitter" }, -- { "tzachar/cmp-tabnine", build = "./install.sh", config = require("completion.tabnine") }, -- { -- "jcdickinson/codeium.nvim", diff --git a/lua/modules/plugins/editor.lua b/lua/modules/plugins/editor.lua index bbba26665..88fe34965 100644 --- a/lua/modules/plugins/editor.lua +++ b/lua/modules/plugins/editor.lua @@ -58,14 +58,15 @@ editor["RRethy/vim-illuminate"] = { event = { "CursorHold", "CursorHoldI" }, config = require("editor.vim-illuminate"), } -editor["luukvbaal/stabilize.nvim"] = { - lazy = true, - event = "BufReadPost", -} editor["romainl/vim-cool"] = { lazy = true, event = { "CursorMoved", "InsertEnter" }, } +editor["lambdalisue/suda.vim"] = { + lazy = true, + cmd = { "SudaRead", "SudaWrite" }, + config = require("editor.suda"), +} ---------------------------------------------------------------------- --  :treesitter related plugins -- diff --git a/lua/modules/plugins/ui.lua b/lua/modules/plugins/ui.lua index 1957421dd..dc203ef8f 100644 --- a/lua/modules/plugins/ui.lua +++ b/lua/modules/plugins/ui.lua @@ -21,7 +21,7 @@ ui["sainnhe/edge"] = { } ui["j-hui/fidget.nvim"] = { lazy = true, - event = "BufReadPost", + event = "LspAttach", config = require("ui.fidget"), } ui["lewis6991/gitsigns.nvim"] = { diff --git a/lua/modules/utils/icons.lua b/lua/modules/utils/icons.lua index c59b14975..3d5703e67 100644 --- a/lua/modules/utils/icons.lua +++ b/lua/modules/utils/icons.lua @@ -28,6 +28,7 @@ local data = { Text = "", TypeParameter = "", Unit = "", + Undefined = "", Value = "", Variable = "", -- ccls-specific icons. @@ -162,15 +163,23 @@ local data = { cmp = { Codeium = "", TabNine = "", - Copilot = "", - Copilot_alt = "", + Copilot = "", + -- Add source-specific icons here + buffer = "", + cmp_tabnine = "", + codeium = "", + copilot = "", + copilot_alt = "", + latex_symbols = "", + luasnip = "", nvim_lsp = "", nvim_lua = "", + orgmode = "", path = "", - buffer = "", spell = "暈", - luasnip = "", + tmux = "", treesitter = "", + undefined = "", }, dap = { Breakpoint = "", diff --git a/lua/modules/utils/init.lua b/lua/modules/utils/init.lua index 26c91af3a..47da69d8e 100644 --- a/lua/modules/utils/init.lua +++ b/lua/modules/utils/init.lua @@ -80,44 +80,6 @@ local function hexToRgb(c) return { tonumber(c:sub(2, 3), 16), tonumber(c:sub(4, 5), 16), tonumber(c:sub(6, 7), 16) } end ----Parse the `style` string into nvim_set_hl options ----@param style string @The style config ----@return table -local function parse_style(style) - if not style or style == "NONE" then - return {} - end - - local result = {} - for field in string.gmatch(style, "([^,]+)") do - result[field] = true - end - - return result -end - ----Wrapper function for nvim_get_hl_by_name ----@param hl_group string @Highlight group name ----@return table -local function get_highlight(hl_group) - local hl = vim.api.nvim_get_hl_by_name(hl_group, true) - if hl.link then - return get_highlight(hl.link) - end - - local result = parse_style(hl.style) - result.fg = hl.foreground and string.format("#%06x", hl.foreground) - result.bg = hl.background and string.format("#%06x", hl.background) - result.sp = hl.special and string.format("#%06x", hl.special) - for attr, val in pairs(hl) do - if type(attr) == "string" and attr ~= "foreground" and attr ~= "background" and attr ~= "special" then - result[attr] = val - end - end - - return result -end - ---Blend foreground with background ---@param foreground string @The foreground color ---@param background string @The background color to blend with @@ -143,10 +105,10 @@ end ---@return string function M.hl_to_rgb(hl_group, use_bg, fallback_hl) local hex = fallback_hl or "#000000" - local hlexists = pcall(vim.api.nvim_get_hl_by_name, hl_group, true) + local hlexists = pcall(vim.api.nvim_get_hl, 0, { name = hl_group, link = false }) if hlexists then - local result = get_highlight(hl_group) + local result = vim.api.nvim_get_hl(0, { name = hl_group, link = false }) if use_bg then hex = result.bg and result.bg or "NONE" else @@ -161,12 +123,12 @@ end ---@param name string @Target highlight group name ---@param def table @Attributes to be extended function M.extend_hl(name, def) - local hlexists = pcall(vim.api.nvim_get_hl_by_name, name, true) + local hlexists = pcall(vim.api.nvim_get_hl, 0, { name = name, link = false }) if not hlexists then -- Do nothing if highlight group not found return end - local current_def = get_highlight(name) + local current_def = vim.api.nvim_get_hl(0, { name = name, link = false }) local combined_def = vim.tbl_deep_extend("force", current_def, def) vim.api.nvim_set_hl(0, name, combined_def) @@ -183,6 +145,7 @@ function M.get_palette(overwrite) end end +-- Generate highlight groups for lspsaga. Existing attributes will NOT be overwritten function M.gen_lspkind_hl() local colors = M.get_palette() local dat = { @@ -227,6 +190,16 @@ function M.gen_lspkind_hl() end end +-- Generate highlight groups for alpha. Existing attributes will NOT be overwritten +function M.gen_alpha_hl() + local colors = M.get_palette() + + vim.api.nvim_set_hl(0, "AlphaHeader", { fg = colors.blue, default = true }) + vim.api.nvim_set_hl(0, "AlphaButton", { fg = colors.green, default = true }) + vim.api.nvim_set_hl(0, "AlphaAttr", { fg = colors.pink, italic = true, default = true }) + vim.api.nvim_set_hl(0, "AlphaFooter", { fg = colors.yellow, default = true }) +end + ---Convert number (0/1) to boolean ---@param value number @The value to check ---@return boolean|nil @Returns nil if failed diff --git a/scripts/install.ps1 b/scripts/install.ps1 index a5984c613..827c78a73 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -8,12 +8,13 @@ Set-StrictMode -Version 3.0 $ErrorActionPreference = "Stop" # Exit when command fails # global-scope vars -$REQUIRED_NVIM_VERSION = [version]'0.8.0' +$REQUIRED_NVIM_VERSION = [version]'0.9.0' +$REQUIRED_NVIM_VERSION_LEGACY = [version]'0.8.0' $USE_SSH = $True # package mgr vars -$choco_package_matrix = @{ "gcc" = "mingw"; "git" = "git"; "nvim" = "neovim"; "make" = "make"; "node" = "nodejs"; "pip" = "python3"; "fzf" = "fzf"; "rg" = "ripgrep"; "go" = "go"; "curl" = "curl"; "wget" = "wget"; "tree-sitter" = "tree-sitter"; "ruby" = "ruby"; "sqlite3" = "sqlite"; "rustc" = "rust-ms" } -$scoop_package_matrix = @{ "gcc" = "mingw"; "git" = "git"; "nvim" = "neovim"; "make" = "make"; "node" = "nodejs"; "pip" = "python"; "fzf" = "fzf"; "rg" = "ripgrep"; "go" = "go"; "curl" = "curl"; "wget" = "wget"; "tree-sitter" = "tree-sitter"; "ruby" = "ruby"; "sqlite3" = "sqlite"; "rustc" = "rust" } +$choco_package_matrix = @{ "gcc" = "mingw"; "git" = "git"; "nvim" = "neovim"; "make" = "make"; "sudo" = "psutils"; "node" = "nodejs"; "pip" = "python3"; "fzf" = "fzf"; "rg" = "ripgrep"; "go" = "go"; "curl" = "curl"; "wget" = "wget"; "tree-sitter" = "tree-sitter"; "ruby" = "ruby"; "sqlite3" = "sqlite"; "rustc" = "rust-ms" } +$scoop_package_matrix = @{ "gcc" = "mingw"; "git" = "git"; "nvim" = "neovim"; "make" = "make"; "sudo" = "psutils"; "node" = "nodejs"; "pip" = "python"; "fzf" = "fzf"; "rg" = "ripgrep"; "go" = "go"; "curl" = "curl"; "wget" = "wget"; "tree-sitter" = "tree-sitter"; "ruby" = "ruby"; "sqlite3" = "sqlite"; "rustc" = "rust" } $installer_pkg_matrix = @{ "NodeJS" = "npm"; "Python" = "pip"; "Ruby" = "gem" } # env vars @@ -58,6 +59,7 @@ function info_ext ([Parameter(Mandatory = $True)][ValidateNotNullOrEmpty()] [str function warn ([Parameter(Mandatory = $True)][ValidateNotNullOrEmpty()] [string]$Msg) { Write-Host "Warning" -ForegroundColor Yellow -NoNewline; Write-Host ": $(_chomp -Str $Msg)"; } + function warn_ext ([Parameter(Mandatory = $True)][ValidateNotNullOrEmpty()] [string]$Msg) { Write-Host " $(_chomp -Str $Msg)" } @@ -254,6 +256,7 @@ function fetch_deps { check_and_fetch_exec -PkgName "git" check_and_fetch_exec -PkgName "nvim" check_and_fetch_exec -PkgName "make" + check_and_fetch_exec -PkgName "sudo" check_and_fetch_exec -PkgName "node" check_and_fetch_exec -PkgName "pip" check_and_fetch_exec -PkgName "fzf" @@ -270,14 +273,14 @@ function fetch_deps { $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") } -function is_latest { +function check_nvim_version ([Parameter(Mandatory = $True)][ValidateNotNullOrEmpty()] [version]$RequiredVersionMin) { $nvim_version = Invoke-Command -ErrorAction SilentlyContinue -ScriptBlock { nvim --version } # First get neovim version $nvim_version = $nvim_version.Split([System.Environment]::NewLine) | Select-Object -First 1 # Then do head -n1 $nvim_version = $nvim_version.Split('-') | Select-Object -First 1 # Special for dev branches $nvim_version = $nvim_version -replace '[^(\d+(\.\d+)*)]','' # Then do regex replacement similar to sed $nvim_version = [version]$nvim_version - return ($nvim_version -ge $REQUIRED_NVIM_VERSION) + return ($nvim_version -ge $RequiredVersionMin) } function ring_bell { @@ -311,7 +314,7 @@ function _main { # Check dependencies if (-not (check_in_path -WithName "nvim")) { _abort -Msg "Required executable not found." -Type "NotInstalled" -Info_msg @' -You must install NeoVim before installing this Nvim config. See: +You must install Neovim before installing this Nvim config. See: https://github.com/neovim/neovim/wiki/Installing-Neovim ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ [INFO] "nvim" is either not installed, missing from PATH, or not executable. @@ -351,20 +354,34 @@ You must install Git before installing this Nvim config. See: info -Msg "Fetching in progress..." if ($USE_SSH) { - if ((is_latest)) { + if ((check_nvim_version -RequiredVersionMin $REQUIRED_NVIM_VERSION)) { safe_execute -WithCmd { git clone --progress -b "$env:CCLONE_BRANCH" "$env:CCLONE_ATTR" 'git@github.com:ayamir/nvimdots.git' "$env:CCDEST_DIR" } - } else { + } elseif ((check_nvim_version -RequiredVersionMin $REQUIRED_NVIM_VERSION_LEGACY)) { warn -Msg "You have outdated Nvim installed (< $REQUIRED_NVIM_VERSION)." - info -Msg "Automatically redirecting you to legacy version..." - safe_execute -WithCmd { git clone --progress -b 0.7 "$env:CCLONE_ATTR" 'git@github.com:ayamir/nvimdots.git' "$env:CCDEST_DIR" } + info -Msg "Automatically redirecting you to the latest compatible version..." + safe_execute -WithCmd { git clone --progress -b 0.8 "$env:CCLONE_ATTR" 'git@github.com:ayamir/nvimdots.git' "$env:CCDEST_DIR" } + } else { + warn -Msg "You have outdated Nvim installed (< $REQUIRED_NVIM_VERSION_LEGACY)." + _abort -Msg "This Neovim distribution is no longer supported." -Type "NotImplemented" -Info_msg @" +You have a legacy Neovim distribution installed. +Please make sure you have nvim v$REQUIRED_NVIM_VERSION_LEGACY installed at the very least. + +"@ } } else { - if ((is_latest)) { + if ((check_nvim_version -RequiredVersionMin $REQUIRED_NVIM_VERSION)) { safe_execute -WithCmd { git clone --progress -b "$env:CCLONE_BRANCH" "$env:CCLONE_ATTR" 'https://github.com/ayamir/nvimdots.git' "$env:CCDEST_DIR" } - } else { + } elseif ((check_nvim_version -RequiredVersionMin $REQUIRED_NVIM_VERSION_LEGACY)) { warn -Msg "You have outdated Nvim installed (< $REQUIRED_NVIM_VERSION)." - info -Msg "Automatically redirecting you to legacy version..." - safe_execute -WithCmd { git clone --progress -b 0.7 "$env:CCLONE_ATTR" 'https://github.com/ayamir/nvimdots.git' "$env:CCDEST_DIR" } + info -Msg "Automatically redirecting you to the latest compatible version..." + safe_execute -WithCmd { git clone --progress -b 0.8 "$env:CCLONE_ATTR" 'https://github.com/ayamir/nvimdots.git' "$env:CCDEST_DIR" } + } else { + warn -Msg "You have outdated Nvim installed (< $REQUIRED_NVIM_VERSION_LEGACY)." + _abort -Msg "This Neovim distribution is no longer supported." -Type "NotImplemented" -Info_msg @" +You have a legacy Neovim distribution installed. +Please make sure you have nvim v$REQUIRED_NVIM_VERSION_LEGACY installed at the very least. + +"@ } } @@ -379,7 +396,7 @@ You must install Git before installing this Nvim config. See: } } - info -Msg "Spawning neovim and fetching plugins... (You'll be redirected shortly)" + info -Msg "Spawning Neovim and fetching plugins... (You'll be redirected shortly)" info -Msg 'To make sqlite work with lua, manually grab the dlls from "https://www.sqlite.org/download.html" and' info_ext -Msg 'replace vim.g.sqlite_clib_path with your path at the bottom of `lua/core/options.lua`' info -Msg 'If lazy.nvim failed to fetch any plugin(s), maunally execute `:Lazy sync` until everything is up-to-date.' diff --git a/scripts/install.sh b/scripts/install.sh index 64dc4d6d1..0cedade42 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -10,7 +10,8 @@ set -u DEST_DIR="${HOME}/.config/nvim" BACKUP_DIR="${DEST_DIR}_backup-$(date +%Y%m%dT%H%M%S)" CLONE_ATTR=("--progress") -REQUIRED_NVIM_VERSION=0.8 +REQUIRED_NVIM_VERSION=0.9.0 +REQUIRED_NVIM_VERSION_LEGACY=0.8.0 USE_SSH=1 abort() { @@ -118,7 +119,7 @@ version_ge() { prompt_confirm() { while true; do read -r -p "$1 [Y/n]: " USR_CHOICE - case "$USR_CHOICE" in + case "${USR_CHOICE}" in [yY][eE][sS] | [yY]) return 1 ;; @@ -126,10 +127,10 @@ prompt_confirm() { return 0 ;; *) - if [[ -z "$USR_CHOICE" ]]; then + if [[ -z "${USR_CHOICE}" ]]; then return 1 fi - printf "${tty_red}%s\n\n${tty_reset}" "Invalid input! Please enter one of: '[yY]/[yY][eE][sS] / [nN]/[nN][oO]'" + printf "${tty_red}%s\n\n${tty_reset}" "Invalid input! Please enter one of: '[y/yes] / [n/no]'" ;; esac done @@ -154,10 +155,10 @@ clone_pref() { fi } -is_latest() { +check_nvim_version() { local nvim_version nvim_version="$(nvim --version | head -n1 | sed -e 's|^[^0-9]*||' -e 's| .*||')" - if version_ge "$(major_minor "${nvim_version##* }")" "$(major_minor "${REQUIRED_NVIM_VERSION}")"; then + if version_ge "$(major_minor "${nvim_version##* }")" "$(major_minor "$1")"; then return 0 else return 1 @@ -203,7 +204,7 @@ fi if ! command -v nvim >/dev/null; then abort "$( cat <