diff --git a/.gitignore b/.gitignore index 5c49f2f..bb9f5fa 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ plugin spell .git *.old +.repro +test diff --git a/lazy-lock.json b/lazy-lock.json index c425466..3f6e72c 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -1,23 +1,23 @@ { "LuaSnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" }, "any-jump.vim": { "branch": "master", "commit": "f95674d9a4251ac02f452d5f1861e4422f4652c7" }, - "auto-format.nvim": { "branch": "main", "commit": "1e3c069753d4b0960b351292c1a01af1b122907c" }, "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, - "catppuccin": { "branch": "main", "commit": "0b2437bcc12b4021614dc41fcea9d0f136d94063" }, + "catppuccin": { "branch": "main", "commit": "d72341852556e2dfe19f779cc682c16dd58548fc" }, "cmp-async-path": { "branch": "main", "commit": "d6d1ffa2075039632a2d71e8fa139818e15ac757" }, "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, "cmp-cmdline": { "branch": "main", "commit": "d250c63aa13ead745e3a40f61fdd3470efde3923" }, "cmp-nvim-lsp-document-symbol": { "branch": "main", "commit": "f94f7ba948e32cd302caba1c2ca3f7c697fb4fcf" }, "cmp-nvim-lsp-signature-help": { "branch": "main", "commit": "031e6ba70b0ad5eee49fd2120ff7a2e325b17fa7" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, - "codecompanion.nvim": { "branch": "main", "commit": "1d6a26b1bb9e3b194d602c1ca7b9582e9f4b0b21" }, + "codecompanion.nvim": { "branch": "main", "commit": "8fcb2f599d808fd039ecb1219813b9f7be6fc71c" }, "copilot-cmp": { "branch": "master", "commit": "15fc12af3d0109fa76b60b5cffa1373697e261d1" }, "copilot-lualine": { "branch": "main", "commit": "dc4b8ed0f75bc2557b3158c526624bf04ad233ea" }, "copilot.lua": { "branch": "master", "commit": "30321e33b03cb924fdcd6a806a0dc6fa0b0eafb9" }, "dashboard-nvim": { "branch": "master", "commit": "000448d837f6e7a47f8f342f29526c4d7e49e9ce" }, + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, "fidget.nvim": { "branch": "main", "commit": "d9ba6b7bfe29b3119a610892af67602641da778e" }, "friendly-snippets": { "branch": "main", "commit": "efff286dd74c22f731cdec26a70b46e5b203c619" }, - "gitsigns.nvim": { "branch": "main", "commit": "8b00147519d6f8353867d5d0b55f587306b0cfb6" }, + "gitsigns.nvim": { "branch": "main", "commit": "6668f379ca634c36b8e11453118590b91bf8b295" }, "goto-preview": { "branch": "main", "commit": "4751e70a6ebce4fb78327b097cb8fdff55f38f3a" }, "image.nvim": { "branch": "master", "commit": "6ffafab2e98b5bda46bf227055aa84b90add8cdc" }, "indent-blankline.nvim": { "branch": "master", "commit": "e10626f7fcd51ccd56d7ffc00883ba7e0aa28f78" }, @@ -27,25 +27,27 @@ "lspkind.nvim": { "branch": "master", "commit": "d79a1c3299ad0ef94e255d045bed9fa26025dab6" }, "lualine.nvim": { "branch": "master", "commit": "f4f791f67e70d378a754d02da068231d2352e5bc" }, "mini.diff": { "branch": "main", "commit": "bc3a7be30fd45ed4961ea90de1d9d04637cdeae6" }, - "mini.nvim": { "branch": "main", "commit": "4dd209e4f03bacd46d6d87408b2529a8823112fb" }, - "none-ls.nvim": { "branch": "main", "commit": "02f5275d8a5546092f01306f162c00c71d6e0281" }, + "mini.nvim": { "branch": "main", "commit": "a84b7e555fe382c1859e6ca46b4983c822a1f77f" }, + "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" }, + "none-ls.nvim": { "branch": "main", "commit": "f41624ea1a73f020ddbd33438f74abb95ea17d55" }, + "nui.nvim": { "branch": "main", "commit": "53e907ffe5eedebdca1cd503b00aa8692068ca46" }, "nvim-autopairs": { "branch": "master", "commit": "68f0e5c3dab23261a945272032ee6700af86227a" }, "nvim-cmp": { "branch": "main", "commit": "12509903a5723a876abd65953109f926f4634c30" }, "nvim-colorizer.lua": { "branch": "master", "commit": "a065833f35a3a7cc3ef137ac88b5381da2ba302e" }, "nvim-html-css": { "branch": "main", "commit": "fa7e2da75edfd3d110fc8d4f8e5215b5de56ff42" }, "nvim-lint": { "branch": "master", "commit": "6e9dd545a1af204c4022a8fcd99727ea41ffdcc8" }, - "nvim-lspconfig": { "branch": "master", "commit": "7af2c37192deae28d1305ae9e68544f7fb5408e1" }, + "nvim-lspconfig": { "branch": "master", "commit": "1110787f1b464888c59a044c48c5119d14078044" }, "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, "nvim-notify": { "branch": "master", "commit": "22f29093eae7785773ee9d543f8750348b1a195c" }, "nvim-tree.lua": { "branch": "master", "commit": "d529a99f88e0dff02e0aa275db2f595cd252a2c8" }, - "nvim-treesitter": { "branch": "master", "commit": "2cade9e3d105732b794bc37e7cb2dc53b1cf99dc" }, + "nvim-treesitter": { "branch": "master", "commit": "1a6e42bb8c5c23d8e2c0acb842dcacac5ee06761" }, "nvim-web-devicons": { "branch": "master", "commit": "1020869742ecb191f260818234517f4a1515cfe8" }, "obsidian.nvim": { "branch": "main", "commit": "ae1f76a75c7ce36866e1d9342a8f6f5b9c2caf9b" }, + "odis": { "branch": "master", "commit": "5176a07a729860d0c0cdefe96252fc7ff9e16d43" }, "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, "presence.nvim": { "branch": "main", "commit": "87c857a56b7703f976d3a5ef15967d80508df6e6" }, "rainbow-delimiters.nvim": { "branch": "master", "commit": "011d98eaa3a73b5a51d82ce5bc6b1397dde95562" }, - "render-markdown.nvim": { "branch": "main", "commit": "e05a9f22f31c088ece3fa5928daf546a015b66ee" }, - "telescope-cmdline.nvim": { "branch": "main", "commit": "8b05928ac1b9f2b772cedde891faa6669b0ec59a" }, + "render-markdown.nvim": { "branch": "main", "commit": "4a28c135bc3548e398ba38178fec3f705cb26fe6" }, "telescope-color-names.nvim": { "branch": "main", "commit": "95b372b9a8ba0fc7cf6a67be637ee37453f322da" }, "telescope-file-browser.nvim": { "branch": "master", "commit": "626998e5c1b71c130d8bc6cf7abb6709b98287bb" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "2a5ceff981501cff8f46871d5402cd3378a8ab6a" }, diff --git a/lua/core/keymaps.lua b/lua/core/keymaps.lua index f027d2b..f64c263 100644 --- a/lua/core/keymaps.lua +++ b/lua/core/keymaps.lua @@ -1,77 +1,461 @@ local map = vim.keymap.set -local Terminal = require("toggleterm.terminal").Terminal -local notify = require("notify") -local dsplit = require("util.open-docs-in-split") - -local function term_factory(cfg) - cfg["on_stderr"] = function(_, job, data, name) - notify(name .. " encountered an error on job: " .. job .. "\nData: " .. data, "error") - end - cfg["on_stdout"] = function(_, job, data, name) - notify(name .. " output for job" .. job .. "\nData: " .. data, "info") - end - return Terminal:new(cfg) -end - -local function term_toggle(term) - term:toggle() -end +local term = require("utils.terminal") +local map_from_table = require("utils.keymaps.converters.from_table").set_keybindings +local add_to_whichkey = require("utils.keymaps.converters.whichkey").addToWhichKey +local term_factory = term.term_factory +local term_toggle = term.term_toggle local opts = { silent = true, noremap = true } -local notsilent = { silent = false, noremap = true } - -local function ReloadConfig() - dofile(vim.fn.stdpath("config") .. "/init.lua") - dofile(vim.fn.stdpath("config") .. "/lua/core/keymaps.lua") - dofile(vim.fn.stdpath("config") .. "/lua/core/autocmds.lua") - dofile(vim.fn.stdpath("config") .. "/lua/core/options.lua") - dofile(vim.fn.stdpath("config") .. "/lua/core/plugins.lua") - dofile(vim.fn.stdpath("config") .. "/lua/plugins/ui/init.lua") - dofile(vim.fn.stdpath("config") .. "/lua/plugins/ui/toggleterm.lua") - dofile(vim.fn.stdpath("config") .. "/lua/plugins/ai/init.lua") - dofile(vim.fn.stdpath("config") .. "/lua/plugins/lsp/init.lua") - dofile(vim.fn.stdpath("config") .. "/lua/plugins/colorscheme/init.lua") -end -- Leader key vim.g.mapleader = " " vim.g.maplocalleader = "," -- Custom commands -vim.api.nvim_create_user_command("PS", ":PackerSync", {}) -vim.api.nvim_create_user_command("Reload", ReloadConfig, {}) vim.api.nvim_create_user_command("Config", "edit ~/.config/nvim", {}) -vim.api.nvim_create_user_command("Plugins", "edit ~/.config/nvim/lua/core/plugins.lua", {}) vim.api.nvim_create_user_command("Keymaps", "edit ~/.config/nvim/lua/core/keymaps.lua", {}) --- {{{ Basic mappings -map("n", "", "zz", opts) -map("n", "n", "nzzzv", opts) -map("n", "N", "Nzzzv", opts) -map("x", "p", '"_dP', opts) -- paste without yanking -map("v", "<", "", ">gv", opts) -map("v", "J", ":m '>+1gv=gv", opts) -- move lines -map("v", "K", ":m '<-2gv=gv", opts) +-- {{{ Basic Mappings +local basic_mappings = { + { key = "", cmd = "zz", desc = "Scroll up and center", mode = "n" }, + { key = "n", cmd = "nzzzv", desc = "Next search result and center", mode = "n" }, + { key = "N", cmd = "Nzzzv", desc = "Previous search result and center", mode = "n" }, + { key = "p", cmd = '"_dP', desc = "Paste without yanking", mode = "x", group = "Paste in place" }, + { key = "<", cmd = "", ":bnext", opts) -map("n", "", ":bprev", opts) -map("n", "bb", ":Telescope buffers", opts) -map("n", "bk", ":bdelete", opts) -map("n", "bn", ":bnext", opts) -map("n", "bp", ":bprev", opts) +-- {{{ Code Companion Mappings +local code_companion_mappings = { + { mode = "n", key = "cp", cmd = ":vert Copilot panel", group = "Code" }, + { mode = "n", key = "oc", cmd = ":CodeCompanionChat Toggle", group = "Open" }, + { mode = "n", key = "Cc", cmd = ":CodeCompanionChat Toggle", group = "CodeCompanion" }, + { mode = "n", key = "Ci", cmd = ":CodeCompanion ", group = "CodeCompanion" }, + { mode = "n", key = "CT", cmd = ":CodeCompanionChat Toggle", group = "CodeCompanion" }, + { mode = "n", key = "Ca", cmd = ":CodeCompanionActions", group = "CodeCompanion" }, + { mode = "v", key = "Cc", cmd = ":CodeCompanionChat Add", group = "CodeCompanion" }, + { mode = "v", key = "Ci", cmd = ":CodeCompanion /buffer ", group = "CodeCompanion" }, + { mode = "v", key = "Ce", cmd = ":CodeCompanion /explain", group = "CodeCompanion" }, + { mode = "v", key = "Cf", cmd = ":CodeCompanion /fix", group = "CodeCompanion" }, + { mode = "v", key = "Cl", cmd = ":CodeCompanion /lsp", group = "CodeCompanion" }, + { mode = "v", key = "Ct", cmd = ":CodeCompanion /tests", group = "CodeCompanion" }, +} -- }}} ---{{{ Terminal mappings +--{{{ Telescope mappings +local telescope_mappings = { + { mode = "n", key = "//", cmd = ":Telescope current_buffer_fuzzy_find previewer=false" }, + { mode = "n", key = "??", cmd = ":Telescope lsp_document_symbols theme=dropdown layout_config={width=0.5}" }, + { + mode = "n", + key = "fc", + cmd = ':Telescope color_names theme=dropdown layout_config={width=0.45,height=25,prompt_position="bottom"} layout_strategy=vertical', + group = "Find", + }, + { + mode = "n", + key = "Tc", + cmd = ":Telescope colorscheme", + group = "Telescope", + }, + { + mode = "n", + key = "TC", + cmd = ':Telescope color_names theme=dropdown layout_config={width=0.45,height=25,prompt_position="bottom"} layout_strategy=vertical', + group = "Telescope", + }, + { + mode = "n", + key = "Tn", + cmd = ":Telescope notify theme=dropdown layout_config={width=0.75}", + group = "Telescope", + }, + { + mode = "n", + key = "TN", + cmd = ":Telescope noice theme=dropdown layout_config={width=0.75}", + group = "Telescope", + }, + { + mode = "n", + key = "ff", + cmd = ":Telescope find_files find_command=rg,--ignore,--follow,--hidden,--files prompt_prefix=🔍", + group = "Find", + }, + { mode = "n", key = "fg", cmd = ":Telescope live_grep", group = "Find" }, + { + mode = "n", + key = "Tg", + cmd = ':Telescope glyph theme=dropdown layout_config={width=0.45,height=35,prompt_position="bottom"} layout_strategy=vertical', + group = "Telecope", + }, + { + mode = "n", + key = "fG", + cmd = ':Telescope glyph theme=dropdown layout_config={width=0.45,height=35,prompt_position="bottom"} layout_strategy=vertical', + group = "Find", + }, + { mode = "n", key = "fb", cmd = ":Telescope file_browser", group = "Find" }, + { + mode = "n", + key = "fr", + cmd = ":Telescope oldfiles theme=dropdown layout_config={width=0.5}", + group = "Find", + }, + { + mode = "n", + key = "hc", + cmd = ":Telescope commands", + group = "Help", + }, + { + mode = "n", + key = "hv", + cmd = ":Telescope vim_options", + group = "Help", + }, + { + mode = "n", + key = "hk", + cmd = ":Telescope keymaps", + group = "Help", + }, + { + mode = "n", + key = "hs", + cmd = ":Telescope spell_suggest", + group = "Help", + }, + { + mode = "n", + key = "ht", + cmd = ":Telescope help_tags", + group = "Help", + }, + { + mode = "n", + key = "hm", + cmd = ":Telescope man_pages theme=dropdown layout_config={width=0.75}", + group = "Help", + }, + { + mode = "n", + key = "sf", + cmd = ":Telescope find_files find_command=rg,--ignore,--follow,--hidden,--files prompt_prefix=🔍", + group = "Search", + }, + { mode = "n", key = "sF", cmd = ":Telescope fidget", group = "Search" }, + { mode = "n", key = "sg", cmd = ":Telescope live_grep", group = "Search" }, + { mode = "n", key = "sh", cmd = ":Telescope command_history", group = "Search" }, + { mode = "n", key = "sm", cmd = ":Telescope man_pages", group = "Search" }, + { mode = "n", key = "s/", cmd = ":Telescope search_history", group = "Search" }, + { mode = "n", key = "gc", cmd = ":Telescope git_commits", group = "Git" }, + { mode = "n", key = "gf", cmd = ":Telescope git_files", group = "Git" }, + { mode = "n", key = "Tr", cmd = ":Telescope reloader", group = "Telescope" }, +} +--}}} +-- {{{ File Explorer Mappings (i guess) +local file_explorer_mappings = { + { mode = "n", key = "nt", cmd = ":NvimTreeToggle" }, + { mode = "n", key = "nc", cmd = ":lua vim.notify.dismiss()" }, + { mode = "n", key = "D", cmd = ":Dotenv .env", group = "Dotenv" }, +} +-- }}} + +-- {{{ Misc Utilities Mappings +local misc_utilities_mappings = { + { mode = "n", key = "x", cmd = "!chmod +x %", group = "Make Executable" }, + { mode = "n", key = "y", cmd = '"+', group = "System Yank" }, + { mode = "v", key = "y", cmd = '"+', group = "System Yank" }, + { mode = "n", key = "sc", cmd = ":nohls", group = "Search" }, +} +-- }}} + +-- {{{ Goto Preview Mappings +local goto_preview_mappings = { + { mode = "n", key = "gpc", cmd = ':lua require("goto-preview").close_all_win()', group = "Goto Preview" }, + { + mode = "n", + key = "gpd", + cmd = ':lua require("goto-preview").goto_preview_definition()', + group = "Goto Preview", + }, + { + mode = "n", + key = "gpi", + cmd = ':lua require("goto-preview").goto_preview_implementation()', + group = "Goto Preview", + }, +} +-- }}} + +-- {{{ Workspace Management Mappings +local workspace_management_mappings = { + { mode = "n", key = "wa", cmd = vim.lsp.buf.add_workspace_folder }, + { mode = "n", key = "wr", cmd = vim.lsp.buf.remove_workspace_folder }, + { + mode = "n", + key = "wl", + cmd = function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, + }, +} +-- }}} + +-- {{{ Noice Mappings +local noice_mappings = { + { mode = "n", key = "Nh", cmd = ":Noice telescope", group = "Noice" }, + { mode = "n", key = "Nl", cmd = ":Noice last", group = "Noice" }, + { mode = "n", key = "Nd", cmd = ":Noice dismiss", group = "Noice" }, + { mode = "n", key = "Ne", cmd = ":Noice errors", group = "Noice" }, + { mode = "n", key = "Ns", cmd = ":Noice stats", group = "Noice" }, +} +-- }}} + +-- {{{ ODIS Mappings +local odis_mappings = { + { mode = "n", key = "dv", cmd = ':lua require("odis").show_documentation("vsplit")', group = "ODIS" }, + { mode = "n", key = "dh", cmd = ':lua require("odis").show_documentation("vsplit")', group = "ODIS" }, + { mode = "n", key = "db", cmd = ':lua require("odis").show_documentation("vsplit")', group = "ODIS" }, + { mode = "n", key = "dt", cmd = ':lua require("odis").show_documentation("vsplit")', group = "ODIS" }, + { mode = "n", key = "dt", cmd = ':lua require("odis").show_documentation("vsplit")', group = "ODIS" }, + -- { mode = "n", key = "dc", cmd = 'require("odis").close_float()' }, +} +-- }}} + +-- {{{ Diffview Mappings +local diffview_mappings = { + { + + mode = "n", + key = "gdo", + cmd = ":DiffviewOpen", + group = "Git", + }, + { + + mode = "n", + key = "gdf", + cmd = ":DiffviewFileHistory %", + group = "Git", + }, + { + + mode = "n", + key = "gdh", + cmd = ":DiffviewHistory", + group = "Git", + }, + { + + mode = "n", + key = "gdc", + cmd = ":DiffviewClose", + group = "Git", + }, + { + + mode = "n", + key = "gdt", + cmd = ":DiffviewToggleFiles", + group = "Git", + desc = "Toggle files view", + }, + { + + mode = "n", + key = "gdr", + cmd = ":DiffviewRefresh", + desc = "Refresh diffview", + group = "Git", + }, +} +-- }}} + +--{{{ Custom Terminals local programs_map = { - gg = { cmd = "lazygit", display_name = "lazygit", direction = "tab", hidden = true }, - op = { cmd = "ipython", display_name = "ipython", direction = "vertical", hidden = true }, - oP = { cmd = "ipython", display_name = "ipython-full", direction = "tab", hidden = true }, - on = { cmd = "ncmpcpp", display_name = "ncmpcpp", direction = "tab", hidden = true }, - ob = { cmd = "btop", display_name = "btop", direction = "tab", hidden = true }, + gg = { cmd = "lazygit", display_name = "lazygit", direction = "tab", hidden = true, group = "Git" }, + op = { cmd = "ipython", display_name = "ipython", direction = "vertical", hidden = true, group = "Open" }, + oP = { cmd = "ipython", display_name = "ipython-full", direction = "tab", hidden = true, group = "Open" }, + on = { cmd = "ncmpcpp", display_name = "ncmpcpp", direction = "tab", hidden = true, group = "Open" }, + ob = { cmd = "btop", display_name = "btop", direction = "tab", hidden = true, group = "Open" }, od = { cmd = "lazydocker", display_name = "lazydocker", direction = "tab", hidden = true }, } @@ -81,180 +465,76 @@ for key, value in pairs(programs_map) do end, opts) end -map("v", "op", ":ToggleTerm name=ipython") -map("v", "oP", ":ToggleTerm name=ipython-full") - -map("n", "", ":ToggleTerm name=toggleterm", opts) -map("n", "tt", ":ToggleTerm name=toggleterm", opts) -map("n", "tT", ":ToggleTerm name=toggleterm-full direction=tab", opts) -map("n", "ot", ":ToggleTerm name=toggleterm", opts) -map("n", "oT", ":ToggleTerm name=toggleterm-full direction=tab", opts) -map("n", "ts", ":TermSelect", opts) -map("n", "tv", ":ToggleTerm direction=vertical name=toggleterm-vert", opts) -map("n", "th", ":ToggleTerm direction=horizontal name=toggleterm-hori", opts) -map("n", "ov", ":ToggleTerm direction=vertical name=toggleterm-vert", opts) -map("n", "oh", ":ToggleTerm direction=horizontal name=toggleterm-hori", opts) -map("n", "tf", ":ToggleTerm name=toggleterm", opts) -map("n", "-", ":ToggleTerm direction='horizontal'", opts) -map("n", "|", ":ToggleTerm direction='vertical'", opts) +local tbl = {} +for key, value in pairs(programs_map) do + local temp = {} + if key == "gg" then + temp = { + cmd = value.cmd, + key = "" .. key, + group = value.group, + mode = "n", + desc = "Open " .. value.display_name, + } + else + temp = { + cmd = value.cmd, + key = "" .. key, + group = value.group, + mode = "n", + desc = "Open " .. value.display_name, + } + end + table.insert(tbl, temp) +end +add_to_whichkey(tbl, { key = "o", group = "Open" }) function _G.set_terminal_keymaps() local opts = { buffer = 0 } map("t", "", [[]], opts) map("t", "", [[]], opts) - -- map("t", "", "", { buffer = 0, silent = true }) -- fix space in terminal end --- if you only want these mappings for toggle term use term://*toggleterm#* instead vim.cmd("autocmd! TermOpen term://* lua set_terminal_keymaps()") --}}} ---{{{ LSP mappings -map("n", "gA", vim.lsp.buf.code_action, opts) -map("n", "gd", ":Telescope lsp_definitions", opts) -map("n", "gDc", ":Telescope lsp_implementations", opts) -map("n", "gDf", ":Telescope lsp_definitions", opts) -map("n", "gF", ":edit ", opts) -map("n", "gT", ":Telescope lsp_type_definitions", opts) -map("n", "gb", ":Gitsigns blame_line", opts) -map("n", "gi", ":Telescope lsp_implementations", opts) -map("n", "gj", ":Telescope jumplist", opts) -map("n", "gl", vim.lsp.codelens.run, opts) -map("n", "gr", ":Telescope lsp_references", opts) -map("n", "gs", vim.lsp.buf.signature_help, opts) -map("n", "K", vim.lsp.buf.hover, opts) -map("n", "kv", dsplit, opts) -map("n", "cd", ":Telescope lsp_definitions") -map("n", "ca", vim.lsp.buf.code_action) -map("n", "cci", ":Telescope lsp_incoming_calls") -map("n", "cco", ":Telescope lsp_outgoing_calls") -map("n", "ch", ":lua vim.lsp.buf.signature_help()") -map("n", "ci", ":Telescope lsp_implementations") -map("n", "cr", ":Telescope lsp_references") -map("n", "cR", ":lua vim.lsp.buf.rename()") -map("n", "cs", ":Telescope lsp_document_symbols") -map("n", "ct", ":Telescope lsp_type_definitions") -map("n", "cw", ":Telescope lsp_dynamic_workspace_symbols") -map("n", "cd", ":Telescope diagnostics theme=dropdown layout_config={width=0.8}") -map("n", "cDs", ":Telescope diagnostics theme=dropdown layout_config={width=0.8}") -map("n", "cDn", ":lua vim.diagnostic.goto_next()") -map("n", "cDp", ":lua vim.diagnostic.goto_prev()") -map("n", "cl", ":lua vim.diagnostic.setloclist()") -map("n", "cH", open_doc_in_vsplit, opts) +--{{{ Groups +add_to_whichkey(nil, { key = "a", group = "AnyJump" }) +add_to_whichkey(nil, { key = "b", group = "Buffers" }) +add_to_whichkey(nil, { key = "c", group = "Code" }) +add_to_whichkey(nil, { key = "ca", group = "Code Actions" }) +add_to_whichkey(nil, { key = "C", group = "CodeCompanion" }) +add_to_whichkey(nil, { key = "d", group = "ODIS" }) +add_to_whichkey(nil, { key = "f", group = "Find" }) +add_to_whichkey(nil, { key = "g", group = "Git" }) +add_to_whichkey(nil, { key = "gd", group = "DiffView" }) +add_to_whichkey(nil, { key = "gg", group = "Lazygit" }) +add_to_whichkey(nil, { key = "h", group = "Help" }) +add_to_whichkey(nil, { key = "j", group = "AnyJump" }) +add_to_whichkey(nil, { key = "N", group = "Noice" }) +add_to_whichkey(nil, { key = "o", group = "Open" }) +add_to_whichkey(nil, { key = "p", group = "Paste in Place" }) +add_to_whichkey(nil, { key = "s", group = "Search" }) +add_to_whichkey(nil, { key = "t", group = "Terminal" }) +add_to_whichkey(nil, { key = "T", group = "Telescope" }) +add_to_whichkey(nil, { key = "w", group = "Workspace" }) +add_to_whichkey(nil, { key = "x", group = "Make Executable" }) +add_to_whichkey(nil, { key = "y", group = "System Yank" }) +add_to_whichkey(nil, { key = "0", group = "Horizontal Terminal" }) --}}} ---{{{ Code Companion and Copilot -map("n", "cp", ":vert Copilot panel", opts) -map("n", "oc", ":CodeCompanionChat Toggle") -map("n", "Cc", ":CodeCompanionChat Toggle", opts) -map("n", "Ci", ":CodeCompanion ", opts) -map("n", "CT", ":CodeCompanionChat Toggle", opts) -map("n", "Ca", ":CodeCompanionActions", opts) -map("v", "Cc", ":CodeCompanionChat Add", opts) -map("v", "Ci", ":CodeCompanion /buffer ", notsilent) -map("v", "Ce", ":CodeCompanion /explain", notsilent) -map("v", "Cf", ":CodeCompanion /fix", notsilent) -map("v", "Cl", ":CodeCompanion /lsp", notsilent) -map("v", "Ct", ":CodeCompanion /tests", notsilent) ---}}} - ---{{{ Telescope mappings --- {{{ Telescope Finders -map("n", "//", ":Telescope current_buffer_fuzzy_find previewer=false", opts) -map("n", "??", ":Telescope lsp_document_symbols theme=dropdown layout_config={width=0.5}", opts) -map( - "n", - "fc", - ':Telescope color_names theme=dropdown layout_config={width=0.45,height=25,prompt_position="bottom"} layout_strategy=vertical', - opts -) -map( - "n", - "Tc", - ':Telescope color_names theme=dropdown layout_config={width=0.45,height=25,prompt_position="bottom"} layout_strategy=vertical', - opts -) -map("n", "Tn", ":Telescope notify theme=dropdown layout_config={width=0.75}", opts) - -map( - "n", - "ff", - ":Telescope find_files find_command=rg,--ignore,--follow,--hidden,--files prompt_prefix=🔍", - opts -) -map("n", "fg", ":Telescope live_grep", opts) -map( - "n", - "Tg", - ':Telescope glyph theme=dropdown layout_config={width=0.45,height=35,prompt_position="bottom"} layout_strategy=vertical', - opts -) -map( - "n", - "fG", - ':Telescope glyph theme=dropdown layout_config={width=0.45,height=35,prompt_position="bottom"} layout_strategy=vertical', - opts -) -map("n", "fb", ":Telescope file_browser", opts) -map("n", "fr", ":Telescope oldfiles theme=dropdown layout_config={width=0.5}", opts) --- }}} - ---{{{ Telescope Help -map("n", "hc", ":Telescope commands") -map("n", "hv", ":Telescope vim_options") -map("n", "hk", ":Telescope keymaps") -map("n", "hs", ":Telescope spell_suggest") -map("n", "hm", ":Telescope man_pages theme=dropdown layout_config={width=0.75}") ---}}} - ---{{{ Telescope Search -map( - "n", - "sf", - ":Telescope find_files find_command=rg,--ignore,--follow,--hidden,--files prompt_prefix=🔍", - opts -) -map("n", "sF", ":Telescope fidget") -map("n", "sg", ":Telescope live_grep") -map("n", "sh", ":Telescope command_history") -map("n", "sm", ":Telescope man_pages") -map("n", "s/", ":Telescope search_history") ---}}} - ---{{{ Git mappings -map("n", "gc", ":Telescope git_commits", opts) -map("n", "gf", ":Telescope git_files", opts) ---}}} - -map("n", "Tr", ":Telescope reloader", opts) - -map("n", "Q", ":Telescope cmdline", opts) -map("n", "", ":Telescope cmdline", opts) ---}}} - ---{{{ File explorer and tools -map("n", "nt", ":NvimTreeToggle", opts) -map("n", "nc", ":lua vim.notify.dismiss()>", opts) -map("n", "D", ":Dotenv .env", opts) ---}}} - ---{{{ Misc utilities -map("n", "x", "!chmod +x %", opts) -map("n", "y", '"+', opts) -map("v", "y", '"+', opts) -map("n", "sc", ":nohls") ---}}} - ---{{{ Goto Preview -map("n", "gpc", ':lua require("goto-preview").close_all_win()') -map("n", "gpd", ':lua require("goto-preview").goto_preview_definition()') -map("n", "gpi", ':lua require("goto-preview").goto_preview_implementation()') ---}}} - ---{{{ Workspace management -map("n", "wa", vim.lsp.buf.add_workspace_folder, opts) -map("n", "wr", vim.lsp.buf.remove_workspace_folder, opts) -map("n", "wl", function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) -end, opts) +--{{{ Whichkey Mappings +add_to_whichkey(map_from_table(basic_mappings)) +add_to_whichkey(map_from_table(buffer_navigation_mappings)) +add_to_whichkey(map_from_table(terminal_mappings)) +add_to_whichkey(map_from_table(lsp_mappings)) +add_to_whichkey(map_from_table(code_companion_mappings)) +add_to_whichkey(map_from_table(telescope_mappings)) +add_to_whichkey(map_from_table(file_explorer_mappings)) +add_to_whichkey(map_from_table(misc_utilities_mappings)) +add_to_whichkey(map_from_table(goto_preview_mappings)) +add_to_whichkey(map_from_table(workspace_management_mappings)) +add_to_whichkey(map_from_table(noice_mappings)) +add_to_whichkey(map_from_table(odis_mappings)) +add_to_whichkey(map_from_table(diffview_mappings)) --}}} diff --git a/lua/core/lazy.lua b/lua/core/lazy.lua index b001a54..0605a15 100644 --- a/lua/core/lazy.lua +++ b/lua/core/lazy.lua @@ -30,9 +30,42 @@ require("lazy").setup({ install = { colorscheme = { "habamax" } }, -- automatically check for plugin updates checker = { enabled = true }, + dev = { + -- Directory where you store your local plugin projects. If a function is used, + -- the plugin directory (e.g. `~/projects/plugin-name`) must be returned. + ---@type string | fun(plugin: LazyPlugin): string + path = "~/.config/nvim/test", + ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub + patterns = {}, -- For example {"folke"} + fallback = false, -- Fallback to git when local plugin doesn't exist + }, + -- lazy can generate helptags from the headings in markdown readme files, + -- so :help works even for plugins that don't have vim docs. + -- when the readme opens with :help it will be correctly displayed as markdown + readme = { + enabled = true, + root = vim.fn.stdpath("state") .. "/lazy/readme", + files = { "README.md", "lua/**/README.md" }, + -- only generate markdown helptags for plugins that don't have docs + skip_if_doc_exists = true, + }, + state = vim.fn.stdpath("state") .. "/lazy/state.json", -- state info for checker and other things + -- Enable profiling of lazy.nvim. This will add some overhead, + -- so only enable this when you are debugging lazy.nvim + profiling = { + -- Enables extra stats on the debug tab related to the loader cache. + -- Additionally gathers stats about all package.loaders + loader = false, + -- Track each new require in the Lazy profiling tab + require = false, + }, }) vim.cmd("colorscheme catppuccin") require("core.keymaps") require("core.lsp-notifications") -require("extensions.telescope") +require("utils.extensions") +require("utils.telescope_extra").setup() +require("utils.git_paste").setup({ + telescope_key = "pg", +}) diff --git a/lua/plugins/auto-format.lua b/lua/plugins/auto-format.lua deleted file mode 100644 index f25025c..0000000 --- a/lua/plugins/auto-format.lua +++ /dev/null @@ -1,7 +0,0 @@ -return { - "https://git.sr.ht/~nedia/auto-format.nvim", - event = "BufWinEnter", - config = function() - require("auto-format").setup() - end -} diff --git a/lua/plugins/codecompanion.lua b/lua/plugins/codecompanion.lua index 8728eac..c80543f 100644 --- a/lua/plugins/codecompanion.lua +++ b/lua/plugins/codecompanion.lua @@ -6,13 +6,13 @@ return { "j-hui/fidget.nvim", }, opts = { - log_level = "DEBUG", adapters = { copilot = function() return require("codecompanion.adapters").extend("copilot", { schema = { model = { - default = "o3-mini-2025-01-31", + default = "claude-3.5-sonnet", + -- default = "o3-mini-2025-01-31", choices = { ["o3-mini-2025-01-31"] = { opts = { can_reason = true } }, ["o1-2024-12-17"] = { opts = { can_reason = true } }, @@ -22,6 +22,9 @@ return { "gemini-2.0-flash-001", }, }, + max_tokens = { + default = 65536, + }, }, }) end, @@ -29,6 +32,10 @@ return { strategies = { chat = { adapter = "copilot", + roles = { + llm = " Assistant", + user = " User", + }, slash_commands = { ["file"] = { opts = { @@ -78,6 +85,10 @@ return { provider = "mini_diff", }, }, + opts = { + -- log_level = "DEBUG", + log_level = "TRACE", + }, }, init = function() require("plugins.codecompanion.fidget-spinner"):init() diff --git a/lua/plugins/diffview.lua b/lua/plugins/diffview.lua new file mode 100644 index 0000000..8046cc3 --- /dev/null +++ b/lua/plugins/diffview.lua @@ -0,0 +1,27 @@ +return { + "sindrets/diffview.nvim", + dependencies = "nvim-tree/nvim-web-devicons", + opts = { + view = { + -- Disable the default normal mode mapping for ``: + -- [""] = false, + -- Disable the default visual mode mapping for `gf`: + -- { "x", "gf", false }, + }, + }, + hooks = { + diff_buf_read = function(bufnr) + -- Change local options in diff buffers + vim.opt_local.wrap = false + vim.opt_local.list = false + vim.opt_local.colorcolumn = { 80 } + end, + view_opened = function(view) + require("notify").notify( + ("A new %s was opened on tab page %d!"):format(view.class:name(), view.tabpage), + "info", + { timeout = 5000, title = "Diffview" } + ) + end, + }, +} diff --git a/lua/plugins/noice.lua b/lua/plugins/noice.lua new file mode 100644 index 0000000..74b8f7b --- /dev/null +++ b/lua/plugins/noice.lua @@ -0,0 +1,30 @@ +return { + "folke/noice.nvim", + event = "VeryLazy", + opts = { + lsp = { + -- override markdown rendering so that **cmp** and other plugins use **Treesitter** + override = { + ["vim.lsp.util.convert_input_to_markdown_lines"] = true, + ["vim.lsp.util.stylize_markdown"] = true, + ["cmp.entry.get_documentation"] = true, -- requires hrsh7th/nvim-cmp + }, + }, + -- you can enable a preset for easier configuration + presets = { + bottom_search = true, -- use a classic bottom cmdline for search + command_palette = true, -- position the cmdline and popupmenu together + long_message_to_split = true, -- long messages will be sent to a split + inc_rename = false, -- enables an input dialog for inc-rename.nvim + lsp_doc_border = true, -- add a border to hover docs and signature help + }, + }, + dependencies = { + -- if you lazy-load any plugin below, make sure to add proper `module="..."` entries + "MunifTanjim/nui.nvim", + -- OPTIONAL: + -- `nvim-notify` is only needed, if you want to use the notification view. + -- If not available, we use `mini` as the fallback + "rcarriga/nvim-notify", + } +} diff --git a/lua/plugins/odis.lua b/lua/plugins/odis.lua new file mode 100644 index 0000000..af5e990 --- /dev/null +++ b/lua/plugins/odis.lua @@ -0,0 +1,52 @@ +return { + url = "https://gitea.suda.codes/sudacode/odis", + dependencies = { + "nvim-treesitter/nvim-treesitter", + "neovim/nvim-lspconfig", + }, + opts = { + opts = { + display = { + default_mode = "vsplit", + picker = true, + float = { + maxwidth = 80, + maxheight = 40, + border = "rounded", + title = true, + style = "minimal", + auto_focus = true, + anchor = "bottom_right", + offset = { row = -2, col = -2 }, + }, + window = { + width = 0.4, + height = 0.25, + position = "bottom|right", + floating = false, + border = "none", + }, + }, + integrations = { + treesitter = { + enabled = true, -- Enable Treesitter integration + highlight = true, -- Enable syntax highlighting + langs = { -- Language mapping for different doc types + lsp = "markdown", + man = "man", + help = "vimdoc", + }, + }, + }, + sources = { + lsp = { enabled = true }, + vim = { enabled = true }, + man = { enabled = true }, + }, + priority = { "LSP", "Vim", "Man" }, + mappings = { + close = "dc", + }, + }, + }, +} diff --git a/lua/plugins/telescope.lua b/lua/plugins/telescope.lua index a9daa73..5a18f2b 100644 --- a/lua/plugins/telescope.lua +++ b/lua/plugins/telescope.lua @@ -2,7 +2,7 @@ return { "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim", - "jonarrien/telescope-cmdline.nvim", + -- "jonarrien/telescope-cmdline.nvim", "nat-418/telescope-color-names.nvim", "nvim-telescope/telescope-file-browser.nvim", "ghassan0/telescope-glyph.nvim", @@ -11,6 +11,7 @@ return { "nvim-telescope/telescope-fzf-native.nvim", build = "cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release", }, + "folke/noice.nvim", }, opts = { defaults = { diff --git a/lua/plugins/whichkey.lua b/lua/plugins/whichkey.lua index d7d23b0..1924bb1 100644 --- a/lua/plugins/whichkey.lua +++ b/lua/plugins/whichkey.lua @@ -1,143 +1,144 @@ return { "folke/which-key.nvim", - config = function() - local wk = require("which-key") + opts = {}, + -- config = function() + -- local wk = require("which-key") - wk.add({ - { "C", group = "CodeCompanion", desc = "CodeCompanion", icon = "󰭻" }, - { "Ca", desc = "CodeCompanion Actions" }, - { "Cc", desc = "CodeCompanionChat" }, - { "Cd", desc = "Docstring" }, - { "Ce", desc = "Explain Code" }, - { "Ci", desc = "Inline Chat" }, - { "Cf", desc = "Fix Code" }, - { "Cl", desc = "Explain LSP Diagnostics" }, - { "Ct", desc = "Generate Tests" }, - { "CT", desc = "Toggle CodeCompanionChat" }, - -- { "Ci", desc = "Edit with Instructions" }, - -- { "Co", desc = "Optimize Code" }, - -- { "Cs", desc = "Summarize" }, - { "K", desc = "Show Docs", icon = "󱔗" }, - { "T", group = "Telescope", icon = "" }, - { "Tc", desc = "Color Names" }, - { "Tg", desc = "Glyph" }, - { "Tn", desc = "Notifications" }, - { "Tt", desc = "Telescope" }, - { "a", group = "AnyJump", icon = "" }, - { "ab", desc = "Back" }, - { "al", desc = "Last Result" }, - { "b", group = "Buffers" }, - { "bb", desc = "Show Buffers" }, - { "bd", desc = "Delete Buffer" }, - { "bn", desc = "Next Buffer" }, - { "bp", desc = "Previous Buffer" }, - { "c", group = "Code", icon = "" }, - { "cD", group = "Diagnostic List" }, - { "cDn", desc = "Next Diagnostic" }, - { "cDp", desc = "Previous Diagnostic" }, - { "ca", desc = "Code Action" }, - { "cd", desc = "Diagnostics" }, - { "cl", desc = "Set Loclist" }, - { "cp", desc = "Copilot Panel" }, - { "d", group = "Debug" }, - { "dO", desc = "Step Out" }, - { "dP", group = "Dap-python" }, - { "dPc", desc = "Test Class" }, - { "dPm", desc = "Test Method" }, - { "dPs", desc = "Debug Selection" }, - { "db", desc = "Toggle Breakpoint" }, - { "dc", desc = "Continue" }, - { "df", desc = "Frames" }, - { "dh", desc = "Hover" }, - { "di", desc = "Step Into" }, - { "dl", desc = "Run Last" }, - { "do", desc = "Step Over" }, - { "dp", desc = "Preview" }, - { "dr", desc = "REPL Open" }, - { "ds", desc = "Scopes" }, - { "du", group = "Dap UI" }, - { "duc", desc = "Close" }, - { "duo", desc = "Open" }, - { "dut", desc = "Toggle" }, - { "f", group = "Find File" }, - { "fb", desc = "File Browser" }, - { "fc", desc = "File Color" }, - { "ff", desc = "Find in Current Directory" }, - { "fg", desc = "Live Grep" }, - { "fr", desc = "File Recent" }, - { "g", group = "Git" }, - { "gP", desc = "Close goto-preview window" }, - { "gR", desc = "Telescope References" }, - { "gb", desc = "Blame" }, - { "gc", desc = "Commit" }, - { "gf", desc = "Files" }, - { "gg", desc = "Lazygit" }, - { "gp", desc = "Peek" }, - { "gpc", desc = "Close Preview" }, - { "gpd", desc = "Preview Definition" }, - { "gpi", desc = "Preview Implementation" }, - { "h", group = "Help", icon = "󰋖" }, - { "hc", desc = "Commands" }, - { "hd", group = "Dap", icon = "" }, - { "hdC", desc = "Configurations" }, - { "hdb", desc = "Breakpoints" }, - { "hdc", desc = "Commands" }, - { "hdf", desc = "Frames" }, - { "hdv", desc = "Variables" }, - { "hk", desc = "Keymaps" }, - { "hs", desc = "Spell Suggest" }, - { "hv", desc = "Vim Options" }, - { "i", group = "Insert", icon = "" }, - { "is", group = "Snippet" }, - { "isp", desc = "Python File" }, - { "j", desc = "Any Jump", icon = "" }, - { "cD", desc = "Diagnostics" }, - { "cR", desc = "Rename" }, - { "ca", desc = "Code Actions" }, - { "cc", group = "Calls" }, - { "cci", desc = "Incoming" }, - { "cco", desc = "Outgoing" }, - { "cd", desc = "Definitions" }, - { "ch", desc = "Signature Help" }, - { "ci", desc = "Implementations" }, - { "cr", desc = "References" }, - { "cs", desc = "Document Symbols" }, - { "ct", desc = "Type Definitions" }, - { "cw", desc = "Workspace Symbols" }, - { "n", desc = "NvimTree" }, - { "o", group = "Open", icon = "󰮫" }, - { "oB", desc = "Btop" }, - { "oC", desc = "Nvim Config" }, - { "oP", desc = "Ipython (fullscreen)" }, - { "ob", desc = "File Browser" }, - { "oc", desc = "CodeCompanionChat" }, - { "od", desc = "Lazydocker" }, - { "of", desc = "Floating Terminal" }, - { "oh", desc = "Horizontal Terminal" }, - { "op", desc = "Ipython" }, - { "or", desc = "Ranger" }, - { "ot", desc = "Vertical Terminal" }, - { "s", group = "Search" }, - { "sc", desc = "Clear Highlights" }, - { "sf", desc = "Files" }, - { "tG", desc = "Glyph" }, - { "sg", desc = "Grep" }, - { "sh", desc = "Command History" }, - { "sm", desc = "Man Pages" }, - { "t", group = "Toggle" }, - { "tP", desc = "Ipython (fullscreen)" }, - { "tc", desc = "Colorscheme" }, - { "td", desc = "DBUI" }, - { "tf", desc = "Floating Terminal" }, - { "tp", desc = "Ipython" }, - { "tt", desc = "Split Terminal" }, - { "w", group = "Workspace" }, - { "wa", desc = "Add Folder" }, - { "wl", desc = "List Folders" }, - { "wr", desc = "Remove Folder" }, - { "x", group = "Set Executable Bit", desc = "Set Executable Bit" }, - { "y", desc = "System Yank", icon = "" }, - { "e", desc = "Edit", icon = "" }, - }) - end, + -- wk.add({ + -- { "C", group = "CodeCompanion", desc = "CodeCompanion", icon = "󰭻" }, + -- { "Ca", desc = "CodeCompanion Actions" }, + -- { "Cc", desc = "CodeCompanionChat" }, + -- { "Cd", desc = "Docstring" }, + -- { "Ce", desc = "Explain Code" }, + -- { "Ci", desc = "Inline Chat" }, + -- { "Cf", desc = "Fix Code" }, + -- { "Cl", desc = "Explain LSP Diagnostics" }, + -- { "Ct", desc = "Generate Tests" }, + -- { "CT", desc = "Toggle CodeCompanionChat" }, + -- -- { "Ci", desc = "Edit with Instructions" }, + -- -- { "Co", desc = "Optimize Code" }, + -- -- { "Cs", desc = "Summarize" }, + -- { "K", desc = "Show Docs", icon = "󱔗" }, + -- { "T", group = "Telescope", icon = "" }, + -- { "Tc", desc = "Color Names" }, + -- { "Tg", desc = "Glyph" }, + -- { "Tn", desc = "Notifications" }, + -- { "Tt", desc = "Telescope" }, + -- { "a", group = "AnyJump", icon = "" }, + -- { "ab", desc = "Back" }, + -- { "al", desc = "Last Result" }, + -- { "b", group = "Buffers" }, + -- { "bb", desc = "Show Buffers" }, + -- { "bd", desc = "Delete Buffer" }, + -- { "bn", desc = "Next Buffer" }, + -- { "bp", desc = "Previous Buffer" }, + -- { "c", group = "Code", icon = "" }, + -- { "cD", group = "Diagnostic List" }, + -- { "cDn", desc = "Next Diagnostic" }, + -- { "cDp", desc = "Previous Diagnostic" }, + -- { "ca", desc = "Code Action" }, + -- { "cd", desc = "Diagnostics" }, + -- { "cl", desc = "Set Loclist" }, + -- { "cp", desc = "Copilot Panel" }, + -- { "d", group = "Debug" }, + -- { "dO", desc = "Step Out" }, + -- { "dP", group = "Dap-python" }, + -- { "dPc", desc = "Test Class" }, + -- { "dPm", desc = "Test Method" }, + -- { "dPs", desc = "Debug Selection" }, + -- { "db", desc = "Toggle Breakpoint" }, + -- { "dc", desc = "Continue" }, + -- { "df", desc = "Frames" }, + -- { "dh", desc = "Hover" }, + -- { "di", desc = "Step Into" }, + -- { "dl", desc = "Run Last" }, + -- { "do", desc = "Step Over" }, + -- { "dp", desc = "Preview" }, + -- { "dr", desc = "REPL Open" }, + -- { "ds", desc = "Scopes" }, + -- { "du", group = "Dap UI" }, + -- { "duc", desc = "Close" }, + -- { "duo", desc = "Open" }, + -- { "dut", desc = "Toggle" }, + -- { "f", group = "Find File" }, + -- { "fb", desc = "File Browser" }, + -- { "fc", desc = "File Color" }, + -- { "ff", desc = "Find in Current Directory" }, + -- { "fg", desc = "Live Grep" }, + -- { "fr", desc = "File Recent" }, + -- { "g", group = "Git" }, + -- { "gP", desc = "Close goto-preview window" }, + -- { "gR", desc = "Telescope References" }, + -- { "gb", desc = "Blame" }, + -- { "gc", desc = "Commit" }, + -- { "gf", desc = "Files" }, + -- { "gg", desc = "Lazygit" }, + -- { "gp", desc = "Peek" }, + -- { "gpc", desc = "Close Preview" }, + -- { "gpd", desc = "Preview Definition" }, + -- { "gpi", desc = "Preview Implementation" }, + -- { "h", group = "Help", icon = "󰋖" }, + -- { "hc", desc = "Commands" }, + -- { "hd", group = "Dap", icon = "" }, + -- { "hdC", desc = "Configurations" }, + -- { "hdb", desc = "Breakpoints" }, + -- { "hdc", desc = "Commands" }, + -- { "hdf", desc = "Frames" }, + -- { "hdv", desc = "Variables" }, + -- { "hk", desc = "Keymaps" }, + -- { "hs", desc = "Spell Suggest" }, + -- { "hv", desc = "Vim Options" }, + -- { "i", group = "Insert", icon = "" }, + -- { "is", group = "Snippet" }, + -- { "isp", desc = "Python File" }, + -- { "j", desc = "Any Jump", icon = "" }, + -- { "cD", desc = "Diagnostics" }, + -- { "cR", desc = "Rename" }, + -- { "ca", desc = "Code Actions" }, + -- { "cc", group = "Calls" }, + -- { "cci", desc = "Incoming" }, + -- { "cco", desc = "Outgoing" }, + -- { "cd", desc = "Definitions" }, + -- { "ch", desc = "Signature Help" }, + -- { "ci", desc = "Implementations" }, + -- { "cr", desc = "References" }, + -- { "cs", desc = "Document Symbols" }, + -- { "ct", desc = "Type Definitions" }, + -- { "cw", desc = "Workspace Symbols" }, + -- { "n", desc = "NvimTree" }, + -- { "o", group = "Open", icon = "󰮫" }, + -- { "oB", desc = "Btop" }, + -- { "oC", desc = "Nvim Config" }, + -- { "oP", desc = "Ipython (fullscreen)" }, + -- { "ob", desc = "File Browser" }, + -- { "oc", desc = "CodeCompanionChat" }, + -- { "od", desc = "Lazydocker" }, + -- { "of", desc = "Floating Terminal" }, + -- { "oh", desc = "Horizontal Terminal" }, + -- { "op", desc = "Ipython" }, + -- { "or", desc = "Ranger" }, + -- { "ot", desc = "Vertical Terminal" }, + -- { "s", group = "Search" }, + -- { "sc", desc = "Clear Highlights" }, + -- { "sf", desc = "Files" }, + -- { "tG", desc = "Glyph" }, + -- { "sg", desc = "Grep" }, + -- { "sh", desc = "Command History" }, + -- { "sm", desc = "Man Pages" }, + -- { "t", group = "Toggle" }, + -- { "tP", desc = "Ipython (fullscreen)" }, + -- { "tc", desc = "Colorscheme" }, + -- { "td", desc = "DBUI" }, + -- { "tf", desc = "Floating Terminal" }, + -- { "tp", desc = "Ipython" }, + -- { "tt", desc = "Split Terminal" }, + -- { "w", group = "Workspace" }, + -- { "wa", desc = "Add Folder" }, + -- { "wl", desc = "List Folders" }, + -- { "wr", desc = "Remove Folder" }, + -- { "x", group = "Set Executable Bit", desc = "Set Executable Bit" }, + -- { "y", desc = "System Yank", icon = "" }, + -- { "e", desc = "Edit", icon = "" }, + -- }) + -- end, } diff --git a/lua/util/open-docs-in-split.lua b/lua/util/open-docs-in-split.lua deleted file mode 100644 index e0d7c42..0000000 --- a/lua/util/open-docs-in-split.lua +++ /dev/null @@ -1,44 +0,0 @@ -function open_doc_in_vsplit() - local word = vim.fn.expand("") - if word == "" then - vim.notify("No word under cursor", vim.log.levels.INFO) - return - end - - -- Try to get LSP hover documentation - local params = vim.lsp.util.make_position_params() - local results = vim.lsp.buf_request_sync(0, "textDocument/hover", params, 1000) or {} - local doc_lines = nil - - for _, res in pairs(results) do - local contents = res.result and res.result.contents - if contents then - doc_lines = vim.lsp.util.convert_input_to_markdown_lines(contents) - doc_lines = vim.lsp.util.trim_empty_lines(doc_lines) - if #doc_lines > 0 then - break - end - end - end - - if doc_lines and #doc_lines > 0 then - -- Open a new vertical split for LSP hover documentation - vim.cmd("vnew") - local bufnr = vim.api.nvim_get_current_buf() - -- Set the buffer to unmodifiable scratch buffer - vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, doc_lines) - vim.bo[bufnr].modifiable = false - vim.bo[bufnr].bufhidden = "wipe" - vim.bo[bufnr].filetype = "markdown" - return - end - - -- Fallback to vim help command - local help_cmd = "vertical help " .. word - local ok, _ = pcall(vim.cmd, help_cmd) - if not ok then - vim.notify("No documentation available for '" .. word .. "'", vim.log.levels.INFO) - end -end - -return open_doc_in_vsplit diff --git a/lua/utils/extensions/init.lua b/lua/utils/extensions/init.lua new file mode 100644 index 0000000..fb1542b --- /dev/null +++ b/lua/utils/extensions/init.lua @@ -0,0 +1,3 @@ +return { + require("utils.extensions.telescope"), +} diff --git a/lua/extensions/telescope.lua b/lua/utils/extensions/telescope/init.lua similarity index 65% rename from lua/extensions/telescope.lua rename to lua/utils/extensions/telescope/init.lua index a683a40..48dadf7 100644 --- a/lua/extensions/telescope.lua +++ b/lua/utils/extensions/telescope/init.lua @@ -1,9 +1,7 @@ local ts = require("telescope") ts.load_extension("fzf") -ts.load_extension("glyph") ts.load_extension("color_names") --- ts.load_extension("notify") -ts.load_extension("cmdline") ts.load_extension("file_browser") -ts.load_extension("codecompanion") +ts.load_extension("glyph") ts.load_extension("ui-select") +ts.load_extension("noice") diff --git a/lua/utils/git_paste/init.lua b/lua/utils/git_paste/init.lua new file mode 100644 index 0000000..8c2fb74 --- /dev/null +++ b/lua/utils/git_paste/init.lua @@ -0,0 +1,57 @@ +local M = {} + +--- Fetches the content from the given URL and then pastes the contents below the current line. +---@param url string The URL to fetch (expects a Git raw URL). +function M.fetch_and_paste(url) + if not url or url == "" then + vim.notify("git-paste: No URL provided.", vim.log.levels.WARN) + return + end + + -- Use curl to fetch the raw file content + local result = vim.fn.system({ "curl", "-s", url }) + + if vim.v.shell_error ~= 0 then + vim.notify("git-paste: Failed to fetch content from URL:\n" .. result, vim.log.levels.ERROR) + return + end + + -- Split the result into lines. This creates a table with each line. + local lines = vim.split(result, "\n") + + -- Get the current cursor position. This returns a table {line, col} + -- Nvim's API for setting lines expects 0-indexed line numbers. + local pos = vim.api.nvim_win_get_cursor(0) + -- Insert the fetched lines after the current cursor line. + -- Since pos[1] is 1-indexed, we use it directly as the insertion index (which is 0-indexed) + -- when inserting *after* the current line. + local insert_at = pos[1] + vim.api.nvim_buf_set_lines(0, insert_at, insert_at, false, lines) + + vim.notify("git-paste: Content pasted successfully", vim.log.levels.INFO) +end + +--- Prompts the user for a Git raw URL and then pastes the fetched content. +function M.git_paste_prompt() + vim.ui.input({ prompt = "Git raw URL: " }, function(input) + if input then + M.fetch_and_paste(input) + else + vim.notify("git-paste: No URL provided", vim.log.levels.WARN) + end + end) +end + +--- Sets up the git-paste module. +--- +--- The module expects an optional configuration table: +--- { telescope_key = "pg" } (or any other keymap you prefer) +--- +---@param opts table|nil +function M.setup(opts) + opts = opts or {} + local telescope_key = opts.telescope_key or "pg" + vim.keymap.set("n", telescope_key, M.git_paste_prompt, { desc = "Git Paste: paste content from git raw URL" }) +end + +return M diff --git a/lua/utils/keymaps/converters/from_table/init.lua b/lua/utils/keymaps/converters/from_table/init.lua new file mode 100644 index 0000000..53a1c7f --- /dev/null +++ b/lua/utils/keymaps/converters/from_table/init.lua @@ -0,0 +1,12 @@ +local M = {} +local map = vim.keymap.set +local opts = { noremap = true, silent = true } + +function M.set_keybindings(bindings) + for _, binding in ipairs(bindings) do + map(binding.mode, binding.key, binding.cmd, binding.opts or opts) + end + return bindings +end + +return M diff --git a/lua/utils/keymaps/converters/whichkey/init.lua b/lua/utils/keymaps/converters/whichkey/init.lua new file mode 100644 index 0000000..b19eb4b --- /dev/null +++ b/lua/utils/keymaps/converters/whichkey/init.lua @@ -0,0 +1,48 @@ +local M = {} + +local whichkey = require("which-key") +vim.notify = require("notify") + +---Helper function to add mappings to which-key +---@parm mappings table : List of mappings to add to which-key +---@parm group table : Group to add mappings to (optional) +---@return nil +---@usage addToWhichKey(mappings, group) +---@example addToWhichKey({{key = "n", cmd = "next", mode = "n", desc = "Next Line", group = "Navigation"}, {key = "t", group = "example"}) +function M.addToWhichKey(mappings, group) + local wk_mappings = {} + if group then + whichkey.add({ group.key, group = group.group }) + end + if not mappings and not group then + vim.notify("Error: Mappings is nil", "error") + return + elseif not mappings and group then + return + end + for _, mapping in ipairs(mappings) do + if not mapping.key or mapping.key == "" then + vim.notify("Error: Key is empty or nil", "error") + return + end + + if not mapping.cmd or mapping.cmd == "" then + vim.notify("Error: Command is empty or nil for key: " .. mapping.key, "error") + return + end + + if not mapping.mode or mapping.mode == "" then + vim.notify("Error: Mode is empty or nil for key: " .. mapping.key, "error") + return + end + + wk_mappings[1] = mapping.key + wk_mappings[2] = mapping.cmd + wk_mappings.mode = mapping.mode + wk_mappings.desc = mapping.desc or "No Description" + wk_mappings.group = mapping.group or "No Group" + whichkey.add(wk_mappings) + end +end + +return M diff --git a/lua/utils/keymaps/init.lua b/lua/utils/keymaps/init.lua new file mode 100644 index 0000000..5c580c4 --- /dev/null +++ b/lua/utils/keymaps/init.lua @@ -0,0 +1,4 @@ +return { + require('utils.keymaps.converters.whichkey'), + require('utils.keymaps.converters.from_table'), +} diff --git a/lua/utils/telescope_extra/init.lua b/lua/utils/telescope_extra/init.lua new file mode 100644 index 0000000..a23b420 --- /dev/null +++ b/lua/utils/telescope_extra/init.lua @@ -0,0 +1,68 @@ +local telescope = require("telescope") +local telescopeConfig = require("telescope.config") + +local M = {} + +function M.setup() + -- Clone the default Telescope configuration + local vimgrep_arguments = { unpack(telescopeConfig.values.vimgrep_arguments) } + + -- I want to search in hidden/dot files. + table.insert(vimgrep_arguments, "--hidden") + -- I don't want to search in the `.git` directory. + table.insert(vimgrep_arguments, "--glob") + table.insert(vimgrep_arguments, "!**/.git/*") + telescope.setup({ + defaults = { + -- `hidden = true` is not supported in text grep commands. + vimgrep_arguments = vimgrep_arguments, + }, + pickers = { + find_files = { + -- `hidden = true` will still show the inside of `.git/` as it's not `.gitignore`d. + find_command = { "rg", "--files", "--hidden", "--glob", "!**/.git/*" }, + mappings = { + n = { + ["cd"] = function(prompt_bufnr) + local selection = require("telescope.actions.state").get_selected_entry() + local dir = vim.fn.fnamemodify(selection.path, ":p:h") + require("telescope.actions").close(prompt_bufnr) + -- Depending on what you want put `cd`, `lcd`, `tcd` + vim.cmd(string.format("silent lcd %s", dir)) + end, + }, + }, + }, + }, + preview = { + -- show images in telescope using kitty + mime_hook = function(filepath, bufnr, opts) + local is_image = function(filepath) + local image_extensions = { "png", "jpg" } -- Supported image formats + local split_path = vim.split(filepath:lower(), ".", { plain = true }) + local extension = split_path[#split_path] + return vim.tbl_contains(image_extensions, extension) + end + if is_image(filepath) then + local term = vim.api.nvim_open_term(bufnr, {}) + local function send_output(_, data, _) + for _, d in ipairs(data) do + vim.api.nvim_chan_send(term, d .. "\r\n") + end + end + vim.fn.jobstart({ + "kitty +icat " .. filepath, -- Terminal image viewer command + }, { on_stdout = send_output, stdout_buffered = true, pty = true }) + else + require("telescope.previewers.utils").set_preview_message( + bufnr, + opts.winid, + "Binary cannot be previewed" + ) + end + end, + }, + }) +end + +return M diff --git a/lua/utils/terminal/init.lua b/lua/utils/terminal/init.lua new file mode 100644 index 0000000..f0330c0 --- /dev/null +++ b/lua/utils/terminal/init.lua @@ -0,0 +1,6 @@ +local M = {} + +M.term_factory = require("utils.terminal.term_factory").term_factory +M.term_toggle = require("utils.terminal.toggle").term_toggle + +return M diff --git a/lua/utils/terminal/term_factory/init.lua b/lua/utils/terminal/term_factory/init.lua new file mode 100644 index 0000000..a19200c --- /dev/null +++ b/lua/utils/terminal/term_factory/init.lua @@ -0,0 +1,12 @@ +local Terminal = require("toggleterm.terminal").Terminal +local notify = require("notify") +local M = {} + +function M.term_factory(cfg) + cfg["on_stderr"] = function(_, job, data, name) + notify(name .. " encountered an error on job: " .. job .. "\nData: " .. data, "error") + end + return Terminal:new(cfg) +end + +return M diff --git a/lua/utils/terminal/toggle/init.lua b/lua/utils/terminal/toggle/init.lua new file mode 100644 index 0000000..6488154 --- /dev/null +++ b/lua/utils/terminal/toggle/init.lua @@ -0,0 +1,9 @@ +local M = {} + +function M.term_toggle(term) + if term then + term:toggle() + end +end + +return M