From 9a0781a6ff385fa05827cfd06999f39cdf0e1197 Mon Sep 17 00:00:00 2001 From: Fernando Schauenburg Date: Mon, 12 Feb 2024 01:05:55 +0100 Subject: [PATCH] vim: refacor keymap to make it simpler --- config/nvim/lua/fschauen/keymap.lua | 228 ++++++++++++++-------------- 1 file changed, 112 insertions(+), 116 deletions(-) diff --git a/config/nvim/lua/fschauen/keymap.lua b/config/nvim/lua/fschauen/keymap.lua index e270a71..1bef1b0 100644 --- a/config/nvim/lua/fschauen/keymap.lua +++ b/config/nvim/lua/fschauen/keymap.lua @@ -1,126 +1,122 @@ local M = {} -local diagnostic = require 'fschauen.diagnostic' -local window = require 'fschauen.window' - -local toggle_number = function() - vim.wo.number = not vim.wo.number - vim.wo.relativenumber = false +local map = function(mode, lhs, rhs, opts) + opts = opts or {} + opts.silent = opts.silent ~= false -- silent by default + vim.keymap.set(mode, lhs, rhs, opts) end -local toggle_relativenumber = function() - vim.wo.relativenumber = not vim.wo.relativenumber - vim.wo.number = vim.wo.relativenumber or vim.wo.number -end - -local keymap = { - -- better navigation for wrapped lines - { 'j', 'gj' }, - { 'k', 'gk' }, - - -- maintain cursor position when joining lines - { 'J', 'mzJ`z' }, - - -- retain selection when making changes in visual mode - { '', 'gv', mode = 'v' }, - { '', 'gv', mode = 'v' }, - { 'g', 'ggv', mode = 'v' }, - { 'g', 'ggv', mode = 'v' }, - { '>', '>gv', mode = 'v' }, - { '<', '<gv', mode = 'v' }, - - -- place destination of important movements in the center of the screen - { 'n', 'nzzzv' }, - { 'N', 'Nzzzv' }, - { '*', '*zzzv' }, - { '#', '#zzzv' }, - { 'g*', 'g*zzzv' }, - { 'g#', 'g#zzzv' }, - { '', 'zzzv' }, - { '', 'zzzv' }, - - -- easier window navigation - { '', 'j' }, - { '', 'k' }, - { '', 'h' }, - { '', 'l' }, - - -- window resizing - { '', window.resize_up(2), desc = 'Resize window upward' }, - { '', window.resize_down(2), desc = 'Resize window downward' }, - { '', window.resize_left(2), desc = 'Resize window leftward' }, - { '', window.resize_right(2), desc = 'Resize window rightward' }, - - -- easy tab navigation - { '', 'tabnext' }, - { '', 'tabprevious' }, - - -- move lines up and down - { '', [[:move .+1==]] }, - { '', [[:move .-2==]] }, - { '', [[:move '>+1gv=gv]], mode = 'v' }, - { '', [[:move '<-2gv=gv]], mode = 'v' }, - { '', [[:move .+1==gi]], mode = 'i' }, - { '', [[:move .-2==gi]], mode = 'i' }, - - -- move to begin/end of line in insert mode - { '', '^', mode = 'i' }, - { '', '$', mode = 'i' }, - - -- move to begin of line in command mode ( moves to end by default) - { '', '', mode = 'c' }, - - -- more convenient way of entering normal mode from terminal mode - { [[]], [[]], mode = 't' }, - - -- recall older/recent command-line from history - { '', '', mode = 'c' }, - { '', '', mode = 'c' }, - - -- trigger InsertLeave when leaving Insert mode with ctrl-c (see :help i_CTRL-C) - { '', '', mode = 'i' }, - - -- quickly change background - { 'bg', [[let &background = &background ==? 'light' ? 'dark' : 'light']] }, - - -- navigate diagnostics - { '', diagnostic.goto_next }, - { '', diagnostic.goto_prev }, - { 'dd', diagnostic.toggle }, - { 'do', diagnostic.open_float }, - { 'dh', diagnostic.hide }, - { 'dt', diagnostic.select_virtual_text_severity }, - - -- disable highlight until next search - { 'h', 'nohlsearch' }, - - -- navigate items in quickfix and location lists - { 'j', 'cnextzz' }, - { 'k', 'cpreviouszz' }, - { 'j', 'lnextzz' }, - { 'k', 'lpreviouszz' }, - - -- toggle quickfix and loclist - { 'll', window.toggle_quickfix, desc = 'Toggle quickfix' }, - { 'll', window.toggle_loclist, desc = 'Toggle loclist' }, - - -- toggle options - { 'sn', toggle_number }, - { 'sr', toggle_relativenumber }, - { 'sl', 'set list! | set list?' }, - { 'sw', 'set wrap! | set wrap?' }, - { 'ss', 'set spell! | set spell?' }, -} - M.setup = function() - local set = vim.keymap.set + -- better navigation for wrapped lines + map('n', 'j', 'gj') + map('n', 'k', 'gk') - for _, map in ipairs(keymap) do - local lhs, rhs, mode = map[1], map[2], map.mode or 'n' - map[1], map[2], map.mode = nil, nil, nil - map.silent = map.silent ~= false -- silent by default - set(mode, lhs, rhs, map) + -- maintain cursor position when joining lines + map('n', 'J', 'mzJ`z') + + -- retain selection when making changes in visual mode + map('v', '', 'gv') + map('v', '', 'gv') + map('v', 'g', 'ggv') + map('v', 'g', 'ggv') + map('v', '>', '>gv') + map('v', '<', '<gv') + + -- place destination of important movements in the center of the screen + map('n', 'n', 'nzzzv') + map('n', 'N', 'Nzzzv') + map('n', '*', '*zzzv') + map('n', '#', '#zzzv') + map('n', 'g*', 'g*zzzv') + map('n', 'g#', 'g#zzzv') + map('n', '', 'zzzv') + map('n', '', 'zzzv') + + -- easier window navigation + map('n', '', 'j') + map('n', '', 'k') + map('n', '', 'h') + map('n', '', 'l') + + local window = require 'fschauen.window' + + -- window resizing + map('n', '', window.resize_up(2), { desc = 'Resize window upward' }) + map('n', '', window.resize_down(2), { desc = 'Resize window downward' }) + map('n', '', window.resize_left(2), { desc = 'Resize window leftward' }) + map('n', '', window.resize_right(2), { desc = 'Resize window rightward' }) + + -- easy tab navigation + map('n', '', 'tabnext') + map('n', '', 'tabprevious') + + -- move lines up and down + map('n', '', [[:move .+1==]]) + map('n', '', [[:move .-2==]]) + map('v', '', [[:move '>+1gv=gv]]) + map('v', '', [[:move '<-2gv=gv]]) + map('i', '', [[:move .+1==gi]]) + map('i', '', [[:move .-2==gi]]) + + -- move to begin/end of line in insert mode + map('i', '', '^') + map('i', '', '$') + + -- move to begin of line in command mode ( moves to end by default) + map('c', '', '') + + -- more convenient way of entering normal mode from terminal mode + map('t', [[]], [[]]) + + -- recall older/recent command-line from history + map('c', '', '') + map('c', '', '') + + -- trigger InsertLeave when leaving Insert mode with ctrl-c (see :help i_CTRL-C) + map('i', '', '') + + -- quickly change background + map('n', 'bg', [[let &background = &background ==? 'light' ? 'dark' : 'light']]) + + local diagnostic = require 'fschauen.diagnostic' + + -- navigate diagnostics + map('n', '', diagnostic.goto_next) + map('n', '', diagnostic.goto_prev) + map('n', 'dd', diagnostic.toggle) + map('n', 'do', diagnostic.open_float) + map('n', 'dh', diagnostic.hide) + map('n', 'dt', diagnostic.select_virtual_text_severity) + + -- disable highlight until next search + map('n', 'h', 'nohlsearch') + + -- navigate items in quickfix and location lists + map('n', 'j', 'cnextzz') + map('n', 'k', 'cpreviouszz') + map('n', 'j', 'lnextzz') + map('n', 'k', 'lpreviouszz') + + -- toggle quickfix and loclist + map('n', 'll', window.toggle_quickfix, { desc = 'Toggle quickfix' }) + map('n', 'll', window.toggle_loclist, { desc = 'Toggle loclist' }) + + local toggle_number = function() + vim.wo.number = not vim.wo.number + vim.wo.relativenumber = false end + + local toggle_relativenumber = function() + vim.wo.relativenumber = not vim.wo.relativenumber + vim.wo.number = vim.wo.relativenumber or vim.wo.number + end + + -- toggle options + map('n', 'sn', toggle_number) + map('n', 'sr', toggle_relativenumber) + map('n', 'sl', 'set list! | set list?') + map('n', 'sw', 'set wrap! | set wrap?') + map('n', 'ss', 'set spell! | set spell?') end return M