keybindings.lua

Branches > main > a4b40fb > files / nvim / lua / keybindings.lua

local keymap = vim.keymap.set

keymap("n", "<C-h>", "<C-w><C-h>")
keymap("n", "<C-l>", "<C-w><C-l>")
keymap("n", "<C-j>", "<C-w><C-j>")
keymap("n", "<C-k>", "<C-w><C-k>")

keymap("n", "U", "<C-r>")

keymap({"n", "v"}, "<C-left>", "b")
keymap({"n", "v"}, "<C-right>", "w")

keymap({"n", "v", "o"}, "H", "_")
keymap({"n", "v", "o"}, "L", "$")

keymap({"n", "v"}, "<Space>y", "\"+y")
keymap({"n", "v"}, "<Space>p", "\"+p")
keymap({"n", "v"}, "<Space>P", "\"+P")
keymap({"n", "v"}, "<Space>d", "\"+d")

keymap({"n", "v", "o"}, "J", "<C-d>")
keymap({"n", "v", "o"}, "K", "<C-u>")

keymap({"n", "v"}, "<C-d>", "<Nop>")
keymap({"n", "v"}, "<C-u>", "<Nop>")

keymap({"n", "v"}, "j", "gj")
keymap({"n", "v"}, "k", "gk")

keymap({"n", "v"}, "<Space>j", "J")

keymap("n", "<Esc>", "<CMD>noh<CR>")

keymap("n", "<Space>u", require("plugins.oil").open)

keymap("n", ";", function() require("jump").jump() end)

--- Either nil, "f/t", or "space"
--- TODO should probably be per-buffer :p
local last_n_type = nil

vim.api.nvim_create_autocmd("CmdlineLeave", {
  callback = function()
    local t = vim.fn.getcmdtype()
    if t == "/" or t == "?" then
      last_n_type = "search"
    end
  end})

for _, key in ipairs({"f", "F", "t", "T"}) do
  vim.keymap.set({"n", "x", "o"}, key, function()
    last_n_type = "f/t"
    return key
  end, {expr = true, noremap = true})
end


local function smart_n(reverse)
  if last_n_type == nil then
    return ""
  elseif last_n_type == "f/t" then
    local cs = vim.fn.getcharsearch()
    if reverse then
      return cs.forward == 1 and "," or ";"
    else
      return cs.forward == 1 and ";" or ","
    end
  elseif last_n_type == "search" then
    if reverse then
      return vim.v.searchforward == 1 and "N" or "n"
    else
      return vim.v.searchforward == 1 and "n" or "N"
    end
  end
end

vim.keymap.set({"n", "v", "o"}, "n", function() return smart_n(false) end, {expr = true, noremap = true})
vim.keymap.set({"n", "v", "o"}, "N", function() return smart_n(true) end, {expr = true, noremap = true})