-- -- Global custom plugin agnostic keymaps -- .............................................. -- -- Author: Sven Vogel -- Created: 01.11.2024 -- Edited: 01.11.2024 -- -- ============================================== local keymaps = { -- -- Write buffer to disk -- .............................................. { mode = { 'n', 'i' }, keys = '', cmd = vim.cmd.write, desc = "Write buffer to disk" }, { mode = { 'n', 'v', 'i' }, keys = '', cmd = vim.cmd.undo, desc = "Undo last edit" }, { mode = { 'n', 'v', 'i' }, keys = '', cmd = vim.cmd.redo, desc = "Redo last edit that was undone" }, -- -- Buffer management -- .............................................. { mode = { 'n', 'i' }, keys = '', cmd = ':enew', desc = "Edit new, unnamed buffer" }, -- -- Shift line(s) by one shiftwidth -- .............................................. { mode = { 'v' }, keys = '', cmd = '>gv', desc = "Shift selection in visual mode right" }, { mode = { 'v' }, keys = '', cmd = '') end, desc = "Shift selection in visual mode right" }, { mode = { 'i' }, keys = '', cmd = function() vim.cmd(':<') end, desc = "Shift selection in visual right" }, -- -- Window controls -- .............................................. { mode = { 'n', 'i' }, keys = 'v', cmd = ':vsplit', desc = "Split window vertically" }, { mode = { 'n', 'i' }, keys = 'h', cmd = ':split', desc = "Split window horizontally" }, { mode = { 'n' }, keys = 'q', cmd = function() -- list of file types to ignore when counting split buffers local ignore = { "neo-tree" } -- number of windows per tab local wins = vim.api.nvim_tabpage_list_wins(0) -- count of open windows without those on ignore list local count = 0 -- check each window for its type for _, win in ipairs(wins) do local buf = vim.api.nvim_win_get_buf(win) local buf_type = vim.api.nvim_buf_get_option(buf, 'buftype') local file_type = vim.api.nvim_buf_get_option(buf, 'filetype') if buf_type == '' then -- check if buffer is in ignore local in_ignore = false for _, v in ipairs(ignore) do if v == file_type then in_ignore = true break end end if not in_ignore then count = count + 1 end end end if count == 1 then -- only one buffer without any split -- account for barbar specific behavior vim.cmd('BufferClose') else -- close window vim.cmd('q') end end, desc = "Close buffer" }, { mode = { 'i', 'n', 'v' }, keys = '', cmd = '', desc = "Scroll rightways" }, { mode = { 'i', 'n', 'v' }, keys = '', cmd = '', desc = "Scroll leftways" }, { mode = { 'i', 'n', 'v' }, keys = '', cmd = function() vim.cmd('Neotree toggle') end, desc = "Toggle neotree" }, -- -- Tab (barbar) controls -- .............................................. { mode = { 'n', 'i' }, keys = '', cmd = vim.cmd('BufferNext'), desc = "Switch to the next buffer" }, { mode = { 'n', 'i' }, keys = '', cmd = vim.cmd('BufferPrevious'), desc = "Switch to the previous buffer" }, { mode = { 'n' }, keys = '', cmd = function() vim.lsp.buf.format() end, desc = "Format buffer with current LSP" }, -- -- Telescope -- .............................................. { mode = { 'n', 'i', 'v' }, keys = '', cmd = function() vim.cmd('Telescope') end, desc = "Open Telescope" } } for _, keymap in pairs(keymaps) do local mode = keymap.mode local lhs = keymap.keys local rhs = keymap.cmd local opts = { desc = keymap.desc, noremap = keymap.noremap } vim.keymap.set(mode, lhs, rhs, opts) end