merge from update

This commit is contained in:
Walter Jenkins 2025-04-16 08:41:10 -05:00
commit 83f02dbde7
45 changed files with 2444 additions and 1279 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ nvim
spell/
lazy-lock.json
.github/.DS_Store

View File

@ -4,3 +4,4 @@ indent_type = "Spaces"
indent_width = 2
quote_style = "AutoPreferSingle"
call_parentheses = "None"
virtualedit = onemore

1058
init.lua

File diff suppressed because it is too large Load Diff

9
lazyvim.json Normal file
View File

@ -0,0 +1,9 @@
{
"extras": [
],
"news": {
"NEWS.md": "10960"
},
"version": 8
}

193
lua/core/keymaps.lua Normal file
View File

@ -0,0 +1,193 @@
-- Keymaps for better default experience
-- Set leader key
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
-- For conciseness
local opts = { noremap = true, silent = true }
-- Disable the spacebar key's default behavior in Normal and Visual modes
vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true })
-- Allow moving the cursor through wrapped lines with j, k
vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true })
vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true })
-- clear highlights
vim.keymap.set('n', '<Esc>', ':noh<CR>', opts)
-- save file
vim.keymap.set('n', '<C-s>', '<cmd> w <CR>', opts)
-- save file without auto-formatting
vim.keymap.set('n', '<leader>sn', '<cmd>noautocmd w <CR>', opts)
-- quit file
vim.keymap.set('n', '<C-q>', '<cmd> q <CR>', opts)
-- delete single character without copying into register
vim.keymap.set('n', 'x', '"_x', opts)
-- Vertical scroll and center
vim.keymap.set('n', '<C-d>', '<C-d>zz', opts)
vim.keymap.set('n', '<C-u>', '<C-u>zz', opts)
-- Find and center
vim.keymap.set('n', 'n', 'nzzzv')
vim.keymap.set('n', 'N', 'Nzzzv')
-- Resize with arrows
vim.keymap.set('n', '<Up>', ':resize -2<CR>', opts)
vim.keymap.set('n', '<Down>', ':resize +2<CR>', opts)
vim.keymap.set('n', '<Left>', ':vertical resize -2<CR>', opts)
vim.keymap.set('n', '<Right>', ':vertical resize +2<CR>', opts)
-- Buffers
vim.keymap.set('n', '<S-l>', ':bnext<CR>', opts)
vim.keymap.set('n', '<S-h>', ':bprevious<CR>', opts)
vim.keymap.set('n', '<leader>x', ':Bdelete!<CR>', opts) -- close buffer
vim.keymap.set('n', '<leader>b', '<cmd> enew <CR>', opts) -- new buffer
-- Increment/decrement numbers
vim.keymap.set('n', '<leader>+', '<C-a>', opts) -- increment
vim.keymap.set('n', '<leader>-', '<C-x>', opts) -- decrement
-- Window management
vim.keymap.set('n', '<leader>v', '<C-w>v', opts) -- split window vertically
vim.keymap.set('n', '<leader>h', '<C-w>s', opts) -- split window horizontally
vim.keymap.set('n', '<leader>se', '<C-w>=', opts) -- make split windows equal width & height
vim.keymap.set('n', '<leader>xs', ':close<CR>', opts) -- close current split window
-- Navigate between splits
vim.keymap.set('n', '<C-k>', ':wincmd k<CR>', opts)
vim.keymap.set('n', '<C-j>', ':wincmd j<CR>', opts)
vim.keymap.set('n', '<C-h>', ':wincmd h<CR>', opts)
vim.keymap.set('n', '<C-l>', ':wincmd l<CR>', opts)
-- Tabs
vim.keymap.set('n', '<leader>to', ':tabnew<CR>', opts) -- open new tab
vim.keymap.set('n', '<leader>tx', ':tabclose<CR>', opts) -- close current tab
vim.keymap.set('n', '<leader>tn', ':tabn<CR>', opts) -- go to next tab
vim.keymap.set('n', '<leader>tp', ':tabp<CR>', opts) -- go to previous tab
-- Toggle line wrapping
vim.keymap.set('n', '<leader>lw', '<cmd>set wrap!<CR>', opts)
-- Press jk fast to exit insert mode
vim.keymap.set('i', 'jk', '<ESC>', opts)
vim.keymap.set('i', 'kj', '<ESC>', opts)
-- Stay in indent mode
vim.keymap.set('v', '<', '<gv', opts)
vim.keymap.set('v', '>', '>gv', opts)
-- Move text up and down
vim.keymap.set('v', '<A-j>', ':m .+1<CR>==', opts)
vim.keymap.set('v', '<A-k>', ':m .-2<CR>==', opts)
-- Keep last yanked when pasting
vim.keymap.set('v', 'p', '"_dP', opts)
-- Replace word under cursor
vim.keymap.set('n', '<leader>j', '*``cgn', opts)
-- Explicitly yank to system clipboard (highlighted and entire row)
vim.keymap.set({ 'n', 'v' }, '<leader>y', [["+y]])
vim.keymap.set('n', '<leader>Y', [["+Y]])
-- Toggle diagnostics
local diagnostics_active = true
vim.keymap.set('n', '<leader>do', function()
diagnostics_active = not diagnostics_active
if diagnostics_active then
vim.diagnostic.enable(0)
else
vim.diagnostic.disable(0)
end
end)
-- Diagnostic keymaps
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' })
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' })
vim.keymap.set('n', '<leader>d', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' })
vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' })
-- Save and load session
vim.keymap.set('n', '<leader>ss', ':mksession! .session.vim<CR>', { noremap = true, silent = false })
vim.keymap.set('n', '<leader>sl', ':source .session.vim<CR>', { noremap = true, silent = false })
-- exit insrrt mode with jk
vim.keymap.set('i', 'jk', '<ESC>', { noremap = true, silent = true, desc = '<ESC>' })
-- -- option + a to select all text in a file
vim.keymap.set('n', '<M-a>', 'ggVG', { noremap = true, silent = true, desc = 'Select all' })
--
-- Map the function to a key combination
vim.keymap.set('n', '<leader>te', 'oif err != nil {<CR>}<Esc>Oreturn err<Esc>')
--
-- -- Remap <Leader>x to close the current buffer
vim.api.nvim_set_keymap('n', '<Leader>x', ':bd<CR>', { noremap = true, silent = true })
-- vim.api.nvim_del_keymap('n', '<Leader>l')
-- Function to restart LSP
vim.api.nvim_set_keymap('n', '<leader>L', ':LspRestart<CR>', { noremap = true, silent = true })
-- -- Remap <Leader>l to restart LSP
vim.api.nvim_set_keymap('n', '<Leader>l', '<cmd>lua restart_lsp()<CR>', { noremap = true, silent = true })
-- Remap leader+f to leader+F
vim.api.nvim_set_keymap('n', '<leader><leader>', '<leader>fF', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>ff', '<leader>fF', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>ft', '<leader>fT', { noremap = true, silent = true })
vim.keymap.set('n', '<Tab>', '20j', { noremap = true, silent = true })
vim.keymap.set('n', '<S-Tab>', '20k', { noremap = true, silent = true })
-- diagnostic
local diagnostic_goto = function(next, severity)
local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev
severity = severity and vim.diagnostic.severity[severity] or nil
return function()
go { severity = severity }
end
end
vim.keymap.set('n', '<leader>cd', vim.diagnostic.open_float, { desc = 'Line Diagnostics' })
vim.keymap.set('n', ']d', diagnostic_goto(true), { desc = 'Next Diagnostic' })
vim.keymap.set('n', '[d', diagnostic_goto(false), { desc = 'Prev Diagnostic' })
vim.keymap.set('n', ']e', diagnostic_goto(true, 'ERROR'), { desc = 'Next Error' })
vim.keymap.set('n', '[e', diagnostic_goto(false, 'ERROR'), { desc = 'Prev Error' })
vim.keymap.set('n', ']w', diagnostic_goto(true, 'WARN'), { desc = 'Next Warning' })
vim.keymap.set('n', '[w', diagnostic_goto(false, 'WARN'), { desc = 'Prev Warning' })
vim.api.nvim_set_hl(0, '@lsp.type.unused', { link = 'Comment' })
-- jumping lines
-- vim.keymap.del("n", "<S-[>")
-- vim.keymap.del("n", "<S-]>")
vim.keymap.set("n", "<S-[>", "{", { noremap = true, silent = true }) -- Jump up to previous empty line
vim.keymap.set("n", "<S-]>", "}", { noremap = true, silent = true }) -- Jump down to next empty line
vim.keymap.set('n', '<leader>st', function()
require('telescope.builtin').live_grep({ default_text = "// TODO:" })
end, { desc = "Search for TODO comments" })
vim.keymap.set('n', '<leader>sx', function()
require('telescope.builtin').live_grep({ default_text = "// FUTURE:" })
end, { desc = "Search for FUTURE comments" })
vim.keymap.set('n', '<leader>si', function()
require('telescope.builtin').live_grep({ default_text = "// IMPORTANT:" })
end, { desc = "Search for IMPORTANT comments" })
-- Define highlight groups for comment tags
vim.api.nvim_set_hl(0, "FutureHighlight", { bg = "#3b4252", fg = "#81a1c1", bold = true }) -- Light blue
vim.api.nvim_set_hl(0, "FixmeHighlight", { bg = "#3b4252", fg = "#bf616a", bold = true }) -- Red
vim.api.nvim_set_hl(0, "NoteHighlight", { bg = "#3b4252", fg = "#ebcb8b", bold = true }) -- Yellow
vim.api.nvim_set_hl(0, "QuestionHighlight", { bg = "#3b4252", fg = "#b48ead", bold = true }) -- Purple
vim.api.nvim_set_hl(0, "ImportantHighlight", { bg = "#3b4252", fg = "#a3be8c", bold = true }) -- Green

63
lua/core/options.lua Normal file
View File

@ -0,0 +1,63 @@
vim.o.hlsearch = false -- Set highlight on search
vim.wo.number = true -- Make line numbers default
vim.o.mouse = 'a' -- Enable mouse mode
vim.o.clipboard = 'unnamedplus' -- Sync clipboard between OS and Neovim.
vim.o.breakindent = true -- Enable break indent
vim.o.undofile = true -- Save undo history
vim.o.ignorecase = true -- Case-insensitive searching UNLESS \C or capital in search
vim.o.smartcase = true -- smart case
vim.wo.signcolumn = 'yes' -- Keep signcolumn on by default
vim.o.updatetime = 250 -- Decrease update time
vim.o.timeoutlen = 300 -- time to wait for a mapped sequence to complete (in milliseconds)
vim.o.backup = false -- creates a backup file
vim.o.writebackup = false -- if a file is being edited by another program (or was written to file while editing with another program), it is not allowed to be edited
vim.o.completeopt = 'menuone,noselect' -- Set completeopt to have a better completion experience
vim.opt.termguicolors = true -- set termguicolors to enable highlight groups
vim.o.whichwrap = 'bs<>[]hl' -- which "horizontal" keys are allowed to travel to prev/next line
vim.o.wrap = false -- display lines as one long line
vim.o.linebreak = true -- companion to wrap don't split words
vim.o.scrolloff = 0 -- minimal number of screen lines to keep above and below the cursor
vim.o.sidescrolloff = 8 -- minimal number of screen columns either side of cursor if wrap is `false`
vim.o.relativenumber = true -- set relative numbered lines
vim.o.numberwidth = 4 -- set number column width to 2 {default 4}
vim.o.shiftwidth = 4 -- the number of spaces inserted for each indentation
vim.o.tabstop = 2 -- insert n spaces for a tab
vim.o.softtabstop = 4 -- Number of spaces that a tab counts for while performing editing operations
vim.o.expandtab = true -- convert tabs to spaces
vim.o.cursorline = true -- highlight the current line
vim.o.splitbelow = true -- force all horizontal splits to go below current window
vim.o.splitright = true -- force all vertical splits to go to the right of current window
vim.o.swapfile = false -- creates a swapfile
vim.o.smartindent = true -- make indenting smarter again
vim.o.showmode = false -- we don't need to see things like -- INSERT -- anymore
vim.o.showtabline = 2 -- always show tabs
vim.o.backspace = 'indent,eol,start' -- allow backspace on
vim.o.pumheight = 10 -- pop up menu height
vim.o.conceallevel = 0 -- so that `` is visible in markdown files
vim.o.fileencoding = 'utf-8' -- the encoding written to a file
vim.o.cmdheight = 1 -- more space in the neovim command line for displaying messages
vim.o.autoindent = true -- copy indent from current line when starting new one
vim.opt.shortmess:append 'c' -- don't give |ins-completion-menu| messages
vim.opt.iskeyword:append '-' -- hyphenated words recognized by searches
vim.opt.formatoptions:remove { 'c', 'r', 'o' } -- don't insert the current comment leader automatically for auto-wrapping comments using 'textwidth', hitting <Enter> in insert mode, or hitting 'o' or 'O' in normal mode.
vim.opt.runtimepath:remove '/usr/share/vim/vimfiles' -- separate vim plugins from neovim in case vim still in use
-- -- Ensure fold method is set (syntax-based folding is great for Nim)
-- vim.o.foldmethod = "syntax"
-- vim.o.foldenable = true -- Enable folding at startup
-- vim.o.foldlevel = 99 -- Open all folds by default
-- Use Treesitter for better folding (Recommended)
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
-- Set fold level
vim.opt.foldenable = true
vim.opt.foldlevel = 99 -- Keep folds open by default

45
lua/core/snippets.lua Normal file
View File

@ -0,0 +1,45 @@
-- Custom code snippets for different purposes
-- Prevent LSP from overwriting treesitter color settings
-- https://github.com/NvChad/NvChad/issues/1907
vim.highlight.priorities.semantic_tokens = 95 -- Or any number lower than 100, treesitter's priority level
-- Appearance of diagnostics
vim.diagnostic.config {
virtual_text = {
prefix = '',
-- Add a custom format function to show error codes
format = function(diagnostic)
local code = diagnostic.code and string.format('[%s]', diagnostic.code) or ''
return string.format('%s %s', code, diagnostic.message)
end,
},
underline = false,
update_in_insert = true,
float = {
source = 'always', -- Or "if_many"
},
-- Make diagnostic background transparent
on_ready = function()
vim.cmd 'highlight DiagnosticVirtualText guibg=NONE'
end,
}
-- Highlight on yank
local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true })
vim.api.nvim_create_autocmd('TextYankPost', {
callback = function()
vim.highlight.on_yank()
end,
group = highlight_group,
pattern = '*',
})
-- Set kitty terminal padding to 0 when in nvim
vim.cmd [[
augroup kitty_mp
autocmd!
au VimLeave * :silent !kitty @ set-spacing padding=default margin=default
au VimEnter * :silent !kitty @ set-spacing padding=0 margin=0 3 0 3
augroup END
]]

59
lua/core/ui.lua Normal file
View File

@ -0,0 +1,59 @@
return {
{
'folke/noice.nvim',
opts = function(_, opts)
-- 🔥 Ensure `opts.presets` is initialized before modifying
opts.presets = opts.presets or {}
opts.presets.lsp_doc_border = true
-- 🔥 Ensure `opts.routes` is a table before inserting
opts.routes = opts.routes or {}
table.insert(opts.routes, {
filter = {
event = 'notify',
find = 'No information available',
},
opts = { skip = true },
})
end,
},
{
'akinsho/bufferline.nvim',
event = 'VeryLazy',
opts = {
options = {
show_buffer_close_icons = false,
show_close_icon = false,
},
},
},
{
'nvimdev/dashboard-nvim',
event = 'VimEnter',
opts = function(_, opts)
local logo = [[
]]
logo = string.rep('\n', 8) .. logo .. '\n\n'
-- 🔥 Ensure `opts.config` is a table before modifying
opts.config = opts.config or {}
opts.config.header = vim.split(logo, '\n')
end,
},
}

View File

@ -1,5 +0,0 @@
-- You can add your own plugins here or in other files in this directory!
-- I promise not to create any merge conflicts in this directory :)
--
-- See the kickstart.nvim README for more information
return {}

View File

@ -1,52 +0,0 @@
--[[
--
-- This file is not required for your own configuration,
-- but helps people determine if their system is setup correctly.
--
--]]
local check_version = function()
local verstr = tostring(vim.version())
if not vim.version.ge then
vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr))
return
end
if vim.version.ge(vim.version(), '0.10-dev') then
vim.health.ok(string.format("Neovim version is: '%s'", verstr))
else
vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr))
end
end
local check_external_reqs = function()
-- Basic utils: `git`, `make`, `unzip`
for _, exe in ipairs { 'git', 'make', 'unzip', 'rg' } do
local is_executable = vim.fn.executable(exe) == 1
if is_executable then
vim.health.ok(string.format("Found executable: '%s'", exe))
else
vim.health.warn(string.format("Could not find executable: '%s'", exe))
end
end
return true
end
return {
check = function()
vim.health.start 'kickstart.nvim'
vim.health.info [[NOTE: Not every warning is a 'must-fix' in `:checkhealth`
Fix only warnings for plugins and languages you intend to use.
Mason will give warnings for languages that are not installed.
You do not need to install, unless you want to use those languages!]]
local uv = vim.uv or vim.loop
vim.health.info('System Information: ' .. vim.inspect(uv.os_uname()))
check_version()
check_external_reqs()
end,
}

