Neovim/lua/config/keys.lua

171 lines
4.4 KiB
Lua

--
-- 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 = '<C-s>',
cmd = vim.cmd.write,
desc = "Write buffer to disk"
},
{
mode = { 'n', 'v', 'i' },
keys = '<C-z>',
cmd = vim.cmd.undo,
desc = "Undo last edit"
},
{
mode = { 'n', 'v', 'i' },
keys = '<C-y>',
cmd = vim.cmd.redo,
desc = "Redo last edit that was undone"
},
--
-- Buffer management
-- ..............................................
{
mode = { 'n', 'i' },
keys = '<C-t>',
cmd = '<cmd>:enew<cr>',
desc = "Edit new, unnamed buffer"
},
--
-- Shift line(s) by one shiftwidth
-- ..............................................
{
mode = { 'v' },
keys = '<tab>',
cmd = '>gv',
desc = "Shift selection in visual mode right"
},
{
mode = { 'v' },
keys = '<S-tab>',
cmd = '<gv',
desc = "Shift selection in visual right"
},
--
-- Window controls
-- ..............................................
{
mode = { 'n', 'i' },
keys = '<C-w>v',
cmd = '<cmd>:vsplit<cr>',
desc = "Split window vertically"
},
{
mode = { 'n', 'i' },
keys = '<C-w>h',
cmd = '<cmd>:split<cr>',
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
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 = '<S-ScrollWheelDown>',
cmd = '<ScrollWheelRight>',
desc = "Scroll rightways"
},
{
mode = { 'i', 'n', 'v' },
keys = '<S-ScrollWheelUp>',
cmd = '<ScrollWheelLeft>',
desc = "Scroll leftways"
},
{
mode = { 'i', 'n', 'v' },
keys = '<C-b>',
cmd = function()
vim.cmd('Neotree toggle')
end,
desc = "Toggle neotree"
},
--
-- Tab (barbar) controls
-- ..............................................
{
mode = { 'n', 'i' },
keys = '<C-tab>',
cmd = vim.cmd('BufferNext'),
desc = "Switch to the next buffer"
},
{
mode = { 'n', 'i' },
keys = '<C-S-tab>',
cmd = vim.cmd('BufferPrevious'),
desc = "Switch to the previous buffer"
},
{
mode = { 'n' },
keys = '<S-f>',
cmd = function()
vim.lsp.buf.format()
end,
desc = "Format buffer with current LSP"
}
}
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