180 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local kmGroup = vim.api.nvim_create_augroup("KeymappingsGroup", { clear = true })
 | 
						|
local kmgAutocmd = vim.api.nvim_create_autocmd
 | 
						|
 | 
						|
------------------------------------------------------------------------------------------
 | 
						|
-- core
 | 
						|
 | 
						|
-- explore the directory of the current file (using netrw)
 | 
						|
vim.keymap.set("n", "<leader>n", vim.cmd.Ex)
 | 
						|
 | 
						|
-- move visually-selected lines up or down
 | 
						|
vim.keymap.set("v", "J", ":m '>+1<CR>gv")
 | 
						|
vim.keymap.set("v", "K", ":m '<-2<CR>gv")
 | 
						|
 | 
						|
-- reduce effective distance of half-page jumps and vertically-center the cursor
 | 
						|
vim.keymap.set("n", "<C-d>", "<C-d>4<C-y>M")
 | 
						|
vim.keymap.set("n", "<C-u>", "<C-u>4<C-e>M")
 | 
						|
 | 
						|
-- open folds when iterating search results
 | 
						|
vim.keymap.set("n", "n", "nzv")
 | 
						|
vim.keymap.set("n", "N", "Nzv")
 | 
						|
 | 
						|
-- maintain cursor position after paragraph formatting
 | 
						|
vim.keymap.set("n", "=ap", "mF=ap'F")
 | 
						|
 | 
						|
-- shortcuts for deleting into the void register
 | 
						|