View File

@ -1,148 +0,0 @@
-- debug.lua
--
-- Shows how to use the DAP plugin to debug your code.
--
-- Primarily focused on configuring the debugger for Go, but can
-- be extended to other languages as well. That's why it's called
-- kickstart.nvim and not kitchen-sink.nvim ;)
return {
-- NOTE: Yes, you can install new plugins here!
'mfussenegger/nvim-dap',
-- NOTE: And you can specify dependencies as well
dependencies = {
-- Creates a beautiful debugger UI
'rcarriga/nvim-dap-ui',
-- Required dependency for nvim-dap-ui
'nvim-neotest/nvim-nio',
-- Installs the debug adapters for you
'williamboman/mason.nvim',
'jay-babu/mason-nvim-dap.nvim',
-- Add your own debuggers here
'leoluz/nvim-dap-go',
},
keys = {
-- Basic debugging keymaps, feel free to change to your liking!
{
'<F5>',
function()
require('dap').continue()
end,
desc = 'Debug: Start/Continue',
},
{
'<F1>',
function()
require('dap').step_into()
end,
desc = 'Debug: Step Into',
},
{
'<F2>',
function()
require('dap').step_over()
end,
desc = 'Debug: Step Over',
},
{
'<F3>',
function()
require('dap').step_out()
end,
desc = 'Debug: Step Out',
},
{
'<leader>b',
function()
require('dap').toggle_breakpoint()
end,
desc = 'Debug: Toggle Breakpoint',
},
{
'<leader>B',
function()
require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ')
end,
desc = 'Debug: Set Breakpoint',
},
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
{
'<F7>',
function()
require('dapui').toggle()
end,
desc = 'Debug: See last session result.',
},
},
config = function()
local dap = require 'dap'
local dapui = require 'dapui'
require('mason-nvim-dap').setup {
-- Makes a best effort to setup the various debuggers with
-- reasonable debug configurations
automatic_installation = true,
-- You can provide additional configuration to the handlers,
-- see mason-nvim-dap README for more information
handlers = {},
-- You'll need to check that you have the required things installed
-- online, please don't ask me how to install them :)
ensure_installed = {
-- Update this to ensure that you have the debuggers for the langs you want
'delve',
},
}
-- Dap UI setup
-- For more information, see |:help nvim-dap-ui|
dapui.setup {
-- Set icons to characters that are more likely to work in every terminal.
-- Feel free to remove or use ones that you like more! :)
-- Don't feel like these are good choices.
icons = { expanded = '', collapsed = '', current_frame = '*' },
controls = {
icons = {
pause = '',
play = '',
step_into = '',
step_over = '',
step_out = '',
step_back = 'b',
run_last = '▶▶',
terminate = '',
disconnect = '',
},
},
}
-- Change breakpoint icons
-- vim.api.nvim_set_hl(0, 'DapBreak', { fg = '#e51400' })
-- vim.api.nvim_set_hl(0, 'DapStop', { fg = '#ffcc00' })
-- local breakpoint_icons = vim.g.have_nerd_font
-- and { Breakpoint = '', BreakpointCondition = '', BreakpointRejected = '', LogPoint = '', Stopped = '' }
-- or { Breakpoint = '●', BreakpointCondition = '⊜', BreakpointRejected = '⊘', LogPoint = '◆', Stopped = '⭔' }
-- for type, icon in pairs(breakpoint_icons) do
-- local tp = 'Dap' .. type
-- local hl = (type == 'Stopped') and 'DapStop' or 'DapBreak'
-- vim.fn.sign_define(tp, { text = icon, texthl = hl, numhl = hl })
-- end
dap.listeners.after.event_initialized['dapui_config'] = dapui.open
dap.listeners.before.event_terminated['dapui_config'] = dapui.close
dap.listeners.before.event_exited['dapui_config'] = dapui.close
-- Install golang specific config
require('dap-go').setup {
delve = {
-- On Windows delve must be run attached or it crashes.
-- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring
detached = vim.fn.has 'win32' == 0,
},
}
end,
}

View File

@ -1,9 +0,0 @@
return {
{ -- Add indentation guides even on blank lines
'lukas-reineke/indent-blankline.nvim',
-- Enable `lukas-reineke/indent-blankline.nvim`
-- See `:help ibl`
main = 'ibl',
opts = {},
},
}

