til/neovim key map helper in lua

When I migrated my dotfiles to Lua, I found myself repeating some patterns, such as adding key mappings, in multiple files. To learn more about Lua, I decided to create a utility module to simplify this handling.

-- utils.lua
local M = {}

return M

We start by creating a utils.lua file in our lua folder and add a local variable called M. We set it to an empty table and return it at the end of the file. This setup and naming is a common convention in Lua modules.

-- utils.lua
local M = {}

function M.map(lhs, rhs, mode, opts)
	local options = { noremap = true, silent = true }
	mode = mode or "n"

	if opts then
		options = vim.tbl_extend("force", options, opts)

	vim.keymap.set(mode, lhs, rhs, options)

return M

We create a map function on our modules table. Inside, we set up some default options, but we also add the ability to extend/override these options whenever we need to. We also set the default mode to "n" (normal) as that is the most common use case (at least for me). Lastly, we call vim's API for creating a key map (see :h vim.keymap.set() for more information).

This now means we can simplify our key mappings across our Lua files.

-- Before
local options = {
	noremap = true,
	silent = true,

vim.keymap.set("n", "<C-J>", "<C-W><C-J>", options)
vim.keymap.set("n", "<C-K>", "<C-W><C-K>", options)

-- After
-- Importing paths start from the `lua` folder
local map = require("utils").map

map("<C-J>", "<C-W><C-J>")
map("<C-K>", "<C-W><C-K>")

Neovim series