diff options
Diffstat (limited to 'nvim/nvchad/lua/core')
-rw-r--r-- | nvim/nvchad/lua/core/bootstrap.lua | 62 | ||||
-rw-r--r-- | nvim/nvchad/lua/core/default_config.lua | 92 | ||||
-rw-r--r-- | nvim/nvchad/lua/core/init.lua | 138 | ||||
-rw-r--r-- | nvim/nvchad/lua/core/mappings.lua | 468 | ||||
-rw-r--r-- | nvim/nvchad/lua/core/utils.lua | 118 |
5 files changed, 878 insertions, 0 deletions
diff --git a/nvim/nvchad/lua/core/bootstrap.lua b/nvim/nvchad/lua/core/bootstrap.lua new file mode 100644 index 0000000..a5d5c68 --- /dev/null +++ b/nvim/nvchad/lua/core/bootstrap.lua @@ -0,0 +1,62 @@ +local M = {} +local fn = vim.fn + +M.echo = function(str) + vim.cmd "redraw" + vim.api.nvim_echo({ { str, "Bold" } }, true, {}) +end + +local function shell_call(args) + local output = fn.system(args) + assert(vim.v.shell_error == 0, "External call failed with error code: " .. vim.v.shell_error .. "\n" .. output) +end + +M.lazy = function(install_path) + ------------- base46 --------------- + local lazy_path = fn.stdpath "data" .. "/lazy/base46" + + M.echo " Compiling base46 theme to bytecode ..." + + local base46_repo = "https://github.com/NvChad/base46" + shell_call { "git", "clone", "--depth", "1", "-b", "v2.0", base46_repo, lazy_path } + vim.opt.rtp:prepend(lazy_path) + + require("base46").compile() + + --------- lazy.nvim --------------- + M.echo " Installing lazy.nvim & plugins ..." + local repo = "https://github.com/folke/lazy.nvim.git" + shell_call { "git", "clone", "--filter=blob:none", "--branch=stable", repo, install_path } + vim.opt.rtp:prepend(install_path) + + -- install plugins + require "plugins" + + -- mason packages & show post_bootstrap screen + require "nvchad.post_install"() +end + +M.gen_chadrc_template = function() + local path = fn.stdpath "config" .. "/lua/custom" + + if fn.isdirectory(path) ~= 1 then + local input = vim.env.NVCHAD_EXAMPLE_CONFIG or fn.input "Do you want to install example custom config? (y/N): " + + if input:lower() == "y" then + M.echo "Cloning example custom config repo..." + shell_call { "git", "clone", "--depth", "1", "https://github.com/NvChad/example_config", path } + fn.delete(path .. "/.git", "rf") + else + -- use very minimal chadrc + fn.mkdir(path, "p") + + local file = io.open(path .. "/chadrc.lua", "w") + if file then + file:write "---@type ChadrcConfig\nlocal M = {}\n\nM.ui = { theme = 'onedark' }\n\nreturn M" + file:close() + end + end + end +end + +return M diff --git a/nvim/nvchad/lua/core/default_config.lua b/nvim/nvchad/lua/core/default_config.lua new file mode 100644 index 0000000..639916a --- /dev/null +++ b/nvim/nvchad/lua/core/default_config.lua @@ -0,0 +1,92 @@ +local M = {} + +M.options = { + nvchad_branch = "v2.0", +} + +M.ui = { + ------------------------------- base46 ------------------------------------- + -- hl = highlights + hl_add = {}, + hl_override = {}, + changed_themes = {}, + theme_toggle = { "onedark", "one_light" }, + theme = "onedark", -- default theme + transparency = false, + lsp_semantic_tokens = false, -- needs nvim v0.9, just adds highlight groups for lsp semantic tokens + + -- https://github.com/NvChad/base46/tree/v2.0/lua/base46/extended_integrations + extended_integrations = {}, -- these aren't compiled by default, ex: "alpha", "notify" + + -- cmp themeing + cmp = { + icons = true, + lspkind_text = true, + style = "default", -- default/flat_light/flat_dark/atom/atom_colored + border_color = "grey_fg", -- only applicable for "default" style, use color names from base30 variables + selected_item_bg = "colored", -- colored / simple + }, + + telescope = { style = "borderless" }, -- borderless / bordered + + ------------------------------- nvchad_ui modules ----------------------------- + statusline = { + theme = "default", -- default/vscode/vscode_colored/minimal + -- default/round/block/arrow separators work only for default statusline theme + -- round and block will work for minimal theme only + separator_style = "default", + overriden_modules = nil, + }, + + -- lazyload it when there are 1+ buffers + tabufline = { + show_numbers = false, + enabled = true, + lazyload = true, + overriden_modules = nil, + }, + + -- nvdash (dashboard) + nvdash = { + load_on_startup = false, + + header = { + " ▄ ▄ ", + " ▄ ▄▄▄ ▄ ▄▄▄ ▄ ▄ ", + " █ ▄ █▄█ ▄▄▄ █ █▄█ █ █ ", + " ▄▄ █▄█▄▄▄█ █▄█▄█▄▄█▄▄█ █ ", + " ▄ █▄▄█ ▄ ▄▄ ▄█ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ", + " █▄▄▄▄ ▄▄▄ █ ▄ ▄▄▄ ▄ ▄▄▄ ▄ ▄ █ ▄", + "▄ █ █▄█ █▄█ █ █ █▄█ █ █▄█ ▄▄▄ █ █", + "█▄█ ▄ █▄▄█▄▄█ █ ▄▄█ █ ▄ █ █▄█▄█ █", + " █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█ █▄█▄▄▄█ ", + }, + + buttons = { + { " Find File", "Spc f f", "Telescope find_files" }, + { " Recent Files", "Spc f o", "Telescope oldfiles" }, + { " Find Word", "Spc f w", "Telescope live_grep" }, + { " Bookmarks", "Spc m a", "Telescope marks" }, + { " Themes", "Spc t h", "Telescope themes" }, + { " Mappings", "Spc c h", "NvCheatsheet" }, + }, + }, + + cheatsheet = { theme = "grid" }, -- simple/grid + + lsp = { + -- show function signatures i.e args as you type + signature = { + disabled = false, + silent = true, -- silences 'no signature help available' message from appearing + }, + }, +} + +M.plugins = "" -- path i.e "custom.plugins", so make custom/plugins.lua file + +M.lazy_nvim = require "plugins.configs.lazy_nvim" -- config for lazy.nvim startup options + +M.mappings = require "core.mappings" + +return M diff --git a/nvim/nvchad/lua/core/init.lua b/nvim/nvchad/lua/core/init.lua new file mode 100644 index 0000000..8d19174 --- /dev/null +++ b/nvim/nvchad/lua/core/init.lua @@ -0,0 +1,138 @@ +local opt = vim.opt +local g = vim.g +local config = require("core.utils").load_config() + +-------------------------------------- globals ----------------------------------------- +g.nvchad_theme = config.ui.theme +g.base46_cache = vim.fn.stdpath "data" .. "/nvchad/base46/" +g.toggle_theme_icon = " " +g.transparency = config.ui.transparency + +-------------------------------------- options ------------------------------------------ +opt.laststatus = 3 -- global statusline +opt.showmode = false + +opt.clipboard = "unnamedplus" +opt.cursorline = true + +-- Indenting +opt.expandtab = true +opt.shiftwidth = 2 +opt.smartindent = true +opt.tabstop = 2 +opt.softtabstop = 2 + +opt.fillchars = { eob = " " } +opt.ignorecase = true +opt.smartcase = true +opt.mouse = "a" + +-- Numbers +opt.number = true +opt.numberwidth = 2 +opt.ruler = false + +-- disable nvim intro +opt.shortmess:append "sI" + +opt.signcolumn = "yes" +opt.splitbelow = true +opt.splitright = true +opt.termguicolors = true +opt.timeoutlen = 400 +opt.undofile = true + +-- interval for writing swap file to disk, also used by gitsigns +opt.updatetime = 250 + +-- go to previous/next line with h,l,left arrow and right arrow +-- when cursor reaches end/beginning of line +opt.whichwrap:append "<>[]hl" + +g.mapleader = " " + +-- disable some default providers +for _, provider in ipairs { "node", "perl", "python3", "ruby" } do + vim.g["loaded_" .. provider .. "_provider"] = 0 +end + +-- add binaries installed by mason.nvim to path +local is_windows = vim.loop.os_uname().sysname == "Windows_NT" +vim.env.PATH = vim.fn.stdpath "data" .. "/mason/bin" .. (is_windows and ";" or ":") .. vim.env.PATH + +-------------------------------------- autocmds ------------------------------------------ +local autocmd = vim.api.nvim_create_autocmd + +-- dont list quickfix buffers +autocmd("FileType", { + pattern = "qf", + callback = function() + vim.opt_local.buflisted = false + end, +}) + +-- reload some chadrc options on-save +autocmd("BufWritePost", { + pattern = vim.tbl_map(function(path) + return vim.fs.normalize(vim.loop.fs_realpath(path)) + end, vim.fn.glob(vim.fn.stdpath "config" .. "/lua/custom/**/*.lua", true, true, true)), + group = vim.api.nvim_create_augroup("ReloadNvChad", {}), + + callback = function(opts) + local fp = vim.fn.fnamemodify(vim.fs.normalize(vim.api.nvim_buf_get_name(opts.buf)), ":r") --[[@as string]] + local app_name = vim.env.NVIM_APPNAME and vim.env.NVIM_APPNAME or "nvim" + local module = string.gsub(fp, "^.*/" .. app_name .. "/lua/", ""):gsub("/", ".") + + require("plenary.reload").reload_module "base46" + require("plenary.reload").reload_module(module) + require("plenary.reload").reload_module "custom.chadrc" + + config = require("core.utils").load_config() + + vim.g.nvchad_theme = config.ui.theme + vim.g.transparency = config.ui.transparency + + -- statusline + require("plenary.reload").reload_module("nvchad.statusline." .. config.ui.statusline.theme) + vim.opt.statusline = "%!v:lua.require('nvchad.statusline." .. config.ui.statusline.theme .. "').run()" + + -- tabufline + if config.ui.tabufline.enabled then + require("plenary.reload").reload_module "nvchad.tabufline.modules" + vim.opt.tabline = "%!v:lua.require('nvchad.tabufline.modules').run()" + end + + require("base46").load_all_highlights() + -- vim.cmd("redraw!") + end, +}) + +-- user event that loads after UIEnter + only if file buf is there +vim.api.nvim_create_autocmd({ "UIEnter", "BufReadPost", "BufNewFile" }, { + group = vim.api.nvim_create_augroup("NvFilePost", { clear = true }), + callback = function(args) + local file = vim.api.nvim_buf_get_name(args.buf) + local buftype = vim.api.nvim_buf_get_option(args.buf, "buftype") + + if not vim.g.ui_entered and args.event == "UIEnter" then + vim.g.ui_entered = true + end + + if file ~= "" and buftype ~= "nofile" and vim.g.ui_entered then + vim.api.nvim_exec_autocmds("User", { pattern = "FilePost", modeline = false }) + vim.api.nvim_del_augroup_by_name "NvFilePost" + + vim.schedule(function() + vim.api.nvim_exec_autocmds("FileType", {}) + require("editorconfig").config(args.buf) + end, 0) + end + end, +}) + +-------------------------------------- commands ------------------------------------------ +local new_cmd = vim.api.nvim_create_user_command + +new_cmd("NvChadUpdate", function() + require "nvchad.updater"() +end, {}) diff --git a/nvim/nvchad/lua/core/mappings.lua b/nvim/nvchad/lua/core/mappings.lua new file mode 100644 index 0000000..0a652a7 --- /dev/null +++ b/nvim/nvchad/lua/core/mappings.lua @@ -0,0 +1,468 @@ +-- n, v, i, t = mode names + +local M = {} + +M.general = { + i = { + -- go to beginning and end + ["<C-b>"] = { "<ESC>^i", "Beginning of line" }, + ["<C-e>"] = { "<End>", "End of line" }, + + -- navigate within insert mode + ["<C-h>"] = { "<Left>", "Move left" }, + ["<C-l>"] = { "<Right>", "Move right" }, + ["<C-j>"] = { "<Down>", "Move down" }, + ["<C-k>"] = { "<Up>", "Move up" }, + }, + + n = { + ["<Esc>"] = { "<cmd> noh <CR>", "Clear highlights" }, + -- switch between windows + ["<C-h>"] = { "<C-w>h", "Window left" }, + ["<C-l>"] = { "<C-w>l", "Window right" }, + ["<C-j>"] = { "<C-w>j", "Window down" }, + ["<C-k>"] = { "<C-w>k", "Window up" }, + + -- save + ["<C-s>"] = { "<cmd> w <CR>", "Save file" }, + + -- Copy all + ["<C-c>"] = { "<cmd> %y+ <CR>", "Copy whole file" }, + + -- line numbers + ["<leader>n"] = { "<cmd> set nu! <CR>", "Toggle line number" }, + ["<leader>rn"] = { "<cmd> set rnu! <CR>", "Toggle relative number" }, + + -- Allow moving the cursor through wrapped lines with j, k, <Up> and <Down> + -- http://www.reddit.com/r/vim/comments/2k4cbr/problem_with_gj_and_gk/ + -- empty mode is same as using <cmd> :map + -- also don't use g[j|k] when in operator pending mode, so it doesn't alter d, y or c behaviour + ["j"] = { 'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down", opts = { expr = true } }, + ["k"] = { 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up", opts = { expr = true } }, + ["<Up>"] = { 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up", opts = { expr = true } }, + ["<Down>"] = { 'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down", opts = { expr = true } }, + + -- new buffer + ["<leader>b"] = { "<cmd> enew <CR>", "New buffer" }, + ["<leader>ch"] = { "<cmd> NvCheatsheet <CR>", "Mapping cheatsheet" }, + + ["<leader>fm"] = { + function() + vim.lsp.buf.format { async = true } + end, + "LSP formatting", + }, + }, + + t = { + ["<C-x>"] = { vim.api.nvim_replace_termcodes("<C-\\><C-N>", true, true, true), "Escape terminal mode" }, + }, + + v = { + ["<Up>"] = { 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up", opts = { expr = true } }, + ["<Down>"] = { 'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down", opts = { expr = true } }, + ["<"] = { "<gv", "Indent line" }, + [">"] = { ">gv", "Indent line" }, + }, + + x = { + ["j"] = { 'v:count || mode(1)[0:1] == "no" ? "j" : "gj"', "Move down", opts = { expr = true } }, + ["k"] = { 'v:count || mode(1)[0:1] == "no" ? "k" : "gk"', "Move up", opts = { expr = true } }, + -- Don't copy the replaced text after pasting in visual mode + -- https://vim.fandom.com/wiki/Replace_a_word_with_yanked_text#Alternative_mapping_for_paste + ["p"] = { 'p:let @+=@0<CR>:let @"=@0<CR>', "Dont copy replaced text", opts = { silent = true } }, + }, +} + +M.tabufline = { + plugin = true, + + n = { + -- cycle through buffers + ["<tab>"] = { + function() + require("nvchad.tabufline").tabuflineNext() + end, + "Goto next buffer", + }, + + ["<S-tab>"] = { + function() + require("nvchad.tabufline").tabuflinePrev() + end, + "Goto prev buffer", + }, + + -- close buffer + hide terminal buffer + ["<leader>x"] = { + function() + require("nvchad.tabufline").close_buffer() + end, + "Close buffer", + }, + }, +} + +M.comment = { + plugin = true, + + -- toggle comment in both modes + n = { + ["<leader>/"] = { + function() + require("Comment.api").toggle.linewise.current() + end, + "Toggle comment", + }, + }, + + v = { + ["<leader>/"] = { + "<ESC><cmd>lua require('Comment.api').toggle.linewise(vim.fn.visualmode())<CR>", + "Toggle comment", + }, + }, +} + +M.lspconfig = { + plugin = true, + + -- See `<cmd> :help vim.lsp.*` for documentation on any of the below functions + + n = { + ["gD"] = { + function() + vim.lsp.buf.declaration() + end, + "LSP declaration", + }, + + ["gd"] = { + function() + vim.lsp.buf.definition() + end, + "LSP definition", + }, + + ["K"] = { + function() + vim.lsp.buf.hover() + end, + "LSP hover", + }, + + ["gi"] = { + function() + vim.lsp.buf.implementation() + end, + "LSP implementation", + }, + + ["<leader>ls"] = { + function() + vim.lsp.buf.signature_help() + end, + "LSP signature help", + }, + + ["<leader>D"] = { + function() + vim.lsp.buf.type_definition() + end, + "LSP definition type", + }, + + ["<leader>ra"] = { + function() + require("nvchad.renamer").open() + end, + "LSP rename", + }, + + ["<leader>ca"] = { + function() + vim.lsp.buf.code_action() + end, + "LSP code action", + }, + + ["gr"] = { + function() + vim.lsp.buf.references() + end, + "LSP references", + }, + + ["<leader>lf"] = { + function() + vim.diagnostic.open_float { border = "rounded" } + end, + "Floating diagnostic", + }, + + ["[d"] = { + function() + vim.diagnostic.goto_prev { float = { border = "rounded" } } + end, + "Goto prev", + }, + + ["]d"] = { + function() + vim.diagnostic.goto_next { float = { border = "rounded" } } + end, + "Goto next", + }, + + ["<leader>q"] = { + function() + vim.diagnostic.setloclist() + end, + "Diagnostic setloclist", + }, + + ["<leader>wa"] = { + function() + vim.lsp.buf.add_workspace_folder() + end, + "Add workspace folder", + }, + + ["<leader>wr"] = { + function() + vim.lsp.buf.remove_workspace_folder() + end, + "Remove workspace folder", + }, + + ["<leader>wl"] = { + function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, + "List workspace folders", + }, + }, + + v = { + ["<leader>ca"] = { + function() + vim.lsp.buf.code_action() + end, + "LSP code action", + }, + }, +} + +M.nvimtree = { + plugin = true, + + n = { + -- toggle + ["<C-n>"] = { "<cmd> NvimTreeToggle <CR>", "Toggle nvimtree" }, + + -- focus + ["<leader>e"] = { "<cmd> NvimTreeFocus <CR>", "Focus nvimtree" }, + }, +} + +M.telescope = { + plugin = true, + + n = { + -- find + ["<leader>ff"] = { "<cmd> Telescope find_files <CR>", "Find files" }, + ["<leader>fa"] = { "<cmd> Telescope find_files follow=true no_ignore=true hidden=true <CR>", "Find all" }, + ["<leader>fw"] = { "<cmd> Telescope live_grep <CR>", "Live grep" }, + ["<leader>fb"] = { "<cmd> Telescope buffers <CR>", "Find buffers" }, + ["<leader>fh"] = { "<cmd> Telescope help_tags <CR>", "Help page" }, + ["<leader>fo"] = { "<cmd> Telescope oldfiles <CR>", "Find oldfiles" }, + ["<leader>fz"] = { "<cmd> Telescope current_buffer_fuzzy_find <CR>", "Find in current buffer" }, + + -- git + ["<leader>cm"] = { "<cmd> Telescope git_commits <CR>", "Git commits" }, + ["<leader>gt"] = { "<cmd> Telescope git_status <CR>", "Git status" }, + + -- pick a hidden term + ["<leader>pt"] = { "<cmd> Telescope terms <CR>", "Pick hidden term" }, + + -- theme switcher + ["<leader>th"] = { "<cmd> Telescope themes <CR>", "Nvchad themes" }, + + ["<leader>ma"] = { "<cmd> Telescope marks <CR>", "telescope bookmarks" }, + }, +} + +M.nvterm = { + plugin = true, + + t = { + -- toggle in terminal mode + ["<A-i>"] = { + function() + require("nvterm.terminal").toggle "float" + end, + "Toggle floating term", + }, + + ["<A-h>"] = { + function() + require("nvterm.terminal").toggle "horizontal" + end, + "Toggle horizontal term", + }, + + ["<A-v>"] = { + function() + require("nvterm.terminal").toggle "vertical" + end, + "Toggle vertical term", + }, + }, + + n = { + -- toggle in normal mode + ["<A-i>"] = { + function() + require("nvterm.terminal").toggle "float" + end, + "Toggle floating term", + }, + + ["<A-h>"] = { + function() + require("nvterm.terminal").toggle "horizontal" + end, + "Toggle horizontal term", + }, + + ["<A-v>"] = { + function() + require("nvterm.terminal").toggle "vertical" + end, + "Toggle vertical term", + }, + + -- new + ["<leader>h"] = { + function() + require("nvterm.terminal").new "horizontal" + end, + "New horizontal term", + }, + + ["<leader>v"] = { + function() + require("nvterm.terminal").new "vertical" + end, + "New vertical term", + }, + }, +} + +M.whichkey = { + plugin = true, + + n = { + ["<leader>wK"] = { + function() + vim.cmd "WhichKey" + end, + "Which-key all keymaps", + }, + ["<leader>wk"] = { + function() + local input = vim.fn.input "WhichKey: " + vim.cmd("WhichKey " .. input) + end, + "Which-key query lookup", + }, + }, +} + +M.blankline = { + plugin = true, + + n = { + ["<leader>cc"] = { + function() + local ok, start = require("indent_blankline.utils").get_current_context( + vim.g.indent_blankline_context_patterns, + vim.g.indent_blankline_use_treesitter_scope + ) + + if ok then + vim.api.nvim_win_set_cursor(vim.api.nvim_get_current_win(), { start, 0 }) + vim.cmd [[normal! _]] + end + end, + + "Jump to current context", + }, + }, +} + +M.gitsigns = { + plugin = true, + + n = { + -- Navigation through hunks + ["]c"] = { + function() + if vim.wo.diff then + return "]c" + end + vim.schedule(function() + require("gitsigns").next_hunk() + end) + return "<Ignore>" + end, + "Jump to next hunk", + opts = { expr = true }, + }, + + ["[c"] = { + function() + if vim.wo.diff then + return "[c" + end + vim.schedule(function() + require("gitsigns").prev_hunk() + end) + return "<Ignore>" + end, + "Jump to prev hunk", + opts = { expr = true }, + }, + + -- Actions + ["<leader>rh"] = { + function() + require("gitsigns").reset_hunk() + end, + "Reset hunk", + }, + + ["<leader>ph"] = { + function() + require("gitsigns").preview_hunk() + end, + "Preview hunk", + }, + + ["<leader>gb"] = { + function() + package.loaded.gitsigns.blame_line() + end, + "Blame line", + }, + + ["<leader>td"] = { + function() + require("gitsigns").toggle_deleted() + end, + "Toggle deleted", + }, + }, +} + +return M diff --git a/nvim/nvchad/lua/core/utils.lua b/nvim/nvchad/lua/core/utils.lua new file mode 100644 index 0000000..8b2a03d --- /dev/null +++ b/nvim/nvchad/lua/core/utils.lua @@ -0,0 +1,118 @@ +local M = {} +local merge_tb = vim.tbl_deep_extend + +M.load_config = function() + local config = require "core.default_config" + local chadrc_path = vim.api.nvim_get_runtime_file("lua/custom/chadrc.lua", false)[1] + + if chadrc_path then + local chadrc = dofile(chadrc_path) + + config.mappings = M.remove_disabled_keys(chadrc.mappings, config.mappings) + config = merge_tb("force", config, chadrc) + config.mappings.disabled = nil + end + + return config +end + +M.remove_disabled_keys = function(chadrc_mappings, default_mappings) + if not chadrc_mappings then + return default_mappings + end + + -- store keys in a array with true value to compare + local keys_to_disable = {} + for _, mappings in pairs(chadrc_mappings) do + for mode, section_keys in pairs(mappings) do + if not keys_to_disable[mode] then + keys_to_disable[mode] = {} + end + section_keys = (type(section_keys) == "table" and section_keys) or {} + for k, _ in pairs(section_keys) do + keys_to_disable[mode][k] = true + end + end + end + + -- make a copy as we need to modify default_mappings + for section_name, section_mappings in pairs(default_mappings) do + for mode, mode_mappings in pairs(section_mappings) do + mode_mappings = (type(mode_mappings) == "table" and mode_mappings) or {} + for k, _ in pairs(mode_mappings) do + -- if key if found then remove from default_mappings + if keys_to_disable[mode] and keys_to_disable[mode][k] then + default_mappings[section_name][mode][k] = nil + end + end + end + end + + return default_mappings +end + +M.load_mappings = function(section, mapping_opt) + vim.schedule(function() + local function set_section_map(section_values) + if section_values.plugin then + return + end + + section_values.plugin = nil + + for mode, mode_values in pairs(section_values) do + local default_opts = merge_tb("force", { mode = mode }, mapping_opt or {}) + for keybind, mapping_info in pairs(mode_values) do + -- merge default + user opts + local opts = merge_tb("force", default_opts, mapping_info.opts or {}) + + mapping_info.opts, opts.mode = nil, nil + opts.desc = mapping_info[2] + + vim.keymap.set(mode, keybind, mapping_info[1], opts) + end + end + end + + local mappings = require("core.utils").load_config().mappings + + if type(section) == "string" then + mappings[section]["plugin"] = nil + mappings = { mappings[section] } + end + + for _, sect in pairs(mappings) do + set_section_map(sect) + end + end) +end + +M.lazy_load = function(plugin) + vim.api.nvim_create_autocmd({ "BufRead", "BufWinEnter", "BufNewFile" }, { + group = vim.api.nvim_create_augroup("BeLazyOnFileOpen" .. plugin, {}), + callback = function() + local file = vim.fn.expand "%" + local condition = file ~= "NvimTree_1" and file ~= "[lazy]" and file ~= "" + + if condition then + vim.api.nvim_del_augroup_by_name("BeLazyOnFileOpen" .. plugin) + + -- dont defer for treesitter as it will show slow highlighting + -- This deferring only happens only when we do "nvim filename" + if plugin ~= "nvim-treesitter" then + vim.schedule(function() + require("lazy").load { plugins = plugin } + + if plugin == "nvim-lspconfig" then + vim.cmd "silent! do FileType" + end + end, 0) + else + require("lazy").load { plugins = plugin } + end + end + end, + }) +end + +return M |