marleyvim/nvim/lua/keymaps.lua

205 lines
5.4 KiB
Lua

local g = vim.g
local set = vim.keymap.set
local f = string.format
g.mapleader = ' '
g.maplocalleader = '\\'
-- Disable arrow key movement -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for _, key in ipairs({ '<DOWN>', '<UP>', '<LEFT>', '<RIGHT>' }) do
set({ 'n', 'i' }, key, '<NOP>')
end
-- Better up/down -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for dir, key in pairs({ Down = 'j', Up = 'k' }) do
set(
{ 'n', 'x' },
key,
f("v:count == 0 ? 'g%s' : '%s'", key, key),
{ desc = dir, expr = true, silent = true }
)
end
-- Resize windows -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for key, dir in pairs({
Up = 'Increase',
Down = 'Decrease',
Left = 'Decrease',
Right = 'Increase',
}) do
local sign = (dir == 'Increase') and '+' or '-'
set(
{ 'n' },
f('<C-%s>', key),
f('<CMD>resize %s4<CR>', sign),
{ desc = f('%s window height', dir) }
)
end
-- Buffers -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for key, dir in pairs({
['<S-H>'] = 'previous',
['<S-L>'] = 'next',
['[b'] = 'previous',
[']b'] = 'next',
}) do
-- previous -> Prev
local prettyDir = (dir:gsub('^%l', string.upper)):sub(1, 4)
set(
{ 'n' },
key,
f('<CMD>b%s<CR>', dir),
{ desc = f('%s buffer', prettyDir) }
)
end
set({ 'n' }, '<LEADER>bD', '<CMD>bd<CR>', { desc = 'Delete buffer and window' })
-- Clear search & refresh -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
set(
{ 'n', 'i' },
'<ESC>',
'<CMD>noh<CR><ESC>',
{ desc = 'Escape and clear hlsearch' }
)
set(
{ 'n' },
'<LEADER>ur',
'<CMD>nohlsearch<BAR>diffupdate<BAR>normal! <C-l><CR>',
{ desc = 'Redraw / clear hlsearch / diff update' }
)
-- Better n & N -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for _, mode in ipairs({ 'n', 'x', 'o' }) do
local zv = (mode == 'n') and ".'zv'" or ''
set(
{ mode },
'n',
f("'Nn'[v:searchforward]%s", zv),
{ desc = 'Next search result', expr = true }
)
set(
{ mode },
'N',
f("'nN'[v:searchforward]%s", zv),
{ desc = 'Previous search result', expr = true }
)
end
-- Undo break-points -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for _, char in ipairs({ ',', '.', ';' }) do
set({ 'i' }, char, f('%s<C-g>u', char))
end
-- Search docs (keywordprog) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- https://til.codeinthehole.com/posts/about-how-to-use-keywordprg-effectively/
set(
{ 'n' },
'<LEADER>K',
'<CMD>norm! K<CR>',
{ desc = 'Search <KEYWORDPROG> for word' }
)
-- Better indenting -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for _, char in ipairs({ '<', '>' }) do
set({ 'v' }, char, f('%sgv', char))
end
-- Commenting -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for key, dir in pairs({ o = 'Below', O = 'Above' }) do
set(
{ 'n' },
f('gc%s', key),
f('%s<ESC>Vcx<ESC><CMD>normal gcc<CR>fxa<BS>', key),
{ desc = f('Add comment %s', dir) }
)
end
-- New files -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
set({ 'n' }, '<LEADER>fn', '<CMD>enew<CR>', { desc = 'New file' })
-- Locations/quickfixes -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
set({ 'n' }, '<LEADER>xl', '<CMD>lopen<CR>', { desc = 'Location list' })
set({ 'n' }, '<LEADER>xq', '<CMD>copen<CR>', { desc = 'Quickfix list' })
for key, dir in pairs({ ['['] = 'Previous', [']'] = 'Next' }) do
-- Previous -> prev
local cmd = (dir:gsub('^%l', string.lower)):sub(1, 4)
set(
{ 'n' },
f('%sq', key),
f('<CMD>c%s<CR>', cmd),
{ desc = f('%s quickfix', dir) }
)
end
-- Diagnostics -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
set({ 'n' }, '<LEADER>cd', function()
vim.diagnostic.open_float()
end, { desc = 'Line diagnostics' })
local function goto_diagnostic(next, severity)
local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev
severity = severity and vim.diagnostic.severity[severity] or nil
return function()
go({ severity = severity })
end
end
for key, sev in pairs({
d = { nil, 'Diagnostic' },
e = { 'ERROR', 'Error' },
w = { 'WARN', 'Warning' },
}) do
set(
{ 'n' },
f(']%s', key),
goto_diagnostic(true, sev[1]),
{ desc = f('Next %s', sev[2]) }
)
set(
{ 'n' },
f('[%s', key),
goto_diagnostic(false, sev[1]),
{ desc = f('Previous %s', sev[2]) }
)
end
-- Quit -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
set({ 'n' }, '<LEADER>qq', '<CMD>qa<CR>', { desc = 'Quit all' })
-- Inspect -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
set({ 'n' }, '<LEADER>ui', vim.show_pos, { desc = 'Inspect position' })
-- Window management -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
set({ 'n' }, '<LEADER>w', '<C-w>', { desc = 'Windows', remap = true })
set({ 'n' }, '<LEADER>-', '<C-w>s', { desc = 'Split below', remap = true })
set({ 'n' }, '<LEADER>|', '<C-w>v', { desc = 'Split right', remap = true })
set({ 'n' }, '<LEADER>wd', '<C-w>c', { desc = 'Delete window', remap = true })
-- Tab management -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
for key, act in pairs({
l = 'Last',
o = 'Only',
f = 'First',
['<TAB>'] = 'New',
[']'] = 'Next',
d = 'Close',
['['] = 'Previous',
}) do
local desc = (act == 'Only') and 'Close other tabs' or f('%s tab', act)
set(
{ 'n' },
f('<LEADER><TAB>%s', key),
f('<CMD>tab%s<CR>', act:lower()),
{ desc = desc }
)
end