dotfiles-ansible/roles/config/files/nvim/lua/user/config/keymap.lua

93 lines
4.2 KiB
Lua

local util = require('user.util.misc')
local map = function(mode, lhs, rhs, opts)
local keys = require('lazy.core.handler').handlers.keys
-- don't create keymap if a lazy keys handler for it exists
if not keys.active[keys.parse({ lhs, mode = mode }).id] then
opts = opts or {}
opts.silent = opts.silent ~= false
vim.keymap.set(mode, lhs, rhs, opts)
end
end
-- better up/down
map('n', 'j', 'v:count == 0 ? "gj" : "j"', { expr = true, silent = true })
map('n', 'k', 'v:count == 0 ? "gk" : "k"', { expr = true, silent = true })
-- better indenting
map('v', '<', '<gv')
map('v', '>', '>gv')
-- remove trailing whitespaces
map('n', '<localleader>w', '<cmd>%s/\\s\\+$//e<CR>', { desc = 'Remove whitespaces' })
-- Resize window using <ctrl> + arrow keys
map('n', '<C-Up>', '<cmd>resize +2<CR>', { desc = 'Increase window height' })
map('n', '<C-Down>', '<cmd>resize -2<CR>', { desc = 'Decrease window height' })
map('n', '<C-Left>', '<cmd>vertical resize -2<CR>', { desc = 'Decrease window width' })
map('n', '<C-Right>', '<cmd>vertical resize +2<CR>', { desc = 'Increase window width' })
-- H, L instead of 0, $
-- map({ 'n', 'x', 'o' }, 'H', '0')
-- map({ 'n', 'x', 'o' }, 'L', '$')
-- Clear search with <Esc>
map({ 'i', 'n' }, '<Esc>', '<cmd>noh<CR><Esc>', { desc = 'Escape and clear hlsearch' })
-- More intuitive n/N direction
-- https://github.com/mhinz/vim-galore#saner-behavior-of-n-and-n
map('n', 'n', '"Nn"[v:searchforward]', { expr = true, desc = 'Next search result' })
map('x', 'n', '"Nn"[v:searchforward]', { expr = true, desc = 'Next search result' })
map('o', 'n', '"Nn"[v:searchforward]', { expr = true, desc = 'Next search result' })
map('n', 'N', '"nN"[v:searchforward]', { expr = true, desc = 'Prev search result' })
map('x', 'N', '"nN"[v:searchforward]', { expr = true, desc = 'Prev search result' })
map('o', 'N', '"nN"[v:searchforward]', { expr = true, desc = 'Prev search result' })
-- switching between buffers
if not util.has('nvim-cokeline') then
map('n', '<Tab>', '<cmd>bnext<CR>', { desc = 'Next buffer' })
map('n', '<S-Tab>', '<cmd>bprevious<CR>', { desc = 'Previous buffer' })
map('n', ']b', '<cmd>bnext<CR>', { desc = 'Next buffer' })
map('n', '[b', '<cmd>bprevious<CR>', { desc = 'Previous buffer' })
end
-- move between quickfix items
if not util.has('trouble.nvim') then
map('n', '[q', vim.cmd.cprev, { desc = 'Previous quickfix' })
map('n', ']q', vim.cmd.cnext, { desc = 'Next quickfix' })
end
-- toggle LSP settings
map('n', '<leader>ud', require('user.plugins.lsp.lspconfig.diagnostic').toggle, { desc = 'Toggle diagnostics' })
map('n', '<leader>uv', require('user.plugins.lsp.lspconfig.diagnostic').toggle_virtual_lines, { desc = 'Toggle virtual lines diagnostics' })
map('n', '<leader>uf', require('user.plugins.lsp.lspconfig.format').toggle, { desc = 'Toggle format on save' })
-- toggle editor settings
map('n', '<leader>ur', function() util.toggle('relativenumber', true) end, { desc = 'Toggle relativenumber' })
map('n', '<leader>ue', function() util.toggle('conceallevel', false, { 0, vim.go.conceallevel > 0 and vim.go.conceallevel or 3 }) end, { desc = 'Toggle conceallevel' })
map('n', '<leader>us', function() util.toggle('expandtab') end, { desc = 'Toggle tab/space indent' })
-- exit
map('n', '<leader>qw', '<C-w>c', { desc = 'Delete window' })
map('n', '<leader>qq', '<cmd>qa<CR>', { desc = 'Quit all' })
-- get highlight groups under cursor
map('n', '<leader>up', vim.show_pos, { desc = 'Inspect pos' })
map('n', '<leader>ut', vim.treesitter.inspect_tree, { desc = 'Inspect treesitter' })
-- escape in terminal mode
map('t', '<Esc><Esc>', '<C-\\><C-n>', { desc = 'Enter Normal Mode' })
-- easier window split
map('n', '<leader>-', '<C-w>s', { desc = 'Split window below' })
map('n', '<leader>|', '<C-w>v', { desc = 'Split window right' })
-- tabs
map('n', '<leader><Tab>l', '<cmd>tablast<CR>', { desc = 'Last Tab' })
map('n', '<leader><Tab>f', '<cmd>tabfirst<CR>', { desc = 'First Tab' })
map('n', '<leader><Tab><Tab>', '<cmd>tabnew<CR>', { desc = 'New Tab' })
map('n', '<leader><Tab>]', '<cmd>tabnext<CR>', { desc = 'Next Tab' })
map('n', '<leader><Tab>d', '<cmd>tabclose<CR>', { desc = 'Close Tab' })
map('n', '<leader><Tab>[', '<cmd>tabprevious<CR>', { desc = 'Previous Tab' })