--[[ key.lua ]] ------------- Shorten Function Names -------------- local keymap = vim.keymap local map = function(mode, l, r, opts) opts = opts or {} opts.silent = true opts.noremap = true keymap.set(mode, l, r, opts) end local term_opts = { noremap = true, silent = false } --------------- Standard Operations --------------- -- Semi-colon as leader key vim.g.mapleader = ";" -- "jk" and "kj" to exit insert-mode map("i", "jk", "") map("i", "kj", "") -- Jump to next match on line using `.` instead of `;` NOTE: commented out in favour of "ggandor/flit.nvim" --map("n", ".", ";") -- Repeat last command using `` instead of `.` NOTE: commented out in favour of "ggandor/flit.nvim" --map("n", "", ".") -- Reload nvim config map( "n", "", "luafile ~/.config/nvim/init.lua | :echom ('Nvim config loading...') | :sl! | echo ('')" ) --------------- Extended Operations --------------- -- Conditional 'q' to quit on floating/quickfix/help windows otherwise still use it for macros -- TODO: Have a list of if available on system/packages, example "Zen Mode" to not work on it (quit Zen Mode) map("n", "q", function() local config = vim.api.nvim_win_get_config(0) if config.relative ~= "" then -- is_floating_window? return ":silent! close!" elseif vim.o.buftype == "quickfix" then return ":quit" elseif vim.o.buftype == "help" then return ":close" else return "q" end end, { expr = true, replace_keycodes = true }) -- Combine buffers list with buffer name map("n", "b", ":buffers:buffer") -- Buffer confirmation map("n", "y", ":BufferPick") -- Map buffer next, prev and delete to +(n/p/d) respectively map("n", "n", ":bn") map("n", "p", ":bp") map("n", "d", ":bd") -- List marks map("n", "m", ":marks") -- Messages map("n", "M", ":messages") -- Clear messages -- Clear messages or just refresh/redraw the screen map("n", "u", ":echo '' | redraw") -- Unsets the 'last search pattern' register by hitting return --map("n", "", "!silent :noh") -- Toggle set number map("n", "$", ":NumbersToggle") map("n", "%", ":NumbersOnOff") -- Easier split navigations, just ctrl-j instead of ctrl-w then j --map("n", "", "") --map("n", "", "") --map("n", "", "") --map("n", "", "") map("t", "", "") map("t", "", "") map("t", "", "") map("t", "", "") map("t", "", "") --map("t", "", "") --map("n", "", "") --map("n", "", ":call MyFunc(v:count)") -- Split window map("n", "h", ":split") map("n", "v", ":vsplit") map("n", "c", "c") -- Resize Panes map("n", "+", ":resize +5") map("n", "-", ":resize -5") map("n", "<", ":vertical resize +5") map("n", ">", ":vertical resize -5") map("n", "=", "=") -- Map Alt+(h/j/k/l) in insert mode to move directional map("i", "", "") map("i", "", "") map("i", "", "") map("i", "", "") -- Map Alt+(h/j/k/l) in command mode to move directional vim.api.nvim_set_keymap("c", "", "", { noremap = true }) vim.api.nvim_set_keymap("c", "", "", { noremap = true }) vim.api.nvim_set_keymap("c", "", "", { noremap = true }) vim.api.nvim_set_keymap("c", "", "", { noremap = true }) -- Create tab, edit and move between them map("n", "n", ":tabnew") map("n", "e", ":tabedit") map("n", "[", ":tabprev") map("n", "]", ":tabnext") -- "Zoom" a split window into a tab and/or close it --map("n", ",", ":tabnew %") --map("n", ".", ":tabclose") -- Vim TABs map("n", "1", "1gt") map("n", "2", "2gt") map("n", "3", "3gt") map("n", "4", "4gt") map("n", "5", "5gt") map("n", "6", "6gt") map("n", "7", "7gt") map("n", "8", "8gt") map("n", "9", "9gt") map("n", "0", "10gt") -- Move to the next and previous item in the quickfixlist --map("n", "]c", "cnext") --map("n", "[c", "cprevious") -- Hitting ESC when inside a terminal to get into normal mode --map("t", "", [[]]) -- Move block (indentation) easily map("n", "<", "<<", term_opts) map("n", ">", ">>", term_opts) map("x", "<", "", ">gv", term_opts) -- Set alt+(j/k) to switch lines of texts or simply move them map("n", "", ':let save_a=@a"add"ap:let @a=save_a') map("n", "", ':let save_a=@a"add"ap:let @a=save_a') -- Search and replace map("v", "sr", 'y:%s/"//gc') -- Toggle Diff map("n", "td", "call utils#ToggleDiff()") -- Toggle Verbose map("n", "vt", "call utils#VerboseToggle()") -- Jump List map("n", "j", "call utils#GotoJump()") -- Map delete to Ctrl+l map("i", "", "") -- Clear screen map("n", "", "!clear") -- Change file to an executable map( "n", "x", ":lua require('user.mods').Toggle_executable() | :echom ('Toggle executable') | :sl! | echo ('')" ) --map("n", "x", ":!chmod +x %") -- Paste without replace clipboard map("v", "p", '"_dP') -- Swap two pieces of text, use x to cut in visual mode, then use Ctrl-x in -- visual mode to select text to swap with --map("v", "", "`.``gvP``P") -- Change Working Directory to current project map("n", "cd", ":cd %:p:h:pwd") -- Open the current file in the default program (on Mac this should just be just `open`) map("n", "o", ":!xdg-open %") -- URL handling if vim.fn.has("mac") == 1 then map("", "gx", 'call jobstart(["open", expand("")], {"detach": v:true})', {}) elseif vim.fn.has("unix") == 1 then map("", "gx", 'call jobstart(["xdg-open", expand("")], {"detach": v:true})', {}) elseif vim.fn.has("wsl") == 1 then map("", "gx", 'call jobstart(["wslview", expand("")], {"detach": v:true})', {}) else map[""].gx = { 'lua print("Error: gx is not supported on this OS!")' } end -- Substitute globally and locally in the selected region. map("n", "ss", ":%s//g") map("v", "ss", ":s//g") -- Toggle completion map("n", "tc", ":lua require('user.mods').toggle_completion()") -- Disable default completion. map("i", "", "") map("i", "", "") -- Set line wrap map("n", "", function() local wrap_status = vim.api.nvim_exec("set wrap ?", true) if wrap_status == "nowrap" then vim.api.nvim_command("set wrap linebreak") print("Wrap enabled") else vim.api.nvim_command("set wrap nowrap") print("Wrap disabled") end end, { silent = true }) -- Toggle between folds --utils.map("n", "", "&foldlevel ? 'zM' : 'zR'", { expr = true }) -- Use space to toggle fold map("n", "", "za") -- Make a copy of current file --vim.cmd([[ -- map s :up \| saveas! %:p:r-=strftime("%y.%m.%d-%H:%M")-bak.=expand("%:e") \| 3sleep \| e # --]]) map("n", ".b", ":!cp % %.backup") -- Toggle transparency map("n", "tb", ":call utils#Toggle_transparent_background()") -- Toggle zoom map("n", "z", ":call utils#ZoomToggle()") map("n", "z", "|_") -- Toggle statusline map("n", "", ":call ToggleHiddenAll()") -- Open last closed buffer map("n", "", ":call OpenLastClosed()") ---------------- Plugin Operations ---------------- -- Packer map("n", "Pc", "PackerCompile") map("n", "Pi", "PackerInstall") map("n", "Ps", "PackerSync") map("n", "PS", "PackerStatus") map("n", "Pu", "PackerUpdate") -- Tmux navigation (aserowy/tmux.nvim) map("n", "", "NavigatorLeft") map("n", "", "NavigatorRight") map("n", "", "NavigatorUp") map("n", "", "NavigatorDown") -- ToggleTerm map({ "n", "t" }, "tt", "ToggleTerm") map({ "n", "t" }, "th", "lua Horizontal_term_toggle()") map({ "n", "t" }, "tv", "lua Vertical_term_toggle()") -- map[""] = { "ToggleTerm", desc = "Toggle terminal" } -- map["tn"] = { function() toggle_term_cmd "node" end, desc = "ToggleTerm node" } -- map["tu"] = { function() toggle_term_cmd "ncdu" end, desc = "ToggleTerm NCDU" } -- map["tt"] = { function() toggle_term_cmd "htop" end, desc = "ToggleTerm htop" } -- map["tp"] = { function() toggle_term_cmd "python" end, desc = "ToggleTerm python" } -- map["tl"] = { function() toggle_term_cmd "lazygit" end, desc = "ToggleTerm lazygit" } -- map["tf"] = { "ToggleTerm direction=float", desc = "ToggleTerm float" } -- map["th"] = { "ToggleTerm size=10 direction=horizontal", desc = "ToggleTerm horizontal split" } -- map["tv"] = { "ToggleTerm size=80 direction=vertical", desc = "ToggleTerm vertical split" } --end -- LazyGit map({ "n", "t" }, "gg", "lua Lazygit_toggle()") map("n", "tg", "lua Gh_dash()") -- Fugitive git bindings map("n", "gs", vim.cmd.Git) map("n", "ga", ":Git add %:p") --map("n", "gs", ":Gstatus") map("n", "gc", ":Gcommit -v -q") map("n", "gt", ":Gcommit -v -q %:p") --map("n", "gd", ":Gdiff") map("n", "ge", ":Gedit") --map("n", "gr", ":Gread") map("n", "gw", ":Gwrite") map("n", "gl", ":silent! Glog:bot copen") --map("n", "gp", ":Ggrep") --map("n", "gp", ":Git push") --map("n", "gb", ":Gblame") map("n", "gm", ":Gmove") --map("n", "gb", ":Git branch") --map("n", "go", ":Git checkout") --map("n", "gps", ":Dispatch! git push") --map("n", "gpl", ":Dispatch! git pull") -- Telescope map("n", "ff", function() require("telescope.builtin").find_files({ hidden = true, no_ignore = false }) end) -- find all files --map("n", "fF", "lua require('telescope.builtin').find_files()") -- find files with hidden option map("n", "fg", "lua require('telescope.builtin').live_grep()") map("n", "fb", "lua require('telescope.builtin').buffers()") map("n", "fh", "lua require('telescope.builtin').help_tags()") map("n", "fc", "lua require('telescope.builtin').commands()") map("n", "ffc", "lua require('telescope.builtin').current_buffer_fuzzy_find()") map("n", "cf", "Telescope changed_files") map("n", "fp", "Telescope pickers") map("n", "fr", "lua require('telescope.builtin').registers({})") -- registers picker map("n", "fd", "lua require('telescope.builtin').diagnostics()") map("n", "fk", "lua require('telescope.builtin').keymaps()") map("n", "fn", [[lua require'plugins.telescope'.find_notes()]]) -- find notes map("n", "fgn", [[lua require'plugins.telescope'.grep_notes()]]) -- search notes map("n", "f.", [[lua require'plugins.telescope'.find_configs()]]) -- find configs map("n", "fs", [[lua require'plugins.telescope'.find_scripts()]]) -- find scripts map("n", "fw", [[lua require'plugins.telescope'.find_projects()]]) -- find projects map("n", "fm", "lua require('telescope').extensions.media_files.media_files({})") -- find media files map("n", "fi", "lua require('telescope').extensions.notify.notify({})") -- find notifications --map("n", "f/", "lua require('plugins.telescope').curbuf()") -- find files with hidden option map( "n", "fF", ":cd %:p:h:pwdlua require('user.mods').findFilesInCwd()", { noremap = true, silent = true, desc = "Find files in cwd" } ) -- FZF map("n", "fz", "lua require('fzf-lua').files()") -- Nvim-tree map("n", "f", ":NvimTreeToggle", {}) -- Undotree map("n", "u", vim.cmd.UndotreeToggle) -- Markdown-preview map("n", "md", "MarkdownPreviewToggle") map("n", "mg", "Glow") -- Autopairs map("n", "ww", "lua require('user.mods').Toggle_autopairs()") -- Zen-mode toggle map("n", "zm", "ZenMode | :echom ('Zen Mode') | :sl! | echo ('')") -- Vim-rooter map( "n", "ro", "Rooter | :echom ('cd to root/project directory') | :sl! | echo ('')", term_opts ) -- Trouble (UI to show diagnostics) map("n", "t", "TroubleToggle") map("n", "tw", "TroubleToggle workspace_diagnostics") map("n", "td", "TroubleToggle document_diagnostics") map("n", "tq", "TroubleToggle quickfix") map("n", "tl", "TroubleToggle loclist") map("n", "gR", "TroubleToggle lsp_references") -- Null-ls map("n", "ls", "NullLsToggle") -- Replacer map("n", "qr", ':lua require("replacer").run()') -- Quickfix map("n", "q", function() if vim.fn.getqflist({ winid = 0 }).winid ~= 0 then require("plugins.quickfix").close() else require("plugins.quickfix").open() --require("quickfix").open() end end, { desc = "Toggle quickfix window" }) -- Dap (debugging) local dap_ok, dap = pcall(require, "dap") local dap_ui_ok, ui = pcall(require, "dapui") if not (dap_ok and dap_ui_ok) then require("notify")("nvim-dap or dap-ui not installed!", "warning") return end vim.fn.sign_define("DapBreakpoint", { text = "🐞" }) -- Start debugging session map("n", "ds", function() dap.continue() ui.toggle({}) vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("=", false, true, true), "n", false) -- Spaces buffers evenly end) -- Set breakpoints, get variable values, step into/out of functions, etc. map("n", "dC", dap.continue) --map("n", "dC", dap.close) --map("n", "dt", dap.terminate) map("n", "dt", ui.toggle) map("n", "dd", function() dap.disconnect({ terminateDebuggee = true }) end) map("n", "dn", dap.step_over) map("n", "di", dap.step_into) map("n", "do", dap.step_out) map("n", "db", dap.toggle_breakpoint) map("n", "dB", function() dap.clear_breakpoints() require("notify")("Breakpoints cleared", "warn") end) map("n", "dl", require("dap.ui.widgets").hover) map("n", "de", function() require("dapui").float_element() end, { desc = "Open Element" }) map("n", "dq", function() require("dapui").close() require("dap").repl.close() local session = require("dap").session() if session then require("dap").terminate() end require("nvim-dap-virtual-text").refresh() end, { desc = "Terminate Debug" }) map("n", "dc", function() require("telescope").extensions.dap.commands() end, { desc = "DAP-Telescope: Commands" }) --vim.keymap.set("n", "B", ":lua require'dap'.set_breakpoint(vim.fn.input('Breakpoint condition: '))") --vim.keymap.set("v", "B", ":lua require'dap'.set_breakpoint(vim.fn.input('Breakpoint condition: '))") --vim.keymap.set("n", "lp", ":lua require'dap'.set_breakpoint(nil, nil, vim.fn.input('Log point message: '))") --vim.keymap.set("n", "dr", ":lua require'dap'.repl.open()") -- Close debugger and clear breakpoints --map("n", "de", function() -- dap.clear_breakpoints() -- ui.toggle({}) -- dap.terminate() -- vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("=", false, true, true), "n", false) -- require("notify")("Debugger session ended", "warn") --end) -- Dashboard map("n", "", "Dashboard") -- Lsp Lines toggle map("", "l", require("lsp_lines").toggle, { desc = "Toggle lsp_lines" })