-- This file contains custom key mappings for Neovim. -- Keymaps are automatically loaded on the VeryLazy event -- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua -- Add any additional keymaps here -- Map Ctrl+b in insert mode to delete to the end of the word without leaving insert mode vim.keymap.set("i", "", "de") -- Map Ctrl+c to escape from other modes vim.keymap.set({ "i", "n", "v" }, "", [[]]) -- Screen Keys vim.keymap.set({ "n" }, "uk", "Screenkey") ----- Tmux Navigation ------ local nvim_tmux_nav = require("nvim-tmux-navigation") vim.keymap.set("n", "", nvim_tmux_nav.NvimTmuxNavigateLeft) -- Navigate to the left pane vim.keymap.set("n", "", nvim_tmux_nav.NvimTmuxNavigateDown) -- Navigate to the bottom pane vim.keymap.set("n", "", nvim_tmux_nav.NvimTmuxNavigateUp) -- Navigate to the top pane vim.keymap.set("n", "", nvim_tmux_nav.NvimTmuxNavigateRight) -- Navigate to the right pane vim.keymap.set("n", "", nvim_tmux_nav.NvimTmuxNavigateLastActive) -- Navigate to the last active pane vim.keymap.set("n", "", nvim_tmux_nav.NvimTmuxNavigateNext) -- Navigate to the next pane ----- OBSIDIAN ----- vim.keymap.set("n", "oc", "ObsidianCheck", { desc = "Obsidian Check Checkbox" }) vim.keymap.set("n", "ot", "ObsidianTemplate", { desc = "Insert Obsidian Template" }) vim.keymap.set("n", "oo", "Obsidian Open", { desc = "Open in Obsidian App" }) vim.keymap.set("n", "ob", "ObsidianBacklinks", { desc = "Show ObsidianBacklinks" }) vim.keymap.set("n", "ol", "ObsidianLinks", { desc = "Show ObsidianLinks" }) vim.keymap.set("n", "on", "ObsidianNew", { desc = "Create New Note" }) vim.keymap.set("n", "os", "ObsidianSearch", { desc = "Search Obsidian" }) vim.keymap.set("n", "oq", "ObsidianQuickSwitch", { desc = "Quick Switch" }) ----- OIL ----- vim.keymap.set("n", "-", "Oil", { desc = "Open parent directory" }) -- Delete all buffers but the current one vim.keymap.set( "n", "bq", ':%bdelete|edit #|normal`"', { desc = "Delete other buffers but the current one" } ) -- Disable key mappings in insert mode vim.api.nvim_set_keymap("i", "", "", { noremap = true, silent = true }) vim.api.nvim_set_keymap("i", "", "", { noremap = true, silent = true }) -- Disable key mappings in normal mode vim.api.nvim_set_keymap("n", "", "", { noremap = true, silent = true }) vim.api.nvim_set_keymap("n", "", "", { noremap = true, silent = true }) -- Disable key mappings in visual block mode vim.api.nvim_set_keymap("x", "", "", { noremap = true, silent = true }) vim.api.nvim_set_keymap("x", "", "", { noremap = true, silent = true }) vim.api.nvim_set_keymap("x", "J", "", { noremap = true, silent = true }) vim.api.nvim_set_keymap("x", "K", "", { noremap = true, silent = true }) -- Redefine Ctrl+s to save with the custom function vim.api.nvim_set_keymap("n", "", ":lua SaveFile()", { noremap = true, silent = true }) -- Grep keybinding for visual mode - search selected text vim.keymap.set("v", "sg", function() -- Get the selected text local start_pos = vim.fn.getpos("'<") local end_pos = vim.fn.getpos("'>") local lines = vim.fn.getline(start_pos[2], end_pos[2]) if #lines == 0 then return end -- Handle single line selection if #lines == 1 then lines[1] = string.sub(lines[1], start_pos[3], end_pos[3]) else -- Handle multi-line selection lines[1] = string.sub(lines[1], start_pos[3]) lines[#lines] = string.sub(lines[#lines], 1, end_pos[3]) end local selected_text = table.concat(lines, "\n") -- Escape special characters for grep selected_text = vim.fn.escape(selected_text, "\\.*[]^$()+?{}") -- Use the selected text for grep if pcall(require, "snacks") then require("snacks").picker.grep({ search = selected_text }) elseif pcall(require, "fzf-lua") then require("fzf-lua").live_grep({ search = selected_text }) else vim.notify("No grep picker available", vim.log.levels.ERROR) end end, { desc = "Grep Selected Text" }) -- Grep keybinding for visual mode with G - search selected text at root level vim.keymap.set("v", "sG", function() -- Get git root or fallback to cwd local git_root = vim.fn.system("git rev-parse --show-toplevel 2>/dev/null"):gsub("\n", "") local root = vim.v.shell_error == 0 and git_root ~= "" and git_root or vim.fn.getcwd() -- Get the selected text local start_pos = vim.fn.getpos("'<") local end_pos = vim.fn.getpos("'>") local lines = vim.fn.getline(start_pos[2], end_pos[2]) if #lines == 0 then return end -- Handle single line selection if #lines == 1 then lines[1] = string.sub(lines[1], start_pos[3], end_pos[3]) else -- Handle multi-line selection lines[1] = string.sub(lines[1], start_pos[3]) lines[#lines] = string.sub(lines[#lines], 1, end_pos[3]) end local selected_text = table.concat(lines, "\n") -- Escape special characters for grep selected_text = vim.fn.escape(selected_text, "\\.*[]^$()+?{}") -- Use the selected text for grep at root level if pcall(require, "snacks") then require("snacks").picker.grep({ search = selected_text, cwd = root }) elseif pcall(require, "fzf-lua") then require("fzf-lua").live_grep({ search = selected_text, cwd = root }) else vim.notify("No grep picker available", vim.log.levels.ERROR) end end, { desc = "Grep Selected Text (Root Dir)" }) -- Delete all marks vim.keymap.set("n", "md", function() vim.cmd("delmarks!") vim.cmd("delmarks A-Z0-9") vim.notify("All marks deleted") end, { desc = "Delete all marks" }) -- Custom save function function SaveFile() -- Check if a buffer with a file is open if vim.fn.empty(vim.fn.expand("%:t")) == 1 then vim.notify("No file to save", vim.log.levels.WARN) return end local filename = vim.fn.expand("%:t") -- Get only the filename local success, err = pcall(function() vim.cmd("silent! write") -- Try to save the file without showing the default message end) if success then vim.notify(filename .. " Saved!") -- Show only the custom message if successful else vim.notify("Error: " .. err, vim.log.levels.ERROR) -- Show the error message if it fails end end