View File

@ -1,60 +0,0 @@
return {
{ -- Linting
'mfussenegger/nvim-lint',
event = { 'BufReadPre', 'BufNewFile' },
config = function()
local lint = require 'lint'
lint.linters_by_ft = {
markdown = { 'markdownlint' },
}
-- To allow other plugins to add linters to require('lint').linters_by_ft,
-- instead set linters_by_ft like this:
-- lint.linters_by_ft = lint.linters_by_ft or {}
-- lint.linters_by_ft['markdown'] = { 'markdownlint' }
--
-- However, note that this will enable a set of default linters,
-- which will cause errors unless these tools are available:
-- {
-- clojure = { "clj-kondo" },
-- dockerfile = { "hadolint" },
-- inko = { "inko" },
-- janet = { "janet" },
-- json = { "jsonlint" },
-- markdown = { "vale" },
-- rst = { "vale" },
-- ruby = { "ruby" },
-- terraform = { "tflint" },
-- text = { "vale" }
-- }
--
-- You can disable the default linters by setting their filetypes to nil:
-- lint.linters_by_ft['clojure'] = nil
-- lint.linters_by_ft['dockerfile'] = nil
-- lint.linters_by_ft['inko'] = nil
-- lint.linters_by_ft['janet'] = nil
-- lint.linters_by_ft['json'] = nil
-- lint.linters_by_ft['markdown'] = nil
-- lint.linters_by_ft['rst'] = nil
-- lint.linters_by_ft['ruby'] = nil
-- lint.linters_by_ft['terraform'] = nil
-- lint.linters_by_ft['text'] = nil
-- Create autocommand which carries out the actual linting
-- on the specified events.
local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true })
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
group = lint_augroup,
callback = function()
-- Only run the linter in buffers that you can modify in order to
-- avoid superfluous noise, notably within the handy LSP pop-ups that
-- describe the hovered symbol using Markdown.
if vim.opt_local.modifiable:get() then
lint.try_lint()
end
end,
})
end,
},
}

View File

@ -1,25 +0,0 @@
-- Neo-tree is a Neovim plugin to browse the file system
-- https://github.com/nvim-neo-tree/neo-tree.nvim
return {
'nvim-neo-tree/neo-tree.nvim',
version = '*',
dependencies = {
'nvim-lua/plenary.nvim',
'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended
'MunifTanjim/nui.nvim',
},
cmd = 'Neotree',
keys = {
{ '\\', ':Neotree reveal<CR>', desc = 'NeoTree reveal', silent = true },
},
opts = {
filesystem = {
window = {
mappings = {
['\\'] = 'close_window',
},
},
},
},
}

26
lua/plugins/aerial.lua Normal file
View File

@ -0,0 +1,26 @@
return {
'stevearc/aerial.nvim',
lazy_load = true,
opts = {},
-- Optional dependencies
dependencies = {
'nvim-treesitter/nvim-treesitter',
'nvim-tree/nvim-web-devicons',
},
config = function()
require('aerial').setup {
-- optionally use on_attach to set keymaps when aerial has attached to a buffer
on_attach = function(bufnr)
-- Jump forwards/backwards with '{' and '}'
-- vim.keymap.set('n', '{', '<cmd>AerialPrev<CR>', { buffer = bufnr })
-- vim.keymap.set('n', '}', '<cmd>AerialNext<CR>', { buffer = bufnr })
end,
layout = {
min_width = 30,
},
}
-- You probably also want to set a keymap to toggle aerial
vim.keymap.set('n', '<leader>o', '<cmd>AerialToggle!<CR>')
vim.keymap.set('n', '<leader>on', '<cmd>AerialNavToggle<CR>')
end,
}

View File

