local opts = { noremap = true, silent = true } -- Shorten function name local map = vim.keymap.set -- Modes -- normal_mode = "n", -- insert_mode = "i", -- visual_mode = "v", -- visual_block_mode = "x", -- term_mode = "t", -- command_mode = "c", -- Normal -- -- Better window navigation map("n", "", "h", opts) map("n", "", "j", opts) map("n", "", "k", opts) map("n", "", "l", opts) map("i", "", "h", opts) map("i", "", "j", opts) map("i", "", "k", opts) map("i", "", "l", opts) -- Close buffer map("n", "x", ":bd", opts) -- Naviagate buffers map("n", "", ":bnext", opts) map("n", "", ":bprevious", opts) -- Move text: https://vim.fandom.com/wiki/Moving_lines_up_or_down local sally_up = vim.tbl_deep_extend("force", { desc = "Move sally up" }, opts) local sally_down = vim.tbl_deep_extend("force", { desc = "Move sally down" }, opts) map("n", "", ":m .+1==", sally_up) map("v", "", ":m '>+1gv=gv", sally_up) map("i", "", ":m .+1==gi", sally_up) map("n", "", ":m .-2==", sally_down) map("v", "", ":m '<-2gv=gv", sally_down) map("i", "", ":m .-2==gi", sally_down) -- Toggle checkbox item in markdown local toggle_checkbox_opts = vim.tbl_deep_extend("force", { desc = "Toggle checkbox" }, opts) local function toggle_checkbox(separator) separator = separator or "x" return function() local line = vim.api.nvim_get_current_line() local unchecked = "%[.%]" local output = string.gsub(line, unchecked, "[" .. separator .. "]") vim.api.nvim_set_current_line(output) end end local function v_toggle_checkbox(separator) separator = separator or "x" return function() local start_line = vim.fn.getpos("'<")[2] local end_line = vim.fn.getpos("'>")[2] for i = start_line, end_line, 1 do vim.api.nvim_win_set_cursor(0, { i, 0 }) toggle_checkbox(separator)() end end end -- checked map("n", "", toggle_checkbox(), toggle_checkbox_opts) map("v", "", v_toggle_checkbox(), toggle_checkbox_opts) -- unchecked map("n", "", toggle_checkbox(" "), toggle_checkbox_opts) map("v", "", v_toggle_checkbox(" "), toggle_checkbox_opts) -- in progress map("n", "", toggle_checkbox("~"), toggle_checkbox_opts) map("v", "", v_toggle_checkbox("~"), toggle_checkbox_opts) -- canceled map("n", "", toggle_checkbox("-"), toggle_checkbox_opts) map("v", "", v_toggle_checkbox("-"), toggle_checkbox_opts) -- Oil.nvim map("n", "o", ":Oil", { desc = "Open Oil" }) map("n", ".", ":vsplit | Oil", { desc = "Open Oil vertical" }) -- Split with terminal map("n", ";", ":split | term", { desc = "split terminal" }) map("n", "'", ":vsplit | term", { desc = "vsplit terminal" }) -- past new line map("n", "p", "op", { desc = "Past to a line below" }) --- win navigation for terminal map("t", "", "h", opts) map("t", "", "j", opts) map("t", "", "k", opts) map("t", "", "l", opts) -- autocmd to open terminal in insert mode vim.cmd( [[autocmd TermOpen term://* startinsert | setlocal nonumber norelativenumber ]] ) -- on enter terminal do the same vim.cmd( [[autocmd WinEnter term://* startinsert | setlocal nonumber norelativenumber]] ) -- open link in browser -- if n -> esc, yank current link, open in browser -- if v -> get selection, open in browser -- browser must work for macox and linux -- -- local function open_url(url) if not url:match("^https?://") then print("No URL found under cursor: " .. url) return end local command = vim.fn.has("mac") == 1 and "open" or "xdg-open" vim.fn.jobstart({ command, url }, { detach = true }) end map("n", "gx", function() local url = vim.fn.expand("") open_url(url) end, { desc = "Open URL under cursor" }) map("v", "gx", function() local url = vim.fn.getreg('"') open_url(url) end, { desc = "Open selected URL" })