diff --git a/dot_config/kitty/kitty.d/40-remote-control.conf b/dot_config/kitty/kitty.d/40-remote-control.conf new file mode 100644 index 0000000..a22d899 --- /dev/null +++ b/dot_config/kitty/kitty.d/40-remote-control.conf @@ -0,0 +1,3 @@ +# Required for smart-splits.nvim local resize support +allow_remote_control yes +listen_on unix:/tmp/kitty diff --git a/dot_config/nvim/after/queries/jinja/injections.scm b/dot_config/nvim/after/queries/jinja/injections.scm new file mode 100644 index 0000000..229f176 --- /dev/null +++ b/dot_config/nvim/after/queries/jinja/injections.scm @@ -0,0 +1,6 @@ +; Jinja template injection queries +; Injects HTML into Jinja host language nodes + +((text) @injection.content + (#set! injection.language "html") + (#set! injection.combined)) diff --git a/dot_config/nvim/colors/apex-aeon.lua b/dot_config/nvim/colors/apex-aeon.lua index f45ecbc..e81d554 100644 --- a/dot_config/nvim/colors/apex-aeon.lua +++ b/dot_config/nvim/colors/apex-aeon.lua @@ -238,6 +238,353 @@ function M.load() CmpItemKindMethod = { fg = p.azure }, CmpItemKindKeyword = { fg = p.sacred }, CmpItemKindVariable = { fg = p.text }, + + -- PLUGINS: BLINK.CMP (Completion) ---------------------------------------- + BlinkCmpMenu = { fg = p.text, bg = p.panel }, + BlinkCmpMenuBorder = { fg = p.border, bg = p.panel }, + BlinkCmpMenuSelection = { fg = p.ink, bg = p.razor, bold = true }, + BlinkCmpScrollBarThumb = { bg = p.stealth }, + BlinkCmpScrollBarGutter = { bg = p.panel }, + BlinkCmpLabel = { fg = p.text }, + BlinkCmpLabelDeprecated = { fg = p.dim, strikethrough = true }, + BlinkCmpLabelMatch = { fg = p.tech, bold = true }, + BlinkCmpKindText = { fg = p.text }, + BlinkCmpKindMethod = { fg = p.azure }, + BlinkCmpKindFunction = { fg = p.azure }, + BlinkCmpKindConstructor = { fg = p.amber }, + BlinkCmpKindField = { fg = p.text }, + BlinkCmpKindVariable = { fg = p.text }, + BlinkCmpKindClass = { fg = p.amber }, + BlinkCmpKindInterface = { fg = p.amber }, + BlinkCmpKindModule = { fg = p.amber }, + BlinkCmpKindProperty = { fg = p.text }, + BlinkCmpKindUnit = { fg = p.tech }, + BlinkCmpKindValue = { fg = p.tech }, + BlinkCmpKindEnum = { fg = p.amber }, + BlinkCmpKindKeyword = { fg = p.sacred }, + BlinkCmpKindSnippet = { fg = p.toxic }, + BlinkCmpKindColor = { fg = p.tech }, + BlinkCmpKindFile = { fg = p.text }, + BlinkCmpKindReference = { fg = p.tech }, + BlinkCmpKindFolder = { fg = p.text }, + BlinkCmpKindEnumMember = { fg = p.tech }, + BlinkCmpKindConstant = { fg = p.tech }, + BlinkCmpKindStruct = { fg = p.amber }, + BlinkCmpKindEvent = { fg = p.amber }, + BlinkCmpKindOperator = { fg = p.text }, + BlinkCmpKindTypeParameter = { fg = p.amber }, + BlinkCmpGhostText = { fg = p.stealth, italic = true }, + BlinkCmpDoc = { fg = p.text, bg = p.panel }, + BlinkCmpDocBorder = { fg = p.border, bg = p.panel }, + BlinkCmpDocSeparator = { fg = p.border, bg = p.panel }, + BlinkCmpDocCursorLine = { bg = p.border }, + BlinkCmpSignatureHelp = { fg = p.text, bg = p.panel }, + BlinkCmpSignatureHelpBorder = { fg = p.border, bg = p.panel }, + BlinkCmpSignatureHelpActiveParameter = { fg = p.ink, bg = p.tech, bold = true }, + BlinkCmpSource = { fg = p.dim }, + + -- PLUGINS: BUFFERLINE ----------------------------------------------------- + BufferLineBackground = { fg = p.dim, bg = p.panel }, + BufferLineFill = { bg = p.panel }, + BufferLineBuffer = { fg = p.dim, bg = p.panel }, + BufferLineBufferSelected = { fg = p.text, bg = p.void, bold = true }, + BufferLineBufferVisible = { fg = p.dim, bg = p.panel }, + BufferLineTab = { fg = p.dim, bg = p.panel }, + BufferLineTabSelected = { fg = p.text, bg = p.void, bold = true }, + BufferLineTabClose = { fg = p.razor, bg = p.panel }, + BufferLineModified = { fg = p.tech, bg = p.panel }, + BufferLineModifiedSelected = { fg = p.tech, bg = p.void }, + BufferLineModifiedVisible = { fg = p.tech, bg = p.panel }, + BufferLineSeparator = { fg = p.border, bg = p.panel }, + BufferLineSeparatorSelected = { fg = p.border, bg = p.void }, + BufferLineSeparatorVisible = { fg = p.border, bg = p.panel }, + BufferLineIndicatorSelected = { fg = p.razor, bg = p.void }, + BufferLineCloseButton = { fg = p.dim, bg = p.panel }, + BufferLineCloseButtonSelected = { fg = p.razor, bg = p.void }, + BufferLineCloseButtonVisible = { fg = p.dim, bg = p.panel }, + BufferLineDiagnostic = { fg = p.dim, bg = p.panel }, + BufferLineDiagnosticSelected = { fg = p.dim, bg = p.void }, + BufferLineError = { fg = p.alert, bg = p.panel }, + BufferLineErrorSelected = { fg = p.alert, bg = p.void, bold = true }, + BufferLineWarning = { fg = p.amber, bg = p.panel }, + BufferLineWarningSelected = { fg = p.amber, bg = p.void, bold = true }, + BufferLineInfo = { fg = p.tech, bg = p.panel }, + BufferLineInfoSelected = { fg = p.tech, bg = p.void, bold = true }, + BufferLineHint = { fg = p.dim, bg = p.panel }, + BufferLineHintSelected = { fg = p.dim, bg = p.void, bold = true }, + BufferLinePick = { fg = p.razor, bg = p.panel, bold = true }, + BufferLinePickSelected = { fg = p.razor, bg = p.void, bold = true }, + BufferLinePickVisible = { fg = p.razor, bg = p.panel, bold = true }, + + -- PLUGINS: WHICH-KEY ------------------------------------------------------ + WhichKey = { fg = p.razor, bold = true }, + WhichKeySeparator = { fg = p.stealth }, + WhichKeyGroup = { fg = p.tech }, + WhichKeyDesc = { fg = p.text }, + WhichKeyFloat = { bg = p.panel }, + WhichKeyBorder = { fg = p.border, bg = p.panel }, + WhichKeyTitle = { fg = p.ink, bg = p.razor, bold = true }, + WhichKeyNormal = { fg = p.text, bg = p.panel }, + WhichKeyValue = { fg = p.dim }, + WhichKeyIcon = { fg = p.azure }, + WhichKeyIconAzure = { fg = p.azure }, + WhichKeyIconGreen = { fg = p.toxic }, + WhichKeyIconYellow = { fg = p.amber }, + WhichKeyIconRed = { fg = p.razor }, + WhichKeyIconPurple = { fg = p.sacred }, + WhichKeyIconCyan = { fg = p.tech }, + + -- PLUGINS: TROUBLE -------------------------------------------------------- + TroubleNormal = { fg = p.text, bg = p.void }, + TroubleNormalNC = { fg = p.dim, bg = p.void }, + TroubleText = { fg = p.text }, + TroubleCount = { fg = p.ink, bg = p.razor, bold = true }, + TroubleError = { fg = p.alert }, + TroubleWarning = { fg = p.amber }, + TroubleHint = { fg = p.dim }, + TroubleInfo = { fg = p.tech }, + TroubleSource = { fg = p.dim }, + TroubleCode = { fg = p.stealth }, + TroubleLocation = { fg = p.dim }, + TroubleFile = { fg = p.tech, bold = true }, + TroubleIndent = { fg = p.border }, + TroublePos = { fg = p.dim }, + TroubleSignError = { fg = p.alert }, + TroubleSignWarning = { fg = p.amber }, + TroubleSignHint = { fg = p.dim }, + TroubleSignInfo = { fg = p.tech }, + TroublePreview = { fg = p.ink, bg = p.razor }, + TroubleFocusText = { fg = p.text, bold = true }, + + -- PLUGINS: INDENT-BLANKLINE ----------------------------------------------- + IblIndent = { fg = p.border }, + IblScope = { fg = p.stealth }, + IblWhitespace = { fg = p.border }, + + -- PLUGINS: NEOGIT --------------------------------------------------------- + NeogitBranch = { fg = p.razor, bold = true }, + NeogitRemote = { fg = p.tech }, + NeogitHunkHeader = { fg = p.text, bg = p.panel, bold = true }, + NeogitHunkHeaderHighlight = { fg = p.ink, bg = p.tech, bold = true }, + NeogitDiffAdd = { fg = p.toxic, bg = p.void }, + NeogitDiffDelete = { fg = p.razor, bg = p.void }, + NeogitDiffContext = { fg = p.dim, bg = p.void }, + NeogitDiffAddHighlight = { fg = p.toxic, bg = p.panel }, + NeogitDiffDeleteHighlight = { fg = p.razor, bg = p.panel }, + NeogitDiffContextHighlight = { fg = p.text, bg = p.panel }, + NeogitCommitViewHeader = { fg = p.ink, bg = p.razor, bold = true }, + NeogitFilePath = { fg = p.tech, underline = true }, + NeogitDiffHeader = { fg = p.amber, bold = true }, + NeogitDiffHeaderHighlight = { fg = p.ink, bg = p.amber, bold = true }, + NeogitObjectId = { fg = p.dim }, + NeogitStashes = { fg = p.sacred }, + NeogitRebaseDone = { fg = p.toxic }, + NeogitFold = { fg = p.stealth }, + + -- PLUGINS: AERIAL (Symbols Outline) -------------------------------------- + AerialLine = { fg = p.ink, bg = p.razor }, + AerialLineNC = { fg = p.dim, bg = p.panel }, + AerialNormal = { fg = p.text, bg = p.void }, + AerialGuide = { fg = p.border }, + AerialClass = { fg = p.amber }, + AerialClassIcon = { fg = p.amber }, + AerialFunction = { fg = p.azure }, + AerialFunctionIcon = { fg = p.azure }, + AerialMethod = { fg = p.azure }, + AerialMethodIcon = { fg = p.azure }, + AerialConstructor = { fg = p.amber }, + AerialField = { fg = p.text }, + AerialVariable = { fg = p.text }, + AerialEnum = { fg = p.amber }, + AerialEnumIcon = { fg = p.amber }, + AerialInterface = { fg = p.amber }, + AerialModule = { fg = p.amber }, + AerialNamespace = { fg = p.amber }, + AerialPackage = { fg = p.amber }, + AerialProperty = { fg = p.text }, + AerialStruct = { fg = p.amber }, + AerialType = { fg = p.amber }, + AerialTypeParameter = { fg = p.amber }, + AerialConstant = { fg = p.tech }, + AerialString = { fg = p.toxic }, + AerialNumber = { fg = p.tech }, + AerialBoolean = { fg = p.tech }, + AerialKey = { fg = p.sacred }, + AerialKeyword = { fg = p.sacred }, + AerialOperator = { fg = p.text }, + AerialNull = { fg = p.dim }, + AerialArray = { fg = p.tech }, + AerialObject = { fg = p.amber }, + AerialEvent = { fg = p.amber }, + + -- PLUGINS: DAP-UI --------------------------------------------------------- + DapUIScope = { fg = p.tech, bold = true }, + DapUIType = { fg = p.amber }, + DapUIDecoration = { fg = p.border }, + DapUIThread = { fg = p.toxic }, + DapUIStoppedThread = { fg = p.razor, bold = true }, + DapUICurrentFrameName = { fg = p.razor, bold = true }, + DapUISource = { fg = p.dim }, + DapUILineNumber = { fg = p.stealth }, + DapUIFloatBorder = { fg = p.border, bg = p.panel }, + DapUIFloatNormal = { fg = p.text, bg = p.panel }, + DapUIWatchesEmpty = { fg = p.dim }, + DapUIWatchesValue = { fg = p.toxic }, + DapUIWatchesError = { fg = p.alert }, + DapUIBreakpointsPath = { fg = p.tech }, + DapUIBreakpointsInfo = { fg = p.dim }, + DapUIBreakpointsCurrentLine = { fg = p.razor, bold = true }, + DapUIBreakpointsDisabledLine = { fg = p.stealth }, + DapUIEndofBuffer = { fg = p.void }, + DapUIModifiedValue = { fg = p.amber, bold = true }, + DapUIStop = { fg = p.razor }, + DapUIStepOver = { fg = p.tech }, + DapUIStepInto = { fg = p.tech }, + DapUIStepBack = { fg = p.tech }, + DapUIStepOut = { fg = p.tech }, + DapUIRestart = { fg = p.toxic }, + DapUIUnavailable = { fg = p.stealth }, + DapUIPlayPause = { fg = p.toxic }, + + -- PLUGINS: DAP VIRTUAL TEXT ----------------------------------------------- + NvimDapVirtualText = { fg = p.dim, italic = true }, + NvimDapVirtualTextChanged = { fg = p.amber, italic = true }, + NvimDapVirtualTextError = { fg = p.alert, italic = true }, + NvimDapVirtualTextInfo = { fg = p.tech, italic = true }, + + -- PLUGINS: NVIM-NOTIFY ---------------------------------------------------- + NotifyERRORBorder = { fg = p.razor }, + NotifyWARNBorder = { fg = p.amber }, + NotifyINFOBorder = { fg = p.tech }, + NotifyDEBUGBorder = { fg = p.stealth }, + NotifyTRACEBorder = { fg = p.sacred }, + NotifyERRORIcon = { fg = p.razor }, + NotifyWARNIcon = { fg = p.amber }, + NotifyINFOIcon = { fg = p.tech }, + NotifyDEBUGIcon = { fg = p.stealth }, + NotifyTRACEIcon = { fg = p.sacred }, + NotifyERRORTitle = { fg = p.razor, bold = true }, + NotifyWARNTitle = { fg = p.amber, bold = true }, + NotifyINFOTitle = { fg = p.tech, bold = true }, + NotifyDEBUGTitle = { fg = p.stealth, bold = true }, + NotifyTRACETitle = { fg = p.sacred, bold = true }, + NotifyERRORBody = { fg = p.text, bg = p.panel }, + NotifyWARNBody = { fg = p.text, bg = p.panel }, + NotifyINFOBody = { fg = p.text, bg = p.panel }, + NotifyDEBUGBody = { fg = p.dim, bg = p.panel }, + NotifyTRACEBody = { fg = p.dim, bg = p.panel }, + + -- PLUGINS: SATELLITE (Scrollbar) ----------------------------------------- + SatelliteBar = { bg = p.panel }, + SatelliteCursor = { fg = p.razor }, + SatellitePosition = { fg = p.dim }, + SatelliteError = { fg = p.alert }, + SatelliteWarning = { fg = p.amber }, + SatelliteHint = { fg = p.dim }, + SatelliteInfo = { fg = p.tech }, + SatelliteSearch = { fg = p.tech }, + SatelliteGit = { fg = p.toxic }, + SatelliteMark = { fg = p.amber }, + + -- PLUGINS: OIL.NVIM (File Explorer) -------------------------------------- + OilDir = { fg = p.tech, bold = true }, + OilDirIcon = { fg = p.tech }, + OilLink = { fg = p.sacred, italic = true }, + OilLinkTarget = { fg = p.sacred }, + OilCopy = { fg = p.amber, bold = true }, + OilMove = { fg = p.amber }, + OilChange = { fg = p.tech }, + OilCreate = { fg = p.toxic, bold = true }, + OilDelete = { fg = p.razor, bold = true }, + OilPermissionNone = { fg = p.stealth }, + OilPermissionRead = { fg = p.tech }, + OilPermissionWrite = { fg = p.amber }, + OilPermissionExecute = { fg = p.toxic }, + OilTypeDir = { fg = p.tech }, + OilTypeFile = { fg = p.text }, + OilTypeLink = { fg = p.sacred }, + OilTypeSpecial = { fg = p.razor }, + OilSize = { fg = p.dim }, + OilMtime = { fg = p.stealth }, + + -- PLUGINS: NEOTEST -------------------------------------------------------- + NeotestPassed = { fg = p.toxic }, + NeotestFailed = { fg = p.razor }, + NeotestRunning = { fg = p.amber }, + NeotestSkipped = { fg = p.dim }, + NeotestUnknown = { fg = p.stealth }, + NeotestTest = { fg = p.text }, + NeotestFile = { fg = p.tech }, + NeotestDir = { fg = p.tech, bold = true }, + NeotestNamespace = { fg = p.amber }, + NeotestMarked = { fg = p.razor, bold = true }, + NeotestTarget = { fg = p.razor }, + NeotestAdapterName = { fg = p.sacred, bold = true }, + NeotestWinSelect = { fg = p.tech, bold = true }, + NeotestFocused = { bold = true }, + NeotestIndent = { fg = p.border }, + NeotestExpandMarker = { fg = p.dim }, + NeotestWatching = { fg = p.amber }, + + -- PLUGINS: GRUG-FAR (Search & Replace) ----------------------------------- + GrugFarResultsHeader = { fg = p.ink, bg = p.razor, bold = true }, + GrugFarResultsMatch = { fg = p.void, bg = p.tech, bold = true }, + GrugFarResultsMatchAdded = { fg = p.toxic }, + GrugFarResultsMatchRemoved = { fg = p.razor }, + GrugFarResultsLineNo = { fg = p.dim }, + GrugFarResultsPath = { fg = p.tech, underline = true }, + GrugFarResultsStats = { fg = p.dim }, + GrugFarInputLabel = { fg = p.amber, bold = true }, + GrugFarInputPlaceholder = { fg = p.stealth }, + GrugFarHelpHeader = { fg = p.dim, bold = true }, + GrugFarHelpWinHeader = { fg = p.ink, bg = p.panel, bold = true }, + + -- PLUGINS: TWINNY (AI Ghost Text) ---------------------------------------- + TwinnyAccept = { fg = p.stealth, italic = true }, + TwinnyHint = { fg = p.stealth, italic = true }, + + -- PLUGINS: GITSIGNS (extended) ------------------------------------------- + GitSignsCurrentLineBlame = { fg = p.stealth, italic = true }, + GitSignsAddNr = { fg = p.toxic }, + GitSignsChangeNr = { fg = p.tech }, + GitSignsDeleteNr = { fg = p.razor }, + GitSignsAddLn = { fg = p.toxic, bg = p.panel }, + GitSignsChangeLn = { fg = p.tech, bg = p.panel }, + GitSignsDeleteLn = { fg = p.razor, bg = p.panel }, + GitSignsAddPreview = { fg = p.toxic, bg = p.panel }, + GitSignsDeletePreview = { fg = p.razor, bg = p.panel }, + GitSignsAddInline = { fg = p.void, bg = p.toxic }, + GitSignsDeleteInline = { fg = p.void, bg = p.razor }, + GitSignsChangeInline = { fg = p.void, bg = p.tech }, + GitSignsUntracked = { fg = p.dim }, + + -- PLUGINS: RENDER-MARKDOWN ------------------------------------------------ + RenderMarkdownH1 = { fg = p.razor, bold = true }, + RenderMarkdownH2 = { fg = p.amber, bold = true }, + RenderMarkdownH3 = { fg = p.tech, bold = true }, + RenderMarkdownH4 = { fg = p.toxic, bold = true }, + RenderMarkdownH5 = { fg = p.sacred, bold = true }, + RenderMarkdownH6 = { fg = p.azure, bold = true }, + RenderMarkdownH1Bg = { bg = p.panel }, + RenderMarkdownH2Bg = { bg = p.panel }, + RenderMarkdownH3Bg = { bg = p.panel }, + RenderMarkdownH4Bg = { bg = p.panel }, + RenderMarkdownH5Bg = { bg = p.panel }, + RenderMarkdownH6Bg = { bg = p.panel }, + RenderMarkdownCode = { bg = p.panel }, + RenderMarkdownCodeInline = { fg = p.toxic, bg = p.panel }, + RenderMarkdownBullet = { fg = p.razor }, + RenderMarkdownQuote = { fg = p.stealth, italic = true }, + RenderMarkdownDash = { fg = p.border }, + RenderMarkdownLink = { fg = p.tech, underline = true }, + RenderMarkdownSign = { bg = p.void }, + RenderMarkdownMath = { fg = p.tech }, + RenderMarkdownTableHead = { fg = p.ink, bg = p.razor, bold = true }, + RenderMarkdownTableRow = { fg = p.text }, + RenderMarkdownTableFill = { fg = p.border }, + RenderMarkdownTodo = { fg = p.void, bg = p.amber, bold = true }, + RenderMarkdownUnchecked = { fg = p.stealth }, + RenderMarkdownChecked = { fg = p.toxic }, } for group, highlight in pairs(groups) do @@ -376,6 +723,44 @@ function M.load() end end +-- PLUGINS: LUALINE -------------------------------------------------------- +-- Export lualine theme from palette for use in lualine config +do + local p = M.palette + M.lualine = { + normal = { + a = { fg = p.ink, bg = p.razor, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + insert = { + a = { fg = p.ink, bg = p.toxic, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + visual = { + a = { fg = p.ink, bg = p.tech, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + replace = { + a = { fg = p.ink, bg = p.amber, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + command = { + a = { fg = p.ink, bg = p.sacred, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + inactive = { + a = { fg = p.dim, bg = p.panel }, + b = { fg = p.dim, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + } +end + M.load() return M \ No newline at end of file diff --git a/dot_config/nvim/colors/apex-neon.lua b/dot_config/nvim/colors/apex-neon.lua index f171fb5..10702a6 100644 --- a/dot_config/nvim/colors/apex-neon.lua +++ b/dot_config/nvim/colors/apex-neon.lua @@ -238,6 +238,353 @@ function M.load() CmpItemKindMethod = { fg = p.azure }, CmpItemKindKeyword = { fg = p.sacred }, CmpItemKindVariable = { fg = p.text }, + + -- PLUGINS: BLINK.CMP (Completion) ---------------------------------------- + BlinkCmpMenu = { fg = p.text, bg = p.panel }, + BlinkCmpMenuBorder = { fg = p.border, bg = p.panel }, + BlinkCmpMenuSelection = { fg = p.ink, bg = p.razor, bold = true }, + BlinkCmpScrollBarThumb = { bg = p.stealth }, + BlinkCmpScrollBarGutter = { bg = p.panel }, + BlinkCmpLabel = { fg = p.text }, + BlinkCmpLabelDeprecated = { fg = p.dim, strikethrough = true }, + BlinkCmpLabelMatch = { fg = p.tech, bold = true }, + BlinkCmpKindText = { fg = p.text }, + BlinkCmpKindMethod = { fg = p.azure }, + BlinkCmpKindFunction = { fg = p.azure }, + BlinkCmpKindConstructor = { fg = p.amber }, + BlinkCmpKindField = { fg = p.text }, + BlinkCmpKindVariable = { fg = p.text }, + BlinkCmpKindClass = { fg = p.amber }, + BlinkCmpKindInterface = { fg = p.amber }, + BlinkCmpKindModule = { fg = p.amber }, + BlinkCmpKindProperty = { fg = p.text }, + BlinkCmpKindUnit = { fg = p.tech }, + BlinkCmpKindValue = { fg = p.tech }, + BlinkCmpKindEnum = { fg = p.amber }, + BlinkCmpKindKeyword = { fg = p.sacred }, + BlinkCmpKindSnippet = { fg = p.toxic }, + BlinkCmpKindColor = { fg = p.tech }, + BlinkCmpKindFile = { fg = p.text }, + BlinkCmpKindReference = { fg = p.tech }, + BlinkCmpKindFolder = { fg = p.text }, + BlinkCmpKindEnumMember = { fg = p.tech }, + BlinkCmpKindConstant = { fg = p.tech }, + BlinkCmpKindStruct = { fg = p.amber }, + BlinkCmpKindEvent = { fg = p.amber }, + BlinkCmpKindOperator = { fg = p.text }, + BlinkCmpKindTypeParameter = { fg = p.amber }, + BlinkCmpGhostText = { fg = p.stealth, italic = true }, + BlinkCmpDoc = { fg = p.text, bg = p.panel }, + BlinkCmpDocBorder = { fg = p.border, bg = p.panel }, + BlinkCmpDocSeparator = { fg = p.border, bg = p.panel }, + BlinkCmpDocCursorLine = { bg = p.border }, + BlinkCmpSignatureHelp = { fg = p.text, bg = p.panel }, + BlinkCmpSignatureHelpBorder = { fg = p.border, bg = p.panel }, + BlinkCmpSignatureHelpActiveParameter = { fg = p.ink, bg = p.tech, bold = true }, + BlinkCmpSource = { fg = p.dim }, + + -- PLUGINS: BUFFERLINE ----------------------------------------------------- + BufferLineBackground = { fg = p.dim, bg = p.panel }, + BufferLineFill = { bg = p.panel }, + BufferLineBuffer = { fg = p.dim, bg = p.panel }, + BufferLineBufferSelected = { fg = p.text, bg = p.void, bold = true }, + BufferLineBufferVisible = { fg = p.dim, bg = p.panel }, + BufferLineTab = { fg = p.dim, bg = p.panel }, + BufferLineTabSelected = { fg = p.text, bg = p.void, bold = true }, + BufferLineTabClose = { fg = p.razor, bg = p.panel }, + BufferLineModified = { fg = p.tech, bg = p.panel }, + BufferLineModifiedSelected = { fg = p.tech, bg = p.void }, + BufferLineModifiedVisible = { fg = p.tech, bg = p.panel }, + BufferLineSeparator = { fg = p.border, bg = p.panel }, + BufferLineSeparatorSelected = { fg = p.border, bg = p.void }, + BufferLineSeparatorVisible = { fg = p.border, bg = p.panel }, + BufferLineIndicatorSelected = { fg = p.razor, bg = p.void }, + BufferLineCloseButton = { fg = p.dim, bg = p.panel }, + BufferLineCloseButtonSelected = { fg = p.razor, bg = p.void }, + BufferLineCloseButtonVisible = { fg = p.dim, bg = p.panel }, + BufferLineDiagnostic = { fg = p.dim, bg = p.panel }, + BufferLineDiagnosticSelected = { fg = p.dim, bg = p.void }, + BufferLineError = { fg = p.alert, bg = p.panel }, + BufferLineErrorSelected = { fg = p.alert, bg = p.void, bold = true }, + BufferLineWarning = { fg = p.amber, bg = p.panel }, + BufferLineWarningSelected = { fg = p.amber, bg = p.void, bold = true }, + BufferLineInfo = { fg = p.tech, bg = p.panel }, + BufferLineInfoSelected = { fg = p.tech, bg = p.void, bold = true }, + BufferLineHint = { fg = p.dim, bg = p.panel }, + BufferLineHintSelected = { fg = p.dim, bg = p.void, bold = true }, + BufferLinePick = { fg = p.razor, bg = p.panel, bold = true }, + BufferLinePickSelected = { fg = p.razor, bg = p.void, bold = true }, + BufferLinePickVisible = { fg = p.razor, bg = p.panel, bold = true }, + + -- PLUGINS: WHICH-KEY ------------------------------------------------------ + WhichKey = { fg = p.razor, bold = true }, + WhichKeySeparator = { fg = p.stealth }, + WhichKeyGroup = { fg = p.tech }, + WhichKeyDesc = { fg = p.text }, + WhichKeyFloat = { bg = p.panel }, + WhichKeyBorder = { fg = p.border, bg = p.panel }, + WhichKeyTitle = { fg = p.ink, bg = p.razor, bold = true }, + WhichKeyNormal = { fg = p.text, bg = p.panel }, + WhichKeyValue = { fg = p.dim }, + WhichKeyIcon = { fg = p.azure }, + WhichKeyIconAzure = { fg = p.azure }, + WhichKeyIconGreen = { fg = p.toxic }, + WhichKeyIconYellow = { fg = p.amber }, + WhichKeyIconRed = { fg = p.razor }, + WhichKeyIconPurple = { fg = p.sacred }, + WhichKeyIconCyan = { fg = p.tech }, + + -- PLUGINS: TROUBLE -------------------------------------------------------- + TroubleNormal = { fg = p.text, bg = p.void }, + TroubleNormalNC = { fg = p.dim, bg = p.void }, + TroubleText = { fg = p.text }, + TroubleCount = { fg = p.ink, bg = p.razor, bold = true }, + TroubleError = { fg = p.alert }, + TroubleWarning = { fg = p.amber }, + TroubleHint = { fg = p.dim }, + TroubleInfo = { fg = p.tech }, + TroubleSource = { fg = p.dim }, + TroubleCode = { fg = p.stealth }, + TroubleLocation = { fg = p.dim }, + TroubleFile = { fg = p.tech, bold = true }, + TroubleIndent = { fg = p.border }, + TroublePos = { fg = p.dim }, + TroubleSignError = { fg = p.alert }, + TroubleSignWarning = { fg = p.amber }, + TroubleSignHint = { fg = p.dim }, + TroubleSignInfo = { fg = p.tech }, + TroublePreview = { fg = p.ink, bg = p.razor }, + TroubleFocusText = { fg = p.text, bold = true }, + + -- PLUGINS: INDENT-BLANKLINE ----------------------------------------------- + IblIndent = { fg = p.border }, + IblScope = { fg = p.stealth }, + IblWhitespace = { fg = p.border }, + + -- PLUGINS: NEOGIT --------------------------------------------------------- + NeogitBranch = { fg = p.razor, bold = true }, + NeogitRemote = { fg = p.tech }, + NeogitHunkHeader = { fg = p.text, bg = p.panel, bold = true }, + NeogitHunkHeaderHighlight = { fg = p.ink, bg = p.tech, bold = true }, + NeogitDiffAdd = { fg = p.toxic, bg = p.void }, + NeogitDiffDelete = { fg = p.razor, bg = p.void }, + NeogitDiffContext = { fg = p.dim, bg = p.void }, + NeogitDiffAddHighlight = { fg = p.toxic, bg = p.panel }, + NeogitDiffDeleteHighlight = { fg = p.razor, bg = p.panel }, + NeogitDiffContextHighlight = { fg = p.text, bg = p.panel }, + NeogitCommitViewHeader = { fg = p.ink, bg = p.razor, bold = true }, + NeogitFilePath = { fg = p.tech, underline = true }, + NeogitDiffHeader = { fg = p.amber, bold = true }, + NeogitDiffHeaderHighlight = { fg = p.ink, bg = p.amber, bold = true }, + NeogitObjectId = { fg = p.dim }, + NeogitStashes = { fg = p.sacred }, + NeogitRebaseDone = { fg = p.toxic }, + NeogitFold = { fg = p.stealth }, + + -- PLUGINS: AERIAL (Symbols Outline) -------------------------------------- + AerialLine = { fg = p.ink, bg = p.razor }, + AerialLineNC = { fg = p.dim, bg = p.panel }, + AerialNormal = { fg = p.text, bg = p.void }, + AerialGuide = { fg = p.border }, + AerialClass = { fg = p.amber }, + AerialClassIcon = { fg = p.amber }, + AerialFunction = { fg = p.azure }, + AerialFunctionIcon = { fg = p.azure }, + AerialMethod = { fg = p.azure }, + AerialMethodIcon = { fg = p.azure }, + AerialConstructor = { fg = p.amber }, + AerialField = { fg = p.text }, + AerialVariable = { fg = p.text }, + AerialEnum = { fg = p.amber }, + AerialEnumIcon = { fg = p.amber }, + AerialInterface = { fg = p.amber }, + AerialModule = { fg = p.amber }, + AerialNamespace = { fg = p.amber }, + AerialPackage = { fg = p.amber }, + AerialProperty = { fg = p.text }, + AerialStruct = { fg = p.amber }, + AerialType = { fg = p.amber }, + AerialTypeParameter = { fg = p.amber }, + AerialConstant = { fg = p.tech }, + AerialString = { fg = p.toxic }, + AerialNumber = { fg = p.tech }, + AerialBoolean = { fg = p.tech }, + AerialKey = { fg = p.sacred }, + AerialKeyword = { fg = p.sacred }, + AerialOperator = { fg = p.text }, + AerialNull = { fg = p.dim }, + AerialArray = { fg = p.tech }, + AerialObject = { fg = p.amber }, + AerialEvent = { fg = p.amber }, + + -- PLUGINS: DAP-UI --------------------------------------------------------- + DapUIScope = { fg = p.tech, bold = true }, + DapUIType = { fg = p.amber }, + DapUIDecoration = { fg = p.border }, + DapUIThread = { fg = p.toxic }, + DapUIStoppedThread = { fg = p.razor, bold = true }, + DapUICurrentFrameName = { fg = p.razor, bold = true }, + DapUISource = { fg = p.dim }, + DapUILineNumber = { fg = p.stealth }, + DapUIFloatBorder = { fg = p.border, bg = p.panel }, + DapUIFloatNormal = { fg = p.text, bg = p.panel }, + DapUIWatchesEmpty = { fg = p.dim }, + DapUIWatchesValue = { fg = p.toxic }, + DapUIWatchesError = { fg = p.alert }, + DapUIBreakpointsPath = { fg = p.tech }, + DapUIBreakpointsInfo = { fg = p.dim }, + DapUIBreakpointsCurrentLine = { fg = p.razor, bold = true }, + DapUIBreakpointsDisabledLine = { fg = p.stealth }, + DapUIEndofBuffer = { fg = p.void }, + DapUIModifiedValue = { fg = p.amber, bold = true }, + DapUIStop = { fg = p.razor }, + DapUIStepOver = { fg = p.tech }, + DapUIStepInto = { fg = p.tech }, + DapUIStepBack = { fg = p.tech }, + DapUIStepOut = { fg = p.tech }, + DapUIRestart = { fg = p.toxic }, + DapUIUnavailable = { fg = p.stealth }, + DapUIPlayPause = { fg = p.toxic }, + + -- PLUGINS: DAP VIRTUAL TEXT ----------------------------------------------- + NvimDapVirtualText = { fg = p.dim, italic = true }, + NvimDapVirtualTextChanged = { fg = p.amber, italic = true }, + NvimDapVirtualTextError = { fg = p.alert, italic = true }, + NvimDapVirtualTextInfo = { fg = p.tech, italic = true }, + + -- PLUGINS: NVIM-NOTIFY ---------------------------------------------------- + NotifyERRORBorder = { fg = p.razor }, + NotifyWARNBorder = { fg = p.amber }, + NotifyINFOBorder = { fg = p.tech }, + NotifyDEBUGBorder = { fg = p.stealth }, + NotifyTRACEBorder = { fg = p.sacred }, + NotifyERRORIcon = { fg = p.razor }, + NotifyWARNIcon = { fg = p.amber }, + NotifyINFOIcon = { fg = p.tech }, + NotifyDEBUGIcon = { fg = p.stealth }, + NotifyTRACEIcon = { fg = p.sacred }, + NotifyERRORTitle = { fg = p.razor, bold = true }, + NotifyWARNTitle = { fg = p.amber, bold = true }, + NotifyINFOTitle = { fg = p.tech, bold = true }, + NotifyDEBUGTitle = { fg = p.stealth, bold = true }, + NotifyTRACETitle = { fg = p.sacred, bold = true }, + NotifyERRORBody = { fg = p.text, bg = p.panel }, + NotifyWARNBody = { fg = p.text, bg = p.panel }, + NotifyINFOBody = { fg = p.text, bg = p.panel }, + NotifyDEBUGBody = { fg = p.dim, bg = p.panel }, + NotifyTRACEBody = { fg = p.dim, bg = p.panel }, + + -- PLUGINS: SATELLITE (Scrollbar) ----------------------------------------- + SatelliteBar = { bg = p.panel }, + SatelliteCursor = { fg = p.razor }, + SatellitePosition = { fg = p.dim }, + SatelliteError = { fg = p.alert }, + SatelliteWarning = { fg = p.amber }, + SatelliteHint = { fg = p.dim }, + SatelliteInfo = { fg = p.tech }, + SatelliteSearch = { fg = p.tech }, + SatelliteGit = { fg = p.toxic }, + SatelliteMark = { fg = p.amber }, + + -- PLUGINS: OIL.NVIM (File Explorer) -------------------------------------- + OilDir = { fg = p.tech, bold = true }, + OilDirIcon = { fg = p.tech }, + OilLink = { fg = p.sacred, italic = true }, + OilLinkTarget = { fg = p.sacred }, + OilCopy = { fg = p.amber, bold = true }, + OilMove = { fg = p.amber }, + OilChange = { fg = p.tech }, + OilCreate = { fg = p.toxic, bold = true }, + OilDelete = { fg = p.razor, bold = true }, + OilPermissionNone = { fg = p.stealth }, + OilPermissionRead = { fg = p.tech }, + OilPermissionWrite = { fg = p.amber }, + OilPermissionExecute = { fg = p.toxic }, + OilTypeDir = { fg = p.tech }, + OilTypeFile = { fg = p.text }, + OilTypeLink = { fg = p.sacred }, + OilTypeSpecial = { fg = p.razor }, + OilSize = { fg = p.dim }, + OilMtime = { fg = p.stealth }, + + -- PLUGINS: NEOTEST -------------------------------------------------------- + NeotestPassed = { fg = p.toxic }, + NeotestFailed = { fg = p.razor }, + NeotestRunning = { fg = p.amber }, + NeotestSkipped = { fg = p.dim }, + NeotestUnknown = { fg = p.stealth }, + NeotestTest = { fg = p.text }, + NeotestFile = { fg = p.tech }, + NeotestDir = { fg = p.tech, bold = true }, + NeotestNamespace = { fg = p.amber }, + NeotestMarked = { fg = p.razor, bold = true }, + NeotestTarget = { fg = p.razor }, + NeotestAdapterName = { fg = p.sacred, bold = true }, + NeotestWinSelect = { fg = p.tech, bold = true }, + NeotestFocused = { bold = true }, + NeotestIndent = { fg = p.border }, + NeotestExpandMarker = { fg = p.dim }, + NeotestWatching = { fg = p.amber }, + + -- PLUGINS: GRUG-FAR (Search & Replace) ----------------------------------- + GrugFarResultsHeader = { fg = p.ink, bg = p.razor, bold = true }, + GrugFarResultsMatch = { fg = p.void, bg = p.tech, bold = true }, + GrugFarResultsMatchAdded = { fg = p.toxic }, + GrugFarResultsMatchRemoved = { fg = p.razor }, + GrugFarResultsLineNo = { fg = p.dim }, + GrugFarResultsPath = { fg = p.tech, underline = true }, + GrugFarResultsStats = { fg = p.dim }, + GrugFarInputLabel = { fg = p.amber, bold = true }, + GrugFarInputPlaceholder = { fg = p.stealth }, + GrugFarHelpHeader = { fg = p.dim, bold = true }, + GrugFarHelpWinHeader = { fg = p.ink, bg = p.panel, bold = true }, + + -- PLUGINS: TWINNY (AI Ghost Text) ---------------------------------------- + TwinnyAccept = { fg = p.stealth, italic = true }, + TwinnyHint = { fg = p.stealth, italic = true }, + + -- PLUGINS: GITSIGNS (extended) ------------------------------------------- + GitSignsCurrentLineBlame = { fg = p.stealth, italic = true }, + GitSignsAddNr = { fg = p.toxic }, + GitSignsChangeNr = { fg = p.tech }, + GitSignsDeleteNr = { fg = p.razor }, + GitSignsAddLn = { fg = p.toxic, bg = p.panel }, + GitSignsChangeLn = { fg = p.tech, bg = p.panel }, + GitSignsDeleteLn = { fg = p.razor, bg = p.panel }, + GitSignsAddPreview = { fg = p.toxic, bg = p.panel }, + GitSignsDeletePreview = { fg = p.razor, bg = p.panel }, + GitSignsAddInline = { fg = p.void, bg = p.toxic }, + GitSignsDeleteInline = { fg = p.void, bg = p.razor }, + GitSignsChangeInline = { fg = p.void, bg = p.tech }, + GitSignsUntracked = { fg = p.dim }, + + -- PLUGINS: RENDER-MARKDOWN ------------------------------------------------ + RenderMarkdownH1 = { fg = p.razor, bold = true }, + RenderMarkdownH2 = { fg = p.amber, bold = true }, + RenderMarkdownH3 = { fg = p.tech, bold = true }, + RenderMarkdownH4 = { fg = p.toxic, bold = true }, + RenderMarkdownH5 = { fg = p.sacred, bold = true }, + RenderMarkdownH6 = { fg = p.azure, bold = true }, + RenderMarkdownH1Bg = { bg = p.panel }, + RenderMarkdownH2Bg = { bg = p.panel }, + RenderMarkdownH3Bg = { bg = p.panel }, + RenderMarkdownH4Bg = { bg = p.panel }, + RenderMarkdownH5Bg = { bg = p.panel }, + RenderMarkdownH6Bg = { bg = p.panel }, + RenderMarkdownCode = { bg = p.panel }, + RenderMarkdownCodeInline = { fg = p.toxic, bg = p.panel }, + RenderMarkdownBullet = { fg = p.razor }, + RenderMarkdownQuote = { fg = p.stealth, italic = true }, + RenderMarkdownDash = { fg = p.border }, + RenderMarkdownLink = { fg = p.tech, underline = true }, + RenderMarkdownSign = { bg = p.void }, + RenderMarkdownMath = { fg = p.tech }, + RenderMarkdownTableHead = { fg = p.ink, bg = p.razor, bold = true }, + RenderMarkdownTableRow = { fg = p.text }, + RenderMarkdownTableFill = { fg = p.border }, + RenderMarkdownTodo = { fg = p.void, bg = p.amber, bold = true }, + RenderMarkdownUnchecked = { fg = p.stealth }, + RenderMarkdownChecked = { fg = p.toxic }, } for group, highlight in pairs(groups) do @@ -376,6 +723,44 @@ function M.load() end end +-- PLUGINS: LUALINE -------------------------------------------------------- +-- Export lualine theme from palette for use in lualine config +do + local p = M.palette + M.lualine = { + normal = { + a = { fg = p.ink, bg = p.razor, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + insert = { + a = { fg = p.ink, bg = p.toxic, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + visual = { + a = { fg = p.ink, bg = p.tech, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + replace = { + a = { fg = p.ink, bg = p.amber, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + command = { + a = { fg = p.ink, bg = p.sacred, gui = "bold" }, + b = { fg = p.text, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + inactive = { + a = { fg = p.dim, bg = p.panel }, + b = { fg = p.dim, bg = p.panel }, + c = { fg = p.dim, bg = p.void }, + }, + } +end + M.load() return M \ No newline at end of file diff --git a/dot_config/nvim/init.lua b/dot_config/nvim/init.lua index 2ce1cdd..8e925cb 100644 --- a/dot_config/nvim/init.lua +++ b/dot_config/nvim/init.lua @@ -1,19 +1,54 @@ --- This file simply bootstraps the installation of Lazy.nvim and then calls other files for execution --- This file doesn't necessarily need to be touched, BE CAUTIOUS editing this file and proceed at your own risk. -local lazypath = vim.env.LAZY or vim.fn.stdpath "data" .. "/lazy/lazy.nvim" -if not (vim.env.LAZY or (vim.uv or vim.loop).fs_stat(lazypath)) then - -- stylua: ignore - vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath }) +-- Bootstrap lazy.nvim +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", "clone", "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", lazypath, + }) end vim.opt.rtp:prepend(lazypath) --- validate that lazy is available -if not pcall(require, "lazy") then - -- stylua: ignore - vim.api.nvim_echo({ { ("Unable to load lazy from: %s\n"):format(lazypath), "ErrorMsg" }, { "Press any key to exit...", "MoreMsg" } }, true, {}) - vim.fn.getchar() - vim.cmd.quit() +-- Leader must be set before lazy loads plugins +vim.g.mapleader = " " +vim.g.maplocalleader = " " + +-- Load core config (order matters) +require("options") +require("autocmds") + +-- Load LSP server configurations (vim.lsp.config calls) +-- These must run before vim.lsp.enable() in plugins/lsp.lua +do + local lsp_dir = vim.fn.stdpath("config") .. "/lua/lsp" + for _, name in ipairs(vim.fn.readdir(lsp_dir)) do + if name:match("%.lua$") then + require("lsp." .. name:gsub("%.lua$", "")) + end + end end -require "lazy_setup" -require "polish" +-- Load colorscheme before plugins (prevents flash of wrong colors) +-- colors/apex-neon.lua is managed by refresh-apex-themes, not via lazy +vim.cmd.colorscheme("apex-neon") + +-- Setup lazy.nvim +require("lazy").setup({ + spec = { { import = "plugins" } }, + lockfile = vim.fn.stdpath("config") .. "/lazy-lock.json", + defaults = { lazy = false }, + install = { colorscheme = { "apex-neon", "habamax" } }, + checker = { enabled = false }, + change_detection = { enabled = false }, + performance = { + rtp = { + disabled_plugins = { + "gzip", "matchit", "matchparen", "netrwPlugin", + "tarPlugin", "tohtml", "tutor", "zipPlugin", + }, + }, + }, +}) + +-- Keymaps loaded after lazy so plugin keymaps can be set in their own files +require("keymaps") diff --git a/dot_config/nvim/lazy-lock.json b/dot_config/nvim/lazy-lock.json new file mode 100644 index 0000000..7cd0f8d --- /dev/null +++ b/dot_config/nvim/lazy-lock.json @@ -0,0 +1,56 @@ +{ + "LuaSnip": { "branch": "master", "commit": "642b0c595e11608b4c18219e93b88d7637af27bc" }, + "actions-preview.nvim": { "branch": "master", "commit": "2b604b2e8e662c03b716436f6ffebcb19663e66a" }, + "aerial.nvim": { "branch": "master", "commit": "645d108a5242ec7b378cbe643eb6d04d4223f034" }, + "blink.cmp": { "branch": "main", "commit": "485c03400608cb6534bbf84da8c1c471fc4808c0" }, + "blink.compat": { "branch": "main", "commit": "2ed6d9a28b07fa6f3bface818470605f8896408c" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "cmp-latex-symbols": { "branch": "main", "commit": "0f8a9539f4c1c8fcf3b5244866b07b9d07282fa2" }, + "cmp-vimtex": { "branch": "master", "commit": "c09ca05bfa0641754516f13294d73d3799a02fc8" }, + "conform.nvim": { "branch": "master", "commit": "086a40dc7ed8242c03be9f47fbcee68699cc2395" }, + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, + "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" }, + "gitsigns.nvim": { "branch": "main", "commit": "8d82c240f190fc33723d48c308ccc1ed8baad69d" }, + "grug-far.nvim": { "branch": "main", "commit": "b08a9f8d0602fdf075262e8e1b6dc776b3966003" }, + "indent-blankline.nvim": { "branch": "master", "commit": "d28a3f70721c79e3c5f6693057ae929f3d9c0a03" }, + "lazy.nvim": { "branch": "main", "commit": "306a05526ada86a7b30af95c5cc81ffba93fef97" }, + "llm.nvim": { "branch": "main", "commit": "fdc0758187da61612f9d3365f7a1ac45de47471c" }, + "ltex_extra.nvim": { "branch": "master", "commit": "49ea83c231139d98b7c9668c99e7b4591421b056" }, + "lualine.nvim": { "branch": "master", "commit": "f5d2a8570f8b736ddb9bb4be504355bcd6e15ec8" }, + "luasnip-latex-snippets.nvim": { "branch": "main", "commit": "a14821dd680dfdd2006b135425cc2a8ab297ebc6" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "63a3c6a80538de1003373a619e29aeda27809ad3" }, + "mason-tool-installer.nvim": { "branch": "main", "commit": "443f1ef8b5e6bf47045cb2217b6f748a223cf7dc" }, + "mason.nvim": { "branch": "main", "commit": "b03fb0f20bc1d43daf558cda981a2be22e73ac42" }, + "neogit": { "branch": "master", "commit": "e06745228600a585b88726fc9fba44a373c15a47" }, + "neotest": { "branch": "master", "commit": "fd0b7986dd0ae04e38ec7dc0c78a432e3820839c" }, + "neotest-java": { "branch": "main", "commit": "01b4a5950b4615c4afd132c6edcf04e10150bbe2" }, + "neotest-rust": { "branch": "main", "commit": "2c9941d4a358839918fac21d20fc8fef0e1ad05f" }, + "nvim-autopairs": { "branch": "master", "commit": "59bce2eef357189c3305e25bc6dd2d138c1683f5" }, + "nvim-dap": { "branch": "master", "commit": "45a69eba683a2c448dd9ecfc4de89511f0646b5f" }, + "nvim-dap-ui": { "branch": "master", "commit": "1a66cabaa4a4da0be107d5eda6d57242f0fe7e49" }, + "nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" }, + "nvim-jdtls": { "branch": "master", "commit": "77ccaeb422f8c81b647605da5ddb4a7f725cda90" }, + "nvim-navic": { "branch": "master", "commit": "f5eba192f39b453675d115351808bd51276d9de5" }, + "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, + "nvim-notify": { "branch": "master", "commit": "8701bece920b38ea289b457f902e2ad184131a5d" }, + "nvim-surround": { "branch": "main", "commit": "61319d4bd1c5e336e197defa15bd104c51f0fb29" }, + "nvim-treesitter": { "branch": "master", "commit": "cf12346a3414fa1b06af75c79faebe7f76df080a" }, + "nvim-treesitter-textobjects": { "branch": "master", "commit": "5ca4aaa6efdcc59be46b95a3e876300cfead05ef" }, + "nvim-web-devicons": { "branch": "master", "commit": "6e76c5e47e957fbf080b1fdac165c66dbd2e7cfb" }, + "oil.nvim": { "branch": "master", "commit": "0fcc83805ad11cf714a949c98c605ed717e0b83e" }, + "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" }, + "plenary.nvim": { "branch": "master", "commit": "fcb3e9ac127d178b4c189088396165b3facc219e" }, + "project.nvim": { "branch": "main", "commit": "8c6bad7d22eef1b71144b401c9f74ed01526a4fb" }, + "render-markdown.nvim": { "branch": "main", "commit": "54d4b5431e9634ee3d8d30784e017239b5b89d41" }, + "satellite.nvim": { "branch": "main", "commit": "62b0aa1a941e35e694e8a50b589150bcca8c084d" }, + "scope.nvim": { "branch": "main", "commit": "228aabdb1b9cc74f0c0ccec88e79873857236e49" }, + "smart-splits.nvim": { "branch": "master", "commit": "0bd02161ee5c5378bf4133fcedf53d1fc4179e1d" }, + "statuscol.nvim": { "branch": "main", "commit": "c46172d0911aa5d49ba5f39f4351d1bb7aa289cc" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, + "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, + "toggleterm.nvim": { "branch": "main", "commit": "50ea089fc548917cc3cc16b46a8211833b9e3c7c" }, + "trouble.nvim": { "branch": "main", "commit": "748ca2789044607f19786b1d837044544c55e80a" }, + "vim-visual-multi": { "branch": "master", "commit": "a6975e7c1ee157615bbc80fc25e4392f71c344d4" }, + "vimtex": { "branch": "master", "commit": "9306903316c3ddd250676b7cf97c84a84c9c8f99" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/dot_config/nvim/lua/apex-neon.lua b/dot_config/nvim/lua/apex-neon.lua new file mode 100644 index 0000000..0f740ae --- /dev/null +++ b/dot_config/nvim/lua/apex-neon.lua @@ -0,0 +1,10 @@ +-- Proxy so require("apex-neon") returns the colorscheme module +-- colors/apex-neon.lua is managed by refresh-apex-themes — do not edit that file +-- This shim is safe to keep in chezmoi alongside the colors/ file +local colors_path = vim.fn.stdpath("config") .. "/colors/apex-neon.lua" +local ok, result = pcall(dofile, colors_path) +if not ok then + vim.notify("apex-neon shim: failed to load " .. colors_path, vim.log.levels.WARN) + return {} +end +return result diff --git a/dot_config/nvim/lua/autocmds.lua b/dot_config/nvim/lua/autocmds.lua new file mode 100644 index 0000000..935d1ad --- /dev/null +++ b/dot_config/nvim/lua/autocmds.lua @@ -0,0 +1,81 @@ +local augroup = function(name) + return vim.api.nvim_create_augroup("user_" .. name, { clear = true }) +end + +-- Filetype detection +vim.filetype.add({ extension = { j2 = "jinja.html" } }) + +-- Highlight on yank +vim.api.nvim_create_autocmd("TextYankPost", { + group = augroup("yank_highlight"), + callback = function() + vim.highlight.on_yank() + end, +}) + +-- Remove trailing whitespace on save +vim.api.nvim_create_autocmd("BufWritePre", { + group = augroup("trailing_whitespace"), + pattern = "*", + command = [[%s/\s\+$//e]], +}) + +-- Resize splits when window resizes +vim.api.nvim_create_autocmd("VimResized", { + group = augroup("resize_splits"), + callback = function() + local current_tab = vim.fn.tabpagenr() + vim.cmd("tabdo wincmd =") + vim.cmd("tabnext " .. current_tab) + end, +}) + +-- Close certain filetypes with q +vim.api.nvim_create_autocmd("FileType", { + group = augroup("close_with_q"), + pattern = { "help", "lspinfo", "man", "qf", "checkhealth" }, + callback = function(event) + vim.bo[event.buf].buflisted = false + vim.keymap.set("n", "q", "close", { buffer = event.buf, silent = true }) + end, +}) + +-- LSP on attach: inlay hints + navic +vim.api.nvim_create_autocmd("LspAttach", { + group = augroup("lsp_attach"), + callback = function(args) + local client = vim.lsp.get_client_by_id(args.data.client_id) + if not client then return end + + -- Enable inlay hints + if client.supports_method("textDocument/inlayHint") then + vim.lsp.inlay_hint.enable(true, { bufnr = args.buf }) + end + + -- Wire nvim-navic for breadcrumbs (lualine winbar) + if client.supports_method("textDocument/documentSymbol") then + local ok, navic = pcall(require, "nvim-navic") + if ok then + navic.attach(client, args.buf) + end + end + + -- LSP keymaps (buffer-local) + local map = function(keys, func, desc) + vim.keymap.set("n", keys, func, { buffer = args.buf, desc = "LSP: " .. desc }) + end + + map("gd", vim.lsp.buf.definition, "Go to definition") + map("gi", vim.lsp.buf.implementation, "Go to implementation") + map("D", vim.lsp.buf.type_definition, "Type definition") + map("lf", function() vim.lsp.buf.format({ async = true }) end, "Format") + map("lr", vim.lsp.buf.rename, "Rename symbol") + map("ls", vim.lsp.buf.document_symbol, "Document symbols") + map("lR", vim.lsp.buf.references, "References") + map("li", function() + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = args.buf }), { bufnr = args.buf }) + end, "Toggle inlay hints") + + -- grr, grn, gra, K are Neovim 0.12 built-ins, no need to set + end, +}) diff --git a/dot_config/nvim/lua/community.lua b/dot_config/nvim/lua/community.lua deleted file mode 100644 index 4e1be48..0000000 --- a/dot_config/nvim/lua/community.lua +++ /dev/null @@ -1,29 +0,0 @@ --- AstroCommunity: import any community modules here --- We import this file in `lazy_setup.lua` before the `plugins/` folder. --- This guarantees that the specs are processed before any user plugins. - ----@type LazySpec -return { - "AstroNvim/astrocommunity", - -- these packs can set up things such as Treesitter, Language Servers, additional language specific plugins, and more! - { import = "astrocommunity.snippet.nvim-snippets" }, - { import = "astrocommunity.pack.lua" }, - { import = "astrocommunity.pack.hyprlang" }, - { import = "astrocommunity.pack.java" }, - { import = "astrocommunity.pack.rust" }, - { import = "astrocommunity.pack.go" }, - { import = "astrocommunity.pack.docker" }, - { import = "astrocommunity.pack.json" }, - { import = "astrocommunity.pack.html-css" }, - { import = "astrocommunity.pack.sql" }, - { import = "astrocommunity.pack.typescript" }, - { import = "astrocommunity.pack.toml" }, - { import = "astrocommunity.pack.xml" }, - { import = "astrocommunity.pack.yaml" }, - { import = "astrocommunity.pack.python" }, - { import = "astrocommunity.pack.kotlin" }, - { import = "astrocommunity.pack.php" }, - - { import = "astrocommunity.markdown-and-latex.vimtex" }, - -- import/override with your plugins folder -} diff --git a/dot_config/nvim/lua/keymaps.lua b/dot_config/nvim/lua/keymaps.lua new file mode 100644 index 0000000..87bef62 --- /dev/null +++ b/dot_config/nvim/lua/keymaps.lua @@ -0,0 +1,43 @@ +local map = vim.keymap.set + +-- Better window navigation +map("n", "|", "v", { desc = "Vertical split" }) +map("n", "-", "s", { desc = "Horizontal split" }) +map("n", "w", "q", { desc = "Close split" }) + +-- Buffer navigation +map("n", "]b", "bnext", { desc = "Next buffer" }) +map("n", "[b", "bprevious", { desc = "Prev buffer" }) +map("n", "bd", "bdelete", { desc = "Delete buffer" }) +map("n", "bo", "%bd|e#|bd#", { desc = "Close other buffers" }) + +-- Diagnostics +map("n", "]d", vim.diagnostic.goto_next, { desc = "Next diagnostic" }) +map("n", "[d", vim.diagnostic.goto_prev, { desc = "Prev diagnostic" }) + +-- Move lines +map("v", "J", ":m '>+1gv=gv", { desc = "Move selection down" }) +map("v", "K", ":m '<-2gv=gv", { desc = "Move selection up" }) + +-- Keep cursor centered +map("n", "", "zz") +map("n", "", "zz") +map("n", "n", "nzzzv") +map("n", "N", "Nzzzv") + +-- Clear search highlight +map("n", "", "nohlsearch") + +-- Don't yank on paste in visual mode +map("x", "p", '"_dP', { desc = "Paste without yanking" }) + +-- Better indenting +map("v", "<", "", ">gv") + +-- Save +map({ "n", "i" }, "", "w", { desc = "Save" }) + +-- Quit +map("n", "q", "q", { desc = "Quit" }) +map("n", "Q", "qa", { desc = "Quit all" }) diff --git a/dot_config/nvim/lua/lazy_setup.lua b/dot_config/nvim/lua/lazy_setup.lua deleted file mode 100644 index 4d9552f..0000000 --- a/dot_config/nvim/lua/lazy_setup.lua +++ /dev/null @@ -1,32 +0,0 @@ -require("lazy").setup({ - { - "AstroNvim/AstroNvim", - version = "^5", -- Remove version tracking to elect for nightly AstroNvim - import = "astronvim.plugins", - opts = { -- AstroNvim options must be set here with the `import` key - mapleader = " ", -- This ensures the leader key must be configured before Lazy is set up - maplocalleader = ",", -- This ensures the localleader key must be configured before Lazy is set up - icons_enabled = true, -- Set to false to disable icons (if no Nerd Font is available) - pin_plugins = nil, -- Default will pin plugins when tracking `version` of AstroNvim, set to true/false to override - update_notifications = true, -- Enable/disable notification about running `:Lazy update` twice to update pinned plugins - }, - }, - { import = "community" }, - { import = "plugins" }, -} --[[@as LazySpec]], { - -- Configure any other `lazy.nvim` configuration options here - install = { colorscheme = { "astrotheme", "habamax" } }, - ui = { backdrop = 100 }, - performance = { - rtp = { - -- disable some rtp plugins, add more to your liking - disabled_plugins = { - "gzip", - "netrwPlugin", - "tarPlugin", - "tohtml", - "zipPlugin", - }, - }, - }, -} --[[@as LazyConfig]]) diff --git a/dot_config/nvim/lua/lsp/ltex.lua b/dot_config/nvim/lua/lsp/ltex.lua new file mode 100644 index 0000000..238189a --- /dev/null +++ b/dot_config/nvim/lua/lsp/ltex.lua @@ -0,0 +1,38 @@ +-- LTeX grammar/spell checking for LaTeX and Markdown +-- ltex_extra.nvim manages dictionaries/rules persistence +vim.lsp.config("ltex", { + filetypes = { "tex", "plaintex", "bib", "markdown" }, + settings = { + ltex = { + checkFrequency = "save", + language = "en-GB", + additionalRules = { motherTongue = "de-DE" }, + dictionary = { + ["en-GB"] = {}, + ["de-DE"] = {}, + ["fr-FR"] = {}, + }, + disabledRules = { + ["en-GB"] = {}, + ["de-DE"] = {}, + ["fr-FR"] = {}, + }, + hiddenFalsePositives = { + ["en-GB"] = {}, + ["de-DE"] = {}, + ["fr-FR"] = {}, + }, + }, + }, + on_attach = function(client, bufnr) + local ok, ltex_extra = pcall(require, "ltex_extra") + if ok then + ltex_extra.setup({ + load_langs = { "en-GB", "de-DE", "fr-FR" }, + init_check = true, + path = ".ltex", + log_level = "none", + }) + end + end, +}) diff --git a/dot_config/nvim/lua/lsp/lua_ls.lua b/dot_config/nvim/lua/lsp/lua_ls.lua new file mode 100644 index 0000000..97ac419 --- /dev/null +++ b/dot_config/nvim/lua/lsp/lua_ls.lua @@ -0,0 +1,17 @@ +vim.lsp.config("lua_ls", { + settings = { + Lua = { + runtime = { version = "LuaJIT" }, + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME, + "${3rd}/luv/library", + }, + }, + diagnostics = { globals = { "vim" } }, + telemetry = { enable = false }, + format = { enable = false }, -- stylua handles formatting + }, + }, +}) diff --git a/dot_config/nvim/lua/lsp/marksman.lua b/dot_config/nvim/lua/lsp/marksman.lua new file mode 100644 index 0000000..3a6549c --- /dev/null +++ b/dot_config/nvim/lua/lsp/marksman.lua @@ -0,0 +1 @@ +vim.lsp.config("marksman", {}) diff --git a/dot_config/nvim/lua/lsp/rust_analyzer.lua b/dot_config/nvim/lua/lsp/rust_analyzer.lua new file mode 100644 index 0000000..3491d3e --- /dev/null +++ b/dot_config/nvim/lua/lsp/rust_analyzer.lua @@ -0,0 +1,40 @@ +vim.lsp.config("rust_analyzer", { + settings = { + ["rust-analyzer"] = { + cargo = { + allFeatures = true, + loadOutDirsFromCheck = true, + runBuildScripts = true, + }, + checkOnSave = { + allFeatures = true, + command = "clippy", + extraArgs = { "--no-deps" }, + }, + procMacro = { + enable = true, + ignored = { + ["async-trait"] = { "async_trait" }, + ["napi-derive"] = { "napi" }, + ["async-recursion"] = { "async_recursion" }, + }, + }, + inlayHints = { + bindingModeHints = { enable = false }, + closingBraceHints = { minLines = 25 }, + lifetimeElisionHints = { enable = "never" }, + typeHints = { enable = true }, + }, + }, + }, +}) + +-- Support project-local override (e.g. Tauri: root_dir = src-tauri/) +local local_cfg_path = vim.fn.getcwd() .. "/.nvim.lua" +local local_cfg = vim.secure.read(local_cfg_path) +if local_cfg then + local ok, err = pcall(loadstring(local_cfg)) + if not ok then + vim.notify("rust_analyzer local config error: " .. tostring(err), vim.log.levels.WARN) + end +end diff --git a/dot_config/nvim/lua/lsp/svelte.lua b/dot_config/nvim/lua/lsp/svelte.lua new file mode 100644 index 0000000..081faad --- /dev/null +++ b/dot_config/nvim/lua/lsp/svelte.lua @@ -0,0 +1,10 @@ +vim.lsp.config("svelte", { + on_attach = function(client, _) + vim.api.nvim_create_autocmd("BufWritePost", { + pattern = { "*.js", "*.ts" }, + callback = function(ctx) + client.notify("$/onDidChangeTsOrJsFile", { uri = ctx.match }) + end, + }) + end, +}) diff --git a/dot_config/nvim/lua/lsp/taplo.lua b/dot_config/nvim/lua/lsp/taplo.lua new file mode 100644 index 0000000..04b3615 --- /dev/null +++ b/dot_config/nvim/lua/lsp/taplo.lua @@ -0,0 +1,13 @@ +vim.lsp.config("taplo", { + settings = { + evenBetterToml = { + formatter = { + indentTables = false, + indentEntries = false, + inlineTable = {}, + trailingNewline = true, + reorderKeys = false, + }, + }, + }, +}) diff --git a/dot_config/nvim/lua/lsp/texlab.lua b/dot_config/nvim/lua/lsp/texlab.lua new file mode 100644 index 0000000..331c298 --- /dev/null +++ b/dot_config/nvim/lua/lsp/texlab.lua @@ -0,0 +1,20 @@ +vim.lsp.config("texlab", { + settings = { + texlab = { + build = { + executable = "latexmk", + args = { "-pdf", "-interaction=nonstopmode", "-synctex=1", "%f" }, + onSave = false, + forwardSearchAfter = false, + }, + chktex = { + onOpenAndSave = false, + onEdit = false, + }, + diagnosticsDelay = 300, + formatterLineLength = 80, + bibtexFormatter = "texlab", + latexFormatter = "latexindent", + }, + }, +}) diff --git a/dot_config/nvim/lua/lsp/ts_ls.lua b/dot_config/nvim/lua/lsp/ts_ls.lua new file mode 100644 index 0000000..c3e8a68 --- /dev/null +++ b/dot_config/nvim/lua/lsp/ts_ls.lua @@ -0,0 +1,26 @@ +vim.lsp.config("ts_ls", { + settings = { + typescript = { + inlayHints = { + includeInlayParameterNameHints = "all", + includeInlayParameterNameHintsWhenArgumentMatchesName = false, + includeInlayFunctionParameterTypeHints = true, + includeInlayVariableTypeHints = true, + includeInlayPropertyDeclarationTypeHints = true, + includeInlayFunctionLikeReturnTypeHints = true, + includeInlayEnumMemberValueHints = true, + }, + }, + javascript = { + inlayHints = { + includeInlayParameterNameHints = "all", + includeInlayParameterNameHintsWhenArgumentMatchesName = false, + includeInlayFunctionParameterTypeHints = true, + includeInlayVariableTypeHints = true, + includeInlayPropertyDeclarationTypeHints = true, + includeInlayFunctionLikeReturnTypeHints = true, + includeInlayEnumMemberValueHints = true, + }, + }, + }, +}) diff --git a/dot_config/nvim/lua/lsp/yamlls.lua b/dot_config/nvim/lua/lsp/yamlls.lua new file mode 100644 index 0000000..17ca712 --- /dev/null +++ b/dot_config/nvim/lua/lsp/yamlls.lua @@ -0,0 +1,11 @@ +vim.lsp.config("yamlls", { + settings = { + yaml = { + keyOrdering = false, + format = { enable = true }, + validate = true, + schemaStore = { enable = false, url = "" }, + schemas = {}, + }, + }, +}) diff --git a/dot_config/nvim/lua/options.lua b/dot_config/nvim/lua/options.lua new file mode 100644 index 0000000..acc8012 --- /dev/null +++ b/dot_config/nvim/lua/options.lua @@ -0,0 +1,62 @@ +local opt = vim.opt + +-- Line numbers +opt.number = true +opt.relativenumber = true +opt.signcolumn = "yes" + +-- Indentation +opt.tabstop = 4 +opt.shiftwidth = 4 +opt.expandtab = true +opt.smartindent = true + +-- Editing +opt.wrap = false +opt.scrolloff = 8 +opt.sidescrolloff = 8 +opt.virtualedit = "block" +opt.clipboard = "unnamedplus" + +-- Files +opt.undofile = true +opt.swapfile = false +opt.backup = false + +-- Windows +opt.splitright = true +opt.splitbelow = true + +-- Search +opt.ignorecase = true +opt.smartcase = true +opt.hlsearch = true +opt.incsearch = true + +-- Performance +opt.updatetime = 250 +opt.timeoutlen = 300 + +-- Appearance +opt.termguicolors = true +opt.cursorline = true +opt.showmode = false -- lualine handles this +opt.pumheight = 10 +opt.conceallevel = 2 -- for LaTeX/Markdown + +-- Folds (treesitter-based, foldenable=false = open all by default) +opt.foldmethod = "expr" +opt.foldexpr = "v:lua.vim.treesitter.foldexpr()" +opt.foldenable = false +opt.foldlevel = 99 + +-- Spell (disabled globally; enabled per-filetype via ftplugin/) +opt.spell = false + +-- Completion +opt.completeopt = { "menu", "menuone", "noselect" } + +-- Misc +opt.mouse = "a" +opt.fileencoding = "utf-8" +opt.shortmess:append("c") diff --git a/dot_config/nvim/lua/plugins/ai.lua b/dot_config/nvim/lua/plugins/ai.lua new file mode 100644 index 0000000..6b4cb99 --- /dev/null +++ b/dot_config/nvim/lua/plugins/ai.lua @@ -0,0 +1,34 @@ +return { + -- Local AI ghost text via ollama (FIM completion) + { + "huggingface/llm.nvim", + event = "InsertEnter", + keys = { + { "ta", "LLMToggleAutoSuggest", desc = "Toggle AI suggestions" }, + }, + opts = { + backend = "ollama", + model = "qwen2.5-coder:latest", + url = vim.env.OLLAMA_HOST or "http://localhost:11434", + tokens_to_clear = { "<|endoftext|>" }, + fim = { + enabled = true, + prefix = "<|fim_prefix|>", + middle = "<|fim_middle|>", + suffix = "<|fim_suffix|>", + }, + context_window = 4096, + tokenizer = nil, -- use token estimation + enable_suggestions_on_startup = true, + display = { + renderer = "virtual-text", + virtual_text = { + enabled = true, + hl = "Comment", + }, + }, + accept_keymap = "", + dismiss_keymap = "", + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/astrocore.lua b/dot_config/nvim/lua/plugins/astrocore.lua index 85f94dc..17c187b 100644 --- a/dot_config/nvim/lua/plugins/astrocore.lua +++ b/dot_config/nvim/lua/plugins/astrocore.lua @@ -1,83 +1,2 @@ --- AstroCore provides a central place to modify mappings, vim options, autocommands, and more! --- Configuration documentation can be found with `:h astrocore` --- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) --- as this provides autocomplete and documentation while editing - ----@type LazySpec -return { - "AstroNvim/astrocore", - ---@type AstroCoreOpts - opts = { - -- Configure core features of AstroNvim - features = { - large_buf = { size = 1024 * 256, lines = 10000 }, -- set global limits for large files for disabling features like treesitter - autopairs = true, -- enable autopairs at start - cmp = true, -- enable completion at start - diagnostics = { virtual_text = true, virtual_lines = false }, -- diagnostic settings on startup - highlighturl = true, -- highlight URLs at start - notifications = true, -- enable notifications at start - }, - -- Diagnostics configuration (for vim.diagnostics.config({...})) when diagnostics are on - diagnostics = { - virtual_text = true, - underline = true, - }, - -- passed to `vim.filetype.add` - filetypes = { - -- see `:h vim.filetype.add` for usage - extension = { - foo = "fooscript", - }, - filename = { - [".foorc"] = "fooscript", - }, - pattern = { - [".*/etc/foo/.*"] = "fooscript", - }, - }, - -- vim options can be configured here - options = { - opt = { -- vim.opt. - relativenumber = true, -- sets vim.opt.relativenumber - number = true, -- sets vim.opt.number - spell = false, -- sets vim.opt.spell - signcolumn = "yes", -- sets vim.opt.signcolumn to yes - wrap = false, -- sets vim.opt.wrap - }, - g = { -- vim.g. - -- configure global vim variables (vim.g) - -- NOTE: `mapleader` and `maplocalleader` must be set in the AstroNvim opts or before `lazy.setup` - -- This can be found in the `lua/lazy_setup.lua` file - }, - }, - -- Mappings can be configured through AstroCore as well. - -- NOTE: keycodes follow the casing in the vimdocs. For example, `` must be capitalized - mappings = { - -- first key is the mode - n = { - -- second key is the lefthand side of the map - - -- navigate buffer tabs - ["]b"] = { function() require("astrocore.buffer").nav(vim.v.count1) end, desc = "Next buffer" }, - ["[b"] = { function() require("astrocore.buffer").nav(-vim.v.count1) end, desc = "Previous buffer" }, - - -- mappings seen under group name "Buffer" - ["bd"] = { - function() - require("astroui.status.heirline").buffer_picker( - function(bufnr) require("astrocore.buffer").close(bufnr) end - ) - end, - desc = "Close buffer from tabline", - }, - - -- tables with just a `desc` key will be registered with which-key if it's installed - -- this is useful for naming menus - -- ["b"] = { desc = "Buffers" }, - - -- setting a mapping to false will disable it - -- [""] = false, - }, - }, - }, -} +-- AstroNvim removed; core settings live in lua/options.lua and lua/autocmds.lua +return {} diff --git a/dot_config/nvim/lua/plugins/astrolsp.lua b/dot_config/nvim/lua/plugins/astrolsp.lua index e41da0f..fdc587c 100644 --- a/dot_config/nvim/lua/plugins/astrolsp.lua +++ b/dot_config/nvim/lua/plugins/astrolsp.lua @@ -1,107 +1,2 @@ --- AstroLSP allows you to customize the features in AstroNvim's LSP configuration engine --- Configuration documentation can be found with `:h astrolsp` --- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) --- as this provides autocomplete and documentation while editing - ----@type LazySpec -return { - "AstroNvim/astrolsp", - ---@type AstroLSPOpts - opts = { - -- Configuration table of features provided by AstroLSP - features = { - codelens = true, -- enable/disable codelens refresh on start - inlay_hints = false, -- enable/disable inlay hints on start - semantic_tokens = true, -- enable/disable semantic token highlighting - }, - -- customize lsp formatting options - formatting = { - -- control auto formatting on save - format_on_save = { - enabled = true, -- enable or disable format on save globally - allow_filetypes = { -- enable format on save for specified filetypes only - -- "go", - }, - ignore_filetypes = { -- disable format on save for specified filetypes - -- "python", - }, - }, - disabled = { -- disable formatting capabilities for the listed language servers - -- disable lua_ls formatting capability if you want to use StyLua to format your lua code - -- "lua_ls", - }, - timeout_ms = 1000, -- default format timeout - -- filter = function(client) -- fully override the default formatting function - -- return true - -- end - }, - -- enable servers that you already have installed without mason - servers = { - -- "pyright" - }, - -- ensure servers are installed - ensure_installed = { - "ltex", - }, - -- customize language server configuration options passed to `lspconfig` - ---@diagnostic disable: missing-fields - config = { - -- clangd = { capabilities = { offsetEncoding = "utf-8" } }, - }, - -- customize how language servers are attached - handlers = { - -- a function without a key is simply the default handler, functions take two parameters, the server name and the configured options table for that server - -- function(server, opts) require("lspconfig")[server].setup(opts) end - - -- the key is the server that is being setup with `lspconfig` - -- rust_analyzer = false, -- setting a handler to false will disable the set up of that language server - -- pyright = function(_, opts) require("lspconfig").pyright.setup(opts) end -- or a custom handler function can be passed - }, - -- Configure buffer local auto commands to add when attaching a language server - autocmds = { - -- first key is the `augroup` to add the auto commands to (:h augroup) - lsp_codelens_refresh = { - -- Optional condition to create/delete auto command group - -- can either be a string of a client capability or a function of `fun(client, bufnr): boolean` - -- condition will be resolved for each client on each execution and if it ever fails for all clients, - -- the auto commands will be deleted for that buffer - cond = "textDocument/codeLens", - -- cond = function(client, bufnr) return client.name == "lua_ls" end, - -- list of auto commands to set - { - -- events to trigger - event = { "InsertLeave", "BufEnter" }, - -- the rest of the autocmd options (:h nvim_create_autocmd) - desc = "Refresh codelens (buffer)", - callback = function(args) - if require("astrolsp").config.features.codelens then vim.lsp.codelens.refresh { bufnr = args.buf } end - end, - }, - }, - }, - -- mappings to be set up on attaching of a language server - mappings = { - n = { - -- a `cond` key can provided as the string of a server capability to be required to attach, or a function with `client` and `bufnr` parameters from the `on_attach` that returns a boolean - gD = { - function() vim.lsp.buf.declaration() end, - desc = "Declaration of current symbol", - cond = "textDocument/declaration", - }, - ["uY"] = { - function() require("astrolsp.toggles").buffer_semantic_tokens() end, - desc = "Toggle LSP semantic highlight (buffer)", - cond = function(client) - return client.supports_method "textDocument/semanticTokens/full" and vim.lsp.semantic_tokens ~= nil - end, - }, - }, - }, - -- A custom `on_attach` function to be run after the default `on_attach` function - -- takes two parameters `client` and `bufnr` (`:h lspconfig-setup`) - on_attach = function(client, bufnr) - -- this would disable semanticTokensProvider for all clients - -- client.server_capabilities.semanticTokensProvider = nil - end, - }, -} +-- AstroNvim removed; LSP config uses native vim.lsp.config in lua/lsp/ +return {} diff --git a/dot_config/nvim/lua/plugins/astroui.lua b/dot_config/nvim/lua/plugins/astroui.lua new file mode 100644 index 0000000..e419856 --- /dev/null +++ b/dot_config/nvim/lua/plugins/astroui.lua @@ -0,0 +1,2 @@ +-- AstroNvim removed; colorscheme is set via vim.cmd.colorscheme("apex-neon") in init.lua +return {} diff --git a/dot_config/nvim/lua/plugins/astroui.lua.tmpl b/dot_config/nvim/lua/plugins/astroui.lua.tmpl deleted file mode 100644 index 079bce0..0000000 --- a/dot_config/nvim/lua/plugins/astroui.lua.tmpl +++ /dev/null @@ -1,37 +0,0 @@ --- AstroUI provides the basis for configuring the AstroNvim User Interface --- Configuration documentation can be found with `:h astroui` --- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`) --- as this provides autocomplete and documentation while editing - ----@type LazySpec -return { - "AstroNvim/astroui", - ---@type AstroUIOpts - opts = { - -- change colorscheme - colorscheme = "{{ .chezmoi.config.data.theme }}", - -- AstroUI allows you to easily modify highlight groups easily for any and all colorschemes - highlights = { - init = { -- this table overrides highlights in all themes - -- Normal = { bg = "#000000" }, - }, - astrodark = { -- a table of overrides/changes when applying the astrotheme theme - -- Normal = { bg = "#000000" }, - }, - }, - -- Icons can be configured throughout the interface - icons = { - -- configure the loading of the lsp in the status line - LSPLoading1 = "⠋", - LSPLoading2 = "⠙", - LSPLoading3 = "⠹", - LSPLoading4 = "⠸", - LSPLoading5 = "⠼", - LSPLoading6 = "⠴", - LSPLoading7 = "⠦", - LSPLoading8 = "⠧", - LSPLoading9 = "⠇", - LSPLoading10 = "⠏", - }, - }, -} diff --git a/dot_config/nvim/lua/plugins/autopairs.lua b/dot_config/nvim/lua/plugins/autopairs.lua index 8938032..186e2f6 100644 --- a/dot_config/nvim/lua/plugins/autopairs.lua +++ b/dot_config/nvim/lua/plugins/autopairs.lua @@ -1,29 +1,2 @@ -return { - "windwp/nvim-autopairs", - config = function(plugin, opts) - require "astronvim.plugins.configs.nvim-autopairs"(plugin, opts) -- include the default astronvim config that calls the setup call - -- add more custom autopairs configuration such as custom rules - local npairs = require "nvim-autopairs" - local Rule = require "nvim-autopairs.rule" - local cond = require "nvim-autopairs.conds" - npairs.add_rules( - { - Rule("$", "$", { "tex", "latex" }) - -- don't add a pair if the next character is % - :with_pair(cond.not_after_regex "%%") - -- don't add a pair if the previous character is xxx - :with_pair( - cond.not_before_regex("xxx", 3) - ) - -- don't move right when repeat character - :with_move(cond.none()) - -- don't delete if the next character is xx - :with_del(cond.not_after_regex "xx") - -- disable adding a newline when you press - :with_cr(cond.none()), - }, - -- disable for .vim files, but it work for another filetypes - Rule("a", "a", "-vim") - ) - end, -} +-- nvim-autopairs is configured in editing.lua +return {} diff --git a/dot_config/nvim/lua/plugins/blink-latex.lua b/dot_config/nvim/lua/plugins/blink-latex.lua index 3d6a11c..47c79a3 100644 --- a/dot_config/nvim/lua/plugins/blink-latex.lua +++ b/dot_config/nvim/lua/plugins/blink-latex.lua @@ -1,39 +1,2 @@ -return { - -- Let blink.cmp consume nvim-cmp sources - { "saghen/blink.compat", version = "2.*", lazy = true, opts = {} }, - - -- Add vimtex + latex symbol sources to blink.cmp - { - "Saghen/blink.cmp", - optional = true, - dependencies = { - "micangl/cmp-vimtex", -- environments, \cite, \ref, etc. via vimtex - "kdheepak/cmp-latex-symbols", -- math symbols via LaTeX macros - }, - opts = function(_, opts) - opts.sources = opts.sources or {} - opts.sources.providers = opts.sources.providers or {} - opts.sources.default = opts.sources.default or { "lsp", "path", "snippets", "buffer" } - - -- Only turn on the LaTeX sources for TeX filetypes - opts.sources.per_filetype = vim.tbl_deep_extend("force", opts.sources.per_filetype or {}, { - tex = { inherit_defaults = true, "vimtex", "latex_symbols" }, - plaintex = { inherit_defaults = true, "vimtex", "latex_symbols" }, - }) - - -- Expose nvim-cmp sources to blink via blink.compat - opts.sources.providers.vimtex = { - name = "vimtex", - module = "blink.compat.source", - } - opts.sources.providers.latex_symbols = { - name = "latex_symbols", - module = "blink.compat.source", - -- Insert LaTeX commands (e.g. \alpha) instead of Unicode characters: - opts = { strategy = 2 }, -- documented in cmp-latex-symbols README - score_offset = -2, -- keep it below LSP/snippets in relevance - } - return opts - end, - }, -} +-- blink.cmp LaTeX sources are configured in completion.lua +return {} diff --git a/dot_config/nvim/lua/plugins/completion.lua b/dot_config/nvim/lua/plugins/completion.lua new file mode 100644 index 0000000..bc42023 --- /dev/null +++ b/dot_config/nvim/lua/plugins/completion.lua @@ -0,0 +1,101 @@ +return { + -- Snippet engine + { + "L3MON4D3/LuaSnip", + version = "v2.*", + build = "make install_jsregexp", + dependencies = { "rafamadriz/friendly-snippets" }, + opts = { + enable_autosnippets = true, + history = true, + update_events = "TextChanged,TextChangedI", + }, + config = function(_, opts) + require("luasnip").setup(opts) + require("luasnip.loaders.from_vscode").lazy_load() + -- Extend js snippets to ts + require("luasnip").filetype_extend("typescript", { "javascript" }) + require("luasnip").filetype_extend("svelte", { "javascript", "html" }) + end, + }, + + -- Castel-style LaTeX snippets (autosnippets for math mode) + { + "iurimateus/luasnip-latex-snippets.nvim", + ft = { "tex", "plaintex", "markdown" }, + dependencies = { "L3MON4D3/LuaSnip", "lervag/vimtex" }, + opts = { use_treesitter = false, allow_on_markdown = true }, + config = function(_, opts) + require("luasnip-latex-snippets").setup(opts) + end, + }, + + -- blink.compat: exposes nvim-cmp sources to blink.cmp + { "saghen/blink.compat", version = "2.*", lazy = true, opts = {} }, + + -- LaTeX completion sources (via blink.compat) + { + "micangl/cmp-vimtex", + lazy = true, + }, + { + "kdheepak/cmp-latex-symbols", + lazy = true, + }, + + -- Main completion engine + { + "saghen/blink.cmp", + version = "v0.*", + dependencies = { + "L3MON4D3/LuaSnip", + "saghen/blink.compat", + "micangl/cmp-vimtex", + "kdheepak/cmp-latex-symbols", + }, + opts = { + keymap = { + preset = "default", + [""] = { "select_next", "fallback" }, + [""] = { "select_prev", "fallback" }, + [""] = { "accept", "fallback" }, + [""] = { "show", "show_documentation", "hide_documentation" }, + [""] = { "hide" }, + [""] = { "scroll_documentation_up", "fallback" }, + [""] = { "scroll_documentation_down", "fallback" }, + }, + completion = { + ghost_text = { enabled = true }, + documentation = { auto_show = true, auto_show_delay_ms = 200 }, + menu = { + draw = { + treesitter = { "lsp" }, + }, + }, + }, + snippets = { + preset = "luasnip", + }, + sources = { + default = { "lsp", "snippets", "buffer", "path" }, + per_filetype = { + tex = { inherit_defaults = true, "vimtex", "latex_symbols" }, + plaintex = { inherit_defaults = true, "vimtex", "latex_symbols" }, + }, + providers = { + vimtex = { + name = "vimtex", + module = "blink.compat.source", + }, + latex_symbols = { + name = "latex_symbols", + module = "blink.compat.source", + opts = { strategy = 2 }, -- insert LaTeX commands, not Unicode + score_offset = -2, + }, + }, + }, + signature = { enabled = true }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/dap/init.lua b/dot_config/nvim/lua/plugins/dap/init.lua new file mode 100644 index 0000000..8925db8 --- /dev/null +++ b/dot_config/nvim/lua/plugins/dap/init.lua @@ -0,0 +1,79 @@ +return { + -- Debug Adapter Protocol base + { + "mfussenegger/nvim-dap", + dependencies = { + "rcarriga/nvim-dap-ui", + "theHamsta/nvim-dap-virtual-text", + "nvim-neotest/nvim-nio", + }, + keys = { + { "db", function() require("dap").toggle_breakpoint() end, desc = "Toggle breakpoint" }, + { "dB", function() require("dap").set_breakpoint(vim.fn.input("Condition: ")) end, desc = "Conditional breakpoint" }, + { "dc", function() require("dap").continue() end, desc = "Continue" }, + { "di", function() require("dap").step_into() end, desc = "Step into" }, + { "do", function() require("dap").step_over() end, desc = "Step over" }, + { "dO", function() require("dap").step_out() end, desc = "Step out" }, + { "dr", function() require("dap").repl.open() end, desc = "Open REPL" }, + { "du", function() require("dapui").toggle() end, desc = "Toggle DAP UI" }, + { "dv", function() require("nvim-dap-virtual-text").toggle() end, desc = "Toggle virtual text" }, + }, + config = function() + local dap = require("dap") + local dapui = require("dapui") + + -- Auto-open/close DAP UI + dap.listeners.after.event_initialized["dapui_config"] = function() dapui.open() end + dap.listeners.before.event_terminated["dapui_config"] = function() dapui.close() end + dap.listeners.before.event_exited["dapui_config"] = function() dapui.close() end + + -- Load language-specific configs + require("plugins.dap.rust") + require("plugins.dap.js") + end, + }, + + -- DAP UI panels + { + "rcarriga/nvim-dap-ui", + lazy = true, + dependencies = { "mfussenegger/nvim-dap", "nvim-neotest/nvim-nio" }, + opts = { + icons = { expanded = "", collapsed = "", current_frame = "" }, + layouts = { + { + elements = { + { id = "scopes", size = 0.25 }, + { id = "breakpoints", size = 0.25 }, + { id = "stacks", size = 0.25 }, + { id = "watches", size = 0.25 }, + }, + size = 40, + position = "left", + }, + { + elements = { + { id = "repl", size = 0.5 }, + { id = "console", size = 0.5 }, + }, + size = 10, + position = "bottom", + }, + }, + }, + }, + + -- Inline variable values during debug session + { + "theHamsta/nvim-dap-virtual-text", + lazy = true, + opts = { + enabled = true, + enabled_commands = true, + highlight_changed_variables = true, + highlight_new_as_changed = false, + commented = false, + virt_text_pos = "eol", + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/dap/js.lua b/dot_config/nvim/lua/plugins/dap/js.lua new file mode 100644 index 0000000..73a4b5a --- /dev/null +++ b/dot_config/nvim/lua/plugins/dap/js.lua @@ -0,0 +1,41 @@ +local M = {} + +local function setup() + local dap = require("dap") + local mason_path = vim.fn.stdpath("data") .. "/mason/packages/js-debug-adapter" + + dap.adapters["pwa-node"] = { + type = "server", + host = "localhost", + port = "${port}", + executable = { + command = "node", + args = { mason_path .. "/js-debug/src/dapDebugServer.js", "${port}" }, + }, + } + + local js_config = { + { + type = "pwa-node", + request = "launch", + name = "Launch file", + program = "${file}", + cwd = "${workspaceFolder}", + sourceMaps = true, + }, + { + type = "pwa-node", + request = "attach", + name = "Attach", + processId = require("dap.utils").pick_process, + cwd = "${workspaceFolder}", + }, + } + + for _, lang in ipairs({ "javascript", "typescript", "svelte" }) do + dap.configurations[lang] = js_config + end +end + +setup() +return M diff --git a/dot_config/nvim/lua/plugins/dap/rust.lua b/dot_config/nvim/lua/plugins/dap/rust.lua new file mode 100644 index 0000000..2c17619 --- /dev/null +++ b/dot_config/nvim/lua/plugins/dap/rust.lua @@ -0,0 +1,43 @@ +local M = {} + +local function setup() + local dap = require("dap") + local mason_path = vim.fn.stdpath("data") .. "/mason/packages/codelldb" + + dap.adapters.codelldb = { + type = "server", + port = "${port}", + executable = { + command = mason_path .. "/extension/adapter/codelldb", + args = { "--port", "${port}" }, + }, + } + + dap.configurations.rust = { + { + name = "Launch (Rust)", + type = "codelldb", + request = "launch", + program = function() + return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/target/debug/", "file") + end, + cwd = "${workspaceFolder}", + stopOnEntry = false, + args = {}, + }, + { + name = "Launch Tauri (Rust)", + type = "codelldb", + request = "launch", + program = function() + return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/src-tauri/target/debug/", "file") + end, + cwd = "${workspaceFolder}/src-tauri", + stopOnEntry = false, + args = {}, + }, + } +end + +setup() +return M diff --git a/dot_config/nvim/lua/plugins/editing.lua b/dot_config/nvim/lua/plugins/editing.lua new file mode 100644 index 0000000..6d2e061 --- /dev/null +++ b/dot_config/nvim/lua/plugins/editing.lua @@ -0,0 +1,68 @@ +return { + -- Auto-close brackets, with LaTeX math guard + { + "windwp/nvim-autopairs", + event = "InsertEnter", + config = function() + local npairs = require("nvim-autopairs") + local Rule = require("nvim-autopairs.rule") + local cond = require("nvim-autopairs.conds") + + npairs.setup({ + check_ts = true, + ts_config = { java = false }, -- disable for Java (interferes with jdtls) + fast_wrap = { map = "" }, + }) + + -- LaTeX inline math: $...$ pair + npairs.add_rules({ + Rule("$", "$", { "tex", "latex" }) + :with_pair(cond.not_after_regex("%%")) -- don't pair after % + :with_move(cond.none()) + :with_del(cond.not_after_regex("xx")) + :with_cr(cond.none()), + }) + end, + }, + + -- Surround operations: ys, cs, ds + { + "kylechui/nvim-surround", + version = "*", + event = "VeryLazy", + opts = {}, + }, + + -- Formatter (format on save) + { + "stevearc/conform.nvim", + event = "BufWritePre", + cmd = "ConformInfo", + keys = { + { "lf", function() require("conform").format({ async = true, lsp_fallback = true }) end, desc = "Format" }, + }, + opts = { + formatters_by_ft = { + lua = { "stylua" }, + rust = { "rustfmt" }, + javascript = { "prettier" }, + typescript = { "prettier" }, + javascriptreact = { "prettier" }, + typescriptreact = { "prettier" }, + svelte = { "prettier" }, + java = { "google-java-format" }, + json = { "prettier" }, + yaml = { "prettier" }, + toml = { "taplo" }, + html = { "prettier" }, + css = { "prettier" }, + markdown = { "prettier" }, + ["jinja.html"] = { "djlint" }, + }, + format_on_save = { + timeout_ms = 2000, + lsp_fallback = true, + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/git.lua b/dot_config/nvim/lua/plugins/git.lua new file mode 100644 index 0000000..4eeee4c --- /dev/null +++ b/dot_config/nvim/lua/plugins/git.lua @@ -0,0 +1,63 @@ +return { + -- Gutter signs, hunk navigation, inline blame + { + "lewis6991/gitsigns.nvim", + event = { "BufReadPost", "BufNewFile" }, + opts = { + signs = { + add = { text = "▎" }, + change = { text = "▎" }, + delete = { text = "" }, + topdelete = { text = "" }, + changedelete = { text = "▎" }, + untracked = { text = "▎" }, + }, + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + local map = function(mode, lhs, rhs, desc) + vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc }) + end + + -- Navigation + map("n", "]h", function() + if vim.wo.diff then return "]h" end + vim.schedule(function() gs.next_hunk() end) + return "" + end, "Next hunk") + map("n", "[h", function() + if vim.wo.diff then return "[h" end + vim.schedule(function() gs.prev_hunk() end) + return "" + end, "Prev hunk") + + -- Actions + map("n", "hs", gs.stage_hunk, "Stage hunk") + map("n", "gu", gs.undo_stage_hunk, "Undo stage hunk") + map("n", "gh", gs.preview_hunk, "Preview hunk") + map("n", "hb", gs.toggle_current_line_blame, "Toggle blame") + map("n", "gb", gs.toggle_current_line_blame, "Toggle blame") + map("n", "gd", gs.diffthis, "Diff this") + end, + }, + }, + + -- Magit-style full git interface + { + "NeogitOrg/neogit", + dependencies = { + "nvim-lua/plenary.nvim", + "sindrets/diffview.nvim", + "nvim-telescope/telescope.nvim", + }, + cmd = "Neogit", + keys = { + { "gg", "Neogit", desc = "Neogit" }, + }, + opts = { + integrations = { + telescope = true, + diffview = true, + }, + }, + }, +} diff --git a/dot_config/nvim/lua/plugins/java.lua b/dot_config/nvim/lua/plugins/java.lua new file mode 100644 index 0000000..7b8ec0c --- /dev/null +++ b/dot_config/nvim/lua/plugins/java.lua @@ -0,0 +1,105 @@ +return { + { + "mfussenegger/nvim-jdtls", + ft = "java", + config = function() + local jdtls = require("jdtls") + local jdtls_path = vim.fn.stdpath("data") .. "/mason/packages/jdtls" + local lombok_jar = jdtls_path .. "/lombok.jar" + + -- Find project root + local root_markers = { ".git", "mvnw", "gradlew", "pom.xml", "build.gradle" } + local root_dir = require("jdtls.setup").find_root(root_markers) + if not root_dir then + return + end + + -- Unique workspace per project + local project_name = vim.fn.fnamemodify(root_dir, ":p:h:t") + local workspace_dir = vim.fn.stdpath("data") .. "/jdtls-workspace/" .. project_name + + -- Find launcher jar and platform config + local jdtls_launcher = vim.fn.glob(jdtls_path .. "/plugins/org.eclipse.equinox.launcher_*.jar") + local jdtls_config_dir + if vim.fn.has("linux") == 1 then + jdtls_config_dir = jdtls_path .. "/config_linux" + elseif vim.fn.has("mac") == 1 then + jdtls_config_dir = jdtls_path .. "/config_mac" + end + + local config = { + cmd = { + "java", + "-Declipse.application=org.eclipse.jdt.ls.core.id1", + "-Dosgi.bundles.defaultStartLevel=4", + "-Declipse.product=org.eclipse.jdt.ls.core.product", + "-Dlog.protocol=true", + "-Dlog.level=ALL", + "-Xmx1g", + "--add-modules=ALL-SYSTEM", + "--add-opens", "java.base/java.util=ALL-UNNAMED", + "--add-opens", "java.base/java.lang=ALL-UNNAMED", + -- Lombok support + vim.fn.filereadable(lombok_jar) == 1 and "-javaagent:" .. lombok_jar or nil, + "-jar", jdtls_launcher, + "-configuration", jdtls_config_dir, + "-data", workspace_dir, + }, + root_dir = root_dir, + settings = { + java = { + eclipse = { downloadSources = true }, + configuration = { updateBuildConfiguration = "interactive" }, + maven = { downloadSources = true }, + implementationsCodeLens = { enabled = true }, + referencesCodeLens = { enabled = true }, + references = { includeDecompiledSources = true }, + inlayHints = { parameterNames = { enabled = "none" } }, -- too noisy for Java + format = { enabled = true }, + }, + signatureHelp = { enabled = true }, + completion = { + favoriteStaticMembers = { + "org.hamcrest.MatcherAssert.assertThat", + "org.hamcrest.Matchers.*", + "org.junit.Assert.*", + "org.junit.Assume.*", + "org.junit.jupiter.api.Assertions.*", + "org.mockito.Mockito.*", + }, + }, + }, + init_options = { + bundles = {}, + }, + on_attach = function(client, bufnr) + -- Enable navic for breadcrumbs + local ok, navic = pcall(require, "nvim-navic") + if ok then navic.attach(client, bufnr) end + + -- Java-specific keymaps + local map = function(keys, func, desc) + vim.keymap.set("n", keys, func, { buffer = bufnr, desc = "Java: " .. desc }) + end + map("jo", jdtls.organize_imports, "Organize imports") + map("jv", jdtls.extract_variable, "Extract variable") + map("jm", function() jdtls.extract_method(true) end, "Extract method") + map("jc", "!javac %", "Compile file") + map("jf", jdtls.rename_file, "Rename file (+ class)") + + -- DAP: enable Java debugging if nvim-dap is available + local ok_dap, dap = pcall(require, "jdtls.dap") + if ok_dap then + dap.setup_dap_main_class_configs() + end + end, + capabilities = vim.lsp.protocol.make_client_capabilities(), + } + + -- Filter nil from cmd array + config.cmd = vim.tbl_filter(function(v) return v ~= nil end, config.cmd) + + jdtls.start_or_attach(config) + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/latex-snippets.lua b/dot_config/nvim/lua/plugins/latex-snippets.lua index ad877bf..742ea64 100644 --- a/dot_config/nvim/lua/plugins/latex-snippets.lua +++ b/dot_config/nvim/lua/plugins/latex-snippets.lua @@ -1,17 +1,2 @@ --- Gilles Castel-style LaTeX snippets for LuaSnip -return { - -- Make sure autosnippets are enabled globally - { - "L3MON4D3/LuaSnip", - opts = function(_, opts) opts.enable_autosnippets = true end, - }, - - -- The LaTeX snippets themselves - { - "iurimateus/luasnip-latex-snippets.nvim", - ft = { "tex", "plaintex", "markdown" }, - dependencies = { "L3MON4D3/LuaSnip", "lervag/vimtex" }, - opts = { use_treesitter = false, allow_on_markdown = true }, -- use vimtex to detect math mode - config = function(_, opts) require("luasnip-latex-snippets").setup(opts) end, - }, -} +-- luasnip-latex-snippets is configured in completion.lua +return {} diff --git a/dot_config/nvim/lua/plugins/lsp.lua b/dot_config/nvim/lua/plugins/lsp.lua new file mode 100644 index 0000000..f5d0313 --- /dev/null +++ b/dot_config/nvim/lua/plugins/lsp.lua @@ -0,0 +1,79 @@ +return { + -- Mason: installs LSP servers, formatters, DAP adapters + { + "williamboman/mason.nvim", + cmd = "Mason", + build = ":MasonUpdate", + opts = { + ui = { icons = { package_installed = "✓", package_pending = "➜", package_uninstalled = "✗" } }, + }, + }, + + -- mason-lspconfig bridges mason ↔ vim.lsp.enable + { + "williamboman/mason-lspconfig.nvim", + dependencies = { "williamboman/mason.nvim" }, + opts = { + ensure_installed = { + "lua_ls", "rust_analyzer", "ts_ls", "svelte", + "html", "texlab", "marksman", "yamlls", "taplo", + -- ltex managed via mason-tool-installer for version control + }, + automatic_installation = false, + }, + }, + + -- mason-tool-installer: formatters, linters, DAP, extra servers + { + "WhoIsSethDaniel/mason-tool-installer.nvim", + dependencies = { "williamboman/mason.nvim" }, + opts = { + ensure_installed = { + -- LSP servers + "lua-language-server", + "rust-analyzer", + "typescript-language-server", + "svelte-language-server", + "html-lsp", + "texlab", + "marksman", + "yaml-language-server", + "taplo", + "ltex-ls", + -- Formatters + "stylua", + "prettier", + "rustfmt", + "google-java-format", + "djlint", + -- DAP + "codelldb", + "js-debug-adapter", + }, + auto_update = false, + run_on_start = true, + }, + config = function(_, opts) + require("mason-tool-installer").setup(opts) + -- Enable servers after mason installs them + -- Server configs loaded by init.lua (lua/lsp/*.lua) + vim.api.nvim_create_autocmd("User", { + pattern = "MasonToolsStartingInstall", + once = true, + callback = function() + vim.schedule(function() + vim.lsp.enable({ + "lua_ls", "rust_analyzer", "ts_ls", "svelte", + "html", "texlab", "marksman", "yamlls", "taplo", "ltex", + }) + end) + end, + }) + -- Also enable on startup (for machines where tools are already installed) + vim.lsp.enable({ + "lua_ls", "rust_analyzer", "ts_ls", "svelte", + "html", "texlab", "marksman", "yamlls", "taplo", "ltex", + }) + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/lsp_signature.lua b/dot_config/nvim/lua/plugins/lsp_signature.lua index 92ee9cb..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/lsp_signature.lua +++ b/dot_config/nvim/lua/plugins/lsp_signature.lua @@ -1,5 +1,2 @@ -return { - "ray-x/lsp_signature.nvim", - event = "BufRead", - config = function() require("lsp_signature").setup() end, -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/ltex.lua b/dot_config/nvim/lua/plugins/ltex.lua index 4a5eed4..ff0ccac 100644 --- a/dot_config/nvim/lua/plugins/ltex.lua +++ b/dot_config/nvim/lua/plugins/ltex.lua @@ -1,66 +1,9 @@ --- Grammar & spell checking for LaTeX/Markdown via LanguageTool (LTeX-LS) return { - -- Tell AstroLSP to manage the ltex server and pass our settings - { - "AstroNvim/astrolsp", - ---@param opts AstroLSPOpts - opts = function(_, opts) - opts.servers = opts.servers or {} - if not vim.tbl_contains(opts.servers, "ltex") then table.insert(opts.servers, "ltex") end - - -- Extend the ltex server configuration - opts.config = require("astrocore").extend_tbl(opts.config or {}, { - ltex = { - filetypes = { "tex", "plaintex", "bib", "markdown" }, - settings = { - ltex = { - -- Run checks on save for performance; switch to "edit" if you prefer live feedback - checkFrequency = "save", - -- Pick the language you want LTeX to check as the document language - language = "en-GB", - -- Mother tongue helps the grammar engine (adjust to your preference) - additionalRules = { motherTongue = "de-DE" }, - -- Let ltex_extra manage dictionaries/rules on disk - dictionary = { - ["en-GB"] = {}, - ["de-DE"] = {}, - ["fr-FR"] = {}, - }, - disabledRules = { - ["en-GB"] = {}, - ["de-DE"] = {}, - ["fr-FR"] = {}, - }, - hiddenFalsePositives = { - ["en-GB"] = {}, - ["de-DE"] = {}, - ["fr-FR"] = {}, - }, - }, - }, - -- hook up ltex_extra when the server attaches - on_attach = function(client, bufnr) - local ok, ltex_extra = pcall(require, "ltex_extra") - if ok then - ltex_extra.setup { - -- load both EN+DE dictionaries; change to your set - load_langs = { "en-GB", "de-DE", "fr-FR" }, - init_check = true, - -- store per-project files in .ltex (add to .gitignore if you want) - path = ".ltex", - log_level = "none", - } - end - end, - }, - }) - end, - }, - - -- Companion plugin: add-to-dictionary / disable-rule / hide-false-positive + -- ltex_extra: persist custom dictionary/rules to disk { "barreiroleo/ltex_extra.nvim", - ft = { "tex", "plaintex", "markdown" }, + ft = { "tex", "plaintex", "bib", "markdown" }, lazy = true, + -- Actual setup happens in lua/lsp/ltex.lua on_attach }, } diff --git a/dot_config/nvim/lua/plugins/luasnip.lua b/dot_config/nvim/lua/plugins/luasnip.lua index 377c933..4ea4132 100644 --- a/dot_config/nvim/lua/plugins/luasnip.lua +++ b/dot_config/nvim/lua/plugins/luasnip.lua @@ -1,18 +1,2 @@ -return { - "L3MON4D3/LuaSnip", - enabled = true, - version = "v2.*", - build = "make install_jsregexp", - event = "InsertEnter", - dependencies = { - "rafamadriz/friendly-snippets", - }, - config = function(plugin, opts) - -- run the default astronvim config that calls the setup call - require "astronvim.plugins.configs.luasnip"(plugin, opts) - -- lazy load snippets from friendly-snippets - require("luasnip.loaders.from_vscode").lazy_load() - -- add more custom luasnip configuration such as filetype extend or custom snippets - require("luasnip").filetype_extend("javascript", { "javascriptreact" }) - end, -} +-- LuaSnip is configured in completion.lua +return {} diff --git a/dot_config/nvim/lua/plugins/mason.lua b/dot_config/nvim/lua/plugins/mason.lua index 2d79b5f..5b498c9 100644 --- a/dot_config/nvim/lua/plugins/mason.lua +++ b/dot_config/nvim/lua/plugins/mason.lua @@ -1,28 +1,2 @@ -if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE - --- Customize Mason - ----@type LazySpec -return { - -- use mason-tool-installer for automatically installing Mason packages - { - "WhoIsSethDaniel/mason-tool-installer.nvim", - -- overrides `require("mason-tool-installer").setup(...)` - opts = { - -- Make sure to use the names found in `:Mason` - ensure_installed = { - -- install language servers - "lua-language-server", - - -- install formatters - "stylua", - - -- install debuggers - "debugpy", - - -- install any other package - "tree-sitter-cli", - }, - }, - }, -} +-- Mason is configured in lsp.lua +return {} diff --git a/dot_config/nvim/lua/plugins/md-kiss.lua b/dot_config/nvim/lua/plugins/md-kiss.lua index 5900206..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/md-kiss.lua +++ b/dot_config/nvim/lua/plugins/md-kiss.lua @@ -1,135 +1,2 @@ --- Minimal Markdown + math workflow (FOSS/KISS): --- - Blink completion of LaTeX symbols in Markdown --- - :MdPdf for one-shot Pandoc -> PDF (LuaLaTeX) and open in Zathura (auto-reload) --- - :MdWatch / :MdWatchStop to rebuild on save via `entr` -return { - -- Markdown gets LaTeX symbol completion (inserts \alpha, not α) - { - "Saghen/blink.cmp", - optional = true, - opts = function(_, opts) - opts.sources = opts.sources or {} - opts.sources.per_filetype = vim.tbl_deep_extend("force", opts.sources.per_filetype or {}, { - markdown = { inherit_defaults = true, "latex_symbols" }, - }) - return opts - end, - }, - - -- Ensure Treesitter grammars for Markdown editing - { - "nvim-treesitter/nvim-treesitter", - opts = function(_, opts) - opts.ensure_installed = opts.ensure_installed or {} - for _, lang in ipairs { "markdown", "markdown_inline" } do - if not vim.tbl_contains(opts.ensure_installed, lang) then table.insert(opts.ensure_installed, lang) end - end - end, - }, - - -- Commands + keymaps - { - "AstroNvim/astrocore", - init = function() - local function have(bin) return vim.fn.executable(bin) == 1 end - - local function pandoc_cmd(input_md) - local stem = input_md:gsub("%.md$", "") - local md = vim.fn.shellescape(input_md) - local pdf = vim.fn.shellescape(stem .. ".pdf") - local cmd = ("pandoc %s -o %s --from=markdown+tex_math_dollars+raw_tex --pdf-engine=lualatex --citeproc"):format( - md, - pdf - ) - return cmd, (stem .. ".pdf") - end - - -- One-shot: build PDF and open Zathura once (it auto-reloads) - vim.api.nvim_create_user_command("MdPdf", function() - if not have "pandoc" then - vim.notify("MdPdf: pandoc not found. Install pandoc.", vim.log.levels.ERROR) - return - end - local name = vim.api.nvim_buf_get_name(0) - if name == "" or not name:match "%.md$" then - vim.notify("MdPdf: open a Markdown (*.md) file", vim.log.levels.WARN) - return - end - local cmd, pdf = pandoc_cmd(name) - vim.fn.jobstart({ "sh", "-c", cmd }, { - detach = true, - on_exit = function() - if have "zathura" and not vim.g._mdpdf_zathura_opened then - vim.g._mdpdf_zathura_opened = true - vim.fn.jobstart({ "zathura", "--fork", pdf }, { detach = true }) - end - end, - }) - end, {}) - - -- Continuous: watch with entr and rebuild on change - vim.api.nvim_create_user_command("MdWatch", function() - if not have "pandoc" then - vim.notify("MdWatch: pandoc not found. Install pandoc.", vim.log.levels.ERROR) - return - end - if not have "entr" then - vim.notify("MdWatch: entr not found. Install entr.", vim.log.levels.ERROR) - return - end - local buf = vim.api.nvim_get_current_buf() - local name = vim.api.nvim_buf_get_name(buf) - if name == "" or not name:match "%.md$" then - vim.notify("MdWatch: open a Markdown (*.md) file", vim.log.levels.WARN) - return - end - - -- First build (also opens Zathura once) - vim.cmd "MdPdf" - - local cmd, _ = pandoc_cmd(name) - local qfile = vim.fn.shellescape(name) - local pipeline = ("printf %%s\\n %s | entr -r sh -c %s"):format(qfile, vim.fn.shellescape(cmd)) - local jobid = vim.fn.jobstart({ "sh", "-c", pipeline }, { detach = false }) - if jobid <= 0 then - vim.notify("MdWatch: failed to start entr", vim.log.levels.ERROR) - return - end - vim.b.md_kiss_watch_job = jobid - vim.notify("MdWatch: watching " .. name .. " (use :MdWatchStop to stop)", vim.log.levels.INFO) - - -- Auto-stop when buffer unloads - vim.api.nvim_create_autocmd({ "BufUnload", "BufWipeout" }, { - buffer = buf, - once = true, - callback = function() - if vim.b.md_kiss_watch_job then pcall(vim.fn.jobstop, vim.b.md_kiss_watch_job) end - end, - }) - end, {}) - - vim.api.nvim_create_user_command("MdWatchStop", function() - local job = vim.b.md_kiss_watch_job - if job then - pcall(vim.fn.jobstop, job) - vim.b.md_kiss_watch_job = nil - vim.notify("MdWatch: stopped", vim.log.levels.INFO) - else - vim.notify("MdWatch: no watcher running for this buffer", vim.log.levels.WARN) - end - end, {}) - - -- Buffer-local keymaps for Markdown - local group = vim.api.nvim_create_augroup("md_kiss_keys", { clear = true }) - vim.api.nvim_create_autocmd("FileType", { - group = group, - pattern = "markdown", - callback = function(args) - vim.keymap.set("n", "mP", "MdPdf", { buffer = args.buf, desc = "Markdown → PDF (Pandoc)" }) - vim.keymap.set("n", "mw", "MdWatch", { buffer = args.buf, desc = "Watch & rebuild (entr)" }) - vim.keymap.set("n", "mW", "MdWatchStop", { buffer = args.buf, desc = "Stop watch" }) - end, - }) - end, - }, -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/nabla.lua b/dot_config/nvim/lua/plugins/nabla.lua index 24b1e81..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/nabla.lua +++ b/dot_config/nvim/lua/plugins/nabla.lua @@ -1,19 +1,2 @@ --- Lightweight inline ASCII preview for LaTeX math -return { - "jbyuki/nabla.nvim", - ft = { "tex", "plaintex", "markdown" }, - keys = { - -- Popup preview for the expression under cursor - { "mp", function() require("nabla").popup() end, desc = "Math: popup preview" }, - - -- Toggle inline virtual rendering; re-enable wrap after toggle (nabla toggles it off) - { - "mv", - function() - require("nabla").toggle_virt { autogen = true } - vim.wo.wrap = true - end, - desc = "Math: toggle inline preview", - }, - }, -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/nerdy.lua b/dot_config/nvim/lua/plugins/nerdy.lua index 9521837..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/nerdy.lua +++ b/dot_config/nvim/lua/plugins/nerdy.lua @@ -1,14 +1,2 @@ ----@type LazySpec -return { - "2kabhishek/nerdy.nvim", - cmd = "Nerdy", - dependencies = { - "folke/snacks.nvim", - }, - opts = { - max_recents = 30, - add_default_keybindings = true, - copy_to_clipboard = false, - copy_register = "+", - }, -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/none-ls.lua b/dot_config/nvim/lua/plugins/none-ls.lua index 2b0ed18..d192006 100644 --- a/dot_config/nvim/lua/plugins/none-ls.lua +++ b/dot_config/nvim/lua/plugins/none-ls.lua @@ -1,24 +1,2 @@ -if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE - --- Customize None-ls sources - ----@type LazySpec -return { - "nvimtools/none-ls.nvim", - opts = function(_, opts) - -- opts variable is the default configuration table for the setup function call - -- local null_ls = require "null-ls" - - -- Check supported formatters and linters - -- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/formatting - -- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics - - -- Only insert new sources, do not replace the existing ones - -- (If you wish to replace, use `opts.sources = {}` instead of the `list_insert_unique` function) - opts.sources = require("astrocore").list_insert_unique(opts.sources, { - -- Set a formatter - -- null_ls.builtins.formatting.stylua, - -- null_ls.builtins.formatting.prettier, - }) - end, -} +-- none-ls replaced by conform.nvim in editing.lua +return {} diff --git a/dot_config/nvim/lua/plugins/obsidian.lua b/dot_config/nvim/lua/plugins/obsidian.lua index b9baed0..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/obsidian.lua +++ b/dot_config/nvim/lua/plugins/obsidian.lua @@ -1,40 +1,2 @@ ----@type LazySpec -return { - "obsidian-nvim/obsidian.nvim", - version = "*", -- recommended, use latest release instead of latest commit - lazy = true, - ft = "markdown", - -- Replace the above line with this if you only want to load obsidian.nvim for markdown files in your vault: - -- event = { - -- -- If you want to use the home shortcut '~' here you need to call 'vim.fn.expand'. - -- -- E.g. "BufReadPre " .. vim.fn.expand "~" .. "/my-vault/*.md" - -- -- refer to `:h file-pattern` for more examples - -- "BufReadPre path/to/my-vault/*.md", - -- "BufNewFile path/to/my-vault/*.md", - -- }, - dependencies = { - -- Required. - "nvim-lua/plenary.nvim", - - -- see above for full list of optional dependencies ☝️ - }, - ---@module 'obsidian' - ---@type obsidian.config.ClientOpts - opts = { - workspaces = { - { - name = "uni", - path = "~/Documents/uni", - }, - }, - -- Optional, completion of wiki links, local markdown links, and tags using nvim-cmp. - completion = { - -- Enables completion using nvim_cmp - nvim_cmp = false, - -- Enables completion using blink.cmp - blink = true, - -- Trigger completion at 2 chars. - min_chars = 2, - }, - }, -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/pandoc.lua b/dot_config/nvim/lua/plugins/pandoc.lua index 77201c6..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/pandoc.lua +++ b/dot_config/nvim/lua/plugins/pandoc.lua @@ -1,25 +1,2 @@ --- A vimtex-like workflow for compiling Markdown to PDF using pandoc -return { - "arminveres/md-pdf.nvim", - lazy = true, - -- Set up a keymap for compiling - keys = { - { - "mc", - function() - -- The plugin's main function to convert markdown to pdf - require("md-pdf").convert_md_to_pdf() - end, - desc = "Markdown Compile", - }, - }, - -- Configure the plugin - opts = { - -- Set zathura as the PDF viewer to match the vimtex setup - preview_cmd = function() - return "zathura" - end, - -- other options... - ignore_viewer_state = true, -- Auto-recompile PDF on each write - }, -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/presence.lua b/dot_config/nvim/lua/plugins/presence.lua index b28ad40..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/presence.lua +++ b/dot_config/nvim/lua/plugins/presence.lua @@ -1,4 +1,2 @@ -return { - "andweeb/presence.nvim", - event = "VimEnter", -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/snacks.lua b/dot_config/nvim/lua/plugins/snacks.lua index d501a22..80c3daa 100644 --- a/dot_config/nvim/lua/plugins/snacks.lua +++ b/dot_config/nvim/lua/plugins/snacks.lua @@ -1,22 +1,2 @@ -return { - "folke/snacks.nvim", - opts = { - dashboard = { - preset = { - header = table.concat({ - " █████ ███████ ████████ ██████ ██████ ", - "██ ██ ██ ██ ██ ██ ██ ██", - "███████ ███████ ██ ██████ ██ ██", - "██ ██ ██ ██ ██ ██ ██ ██", - "██ ██ ███████ ██ ██ ██ ██████ ", - "", - "███  ██ ██  ██ ██ ███  ███", - "████  ██ ██  ██ ██ ████  ████", - "██ ██  ██ ██  ██ ██ ██ ████ ██", - "██  ██ ██  ██  ██  ██ ██  ██  ██", - "██   ████   ████   ██ ██      ██", - }, "\n"), - }, - }, - }, -} +-- Removed: not part of the from-scratch config +return {} diff --git a/dot_config/nvim/lua/plugins/telescope.lua b/dot_config/nvim/lua/plugins/telescope.lua new file mode 100644 index 0000000..c08a75f --- /dev/null +++ b/dot_config/nvim/lua/plugins/telescope.lua @@ -0,0 +1,44 @@ +return { + { + "nvim-telescope/telescope.nvim", + branch = "0.1.x", + dependencies = { + "nvim-lua/plenary.nvim", + { + "nvim-telescope/telescope-fzf-native.nvim", + build = "make", + cond = function() + return vim.fn.executable("make") == 1 + end, + }, + }, + cmd = "Telescope", + keys = { + { "ff", "Telescope find_files", desc = "Find files" }, + { "fg", "Telescope live_grep", desc = "Live grep" }, + { "fb", "Telescope buffers", desc = "Buffers" }, + { "fs", "Telescope lsp_document_symbols", desc = "LSP symbols" }, + { "fd", "Telescope diagnostics", desc = "Diagnostics" }, + { "fr", "Telescope oldfiles", desc = "Recent files" }, + { "fw", "Telescope grep_string", desc = "Grep word under cursor" }, + { "fp", "Telescope projects", desc = "Projects" }, + { "fh", "Telescope help_tags", desc = "Help tags" }, + }, + config = function() + local telescope = require("telescope") + telescope.setup({ + defaults = { + prompt_prefix = " ", + selection_caret = " ", + path_display = { "smart" }, + file_ignore_patterns = { ".git/", "node_modules/", "target/" }, + }, + pickers = { + find_files = { hidden = true }, + }, + }) + pcall(telescope.load_extension, "fzf") + pcall(telescope.load_extension, "projects") + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/terminal.lua b/dot_config/nvim/lua/plugins/terminal.lua new file mode 100644 index 0000000..9761c6e --- /dev/null +++ b/dot_config/nvim/lua/plugins/terminal.lua @@ -0,0 +1,70 @@ +return { + -- Floating terminal + { + "akinsho/toggleterm.nvim", + version = "*", + keys = { + { "", "ToggleTerm direction=float", mode = { "n", "t" }, desc = "Toggle float terminal" }, + }, + opts = { + size = function(term) + if term.direction == "horizontal" then + return 15 + elseif term.direction == "vertical" then + return vim.o.columns * 0.4 + end + end, + open_mapping = nil, -- managed via keymaps above + hide_numbers = true, + shade_terminals = false, + start_in_insert = true, + insert_mappings = false, + terminal_mappings = false, + persist_size = true, + direction = "float", + close_on_exit = true, + float_opts = { + border = "curved", + winblend = 3, + }, + on_open = function(term) + vim.cmd("startinsert!") + vim.api.nvim_buf_set_keymap(term.bufnr, "t", "", "", { noremap = true, silent = true }) + end, + }, + config = function(_, opts) + require("toggleterm").setup(opts) + + -- Named terminals + local Terminal = require("toggleterm.terminal").Terminal + + -- Tauri dev server + local tauri_term = Terminal:new({ + cmd = "cargo tauri dev", + direction = "float", + hidden = true, + display_name = "Tauri Dev", + }) + + -- Test runner + local test_term = Terminal:new({ + direction = "horizontal", + hidden = true, + display_name = "Tests", + }) + + -- Claude Code + local claude_term = Terminal:new({ + cmd = "claude", + direction = "float", + hidden = true, + display_name = "Claude Code", + float_opts = { border = "curved" }, + }) + + vim.keymap.set("n", "tt", function() tauri_term:toggle() end, { desc = "Toggle Tauri dev" }) + vim.keymap.set("n", "te", function() test_term:toggle() end, { desc = "Toggle test terminal" }) + vim.keymap.set("n", "cc", function() claude_term:toggle() end, { desc = "Claude Code" }) + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/testing.lua b/dot_config/nvim/lua/plugins/testing.lua new file mode 100644 index 0000000..44fcc39 --- /dev/null +++ b/dot_config/nvim/lua/plugins/testing.lua @@ -0,0 +1,33 @@ +return { + { + "nvim-neotest/neotest", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-treesitter/nvim-treesitter", + "nvim-neotest/nvim-nio", + "rouge8/neotest-rust", + "rcasia/neotest-java", + }, + keys = { + { "tr", function() require("neotest").run.run() end, desc = "Run nearest test" }, + { "ts", function() require("neotest").run.run(vim.fn.expand("%")) end, desc = "Run test suite" }, + { "tl", function() require("neotest").run.run_last() end, desc = "Run last test" }, + { "to", function() require("neotest").output.open({ enter = true }) end, desc = "Open test output" }, + { "tp", function() require("neotest").output_panel.toggle() end, desc = "Toggle test panel" }, + { "ts", function() require("neotest").summary.toggle() end, desc = "Toggle summary" }, + }, + opts = function() + return { + adapters = { + require("neotest-rust")({ args = { "--no-capture" } }), + require("neotest-java")({ + ignore_wrapper = false, + }), + }, + output = { open_on_run = false }, + quickfix = { open = false }, + status = { virtual_text = true }, + } + end, + }, +} diff --git a/dot_config/nvim/lua/plugins/treesitter.lua b/dot_config/nvim/lua/plugins/treesitter.lua index 94436aa..3265cd4 100644 --- a/dot_config/nvim/lua/plugins/treesitter.lua +++ b/dot_config/nvim/lua/plugins/treesitter.lua @@ -1,15 +1,70 @@ -if true then return {} end -- WARN: REMOVE THIS LINE TO ACTIVATE THIS FILE - --- Customize Treesitter - ----@type LazySpec return { - "nvim-treesitter/nvim-treesitter", - opts = { - ensure_installed = { - "lua", - "vim", - -- add more arguments for adding more treesitter parsers + { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + event = { "BufReadPost", "BufNewFile" }, + dependencies = { + "nvim-treesitter/nvim-treesitter-textobjects", }, + opts = { + ensure_installed = { + "lua", "rust", "typescript", "javascript", "svelte", + "java", "latex", "markdown", "markdown_inline", + "yaml", "toml", "bash", "html", "css", "jinja", + "json", "vim", "vimdoc", "regex", + }, + auto_install = true, + highlight = { + enable = true, + additional_vim_regex_highlighting = { "latex" }, -- needed for vimtex + }, + indent = { enable = true }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = "", + node_incremental = "", + scope_incremental = false, + node_decremental = "", + }, + }, + textobjects = { + select = { + enable = true, + lookahead = true, + keymaps = { + ["am"] = "@function.outer", + ["im"] = "@function.inner", + ["ac"] = "@class.outer", + ["ic"] = "@class.inner", + ["a,"] = "@parameter.outer", + ["i,"] = "@parameter.inner", + }, + }, + move = { + enable = true, + set_jumps = true, + goto_next_start = { + ["]m"] = "@function.outer", + ["]c"] = "@class.outer", + }, + goto_next_end = { + ["]M"] = "@function.outer", + ["]C"] = "@class.outer", + }, + goto_previous_start = { + ["[m"] = "@function.outer", + ["[c"] = "@class.outer", + }, + goto_previous_end = { + ["[M"] = "@function.outer", + ["[C"] = "@class.outer", + }, + }, + }, + }, + config = function(_, opts) + require("nvim-treesitter.configs").setup(opts) + end, }, } diff --git a/dot_config/nvim/lua/plugins/ui.lua b/dot_config/nvim/lua/plugins/ui.lua new file mode 100644 index 0000000..872051b --- /dev/null +++ b/dot_config/nvim/lua/plugins/ui.lua @@ -0,0 +1,341 @@ +return { + -- Seamless navigation between nvim splits and tmux panes + { + "mrjones2014/smart-splits.nvim", + lazy = false, + opts = { + multiplexer_integration = "tmux", + cursor_follows_swapped_panes = false, + }, + keys = { + -- Navigate + { "", function() require("smart-splits").move_cursor_left() end, mode = { "n", "t" }, desc = "Move to left split/pane" }, + { "", function() require("smart-splits").move_cursor_down() end, mode = { "n", "t" }, desc = "Move to lower split/pane" }, + { "", function() require("smart-splits").move_cursor_up() end, mode = { "n", "t" }, desc = "Move to upper split/pane" }, + { "", function() require("smart-splits").move_cursor_right() end, mode = { "n", "t" }, desc = "Move to right split/pane" }, + -- Resize + { "", function() require("smart-splits").resize_left() end, desc = "Resize left" }, + { "", function() require("smart-splits").resize_down() end, desc = "Resize down" }, + { "", function() require("smart-splits").resize_up() end, desc = "Resize up" }, + { "", function() require("smart-splits").resize_right() end, desc = "Resize right" }, + }, + }, + + -- Breadcrumbs: current file > class > method via LSP + { + "SmiteshP/nvim-navic", + lazy = true, -- attached via LspAttach in autocmds.lua + opts = { + icons = { + File = "󰈙 ", Module = " ", Namespace = "󰌗 ", Package = " ", + Class = "󰌗 ", Method = "󰆧 ", Property = " ", Field = " ", + Constructor = " ", Enum = "󰕘", Interface = "󰕘", Function = "󰊕 ", + Variable = "󰆧 ", Constant = "󰏿 ", String = "󰀬 ", Number = "󰎠 ", + Boolean = "◩ ", Array = "󰅪 ", Object = "󰅩 ", Key = "󰌋 ", + Null = "󰟢 ", EnumMember = " ", Struct = "󰌗 ", Event = " ", + Operator = "󰆕 ", TypeParameter = "󰊄 ", + }, + lsp = { auto_attach = false }, -- we attach manually in autocmds.lua + highlight = true, + separator = " › ", + }, + }, + + -- Statusline + { + "nvim-lualine/lualine.nvim", + dependencies = { "nvim-tree/nvim-web-devicons", "SmiteshP/nvim-navic" }, + event = "VeryLazy", + config = function() + local navic = require("nvim-navic") + require("lualine").setup({ + options = { + theme = require("apex-neon").lualine, + globalstatus = true, + component_separators = { left = "", right = "" }, + section_separators = { left = "", right = "" }, + }, + sections = { + lualine_a = { "mode" }, + lualine_b = { "branch", "diff", "diagnostics" }, + lualine_c = { { "filename", path = 1 } }, + lualine_x = { + { + -- Show recording macro indicator + function() + local reg = vim.fn.reg_recording() + return reg ~= "" and "Recording @" .. reg or "" + end, + color = { fg = "#ffb700" }, + }, + "encoding", "fileformat", "filetype", + }, + lualine_y = { "progress" }, + lualine_z = { "location" }, + }, + winbar = { + lualine_c = { + { + function() + return navic.is_available() and navic.get_location() or "" + end, + }, + }, + }, + inactive_winbar = { + lualine_c = { { "filename", path = 1 } }, + }, + }) + end, + }, + + -- Buffer tabs at top + { + "akinsho/bufferline.nvim", + version = "*", + dependencies = "nvim-tree/nvim-web-devicons", + event = "VeryLazy", + opts = { + options = { + mode = "buffers", + separator_style = "slant", + show_buffer_close_icons = true, + show_close_icon = false, + color_icons = true, + diagnostics = "nvim_lsp", + offsets = { + { filetype = "aerial", text = "Symbols", text_align = "center", separator = true }, + }, + }, + }, + }, + + -- Scoped buffers per tab + { + "tiagovla/scope.nvim", + event = "VeryLazy", + opts = {}, + }, + + -- Keymap discovery + { + "folke/which-key.nvim", + event = "VeryLazy", + opts = { + preset = "modern", + icons = { mappings = false }, + }, + config = function(_, opts) + local wk = require("which-key") + wk.setup(opts) + wk.add({ + { "f", group = "Find / Telescope" }, + { "g", group = "Git" }, + { "l", group = "LSP" }, + { "r", group = "Refactor" }, + { "x", group = "Diagnostics / Trouble" }, + { "d", group = "Debug (DAP)" }, + { "t", group = "Test" }, + { "u", group = "UI Toggles" }, + { "S", group = "Sessions" }, + { "j", group = "Java" }, + { "c", group = "AI / Claude" }, + { "h", group = "Git Hunks" }, + }) + + -- UI toggle keymaps (no plugin dependency) + local map = vim.keymap.set + map("n", "uw", function() vim.opt.wrap = not vim.wo.wrap end, { desc = "Toggle wrap" }) + map("n", "uf", "zA", { desc = "Toggle all folds" }) + end, + }, + + -- Indentation guides + { + "lukas-reineke/indent-blankline.nvim", + main = "ibl", + event = { "BufReadPost", "BufNewFile" }, + keys = { + { "ui", "IBLToggle", desc = "Toggle indent guides" }, + }, + opts = { + indent = { char = "│" }, + scope = { enabled = true }, + }, + }, + + -- Rendered markdown in buffer + { + "MeanderingProgrammer/render-markdown.nvim", + ft = { "markdown" }, + dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-tree/nvim-web-devicons" }, + opts = { + heading = { enabled = true }, + code = { enabled = true, style = "full" }, + bullet = { enabled = true }, + }, + }, + + -- File explorer as buffer + { + "stevearc/oil.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + cmd = "Oil", + keys = { + { "-", "Oil --float", desc = "Open oil (float)" }, + }, + opts = { + default_file_explorer = true, + float = { padding = 2 }, + view_options = { show_hidden = true }, + }, + }, + + -- Symbols outline panel + { + "stevearc/aerial.nvim", + dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-tree/nvim-web-devicons" }, + keys = { + { "uo", "AerialToggle!", desc = "Symbols outline" }, + }, + opts = { + attach_mode = "global", + backends = { "lsp", "treesitter", "markdown", "man" }, + layout = { min_width = 28 }, + show_guides = true, + }, + }, + + -- Diagnostics list + { + "folke/trouble.nvim", + version = "v3.*", + cmd = "Trouble", + keys = { + { "xx", "Trouble diagnostics toggle", desc = "Workspace diagnostics" }, + { "xd", "Trouble diagnostics toggle filter.buf=0", desc = "Document diagnostics" }, + { "xq", "Trouble qflist toggle", desc = "Quickfix list" }, + { "xl", "Trouble loclist toggle", desc = "Location list" }, + { "xs", "Trouble lsp toggle focus=false win.position=right", desc = "LSP definitions" }, + }, + opts = { use_diagnostic_signs = true }, + }, + + -- Better notifications + { + "rcarriga/nvim-notify", + lazy = false, + priority = 1000, + config = function() + local notify = require("notify") + notify.setup({ + timeout = 3000, + max_width = 80, + stages = "fade_in_slide_out", + render = "default", + background_colour = "#050505", + }) + vim.notify = notify + end, + keys = { + { "un", function() require("notify").dismiss({ silent = true, pending = true }) end, desc = "Dismiss notifications" }, + }, + }, + + -- Sign column + fold gutter management + { + "luukvbaal/statuscol.nvim", + event = "BufReadPost", + config = function() + local builtin = require("statuscol.builtin") + require("statuscol").setup({ + relculright = true, + segments = { + { text = { builtin.foldfunc }, click = "v:lua.ScFa" }, + { text = { "%s" }, click = "v:lua.ScSa" }, + { text = { builtin.lnumfunc, " " }, click = "v:lua.ScLa" }, + }, + }) + end, + }, + + -- Scrollbar with diagnostic + git marks + { + "lewis6991/satellite.nvim", + event = "BufReadPost", + opts = { + current_only = false, + winblend = 50, + handlers = { + cursor = { enable = true }, + search = { enable = true }, + marks = { enable = true }, + quickfix = { enable = false }, + gitsigns = { enable = true }, + diagnostics = { enable = true, min_severity = vim.diagnostic.severity.WARN }, + }, + }, + }, + + -- Session save/restore per directory + { + "folke/persistence.nvim", + event = "BufReadPre", + opts = { dir = vim.fn.stdpath("state") .. "/sessions/" }, + keys = { + { "Ss", function() require("persistence").save() end, desc = "Save session" }, + { "Sr", function() require("persistence").load() end, desc = "Restore session" }, + { "Sl", function() require("persistence").load({ last = true }) end, desc = "Last session" }, + }, + }, + + -- Project-wide search and replace + { + "MagicDuck/grug-far.nvim", + cmd = "GrugFar", + keys = { + { "sr", "GrugFar", desc = "Search & replace" }, + { "rs", "GrugFar", desc = "Search & replace" }, + { "sw", function() require("grug-far").open({ prefills = { search = vim.fn.expand("") } }) end, desc = "Search word" }, + }, + opts = { headerMaxWidth = 80 }, + }, + + -- Code action preview (diff before applying) + { + "aznhe21/actions-preview.nvim", + event = "LspAttach", + keys = { + { "la", function() require("actions-preview").code_actions() end, mode = { "n", "v" }, desc = "Code actions (preview)" }, + }, + opts = {}, + }, + + -- Multi-cursor (Ctrl+N equivalent) + { + "mg979/vim-visual-multi", + event = "VeryLazy", + init = function() + vim.g.VM_maps = { + ["Find Under"] = "", + ["Find Subword Under"] = "", + } + end, + }, + + -- Project switcher (auto-detect project root) + { + "ahmedkhalf/project.nvim", + lazy = false, + config = function() + require("project_nvim").setup({ + detection_methods = { "lsp", "pattern" }, + patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json", "Cargo.toml" }, + silent_chdir = true, + }) + end, + }, + + -- UI Toggles + -- (wrap, fold, spell are just keymap + vim.opt calls — no plugin needed) +} diff --git a/dot_config/nvim/lua/plugins/vimtex.lua b/dot_config/nvim/lua/plugins/vimtex.lua index af4254b..d971a78 100644 --- a/dot_config/nvim/lua/plugins/vimtex.lua +++ b/dot_config/nvim/lua/plugins/vimtex.lua @@ -1,22 +1,28 @@ return { - "lervag/vimtex", - ft = { "tex", "latex" }, -- lazy-load on filetype - init = function() - -- Viewer - vim.g.vimtex_view_method = "zathura" - - -- Compiler: latexmk + LuaLaTeX - vim.g.vimtex_compiler_method = "latexmk" - -- Option A: pass -lualatex explicitly to latexmk - vim.g.vimtex_compiler_latexmk = { - options = { - "-lualatex", - "-synctex=1", - "-interaction=nonstopmode", - "-file-line-error", - }, - } - -- Option B (also helpful): make LuaLaTeX the default engine for latexmk - vim.g.vimtex_compiler_latexmk_engines = { _ = "-lualatex" } - end, + -- VimTeX: LaTeX compilation, navigation, text objects + { + "lervag/vimtex", + ft = { "tex", "plaintex", "bib" }, + init = function() + -- Must be set before vimtex loads + vim.g.vimtex_view_method = "zathura" + vim.g.vimtex_compiler_method = "latexmk" + vim.g.vimtex_compiler_latexmk = { + options = { + "-pdf", + "-shell-escape", + "-verbose", + "-file-line-error", + "-synctex=1", + "-interaction=nonstopmode", + "-lualatex", + }, + } + -- Disable vimtex completion (blink.cmp handles it via cmp-vimtex) + vim.g.vimtex_complete_enabled = 0 + -- Disable vimtex's own syntax (use treesitter instead, with vim regex fallback) + vim.g.vimtex_syntax_enabled = 1 + vim.g.vimtex_syntax_conceal_disable = 0 + end, + }, } diff --git a/dot_config/nvim/lua/polish.lua b/dot_config/nvim/lua/polish.lua deleted file mode 100644 index f97917c..0000000 --- a/dot_config/nvim/lua/polish.lua +++ /dev/null @@ -1,6 +0,0 @@ --- This will run last in the setup process. --- This is just pure lua so anything that doesn't --- fit in the normal config locations above can go here - --- Set the conceal level for prettier formatting in LaTeX and Markdown -vim.opt.conceallevel = 2 diff --git a/dot_config/tmux/apex-neon.conf b/dot_config/tmux/apex-neon.conf new file mode 100644 index 0000000..7dc0288 --- /dev/null +++ b/dot_config/tmux/apex-neon.conf @@ -0,0 +1,29 @@ +# Apex Neon — managed by refresh-apex-themes, do not edit manually +# Run: refresh-apex-themes to update from ~/Dev/Themes/apex/dist + +# Palette variables +set -g @void "#050505" +set -g @panel "#0d0d0d" +set -g @border "#262626" +set -g @stealth "#1a1a1a" +set -g @text "#ededed" +set -g @dim "#404040" +set -g @razor "#ff0044" +set -g @tech "#00eaff" +set -g @toxic "#00ff99" +set -g @amber "#ffb700" +set -g @azure "#0088cc" +set -g @sacred "#9d00ff" + +# Status bar styling +set -g status-style "fg=#{@text},bg=#{@void}" +set -g pane-border-style "fg=#{@border}" +set -g pane-active-border-style "fg=#{@razor}" +set -g message-style "fg=#{@void},bg=#{@tech}" +set -g mode-style "fg=#{@void},bg=#{@tech}" +set -g display-panes-active-colour "#{@tech}" +set -g display-panes-colour "#{@dim}" +set -g clock-mode-colour "#{@tech}" + +set -g window-status-style "fg=#{@dim},bg=#{@void}" +set -g window-status-current-style "fg=#{@void},bg=#{@tech},bold" diff --git a/dot_config/tmux/tmux.conf b/dot_config/tmux/tmux.conf index 1873dfe..7d441f8 100644 --- a/dot_config/tmux/tmux.conf +++ b/dot_config/tmux/tmux.conf @@ -1,97 +1,136 @@ -#### GENERAL SETTINGS #### -set -g default-terminal "xterm-256color" -set -ga terminal-overrides ",xterm-256color:Tc" # truecolor support -set -g history-limit 10000 +#### TERMINAL #### +set -g default-terminal "tmux-256color" +set -ag terminal-overrides ",xterm-256color:RGB" + +#### PREFIX #### +unbind C-b +set -g prefix C-Space +bind C-Space send-prefix + +#### GENERAL OPTIONS #### set -g mouse on - -# Renaming +set -g base-index 1 +setw -g pane-base-index 1 +set -g renumber-windows on +set -sg escape-time 10 +set -g repeat-time 600 +set -g history-limit 50000 +set -g focus-events on +setw -g aggressive-resize on +set -g mode-keys vi +set -g status-keys vi set -wg automatic-rename on -set -g renumber-window on set -g allow-rename off - -# Border status setw -g pane-border-status top -#### KEYBINDINGS #### -# Use Alt-a as prefix -unbind C-b -set -g prefix M-a -bind M-a send-prefix +#### PANE NAVIGATION (no prefix — smart-splits passthrough) #### +bind -n C-h select-pane -L +bind -n C-j select-pane -D +bind -n C-k select-pane -U +bind -n C-l select-pane -R -# Better split bindings -unbind '"' -unbind % -bind | split-window -h -c "#{pane_current_path}" -bind - split-window -v -c "#{pane_current_path}" -bind -n M-H split-window -h -b -c "#{pane_current_path}" -bind -n M-L split-window -h -c "#{pane_current_path}" -bind -n M-K split-window -v -b -c "#{pane_current_path}" -bind -n M-J split-window -v -c "#{pane_current_path}" - -# Vim-like pane movement +#### PANE NAVIGATION (with prefix) #### bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R -bind -n M-h select-pane -L -bind -n M-j select-pane -D -bind -n M-k select-pane -U -bind -n M-l select-pane -R -# Alt+Tab to switch between last panes -bind -n M-Tab last-pane +#### PANE MOVEMENT (swap) #### +bind H swap-pane -U +bind J swap-pane -D +bind K swap-pane -U +bind L swap-pane -D -# Resize panes with vimkeys -bind -n C-M-h resize-pane -L 5 -bind -n C-M-j resize-pane -D 5 -bind -n C-M-k resize-pane -U 5 -bind -n C-M-l resize-pane -R 5 +#### PANE SPLITS #### +unbind '"' +unbind % +bind s split-window -v -c "#{pane_current_path}" +bind v split-window -h -c "#{pane_current_path}" +bind q kill-pane +bind z resize-pane -Z -# Reload config -bind r source-file ~/.config/tmux/tmux.conf \; display-message "Config reloaded!" +#### RESIZE MODE #### +bind r switch-client -T resize +bind -T resize h resize-pane -L 5 +bind -T resize j resize-pane -D 5 +bind -T resize k resize-pane -U 5 +bind -T resize l resize-pane -R 5 +bind -T resize H resize-pane -L 15 +bind -T resize J resize-pane -D 15 +bind -T resize K resize-pane -U 15 +bind -T resize L resize-pane -R 15 +bind -T resize Escape switch-client -T root +bind -T resize Enter switch-client -T root -#### COPY/CLIPBOARD SUPPORT #### -setw -g mode-keys vi -bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel "kitty +kitten clipboard" +#### WINDOWS #### +bind Return new-window -c "#{pane_current_path}" +bind c new-window -c "#{pane_current_path}" +bind Q kill-window +bind Tab next-window +bind BTab previous-window +bind 1 select-window -t :1 +bind 2 select-window -t :2 +bind 3 select-window -t :3 +bind 4 select-window -t :4 +bind 5 select-window -t :5 +bind 6 select-window -t :6 +bind 7 select-window -t :7 +bind 8 select-window -t :8 +bind 9 select-window -t :9 +bind , command-prompt -I "#W" "rename-window '%%'" +#### SESSIONS #### +bind Space choose-tree -Zs +bind '$' command-prompt -I "#S" "rename-session '%%'" +bind d detach-client +bind C-s run-shell "~/.config/tmux/plugins/tpm/plugins/tmux-resurrect/scripts/save.sh" +bind C-r run-shell "~/.config/tmux/plugins/tpm/plugins/tmux-resurrect/scripts/restore.sh" -# Apex Neon theme -set -g status-style "fg=#ededed,bg=#050505" -set -g status-justify "absolute-centre" -set -g pane-border-style "fg=#262626" -set -g pane-active-border-style "fg=#ff0044" -set -g message-style "fg=#050505,bg=#00eaff" -set -g mode-style "fg=#050505,bg=#00eaff" -set -g display-panes-active-colour "#00eaff" -set -g display-panes-colour "#404040" -set -g clock-mode-colour "#00eaff" +#### COPY MODE #### +bind '[' copy-mode +bind ']' paste-buffer +bind -T copy-mode-vi v send -X begin-selection +bind -T copy-mode-vi y send -X copy-selection-and-cancel +bind -T copy-mode-vi C-v send -X rectangle-toggle +bind -T copy-mode-vi Escape send -X cancel +bind -T copy-mode-vi q send -X cancel -set -g @tmux-weather-location "Nospelt" +#### MISC #### +bind R source-file ~/.config/tmux/tmux.conf \; display-message "Config reloaded!" +bind ? list-keys +bind t clock-mode -set -g window-status-style "fg=#404040,bg=#050505" -set -g window-status-current-style "fg=#050505,bg=#00eaff,bold" -set -g window-status-format " #I:#W " -set -g window-status-current-format "#[fg=#050505,bg=#00eaff,bold] #I:#W #[fg=#00eaff,bg=#050505]" +#### THEME #### +source-file ~/.config/tmux/apex-neon.conf +#### STATUS BAR #### set -g status-left-length 100 -set -g status-left "#[fg=#050505,bg=#ff0044,bold] #S #[fg=#ff0044,bg=#050505] " +set -g status-right-length 200 -set -g status-right-length 100 -set -g status-right "#[fg=#9d00ff]#H #[fg=#00eaff]%Y-%m-%d %H:%M " +set -g status-left "#[fg=#{@void},bg=#{@razor},bold] #S #[fg=#{@razor},bg=default] " +set -g status-right " #{cpu_fg_color}CPU:#{cpu_percentage} #[fg=#{@tech}]MEM:#{ram_percentage} #{battery_color_fg}BAT:#{battery_percentage} #[fg=#{@amber}]#{@tmux-weather-location}:#{weather} #[fg=#{@dim}]%Y-%m-%d #[fg=#{@text}]%H:%M " +set -g window-status-format " #I:#W " +set -g window-status-current-format "#[bold] #I:#W " +set -g status-justify "absolute-centre" -#### TMUX PLUGIN MANAGER + PLUGINS #### +#### RESURRECT / CONTINUUM #### +set -g @continuum-restore 'on' +set -g @continuum-save-interval '15' +set -g @resurrect-capture-pane-contents 'on' + +#### PLUGINS (TPM) #### set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-sensible' set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-continuum' set -g @plugin 'tmux-plugins/tmux-yank' - -# style set -g @plugin 'joshmedeski/tmux-nerd-font-window-name' set -g @plugin 'tmux-plugins/tmux-cpu' set -g @plugin 'tmux-plugins/tmux-battery' set -g @plugin 'xamut/tmux-weather' +set -g @tmux-weather-location "Nospelt" + # Initialize TPM (must be last) run '~/.config/tmux/plugins/tpm/tpm'