@ -0,0 +1,143 @@
return { -- Autocompletion
'hrsh7th/nvim-cmp',
-- event = 'InsertEnter',
dependencies = {
-- Snippet Engine & its associated nvim-cmp source
{
'L3MON4D3/LuaSnip',
build = (function()
-- Build Step is needed for regex support in snippets
-- This step is not supported in many windows environments
-- Remove the below condition to re-enable on windows
if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then
return
end
return 'make install_jsregexp'
end)(),
},
'saadparwaiz1/cmp_luasnip',
-- Adds other completion capabilities.
-- nvim-cmp does not ship with all sources by default. They are split
-- into multiple repos for maintenance purposes.
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-buffer',
'hrsh7th/cmp-path',
-- Adds a number of user-friendly snippets
'rafamadriz/friendly-snippets',
},
config = function()
local cmp = require 'cmp'
require('luasnip.loaders.from_vscode').lazy_load()
local luasnip = require 'luasnip'
luasnip.config.setup {}
local kind_icons = {
Text = '󰉿',
Method = 'm',
Function = '󰊕',
Constructor = '',
Field = '',
Variable = '󰆧',
Class = '󰌗',
Interface = '',
Module = '',
Property = '',
Unit = '',
Value = '󰎠',
Enum = '',
Keyword = '󰌋',
Snippet = '',
Color = '󰏘',
File = '󰈙',
Reference = '',
Folder = '󰉋',
EnumMember = '',
Constant = '󰇽',
Struct = '',
Event = '',
Operator = '󰆕',
TypeParameter = '󰊄',
}
cmp.setup {
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
completion = { completeopt = 'menu,menuone,noinsert' },
-- window = {
-- completion = cmp.config.window.bordered(),
-- documentation = cmp.config.window.bordered(),
-- },
mapping = cmp.mapping.preset.insert {
['<C-j>'] = cmp.mapping.select_next_item(), -- Select the [n]ext item
['<C-k>'] = cmp.mapping.select_prev_item(), -- Select the [p]revious item
['<CR>'] = cmp.mapping.confirm { select = true }, -- Accept the completion with Enter.
['<C-c>'] = cmp.mapping.complete {}, -- Manually trigger a completion from nvim-cmp.
-- Think of <c-l> as moving to the right of your snippet expansion.
-- So if you have a snippet that's like:
-- function $name($args)
-- $body
-- end
--
-- <c-l> will move you to the right of each of the expansion locations.
-- <c-h> is similar, except moving you backwards.
['<C-l>'] = cmp.mapping(function()
if luasnip.expand_or_locally_jumpable() then
luasnip.expand_or_jump()
end
end, { 'i', 's' }),
['<C-h>'] = cmp.mapping(function()
if luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
end
end, { 'i', 's' }),
-- Select next/previous item with Tab / Shift + Tab
['<Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_locally_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { 'i', 's' }),
},
sources = {
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
{ name = 'buffer' },
{ name = 'path' },
},
formatting = {
fields = { 'kind', 'abbr', 'menu' },
format = function(entry, vim_item)
-- Kind icons
vim_item.kind = string.format('%s', kind_icons[vim_item.kind])
-- vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind
vim_item.menu = ({
nvim_lsp = '[LSP]',
luasnip = '[Snippet]',
buffer = '[Buffer]',
path = '[Path]',
})[entry.source.name]
return vim_item
end,
},
}
end,
}

28
lua/plugins/avante.lua Normal file
View File

@ -0,0 +1,28 @@
return {
'yetone/avante.nvim',
event = 'VeryLazy',
build = 'make',
opts = {
provider = 'claude',
claude = {
endpoint = os.getenv 'AVANTE_ANTHROPIC_ENDPOINT' or 'https://api.anthropic.com',
model = 'claude-3-5-sonnet-20240620',
timeout = 30000, -- Timeout in milliseconds
temperature = 0,
max_tokens = 4096,
},
openai = {
endpoint = os.getenv 'AVANTE_OPENAI_ENDPOINT' or 'https://api.openai.com/v1',
model = 'gpt-4o',
timeout = 30000, -- Timeout in milliseconds
temperature = 0,
max_tokens = 4096,
},
},
dependencies = {
'nvim-tree/nvim-web-devicons',
'stevearc/dressing.nvim',
'nvim-lua/plenary.nvim',
'MunifTanjim/nui.nvim',
},
}

View File

@ -0,0 +1,140 @@
-- TODO: don't having to resave to remove extmark
-- TODO: see the others TODO
local M = {}
local api = vim.api
local cmd = vim.api.nvim_create_autocmd
local treesitter = vim.treesitter
local opts = {
tags = {
{
name = "TODO",
fg = "white",
bg = "#0a7aca",
bold = true,
},
{
name = "FIX",
fg = "white",
bg = "#f44747",
bold = true,
},
{
name = "WARNING",
fg = "#FFA500",
bold = false,
},
{
name = "FUTURE",
fg = "#f44747",
bold = true,
}
},
}
M.Setup = function(config)
if config and config.default==false then
opts.tags = {}
end
if config and config.tags then
opts.tags = vim.tbl_deep_extend("force", opts.tags, config.tags or {})
end
local augroup = vim.api.nvim_create_augroup("better-comments", {clear = true})
cmd({ 'BufWinEnter', 'BufFilePost', 'BufWritePost', 'TextChanged', 'TextChangedI' }, {
group = augroup,
callback = function()
local current_buffer = api.nvim_get_current_buf()
local current_buffer_name = api.nvim_buf_get_name(current_buffer)
if current_buffer_name == '' then
return
end
local fileType = api.nvim_buf_get_option(current_buffer, "filetype")
local success, parsed_query = pcall(function()
return treesitter.query.parse(fileType, [[(comment) @all]])
end)
if not success then
return
end
local commentsTree = treesitter.query.parse(fileType, [[(comment) @all]])
-- FIX: Check if file has treesitter
local root = Get_root(current_buffer, fileType)
local comments = {}
for _, node in commentsTree:iter_captures(root, current_buffer, 0, -1) do
local range = { node:range() }
table.insert(comments, {
line = range[1],
col_start = range[2],
finish = range[4],
text = vim.treesitter.get_node_text(node, current_buffer)
})
end
if comments == {} then
return
end
Create_hl(opts.tags)
for id, comment in ipairs(comments) do
for hl_id, hl in ipairs(opts.tags) do
if string.find(comment.text, hl.name) then
local ns_id = vim.api.nvim_create_namespace(hl.name)
if hl.virtual_text and hl.virtual_text ~= "" then
local v_opts = {
id = id,
virt_text = { { hl.virtual_text, "" } },
virt_text_pos = 'overlay',
virt_text_win_col = comment.finish + 2,
}
-- FIX: comment.line -> 0 in col
api.nvim_buf_set_extmark(current_buffer, ns_id, comment.line, 0, v_opts)
end
-- FIX: using for ns_id ns_id instead of 0
-- so that when we clear the namespace the color also clear
vim.api.nvim_buf_add_highlight(current_buffer, ns_id, tostring(hl_id), comment.line,
comment.col_start,
comment.finish)
else
-- FIX: added else to delted extmark
-- TODO: THIS PART IS CALLED A LOT FIND A WAY TO NOT CHECK EVERY TIME
if hl.virtual_text ~= "" then
local ns_id = vim.api.nvim_create_namespace(hl.name)
-- FIX: clearing the namespace to delete the extmark and the color
api.nvim_buf_clear_namespace(current_buffer, ns_id, comment.line, comment.line+1)
end
end
end
end
end
})
end
Get_root = function(bufnr, filetype)
local parser = vim.treesitter.get_parser(bufnr, filetype, {})
local tree = parser:parse()[1]
return tree:root()
end
function Create_hl(list)
for id, hl in ipairs(list) do
vim.api.nvim_set_hl(0, tostring(id), {
fg = hl.fg,
bg = hl.bg,
bold = hl.bold,
underline = hl.underline,
})
end
end
return M

View File

@ -0,0 +1,81 @@
return {
'akinsho/bufferline.nvim',
dependencies = {
'moll/vim-bbye',
'nvim-tree/nvim-web-devicons',
},
config = function()
-- vim.opt.linespace = 8
require('bufferline').setup {
options = {
mode = 'buffers', -- set to "tabs" to only show tabpages instead
themable = true, -- allows highlight groups to be overriden i.e. sets highlights as default
numbers = 'none', -- | "ordinal" | "buffer_id" | "both" | function({ ordinal, id, lower, raise }): string,
close_command = 'Bdelete! %d', -- can be a string | function, see "Mouse actions"
right_mouse_command = 'Bdelete! %d', -- can be a string | function, see "Mouse actions"
left_mouse_command = 'buffer %d', -- can be a string | function, see "Mouse actions"
middle_mouse_command = nil, -- can be a string | function, see "Mouse actions"
-- buffer_close_icon = '󰅖',
buffer_close_icon = '',
-- buffer_close_icon = '✕',
close_icon = '',
path_components = 1, -- Show only the file name without the directory
modified_icon = '',
left_trunc_marker = '',
right_trunc_marker = '',
max_name_length = 30,
max_prefix_length = 30, -- prefix used when a buffer is de-duplicated
tab_size = 21,
diagnostics = false,
diagnostics_update_in_insert = false,
color_icons = true,
show_buffer_icons = true,
show_buffer_close_icons = true,
show_close_icon = true,
persist_buffer_sort = true, -- whether or not custom sorted buffers should persist
separator_style = { '', '' }, -- | "thick" | "thin" | { 'any', 'any' },
enforce_regular_tabs = true,
always_show_bufferline = true,
show_tab_indicators = false,
indicator = {
-- icon = '▎', -- this should be omitted if indicator style is not 'icon'
style = 'none', -- Options: 'icon', 'underline', 'none'
},
icon_pinned = '󰐃',
minimum_padding = 1,
maximum_padding = 5,
maximum_length = 15,
sort_by = 'insert_at_end',
},
highlights = {
separator = {
fg = '#434C5E',
},
buffer_selected = {
bold = true,
italic = false,
},
-- separator_selected = {},
-- tab_selected = {},
-- background = {},
-- indicator_selected = {},
-- fill = {},
},
}
-- Keymaps
local opts = { noremap = true, silent = true, desc = 'Go to Buffer' }
-- vim.keymap.set("n", "<Tab>", "<Cmd>BufferLineCycleNext<CR>", {})
-- vim.keymap.set("n", "<S-Tab>", "<Cmd>BufferLineCyclePrev<CR>", {})
-- vim.keymap.set('n', '<leader>1', "<cmd>lua require('bufferline').go_to_buffer(1)<CR>", opts)
-- vim.keymap.set('n', '<leader>2', "<cmd>lua require('bufferline').go_to_buffer(2)<CR>", opts)
-- vim.keymap.set('n', '<leader>3', "<cmd>lua require('bufferline').go_to_buffer(3)<CR>", opts)
-- vim.keymap.set('n', '<leader>4', "<cmd>lua require('bufferline').go_to_buffer(4)<CR>", opts)
-- vim.keymap.set('n', '<leader>5', "<cmd>lua require('bufferline').go_to_buffer(5)<CR>", opts)
-- vim.keymap.set('n', '<leader>6', "<cmd>lua require('bufferline').go_to_buffer(6)<CR>", opts)
-- vim.keymap.set('n', '<leader>7', "<cmd>lua require('bufferline').go_to_buffer(7)<CR>", opts)
-- vim.keymap.set('n', '<leader>8', "<cmd>lua require('bufferline').go_to_buffer(8)<CR>", opts)
-- vim.keymap.set('n', '<leader>9', "<cmd>lua require('bufferline').go_to_buffer(9)<CR>", opts)
end,
}

158
lua/plugins/chatgpt.lua Normal file
View File

@ -0,0 +1,158 @@
return {
'jackMort/ChatGPT.nvim',
event = 'VeryLazy',
config = function()
vim.api.nvim_set_hl(0, 'ChatGPTNormalFloat', { bg = 'NONE', fg = 'NONE' })
vim.api.nvim_set_hl(0, 'ChatGPTFloatBorder', { bg = 'NONE', fg = 'NONE' })
require('chatgpt').setup {
api_key_cmd = nil,
yank_register = '+',
edit_with_instructions = {
diff = false,
keymaps = {
close = '<C-c>',
accept = '<C-y>',
toggle_diff = '<C-d>',
toggle_settings = '<C-o>',
cycle_windows = '<Tab>',
use_output_as_input = '<C-i>',
},
},
chat = {
loading_text = 'Loading, please wait ...',
question_sign = '', -- 🙂
-- answer_sign = '', -- 🤖
answer_sign = '🤖',
max_line_length = 120,
sessions_window = {
border = {
style = 'rounded',
text = {
top = ' Sessions ',
},
},
win_options = {
winhighlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
},
},
},
keymaps = {
close = { '<C-c>' },
yank_last = '<C-y>',
yank_last_code = '<C-k>',
scroll_up = '<C-u>',
scroll_down = '<C-d>',
new_session = '<C-n>',
cycle_windows = '<Tab>',
cycle_modes = '<C-f>',
next_message = '<C-j>',
prev_message = '<C-k>',
select_session = '<Space>',
rename_session = 'r',
delete_session = 'd',
draft_message = '<C-d>',
edit_message = 'e',
delete_message = 'd',
toggle_settings = '<C-o>',
toggle_message_role = '<C-r>',
toggle_system_role_open = '<C-s>',
stop_generating = '<C-x>',
},
popup_layout = {
default = 'center',
center = {
width = '60%',
height = '80%',
},
right = {
width = '30%',
width_settings_open = '50%',
},
},
popup_window = {
border = {
highlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
style = 'rounded',
text = {
top = ' ChatGPT ',
},
},
win_options = {
wrap = true,
linebreak = true,
foldcolumn = '1',
winhighlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
},
buf_options = {
filetype = 'markdown',
},
},
system_window = {
border = {
highlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
style = 'rounded',
text = {
top = ' SYSTEM ',
},
},
win_options = {
wrap = true,
linebreak = true,
foldcolumn = '2',
winhighlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
},
},
popup_input = {
prompt = '',
border = {
highlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
style = 'rounded',
text = {
top_align = 'center',
top = ' Prompt ',
},
},
win_options = {
winhighlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
},
submit = '<C-Enter>',
submit_n = '<Enter>',
max_visible_lines = 20,
},
settings_window = {
border = {
style = 'rounded',
text = {
top = ' Settings ',
},
},
win_options = {
winhighlight = 'Normal:ChatGPTNormalFloat,FloatBorder:ChatGPTFloatBorder',
},
},
-- this config assumes you have OPENAI_API_KEY environment variable set
openai_params = {
model = 'gpt-4o-mini',
frequency_penalty = 0,
presence_penalty = 0,
max_tokens = 4095,
temperature = 0.2,
top_p = 0.1,
n = 1,
},
openai_edit_params = {
model = 'gpt-3.5-turbo',
frequency_penalty = 0,
presence_penalty = 0,
temperature = 0,
top_p = 1,
n = 1,
},
}
end,
dependencies = {
'MunifTanjim/nui.nvim',
'nvim-lua/plenary.nvim',
'nvim-telescope/telescope.nvim',
},
}

67
lua/plugins/comment.lua Normal file
View File

@ -0,0 +1,67 @@
return {
{
"folke/ts-comments.nvim",
opts = {
lang = {
astro = "<!-- %s -->",
axaml = "<!-- %s -->",
blueprint = "// %s",
c = "// %s",
c_sharp = "// %s",
clojure = { ";; %s", "; %s" },
cpp = "// %s",
cs_project = "<!-- %s -->",
css = "/* %s */",
cue = "// %s",
fsharp = "// %s",
fsharp_project = "<!-- %s -->",
gleam = "// %s",
glimmer = "{{! %s }}",
handlebars = "{{! %s }}",
hcl = "# %s",
html = "<!-- %s -->",
ini = "; %s",
javascript = {
"// %s", -- default commentstring when no treesitter node matches
"/* %s */",
call_expression = "// %s", -- specific commentstring for call_expression
jsx_attribute = "// %s",
jsx_element = "{/* %s */}",
jsx_fragment = "{/* %s */}",
spread_element = "// %s",
statement_block = "// %s",
},
kdl = "// %s",
lua = { "-- %s", "--- %s" }, -- langs can have multiple commentstrings
ocaml = "(* %s *)",
php = "// %s",
rego = "# %s",
rescript = "// %s",
rust = { "// %s", "/* %s */", "/// %s" },
sql = "-- %s",
svelte = "<!-- %s -->",
templ = "// %s",
terraform = "# %s",
tsx = {
"// %s", -- default commentstring when no treesitter node matches
"/* %s */",
call_expression = "// %s", -- specific commentstring for call_expression
jsx_attribute = "// %s",
jsx_element = "{/* %s */}",
jsx_fragment = "{/* %s */}",
spread_element = "// %s",
statement_block = "// %s",
},
twig = "{# %s #}",
typescript = "// %s",
vim = '" %s',
vue = "<!-- %s -->",
xaml = "<!-- %s -->",
xml = "<!-- %s -->",
},
},
event = "VeryLazy",
enabled = vim.fn.has("nvim-0.10.0") == 1,
},
}

17
lua/plugins/conform.lua Normal file
View File

@ -0,0 +1,17 @@
return {
{
"stevearc/conform.nvim",
config = function()
require("conform").setup({
formatters_by_ft = {
templ = { "templ", "prettier" }, -- Use templ first, then Prettier for embedded content
},
format_on_save = {
timeout_ms = 500,
lsp_fallback = true,
},
})
end,
event = { "BufReadPre", "BufNewFile" }, -- Load only when opening a file
}
}

50
lua/plugins/database.lua Normal file
View File

@ -0,0 +1,50 @@
return {
--use nvim in browser
{ 'kristijanhusak/vim-dadbod-ui' },
{ 'kristijanhusak/vim-dadbod-completion' },
-- Database
{
'tpope/vim-dadbod',
-- lazy = true,
dependencies = {
'kristijanhusak/vim-dadbod-ui',
'kristijanhusak/vim-dadbod-completion',
},
-- event = 'VeryLazy',
config = function()
vim.g.db_ui_execute_on_save = 0 --do not execute on save
vim.g.db_ui_win_position = 'left'
vim.g.db_ui_use_nerd_fonts = 1
vim.g.db_ui_icons = {
expanded = {
db = '',
buffers = '',
saved_queries = '',
schemas = '',
schema = '',
tables = '',
table = '',
},
collapsed = {
db = '',
buffers = '',
saved_queries = '',
schemas = '',
schema = '',
tables = '',
table = '',
},
saved_query = '*',
new_query = '+',
tables = '~',
buffers = '»',
add_connection = '[+]',
connection_ok = '',
connection_error = '',
}
end,
},
}
-- {'add_connection': '[+]', 'expanded': {'schemas': '▾', 'saved_queries': '▾', 'db': '▾', 'schema': '▾', 'table': '▾', 'buffers': '▾', 'tables': '▾'}, 'connection_ok': '✓', 'connection_error': '✕', 'tables': '~', '
-- collapsed': {'schemas': '▸', 'saved_queries': '▸', 'db': '▸', 'schema': '▸', 'table': '▸', 'buffers': '▸', 'tables': '▸'}, 'saved_query': '*', 'buffers': '»', 'new_query': '+'}

82
lua/plugins/debug.lua Normal file
View File

@ -0,0 +1,82 @@
return {
'mfussenegger/nvim-dap',
dependencies = {
-- Creates a beautiful debugger UI
'rcarriga/nvim-dap-ui',
'nvim-neotest/nvim-nio',
-- Installs the debug adapters for you
'williamboman/mason.nvim',
'jay-babu/mason-nvim-dap.nvim',
-- Add your own debuggers here
'leoluz/nvim-dap-go',
'mfussenegger/nvim-dap-python',
},
config = function()
local dap = require 'dap'
local dapui = require 'dapui'
require('mason-nvim-dap').setup {
-- Makes a best effort to setup the various debuggers with
-- reasonable debug configurations
automatic_setup = true,
automatic_installation = true,
-- You can provide additional configuration to the handlers,
-- see mason-nvim-dap README for more information
handlers = {},
-- You'll need to check that you have the required things installed
-- online, please don't ask me how to install them :)
ensure_installed = {
-- Update this to ensure that you have the debuggers for the langs you want
-- 'delve',
'debugpy',
},
}
-- Basic debugging keymaps, feel free to change to your liking!
vim.keymap.set('n', '<F5>', dap.continue, { desc = 'Debug: Start/Continue' })
vim.keymap.set('n', '<F1>', dap.step_into, { desc = 'Debug: Step Into' })
vim.keymap.set('n', '<F2>', dap.step_over, { desc = 'Debug: Step Over' })
vim.keymap.set('n', '<F3>', dap.step_out, { desc = 'Debug: Step Out' })
vim.keymap.set('n', '<leader>b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
vim.keymap.set('n', '<leader>B', function()
dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
end, { desc = 'Debug: Set Breakpoint' })
-- Dap UI setup
-- For more information, see |:help nvim-dap-ui|
dapui.setup {
-- Set icons to characters that are more likely to work in every terminal.
-- Feel free to remove or use ones that you like more! :)
-- Don't feel like these are good choices.
icons = { expanded = '', collapsed = '', current_frame = '*' },
controls = {
icons = {
pause = '',
play = '',
step_into = '',
step_over = '',
step_out = '',
step_back = 'b',
run_last = '▶▶',
terminate = '',
disconnect = '',
},
},
}
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
vim.keymap.set('n', '<F7>', dapui.toggle, { desc = 'Debug: See last session result.' })
dap.listeners.after.event_initialized['dapui_config'] = dapui.open
dap.listeners.before.event_terminated['dapui_config'] = dapui.close
dap.listeners.before.event_exited['dapui_config'] = dapui.close
-- Install golang specific config
-- require('dap-go').setup()
require('dap-python').setup()
end,
}

16
lua/plugins/flash.lua Normal file
View File

@ -0,0 +1,16 @@
return {
{
"folke/flash.nvim",
event = "VeryLazy",
---@type Flash.Config
opts = {},
-- stylua: ignore
keys = {
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
{ "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
{ "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" },
{ "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" },
{ "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" },
},
}
}

21
lua/plugins/gitsigns.lua Normal file
View File

@ -0,0 +1,21 @@
-- Adds git related signs to the gutter, as well as utilities for managing changes
return {
'lewis6991/gitsigns.nvim',
opts = {
-- See `:help gitsigns.txt`
signs = {
add = { text = '+' },
change = { text = '~' },
delete = { text = '_' },
topdelete = { text = '' },
changedelete = { text = '~' },
},
signs_staged = {
add = { text = '+' },
change = { text = '~' },
delete = { text = '_' },
topdelete = { text = '' },
changedelete = { text = '~' },
},
},
}

43
lua/plugins/harpoon.lua Normal file
View File

@ -0,0 +1,43 @@
return {
'ThePrimeagen/harpoon',
branch = 'harpoon2',
dependencies = { 'nvim-lua/plenary.nvim' },
config = function()
local harpoon = require 'harpoon'
harpoon:setup {}
-- Default UI
vim.keymap.set('n', '<leader>H', function()
harpoon.ui:toggle_quick_menu(harpoon:list())
end)
vim.keymap.set('n', '<leader>h', function()
harpoon:list():add()
end)
vim.keymap.set('n', '<leader>1', function()
harpoon:list():select(1)
end)
vim.keymap.set('n', '<leader>2', function()
harpoon:list():select(2)
end)
vim.keymap.set('n', '<leader>3', function()
harpoon:list():select(3)
end)
vim.keymap.set('n', '<leader>4', function()
harpoon:list():select(4)
end)
-- Toggle previous & next buffers stored within Harpoon list
vim.keymap.set('n', '<leader>p', function()
harpoon:list():prev()
end)
vim.keymap.set('n', '<leader>n', function()
harpoon:list():next()
end)
end,
}

View File

@ -0,0 +1,25 @@
return {
'lukas-reineke/indent-blankline.nvim',
main = 'ibl',
opts = {
indent = {
char = '',
},
scope = {
show_start = false,
show_end = false,
show_exact_scope = false,
},
exclude = {
filetypes = {
'help',
'startify',
'dashboard',
'packer',
'neogitstatus',
'NvimTree',
'Trouble',
},
},
},
}

29
lua/plugins/lazygit.lua Normal file
View File

@ -0,0 +1,29 @@
return {
'kdheepak/lazygit.nvim',
cmd = {
'LazyGit',
'LazyGitConfig',
'LazyGitCurrentFile',
'LazyGitFilter',
'LazyGitFilterCurrentFile',
},
-- optional for floating window border decoration
dependencies = {
'nvim-lua/plenary.nvim',
},
-- setting the keybinding for LazyGit with 'keys' is recommended in
-- order to load the plugin when the command is run for the first time
keys = {
-- Run LazyGit command and set background to transparent
{ '<leader>gg', '<cmd>LazyGit<cr><cmd>hi LazyGitFloat guibg=NONE guifg=NONE<cr><cmd>setlocal winhl=NormalFloat:LazyGitFloat<cr>', desc = 'LazyGit' },
},
config = function()
vim.g.lazygit_floating_window_winblend = 0 -- transparency of floating window (0-100)
vim.g.lazygit_floating_window_scaling_factor = 0.9 -- scaling factor for floating window
vim.g.lazygit_floating_window_border_chars = { '', '', '', '', '', '', '', '' } -- customize lazygit popup window border characters
vim.g.lazygit_floating_window_use_plenary = 0 -- use plenary.nvim to manage floating window if available
vim.g.lazygit_use_neovim_remote = 1 -- fallback to 0 if neovim-remote is not installed
vim.g.lazygit_use_custom_config_file_path = 0 -- config file path is evaluated if this value is 1
vim.g.lazygit_config_file_path = {} -- table of custom config file paths
end,
}

209
lua/plugins/lsp-keymaps.lua Normal file
View File

@ -0,0 +1,209 @@
local M = {}
M._keys = nil
---@return table
function M.get()
if M._keys then
return M._keys
end
-- Standard LSP Keybindings (No LazyVim)
M._keys = {
{ '<leader>cl', '<cmd>LspInfo<cr>', desc = 'LSP Info' },
{ 'gd', vim.lsp.buf.definition, desc = 'Go to Definition' },
{ 'gr', vim.lsp.buf.references, desc = 'References' },
{ 'gI', vim.lsp.buf.implementation, desc = 'Go to Implementation' },
{ 'gy', vim.lsp.buf.type_definition, desc = 'Go to Type Definition' },
{ 'gD', vim.lsp.buf.declaration, desc = 'Go to Declaration' },
{ 'K', vim.lsp.buf.hover, desc = 'Hover' },
{ 'gK', vim.lsp.buf.signature_help, desc = 'Signature Help' },
{ '<C-k>', vim.lsp.buf.signature_help, mode = 'i', desc = 'Signature Help' },
{ '<leader>ca', vim.lsp.buf.code_action, desc = 'Code Action', mode = { 'n', 'v' } },
{ '<leader>cr', vim.lsp.buf.rename, desc = 'Rename' },
{
'<leader>cR',
function()
if require 'snacks.rename' then
require('snacks.rename').rename_file()
else
print 'Snacks rename not available'
end
end,
desc = 'Rename File',
mode = { 'n' },
has = { 'workspace/didRenameFiles', 'workspace/willRenameFiles' },
},
{ '<leader>cr', vim.lsp.buf.rename, desc = 'Rename', has = 'rename' },
}
return M._keys
end
---@param buffer number
function M.on_attach(_, buffer)
for _, key in pairs(M.get()) do
vim.keymap.set(key.mode or 'n', key[1], key[2], { buffer = buffer, desc = key.desc, silent = true })
end
end
return M
-- local M = {}
--
-- ---@type LazyKeysLspSpec[]|nil
-- M._keys = nil
--
-- ---@alias LazyKeysLspSpec LazyKeysSpec|{has?:string|string[], cond?:fun():boolean}
-- ---@alias LazyKeysLsp LazyKeys|{has?:string|string[], cond?:fun():boolean}
--
-- ---@return LazyKeysLspSpec[]
-- function M.get()
-- if M._keys then
-- return M._keys
-- end
-- -- stylua: ignore
-- M._keys = {
-- { "<leader>cl", "<cmd>LspInfo<cr>", desc = "LSP Info" },
-- { "gd", vim.lsp.buf.definition, desc = "Go to Definition", has = "definition" },
-- { "gr", vim.lsp.buf.references, desc = "References", nowait = true },
-- { "gI", vim.lsp.buf.implementation, desc = "Go to Implementation" },
-- { "gy", vim.lsp.buf.type_definition, desc = "Go to Type Definition" },
-- { "gD", vim.lsp.buf.declaration, desc = "Go to Declaration" },
-- { "K", function() return vim.lsp.buf.hover() end, desc = "Hover" },
-- { "gK", function() return vim.lsp.buf.signature_help() end, desc = "Signature Help", has = "signatureHelp" },
-- { "<C-k>", function() return vim.lsp.buf.signature_help() end, mode = "i", desc = "Signature Help", has = "signatureHelp" },
-- { "<leader>ca", vim.lsp.buf.code_action, desc = "Code Action", mode = { "n", "v" }, has = "codeAction" },
-- { "<leader>cc", vim.lsp.codelens.run, desc = "Run CodeLens", mode = { "n", "v" }, has = "codeLens" },
-- { "<leader>cC", vim.lsp.codelens.refresh, desc = "Refresh & Display CodeLens", mode = { "n" }, has = "codeLens" },
-- {
-- "<leader>cR",
-- function()
-- if require("snacks.rename") then
-- require("snacks.rename").rename_file()
-- else
-- print("Snacks rename not available")
-- end
-- end,
-- desc = "Rename File",
-- mode = { "n" },
-- has = { "workspace/didRenameFiles", "workspace/willRenameFiles" }
-- },
-- { "<leader>cr", vim.lsp.buf.rename, desc = "Rename", has = "rename" },
-- {
-- "<leader>cA",
-- function()
-- if require("lazyvim.lsp.action") then
-- require("lazyvim.lsp.action").source()
-- else
-- print("LazyVim LSP action not available")
-- end
-- end,
-- desc = "Source Action",
-- has = "codeAction"
-- },
-- {
-- "]]",
-- function()
-- if require("snacks.words") then
-- require("snacks.words").jump(vim.v.count1)
-- end
-- end,
-- has = "documentHighlight",
-- desc = "Next Reference",
-- cond = function() return require("snacks.words").is_enabled() end
-- },
-- {
-- "[[",
-- function()
-- if require("snacks.words") then
-- require("snacks.words").jump(-vim.v.count1)
-- end
-- end,
-- has = "documentHighlight",
-- desc = "Previous Reference",
-- cond = function() return require("snacks.words").is_enabled() end
-- },
-- {
-- "<A-n>",
-- function()
-- if require("snacks.words") then
-- require("snacks.words").jump(vim.v.count1, true)
-- end
-- end,
-- has = "documentHighlight",
-- desc = "Next Reference",
-- cond = function() return require("snacks.words").is_enabled() end
-- },
-- {
-- "<A-p>",
-- function()
-- if require("snacks.words") then
-- require("snacks.words").jump(-vim.v.count1, true)
-- end
-- end,
-- has = "documentHighlight",
-- desc = "Previous Reference",
-- cond = function() return require("snacks.words").is_enabled() end
-- },
-- }
--
-- return M._keys
-- end
--
-- ---@param buffer number
-- ---@param method string|string[]
-- function M.has(buffer, method)
-- if type(method) == 'table' then
-- for _, m in ipairs(method) do
-- if M.has(buffer, m) then
-- return true
-- end
-- end
-- return false
-- end
-- method = method:find '/' and method or 'textDocument/' .. method
-- local clients = vim.lsp.get_active_clients { bufnr = buffer }
-- for _, client in ipairs(clients) do
-- if client.supports_method(method) then
-- return true
-- end
-- end
-- return false
-- end
--
-- ---@return LazyKeysLsp[]
-- function M.resolve(buffer)
-- local Keys = require 'lazy.core.handler.keys'
-- if not Keys.resolve then
-- return {}
-- end
-- local spec = vim.tbl_extend('force', {}, M.get())
-- local opts = require 'nvim-lspconfig'
-- local clients = vim.lsp.get_active_clients { bufnr = buffer }
-- for _, client in ipairs(clients) do
-- local maps = opts.servers and opts.servers[client.name] and opts.servers[client.name].keys or {}
-- vim.list_extend(spec, maps)
-- end
-- return Keys.resolve(spec)
-- end
--
-- function M.on_attach(_, buffer)
-- local Keys = require 'lazy.core.handler.keys'
-- local keymaps = M.resolve(buffer)
--
-- for _, keys in pairs(keymaps) do
-- local has = not keys.has or M.has(buffer, keys.has)
-- local cond = not (keys.cond == false or ((type(keys.cond) == 'function') and not keys.cond()))
--
-- if has and cond then
-- local opts = Keys.opts(keys)
-- opts.cond = nil
-- opts.has = nil
-- opts.silent = opts.silent ~= false
-- opts.buffer = buffer
-- vim.keymap.set(keys.mode or 'n', keys.lhs, keys.rhs, opts)
-- end
-- end
-- end
--
-- return M

170
lua/plugins/lsp.lua Normal file
View File

@ -0,0 +1,170 @@
return {
'neovim/nvim-lspconfig',
dependencies = {
'williamboman/mason.nvim',
'williamboman/mason-lspconfig.nvim',
'WhoIsSethDaniel/mason-tool-installer.nvim',
{
'j-hui/fidget.nvim',
tag = 'v1.4.0',
opts = {
progress = {
display = { done_icon = '' },
},
notification = {
window = { winblend = 0 },
},
},
},
{
'glepnir/lspsaga.nvim',
event = 'LspAttach',
config = function()
require('lspsaga').setup {
ui = { border = 'rounded', title = true },
hover = { max_width = 0.6 },
rename = { in_select = false },
}
end,
},
},
config = function()
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('lsp-attach', { clear = true }),
callback = function(event)
local map = function(keys, func, desc)
vim.keymap.set('n', keys, func, { buffer = event.buf, desc = 'LSP: ' .. desc })
end
local telescope_ok, telescope = pcall(require, 'telescope.builtin')
if not telescope_ok then return end
map('gd', telescope.lsp_definitions, 'Go to Definition')
map('gr', telescope.lsp_references, 'Go to References')
map('gI', telescope.lsp_implementations, 'Go to Implementation')
map('<leader>D', telescope.lsp_type_definitions, 'Type Definition')
map('<leader>ds', telescope.lsp_document_symbols, 'Document Symbols')
map('<leader>ws', telescope.lsp_dynamic_workspace_symbols, 'Workspace Symbols')
map('<leader>rn', vim.lsp.buf.rename, 'Rename')
map('<leader>ca', vim.lsp.buf.code_action, 'Code Action')
map('gD', vim.lsp.buf.declaration, 'Go to Declaration')
map('<S-K>', function()
local lspsaga_hover_ok, lspsaga_hover = pcall(require, 'lspsaga.hover')
if lspsaga_hover_ok then
lspsaga_hover:render_hover_doc()
else
vim.lsp.buf.hover()
end
end, 'Show Hover')
local client = vim.lsp.get_client_by_id(event.data.client_id)
if client and client.server_capabilities.documentHighlightProvider then
vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, {
buffer = event.buf,
callback = vim.lsp.buf.document_highlight,
})
vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, {
buffer = event.buf,
callback = vim.lsp.buf.clear_references,
})
end
end,
})
-- LSP Server Configurations
local servers = {
gopls = {
settings = {
gopls = {
experimentalPostfixCompletions = true,
gofumpt = true,
staticcheck = true,
analyses = { unusedparams = true },
directoryFilters = { '-node_modules' },
templ = {
format = true,
lint = true,
},
},
},
filetypes = { 'go', 'templ' },
},
-- tsserver = { settings = { completions = { completeFunctionCalls = true }, }, filetypes = { 'typescript', 'typescriptreact', 'typescript.tsx', 'javascript' }, root_dir = require('lspconfig.util').root_pattern('package.json', 'tsconfig.json', '.git'), },
eslint = {},
html = { filetypes = { 'html', 'twig', 'hbs' } }, -- Removed 'templ' from here
templ = {
cmd = { vim.fn.stdpath("data") .. "/mason/bin/templ", "lsp" },
filetypes = { "templ" },
root_dir = require("lspconfig").util.root_pattern("go.mod", ".git"),
},
lua_ls = {
settings = {
Lua = {
runtime = { version = 'LuaJIT' },
workspace = {
checkThirdParty = false,
library = {
'${3rd}/luv/library',
unpack(vim.api.nvim_get_runtime_file('', true)),
},
},
completion = { callSnippet = 'Replace' },
telemetry = { enable = false },
diagnostics = { disable = { 'missing-fields' } },
},
},
},
dockerls = {},
docker_compose_language_service = {},
rust_analyzer = {
['rust-analyzer'] = {
cargo = { features = 'all' },
checkOnSave = true,
check = { command = 'clippy' },
},
},
tailwindcss = {},
jsonls = {},
yamlls = {},
bashls = {},
graphql = {},
cssls = {},
}
-- Enable LSP Features
require('mason').setup()
local ensure_installed = vim.tbl_keys(servers)
vim.list_extend(ensure_installed, { 'templ', 'typescript-language-server' })
require('mason-tool-installer').setup { ensure_installed = ensure_installed }
require('mason-lspconfig').setup {
handlers = {
function(server_name)
local server = servers[server_name] or {}
server.capabilities = vim.tbl_deep_extend(
'force',
{},
vim.lsp.protocol.make_client_capabilities(),
require('cmp_nvim_lsp').default_capabilities(),
server.capabilities or {}
)
require('lspconfig')[server_name].setup(server)
end,
},
}
-- Auto-format and organize imports on save for Go
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*.go",
callback = function()
vim.lsp.buf.format({ async = false }) -- Format
vim.lsp.buf.code_action({
context = { only = { "source.organizeImports" } },
apply = true,
}) -- Organize imports
end,
})
end,
}