vim.keymap.set({ "n", "v" }, "<leader>d", [["_d]])
 | 
						|
vim.keymap.set("x", "<leader>P", [["_dP]]) -- replace selected text, keep main register
 | 
						|
 | 
						|
-- shortcuts for using + register (system clipboard)
 | 
						|
vim.keymap.set({ "n", "v" }, "<leader>y", [["+y]])
 | 
						|
vim.keymap.set("n", "<leader>Y", [["+Y]])
 | 
						|
vim.keymap.set("n", "<leader>D", [["+D]])
 | 
						|
vim.keymap.set("n", "<leader>p", [["+p]])
 | 
						|
 | 
						|
-- search-and-replace shortcuts
 | 
						|
vim.keymap.set("n", "<leader>rw", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]])
 | 
						|
vim.keymap.set("n", "<leader>ra", [[:%s//g<Left><Left>]])
 | 
						|
 | 
						|
-- toggle expandtab and show message
 | 
						|
vim.keymap.set("n", "<leader>tab", function()
 | 
						|
    if vim.opt.expandtab:get() then
 | 
						|
        vim.opt.expandtab = false
 | 
						|
        print("using actual tabs")
 | 
						|
    else
 | 
						|
        vim.opt.expandtab = true
 | 
						|
        print("using spaces in place of tabs")
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
-- quicker switching between panes/splits
 | 
						|
vim.keymap.set("n", "<C-h>", [[<C-w>h]])
 | 
						|
vim.keymap.set("n", "<C-j>", [[<C-w>j]])
 | 
						|
vim.keymap.set("n", "<C-k>", [[<C-w>k]])
 | 
						|
vim.keymap.set("n", "<C-l>", [[<C-w>l]])
 | 
						|
kmgAutocmd('FileType', {
 | 
						|
    group = kmGroup,
 | 
						|
    pattern = "netrw",
 | 
						|
    callback = function()
 | 
						|
        vim.keymap.set("n", "<C-h>", [[<C-w>h]], { remap = true, buffer = true })
 | 
						|
        vim.keymap.set("n", "<C-j>", [[<C-w>j]], { remap = true, buffer = true })
 | 
						|
        vim.keymap.set("n", "<C-k>", [[<C-w>k]], { remap = true, buffer = true })
 | 
						|
        vim.keymap.set("n", "<C-l>", [[<C-w>l]], { remap = true, buffer = true })
 | 
						|
    end
 | 
						|
})
 | 
						|
 | 
						|
------------------------------------------------------------------------------------------
 | 
						|
-- quickfix TODO: learn about quickfix (:help quickfix), then maybe use these
 | 
						|
 | 
						|
-- vim.keymap.set("n", "<C-k>", "<cmd>cnext<CR>zz")
 | 
						|
-- vim.keymap.set("n", "<C-j>", "<cmd>cprev<CR>zz")
 | 
						|
-- vim.keymap.set("n", "<leader>k", "<cmd>lnext<CR>zz")
 | 
						|
-- vim.keymap.set("n", "<leader>j", "<cmd>lprev<CR>zz")
 | 
						|
 | 
						|
------------------------------------------------------------------------------------------
 | 
						|
-- debugger and debugging ui
 | 
						|
 | 
						|
local dap = require("dap")
 | 
						|
vim.keymap.set("n", "<leader>bc", dap.continue, { desc = "debug: continue" })
 | 
						|
vim.keymap.set("n", "<leader>bi", dap.step_into, { desc = "debug: step into" })
 | 
						|
vim.keymap.set("n", "<leader>bo", dap.step_over, { desc = "debug: step over" })
 | 
						|
vim.keymap.set("n", "<leader>bu", dap.step_out, { desc = "debug: step out" })
 | 
						|
vim.keymap.set("n", "<leader>blb", dap.list_breakpoints, { desc = "debug: list breakpoints" })
 | 
						|
vim.keymap.set("n", "<leader>bt", dap.toggle_breakpoint, { desc = "debug: toggle breakpoint" })
 | 
						|
 | 
						|
vim.keymap.set("n", "<leader>bB", function()
 | 
						|
    dap.set_breakpoint(vim.fn.input("breakpoint condition: "))
 | 
						|
end, { desc = "debug: set conditional breakpoint" })
 | 
						|
 | 
						|
vim.keymap.set("n", "<leader>bv", function()
 | 
						|
    require("nvim-dap-virtual-text").toggle()
 | 
						|
end, { desc = "debug: toggle virtual text" })
 | 
						|
 | 
						|
vim.keymap.set("n", "<leader>bq", function()
 | 
						|
    dap.terminate() require("dapui").close() require("nvim-dap-virtual-text").disable()
 | 
						|
end, { desc = "debug: quit debugger" })
 | 
						|
 | 
						|
-- TODO: decide if i want these or others, add if so
 | 
						|
-- vim.keymap.set("n", "<leader>zxcv", dap.repl.open, { desc = "open REPL" })
 | 
						|
-- vim.keymap.set("n", "<leader>zxcv", dap.run_last, { desc = "run last" })
 | 
						|
-- vim.keymap.set("n", "<leader>zxcv", dap.set_exception_breakpoints({ "all" }), { desc = "set exception breakpoints" })
 | 
						|
-- local dapWidgets = require('dap.ui.widgets')
 | 
						|
-- vim.keymap.set({'n', 'v'}, '<leader>zxcv', dapWidgets.hover)
 | 
						|
-- vim.keymap.set({'n', 'v'}, '<leader>zxcv', dapWidgets.preview)
 | 
						|
-- vim.keymap.set('n', '<leader>zxcv', function() dapWidgets.centered_float(dapWidgets.frames) end)
 | 
						|
-- vim.keymap.set('n', '<leader>zxcv', function() dapWidgets.centered_float(dapWidgets.scopes) end)
 | 
						|
 | 
						|
------------------------------------------------------------------------------------------
 | 
						|
-- lsp
 | 
						|
 | 
						|
kmgAutocmd('LspAttach', {
 | 
						|
    group = kmGroup,
 | 
						|
    callback = function(e)
 | 
						|
        local opts = { buffer = e.buf }
 | 
						|
        vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, opts)
 | 
						|
        vim.keymap.set("n", "K", function() vim.lsp.buf.hover() end, opts)
 | 
						|
        vim.keymap.set("i", "<C-h>", function() vim.lsp.buf.signature_help() end, opts)
 | 
						|
        vim.keymap.set("n", "<leader>vdv", function() vim.diagnostic.open_float() end, opts)
 | 
						|
        vim.keymap.set("n", "<leader>vdn", function() vim.diagnostic.goto_next() end, opts)
 | 
						|
        vim.keymap.set("n", "<leader>vdp", function() vim.diagnostic.goto_prev() end, opts)
 | 
						|
        vim.keymap.set("n", "<leader>vws", function() vim.lsp.buf.workspace_symbol() end, opts)
 | 
						|
        vim.keymap.set("n", "<leader>vca", function() vim.lsp.buf.code_action() end, opts)
 | 
						|
        vim.keymap.set("n", "<leader>vrl", function() vim.lsp.buf.references() end, opts)
 | 
						|
        vim.keymap.set("n", "<leader>vrn", function() vim.lsp.buf.rename() end, opts)
 | 
						|
    end
 | 
						|
})
 | 
						|
 | 
						|
------------------------------------------------------------------------------------------
 | 
						|
-- plugins
 | 
						|
 | 
						|
-- telescope
 | 
						|
local tscBuiltin = require('telescope.builtin')
 | 
						|
local custom_grep_str_w_regex = function()
 | 
						|
    tscBuiltin.grep_string({ search = vim.fn.input("grep > "), use_regex = true, additional_args = "-i", })
 | 
						|
end
 | 
						|
vim.keymap.set('n', '<leader>ft', tscBuiltin.live_grep, { desc = 'tscope find text, live_grep' })
 | 
						|
vim.keymap.set('n', '<leader>fT', custom_grep_str_w_regex, { desc = 'tscope find text, static grep w/regex' })
 | 
						|
vim.keymap.set('n', '<leader>ff', tscBuiltin.find_files, { desc = 'tscope find files' })
 | 
						|
vim.keymap.set('n', '<leader>fg', tscBuiltin.git_files, { desc = 'tscope find git-tracked files' })
 | 
						|
vim.keymap.set('n', '<leader>fb', tscBuiltin.buffers, { desc = 'tscope buffers' })
 | 
						|
vim.keymap.set('n', '<leader>fh', tscBuiltin.help_tags, { desc = 'tscope help tags' })
 | 
						|
 | 
						|
-- harpoon
 | 
						|
local harpoon = require("harpoon")
 | 
						|
vim.keymap.set("n", "<leader>hl", function() harpoon.ui:toggle_quick_menu(harpoon:list()) end)
 | 
						|
vim.keymap.set("n", "<leader>ha", function() harpoon:list():add() end)
 | 
						|
vim.keymap.set("n", "<leader>hA", function() harpoon:list():prepend() end)
 | 
						|
vim.keymap.set("n", "<leader>hn", function() harpoon:list():next() end)
 | 
						|
vim.keymap.set("n", "<leader>hp", function() harpoon:list():prev() end)
 | 
						|
 | 
						|
vim.keymap.set("n", "<leader>hz", function() harpoon:list():select(1) end)
 | 
						|
vim.keymap.set("n", "<leader>hx", function() harpoon:list():select(2) end)
 | 
						|
vim.keymap.set("n", "<leader>hc", function() harpoon:list():select(3) end)
 | 
						|
vim.keymap.set("n", "<leader>hv", function() harpoon:list():select(4) end)
 | 
						|
vim.keymap.set("n", "<leader>hb", function() harpoon:list():select(5) end)
 | 
						|
 | 
						|
vim.keymap.set("n", "<leader>hZ", function() harpoon:list():replace_at(1) end)
 | 
						|
vim.keymap.set("n", "<leader>hX", function() harpoon:list():replace_at(2) end)
 | 
						|
vim.keymap.set("n", "<leader>hC", function() harpoon:list():replace_at(3) end)
 | 
						|
vim.keymap.set("n", "<leader>hV", function() harpoon:list():replace_at(4) end)
 | 
						|
vim.keymap.set("n", "<leader>hB", function() harpoon:list():replace_at(5) end)
 | 
						|
 | 
						|
-- undotree
 | 
						|
vim.keymap.set("n", "<leader>u", vim.cmd.UndotreeToggle)
 | 
						|
 | 
						|
-- treesitter and treesitter-context
 | 
						|
vim.keymap.set("n", "<leader>tc", function() vim.cmd.TSContext({ "toggle" }) end)
 | 
						|
 | 
						|
-- fugitive (git integration)
 | 
						|
vim.keymap.set("n", "<leader>gG", vim.cmd.Git)
 | 
						|
vim.keymap.set("n", "<leader>gg", ":Git ") -- shortcut, arbitrary git commands
 | 
						|
vim.keymap.set("n", "<leader>ga", function() vim.cmd.Git({ "add %"}) end)
 | 
						|
vim.keymap.set("n", "<leader>gs", function() vim.cmd.Git({ "-p status" }) end)
 | 
						|
vim.keymap.set("n", "<leader>gc", function() vim.cmd.Git({ "commit -a" }) end)
 | 
						|
 | 
						|
-- conform (formatter)
 | 
						|
vim.keymap.set("n", "<leader>fmt", function()
 | 
						|
    require("conform").format({ bufnr = 0 })
 | 
						|
end)
 | 
						|
 |