feat(nvim): phase 1 — triage and abandoned-plugin cleanup

Fix keymap collision on <leader>j/<leader>k (now resize-only;
location-list moved to ]l/[l). Migrate diagnostic signs from
deprecated vim.fn.sign_define to vim.diagnostic.config. Drop
orphan after/nvim-tree.lua and the bogus require("../current-theme").
Add foundation snacks.nvim spec. Remove playground, vim-maximizer,
poet-v, git-blame, render-markdown, and all five AI plugin specs.
Enable gitsigns current_line_blame.
This commit is contained in:
David Ibia
2026-05-02 13:36:16 +01:00
parent b4bb915a3f
commit 38606b86c6
27 changed files with 686 additions and 496 deletions
-40
View File
@@ -1,40 +0,0 @@
local codecompanion = require("codecompanion")
codecompanion.setup({
strategies = {
chat = {
adapter = "openai",
},
},
extensions = {
mcphub = {
callback = "mcphub.extensions.codecompanion",
opts = {
make_vars = true,
make_slash_commands = true,
show_result_in_chat = true,
},
},
},
})
local opts = {
noremap = true,
silent = true,
}
vim.keymap.set("n", "<leader>ac", function()
vim.cmd("CodeCompanionChat")
end, opts)
vim.keymap.set({ "n", "v" }, "<leader>ai", function()
local input = vim.fn.input("[Code Companion Inline]: ")
local trimmed_input = vim.fn.trim(input)
if trimmed_input == "" then
vim.notify("No input provided for inline code companion", vim.log.levels.WARN)
return
end
vim.cmd("CodeCompanion" .. " " .. vim.fn.shellescape(trimmed_input))
end, opts)
-36
View File
@@ -1,36 +0,0 @@
local gen = require("gen")
gen.setup({
-- Custom Parameters (with defaults)
model = "deepseek-r1:7b", -- The default model to use.
quit_map = "q", -- set keymap to close the response window
retry_map = "<c-r>", -- set keymap to re-send the current prompt
accept_map = "<c-cr>", -- set keymap to replace the previous selection with the last result
host = "localhost", -- The host running the Ollama service.
port = "11434", -- The port on which the Ollama service is listening.
display_mode = "split", -- The display mode. Can be "float" or "split" or "horizontal-split".
show_prompt = false, -- Shows the prompt submitted to Ollama. Can be true (3 lines) or "full".
show_model = false, -- Displays which model you are using at the beginning of your chat session.
no_auto_close = false, -- Never closes the window automatically.
file = false, -- Write the payload to a temporary file to keep the command short.
hidden = false, -- Hide the generation window (if true, will implicitly set `prompt.replace = true`), requires Neovim >= 0.10
init = function(options)
pcall(io.popen, "ollama serve > /dev/null 2>&1 &")
end,
-- Function to initialize Ollama
command = function(options)
local body = { model = options.model, stream = true }
return "curl --silent --no-buffer -X POST http://"
.. options.host
.. ":"
.. options.port
.. "/api/chat -d $body"
end,
-- The command for the Ollama service. You can use placeholders $prompt, $model and $body (shellescaped).
-- This can also be a command string.
-- The executed command must return a JSON object with { response, context }
-- (context property is optional).
-- list_models = '<omitted lua function>', -- Retrieves a list of model names
result_filetype = "markdown", -- Configure filetype of the result buffer
debug = false, -- Prints errors and the command which is run.
})
+8 -1
View File
@@ -1,3 +1,10 @@
local gitsigns = require("gitsigns")
gitsigns.setup()
gitsigns.setup({
current_line_blame = true,
current_line_blame_opts = {
virt_text_pos = "eol",
delay = 500,
ignore_whitespace = false,
},
})
-105
View File
@@ -1,105 +0,0 @@
local llm = require("llm")
local llmCompletion = require("llm.completion")
llm.setup({
api_token = nil, -- cf Install paragraph
model = "codellama:13b", -- the model ID, behavior depends on backend
backend = "ollama", -- backend ID, "huggingface" | "ollama" | "openai" | "tgi"
url = "http://localhost:11434", -- the http url of the backend
-- tokens_to_clear = { "<|endoftext|>" }, -- tokens to remove from the model's output
tokens_to_clear = { "<EOT>" },
-- parameters that are added to the request body, values are arbitrary, you can set any field:value pair here it will be passed as is to the backend
request_body = {
parameters = {
-- max_new_tokens = 60,
temperature = 0.2,
top_p = 0.95,
},
},
-- set this if the model supports fill in the middle
-- fim = {
-- enabled = false,
-- prefix = "<fim_prefix>",
-- middle = "<fim_middle>",
-- suffix = "<fim_suffix>",
-- },
fim = {
enabled = true,
prefix = "<PRE> ",
middle = " <MID>",
suffix = " <SUF>",
},
debounce_ms = 150,
accept_keymap = nil,
dismiss_keymap = nil,
tls_skip_verify_insecure = false,
-- llm-ls configuration, cf llm-ls section
lsp = {
bin_path = vim.api.nvim_call_function("stdpath", { "data" }) .. "/mason/bin/llm-ls",
cmd_env = { LLM_LOG_LEVEL = "DEBUG" },
},
-- tokenizer = nil, -- cf Tokenizer paragraph
tokenizer = {
repository = "codellama/CodeLlama-13b-hf",
},
context_window = 4096,
enable_suggestions_on_startup = false,
enable_suggestions_on_files = { "*.py", "*.js", "*.ts", "*.astro", "*.vue", "*.lua" },
disable_url_path_completion = false, -- cf Backend
})
vim.keymap.set("i", "<Tab>", function()
if llmCompletion.shown_suggestion ~= nil then
llmCompletion.complete()
else
local keys = vim.api.nvim_replace_termcodes("<Tab>", true, false, true)
vim.api.nvim_feedkeys(keys, "n", false)
end
end, { noremap = true, silent = true })
vim.keymap.set("n", "<Tab>", function()
if llmCompletion.shown_suggestion ~= nil then
llmCompletion.complete()
else
local keys = vim.api.nvim_replace_termcodes("<Tab>", true, false, true)
vim.api.nvim_feedkeys(keys, "n", false)
end
end, { noremap = true, silent = true })
-- Debounce helper
local debounce = function(func, timeout)
if type(func) ~= "function" then
error("Expected a function")
end
if type(timeout) ~= "number" or timeout <= 0 then
error("Expected a positive number for timeout")
end
local timer = vim.uv.new_timer()
return function(...)
local args = { ... }
timer:stop() -- Reset the timer
timer:start(
timeout,
0,
vim.schedule_wrap(function()
func(unpack(args))
end)
)
end
end
-- Define the function to be executed
local function on_text_change()
llmCompletion.lsp_suggest()
end
-- Debounce the function
local debounced_on_text_change = debounce(on_text_change, 3000)
-- Set up the autocommand
vim.api.nvim_create_autocmd({ "InsertCharPre" }, {
pattern = "*",
callback = debounced_on_text_change,
desc = "Run method after typing stops with debounce",
})
+59 -79
View File
@@ -1,6 +1,5 @@
-- Setup language servers.
local conform = require("conform")
local lspconfig = require("lspconfig")
local cmp_nvim_lsp = require("cmp_nvim_lsp")
local opts = { noremap = true, silent = true }
@@ -70,27 +69,25 @@ end
local capabilities = cmp_nvim_lsp.default_capabilities()
-- Change the Diagnostic symbols in the sign column (gutter)
local signs = {
Error = "",
Warn = "",
Hint = "󰠠 ",
Info = " ",
}
-- Configure diagnostic signs (Neovim 0.10+ API; required in 0.12)
vim.diagnostic.config({
signs = {
text = {
[vim.diagnostic.severity.ERROR] = " ",
[vim.diagnostic.severity.WARN] = " ",
[vim.diagnostic.severity.HINT] = "󰠠 ",
[vim.diagnostic.severity.INFO] = "",
},
},
})
for type, icon in pairs(signs) do
local hl = "DiagnosticSign" .. type
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" })
end
-- configure html server
lspconfig["html"].setup({
-- Configure LSP servers using vim.lsp.config
vim.lsp.config("html", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure typescript server with plugin
lspconfig["ts_ls"].setup({
vim.lsp.config("ts_ls", {
capabilities = capabilities,
on_attach = on_attach,
init_options = {
@@ -105,21 +102,18 @@ lspconfig["ts_ls"].setup({
filetypes = { "typescript", "javascript", "javascriptreact", "typescriptreact", "vue" },
})
-- configure css server
lspconfig["cssls"].setup({
vim.lsp.config("cssls", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure tailwindcss server
lspconfig["tailwindcss"].setup({
vim.lsp.config("tailwindcss", {
capabilities = capabilities,
on_attach = on_attach,
filetypes = { "html", "svelte", "vue", "astro" },
})
-- configure svelte server
lspconfig["svelte"].setup({
vim.lsp.config("svelte", {
capabilities = capabilities,
on_attach = function(client, bufnr)
on_attach(client, bufnr)
@@ -135,8 +129,7 @@ lspconfig["svelte"].setup({
end,
})
-- configure emmet language server
lspconfig["emmet_ls"].setup({
vim.lsp.config("emmet_ls", {
capabilities = capabilities,
on_attach = on_attach,
filetypes = {
@@ -153,14 +146,12 @@ lspconfig["emmet_ls"].setup({
},
})
-- configure ruff server
lspconfig["ruff"].setup({
vim.lsp.config("ruff", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure pyright server
lspconfig["pyright"].setup({
vim.lsp.config("pyright", {
capabilities = capabilities,
on_attach = on_attach,
filetypes = { "python" },
@@ -175,20 +166,17 @@ lspconfig["pyright"].setup({
},
})
-- configure docker server
lspconfig["dockerls"].setup({
vim.lsp.config("dockerls", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure json server
lspconfig["jsonls"].setup({
vim.lsp.config("jsonls", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure vue server
lspconfig["volar"].setup({
vim.lsp.config("vue_ls", {
capabilities = capabilities,
on_attach = on_attach,
filetypes = { "vue" },
@@ -221,9 +209,7 @@ lspconfig["volar"].setup({
},
})
-- configure rust server
lspconfig.rust_analyzer.setup({
-- Server-specific settings. See `:help lspconfig-setup`
vim.lsp.config("rust_analyzer", {
on_attach = on_attach,
capabilities = capabilities,
settings = {
@@ -231,18 +217,15 @@ lspconfig.rust_analyzer.setup({
},
})
-- configure lua server (with special settings)
lspconfig["lua_ls"].setup({
vim.lsp.config("lua_ls", {
capabilities = capabilities,
on_attach = on_attach,
settings = { -- custom settings for lua
settings = {
Lua = {
-- make the language server recognize "vim" global
diagnostics = {
globals = { "vim" },
},
workspace = {
-- make language server aware of runtime files
library = {
[vim.fn.expand("$VIMRUNTIME/lua")] = true,
[vim.fn.stdpath("config") .. "/lua"] = true,
@@ -252,73 +235,45 @@ lspconfig["lua_ls"].setup({
},
})
-- configure css server
lspconfig["cssls"].setup({
vim.lsp.config("docker_compose_language_service", {
capabilities = capabilities,
on_attach = on_attach,
})
--configure docker file server
lspconfig["dockerls"].setup({
vim.lsp.config("eslint", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure docker compose server
lspconfig["docker_compose_language_service"].setup({
vim.lsp.config("astro", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure eslint server
lspconfig["eslint"].setup({
vim.lsp.config("kotlin_language_server", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure astro server
lspconfig["astro"].setup({
capabilities = capabilities,
on_attach = on_attach,
-- init_options = {
-- typescript = {
-- tsdk = ResolveTypescriptServer(),
-- },
-- },
})
-- configure kotlin server
lspconfig["kotlin_language_server"].setup({
capabilities = capabilities,
on_attach = on_attach,
})
-- configure clang server
lspconfig["clangd"].setup({
vim.lsp.config("clangd", {
cmd = { "clangd", "--compile-commands-dir=./", "--background-index=false" },
capabilities = capabilities,
on_attach = on_attach,
filetypes = { "c", "cpp", "objc", "objcpp" },
})
-- configure bufls server
lspconfig["buf_ls"].setup({
vim.lsp.config("buf_ls", {
capabilities = capabilities,
on_attach = on_attach,
filetypes = { "proto" },
})
-- configure arduino language server
lspconfig["arduino_language_server"].setup({
vim.lsp.config("arduino_language_server", {
capabilities = capabilities,
on_attach = on_attach,
})
-- configure biome server
lspconfig["biome"].setup({
vim.lsp.config("biome", {
capabilities = capabilities,
on_attach = on_attach,
filetypes = {
@@ -334,3 +289,28 @@ lspconfig["biome"].setup({
"vue",
},
})
-- Enable all configured LSP servers
vim.lsp.enable({
"html",
"ts_ls",
"cssls",
"tailwindcss",
"svelte",
"emmet_ls",
"ruff",
"pyright",
"dockerls",
"jsonls",
"vue_ls",
"rust_analyzer",
"lua_ls",
"docker_compose_language_service",
"eslint",
"astro",
"kotlin_language_server",
"clangd",
"buf_ls",
"arduino_language_server",
"biome",
})
-49
View File
@@ -1,49 +0,0 @@
local nvimtree = require("absolute.disabled.nvim-tree")
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
vim.cmd([[ highlight NvimTreeIndentMarker guifg=#3FC5FF ]])
vim.cmd([[ highlight NvimTreeFolderArrowClosed guifg=#3FC5FF ]])
vim.cmd([[ highlight NvimTreeFolderArrowOpen guifg=#3FC5FF ]])
nvimtree.setup({
view = {
width = 45,
relativenumber = true,
},
update_focused_file = {
enable = true,
},
renderer = {
indent_markers = {
enable = true,
},
icons = {
glyphs = {
folder = {
arrow_closed = "", -- arrow when folder is closed
arrow_open = "", -- arrow when folder is open
},
},
},
},
-- disable window_picker for
-- explorer to work well with
-- window splits
actions = {
open_file = {
window_picker = {
enable = false,
},
},
},
filters = {
custom = { ".DS_Store" },
},
git = {
ignore = false,
},
})
-20
View File
@@ -1,20 +0,0 @@
vim.g.poetv_executables = { "poetry" }
vim.g.poetv_auto_activate = 0
vim.g.poetv_set_environment = 1
vim.g.poetv_statusline_symbol = "🐍"
-- Setup Autocommands
vim.api.nvim_create_autocmd({ "BufEnter", "BufWinEnter" }, {
pattern = { "*/.venv/*", "*.py" },
callback = function()
-- check if poetv is activated
if vim.g.poetv_name ~= nil then
return
else
vim.cmd([[ PoetvActivate ]])
vim.cmd([[ LspRestart ]])
end
end,
})
+18 -18
View File
@@ -1,3 +1,5 @@
local ThemeRegistry = require("absolute.core.theme-registry")
local function SetupWindowPreferences()
-- Utility function to get the blend value or set a default
local function get_blend_value(group_name, default_blend)
@@ -20,24 +22,15 @@ local function SetupWindowPreferences()
end
local function SyncWezTerm()
local colorschemes = {
["tokyonight-day"] = "Tokyo Night Day",
["tokyonight-night"] = "Tokyo Night Night",
["tokyonight-storm"] = "Tokyo Night Storm",
["tokynight-moon"] = "Tokyo Night Moon",
["catppuccin-frappe"] = "Catppuccin Frappe",
["catppuccin-latte"] = "Catppuccin Latte",
["catppuccin-macchiato"] = "Catppuccin Macchiato",
["catppuccin-mocha"] = "Catppuccin Mocha",
}
vim.api.nvim_create_autocmd("ColorScheme", {
group = vim.api.nvim_create_augroup("wezterm_colorscheme", { clear = true }),
callback = function(args)
SetupWindowPreferences()
local colorscheme = colorschemes[args.match]
if not colorscheme then
-- Get terminal theme from registry
local wezterm_theme = ThemeRegistry.get_theme(args.match, "wezterm")
if not wezterm_theme then
-- Theme not in registry, skip silently
return
end
@@ -54,9 +47,9 @@ local function SyncWezTerm()
assert(file)
file:write(colorscheme)
file:write(wezterm_theme)
file:close()
-- vim.notify("Setting WezTerm color scheme to " .. colorscheme, vim.log.levels.INFO)
-- vim.notify("Setting WezTerm color scheme to " .. wezterm_theme, vim.log.levels.INFO)
end,
})
end
@@ -75,6 +68,13 @@ local function SyncGhostyTerm()
local notifyOpts = { title = "Set Ghostty Theme" }
-- Get terminal theme from registry
local ghostty_colorscheme = ThemeRegistry.get_theme(args.match, "ghostty")
if not ghostty_colorscheme then
-- Theme not in registry, skip silently
return
end
-- if the file does not exists, exit early
local filename = vim.fn.expand("$XDG_CONFIG_HOME/ghostty/colorscheme")
@@ -86,14 +86,14 @@ local function SyncGhostyTerm()
-- lets check if ghostty supports the theme
-- ghostty +list-themes | xargs -I {} echo {} | grep <theme>
local cmd = "ghostty +list-themes | sed 's/ (resources)//g' | grep '^" .. args.match .. "$'"
local cmd = "ghostty +list-themes | sed 's/ (resources)//g' | grep '^" .. ghostty_colorscheme .. "$'"
local status = vim.fn.system(cmd)
local trimmed_output = vim.fn.substitute(status, "^s+|s+$", "", "g")
-- check if status is empty
if trimmed_output == "" then
vim.notify(args.match .. " is not supported by Ghostty", vim.log.levels.ERROR, notifyOpts)
vim.notify(ghostty_colorscheme .. " is not supported by Ghostty", vim.log.levels.ERROR, notifyOpts)
return
end
@@ -103,7 +103,7 @@ local function SyncGhostyTerm()
assert(file)
local theme_string = 'theme = "' .. args.match .. '"'
local theme_string = 'theme = "' .. ghostty_colorscheme .. '"'
file:write(theme_string)
file:close()
+29
View File
@@ -6,6 +6,13 @@ local current_home = os.getenv("HOME")
vim.g.python3_host_prog = current_home .. "/.pyenv/versions/py3nvim/bin/python"
vim.opt.title = true
vim.opt.titlestring = "%{fnamemodify(getcwd(), ':t')}"
-- auto reload
vim.o.autoread = true
-- disable nvim intro
vim.opt.shortmess:append("sI")
@@ -74,4 +81,26 @@ vim.api.nvim_create_autocmd("InsertLeave", {
end,
})
vim.api.nvim_create_user_command("GitRootRun", function(opts)
local cmd = opts.args
local git_root = vim.fn.systemlist("git rev-parse --show-toplevel")[1]
if git_root and git_root ~= "" then
vim.cmd("!cd " .. git_root .. " && " .. cmd)
else
print("Not in a Git repository.")
end
end, { nargs = "+" })
local opts = { noremap = true, silent = true }
opts.desc = "Run command in Git root"
vim.keymap.set("n", "<leader>gr", function()
local command = vim.fn.input("$: ")
if command ~= "" then
vim.cmd("GitRootRun " .. command)
else
print("No command entered.")
end
end, opts)
-- Add similar autocommands for other modes as needed
+491
View File
@@ -0,0 +1,491 @@
-- Theme Registry
-- Central mapping between Neovim colorschemes and terminal themes (WezTerm, Ghostty)
-- Maintains a curated list of popular themes with verified mappings
local M = {}
-- Core theme mappings (manually curated and tested)
-- Each entry maps a Neovim colorscheme to its terminal equivalents
M.themes = {
-- ============================================================================
-- Tokyo Night Family (5 variants)
-- ============================================================================
["tokyonight"] = {
nvim = "tokyonight",
wezterm = "Tokyo Night",
ghostty = "TokyoNight",
family = "tokyonight",
variant = "night",
description = "A clean, dark Tokyo Night theme",
},
["tokyonight-night"] = {
nvim = "tokyonight-night",
wezterm = "Tokyo Night",
ghostty = "TokyoNight Night",
family = "tokyonight",
variant = "night",
description = "Tokyo Night (night variant)",
},
["tokyonight-storm"] = {
nvim = "tokyonight-storm",
wezterm = "Tokyo Night Storm",
ghostty = "TokyoNight Storm",
family = "tokyonight",
variant = "storm",
description = "Tokyo Night (storm variant)",
},
["tokyonight-day"] = {
nvim = "tokyonight-day",
wezterm = "Tokyo Night Day",
ghostty = "TokyoNight Day",
family = "tokyonight",
variant = "day",
description = "Tokyo Night (light day variant)",
},
["tokyonight-moon"] = {
nvim = "tokyonight-moon",
wezterm = "Tokyo Night Moon",
ghostty = "TokyoNight Moon",
family = "tokyonight",
variant = "moon",
description = "Tokyo Night (moon variant)",
},
-- ============================================================================
-- Catppuccin Family (4 variants)
-- ============================================================================
["catppuccin"] = {
nvim = "catppuccin",
wezterm = "Catppuccin Mocha",
ghostty = "Catppuccin Mocha",
family = "catppuccin",
variant = "mocha",
description = "Catppuccin (default mocha variant)",
},
["catppuccin-mocha"] = {
nvim = "catppuccin-mocha",
wezterm = "Catppuccin Mocha",
ghostty = "Catppuccin Mocha",
family = "catppuccin",
variant = "mocha",
description = "Catppuccin Mocha (warm, dark)",
},
["catppuccin-macchiato"] = {
nvim = "catppuccin-macchiato",
wezterm = "Catppuccin Macchiato",
ghostty = "Catppuccin Macchiato",
family = "catppuccin",
variant = "macchiato",
description = "Catppuccin Macchiato (mid-tone dark)",
},
["catppuccin-frappe"] = {
nvim = "catppuccin-frappe",
wezterm = "Catppuccin Frappe",
ghostty = "Catppuccin Frappe",
family = "catppuccin",
variant = "frappe",
description = "Catppuccin Frappe (cool, dark)",
},
["catppuccin-latte"] = {
nvim = "catppuccin-latte",
wezterm = "Catppuccin Latte",
ghostty = "Catppuccin Latte",
family = "catppuccin",
variant = "latte",
description = "Catppuccin Latte (light variant)",
},
-- ============================================================================
-- Rose Pine Family (4 variants)
-- ============================================================================
["rose-pine"] = {
nvim = "rose-pine",
wezterm = "rose-pine",
ghostty = "Rose Pine",
family = "rose-pine",
variant = "main",
description = "Rose Pine (main dark variant)",
},
["rose-pine-main"] = {
nvim = "rose-pine-main",
wezterm = "rose-pine",
ghostty = "Rose Pine",
family = "rose-pine",
variant = "main",
description = "Rose Pine (main dark variant)",
},
["rose-pine-moon"] = {
nvim = "rose-pine-moon",
wezterm = "rose-pine-moon",
ghostty = "Rose Pine Moon",
family = "rose-pine",
variant = "moon",
description = "Rose Pine Moon (darker variant)",
},
["rose-pine-dawn"] = {
nvim = "rose-pine-dawn",
wezterm = "rose-pine-dawn",
ghostty = "Rose Pine Dawn",
family = "rose-pine",
variant = "dawn",
description = "Rose Pine Dawn (light variant)",
},
-- ============================================================================
-- Nightfox Family (7 variants)
-- ============================================================================
["nightfox"] = {
nvim = "nightfox",
wezterm = "nightfox",
ghostty = "Nightfox",
family = "nightfox",
variant = "night",
description = "Nightfox (main dark variant)",
},
["carbonfox"] = {
nvim = "carbonfox",
wezterm = "carbonfox",
ghostty = "Carbonfox",
family = "nightfox",
variant = "carbon",
description = "Carbonfox (carbon variant)",
},
["dawnfox"] = {
nvim = "dawnfox",
wezterm = "dawnfox",
ghostty = "Dawnfox",
family = "nightfox",
variant = "dawn",
description = "Dawnfox (dawn variant)",
},
["dayfox"] = {
nvim = "dayfox",
wezterm = "dayfox",
ghostty = "Dayfox",
family = "nightfox",
variant = "day",
description = "Dayfox (light day variant)",
},
["duskfox"] = {
nvim = "duskfox",
wezterm = "duskfox",
ghostty = "Duskfox",
family = "nightfox",
variant = "dusk",
description = "Duskfox (dusk variant)",
},
["nordfox"] = {
nvim = "nordfox",
wezterm = "nordfox",
ghostty = "Nordfox",
family = "nightfox",
variant = "nord",
description = "Nordfox (nord-inspired variant)",
},
["terafox"] = {
nvim = "terafox",
wezterm = "terafox",
ghostty = "Terafox",
family = "nightfox",
variant = "tera",
description = "Terafox (tera variant)",
},
-- ============================================================================
-- Gruvbox Family (4 variants)
-- ============================================================================
["gruvbox"] = {
nvim = "gruvbox",
wezterm = "GruvboxDark",
ghostty = "Gruvbox Dark",
family = "gruvbox",
variant = "dark",
description = "Gruvbox (dark variant)",
},
["gruvbox-material"] = {
nvim = "gruvbox-material",
wezterm = "Gruvbox Material (Gogh)",
ghostty = "Gruvbox Material",
family = "gruvbox",
variant = "material",
description = "Gruvbox Material",
},
-- ============================================================================
-- Nord
-- ============================================================================
["nord"] = {
nvim = "nord",
wezterm = "Nord (base16)",
ghostty = "Nord",
family = "nord",
variant = "main",
description = "Nord (arctic, north-bluish color palette)",
},
-- ============================================================================
-- Dracula
-- ============================================================================
["dracula"] = {
nvim = "dracula",
wezterm = "Dracula (Official)",
ghostty = "Dracula",
family = "dracula",
variant = "main",
description = "Dracula (dark theme)",
},
-- ============================================================================
-- One Dark / One Light
-- ============================================================================
["onedark"] = {
nvim = "onedark",
wezterm = "OneDark (base16)",
ghostty = "Atom One Dark",
family = "onedark",
variant = "dark",
description = "One Dark (Atom-inspired dark theme)",
},
["onelight"] = {
nvim = "onelight",
wezterm = "One Light (base16)",
ghostty = "Atom One Light",
family = "onelight",
variant = "light",
description = "One Light (Atom-inspired light theme)",
},
-- ============================================================================
-- Material
-- ============================================================================
["material"] = {
nvim = "material",
wezterm = "MaterialDark",
ghostty = "Material",
family = "material",
variant = "dark",
description = "Material (dark variant)",
},
["material-darker"] = {
nvim = "material-darker",
wezterm = "MaterialDarker",
ghostty = "Material Darker",
family = "material",
variant = "darker",
description = "Material (darker variant)",
},
-- ============================================================================
-- Solarized
-- ============================================================================
["solarized-dark"] = {
nvim = "solarized-dark",
wezterm = "Builtin Solarized Dark",
ghostty = "Builtin Solarized Dark",
family = "solarized",
variant = "dark",
description = "Solarized Dark",
},
["solarized-light"] = {
nvim = "solarized-light",
wezterm = "Builtin Solarized Light",
ghostty = "Builtin Solarized Light",
family = "solarized",
variant = "light",
description = "Solarized Light",
},
-- ============================================================================
-- Monokai
-- ============================================================================
["monokai"] = {
nvim = "monokai",
wezterm = "Monokai Remastered",
ghostty = "Monokai Classic",
family = "monokai",
variant = "main",
description = "Monokai (classic variant)",
},
["monokai-pro"] = {
nvim = "monokai-pro",
wezterm = "Monokai Pro (Gogh)",
ghostty = "Monokai Pro",
family = "monokai",
variant = "pro",
description = "Monokai Pro",
},
-- ============================================================================
-- GitHub
-- ============================================================================
["github-dark"] = {
nvim = "github-dark",
wezterm = "GitHub Dark",
ghostty = "GitHub Dark",
family = "github",
variant = "dark",
description = "GitHub Dark",
},
-- ============================================================================
-- Ayu
-- ============================================================================
["ayu-dark"] = {
nvim = "ayu-dark",
wezterm = "Ayu Dark (Gogh)",
ghostty = "Ayu",
family = "ayu",
variant = "dark",
description = "Ayu (dark variant)",
},
["ayu-mirage"] = {
nvim = "ayu-mirage",
wezterm = "Ayu Mirage",
ghostty = "Ayu Mirage",
family = "ayu",
variant = "mirage",
description = "Ayu Mirage (mid-tone variant)",
},
["ayu-light"] = {
nvim = "ayu-light",
wezterm = "Ayu Light (Gogh)",
ghostty = "Ayu Light",
family = "ayu",
variant = "light",
description = "Ayu (light variant)",
},
}
-- ============================================================================
-- Helper Functions
-- ============================================================================
--- Get the terminal theme name for a given Neovim colorscheme
--- @param nvim_name string The Neovim colorscheme name
--- @param terminal_type string The terminal type ("wezterm" or "ghostty")
--- @return string|nil The terminal theme name, or nil if not found
function M.get_theme(nvim_name, terminal_type)
local theme = M.themes[nvim_name]
if not theme then
return nil
end
if terminal_type == "wezterm" then
return theme.wezterm
elseif terminal_type == "ghostty" then
return theme.ghostty
end
return nil
end
--- Check if a Neovim colorscheme is supported for a given terminal
--- @param nvim_name string The Neovim colorscheme name
--- @param terminal_type string The terminal type ("wezterm" or "ghostty")
--- @return boolean True if the mapping exists
function M.is_supported(nvim_name, terminal_type)
return M.get_theme(nvim_name, terminal_type) ~= nil
end
--- Get all Neovim themes in the registry
--- @return table List of Neovim colorscheme names
function M.get_all_nvim_themes()
local themes = {}
for nvim_name, _ in pairs(M.themes) do
table.insert(themes, nvim_name)
end
table.sort(themes)
return themes
end
--- Get theme family and variant information
--- @param nvim_name string The Neovim colorscheme name
--- @return table|nil Theme metadata (family, variant, description)
function M.get_theme_info(nvim_name)
local theme = M.themes[nvim_name]
if not theme then
return nil
end
return {
family = theme.family,
variant = theme.variant,
description = theme.description,
wezterm = theme.wezterm,
ghostty = theme.ghostty,
}
end
--- Get all themes in a family
--- @param family_name string The theme family name (e.g., "tokyonight", "catppuccin")
--- @return table List of theme entries in the family
function M.get_family_themes(family_name)
local family_themes = {}
for nvim_name, theme in pairs(M.themes) do
if theme.family == family_name then
table.insert(family_themes, {
nvim = nvim_name,
variant = theme.variant,
description = theme.description,
})
end
end
-- Sort by variant name
table.sort(family_themes, function(a, b)
return a.variant < b.variant
end)
return family_themes
end
--- Get a list of all theme families
--- @return table List of unique family names
function M.get_all_families()
local families = {}
local seen = {}
for _, theme in pairs(M.themes) do
if not seen[theme.family] then
seen[theme.family] = true
table.insert(families, theme.family)
end
end
table.sort(families)
return families
end
--- Get statistics about the theme registry
--- @return table Statistics (total_themes, families_count, terminal_coverage)
function M.get_stats()
local total = 0
local wezterm_count = 0
local ghostty_count = 0
local families = {}
for _, theme in pairs(M.themes) do
total = total + 1
if theme.wezterm then
wezterm_count = wezterm_count + 1
end
if theme.ghostty then
ghostty_count = ghostty_count + 1
end
families[theme.family] = true
end
local families_count = 0
for _ in pairs(families) do
families_count = families_count + 1
end
return {
total_themes = total,
families_count = families_count,
wezterm_coverage = wezterm_count,
ghostty_coverage = ghostty_count,
}
end
return M
+4 -1
View File
@@ -27,7 +27,10 @@ require("lazy")
change_detection = {
notify = false,
},
ui = {
border = "rounded",
},
})
require("absolute.core.colorscheme")
require("../current-theme");
require("current-theme")
-11
View File
@@ -1,11 +0,0 @@
return {
"olimorris/codecompanion.nvim",
dependencies = {
"ravitemer/mcphub.nvim",
"nvim-lua/plenary.nvim",
"nvim-treesitter/nvim-treesitter",
},
config = function()
require("absolute.after.codecompanion")
end,
}
-3
View File
@@ -1,3 +0,0 @@
return {
"github/copilot.vim",
}
+15
View File
@@ -0,0 +1,15 @@
return {
enabled = false,
"folke/flash.nvim",
event = "VeryLazy",
---@type Flash.Config
opts = {},
-- stylua: ignore
keys = {
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
{ "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
{ "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" },
{ "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" },
{ "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" },
},
}
-7
View File
@@ -1,7 +0,0 @@
return {
"David-Kunz/gen.nvim",
enabled = false,
config = function()
require("absolute.after.gen")
end,
}
-4
View File
@@ -1,4 +0,0 @@
return {
"f-person/git-blame.nvim",
event = "VeryLazy",
}
-7
View File
@@ -1,7 +0,0 @@
return {
"huggingface/llm.nvim",
enabled = false,
config = function()
require("absolute.after.llm")
end,
}
@@ -1,3 +0,0 @@
return {
"nvim-treesitter/playground",
}
-7
View File
@@ -1,7 +0,0 @@
return {
enabled = false,
"petobens/poet-v",
config = function()
require("absolute.after.poet-v")
end,
}
-4
View File
@@ -1,4 +0,0 @@
return {
"MeanderingProgrammer/render-markdown.nvim",
ft = { "markdown", "codecompanion" }
}
+12
View File
@@ -0,0 +1,12 @@
return {
"folke/snacks.nvim",
priority = 1000,
lazy = false,
---@type snacks.Config
opts = {
bigfile = { enabled = true },
quickfile = { enabled = true },
-- input, notifier added in Phase 2
-- picker added in Phase 3
},
}
+1 -2
View File
@@ -1,11 +1,10 @@
return {
"linux-cultist/venv-selector.nvim",
lazy = false,
branch = "regexp", -- This is the regexp branch, use this for the new version
branch = "main", -- This is the regexp branch, use this for the new version
dependencies = {
"neovim/nvim-lspconfig",
"nvim-telescope/telescope.nvim",
"mfussenegger/nvim-dap-python",
},
config = function()
require("absolute.after.venv-selector")
-3
View File
@@ -1,3 +0,0 @@
return {
"szw/vim-maximizer"
}
+5 -5
View File
@@ -66,18 +66,18 @@ vim.keymap.set("n", "<C-k>", "<cmd>cnext<CR>zz", opts)
opts.desc = "Jump down and center screen"
vim.keymap.set("n", "<C-j>", "<cmd>cprev<CR>zz", opts)
opts.desc = "Jump to next location and center screen"
vim.keymap.set("n", "<leader>k", "<cmd>lnext<CR>zz", opts)
opts.desc = "Next location-list entry"
vim.keymap.set("n", "]l", "<cmd>lnext<CR>zz", opts)
opts.desc = "Jump to previous location and center screen"
vim.keymap.set("n", "<leader>j", "<cmd>lprev<CR>zz", opts)
opts.desc = "Previous location-list entry"
vim.keymap.set("n", "[l", "<cmd>lprev<CR>zz", opts)
-- Search Regex Keymap
opts.desc = "Regex Replace"
vim.keymap.set("n", "<leader>sr", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]], opts)
opts.desc = "Replace selected text"
vim.keymap.set("v", "<leader>ss", [[:s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]], opts)
vim.keymap.set("v", "<leader>sr", [[:s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]], opts)
-- -- Source File Keymap
-- opts.desc = "Source File"
+1 -1
View File
@@ -1 +1 @@
vim.cmd("colorscheme catppuccin-macchiato")
vim.cmd("colorscheme tokyonight-night")