116
lua/plugins/lualine.lua Normal file
View File

@ -0,0 +1,116 @@
-- Set lualine as statusline
return {
'nvim-lualine/lualine.nvim',
config = function()
-- Adapted from: https://github.com/nvim-lualine/lualine.nvim/blob/master/lua/lualine/themes/onedark.lua
local colors = {
blue = '#61afef',
green = '#98c379',
purple = '#c678dd',
cyan = '#56b6c2',
red1 = '#e06c75',
red2 = '#be5046',
yellow = '#e5c07b',
fg = '#abb2bf',
bg = '#282c34',
gray1 = '#828997',
gray2 = '#2c323c',
gray3 = '#3e4452',
}
local onedark_theme = {
normal = {
a = { fg = colors.bg, bg = colors.green, gui = 'bold' },
b = { fg = colors.fg, bg = colors.gray3 },
c = { fg = colors.fg, bg = colors.gray2 },
},
command = { a = { fg = colors.bg, bg = colors.yellow, gui = 'bold' } },
insert = { a = { fg = colors.bg, bg = colors.blue, gui = 'bold' } },
visual = { a = { fg = colors.bg, bg = colors.purple, gui = 'bold' } },
terminal = { a = { fg = colors.bg, bg = colors.cyan, gui = 'bold' } },
replace = { a = { fg = colors.bg, bg = colors.red1, gui = 'bold' } },
inactive = {
a = { fg = colors.gray1, bg = colors.bg, gui = 'bold' },
b = { fg = colors.gray1, bg = colors.bg },
c = { fg = colors.gray1, bg = colors.gray2 },
},
}
-- Import color theme based on environment variable NVIM_THEME
local env_var_nvim_theme = os.getenv 'NVIM_THEME' or 'nord'
-- Define a table of themes
local themes = {
onedark = onedark_theme,
nord = 'nord',
}
local mode = {
'mode',
fmt = function(str)
-- return ' ' .. str:sub(1, 1) -- displays only the first character of the mode
return '' .. str
end,
}
local filename = {
'filename',
file_status = true, -- displays file status (readonly status, modified status)
path = 0, -- 0 = just filename, 1 = relative path, 2 = absolute path
}
local hide_in_width = function()
return vim.fn.winwidth(0) > 100
end
local diagnostics = {
'diagnostics',
sources = { 'nvim_diagnostic' },
sections = { 'error', 'warn' },
symbols = { error = '', warn = '', info = '', hint = '' },
colored = false,
update_in_insert = false,
always_visible = false,
cond = hide_in_width,
}
local diff = {
'diff',
colored = false,
symbols = { added = '', modified = '', removed = '' }, -- changes diff symbols
cond = hide_in_width,
}
require('lualine').setup {
options = {
icons_enabled = true,
theme = themes[env_var_nvim_theme], -- Set theme based on environment variable
-- Some useful glyphs:
-- https://www.nerdfonts.com/cheat-sheet
--        
section_separators = { left = '', right = '' },
component_separators = { left = '', right = '' },
disabled_filetypes = { 'alpha', 'neo-tree', 'Avante' },
always_divide_middle = true,
},
sections = {
lualine_a = { mode },
lualine_b = { 'branch' },
lualine_c = { filename },
lualine_x = { diagnostics, diff, { 'encoding', cond = hide_in_width }, { 'filetype', cond = hide_in_width } },
lualine_y = { 'location' },
lualine_z = { 'progress' },
},
inactive_sections = {
lualine_a = {},
lualine_b = {},
lualine_c = { { 'filename', path = 1 } },
lualine_x = { { 'location', padding = 0 } },
lualine_y = {},
lualine_z = {},
},
tabline = {},
extensions = { 'fugitive' },
}
end,
}

