diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fc8749f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +./pack +./nvim-pack-lock.json + diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..d8e8499 --- /dev/null +++ b/init.lua @@ -0,0 +1,5 @@ +require("options") +require("keymaps") +require("floating-terminal") +require("package-installs") +require("myplugs") diff --git a/lua/floating-terminal.lua b/lua/floating-terminal.lua new file mode 100644 index 0000000..2493134 --- /dev/null +++ b/lua/floating-terminal.lua @@ -0,0 +1,86 @@ +vim.api.nvim_create_autocmd("TermClose", { + group = augroup, + callback = function() + if vim.v.event.status == 0 then + vim.api.nvim_buf_delete(0, {}) + end + end, +}) + +vim.api.nvim_create_autocmd("TermOpen", { + group = augroup, + callback = function() + vim.opt_local.number = false + vim.opt_local.relativenumber = false + vim.opt_local.signcolumn = "no" + end, +}) + +local terminal_state = { buf = nil, win = nil, is_open = false } + +local function FloatingTerminal() + if terminal_state.is_open and terminal_state.win and vim.api.nvim_win_is_valid(terminal_state.win) then + vim.api.nvim_win_close(terminal_state.win, false) + terminal_state.is_open = false + return + end + + if not terminal_state.buf or not vim.api.nvim_buf_is_valid(terminal_state.buf) then + terminal_state.buf = vim.api.nvim_create_buf(false, true) + vim.bo[terminal_state.buf].bufhidden = "hide" + end + + local width = math.floor(vim.o.columns * 0.8) + local height = math.floor(vim.o.lines * 0.8) + local row = math.floor((vim.o.lines - height) / 2) + local col = math.floor((vim.o.columns - width) / 2) + + terminal_state.win = vim.api.nvim_open_win(terminal_state.buf, true, { + relative = "editor", + width = width, + height = height, + row = row, + col = col, + style = "minimal", + border = "rounded", + }) + + vim.wo[terminal_state.win].winblend = 0 + vim.wo[terminal_state.win].winhighlight = "Normal:FloatingTermNormal,FloatBorder:FloatingTermBorder" + vim.api.nvim_set_hl(0, "FloatingTermNormal", { bg = "none" }) + vim.api.nvim_set_hl(0, "FloatingTermBorder", { bg = "none" }) + + local has_terminal = false + local lines = vim.api.nvim_buf_get_lines(terminal_state.buf, 0, -1, false) + for _, line in ipairs(lines) do + if line ~= "" then + has_terminal = true + break + end + end + if not has_terminal then + vim.fn.termopen(os.getenv("SHELL")) + end + + terminal_state.is_open = true + vim.cmd("startinsert") + + vim.api.nvim_create_autocmd("BufLeave", { + buffer = terminal_state.buf, + callback = function() + if terminal_state.is_open and terminal_state.win and vim.api.nvim_win_is_valid(terminal_state.win) then + vim.api.nvim_win_close(terminal_state.win, false) + terminal_state.is_open = false + end + end, + once = true, + }) +end + +vim.keymap.set("n", "t", FloatingTerminal, { noremap = true, silent = true, desc = "Toggle floating terminal" }) +vim.keymap.set("t", "", function() + if terminal_state.is_open and terminal_state.win and vim.api.nvim_win_is_valid(terminal_state.win) then + vim.api.nvim_win_close(terminal_state.win, false) + terminal_state.is_open = false + end +end, { noremap = true, silent = true, desc = "Close floating terminal" }) diff --git a/lua/keymaps.lua b/lua/keymaps.lua new file mode 100644 index 0000000..38480a8 --- /dev/null +++ b/lua/keymaps.lua @@ -0,0 +1,34 @@ +vim.g.mapleader = " " + +vim.keymap.set('i', 'jj', '', { desc = 'Exit Insert mode' }) +vim.keymap.set('n', 'w', ':w', { desc = 'Write changes' }) +vim.keymap.set('n', 'c', ':nohlsearch', { desc = 'Clear search highlights' }) + +vim.keymap.set('n', 'x', '"_d', { desc = 'Delete without yanking' }) +vim.keymap.set('n', 'bp', ':bprevious', { desc = 'Previous buffet' }) +vim.keymap.set('n', 'bn', ':bnext', { desc = 'Next buffer' }) +vim.keymap.set('n', 'bd', ':bdelete', { desc = 'Remove current buffer' }) + + +vim.keymap.set('n', '', 'h', { desc = 'Move between windows left' }) +vim.keymap.set('n', '', 'j', { desc = 'Move between windows bottom' }) +vim.keymap.set('n', '', 'k', { desc = 'Move between windows up' }) +vim.keymap.set('n', '', 'l', { desc = 'Move between windows rigth' }) + +vim.keymap.set('n', 'sv', ':vsplit', { desc = 'Split vertically' }) +vim.keymap.set('n', 'sh', ':split', { desc = 'Split window horizontally' }) + +vim.keymap.set('n', '', ':resize +2', { desc = 'Split window horizontally' }) +vim.keymap.set('n', '', ':resize -2', { desc = 'Split window horizontally' }) +vim.keymap.set('n', '', ':vertical resize -2', { desc = 'Split window horizontally' }) +vim.keymap.set('n', '', ':vertical resize +2', { desc = 'Split window horizontally' }) + +vim.keymap.set('n', '', ":m .+1==", { desc = 'Split window horizontally' }) +vim.keymap.set('n', '', ":m .-2==", { desc = 'Split window horizontally' }) +vim.keymap.set('v', '', ":m '>+1gv=gv", { desc = 'Split window horizontally' }) +vim.keymap.set('v', '', ":m '<-2gv=gv", { desc = 'Split window horizontally' }) + +vim.keymap.set("n", "e", vim.diagnostic.open_float, { desc = "Show diagnostic" }) +vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, { desc = "Prev diagnostic" }) +vim.keymap.set("n", "]d", vim.diagnostic.goto_next, { desc = "Next diagnostic" }) +vim.keymap.set("n", "q", vim.diagnostic.setloclist, { desc = "Diagnostic list" }) diff --git a/lua/lsp/lsp-setup.lua b/lua/lsp/lsp-setup.lua new file mode 100644 index 0000000..3ee9c79 --- /dev/null +++ b/lua/lsp/lsp-setup.lua @@ -0,0 +1,83 @@ +require("mason").setup() +require("mason-lspconfig").setup({ + ensure_installed = { "eslint", "stylua", "vue_ls", "ts_ls" }, +}) + +local function on_attach(_, bufnr) + vim.keymap.set("n", "gd", vim.lsp.buf.definition, { buffer = bufnr, desc = "Go to definition" }) +end + +vim.lsp.config("eslint", { + settings = { + workingDirectories = { mode = "auto" }, + format = true, -- Disable if using null-ls or Prettier + }, + on_attach = function(client, bufnr) + on_attach(client, bufnr) + vim.api.nvim_create_autocmd("BufWritePre", { + buffer = bufnr, + callback = function(args) + require("conform").format({ bufnr = args.buf }) + end, + }) + end, +}) + +vim.lsp.config("lua_ls", { + settings = { + Lua = { + runtime = { verstion = "LuaJIT" }, + workspace = { + checkThirdParty = false, + library = vim.api.nvim_get_runtime_file("", true), + }, + diagnostics = { + globals = { "vim" }, + }, + }, + }, +}) + +vim.lsp.config("intelephense", { + settings = { + intelephense = { + files = { + maxSize = 2000000, + }, + }, + }, + on_attach = on_attach(), +}) + +vim.lsp.config("vue_ls", {}) + +vim.lsp.config("ts_ls", { + init_options = { + plugins = { + { + name = "@vue/typescript-plugin", + location = vim.fn.expand( + "$HOME/.local/share/nvim/mason/packages/vue-language-server/node_modules/@vue/language-server" + ), + languages = { "vue" }, + }, + }, + }, + filetypes = { "typescript", "javascript", "javascriptreact", "typescriptreact", "vue" }, + on_attach = on_attach(), +}) + +vim.diagnostic.config({ + virtual_text = true, + underlin = true, +}) + +vim.lsp.enable({ + "eslint", + "lua_ls", + "tailwindcss", + "intelephense", + "laravel_ls", + "vue_ls", + "ts_ls", +}) diff --git a/lua/myplugs.lua b/lua/myplugs.lua new file mode 100644 index 0000000..fac2508 --- /dev/null +++ b/lua/myplugs.lua @@ -0,0 +1,10 @@ +require("plugins/fzf") +require("plugins/gitsigns") +require("plugins/blink") +require("plugins/conform") +require("plugins/autotag") +require("plugins/autopair") +require("plugins/diffview") +require("plugins/copilot") + +require("lsp/lsp-setup") diff --git a/lua/options.lua b/lua/options.lua new file mode 100644 index 0000000..8da20ec --- /dev/null +++ b/lua/options.lua @@ -0,0 +1,252 @@ +vim.cmd(":colorscheme catppuccin") + +vim.opt.number = true +vim.opt.relativenumber = true + +vim.opt.splitbelow = true +vim.opt.splitright = true + +-- Treat hyphens as word separators so this-word becomes two words +vim.opt.iskeyword:remove("-") + +-- Set tab width and use spaces instead of tabs +vim.opt.tabstop = 2 +vim.opt.shiftwidth = 2 +vim.opt.expandtab = true + +-- Enable copying to clipboard +vim.opt.clipboard = "unnamedplus" + +vim.opt.scrolloff = 999 + +-- Enable syntax highlighting and smart indentation +vim.opt.syntax = "on" +vim.opt.smartindent = true + +-- Highlight the current line +vim.opt.cursorline = true + +-- Makes the virtual edit move and select where there is no character +vim.opt.virtualedit = "block" + +vim.opt.inccommand = "split" + +vim.opt.ignorecase = true + +vim.opt.termguicolors = true + +vim.opt.smartindent = true +vim.opt.autoindent = true +vim.opt.signcolumn = "yes" +vim.opt.colorcolumn = "100" + +-- vim.opt.showmatch = true +vim.opt.cmdheight = 1 +vim.opt.completeopt = "menuone,noinsert,noselect" +vim.opt.showmode = false + +local undodir = vim.fn.expand("~/.vim/undodir") +if vim.fn.isdirectory(undodir) == 0 then + vim.fn.mkdir(undodir, "p") +end + +vim.opt.undodir = undodir +vim.opt.updatetime = 300 +vim.opt.timeoutlen = 500 +vim.opt.ttimeoutlen = 0 +vim.opt.autoread = true +vim.opt.autowrite = false + +vim.opt.hidden = true -- allow hidden buffers +vim.opt.errorbells = false +--vim.opt.backspace = "indent,eal,start" -- better backspace behaviour +vim.opt.autochdir = false +vim.opt.selection = "inclusive" +vim.opt.wrap = false + +-- ============================================================================ +-- STATUSLINE +-- ============================================================================ + +-- Git branch function with caching and Nerd Font icon +local cached_branch = "" +local last_check = 0 +local function git_branch() + local now = vim.loop.now() + if now - last_check > 5000 then -- Check every 5 seconds + cached_branch = vim.fn.system("git branch --show-current 2>/dev/null | tr -d '\n'") + last_check = now + end + if cached_branch ~= "" then + return " \u{e725} " .. cached_branch .. " " -- nf-dev-git_branch + end + return "" +end + +-- File type with Nerd Font icon +local function file_type() + local ft = vim.bo.filetype + local icons = { + lua = "\u{e620} ", -- nf-dev-lua + python = "\u{e73c} ", -- nf-dev-python + javascript = "\u{e74e} ", -- nf-dev-javascript + typescript = "\u{e628} ", -- nf-dev-typescript + javascriptreact = "\u{e7ba} ", + typescriptreact = "\u{e7ba} ", + html = "\u{e736} ", -- nf-dev-html5 + css = "\u{e749} ", -- nf-dev-css3 + scss = "\u{e749} ", + json = "\u{e60b} ", -- nf-dev-json + markdown = "\u{e73e} ", -- nf-dev-markdown + vim = "\u{e62b} ", -- nf-dev-vim + sh = "\u{f489} ", -- nf-oct-terminal + bash = "\u{f489} ", + zsh = "\u{f489} ", + rust = "\u{e7a8} ", -- nf-dev-rust + go = "\u{e724} ", -- nf-dev-go + c = "\u{e61e} ", -- nf-dev-c + cpp = "\u{e61d} ", -- nf-dev-cplusplus + java = "\u{e738} ", -- nf-dev-java + php = "\u{e73d} ", -- nf-dev-php + ruby = "\u{e739} ", -- nf-dev-ruby + swift = "\u{e755} ", -- nf-dev-swift + kotlin = "\u{e634} ", + dart = "\u{e798} ", + elixir = "\u{e62d} ", + haskell = "\u{e777} ", + sql = "\u{e706} ", + yaml = "\u{f481} ", + toml = "\u{e615} ", + xml = "\u{f05c} ", + dockerfile = "\u{f308} ", -- nf-linux-docker + gitcommit = "\u{f418} ", -- nf-oct-git_commit + gitconfig = "\u{f1d3} ", -- nf-fa-git + vue = "\u{fd42} ", -- nf-md-vuejs + svelte = "\u{e697} ", + astro = "\u{e628} ", + } + + if ft == "" then + return " \u{f15b} " -- nf-fa-file_o + end + + return ((icons[ft] or " \u{f15b} ") .. ft) +end + +-- File size with Nerd Font icon +local function file_size() + local size = vim.fn.getfsize(vim.fn.expand("%")) + if size < 0 then + return "" + end + local size_str + if size < 1024 then + size_str = size .. "B" + elseif size < 1024 * 1024 then + size_str = string.format("%.1fK", size / 1024) + else + size_str = string.format("%.1fM", size / 1024 / 1024) + end + return " \u{f016} " .. size_str .. " " -- nf-fa-file_o +end + +-- Mode indicators with Nerd Font icons +local function mode_icon() + local mode = vim.fn.mode() + local modes = { + n = " \u{f121} NORMAL", + i = " \u{f11c} INSERT", + v = " \u{f0168} VISUAL", + V = " \u{f0168} V-LINE", + ["\22"] = " \u{f0168} V-BLOCK", + c = " \u{f120} COMMAND", + s = " \u{f0c5} SELECT", + S = " \u{f0c5} S-LINE", + ["\19"] = " \u{f0c5} S-BLOCK", + R = " \u{f044} REPLACE", + r = " \u{f044} REPLACE", + ["!"] = " \u{f489} SHELL", + t = " \u{f120} TERMINAL", + } + return modes[mode] or (" \u{f059} " .. mode) +end + +_G.mode_icon = mode_icon +_G.git_branch = git_branch +_G.file_type = file_type +_G.file_size = file_size + +vim.cmd([[ + highlight StatusLineBold gui=bold cterm=bold +]]) + +-- Function to change statusline based on window focus +local function setup_dynamic_statusline() + vim.api.nvim_create_autocmd({ "WinEnter", "BufEnter" }, { + callback = function() + vim.opt_local.statusline = table.concat({ + " ", + "%#StatusLineBold#", + "%{v:lua.mode_icon()}", + "%#StatusLine#", + " \u{e0b1} %f %h%m%r", -- nf-pl-left_hard_divider + "%{v:lua.git_branch()}", + "\u{e0b1} ", -- nf-pl-left_hard_divider + "%{v:lua.file_type()}", + "\u{e0b1} ", -- nf-pl-left_hard_divider + "%{v:lua.file_size()}", + "%=", -- Right-align everything after this + " \u{f017} %l:%c %P ", -- nf-fa-clock_o for line/col + }) + end, + }) + vim.api.nvim_set_hl(0, "StatusLineBold", { bold = true }) + + vim.api.nvim_create_autocmd({ "WinLeave", "BufLeave" }, { + callback = function() + vim.opt_local.statusline = " %f %h%m%r \u{e0b1} %{v:lua.file_type()} %= %l:%c %P " + end, + }) +end + +setup_dynamic_statusline() + +-- highlight yanked text +vim.api.nvim_create_autocmd("TextYankPost", { + group = augroup, + callback = function() + vim.hl.on_yank() + end, +}) + +-- return to last cursor position +vim.api.nvim_create_autocmd("BufReadPost", { + group = augroup, + desc = "Restore last cursor position", + callback = function() + if vim.o.diff then -- except in diff mode + return + end + + local last_pos = vim.api.nvim_buf_get_mark(0, '"') -- {line, col} + local last_line = vim.api.nvim_buf_line_count(0) + + local row = last_pos[1] + if row < 1 or row > last_line then + return + end + + pcall(vim.api.nvim_win_set_cursor, 0, last_pos) + end, +}) + +-- wrap, linebreak and spellcheck on markdown and text files +vim.api.nvim_create_autocmd("FileType", { + group = augroup, + pattern = { "markdown", "text", "gitcommit" }, + callback = function() + vim.opt_local.wrap = true + vim.opt_local.linebreak = true + vim.opt_local.spell = true + end, +}) diff --git a/lua/package-installs.lua b/lua/package-installs.lua new file mode 100644 index 0000000..d0d181b --- /dev/null +++ b/lua/package-installs.lua @@ -0,0 +1,49 @@ +vim.pack.add({ + "https://github.com/ibhagwan/fzf-lua", + { + src = "https://github.com/nvim-treesitter/nvim-treesitter", + branch = "main", + build = ":TSUpdate", + }, + "https://github.com/mason-org/mason.nvim", + "https://github.com/neovim/nvim-lspconfig", + "https://github.com/lewis6991/gitsigns.nvim", + "https://github.com/mason-org/mason-lspconfig.nvim", + { + src = "https://github.com/saghen/blink.cmp", + version = vim.version.range("^1"), + }, + "https://github.com/stevearc/conform.nvim", + "https://github.com/windwp/nvim-ts-autotag", + "https://github.com/nvim-lua/plenary.nvim.git", + "https://github.com/CopilotC-Nvim/CopilotChat.nvim", + "https://github.com/windwp/nvim-autopairs", + "https://github.com/sindrets/diffview.nvim", + -- Color schemes +}) + +local function packadd(name) + vim.cmd("packadd " .. name) +end + +packadd("fzf-lua") +packadd("nvim-treesitter") +packadd("mason.nvim") +packadd("nvim-lspconfig") +packadd("gitsigns.nvim") +packadd("mason-lspconfig.nvim") +packadd("blink.cmp") +packadd("nvim-ts-autotag") +packadd("plenary.nvim") +packadd("CopilotChat.nvim") +packadd("nvim-autopairs") +packadd("diffview.nvim") +----------------- +-- CONFORM added directly to .local/share/nvim/site/pack/conform/start/conform.nvim +-- from Git repo +-- +-- git clone --depth=1 https://github.com/stevearc/conform.nvim.git "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/pack/conform/start/conform.nvim +-- +----------------- + +-- Color schemes diff --git a/lua/plugins/autopair.lua b/lua/plugins/autopair.lua new file mode 100644 index 0000000..7faf5be --- /dev/null +++ b/lua/plugins/autopair.lua @@ -0,0 +1 @@ +require("nvim-autopairs").setup({}) diff --git a/lua/plugins/autotag.lua b/lua/plugins/autotag.lua new file mode 100644 index 0000000..fb157ba --- /dev/null +++ b/lua/plugins/autotag.lua @@ -0,0 +1,16 @@ +require("nvim-ts-autotag").setup({ + opts = { + -- Defaults + enable_close = true, -- Auto close tags + enable_rename = true, -- Auto rename pairs of tags + enable_close_on_slash = false, -- Auto close on trailing "] = { "accept", "fallback" }, + [""] = { "show" }, + }, + appearance = { + nerd_font_variant = "mono", + }, + sources = { + default = { "lsp", "path", "snippets", "buffer" }, + }, + completion = { + documentation = { + auto_show = true, + auto_show_delay_ms = 200, + }, + accept = { + auto_brackets = { enabled = true }, + }, + }, +}) diff --git a/lua/plugins/conform.lua b/lua/plugins/conform.lua new file mode 100644 index 0000000..6334a5d --- /dev/null +++ b/lua/plugins/conform.lua @@ -0,0 +1,16 @@ +require("conform").setup({ + formatter_by_ft = { + lua = { "stylua" }, + javascript = { "prettierd", "prettier", stop_after_first = true }, + json = { "prettierd", "prettier", stop_after_first = true }, + vue = { "prettierd", "prettier", stop_after_first = true }, + php = { "pint" }, + }, + format_on_save = { + timeout_ms = 500, + lsp_format = "fallback", + }, + default_format_ops = { + lsp_format = "fallback", + }, +}) diff --git a/lua/plugins/copilot.lua b/lua/plugins/copilot.lua new file mode 100644 index 0000000..5f7b9ea --- /dev/null +++ b/lua/plugins/copilot.lua @@ -0,0 +1,39 @@ +require("CopilotChat").setup({ + providers = { + my_mac = { + get_url = function(otps) + return "http://192.168.8.10:11434/v1" + end, + get_models = function() + return { { id = "qwen2.5:14b" } } + end, + prepare_input = require("CopilotChat.config.providers").copilot.prepare_input, + prepare_output = require("CopilotChat.config.providers").copilot.prepare_output, + }, + }, +}) + +vim.g.copilot_no_tab_map = true + +vim.g.copilot_enabled = false + +vim.keymap.set("n", "cc", ":CopilotChat", { desc = "Open Copilot Chat" }) +vim.keymap.set("n", "cr", ":CopilotChatRestart", { desc = "Restart Copilot Chat" }) +vim.keymap.set("n", "cs", ":CopilotChatStop", { desc = "Stop Copilot Chat" }) +vim.keymap.set("n", "ca", ":CopilotChatAccept", { desc = "Accept Copilot Chat Suggestion" }) +vim.keymap.set("n", "cn", ":CopilotChatNext", { desc = "Next Copilot Chat Suggestion" }) +vim.keymap.set("n", "cp", ":CopilotChatPrev", { desc = "Previous Copilot Chat Suggestion" }) +vim.keymap.set("n", "cd", ":CopilotChatClose", { desc = "Dismiss Copilot Chat" }) + +local function toggle_copilot() + local copilot_enabled = vim.g.copilot_enabled + if copilot_enabled == 1 then + vim.cmd("Copilot disable") + print("Copilot disabled") + else + vim.cmd("Copilot enable") + print("Copilot enabled") + end +end + +vim.keymap.set("n", "ct", toggle_copilot, { desc = "Toggle Copilot" }) diff --git a/lua/plugins/diffview.lua b/lua/plugins/diffview.lua new file mode 100644 index 0000000..857706d --- /dev/null +++ b/lua/plugins/diffview.lua @@ -0,0 +1,5 @@ +require("diffview").setup({}) + +vim.keymap.set("n", "do", ":DiffviewOpen") +vim.keymap.set("n", "dc", ":DiffviewClose") +vim.keymap.set("n", "dh", ":DiffviewFileHistory") diff --git a/lua/plugins/fzf.lua b/lua/plugins/fzf.lua new file mode 100644 index 0000000..3de70fe --- /dev/null +++ b/lua/plugins/fzf.lua @@ -0,0 +1,23 @@ +require("fzf-lua").setup({}) + +-- FZF-KEYMAPS +vim.keymap.set("n", "ff", function() + require("fzf-lua").files() +end, { desc = "FZF Files" }) +vim.keymap.set("n", "fg", function() + require("fzf-lua").live_grep() +end, { desc = "FZF Live Grep" }) +vim.keymap.set("n", "fb", function() + require("fzf-lua").buffers() +end, { desc = "FZF Buffers" }) +vim.keymap.set("n", "fh", function() + require("fzf-lua").help_tags() +end, { desc = "FZF Help Tags" }) +vim.keymap.set("n", "fx", function() + require("fzf-lua").diagnostics_document() +end, { desc = "FZF Diagnostics Document" }) +vim.keymap.set("n", "fX", function() + require("fzf-lua").diagnostics_workspace() +end, { desc = "FZF Diagnostics Workspace" }) + + diff --git a/lua/plugins/gitsigns.lua b/lua/plugins/gitsigns.lua new file mode 100644 index 0000000..1d4fa56 --- /dev/null +++ b/lua/plugins/gitsigns.lua @@ -0,0 +1,76 @@ +require("gitsigns").setup({ + signs = { + add = { text = "\u{2590}" }, -- ▏ + change = { text = "\u{2590}" }, -- ▐ + delete = { text = "\u{2590}" }, -- ◦ + topdelete = { text = "\u{25e6}" }, -- ◦ + changedelete = { text = "\u{25cf}" }, -- ● + untracked = { text = "\u{25cb}" }, -- ○ + }, + signcolumn = true, + current_line_blame = false, + + on_attach = function(bufnr) + local gitsigns = require('gitsigns') + + local function map(mode, l, r, opts) + opts = opts or {} + opts.buffer = bufnr + vim.keymap.set(mode, l, r, opts) + end + + -- Navigation + map('n', ']c', function() + if vim.wo.diff then + vim.cmd.normal({']c', bang = true}) + else + gitsigns.nav_hunk('next') + end + end) + + map('n', '[c', function() + if vim.wo.diff then + vim.cmd.normal({'[c', bang = true}) + else + gitsigns.nav_hunk('prev') + end + end) + + -- Actions + map('n', 'hs', gitsigns.stage_hunk) + map('n', 'hr', gitsigns.reset_hunk) + + map('v', 'hs', function() + gitsigns.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') }) + end) + + map('v', 'hr', function() + gitsigns.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') }) + end) + + map('n', 'hS', gitsigns.stage_buffer) + map('n', 'hR', gitsigns.reset_buffer) + map('n', 'hp', gitsigns.preview_hunk) + map('n', 'hi', gitsigns.preview_hunk_inline) + + map('n', 'hb', function() + gitsigns.blame_line({ full = true }) + end) + + map('n', 'hd', gitsigns.diffthis) + + map('n', 'hD', function() + gitsigns.diffthis('~') + end) + + map('n', 'hQ', function() gitsigns.setqflist('all') end) + map('n', 'hq', gitsigns.setqflist) + + -- Toggles + map('n', 'tb', gitsigns.toggle_current_line_blame) + map('n', 'tw', gitsigns.toggle_word_diff) + + -- Text object + map({'o', 'x'}, 'ih', gitsigns.select_hunk) + end +}) diff --git a/nvim-pack-lock.json b/nvim-pack-lock.json new file mode 100644 index 0000000..cd551a6 --- /dev/null +++ b/nvim-pack-lock.json @@ -0,0 +1,57 @@ +{ + "plugins": { + "CopilotChat.nvim": { + "rev": "137d3bc527518f5ea982c43c43084496732365c3", + "src": "https://github.com/CopilotC-Nvim/CopilotChat.nvim" + }, + "blink.cmp": { + "rev": "78336bc89ee5365633bcf754d93df01678b5c08f", + "src": "https://github.com/saghen/blink.cmp", + "version": "1.0.0 - 2.0.0" + }, + "conform.nvim": { + "rev": "18aeab3d63d350dcf44d64c462cc489a3412af40", + "src": "https://github.com/stevearc/conform.nvim" + }, + "diffview.nvim": { + "rev": "4516612fe98ff56ae0415a259ff6361a89419b0a", + "src": "https://github.com/sindrets/diffview.nvim" + }, + "fzf-lua": { + "rev": "311a630292310ea3bfe46dd616e17f283e975801", + "src": "https://github.com/ibhagwan/fzf-lua" + }, + "gitsigns.nvim": { + "rev": "dd3f588bacbeb041be6facf1742e42097f62165d", + "src": "https://github.com/lewis6991/gitsigns.nvim" + }, + "mason-lspconfig.nvim": { + "rev": "7b01e2974a47d489bb92f47a41e4c0088ea8f86e", + "src": "https://github.com/mason-org/mason-lspconfig.nvim" + }, + "mason.nvim": { + "rev": "8e921c2b68571e978db5d4d3fef9c9a7f8755473", + "src": "https://github.com/mason-org/mason.nvim" + }, + "nvim-autopairs": { + "rev": "7b9923abad60b903ece7c52940e1321d39eccc79", + "src": "https://github.com/windwp/nvim-autopairs" + }, + "nvim-lspconfig": { + "rev": "8f7e64066e2641d5e7d494962a9c7051e3d38dd5", + "src": "https://github.com/neovim/nvim-lspconfig" + }, + "nvim-treesitter": { + "rev": "4916d6592ede8c07973490d9322f187e07dfefac", + "src": "https://github.com/nvim-treesitter/nvim-treesitter" + }, + "nvim-ts-autotag": { + "rev": "88c1453db4ba7dd24131086fe51fdf74e587d275", + "src": "https://github.com/windwp/nvim-ts-autotag" + }, + "plenary.nvim": { + "rev": "74b06c6c75e4eeb3108ec01852001636d85a932b", + "src": "https://github.com/nvim-lua/plenary.nvim.git" + } + } +} diff --git a/pack/github/start/copilot.vim b/pack/github/start/copilot.vim new file mode 160000 index 0000000..a12fd56 --- /dev/null +++ b/pack/github/start/copilot.vim @@ -0,0 +1 @@ +Subproject commit a12fd5672110c8aa7e3c8419e28c96943ca179be