---@type vim.keymap.set.Opts
local opt = { silent = true, noremap = true }

require("user.utils").keymaps_set({
    ---disable keymaps
    -- `s` and `S` same is `cl`, `cc` and `C` "
    {
        mode = { "n", "x" },
        lhs = [[s]],
        rhs = [[<Nop>]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[S]],
        rhs = [[<Nop>]],
        opts = opt,
    },

    -- unuse marker
    {
        mode = { "n", "x" },
        lhs = [[m]],
        rhs = [[<Nop>]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[']],
        rhs = [[<Nop>]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[`]],
        rhs = [[<Nop>]],
        opts = opt,
    },

    { -- disable move left after space
        mode = { "n", "x" },
        lhs = [[<Space>]],
        rhs = [[<Nop>]],
        opts = opt,
    },

    ---Window control keymaps
    {
        mode = { "n" },
        lhs = [[<Space>w]],
        rhs = [[<Plug>(Window)]],
        opts = { noremap = true },
    },

    -- Commands of move between window.
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)h]],
        rhs = [[<C-W>h]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)j]],
        rhs = [[<C-W>j]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)k]],
        rhs = [[<C-W>k]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)l]],
        rhs = [[<C-W>l]],
        opts = opt,
    },

    -- Commands of move window.
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)H]],
        rhs = [[<C-W>H]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)J]],
        rhs = [[<C-W>J]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)K]],
        rhs = [[<C-W>K]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)L]],
        rhs = [[<C-W>L]],
        opts = opt,
    },

    -- Tab page controls.
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)tn]],
        rhs = function()
            vim.cmd.tabnew()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)tT]],
        rhs = [[<C-W>T]],
        opts = opt,
    },

    { -- Commands of close window.
        mode = { "n" },
        lhs = [[<Plug>(Window)q]],
        rhs = [[<C-W>q]],
        opts = opt,
    },
    { -- easy save. save file only when changed.
        mode = { "n" },
        lhs = [[<Plug>(Window)w]],
        rhs = function()
            vim.cmd.update()
        end,
        opts = opt,
    },

    -- Commands of Window split.
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)s]],
        rhs = [[<C-W>s]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)v]],
        rhs = [[<C-W>v]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)n]],
        rhs = [[<C-W>n]],
        opts = opt,
    },

    -- Window size controls.
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)|]],
        rhs = [[<C-W>|]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)_]],
        rhs = [[<C-W>_]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<Plug>(Window)=]],
        rhs = [[<C-W>=]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<S-Left>]],
        rhs = [[<C-W><]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<S-Right>]],
        rhs = [[<C-W>>]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<S-Up>]],
        rhs = [[<C-W>-]],
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [[<S-Down>]],
        rhs = [[<C-W>+]],
        opts = opt,
    },

    -- QuickFix
    {
        mode = { "n" },
        lhs = [=[[q]=],
        rhs = function()
            vim.cmd.cprevious()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[]q]=],
        rhs = function()
            vim.cmd.cnext()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[[Q]=],
        rhs = function()
            vim.cmd.cfirst()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[]Q]=],
        rhs = function()
            vim.cmd.clast()
        end,
        opts = opt,
    },

    -- Buffer
    {
        mode = { "n" },
        lhs = [=[[b]=],
        rhs = function()
            vim.cmd.bprevious()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[]b]=],
        rhs = function()
            vim.cmd.bnext()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[[B]=],
        rhs = function()
            vim.cmd.bfirst()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[]B]=],
        rhs = function()
            vim.cmd.blast()
        end,
        opts = opt,
    },

    -- Tab
    {
        mode = { "n" },
        lhs = [=[[t]=],
        rhs = function()
            vim.cmd.tabprevious()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[]t]=],
        rhs = function()
            vim.cmd.tabnext()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[[T]=],
        rhs = function()
            vim.cmd.tabfirst()
        end,
        opts = opt,
    },
    {
        mode = { "n" },
        lhs = [=[]T]=],
        rhs = function()
            vim.cmd.tablast()
        end,
        opts = opt,
    },

    -- Do not save the things erased by x and c in the register.
    {
        mode = { "n", "x" },
        lhs = [[x]],
        rhs = [["_x]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[X]],
        rhs = [["_X]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[c]],
        rhs = [["_c]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[C]],
        rhs = [["_C]],
        opts = opt,
    },
    -- Macro record keymap.
    {
        mode = { "n", "x" },
        lhs = [[<C-q>]],
        rhs = [[q]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[q]],
        rhs = [[<Nop>]],
        opts = opt,
    },

    -- Utils
    {
        mode = { "n" },
        lhs = [[gf]],
        rhs = [[gF]],
        opts = opt,
    },
    {
        mode = { "x" },
        lhs = [[P]],
        rhs = [[p]],
        opts = opt,
    },
    {
        mode = { "x" },
        lhs = [[p]],
        rhs = [[P]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[0]],
        rhs = [[^]],
        opts = opt,
    },
    {
        mode = { "n", "x" },
        lhs = [[^]],
        rhs = [[0]],
        opts = opt,
    },
    {
        mode = { "i" },
        lhs = [[jj]],
        rhs = [[<ESC><C-l>]],
        opts = opt,
    },
    {
        mode = { "c" },
        lhs = [[jj]],
        rhs = [[<ESC><C-l>]],
        opts = { noremap = true },
    },
    {
        mode = { "i" },
        lhs = [[<C-l>]],
        rhs = [[<Del>]],
        opts = opt,
    },
    {
        mode = { "c" },
        lhs = [[<C-l>]],
        rhs = [[<Del>]],
        opts = { noremap = true },
    },
    {
        mode = { "i" },
        lhs = [[<C-a>]],
        rhs = [[<C-g>U<Home>]],
        opts = opt,
    },

    -- Cmdline mode cursor move emacs like {{{
    {
        mode = { "c" },
        lhs = [[<C-a>]],
        rhs = [[<Home>]],
        opts = { noremap = true },
    },
    {
        mode = { "c" },
        lhs = [[<C-e>]],
        rhs = [[<End>]],
        opts = { noremap = true },
    },
    {
        mode = { "c" },
        lhs = [[<C-f>]],
        rhs = [[<Right>]],
        opts = { noremap = true },
    },
    {
        mode = { "c" },
        lhs = [[<C-b>]],
        rhs = [[<Left>]],
        opts = { noremap = true },
    },

    -- Operator
    {
        mode = { "o", "x" },
        lhs = [[a']],
        rhs = [[2i']],
        opts = opt,
    },
    {
        mode = { "o", "x" },
        lhs = [[a"]],
        rhs = [[2i"]],
        opts = opt,
    },
    {
        mode = { "o", "x" },
        lhs = [[a`]],
        rhs = [[2i`]],
        opts = opt,
    },
    {
        mode = { "o", "x" },
        lhs = [[a<Space>]],
        rhs = [[aW]],
        opts = opt,
    },
    {
        mode = { "o", "x" },
        lhs = [[i<Space>]],
        rhs = [[iW]],
        opts = opt,
    },
})