58
lua/plugins/misc.lua Normal file
View File

@ -0,0 +1,58 @@
-- Standalone plugins with less than 10 lines of config go here
return {
{
-- autoclose tags
'windwp/nvim-ts-autotag',
},
{
-- detect tabstop and shiftwidth automatically
'tpope/vim-sleuth',
},
{
-- Powerful Git integration for Vim
'tpope/vim-fugitive',
},
{
-- GitHub integration for vim-fugitive
'tpope/vim-rhubarb',
},
{
-- Hints keybinds
'folke/which-key.nvim',
opts = {
-- win = {
-- border = {
-- { '┌', 'FloatBorder' },
-- { '─', 'FloatBorder' },
-- { '┐', 'FloatBorder' },
-- { '│', 'FloatBorder' },
-- { '┘', 'FloatBorder' },
-- { '─', 'FloatBorder' },
-- { '└', 'FloatBorder' },
-- { '│', 'FloatBorder' },
-- },
-- },
},
},
{
-- Autoclose parentheses, brackets, quotes, etc.
'windwp/nvim-autopairs',
event = 'InsertEnter',
config = true,
opts = {},
},
{
-- Highlight todo, notes, etc in comments
'folke/todo-comments.nvim',
event = 'VimEnter',
dependencies = { 'nvim-lua/plenary.nvim' },
opts = { signs = false },
},
{
-- high-performance color highlighter
'norcalli/nvim-colorizer.lua',
config = function()
require('colorizer').setup()
end,
},
}

