clean nvim
This commit is contained in:
@@ -1,128 +1,17 @@
|
||||
-- Highlight when yanking (copying) text
|
||||
vim.api.nvim_create_autocmd("TextYankPost", {
|
||||
callback = function()
|
||||
vim.highlight.on_yank()
|
||||
end,
|
||||
vim.api.nvim_create_autocmd('TextYankPost', {
|
||||
callback = function()
|
||||
vim.highlight.on_yank()
|
||||
end,
|
||||
})
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
-- Reload ColorScheme by clearing cached modules
|
||||
vim.api.nvim_create_user_command("ReloadColorscheme", function()
|
||||
local current = vim.g.colors_name
|
||||
if not current then
|
||||
vim.notify("No colorscheme is currently set", vim.log.levels.WARN)
|
||||
return
|
||||
end
|
||||
|
||||
-- clear only the cached modules for this theme
|
||||
for k in pairs(package.loaded) do
|
||||
if k:match("^themes%." .. current) then
|
||||
package.loaded[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- reload it
|
||||
vim.cmd("colorscheme " .. current)
|
||||
vim.notify("Reloaded " .. current .. " colorscheme", vim.log.levels.INFO)
|
||||
end, { desc = "Reload the current colorscheme" })
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
--[[
|
||||
Command :TSHighlightRoots (works but uncomment only when used)
|
||||
|
||||
Description:
|
||||
Collects all Tree-sitter highlight groups, resolves their links,
|
||||
and outputs the unique root groups actually used (for theming/debugging).
|
||||
|
||||
Usage:
|
||||
:TSHighlightRoots -> prints roots in the command line
|
||||
:TSHighlightRoots <filename> -> writes roots into <filename> (overwrites)
|
||||
(filename supports ~ and tab-completion)
|
||||
]]
|
||||
-- local function resolve_link(name)
|
||||
-- local seen = {}
|
||||
-- while name and not seen[name] do
|
||||
-- seen[name] = true
|
||||
-- local hl = vim.api.nvim_get_hl(0, { name = name })
|
||||
-- if hl.link then
|
||||
-- name = hl.link
|
||||
-- else
|
||||
-- return name
|
||||
-- end
|
||||
-- end
|
||||
-- end
|
||||
--
|
||||
-- vim.api.nvim_create_autocmd("VimEnter", {
|
||||
-- callback = function()
|
||||
-- vim.api.nvim_create_user_command("TSHighlightRoots", function(opts)
|
||||
-- local roots = {}
|
||||
-- for _, group in ipairs(vim.fn.getcompletion("@", "highlight")) do
|
||||
-- local root = resolve_link(group)
|
||||
-- if root then
|
||||
-- roots[root] = true
|
||||
-- end
|
||||
-- end
|
||||
--
|
||||
-- local output = { "Unique root highlight groups used by Tree-sitter:" }
|
||||
-- for root in pairs(roots) do
|
||||
-- table.insert(output, " " .. root)
|
||||
-- end
|
||||
--
|
||||
-- if opts.args ~= "" then
|
||||
-- -- write to file
|
||||
-- local filename = vim.fn.expand(opts.args)
|
||||
-- local fd = assert(io.open(filename, "w"))
|
||||
-- fd:write(table.concat(output, "\n"))
|
||||
-- fd:close()
|
||||
-- print("Wrote roots to " .. filename)
|
||||
-- else
|
||||
-- -- default: print to command line
|
||||
-- for _, line in ipairs(output) do
|
||||
-- print(line)
|
||||
-- end
|
||||
-- end
|
||||
-- end, {
|
||||
-- nargs = "?", -- allow 0 or 1 argument
|
||||
-- complete = "file", -- tab-complete filenames
|
||||
-- })
|
||||
-- end,
|
||||
-- })
|
||||
|
||||
----------------------------------------------
|
||||
-- Useful tricks that do not fully work
|
||||
----------------------------------------------
|
||||
|
||||
-- -- Show cursorline only in the active window
|
||||
--
|
||||
-- vim.api.nvim_create_autocmd({ "WinEnter", "BufEnter" }, {
|
||||
-- callback = function()
|
||||
-- local ft = vim.bo.filetype
|
||||
-- vim.notify("enter: " .. ft .. " - " .. vim.bo.buftype)
|
||||
-- -- if not ft:match("^Telescope") and ft ~= "NvimTree" then
|
||||
-- -- vim.wo.cursorline = true
|
||||
-- -- end
|
||||
-- end,
|
||||
-- })
|
||||
|
||||
-- vim.api.nvim_create_autocmd({ "WinLeave", "BufLeave" }, {
|
||||
-- callback = function()
|
||||
-- local ft = vim.bo.filetype
|
||||
-- vim.notify("exit: " .. ft .. " - " .. vim.bo.buftype)
|
||||
-- -- if not ft:match("^Telescope") and ft ~= "NvimTree" then
|
||||
-- -- vim.wo.cursorline = false
|
||||
-- -- end
|
||||
-- end,
|
||||
-- })
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
-- -- Associate filetype
|
||||
--
|
||||
-- vim.api.nvim_create_autocmd("FileType", {
|
||||
-- pattern = "text",
|
||||
-- callback = function()
|
||||
-- vim.bo.filetype = "markdown"
|
||||
-- end,
|
||||
-- })
|
||||
-- Set filetype on new buffers
|
||||
vim.api.nvim_create_user_command('Capture', function(opts)
|
||||
local out = vim.fn.execute(opts.args)
|
||||
vim.cmd('enew')
|
||||
vim.bo.buftype = 'nofile'
|
||||
vim.bo.bufhidden = 'hide'
|
||||
vim.bo.swapfile = false
|
||||
vim.bo.filetype = 'capture'
|
||||
vim.api.nvim_buf_set_lines(0, 0, -1, false, vim.split(out, '\n'))
|
||||
end, { nargs = '+', complete = 'command' })
|
||||
|
||||
17
config/linux-dev/nvim/lua/config/clipboard.lua
Normal file
17
config/linux-dev/nvim/lua/config/clipboard.lua
Normal file
@@ -0,0 +1,17 @@
|
||||
if vim.env.CONTAINER then
|
||||
vim.g.clipboard = {
|
||||
name = "osc52",
|
||||
copy = {
|
||||
["+"] = require("vim.ui.clipboard.osc52").copy("+"),
|
||||
["*"] = require("vim.ui.clipboard.osc52").copy("*"),
|
||||
},
|
||||
paste = {
|
||||
["+"] = require("vim.ui.clipboard.osc52").paste("+"),
|
||||
["*"] = require("vim.ui.clipboard.osc52").paste("*"),
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
vim.schedule(function()
|
||||
vim.o.clipboard = "unnamedplus"
|
||||
end)
|
||||
@@ -1,50 +1,44 @@
|
||||
local remap = require("utils.remap")
|
||||
vim.keymap.set(
|
||||
'n',
|
||||
'<leader>q',
|
||||
vim.diagnostic.setloclist,
|
||||
{ desc = 'Open diagnostic [Q]uickfix list' }
|
||||
)
|
||||
|
||||
remap.nmap("<leader>q", vim.diagnostic.setloclist, { desc = "Open diagnostic [Q]uickfix list" })
|
||||
|
||||
remap.imap("jk", "<Esc>", { desc = "Exit insert mode with jk" })
|
||||
remap.cmap("jk", "<C-c>", { desc = "Exit command/search mode with jk" })
|
||||
remap.nmap("<Esc>", "<cmd>nohlsearch<CR>", { desc = "Clear highlights" })
|
||||
vim.keymap.set('i', 'jk', '<Esc>', { desc = 'Exit insert mode with jk' })
|
||||
vim.keymap.set('c', 'jk', '<C-c>', { desc = 'Exit command/search mode with jk' })
|
||||
vim.keymap.set('n', '<Esc>', '<cmd>nohlsearch<CR>', { desc = 'Clear highlights' })
|
||||
|
||||
-- Prevent "x" from overriding the register
|
||||
remap.nmap("x", '"_x')
|
||||
vim.keymap.set('n', 'x', '"_x')
|
||||
|
||||
-- Window Navigation
|
||||
remap.nmap("<C-h>", "<C-w>h", { desc = "Move focus to the left window" })
|
||||
remap.nmap("<C-l>", "<C-w>l", { desc = "Move focus to the right window" })
|
||||
remap.nmap("<C-j>", "<C-w>j", { desc = "Move focus to the lower window" })
|
||||
remap.nmap("<C-k>", "<C-w>k", { desc = "Move focus to the upper window" })
|
||||
vim.keymap.set('n', '<C-h>', '<C-w>h', { desc = 'Move focus to the left window' })
|
||||
vim.keymap.set('n', '<C-l>', '<C-w>l', { desc = 'Move focus to the right window' })
|
||||
vim.keymap.set('n', '<C-j>', '<C-w>j', { desc = 'Move focus to the lower window' })
|
||||
vim.keymap.set('n', '<C-k>', '<C-w>k', { desc = 'Move focus to the upper window' })
|
||||
|
||||
-- Tab management
|
||||
remap.nmap("<Leader>tn", ":tabnew<CR>", { desc = "[T]ab [N]ew" })
|
||||
remap.nmap("<Leader>tc", ":tabclose<CR>", { desc = "[T]ab [C]lose" })
|
||||
remap.nmap("<Leader>to", ":tabonly<CR>", { desc = "[T]ab [O]nly" })
|
||||
remap.nmap("<Leader>tl", ":tabnext<CR>", { desc = "[T]ab Next" })
|
||||
remap.nmap("<Leader>th", ":tabprevious<CR>", { desc = "[T]ab Previous" })
|
||||
remap.nmap("<Leader>tm.", ":tabmove +1<CR>", { desc = "[T]ab [M]ove Right" })
|
||||
remap.nmap("<Leader>tm,", ":tabmove -1<CR>", { desc = "[T]ab [M]ove Left" })
|
||||
vim.keymap.set('n', '<Leader>tn', ':tabnew<CR>', { desc = '[T]ab [N]ew' })
|
||||
vim.keymap.set('n', '<Leader>tc', ':tabclose<CR>', { desc = '[T]ab [C]lose' })
|
||||
vim.keymap.set('n', '<Leader>to', ':tabonly<CR>', { desc = '[T]ab [O]nly' })
|
||||
vim.keymap.set('n', '<Leader>tl', ':tabnext<CR>', { desc = '[T]ab Next' })
|
||||
vim.keymap.set('n', '<Leader>th', ':tabprevious<CR>', { desc = '[T]ab Previous' })
|
||||
vim.keymap.set('n', '<Leader>tm.', ':tabmove +1<CR>', { desc = '[T]ab [M]ove Right' })
|
||||
vim.keymap.set('n', '<Leader>tm,', ':tabmove -1<CR>', { desc = '[T]ab [M]ove Left' })
|
||||
for i = 1, 9 do
|
||||
remap.nmap(string.format("<Leader>%d", i), string.format("%dgt", i), { desc = string.format("[T]ab %d", i) })
|
||||
vim.keymap.set(
|
||||
'n',
|
||||
string.format('<Leader>%d', i),
|
||||
string.format('%dgt', i),
|
||||
{ desc = string.format('[T]ab %d', i) }
|
||||
)
|
||||
end
|
||||
|
||||
-- Buffer Management
|
||||
remap.nmap("<Leader>bl", ":ls<CR>", { desc = "[B]uffer [L]ist" })
|
||||
remap.nmap("<Leader>bd", ":bdelete<CR>", { desc = "[B]uffer [D]elete" })
|
||||
remap.nmap("]b", ":bnext<CR>", { desc = "[B]uffer [N]ext" })
|
||||
remap.nmap("[b", ":bprevious<CR>", { desc = "[B]uffer [P]revious" })
|
||||
remap.nmap("<Leader>bb", ":b<Space>", { desc = "[B]uffer Select" })
|
||||
remap.nmap("<Leader>bo", ":bufdo bd|1bd<CR>", { desc = "[B]uffer Delete Others" })
|
||||
|
||||
-- Terminal
|
||||
remap.nmap("<Leader>tet", function()
|
||||
vim.cmd("terminal")
|
||||
vim.cmd("startinsert")
|
||||
end, { desc = "[T]erminal" })
|
||||
remap.nmap("<leader>ter", function()
|
||||
local buf_dir = vim.fn.expand("%:p:h")
|
||||
vim.cmd("edit term://" .. buf_dir .. "//zsh")
|
||||
vim.cmd("startinsert")
|
||||
end, { desc = "[T]erminal [R]elative" })
|
||||
remap.tmap("<Esc>", "<C-\\><C-n>", { desc = "Terminal Normal Mode" })
|
||||
remap.tmap("jk", "<C-\\><C-n>", { desc = "Terminal Normal Mode" })
|
||||
remap.tmap("<C-w>", "<C-\\><C-n><C-w>", { desc = "Terminal Window Command" })
|
||||
vim.keymap.set('n', '<Leader>bl', ':ls<CR>', { desc = '[B]uffer [L]ist' })
|
||||
vim.keymap.set('n', '<Leader>bd', ':bdelete<CR>', { desc = '[B]uffer [D]elete' })
|
||||
vim.keymap.set('n', ']b', ':bnext<CR>', { desc = '[B]uffer [N]ext' })
|
||||
vim.keymap.set('n', '[b', ':bprevious<CR>', { desc = '[B]uffer [P]revious' })
|
||||
vim.keymap.set('n', '<Leader>bb', ':b<Space>', { desc = '[B]uffer Select' })
|
||||
vim.keymap.set('n', '<Leader>bo', ':bufdo bd|1bd<CR>', { desc = '[B]uffer Delete Others' })
|
||||
|
||||
@@ -1,18 +1,23 @@
|
||||
local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim'
|
||||
-- Bootstrap lazy.nvim
|
||||
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
|
||||
if not (vim.uv or vim.loop).fs_stat(lazypath) then
|
||||
local lazyrepo = 'https://github.com/folke/lazy.nvim.git'
|
||||
local out = vim.fn.system { 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath }
|
||||
local out =
|
||||
vim.fn.system({ 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath })
|
||||
if vim.v.shell_error ~= 0 then
|
||||
error('Error cloning lazy.nvim:\n' .. out)
|
||||
vim.api.nvim_echo({
|
||||
{ 'Failed to clone lazy.nvim:\n', 'ErrorMsg' },
|
||||
{ out, 'WarningMsg' },
|
||||
{ '\nPress any key to exit...' },
|
||||
}, true, {})
|
||||
vim.fn.getchar()
|
||||
os.exit(1)
|
||||
end
|
||||
end ---@diagnostic disable-next-line: undefined-field
|
||||
end
|
||||
vim.opt.rtp:prepend(lazypath)
|
||||
|
||||
require("lazy").setup({
|
||||
spec = { { import = "plugins" } },
|
||||
ui = {
|
||||
backdrop = 100,
|
||||
border = "rounded"
|
||||
},
|
||||
require('lazy').setup({
|
||||
spec = { { import = 'plugins' } },
|
||||
change_detection = { notify = false },
|
||||
rocks = { enabled = false },
|
||||
})
|
||||
|
||||
|
||||
@@ -1,95 +1,55 @@
|
||||
-- Map Leader
|
||||
vim.g.mapleader = " "
|
||||
vim.g.maplocalleader = " "
|
||||
vim.g.mapleader = ' '
|
||||
vim.g.maplocalleader = ' '
|
||||
vim.g.have_nerd_font = true
|
||||
|
||||
-- Use Nerd Font
|
||||
vim.g.have_nerd_font = false
|
||||
-- use nvim-tree instead
|
||||
vim.g.loaded_netrw = 1
|
||||
vim.g.loaded_netrwPlugin = 1
|
||||
|
||||
if vim.env.CONTAINER == "true" then
|
||||
vim.g.clipboard = {
|
||||
name = "osc52",
|
||||
copy = {
|
||||
["+"] = require("vim.ui.clipboard.osc52").copy("+"),
|
||||
["*"] = require("vim.ui.clipboard.osc52").copy("*"),
|
||||
},
|
||||
paste = {
|
||||
["+"] = require("vim.ui.clipboard.osc52").paste("+"),
|
||||
["*"] = require("vim.ui.clipboard.osc52").paste("*"),
|
||||
},
|
||||
}
|
||||
end
|
||||
vim.opt.formatoptions:remove('o')
|
||||
|
||||
-- Sync clipboard between OS and Neovim
|
||||
vim.schedule(function()
|
||||
vim.opt.clipboard = "unnamedplus"
|
||||
end)
|
||||
vim.opt.modeline = true
|
||||
vim.opt.modelines = 5
|
||||
|
||||
-- Add vertical line
|
||||
vim.opt.colorcolumn = "100"
|
||||
-- UI and appearance
|
||||
vim.opt.termguicolors = true -- Disable TrueColor
|
||||
vim.opt.colorcolumn = '100' -- Vertical guide at column 100
|
||||
vim.opt.signcolumn = 'no' -- Hide sign column
|
||||
vim.opt.cursorline = true -- Highlight current line
|
||||
vim.opt.guicursor = 'n-v-i-c:block' -- Block cursor shape
|
||||
vim.opt.number = true -- Show absolute line numbers
|
||||
vim.opt.relativenumber = true -- Show relative numbers
|
||||
vim.opt.statusline = '%F%m%r%h%w%=%l,%c %P ' -- Custom statusline
|
||||
vim.opt.swapfile = false
|
||||
|
||||
-- vim.opt.laststatus = 3
|
||||
vim.opt.signcolumn = "no"
|
||||
vim.opt.wrap = false -- Line wrapping
|
||||
vim.opt.linebreak = true -- Wrap long lines at convenient points
|
||||
vim.opt.breakindent = true -- Preserve indent when wrapping long lines
|
||||
|
||||
-- Enable TrueColor
|
||||
vim.opt.termguicolors = false
|
||||
-- Editing behavior
|
||||
vim.opt.shiftwidth = 2 -- Number of spaces to use for (auto)indent
|
||||
vim.opt.tabstop = 2 -- Number of spaces that a <Tab> in file counts for
|
||||
vim.opt.softtabstop = 2 -- Number of spaces when pressing <Tab> in insert mode
|
||||
vim.opt.expandtab = true -- Use spaces instead of literal tab characters
|
||||
vim.opt.autoindent = true -- Copy indent from the current line when starting a new one
|
||||
vim.opt.smartindent = true -- Automatically inserts indents in code blocks (for C-like languages)
|
||||
|
||||
-- Scroll lines/columns
|
||||
vim.opt.mousescroll = "hor:1,ver:1"
|
||||
-- Scroll
|
||||
vim.opt.scrolloff = 10 -- Keep lines visible above/below cursor
|
||||
vim.opt.mousescroll = 'hor:1,ver:1' -- Scroll lines/columns
|
||||
vim.opt.mouse = 'a' -- Enable mouse mode
|
||||
|
||||
-- Set indentation preferences
|
||||
vim.opt.expandtab = true -- Convert tabs to spaces
|
||||
vim.opt.shiftwidth = 4 -- Number of spaces for auto-indent
|
||||
vim.opt.tabstop = 4 -- Number of spaces a tab counts for
|
||||
vim.opt.softtabstop = 4 -- Number of spaces a tab counts for when editing
|
||||
vim.opt.autoindent = true -- Copy indent from current line when starting new line
|
||||
vim.opt.smartindent = true -- Do smart autoindenting when starting a new line
|
||||
-- Search and substitution
|
||||
vim.opt.ignorecase = true -- Case-insensitive search
|
||||
vim.opt.smartcase = true -- Smart-case search
|
||||
vim.opt.inccommand = 'split' -- Live substitution preview
|
||||
|
||||
-- Disable line wrapping
|
||||
vim.opt.wrap = false
|
||||
-- Splits and windows
|
||||
vim.opt.splitright = true -- Vertical splits to the right
|
||||
vim.opt.splitbelow = true -- Horizontal splits below
|
||||
|
||||
-- Enable break indent
|
||||
vim.opt.breakindent = true
|
||||
|
||||
-- Make line numbers default
|
||||
vim.opt.number = true
|
||||
vim.opt.relativenumber = true
|
||||
|
||||
-- Enable mouse mode, can be useful for resizing splits for example
|
||||
vim.opt.mouse = "a"
|
||||
|
||||
-- Full path on status line
|
||||
vim.opt.statusline = "%F%m%r%h%w%=%l,%c %P "
|
||||
-- vim.opt.statusline = "%= %F%m%r%h%w ─ (%l,%c %P) %="
|
||||
-- vim.opt.fillchars:append({ stl = "─", stlnc = "─" })
|
||||
|
||||
-- Save undo history
|
||||
vim.opt.undofile = true
|
||||
|
||||
-- Case-insensitive searching UNLESS \C or one or more capital letters in the search term
|
||||
vim.opt.ignorecase = true
|
||||
vim.opt.smartcase = true
|
||||
|
||||
-- Decrease update time
|
||||
vim.opt.updatetime = 250
|
||||
|
||||
-- Decrease mapped sequence wait time
|
||||
-- Displays which-key popup sooner
|
||||
vim.opt.timeoutlen = 300
|
||||
|
||||
-- Configure how new splits should be opened
|
||||
vim.opt.splitright = true
|
||||
vim.opt.splitbelow = true
|
||||
|
||||
-- Preview substitutions live, as you type
|
||||
vim.opt.inccommand = "split"
|
||||
|
||||
-- Show which line your cursor is on
|
||||
vim.opt.cursorline = true
|
||||
|
||||
vim.opt.guicursor = "n-v-i-c:block"
|
||||
|
||||
-- Minimal number of screen lines to keep above and below the cursor
|
||||
vim.opt.scrolloff = 10
|
||||
|
||||
-- Load the colorscheme
|
||||
vim.cmd.colorscheme("invero")
|
||||
-- Performance and persistence
|
||||
vim.opt.undofile = false -- Save undo history
|
||||
vim.opt.updatetime = 250 -- Faster updates
|
||||
vim.opt.timeoutlen = 300 -- Shorter keymap timeout
|
||||
|
||||
34
config/linux-dev/nvim/lua/config/terminal.lua
Normal file
34
config/linux-dev/nvim/lua/config/terminal.lua
Normal file
@@ -0,0 +1,34 @@
|
||||
vim.api.nvim_create_autocmd("TermOpen", {
|
||||
group = vim.api.nvim_create_augroup("custom-term-open", { clear = true }),
|
||||
callback = function()
|
||||
vim.opt_local.number = false
|
||||
vim.opt_local.relativenumber = false
|
||||
vim.opt_local.scrolloff = 0
|
||||
|
||||
vim.bo.filetype = "terminal"
|
||||
vim.cmd("startinsert")
|
||||
end,
|
||||
})
|
||||
|
||||
-- Open a relative terminal in the current file’s directory
|
||||
vim.keymap.set("n", "<leader>ter", function()
|
||||
vim.cmd.edit(string.format("term://%s//zsh", vim.fn.expand("%:p:h")))
|
||||
end, { desc = "[T]erminal [R]elative" })
|
||||
|
||||
-- Open a split terminal at the bottom
|
||||
vim.keymap.set("n", "<leader>ts", function()
|
||||
vim.cmd.new()
|
||||
vim.cmd.wincmd("J")
|
||||
vim.api.nvim_win_set_height(0, 12)
|
||||
vim.wo.winfixheight = true
|
||||
vim.cmd.term()
|
||||
end, { desc = "[T]erminal [S]plit" })
|
||||
|
||||
-- Simple terminal open
|
||||
vim.keymap.set("n", "<Leader>tet", ":terminal<CR>", { desc = "[T]erminal" })
|
||||
|
||||
-- Terminal mode keymaps
|
||||
vim.keymap.set("t", "<Esc>", "<C-\\><C-n>", { desc = "Terminal Normal Mode" })
|
||||
vim.keymap.set("t", "jk", "<C-\\><C-n>", { desc = "Terminal Normal Mode" })
|
||||
vim.keymap.set("t", "<C-w>", "<C-\\><C-n><C-w>", { desc = "Terminal Window Command" })
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
return { -- Autoformat
|
||||
"stevearc/conform.nvim",
|
||||
event = { "BufWritePre" },
|
||||
cmd = { "ConformInfo" },
|
||||
keys = {
|
||||
{
|
||||
"<leader>f",
|
||||
function()
|
||||
require("conform").format({ async = true, lsp_format = "fallback" })
|
||||
end,
|
||||
mode = "",
|
||||
desc = "[F]ormat buffer",
|
||||
},
|
||||
},
|
||||
opts = {
|
||||
notify_on_error = false,
|
||||
format_on_save = function(bufnr)
|
||||
local disable_filetypes = { c = true, cpp = true }
|
||||
local lsp_format_opt
|
||||
if disable_filetypes[vim.bo[bufnr].filetype] then
|
||||
lsp_format_opt = "never"
|
||||
else
|
||||
lsp_format_opt = "fallback"
|
||||
end
|
||||
return {
|
||||
timeout_ms = 500,
|
||||
lsp_format = lsp_format_opt,
|
||||
}
|
||||
end,
|
||||
formatters_by_ft = {
|
||||
lua = { "stylua" },
|
||||
sh = { "shfmt" },
|
||||
swift = { "swift_format" },
|
||||
python = { "isort", "black", stop_after_first = true },
|
||||
javascript = { "prettierd", "prettier", stop_after_first = true },
|
||||
javascriptreact = { "prettierd", "prettier", stop_after_first = true },
|
||||
typescript = { "prettierd", "prettier", stop_after_first = true },
|
||||
typescriptreact = { "prettierd", "prettier", stop_after_first = true },
|
||||
},
|
||||
formatters = {
|
||||
shfmt = {
|
||||
prepend_args = { "-i", "4", "-ci" }, -- 4 spaces, indent cases
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
return {
|
||||
'windwp/nvim-autopairs',
|
||||
event = 'InsertEnter',
|
||||
-- Optional dependency
|
||||
dependencies = { 'hrsh7th/nvim-cmp' },
|
||||
config = function()
|
||||
require('nvim-autopairs').setup {}
|
||||
-- If you want to automatically add `(` after selecting a function or method
|
||||
local cmp_autopairs = require 'nvim-autopairs.completion.cmp'
|
||||
local cmp = require 'cmp'
|
||||
cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done())
|
||||
end,
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
return {
|
||||
"windwp/nvim-ts-autotag",
|
||||
opts = {
|
||||
autotag = {
|
||||
enable = true,
|
||||
enable_close = true,
|
||||
enable_rename = true,
|
||||
enable_close_on_slash = true,
|
||||
},
|
||||
},
|
||||
}
|
||||
27
config/linux-dev/nvim/lua/plugins/coding.lua
Normal file
27
config/linux-dev/nvim/lua/plugins/coding.lua
Normal file
@@ -0,0 +1,27 @@
|
||||
return {
|
||||
{
|
||||
'windwp/nvim-ts-autotag',
|
||||
opts = {
|
||||
autotag = {
|
||||
enable = true,
|
||||
enable_close = true,
|
||||
enable_rename = true,
|
||||
enable_close_on_slash = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
'windwp/nvim-autopairs',
|
||||
event = 'InsertEnter',
|
||||
config = true,
|
||||
},
|
||||
{
|
||||
'triimdev/invero.nvim',
|
||||
lazy = false,
|
||||
priority = 1000,
|
||||
config = function()
|
||||
vim.o.background = 'light'
|
||||
vim.cmd.colorscheme('invero')
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
return {
|
||||
"hrsh7th/nvim-cmp",
|
||||
event = "InsertEnter",
|
||||
dependencies = {
|
||||
"hrsh7th/cmp-nvim-lsp",
|
||||
"hrsh7th/cmp-path",
|
||||
},
|
||||
config = function()
|
||||
local cmp = require("cmp")
|
||||
cmp.setup({
|
||||
window = {
|
||||
completion = {
|
||||
border = "single",
|
||||
-- or border = true for default border
|
||||
},
|
||||
documentation = {
|
||||
border = "single",
|
||||
},
|
||||
},
|
||||
completion = { completeopt = "menu,menuone,noselect" }, -- This ensures nothing is auto-selected
|
||||
sources = cmp.config.sources({
|
||||
{ name = "nvim_lsp" }, -- from language server
|
||||
{ name = "buffer" }, -- from current buffer
|
||||
{ name = "path" }, -- for file paths
|
||||
}),
|
||||
mapping = cmp.mapping.preset.insert({
|
||||
["<Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_next_item({ behavior = cmp.SelectBehavior.Insert })
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end),
|
||||
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item({ behavior = cmp.SelectBehavior.Insert })
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end),
|
||||
["<C-e>"] = cmp.mapping.abort(), -- This closes the completion menu
|
||||
|
||||
["<C-u>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() and cmp.get_selected_entry() then
|
||||
cmp.scroll_docs(-4)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end),
|
||||
["<C-d>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() and cmp.get_selected_entry() then
|
||||
cmp.scroll_docs(4)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end),
|
||||
}),
|
||||
})
|
||||
end,
|
||||
}
|
||||
130
config/linux-dev/nvim/lua/plugins/filetree.lua
Normal file
130
config/linux-dev/nvim/lua/plugins/filetree.lua
Normal file
@@ -0,0 +1,130 @@
|
||||
vim.keymap.set('n', '<leader>e', '<cmd>NvimTreeToggle<CR>')
|
||||
|
||||
local function my_on_attach(bufnr)
|
||||
local api = require('nvim-tree.api')
|
||||
local opts = { buffer = bufnr }
|
||||
|
||||
-- basics: copy/cut/paste/create/rename/remove
|
||||
vim.keymap.set('n', 'c', api.fs.copy.node, opts)
|
||||
vim.keymap.set('n', 'x', api.fs.cut, opts)
|
||||
vim.keymap.set('n', 'p', api.fs.paste, opts)
|
||||
vim.keymap.set('n', 'a', api.fs.create, opts)
|
||||
vim.keymap.set('n', 'r', api.fs.rename, opts)
|
||||
vim.keymap.set('n', 'R', api.fs.rename_basename, opts)
|
||||
vim.keymap.set('n', 'd', api.fs.remove, opts)
|
||||
|
||||
-- bulk mark and delete/move
|
||||
vim.keymap.set('n', 's', api.marks.toggle, opts)
|
||||
vim.keymap.set('n', 'S', api.marks.clear, opts)
|
||||
vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts)
|
||||
vim.keymap.set('n', 'bm', api.marks.bulk.move, opts)
|
||||
|
||||
-- copy filename/path
|
||||
vim.keymap.set('n', 'y', api.fs.copy.filename, opts)
|
||||
vim.keymap.set('n', 'Y', api.fs.copy.relative_path, opts)
|
||||
vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts)
|
||||
vim.keymap.set('n', 'ge', api.fs.copy.basename, opts)
|
||||
|
||||
-- expand/collapse
|
||||
vim.keymap.set('n', 'e', api.tree.expand_all, opts)
|
||||
vim.keymap.set('n', 'E', api.tree.collapse_all, opts)
|
||||
|
||||
-- filter
|
||||
vim.keymap.set('n', 'f', api.live_filter.start, opts)
|
||||
vim.keymap.set('n', 'F', api.live_filter.clear, opts)
|
||||
|
||||
-- navigate
|
||||
vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts)
|
||||
vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts)
|
||||
vim.keymap.set('n', 'P', api.node.navigate.parent, opts)
|
||||
|
||||
-- open
|
||||
vim.keymap.set('n', '<CR>', api.node.open.edit, opts)
|
||||
vim.keymap.set('n', 'o', api.node.open.edit, opts)
|
||||
vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts)
|
||||
|
||||
-- miscellaneous
|
||||
vim.keymap.set('n', 'K', api.node.show_info_popup, opts)
|
||||
vim.keymap.set('n', 'U', api.tree.reload, opts)
|
||||
end
|
||||
|
||||
return {
|
||||
'nvim-tree/nvim-tree.lua',
|
||||
version = '*',
|
||||
opts = {
|
||||
on_attach = my_on_attach,
|
||||
view = { signcolumn = 'no' },
|
||||
actions = { file_popup = { open_win_config = { border = 'rounded' } } },
|
||||
renderer = {
|
||||
root_folder_label = false,
|
||||
special_files = {},
|
||||
|
||||
highlight_hidden = 'all',
|
||||
highlight_clipboard = 'all',
|
||||
|
||||
indent_markers = {
|
||||
enable = true,
|
||||
inline_arrows = false,
|
||||
icons = { corner = '│', none = '│', bottom = ' ' },
|
||||
},
|
||||
icons = {
|
||||
bookmarks_placement = 'after',
|
||||
show = {
|
||||
file = false,
|
||||
folder = false,
|
||||
folder_arrow = false, -- KEEP FALSE
|
||||
git = true,
|
||||
modified = false,
|
||||
hidden = false,
|
||||
diagnostics = false,
|
||||
bookmarks = true,
|
||||
},
|
||||
git_placement = 'after',
|
||||
glyphs = {
|
||||
git = {
|
||||
unstaged = '✗',
|
||||
staged = '✓',
|
||||
unmerged = '',
|
||||
renamed = '➜',
|
||||
untracked = '★',
|
||||
deleted = '', -- '',
|
||||
ignored = '◌',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
hijack_cursor = true,
|
||||
hijack_unnamed_buffer_when_opening = true,
|
||||
prefer_startup_root = true,
|
||||
update_focused_file = {
|
||||
enable = true,
|
||||
update_root = { enable = true, ignore_list = {} },
|
||||
exclude = false,
|
||||
},
|
||||
modified = { enable = true, show_on_dirs = true, show_on_open_dirs = true },
|
||||
filters = {
|
||||
enable = true,
|
||||
git_ignored = true,
|
||||
dotfiles = false,
|
||||
git_clean = false,
|
||||
no_buffer = false,
|
||||
no_bookmark = false,
|
||||
custom = {},
|
||||
exclude = {},
|
||||
},
|
||||
filesystem_watchers = {
|
||||
enable = true,
|
||||
debounce_delay = 50,
|
||||
ignore_dirs = {
|
||||
'/.git',
|
||||
'/.DS_Store',
|
||||
'/build',
|
||||
'/dist',
|
||||
'/public',
|
||||
'/node_modules',
|
||||
'/target',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
return {
|
||||
"ThePrimeagen/harpoon",
|
||||
branch = "harpoon2",
|
||||
opts = {
|
||||
menu = {
|
||||
width = vim.api.nvim_win_get_width(0) - 4,
|
||||
},
|
||||
settings = {
|
||||
save_on_toggle = true,
|
||||
},
|
||||
},
|
||||
keys = function()
|
||||
local keys = {
|
||||
{
|
||||
"<leader>H",
|
||||
function()
|
||||
require("harpoon"):list():add()
|
||||
end,
|
||||
desc = "Harpoon File",
|
||||
},
|
||||
{
|
||||
"<leader>h",
|
||||
function()
|
||||
local harpoon = require("harpoon")
|
||||
harpoon.ui:toggle_quick_menu(harpoon:list())
|
||||
end,
|
||||
desc = "Harpoon Quick Menu",
|
||||
},
|
||||
}
|
||||
|
||||
for i = 1, 5 do
|
||||
table.insert(keys, {
|
||||
"<C-" .. i .. ">",
|
||||
function()
|
||||
require("harpoon"):list():select(i)
|
||||
end,
|
||||
desc = "Harpoon to File " .. i,
|
||||
})
|
||||
end
|
||||
return keys
|
||||
end,
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
local remap = require("utils.remap")
|
||||
|
||||
vim.diagnostic.config({
|
||||
update_in_insert = false,
|
||||
virtual_text = {
|
||||
source = true,
|
||||
},
|
||||
float = {
|
||||
border = "rounded",
|
||||
},
|
||||
})
|
||||
|
||||
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
|
||||
border = "rounded",
|
||||
})
|
||||
vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {
|
||||
border = "rounded",
|
||||
})
|
||||
|
||||
return {
|
||||
|
||||
"neovim/nvim-lspconfig",
|
||||
dependencies = {
|
||||
{ "williamboman/mason.nvim", version = "1.8.0", config = true },
|
||||
{ "williamboman/mason-lspconfig.nvim", version = "1.31.0"},
|
||||
{ "j-hui/fidget.nvim", opts = {} }, -- side fidget showing status
|
||||
"hrsh7th/cmp-nvim-lsp", -- completion
|
||||
"b0o/schemastore.nvim",
|
||||
},
|
||||
config = function()
|
||||
require("mason").setup({
|
||||
ui = {
|
||||
border = "rounded",
|
||||
backdrop = 0
|
||||
},
|
||||
})
|
||||
|
||||
require("mason-lspconfig").setup()
|
||||
|
||||
local lspconfig = require("lspconfig")
|
||||
local capabilities = require("cmp_nvim_lsp").default_capabilities()
|
||||
|
||||
require("lspconfig.ui.windows").default_options = {
|
||||
border = "rounded",
|
||||
}
|
||||
|
||||
lspconfig.ts_ls.setup({
|
||||
capabilities = capabilities,
|
||||
init_options = {
|
||||
preferences = {
|
||||
includeCompletionsWithSnippetText = true,
|
||||
jsxAttributeCompletionStyle = "auto",
|
||||
},
|
||||
},
|
||||
on_attach = function(client, bufnr)
|
||||
-- Mappings
|
||||
local opts = { buffer = bufnr }
|
||||
remap.nmap("gd", vim.lsp.buf.definition, opts)
|
||||
remap.nmap("gr", vim.lsp.buf.references, opts)
|
||||
|
||||
remap.nmap("K", vim.lsp.buf.hover, opts)
|
||||
|
||||
remap.nmap("<leader>rn", vim.lsp.buf.rename, opts)
|
||||
remap.nmap("<leader>ca", vim.lsp.buf.code_action, opts)
|
||||
remap.nmap("<leader>ri", function()
|
||||
local diagnostics = vim.diagnostic.get(0)
|
||||
|
||||
-- Filter for TypeScript's unused import diagnostics (code 6133)
|
||||
local unused_imports_diagnostics = {}
|
||||
for _, diagnostic in ipairs(diagnostics) do
|
||||
if diagnostic.code == 6133 and diagnostic.source == "typescript" then
|
||||
table.insert(unused_imports_diagnostics, diagnostic)
|
||||
end
|
||||
end
|
||||
|
||||
vim.lsp.buf.code_action({
|
||||
context = {
|
||||
diagnostics = unused_imports_diagnostics,
|
||||
only = { "source.removeUnusedImports" },
|
||||
},
|
||||
})
|
||||
end, { desc = "Remove unused imports" })
|
||||
|
||||
remap.nmap("[d", vim.diagnostic.goto_prev, opts)
|
||||
remap.nmap("]d", vim.diagnostic.goto_next, opts)
|
||||
remap.nmap("<leader>d", vim.diagnostic.open_float, opts)
|
||||
end,
|
||||
})
|
||||
|
||||
lspconfig.eslint.setup({})
|
||||
lspconfig.html.setup({})
|
||||
lspconfig.cssls.setup({})
|
||||
lspconfig.jsonls.setup({
|
||||
capabilities = capabilities,
|
||||
settings = {
|
||||
json = {
|
||||
schemas = require("schemastore").json.schemas(),
|
||||
validate = { enable = true },
|
||||
allowComments = true,
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
}
|
||||
@@ -1,212 +0,0 @@
|
||||
return {
|
||||
"nvim-tree/nvim-tree.lua",
|
||||
version = "*",
|
||||
lazy = false,
|
||||
keys = {
|
||||
{ "<Leader>et", ":NvimTreeToggle<CR>", desc = "Explorer Toggle", silent = true },
|
||||
{
|
||||
"<Leader>ei",
|
||||
function()
|
||||
require("nvim-tree.api").node.show_info_popup()
|
||||
end,
|
||||
desc = "NvimTree: Info",
|
||||
mode = "n",
|
||||
},
|
||||
},
|
||||
config = function()
|
||||
local function my_on_attach(bufnr)
|
||||
local api = require("nvim-tree.api")
|
||||
|
||||
local function opts(desc)
|
||||
return { desc = "nvim-tree: " .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
|
||||
end
|
||||
|
||||
api.config.mappings.default_on_attach(bufnr)
|
||||
vim.keymap.set("n", "<Leader>et", api.tree.toggle, opts("Open or close the tree"))
|
||||
vim.keymap.set("n", "<Leader>ei", api.node.show_info_popup, opts("Show info popup"))
|
||||
vim.keymap.set("n", "?", api.tree.toggle_help, opts("Help"))
|
||||
|
||||
vim.keymap.del("n", "<C-k>", { buffer = bufnr })
|
||||
end
|
||||
|
||||
require("nvim-tree").setup({
|
||||
on_attach = my_on_attach,
|
||||
hijack_cursor = true,
|
||||
disable_netrw = true,
|
||||
hijack_netrw = true,
|
||||
hijack_unnamed_buffer_when_opening = true,
|
||||
root_dirs = { ".git", "package.json" },
|
||||
prefer_startup_root = true,
|
||||
sync_root_with_cwd = true,
|
||||
reload_on_bufenter = true,
|
||||
respect_buf_cwd = true,
|
||||
view = {
|
||||
centralize_selection = false,
|
||||
cursorline = true,
|
||||
cursorlineopt = "both",
|
||||
debounce_delay = 15,
|
||||
side = "left",
|
||||
preserve_window_proportions = false,
|
||||
number = false,
|
||||
relativenumber = false,
|
||||
signcolumn = "no",
|
||||
width = 30,
|
||||
},
|
||||
renderer = {
|
||||
add_trailing = false,
|
||||
group_empty = false,
|
||||
full_name = false,
|
||||
root_folder_label = false,
|
||||
-- special_files = { "Cargo.toml", "Makefile", "README.md", "readme.md" },
|
||||
special_files = {}, -- keep to overwrite defaults
|
||||
symlink_destination = true,
|
||||
icons = {
|
||||
padding = "",
|
||||
glyphs = {
|
||||
folder = {
|
||||
arrow_closed = "+",
|
||||
arrow_open = "-",
|
||||
},
|
||||
},
|
||||
show = {
|
||||
file = false,
|
||||
folder = false,
|
||||
folder_arrow = true,
|
||||
git = false,
|
||||
modified = false,
|
||||
hidden = false,
|
||||
diagnostics = false,
|
||||
bookmarks = false,
|
||||
},
|
||||
},
|
||||
},
|
||||
hijack_directories = {
|
||||
enable = true,
|
||||
auto_open = true,
|
||||
},
|
||||
update_focused_file = {
|
||||
enable = true,
|
||||
update_root = {
|
||||
enable = true,
|
||||
ignore_list = {},
|
||||
},
|
||||
exclude = false,
|
||||
},
|
||||
filters = {
|
||||
enable = true,
|
||||
git_ignored = true,
|
||||
dotfiles = false,
|
||||
git_clean = false,
|
||||
no_buffer = false,
|
||||
no_bookmark = false,
|
||||
custom = {},
|
||||
exclude = {},
|
||||
},
|
||||
live_filter = {
|
||||
prefix = "[FILTER]: ",
|
||||
always_show_folders = true,
|
||||
},
|
||||
filesystem_watchers = {
|
||||
enable = true,
|
||||
debounce_delay = 50,
|
||||
ignore_dirs = {
|
||||
-- C / C++
|
||||
"/.ccls-cache",
|
||||
"/build",
|
||||
"/out",
|
||||
"/cmake-build-*",
|
||||
|
||||
-- Node.js / Web
|
||||
"/node_modules",
|
||||
"/dist",
|
||||
"/.next",
|
||||
"/.nuxt",
|
||||
"/coverage",
|
||||
"/storybook-static",
|
||||
|
||||
-- Rust
|
||||
"/target",
|
||||
|
||||
-- Java / JVM
|
||||
"/target", -- (Maven)
|
||||
"/build", -- (Gradle)
|
||||
"/out", -- (IDEA / javac)
|
||||
|
||||
-- Python
|
||||
"/.venv",
|
||||
"/venv",
|
||||
"/__pycache__",
|
||||
"/.mypy_cache",
|
||||
"/.pytest_cache",
|
||||
|
||||
-- Go
|
||||
"/bin",
|
||||
"/pkg",
|
||||
|
||||
-- General
|
||||
"/tmp",
|
||||
"/.cache",
|
||||
"/.idea",
|
||||
"/.vscode",
|
||||
"/logs",
|
||||
},
|
||||
},
|
||||
trash = {
|
||||
cmd = "gio trash",
|
||||
},
|
||||
})
|
||||
end,
|
||||
}
|
||||
|
||||
-- return {
|
||||
-- "nvim-neo-tree/neo-tree.nvim",
|
||||
-- version = "*",
|
||||
-- dependencies = {
|
||||
-- "nvim-lua/plenary.nvim",
|
||||
-- "nvim-tree/nvim-web-devicons",
|
||||
-- "MunifTanjim/nui.nvim",
|
||||
-- },
|
||||
-- cmd = "Neotree",
|
||||
-- keys = {
|
||||
-- { "<Leader>et", ":Neotree position=left toggle<CR>", desc = "Explorer Toggle", silent = true },
|
||||
-- { "<Leader>E", ":Neotree focus<CR>", desc = "Explorer Focus", silent = true },
|
||||
-- { "<Leader>ef", ":Neotree float<CR>", desc = "Explorer Float", silent = true },
|
||||
-- { "<Leader>eb", ":Neotree buffers<CR>", desc = "Explorer Buffers", silent = true },
|
||||
-- { "<Leader>eg", ":Neotree git_status<CR>", desc = "Explorer Git", silent = true },
|
||||
-- },
|
||||
-- opts = {
|
||||
-- event_handlers = {
|
||||
-- {
|
||||
-- event = require("neo-tree.ui.events").NEO_TREE_WINDOW_AFTER_OPEN,
|
||||
-- handler = function(args)
|
||||
-- if args and args.winid and vim.api.nvim_win_is_valid(args.winid) then
|
||||
-- vim.api.nvim_win_set_option(args.winid, "colorcolumn", "")
|
||||
-- vim.api.nvim_win_set_option(args.winid, "signcolumn", "no")
|
||||
-- end
|
||||
-- end,
|
||||
-- },
|
||||
-- },
|
||||
-- popup_border_style = "single",
|
||||
-- window = {
|
||||
-- mappings = {
|
||||
-- ["<Leader>e"] = "close_window",
|
||||
-- },
|
||||
-- },
|
||||
-- default_component_configs = {
|
||||
-- icon = { enabled = false },
|
||||
-- git_status = { symbols = {}, align = "none" },
|
||||
-- name = { trailing_slash = true }
|
||||
-- },
|
||||
-- enable_git_status = false,
|
||||
-- enable_diagnostics = false,
|
||||
-- filesystem = {
|
||||
-- follow_current_file = {
|
||||
-- enabled = true, -- Enable this feature
|
||||
-- leave_dirs_open = true, -- Leave directories open when following
|
||||
-- },
|
||||
-- filtered_items = {
|
||||
-- visible = true,
|
||||
-- }
|
||||
-- },
|
||||
-- },
|
||||
-- }
|
||||
125
config/linux-dev/nvim/lua/plugins/syntax.lua
Normal file
125
config/linux-dev/nvim/lua/plugins/syntax.lua
Normal file
@@ -0,0 +1,125 @@
|
||||
vim.keymap.set('n', '<leader>d', vim.diagnostic.open_float, { noremap = true, silent = true })
|
||||
|
||||
vim.diagnostic.config({
|
||||
update_in_insert = false,
|
||||
virtual_text = {
|
||||
prefix = '', -- remove annoying ▎ etc
|
||||
format = function(diagnostic)
|
||||
-- Show the source (e.g. "luacheck", "lua_ls") before the message
|
||||
if diagnostic.source then
|
||||
return string.format('[%s] %s', diagnostic.source, diagnostic.message)
|
||||
end
|
||||
return diagnostic.message
|
||||
end,
|
||||
},
|
||||
float = {
|
||||
border = 'rounded',
|
||||
source = true, -- show source in floating window too
|
||||
},
|
||||
severity_sort = true,
|
||||
})
|
||||
|
||||
vim.lsp.enable({ 'lua_ls' })
|
||||
vim.lsp.enable({ 'json_ls' })
|
||||
|
||||
return {
|
||||
{ 'mason-org/mason.nvim', config = true },
|
||||
-- { 'saghen/blink.cmp', version = '1.*' },
|
||||
{
|
||||
'nvim-treesitter/nvim-treesitter',
|
||||
build = ':TSUpdate',
|
||||
main = 'nvim-treesitter.configs',
|
||||
opts = {
|
||||
highlight = { enable = true },
|
||||
incremental_selection = { enable = true },
|
||||
textobjects = { enable = true },
|
||||
ensure_installed = {
|
||||
-- Documentation
|
||||
'vim',
|
||||
'vimdoc',
|
||||
'markdown',
|
||||
'markdown_inline',
|
||||
-- Data
|
||||
'gitcommit',
|
||||
'gitignore',
|
||||
'dockerfile',
|
||||
'diff',
|
||||
'json',
|
||||
'jsonc',
|
||||
-- Scripting
|
||||
'bash',
|
||||
'lua',
|
||||
'sql',
|
||||
-- Programming
|
||||
'c',
|
||||
'cpp',
|
||||
'go',
|
||||
'rust',
|
||||
'python',
|
||||
-- Web
|
||||
'html',
|
||||
'css',
|
||||
'javascript',
|
||||
'typescript',
|
||||
'tsx',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
'mfussenegger/nvim-lint',
|
||||
event = { 'BufReadPre', 'BufNewFile' },
|
||||
opts = {
|
||||
linters_by_ft = {
|
||||
lua = { 'luacheck' },
|
||||
python = { 'ruff' },
|
||||
javascript = { 'eslint_d' },
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
local lint = require('lint')
|
||||
lint.linters_by_ft = opts.linters_by_ft
|
||||
vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, {
|
||||
group = vim.api.nvim_create_augroup('lint_autocmd', { clear = true }),
|
||||
callback = function()
|
||||
lint.try_lint()
|
||||
end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
{
|
||||
'stevearc/conform.nvim',
|
||||
event = { 'BufWritePre' },
|
||||
opts = {
|
||||
-- Automatically format on save
|
||||
format_on_save = {
|
||||
timeout_ms = 500,
|
||||
lsp_format = 'fallback', -- Use LSP when no formatter is configured
|
||||
},
|
||||
|
||||
-- Formatters per filetype
|
||||
default_format_opts = { stop_after_first = true },
|
||||
formatters_by_ft = {
|
||||
lua = { 'stylua' },
|
||||
sh = { 'shfmt' },
|
||||
swift = { 'swift_format' },
|
||||
python = { 'isort', 'black' },
|
||||
javascript = { 'prettierd', 'prettier' },
|
||||
javascriptreact = { 'prettierd', 'prettier' },
|
||||
typescript = { 'prettierd', 'prettier' },
|
||||
typescriptreact = { 'prettierd', 'prettier' },
|
||||
},
|
||||
},
|
||||
|
||||
config = function(_, opts)
|
||||
require('conform').setup(opts)
|
||||
|
||||
-- Create a command to format manually
|
||||
vim.api.nvim_create_user_command('Format', function()
|
||||
require('conform').format({
|
||||
async = true,
|
||||
lsp_format = 'fallback',
|
||||
})
|
||||
end, { desc = 'Format current buffer' })
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
local remap = require("utils.remap")
|
||||
|
||||
return {
|
||||
"nvim-telescope/telescope.nvim",
|
||||
event = "VimEnter",
|
||||
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,
|
||||
},
|
||||
{ "nvim-telescope/telescope-ui-select.nvim" },
|
||||
-- { "nvim-tree/nvim-web-devicons", enabled = vim.g.have_nerd_font },
|
||||
},
|
||||
config = function()
|
||||
require("telescope").setup({
|
||||
defaults = {
|
||||
layout_strategy = "vertical",
|
||||
layout_config = {
|
||||
width = { 0.95, max = 100 },
|
||||
height = 0.95,
|
||||
preview_cutoff = 1,
|
||||
preview_height = 0.7,
|
||||
},
|
||||
mappings = {
|
||||
n = {
|
||||
["d"] = "delete_buffer",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
pcall(require("telescope").load_extension, "fzf")
|
||||
pcall(require("telescope").load_extension, "ui-select")
|
||||
|
||||
local builtin = require("telescope.builtin")
|
||||
remap.nmap("<leader>sk", builtin.keymaps, { desc = "[S]earch [K]eymaps" })
|
||||
remap.nmap("<leader>sf", builtin.find_files, { desc = "[S]earch [F]iles" })
|
||||
remap.nmap("<leader>sw", builtin.grep_string, { desc = "[S]earch current [W]ord" })
|
||||
remap.nmap("<leader>ss", builtin.current_buffer_fuzzy_find, { desc = "[S]earch [C]urrent file" })
|
||||
remap.nmap("<leader>sg", builtin.live_grep, { desc = "[S]earch by [G]rep" })
|
||||
remap.nmap("<leader>sd", builtin.diagnostics, { desc = "[S]earch [D]iagnostics" })
|
||||
remap.nmap("<leader>sr", builtin.lsp_references, { desc = "[S]earch [R]references" })
|
||||
remap.nmap("<leader>s.", builtin.oldfiles, { desc = '[S]earch Recent Files ("." for repeat)' })
|
||||
-- remap.nmap("<leader>ss", builtin.git_status, { desc = "[S]earch Git [S]tatus" })
|
||||
remap.nmap("<leader><leader>", builtin.buffers, { desc = "Find existing [B]uffers" })
|
||||
end,
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
return {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
build = "TSUpdate",
|
||||
main = "nvim-treesitter.configs",
|
||||
opts = {
|
||||
ensure_installed = {
|
||||
"diff",
|
||||
"lua",
|
||||
"html",
|
||||
"css",
|
||||
"javascript",
|
||||
"typescript",
|
||||
"tsx",
|
||||
"markdown",
|
||||
"markdown_inline",
|
||||
},
|
||||
auto_install = true,
|
||||
highlight = {
|
||||
enable = true,
|
||||
},
|
||||
indent = { enable = true },
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("nvim-treesitter.configs").setup(opts)
|
||||
-- Add MDX filetype detection
|
||||
vim.filetype.add({
|
||||
extension = {
|
||||
mdx = "markdown.mdx",
|
||||
},
|
||||
})
|
||||
end,
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.get(P)
|
||||
local colors = {
|
||||
base = P.white,
|
||||
surface = P.gray_light,
|
||||
outline = P.gray_dark,
|
||||
text = P.black,
|
||||
muted = P.gray,
|
||||
accent = P.blue,
|
||||
accent_light = P.blue_light,
|
||||
syntax = P.slate_indigo,
|
||||
none = "NONE",
|
||||
}
|
||||
|
||||
return vim.tbl_extend("force", P, colors)
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,35 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.get(C)
|
||||
return {
|
||||
Normal = { fg = C.text, bg = C.none },
|
||||
Directory = { fg = C.accent },
|
||||
Question = { fg = C.text },
|
||||
LineNr = { fg = C.muted },
|
||||
CursorLineNr = { fg = C.accent, bold = true },
|
||||
CursorLine = { bg = C.surface },
|
||||
Visual = { bg = C.accent_light },
|
||||
ColorColumn = { bg = C.surface },
|
||||
|
||||
Search = { fg = C.yellow },
|
||||
CurSearch = { fg = C.yellow, bg = C.none, bold = true },
|
||||
IncSearch = { fg = C.yellow, bg = C.none, bold = true },
|
||||
|
||||
MatchParen = { fg = C.accent, bg = C.accent_light, bold = true },
|
||||
EndOfBuffer = { fg = C.base }, -- End-of-buffer marker (~ lines)
|
||||
|
||||
WinSeparator = { fg = C.outline },
|
||||
-- StatusLine = { fg = C.outline, bg = C.none }, -- Active statusline (where filename)
|
||||
StatusLine = { fg = C.base, bg = C.outline, bold = false }, -- Active statusline (where filename)
|
||||
StatusLineNC = { fg = C.base, bg = C.outline, bold = false }, -- Active statusline (where filename)
|
||||
MsgArea = { fg = C.text, bg = C.none }, -- Command-line / message area
|
||||
MsgSeparator = { fg = C.text, bg = C.surface }, -- Separator for messages
|
||||
ModeMsg = { fg = C.text },
|
||||
|
||||
TabLine = { fg = C.muted }, -- Unselected tab
|
||||
TabLineSel = { fg = C.text, bold = true }, -- Selected tab
|
||||
TabLineFill = { bg = C.none }, -- Empty space in the tabline
|
||||
}
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,7 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.get(C)
|
||||
return {}
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,9 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.get(C)
|
||||
return {
|
||||
TelescopeMatching = { fg = C.yellow, bg = C.none, bold = true },
|
||||
}
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,21 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.get(C)
|
||||
return {
|
||||
["@constant.macro"] = { fg = C.syntax },
|
||||
["@function.method"] = { fg = C.syntax },
|
||||
["@type.qualifier"] = { fg = C.syntax },
|
||||
["@variable.parameter"] = { fg = C.syntax },
|
||||
["@variable"] = { fg = C.syntax },
|
||||
["@type.definition"] = { fg = C.syntax },
|
||||
["@markup.italic"] = { fg = C.syntax },
|
||||
["@markup.strong"] = { fg = C.syntax },
|
||||
["@markup.underline"] = { fg = C.syntax },
|
||||
["@markup.strikethrough"] = { fg = C.syntax },
|
||||
|
||||
["@_jsx_attribute"] = { link = "Constant" },
|
||||
["@string.documentation.python"] = { link = "Comment" },
|
||||
}
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,38 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.get(C)
|
||||
return {
|
||||
Comment = { fg = C.muted, italic = true },
|
||||
String = { fg = C.green },
|
||||
Boolean = { fg = C.accent, bold = true, italic = true },
|
||||
Number = { fg = C.accent },
|
||||
|
||||
-- syntax color
|
||||
Constant = { fg = C.syntax },
|
||||
Function = { fg = C.syntax },
|
||||
Type = { fg = C.syntax },
|
||||
Statement = { fg = C.syntax },
|
||||
Identifier = { fg = C.syntax },
|
||||
Operator = { fg = C.syntax },
|
||||
PreProc = { fg = C.syntax },
|
||||
Special = { fg = C.syntax },
|
||||
Delimiter = { fg = C.syntax },
|
||||
Todo = { fg = C.syntax },
|
||||
Title = { fg = C.syntax },
|
||||
Underlined = { fg = C.syntax },
|
||||
|
||||
-- diffs
|
||||
Added = { fg = C.green },
|
||||
Removed = { fg = C.red },
|
||||
Changed = { fg = C.yellow },
|
||||
|
||||
-- diagnostics
|
||||
DiagnosticInfo = { fg = C.blue },
|
||||
DiagnosticWarn = { fg = C.yellow },
|
||||
DiagnosticError = { fg = C.red },
|
||||
DiagnosticDeprecated = { fg = C.magenta },
|
||||
DiagnosticUnderlineError = { fg = C.syntax, underline = true },
|
||||
}
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,31 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.get(C)
|
||||
return {
|
||||
terminal_color_0 = { fg = C.black },
|
||||
terminal_color_8 = { fg = C.black },
|
||||
|
||||
terminal_color_1 = { fg = C.red },
|
||||
terminal_color_9 = { fg = C.red },
|
||||
|
||||
terminal_color_2 = { fg = C.green },
|
||||
terminal_color_10 = { fg = C.green },
|
||||
|
||||
terminal_color_3 = { fg = C.yellow },
|
||||
terminal_color_11 = { fg = C.yellow },
|
||||
|
||||
terminal_color_4 = { fg = C.blue },
|
||||
terminal_color_12 = { fg = C.blue },
|
||||
|
||||
terminal_color_5 = { fg = C.magenta },
|
||||
terminal_color_13 = { fg = C.magenta },
|
||||
|
||||
terminal_color_6 = { fg = C.cyan },
|
||||
terminal_color_14 = { fg = C.cyan },
|
||||
|
||||
terminal_color_7 = { fg = C.white },
|
||||
terminal_color_15 = { fg = C.white },
|
||||
}
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,14 +0,0 @@
|
||||
local M = {
|
||||
name = "invero",
|
||||
variant = "light",
|
||||
mode = "ansi",
|
||||
exclude_integrations = {},
|
||||
}
|
||||
|
||||
function M.load()
|
||||
local setup = require("themes." .. M.name .. ".setup")
|
||||
setup.reset(M)
|
||||
setup.apply(M)
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,53 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
local modes = {
|
||||
ansi = {
|
||||
black = 0,
|
||||
red = 1,
|
||||
green = 2,
|
||||
yellow = 3,
|
||||
blue = 4,
|
||||
magenta = 5,
|
||||
cyan = 6,
|
||||
white = 7,
|
||||
},
|
||||
default = {
|
||||
black = 238,
|
||||
red = 196,
|
||||
green = 35,
|
||||
yellow = 221,
|
||||
blue = 27,
|
||||
magenta = 125,
|
||||
cyan = 30,
|
||||
white = 255,
|
||||
},
|
||||
}
|
||||
|
||||
local shared_palette = {
|
||||
gray_dark = 245,
|
||||
gray = 247,
|
||||
gray_light = 253,
|
||||
orange = 166,
|
||||
orange_light = 180,
|
||||
yellow_light = 180,
|
||||
blue_light = 153,
|
||||
slate_indigo = 60,
|
||||
}
|
||||
|
||||
---Get color palette
|
||||
---@param mode '"ansi"'|'"default"'
|
||||
---@return table
|
||||
function M.get(mode)
|
||||
local mode_palette = modes[mode]
|
||||
if not mode_palette then
|
||||
vim.notify(
|
||||
string.format('Invalid palette mode: "%s" (valid: ansi, default)', tostring(mode)),
|
||||
vim.log.levels.WARN,
|
||||
{ title = "palette" }
|
||||
)
|
||||
mode_palette = modes.default
|
||||
end
|
||||
return vim.tbl_extend("force", mode_palette, shared_palette)
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,72 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.reset(theme)
|
||||
vim.opt.background = (theme.variant == "light") and "light" or "dark"
|
||||
vim.g.colors_name = theme.name
|
||||
end
|
||||
|
||||
local function list_integrations(theme_name)
|
||||
local path = vim.fn.stdpath("config") .. "/lua/themes/" .. theme_name .. "/groups/integrations/"
|
||||
|
||||
local files = {}
|
||||
for name, type in vim.fs.dir(path) do
|
||||
if type == "file" then
|
||||
local mod_name = vim.fn.fnamemodify(name, ":r")
|
||||
table.insert(files, mod_name)
|
||||
end
|
||||
end
|
||||
return files
|
||||
end
|
||||
|
||||
function M.apply(theme)
|
||||
local base = "themes." .. theme.name
|
||||
local P = require(base .. ".palette").get(theme.mode)
|
||||
local C = require(base .. ".colors").get(P)
|
||||
|
||||
local modules = {
|
||||
require(base .. ".groups.editor"),
|
||||
require(base .. ".groups.syntax"),
|
||||
require(base .. ".groups.terminal"),
|
||||
}
|
||||
|
||||
local exclude = theme.exclude_integrations or {}
|
||||
|
||||
local function should_load(name)
|
||||
return not vim.tbl_contains(exclude, name)
|
||||
end
|
||||
|
||||
-- auto-discover integrations
|
||||
for _, plugin in ipairs(list_integrations(theme.name)) do
|
||||
if should_load(plugin) then
|
||||
local ok_mod, mod = pcall(require, base .. ".groups.integrations." .. plugin)
|
||||
if ok_mod then
|
||||
table.insert(modules, mod)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Apply highlights
|
||||
for _, mod in ipairs(modules) do
|
||||
local groups = mod.get(C) or {}
|
||||
for group, opts in pairs(groups) do
|
||||
if type(opts) ~= "table" then
|
||||
print("Non-table opts detected in group:", group, "value:", vim.inspect(opts))
|
||||
end
|
||||
local hl = {}
|
||||
|
||||
for k, v in pairs(opts) do
|
||||
if k == "fg" then
|
||||
hl.ctermfg = v
|
||||
elseif k == "bg" then
|
||||
hl.ctermbg = v
|
||||
else
|
||||
hl[k] = v -- bold, italic, underline, sp, etc.
|
||||
end
|
||||
end
|
||||
|
||||
vim.api.nvim_set_hl(0, group, hl)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return M
|
||||
@@ -1,39 +0,0 @@
|
||||
local M = {}
|
||||
|
||||
function M.map(mode, lhs, rhs, opts)
|
||||
local options = { silent = true, noremap = true }
|
||||
|
||||
if opts then
|
||||
options = vim.tbl_extend("force", options, opts)
|
||||
end
|
||||
|
||||
if type(mode) == "table" then
|
||||
for _, m in ipairs(mode) do
|
||||
vim.keymap.set(m, lhs, rhs, options)
|
||||
end
|
||||
else
|
||||
vim.keymap.set(mode, lhs, rhs, options)
|
||||
end
|
||||
end
|
||||
|
||||
function M.nmap(lhs, rhs, opts)
|
||||
M.map("n", lhs, rhs, opts)
|
||||
end
|
||||
|
||||
function M.imap(lhs, rhs, opts)
|
||||
M.map("i", lhs, rhs, opts)
|
||||
end
|
||||
|
||||
function M.vmap(lhs, rhs, opts)
|
||||
M.map("v", lhs, rhs, opts)
|
||||
end
|
||||
|
||||
function M.tmap(lhs, rhs, opts)
|
||||
M.map("t", lhs, rhs, opts)
|
||||
end
|
||||
|
||||
function M.cmap(lhs, rhs, opts)
|
||||
M.map("c", lhs, rhs, opts)
|
||||
end
|
||||
|
||||
return M
|
||||
Reference in New Issue
Block a user