diff --git a/lua/cargdev/core/keymaps.lua b/lua/cargdev/core/keymaps.lua index ea15751..6b40e0e 100644 --- a/lua/cargdev/core/keymaps.lua +++ b/lua/cargdev/core/keymaps.lua @@ -86,3 +86,18 @@ keymap.set("n", "ct", "(git-conflict-theirs)", { desc = "Choose th keymap.set("n", "cb", "(git-conflict-both)", { desc = "Choose both (git conflict)" }) keymap.set("n", "c0", "(git-conflict-none)", { desc = "Choose none (git conflict)" }) keymap.set("n", "cq", "(git-conflict-list)", { desc = "List all git conflicts" }) + +-- LeetCode Mappings +keymap.set("n", "lr", "Leet run", { desc = "LeetCode: Run Code" }) +keymap.set("n", "ls", "Leet submit", { desc = "LeetCode: Submit Code" }) +keymap.set("n", "ld", "Leet daily", { desc = "LeetCode: Daily Challenge" }) +keymap.set("n", "ll", "Leet list", { desc = "LeetCode: List Problems" }) +keymap.set("n", "lc", "Leet console", { desc = "LeetCode: Open Console" }) +keymap.set("n", "lu", "Leet cookie update", { desc = "LeetCode: Update Cookie" }) + +-- Copilot +-- Add key map on normal mode to open copilot panel on c + tab +keymap.set("n", "cp", ":Copilot panel", { desc = "Copilot: Open copilot panel" }) + +-- Add key map on normal mode to open copilot chat explain on c + shift + e +keymap.set("n", "ce", ":CopilotChatExplain", { desc = "Copilot Chat: Explain code" }) diff --git a/lua/cargdev/plugins/buffertabs.lua b/lua/cargdev/plugins/buffertabs.lua deleted file mode 100644 index 42a6027..0000000 --- a/lua/cargdev/plugins/buffertabs.lua +++ /dev/null @@ -1,12 +0,0 @@ -return { - "ap/vim-buftabline", - event = "VeryLazy", -- Loads when Neovim starts up - config = function() - -- Enable the buffer tabline - vim.g.buftabline_numbers = 2 -- Shows buffer numbers - vim.g.buftabline_separators = 1 -- Shows separators between tabs - vim.g.buftabline_indicators = 1 -- Show indicators for modified buffers - vim.g.buftabline_show = 1 -- 0: never, 1: always, 2: auto-hide when only one buffer - vim.g.buftabline_modified_indicator = "[+]" -- Custom indicator for modified buffers - end, -} diff --git a/lua/cargdev/plugins/buffertabs.lua.bak b/lua/cargdev/plugins/buffertabs.lua.bak new file mode 100644 index 0000000..5c04112 --- /dev/null +++ b/lua/cargdev/plugins/buffertabs.lua.bak @@ -0,0 +1,12 @@ +-- return { +-- "ap/vim-buftabline", +-- event = "VeryLazy", -- Loads when Neovim starts up +-- config = function() +-- -- Enable the buffer tabline +-- vim.g.buftabline_numbers = 2 -- Shows buffer numbers +-- vim.g.buftabline_separators = 1 -- Shows separators between tabs +-- vim.g.buftabline_indicators = 1 -- Show indicators for modified buffers +-- vim.g.buftabline_show = 1 -- 0: never, 1: always, 2: auto-hide when only one buffer +-- vim.g.buftabline_modified_indicator = "[+]" -- Custom indicator for modified buffers +-- end, +-- } diff --git a/lua/cargdev/plugins/copilot.lua b/lua/cargdev/plugins/copilot.lua index d8979e2..994b60d 100644 --- a/lua/cargdev/plugins/copilot.lua +++ b/lua/cargdev/plugins/copilot.lua @@ -6,6 +6,7 @@ return { enabled = true, config = function() require("copilot").setup({ + -- General settings panel = { enabled = true, auto_refresh = false, @@ -14,7 +15,6 @@ return { jump_next = "]]", accept = "", refresh = "gr", - open = "", }, layout = { position = "bottom", -- | top | left | right | horizontal | vertical @@ -22,12 +22,12 @@ return { }, }, suggestion = { - enabled = false, + enabled = true, auto_trigger = false, debounce = 75, - trigger_on_accept = true, + trigger_on_accept = false, keymap = { - accept = "", -- Accept suggestion + accept = "", -- Accept suggestion next = "", -- Next suggestion prev = "", -- Previous suggestion dismiss = "", -- Dismiss suggestion @@ -45,7 +45,7 @@ return { -- Copilot Chat plugin "CopilotC-Nvim/CopilotChat.nvim", dependencies = { - { "github/copilot.vim" }, -- Or zbirenbaum/copilot.lua + { "zbirenbaum/copilot.lua" }, { "nvim-lua/plenary.nvim", branch = "master" }, -- For curl, log and async functions }, build = "make tiktoken", -- Only on MacOS or Linux diff --git a/lua/cargdev/plugins/leetcode.lua b/lua/cargdev/plugins/leetcode.lua new file mode 100644 index 0000000..dfb830d --- /dev/null +++ b/lua/cargdev/plugins/leetcode.lua @@ -0,0 +1,97 @@ +return { + "kawre/leetcode.nvim", + dependencies = { + "nvim-telescope/telescope.nvim", + "nvim-lua/plenary.nvim", + "MunifTanjim/nui.nvim", + }, + cmd = { "Leet" }, -- lazy load on command + opts = { + ---@type string + arg = "leetcode.nvim", -- for CLI mode + ---@type lc.lang + lang = "python3", -- or "cpp", "java", etc. + logging = true, + cn = { + enabled = false, -- enable for leetcode.cn + translator = true, + translate_problems = true, + }, + + ---@type lc.storage + storage = { + home = vim.fn.stdpath("data") .. "/leetcode", + cache = vim.fn.stdpath("cache") .. "/leetcode", + }, + + ---@type table + plugins = { + non_standalone = true, -- allow use inside your regular session + }, + + ---@type boolean + logging = true, + + cache = { + update_interval = 60 * 60 * 24 * 7, ---@type integer 7 days + }, + + console = { + open_on_runcode = true, ---@type boolean + dir = "row", ---@type lc.direction + size = { ---@type lc.size + width = "90%", + height = "75%", + }, + result = { + size = "60%", ---@type boolean + }, + testcase = { + virt_text = true, ---@type boolean + size = "40%", ---@type lc.size + }, + }, + + description = { + position = "left", ---@type lc.position + width = "40%", ---@type lc.size + show_stats = true, ---@type boolean + }, + + ---@type lc.picker + picker = { provider = "telescope" }, + + hooks = { + ---@type fun()[] + ["enter"] = {}, + + ---@type fun(question: lc.ui.Question)[] + ["question_enter"] = {}, + + ---@type fun()[] + ["leave"] = {}, + }, + + injector = { ---@type table + ["python3"] = { + before = true, + }, + }, + + keys = { + toggle = { "q" }, ---@type string|string[] + confirm = { "" }, ---@type string|string[] + + reset_testcases = "r", ---@type string + use_testcase = "U", ---@type string + focus_testcases = "H", ---@type string + focus_result = "L", ---@type string + }, + + ---@type lc.highlights + theme = {}, + + ---@type boolean + image_support = false, + }, +} diff --git a/lua/cargdev/plugins/nvim-tree.lua b/lua/cargdev/plugins/nvim-tree.lua index 85fdd2c..28c4287 100644 --- a/lua/cargdev/plugins/nvim-tree.lua +++ b/lua/cargdev/plugins/nvim-tree.lua @@ -71,12 +71,6 @@ return { -- Navigate Forward (Enter a Folder) vim.keymap.set("n", "f", api.tree.change_root_to_node, opts) - -- Reload the tree (useful when files are added/removed) - vim.keymap.set("n", "l", function() - api.tree.reload() -- Reload the tree - print("NvimTree reloaded!") -- Optional confirmation message - end, opts) - -- File Management keybindings vim.keymap.set("n", "a", function() -- Add a new file vim.cmd("set modifiable") -- Ensure modifiable mode is on diff --git a/lua/cargdev/plugins/nvim-treesitter-text-objects.lua b/lua/cargdev/plugins/nvim-treesitter-text-objects.lua index 68d5164..6ae0e9f 100644 --- a/lua/cargdev/plugins/nvim-treesitter-text-objects.lua +++ b/lua/cargdev/plugins/nvim-treesitter-text-objects.lua @@ -1,110 +1,129 @@ return { - "nvim-treesitter/nvim-treesitter-textobjects", - lazy = true, - config = function() - require("nvim-treesitter.configs").setup({ - textobjects = { - select = { - enable = true, - - -- Automatically jump forward to textobj, similar to targets.vim - lookahead = true, - - keymaps = { - -- You can use the capture groups defined in textobjects.scm - ["a="] = { query = "@assignment.outer", desc = "Select outer part of an assignment" }, - ["i="] = { query = "@assignment.inner", desc = "Select inner part of an assignment" }, - ["l="] = { query = "@assignment.lhs", desc = "Select left hand side of an assignment" }, - ["r="] = { query = "@assignment.rhs", desc = "Select right hand side of an assignment" }, - - -- works for javascript/typescript files (custom capture I created in after/queries/ecma/textobjects.scm) - ["a:"] = { query = "@property.outer", desc = "Select outer part of an object property" }, - ["i:"] = { query = "@property.inner", desc = "Select inner part of an object property" }, - ["l:"] = { query = "@property.lhs", desc = "Select left part of an object property" }, - ["r:"] = { query = "@property.rhs", desc = "Select right part of an object property" }, - - ["aa"] = { query = "@parameter.outer", desc = "Select outer part of a parameter/argument" }, - ["ia"] = { query = "@parameter.inner", desc = "Select inner part of a parameter/argument" }, - - ["ai"] = { query = "@conditional.outer", desc = "Select outer part of a conditional" }, - ["ii"] = { query = "@conditional.inner", desc = "Select inner part of a conditional" }, - - ["al"] = { query = "@loop.outer", desc = "Select outer part of a loop" }, - ["il"] = { query = "@loop.inner", desc = "Select inner part of a loop" }, - - ["af"] = { query = "@call.outer", desc = "Select outer part of a function call" }, - ["if"] = { query = "@call.inner", desc = "Select inner part of a function call" }, - - ["am"] = { query = "@function.outer", desc = "Select outer part of a method/function definition" }, - ["im"] = { query = "@function.inner", desc = "Select inner part of a method/function definition" }, - - ["ac"] = { query = "@class.outer", desc = "Select outer part of a class" }, - ["ic"] = { query = "@class.inner", desc = "Select inner part of a class" }, - }, - }, - swap = { - enable = true, - swap_next = { - ["na"] = "@parameter.inner", -- swap parameters/argument with next - ["n:"] = "@property.outer", -- swap object property with next - ["nm"] = "@function.outer", -- swap function with next - }, - swap_previous = { - ["pa"] = "@parameter.inner", -- swap parameters/argument with prev - ["p:"] = "@property.outer", -- swap object property with prev - ["pm"] = "@function.outer", -- swap function with previous - }, - }, - move = { - enable = true, - set_jumps = true, -- whether to set jumps in the jumplist - goto_next_start = { - ["]f"] = { query = "@call.outer", desc = "Next function call start" }, - ["]m"] = { query = "@function.outer", desc = "Next method/function def start" }, - ["]c"] = { query = "@class.outer", desc = "Next class start" }, - ["]i"] = { query = "@conditional.outer", desc = "Next conditional start" }, - ["]l"] = { query = "@loop.outer", desc = "Next loop start" }, - - -- You can pass a query group to use query from `queries//.scm file in your runtime path. - -- Below example nvim-treesitter's `locals.scm` and `folds.scm`. They also provide highlights.scm and indent.scm. - ["]s"] = { query = "@scope", query_group = "locals", desc = "Next scope" }, - ["]z"] = { query = "@fold", query_group = "folds", desc = "Next fold" }, - }, - goto_next_end = { - ["]F"] = { query = "@call.outer", desc = "Next function call end" }, - ["]M"] = { query = "@function.outer", desc = "Next method/function def end" }, - ["]C"] = { query = "@class.outer", desc = "Next class end" }, - ["]I"] = { query = "@conditional.outer", desc = "Next conditional end" }, - ["]L"] = { query = "@loop.outer", desc = "Next loop end" }, - }, - goto_previous_start = { - ["[f"] = { query = "@call.outer", desc = "Prev function call start" }, - ["[m"] = { query = "@function.outer", desc = "Prev method/function def start" }, - ["[c"] = { query = "@class.outer", desc = "Prev class start" }, - ["[i"] = { query = "@conditional.outer", desc = "Prev conditional start" }, - ["[l"] = { query = "@loop.outer", desc = "Prev loop start" }, - }, - goto_previous_end = { - ["[F"] = { query = "@call.outer", desc = "Prev function call end" }, - ["[M"] = { query = "@function.outer", desc = "Prev method/function def end" }, - ["[C"] = { query = "@class.outer", desc = "Prev class end" }, - ["[I"] = { query = "@conditional.outer", desc = "Prev conditional end" }, - ["[L"] = { query = "@loop.outer", desc = "Prev loop end" }, - }, - }, + { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + opts = { + ensure_installed = { + "lua", + "html", -- required by leetcode.nvim + "python", + "javascript", + "typescript", + "cpp", }, - }) + highlight = { + enable = true, + }, + }, + }, + { + "nvim-treesitter/nvim-treesitter-textobjects", + lazy = true, + config = function() + require("nvim-treesitter.configs").setup({ + textobjects = { + select = { + enable = true, - local ts_repeat_move = require("nvim-treesitter.textobjects.repeatable_move") + -- Automatically jump forward to textobj, similar to targets.vim + lookahead = true, - -- vim way: ; goes to the direction you were moving. - vim.keymap.set({ "n", "x", "o" }, ";", ts_repeat_move.repeat_last_move) - vim.keymap.set({ "n", "x", "o" }, ",", ts_repeat_move.repeat_last_move_opposite) + keymaps = { + -- You can use the capture groups defined in textobjects.scm + ["a="] = { query = "@assignment.outer", desc = "Select outer part of an assignment" }, + ["i="] = { query = "@assignment.inner", desc = "Select inner part of an assignment" }, + ["l="] = { query = "@assignment.lhs", desc = "Select left hand side of an assignment" }, + ["r="] = { query = "@assignment.rhs", desc = "Select right hand side of an assignment" }, - -- Optionally, make builtin f, F, t, T also repeatable with ; and , - vim.keymap.set({ "n", "x", "o" }, "f", ts_repeat_move.builtin_f) - vim.keymap.set({ "n", "x", "o" }, "F", ts_repeat_move.builtin_F) - vim.keymap.set({ "n", "x", "o" }, "t", ts_repeat_move.builtin_t) - vim.keymap.set({ "n", "x", "o" }, "T", ts_repeat_move.builtin_T) - end, + -- works for javascript/typescript files (custom capture I created in after/queries/ecma/textobjects.scm) + ["a:"] = { query = "@property.outer", desc = "Select outer part of an object property" }, + ["i:"] = { query = "@property.inner", desc = "Select inner part of an object property" }, + ["l:"] = { query = "@property.lhs", desc = "Select left part of an object property" }, + ["r:"] = { query = "@property.rhs", desc = "Select right part of an object property" }, + + ["aa"] = { query = "@parameter.outer", desc = "Select outer part of a parameter/argument" }, + ["ia"] = { query = "@parameter.inner", desc = "Select inner part of a parameter/argument" }, + + ["ai"] = { query = "@conditional.outer", desc = "Select outer part of a conditional" }, + ["ii"] = { query = "@conditional.inner", desc = "Select inner part of a conditional" }, + + ["al"] = { query = "@loop.outer", desc = "Select outer part of a loop" }, + ["il"] = { query = "@loop.inner", desc = "Select inner part of a loop" }, + + ["af"] = { query = "@call.outer", desc = "Select outer part of a function call" }, + ["if"] = { query = "@call.inner", desc = "Select inner part of a function call" }, + + ["am"] = { query = "@function.outer", desc = "Select outer part of a method/function definition" }, + ["im"] = { query = "@function.inner", desc = "Select inner part of a method/function definition" }, + + ["ac"] = { query = "@class.outer", desc = "Select outer part of a class" }, + ["ic"] = { query = "@class.inner", desc = "Select inner part of a class" }, + }, + }, + swap = { + enable = true, + swap_next = { + ["na"] = "@parameter.inner", -- swap parameters/argument with next + ["n:"] = "@property.outer", -- swap object property with next + ["nm"] = "@function.outer", -- swap function with next + }, + swap_previous = { + ["pa"] = "@parameter.inner", -- swap parameters/argument with prev + ["p:"] = "@property.outer", -- swap object property with prev + ["pm"] = "@function.outer", -- swap function with previous + }, + }, + move = { + enable = true, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = { + ["]f"] = { query = "@call.outer", desc = "Next function call start" }, + ["]m"] = { query = "@function.outer", desc = "Next method/function def start" }, + ["]c"] = { query = "@class.outer", desc = "Next class start" }, + ["]i"] = { query = "@conditional.outer", desc = "Next conditional start" }, + ["]l"] = { query = "@loop.outer", desc = "Next loop start" }, + + -- You can pass a query group to use query from `queries//.scm file in your runtime path. + -- Below example nvim-treesitter's `locals.scm` and `folds.scm`. They also provide highlights.scm and indent.scm. + ["]s"] = { query = "@scope", query_group = "locals", desc = "Next scope" }, + ["]z"] = { query = "@fold", query_group = "folds", desc = "Next fold" }, + }, + goto_next_end = { + ["]F"] = { query = "@call.outer", desc = "Next function call end" }, + ["]M"] = { query = "@function.outer", desc = "Next method/function def end" }, + ["]C"] = { query = "@class.outer", desc = "Next class end" }, + ["]I"] = { query = "@conditional.outer", desc = "Next conditional end" }, + ["]L"] = { query = "@loop.outer", desc = "Next loop end" }, + }, + goto_previous_start = { + ["[f"] = { query = "@call.outer", desc = "Prev function call start" }, + ["[m"] = { query = "@function.outer", desc = "Prev method/function def start" }, + ["[c"] = { query = "@class.outer", desc = "Prev class start" }, + ["[i"] = { query = "@conditional.outer", desc = "Prev conditional start" }, + ["[l"] = { query = "@loop.outer", desc = "Prev loop start" }, + }, + goto_previous_end = { + ["[F"] = { query = "@call.outer", desc = "Prev function call end" }, + ["[M"] = { query = "@function.outer", desc = "Prev method/function def end" }, + ["[C"] = { query = "@class.outer", desc = "Prev class end" }, + ["[I"] = { query = "@conditional.outer", desc = "Prev conditional end" }, + ["[L"] = { query = "@loop.outer", desc = "Prev loop end" }, + }, + }, + }, + }) + + local ts_repeat_move = require("nvim-treesitter.textobjects.repeatable_move") + + -- vim way: ; goes to the direction you were moving. + vim.keymap.set({ "n", "x", "o" }, ";", ts_repeat_move.repeat_last_move) + vim.keymap.set({ "n", "x", "o" }, ",", ts_repeat_move.repeat_last_move_opposite) + + -- Optionally, make builtin f, F, t, T also repeatable with ; and , + vim.keymap.set({ "n", "x", "o" }, "f", ts_repeat_move.builtin_f) + vim.keymap.set({ "n", "x", "o" }, "F", ts_repeat_move.builtin_F) + vim.keymap.set({ "n", "x", "o" }, "t", ts_repeat_move.builtin_t) + vim.keymap.set({ "n", "x", "o" }, "T", ts_repeat_move.builtin_T) + end, + }, }