37
lua/plugins/neo-tree.lua Normal file
View File

@ -0,0 +1,37 @@
return {
{
'nvim-neo-tree/neo-tree.nvim',
opts = {
window = {
position = 'right', -- Ensure Neo-Tree opens on the right
},
filesystem = {
follow_current_file = true, -- Automatically reveal the current file
use_libuv_file_watcher = true, -- Auto-refresh when files change
filtered_items = {
visible = true,
show_hidden_count = true,
hide_dotfiles = false,
},
},
},
keys = {
{
'<leader>fe',
function()
vim.cmd 'Neotree toggle right' -- Open Neo-Tree on the right side
end,
desc = 'Toggle Neo-Tree (Right Side)',
},
{
'<leader>fE',
function()
vim.cmd 'Neotree focus' -- Focus on the Neo-Tree window
end,
desc = 'Focus Neo-Tree',
},
{ '<leader>e', '<leader>fe', desc = 'Toggle Neo-Tree', remap = true },
{ '<leader>E', '<leader>fE', desc = 'Focus Neo-Tree', remap = true },
},
},
}

55
lua/plugins/none-ls.lua Normal file
View File

@ -0,0 +1,55 @@
-- Format on save and linters
return {
'nvimtools/none-ls.nvim',
dependencies = {
'nvimtools/none-ls-extras.nvim',
'jayp0521/mason-null-ls.nvim', -- ensure dependencies are installed
},
config = function()
local null_ls = require 'null-ls'
local formatting = null_ls.builtins.formatting -- to setup formatters
local diagnostics = null_ls.builtins.diagnostics -- to setup linters
-- list of formatters & linters for mason to install
require('mason-null-ls').setup {
ensure_installed = {
'checkmake',
'prettier', -- ts/js formatter
'stylua', -- lua formatter
'eslint_d', -- ts/js linter
'shfmt',
'ruff',
},
-- auto-install configured formatters & linters (with null-ls)
automatic_installation = true,
}
local sources = {
diagnostics.checkmake,
formatting.prettier.with { filetypes = { 'html', 'json', 'yaml', 'markdown' } },
formatting.stylua,
formatting.shfmt.with { args = { '-i', '4' } },
require('none-ls.formatting.ruff').with { extra_args = { '--extend-select', 'I' } },
require 'none-ls.formatting.ruff_format',
}
local augroup = vim.api.nvim_create_augroup('LspFormatting', {})
null_ls.setup {
-- debug = true, -- Enable debug mode. Inspect logs with :NullLsLog.
sources = sources,
-- you can reuse a shared lspconfig on_attach callback here
on_attach = function(client, bufnr)
if client.supports_method 'textDocument/formatting' then
vim.api.nvim_clear_autocmds { group = augroup, buffer = bufnr }
vim.api.nvim_create_autocmd('BufWritePre', {
group = augroup,
buffer = bufnr,
callback = function()
vim.lsp.buf.format { async = false }
end,
})
end
end,
}
end,
}

32
lua/plugins/snack.lua Normal file
View File

@ -0,0 +1,32 @@
return {
{
'folke/snacks.nvim',
priority = 1000,
lazy = false,
---@type snacks.Config
opts = {
bigfile = { enabled = true },
explorer = { enabled = true },
indent = { enabled = true },
input = { enabled = true },
picker = { enabled = true },
notifier = { enabled = true },
quickfile = { enabled = true },
scope = { enabled = true },
-- scroll = { enabled = true },
statuscolumn = { enabled = true },
words = { enabled = true },
image = {
enabled = true, -- force enable even if terminal isn't fully supported
backend = "magick", -- fallback backend for images
diagnostics = true, -- keep this on so you can see setup issues
auto_preview = false, -- if you dont want inline previews on hover
view = "image", -- can be "image", "ascii", or "none"
max_height = 30, -- in rows
max_width = 50, -- in columns
use_dither = false, -- optional: enable dithered rendering
},
},
},
}

118
lua/plugins/telescope.lua Normal file
View File

@ -0,0 +1,118 @@
-- Fuzzy Finder (files, lsp, etc)
return {
'nvim-telescope/telescope.nvim',
branch = '0.1.x',
dependencies = {
'nvim-lua/plenary.nvim',
-- Fuzzy Finder Algorithm which requires local dependencies to be built.
-- Only load if `make` is available. Make sure you have the system
-- requirements installed.
{
'nvim-telescope/telescope-fzf-native.nvim',
build = 'make',
cond = function()
return vim.fn.executable 'make' == 1
end,
},
'nvim-telescope/telescope-ui-select.nvim',
-- Useful for getting pretty icons, but requires a Nerd Font.
'nvim-tree/nvim-web-devicons',
},
config = function()
local telescope = require 'telescope'
local actions = require 'telescope.actions'
local builtin = require 'telescope.builtin'
require('telescope').setup {
defaults = {
mappings = {
i = {
['<C-k>'] = actions.move_selection_previous, -- move to prev result
['<C-j>'] = actions.move_selection_next, -- move to next result
['<C-l>'] = actions.select_default, -- open file
},
n = {
['q'] = actions.close,
},
},
},
pickers = {
find_files = {
file_ignore_patterns = { 'node_modules', '.git', '.venv', 'query.sql.go', '*_templ.go' },
hidden = true,
},
buffers = {
initial_mode = 'normal',
sort_lastused = true,
-- sort_mru = true,
mappings = {
n = {
['d'] = actions.delete_buffer,
['l'] = actions.select_default,
},
},
},
},
live_grep = {
file_ignore_patterns = { 'node_modules', '.git', '.venv' },
additional_args = function(_)
return { '--hidden' }
end,
},
path_display = {
filename_first = {
reverse_directories = true,
},
},
extensions = {
['ui-select'] = {
require('telescope.themes').get_dropdown(),
},
},
git_files = {
previewer = false,
},
}
-- Enable telescope fzf native, if installed
pcall(require('telescope').load_extension, 'fzf')
pcall(require('telescope').load_extension, 'ui-select')
vim.keymap.set('n', '<leader>?', builtin.oldfiles, { desc = '[?] Find recently opened files' })
vim.keymap.set('n', '<leader>sb', builtin.buffers, { desc = '[S]earch existing [B]uffers' })
vim.keymap.set('n', '<leader>sm', builtin.marks, { desc = '[S]earch [M]arks' })
vim.keymap.set('n', '<leader>gf', builtin.git_files, { desc = 'Search [G]it [F]iles' })
vim.keymap.set('n', '<leader>gc', builtin.git_commits, { desc = 'Search [G]it [C]ommits' })
vim.keymap.set('n', '<leader>gcf', builtin.git_bcommits, { desc = 'Search [G]it [C]ommits for current [F]ile' })
vim.keymap.set('n', '<leader>gb', builtin.git_branches, { desc = 'Search [G]it [B]ranches' })
vim.keymap.set('n', '<leader>gs', builtin.git_status, { desc = 'Search [G]it [S]tatus (diff view)' })
vim.keymap.set('n', '<leader>sf', builtin.find_files, { desc = '[S]earch [F]iles' })
vim.keymap.set('n', '<leader>sh', builtin.help_tags, { desc = '[S]earch [H]elp' })
vim.keymap.set('n', '<leader>sw', builtin.grep_string, { desc = '[S]earch current [W]ord' })
vim.keymap.set('n', '<leader>sg', builtin.live_grep, { desc = '[S]earch by [G]rep' })
vim.keymap.set('n', '<leader>sd', builtin.diagnostics, { desc = '[S]earch [D]iagnostics' })
vim.keymap.set('n', '<leader>sr', builtin.resume, { desc = '[S]earch [R]resume' })
vim.keymap.set('n', '<leader>s.', builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
vim.keymap.set('n', '<leader><leader>', require('telescope.builtin').find_files, { desc = '[ ] Search Files' })
vim.keymap.set('n', '<leader>sds', function()
builtin.lsp_document_symbols {
symbols = { 'Class', 'Function', 'Method', 'Constructor', 'Interface', 'Module', 'Property' },
}
end, { desc = '[S]each LSP document [S]ymbols' })
-- vim.keymap.set('n', '<leader><leader>', builtin.buffers, { desc = '[ ] Find existing buffers' })
vim.keymap.set('n', '<leader>s/', function()
builtin.live_grep {
grep_open_files = true,
prompt_title = 'Live Grep in Open Files',
}
end, { desc = '[S]earch [/] in Open Files' })
vim.keymap.set('n', '<leader>/', function()
-- You can pass additional configuration to telescope to change theme, layout, etc.
builtin.current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
previewer = false,
})
end, { desc = '[/] Fuzzily search in current buffer' })
end,
}

