nixvim/plugins/common/mappings.nix
Lander Van den Bulcke 5c5c106495
wip
Signed-off-by: Lander Van den Bulcke <landervandenbulcke@gmail.com>
2025-10-18 20:14:59 +02:00

309 lines
8.5 KiB
Nix

{ config, lib, ... }:
let
inherit (config.myvim.mkKey) mkKeymap mkKeymapWithOpts wKeyObj;
inherit (lib.nixvim) mkRaw;
# general mappings
v = [
(mkKeymap "v" "<c-s>" "<esc>:w<cr>" "Saving File")
(mkKeymap "v" "<c-c>" "<esc>" "Escape")
(mkKeymap "v" "<a-j>" ":m '>+1<cr>gv-gv" "Move Selected Line Down")
(mkKeymap "v" "<a-k>" ":m '<lt>-2<CR>gv-gv" "Move Selected Line Up")
(mkKeymap "v" "<" "<gv" "Indent out")
(mkKeymap "v" ">" ">gv" "Indent in")
(mkKeymap "v" "<space>" "<Nop>" "Mapped to Nothing")
];
xv = [
(mkKeymapWithOpts "x" "j" ''v:count || mode(1)[0:1] == "no" ? "j" : "gj"'' "Move down" {
expr = true;
})
(mkKeymapWithOpts "x" "k" ''v:count || mode(1)[0:1] == "no" ? "k" : "gk"'' "Move up" {
expr = true;
})
];
insert = [
(mkKeymap "i" "jk" "<esc>" "Normal Mode")
(mkKeymap "i" "<c-s>" "<esc>:w ++p<cr>" "Save file")
(mkKeymap "i" "<a-j>" "<esc>:m .+1<cr>==gi" "Move Line Down")
(mkKeymap "i" "<a-k>" "<esc>:m .-2<cr>==gi" "Move Line Up")
];
normal = [
(mkKeymap "n" "<c-a-h>" ":lua require('smart-splits').resize_left()<cr>" "Resize Left")
(mkKeymap "n" "<c-a-j>" ":lua require('smart-splits').resize_down()<cr>" "Resize Down")
(mkKeymap "n" "<c-a-k>" ":lua require('smart-splits').resize_up()<cr>" "Resize Up")
(mkKeymap "n" "<c-a-l>" ":lua require('smart-splits').resize_right()<cr>" "Resize Right")
(mkKeymap "n" "?" (
# lua
mkRaw ''
function()
require('flash').jump({
forward = true, wrap = true, multi_window = true
})
end
''
) "Flash Search")
(mkKeymap "n" "<c-h>" ":lua require('smart-splits').move_cursor_left()<cr>" "Move Cursor Left")
(mkKeymap "n" "<c-j>" ":lua require('smart-splits').move_cursor_down()<cr>" "Move Cursor Down")
(mkKeymap "n" "<c-k>" ":lua require('smart-splits').move_cursor_up()<cr>" "Move Cursor Up")
(mkKeymap "n" "<c-l>" ":lua require('smart-splits').move_cursor_right()<cr>" "Move Cursor Right")
(mkKeymap "n" "<c-\\>" ":lua require('smart-splits').move_cursor_previous()<cr>"
"Move Cursor Previous"
)
(mkKeymap "n" "<leader>dd"
(
# lua
mkRaw ''
function()
local any_diff = false
for _, w in ipairs(vim.api.nvim_tabpage_list_wins(0)) do
if vim.api.nvim_win_get_option(w, "diff") then
any_diff = true
break
end
end
if any_diff then
vim.cmd("windo diffoff")
else
vim.cmd("windo diffthis")
end
end
''
)
"Toggle Diff the opened windows"
)
(mkKeymap "n" "<c-s>" "<cmd>w ++p<cr>" "Save the file")
(mkKeymap "n" "<a-+>" "<C-a>" "Increase Number")
(mkKeymap "n" "<a-->" "<C-x>" "Decrease Number")
(mkKeymap "n" "<a-j>" "<cmd>m .+1<cr>==" "Move line Down")
(mkKeymap "n" "<a-k>" "<cmd>m .-2<cr>==" "Move line up")
(mkKeymap "n" "<leader>qq" "<cmd>quitall!<cr>" "Quit!")
(mkKeymap "n" "<leader>qw" (
# lua
mkRaw ''
function()
local wins = vim.api.nvim_tabpage_list_wins(0)
if #wins > 1 then
local ok, err = pcall(vim.cmd, 'close')
if not ok then
vim.notify("Cannot close the last window!", vim.log.levels.WARN)
end
else
vim.notify("Cannot close the last window!", vim.log.levels.WARN)
end
end
''
) "Close Window!")
(mkKeymap "n" "<leader><leader>" "<cmd>nohl<cr>" "no highlight!")
(mkKeymap "n" "<esc>" "<esc>:nohlsearch<cr>" "escape")
(mkKeymap "n" "<leader>A" "ggVG" "select All")
(mkKeymap "n" "<leader>|" "<cmd>vsplit<cr>" "vertical split")
(mkKeymap "n" "<leader>-" "<cmd>split<cr>" "horizontal split")
# quickfix
(mkKeymap "n" "<leader>cn" "<cmd>cnext<cr>" "quickfix next")
(mkKeymap "n" "<leader>cp" "<cmd>cprev<cr>" "quickfix prev")
(mkKeymap "n" "<leader>cq" "<cmd>cclose<cr>" "quit quickfix")
(mkKeymap "n" "<leader>id" (
# lua
mkRaw ''
function()
local date = "# " .. os.date("%d-%m-%y")
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
local line = vim.api.nvim_get_current_line()
-- Insert date at cursor position
local new_line = line:sub(1, col) .. date .. line:sub(col + 1)
vim.api.nvim_set_current_line(new_line)
-- Move cursor to next line
vim.api.nvim_win_set_cursor(0, { row + 1, 0 })
end
''
) "Insert Date at cursor position")
(mkKeymap "n" "n" "nzzzv" "Move to center")
(mkKeymap "n" "N" "Nzzzv" "Moving to center")
(mkKeymap "n" "<leader>uC" (
# lua
mkRaw ''
require('stay-centered').toggle
''
) "Toggle stay-centered.nvim")
(mkKeymap "n" "<leader>ft" (
# lua
mkRaw ''
function()
vim.ui.input({ prompt = "Enter FileType: " }, function(input)
local ft = input
if not input or input == "" then
ft = vim.bo.filetype
end
vim.o.filetype = ft
end)
end
''
) "Set Filetype")
(mkKeymap "n" "<leader>o" (
# lua
mkRaw ''
function()
local word = vim.fn.expand("<cfile>") -- Gets file-like word under cursor
if word:match("^https?://") then
-- Detect OS and choose browser opener
local open_cmd
if vim.fn.has("macunix") == 1 then
open_cmd = "open"
elseif vim.fn.has("unix") == 1 then
open_cmd = "xdg-open"
elseif vim.fn.has("win32") == 1 or vim.fn.has("win64") == 1 then
open_cmd = "start"
else
print("Unsupported OS")
return
end
vim.fn.jobstart({ open_cmd, word }, { detach = true })
elseif vim.fn.filereadable(word) == 1 or vim.fn.isdirectory(word) == 1 then
-- It's a file or directory; open in current window
vim.cmd("edit " .. vim.fn.fnameescape(word))
else
print("Not a valid file or URL: " .. word)
end
end
''
) "Open")
(mkKeymapWithOpts "n" "j" ''v:count || mode(1)[0:1] == "no" ? "j" : "gj"'' "Move down" {
expr = true;
})
(mkKeymapWithOpts "n" "k" ''v:count || mode(1)[0:1] == "no" ? "k" : "gk"'' "Move up" {
expr = true;
})
];
in
{
keymaps = insert ++ normal ++ v ++ xv;
wKeyList = [
(wKeyObj [
"<leader>A"
""
""
"true"
])
(wKeyObj [
"<leader><leader>"
""
""
"true"
])
(wKeyObj [
"<leader>q"
""
"quit/session"
])
(wKeyObj [
"<leader>i"
""
"Insert"
])
(wKeyObj [
"<leader>v"
"󰩬"
"Insert"
])
(wKeyObj [
"z"
""
"fold"
])
(wKeyObj [
"g"
""
"goto"
])
(wKeyObj [
"["
""
"next"
])
(wKeyObj [
"]"
""
"prev"
])
(wKeyObj [
"<leader>u"
"󰔎"
"ui"
])
(wKeyObj [
"<leader>o"
""
"Open"
])
(wKeyObj [
"<leader>d"
""
"diff"
])
(wKeyObj [
"<leader>|"
""
"vsplit"
])
(wKeyObj [
"<leader>-"
""
"split"
])
(wKeyObj [
"<leader>c"
"󰁨"
"quickfix"
])
];
extraConfigLua = # lua
''
-- Use black hole register for 'x', 'X', 'c', 'C'
vim.api.nvim_set_keymap('n', 'x', '"_x', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'X', '"_X', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'c', '"_c', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'C', '"_C', { noremap = true, silent = true })
-- Visual mode
vim.api.nvim_set_keymap('v', 'x', '"_d', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', 'X', '"_d', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', 'c', '"_c', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', 'C', '"_c', { noremap = true, silent = true })
-- In visual mode, paste from the clipboard without overwriting it
vim.api.nvim_set_keymap("v", "p", '"_dP', { noremap = true, silent = true })
-- Only this hack works in command mode
vim.cmd([[
cnoremap <C-j> <C-n>
cnoremap <C-k> <C-p>
]])
'';
}