View File

@ -0,0 +1,3 @@
return {
{ 'AvidDabbler/quantum.vim' },
}

View File

@ -0,0 +1,101 @@
return {
'navarasu/onedark.nvim',
commit = 'dd640f6',
priority = 1000,
config = function()
-- vim.cmd.colorscheme 'onedark'
local config = {
-- Main options --
style = 'dark', -- Default theme style. Choose between 'dark', 'darker', 'cool', 'deep', 'warm', 'warmer' and 'light'
transparent = true, -- Show/hide background
term_colors = true, -- Change terminal color as per the selected theme style
ending_tildes = false, -- Show the end-of-buffer tildes. By default they are hidden
cmp_itemkind_reverse = false, -- reverse item kind highlights in cmp menu
-- toggle theme style ---
toggle_style_key = '<leader>th', -- keybind to toggle theme style. Leave it nil to disable it, or set it to a string, for example "<leader>ts"
toggle_style_list = { 'dark', 'darker', 'cool', 'deep', 'warm', 'warmer', 'light' }, -- List of styles to toggle between
-- Change code style ---
-- Options are italic, bold, underline, none
-- You can configure multiple style with comma separated, For e.g., keywords = 'italic,bold'
code_style = {
comments = 'italic',
keywords = 'none',
functions = 'none',
strings = 'none',
variables = 'none',
},
-- Lualine options --
lualine = {
transparent = false, -- lualine center bar transparency
},
-- Custom Highlights --
colors = {
-- purple = '#56b6c2',
}, -- Override default colors
highlights = {}, -- Override highlight groups
-- Plugins Config --
diagnostics = {
darker = true, -- darker colors for diagnostic
undercurl = true, -- use undercurl instead of underline for diagnostics
background = true, -- use background color for virtual text
},
}
local onedark = require 'onedark'
onedark.setup(config)
onedark.load()
-- Make the background of diagnostics messages transparent
local set_diagnostics_bg_transparency = function()
vim.cmd [[highlight DiagnosticVirtualTextError guibg=none]]
vim.cmd [[highlight DiagnosticVirtualTextWarn guibg=none]]
vim.cmd [[highlight DiagnosticVirtualTextInfo guibg=none]]
vim.cmd [[highlight DiagnosticVirtualTextHint guibg=none]]
end
set_diagnostics_bg_transparency()
-- Toggle background transparency
local toggle_transparency = function()
config.transparent = not config.transparent
onedark.setup(config)
onedark.load()
set_diagnostics_bg_transparency()
end
vim.keymap.set('n', '<leader>bg', toggle_transparency, { noremap = true, silent = true })
end,
}
-- OneDark colors
-- black = "#181a1f",
-- bg0 = "#282c34",
-- bg1 = "#31353f",
-- bg2 = "#393f4a",
-- bg3 = "#3b3f4c",
-- bg_d = "#21252b",
-- bg_blue = "#73b8f1",
-- bg_yellow = "#ebd09c",
-- fg = "#abb2bf",
-- purple = "#c678dd",
-- green = "#98c379",
-- orange = "#d19a66",
-- blue = "#61afef",
-- yellow = "#e5c07b",
-- cyan = "#56b6c2",
-- red = "#e86671",
-- grey = "#5c6370",
-- light_grey = "#848b98",
-- dark_cyan = "#2b6f77",
-- dark_red = "#993939",
-- dark_yellow = "#93691d",
-- dark_purple = "#8a3fa0",
-- diff_add = "#31392b",
-- diff_delete = "#382b2c",
-- diff_change = "#1c3448",
-- diff_text = "#2c5372",

View File

@ -0,0 +1,10 @@
return {
{
'AvidDabbler/quantum.vim',
priority = 1000, -- Ensure it's loaded first
lazy = false, -- Load immediately
config = function()
vim.cmd 'colorscheme quantum' -- Explicitly set the colorscheme
end,
},
}

View File

@ -0,0 +1,13 @@
return {
'akinsho/toggleterm.nvim',
version = '*',
config = function()
require('toggleterm').setup {
direction = 'float', -- Opens a floating terminal
shell = vim.o.shell, -- Uses the default shell
}
-- Keymap to open terminal with Ctrl+/
vim.keymap.set('n', '<C-y>', '<Cmd>ToggleTerm direction=float<CR>', { noremap = true, silent = true })
vim.keymap.set('t', '<C-y>', '<Cmd>ToggleTerm<CR>', { noremap = true, silent = true })
end,
}

108
lua/plugins/treesitter.lua Normal file
View File

@ -0,0 +1,108 @@
-- Highlight, edit, and navigate code
return {
'nvim-treesitter/nvim-treesitter',
build = ':TSUpdate',
dependencies = {
'nvim-treesitter/nvim-treesitter-textobjects',
},
config = function()
require('nvim-treesitter.configs').setup {
-- Add languages to be installed here that you want installed for treesitter
ensure_installed = {
"latex", "scss", "svelte", "vue", "norg", "typst",
'lua',
'python',
'javascript',
'typescript',
'vimdoc',
'vim',
'regex',
'terraform',
'sql',
'dockerfile',
'toml',
'json',
'java',
'groovy',
'go',
'gitignore',
'graphql',
'yaml',
'make',
'cmake',
'markdown',
'markdown_inline',
'bash',
'tsx',
'css',
'html',
},
fold = { enable = true }, -- Enable folding
-- Autoinstall languages that are not installed
auto_install = true,
highlight = { enable = true },
indent = { enable = true },
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<c-space>',
node_incremental = '<c-space>',
scope_incremental = '<c-s>',
node_decremental = '<M-space>',
},
},
textobjects = {
select = {
enable = true,
lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim
keymaps = {
-- You can use the capture groups defined in textobjects.scm
['aa'] = '@parameter.outer',
['ia'] = '@parameter.inner',
['af'] = '@function.outer',
['if'] = '@function.inner',
['ac'] = '@class.outer',
['ic'] = '@class.inner',
},
},
move = {
enable = true,
set_jumps = true, -- whether to set jumps in the jumplist
goto_next_start = {
[']m'] = '@function.outer',
[']]'] = '@class.outer',
},
goto_next_end = {
[']M'] = '@function.outer',
[']['] = '@class.outer',
},
goto_previous_start = {
['[m'] = '@function.outer',
['[['] = '@class.outer',
},
goto_previous_end = {
['[M'] = '@function.outer',
['[]'] = '@class.outer',
},
},
swap = {
enable = true,
swap_next = {
['<leader>a'] = '@parameter.inner',
},
swap_previous = {
['<leader>A'] = '@parameter.inner',
},
},
},
}
-- Register additional file extensions
vim.filetype.add { extension = { tf = 'terraform' } }
vim.filetype.add { extension = { tfvars = 'terraform' } }
vim.filetype.add { extension = { pipeline = 'groovy' } }
vim.filetype.add { extension = { multibranch = 'groovy' } }
end,
}

View File

@ -0,0 +1,18 @@
-- Copied config from https://github.com/christoomey/vim-tmux-navigator
return {
'christoomey/vim-tmux-navigator',
cmd = {
'TmuxNavigateLeft',
'TmuxNavigateDown',
'TmuxNavigateUp',
'TmuxNavigateRight',
'TmuxNavigatePrevious',
},
keys = {
{ '<c-h>', '<cmd><C-U>TmuxNavigateLeft<cr>' },
{ '<c-j>', '<cmd><C-U>TmuxNavigateDown<cr>' },
{ '<c-k>', '<cmd><C-U>TmuxNavigateUp<cr>' },
{ '<c-l>', '<cmd><C-U>TmuxNavigateRight<cr>' },
{ '<c-\\>', '<cmd><C-U>TmuxNavigatePrevious<cr>' },
},
}

12
lua/plugins/zellij.lua Normal file
View File

@ -0,0 +1,12 @@
return {
"https://git.sr.ht/~swaits/zellij-nav.nvim",
lazy = true,
event = "VeryLazy",
keys = {
{ "<c-h>", "<cmd>ZellijNavigateLeft<cr>", { silent = true, desc = "navigate left" } },
{ "<c-j>", "<cmd>ZellijNavigateDown<cr>", { silent = true, desc = "navigate down" } },
{ "<c-k>", "<cmd>ZellijNavigateUp<cr>", { silent = true, desc = "navigate up" } },
{ "<c-l>", "<cmd>ZellijNavigateRight<cr>", { silent = true, desc = "navigate right" } },
},
opts = {},
}

9
nvim-troubleshooting.md Normal file
View File

@ -0,0 +1,9 @@
# Troubleshooting Notes for Neovim Setup
- Check generate health of Neovim setup. `:checkhealth`
- Update Treesitter. `:TSUpdate`
- Check LSP installation. `:Mason`
- Fix broken icons
- Download [nerdfix](https://github.com/loichyan/nerdfix) binary and unpack in home directory.
- Run `nerdfix check <path/to/file>` to check broken icons in a file
- Run `nerdfix fix <path/to/file>` to fix broken icons in a file