Note: While this is public, this is mostly written for my own sake, to better understand these concepts in relation to their pure mathematical foundations. Comments and suggestions welcome!
In Neovim, the .
character repeats "the most recent action"; however, this is not always respected by plugin actions. Here we will explore how to build dot-repeat support directly into your plugin, bypassing the requirement of dependencies like repeat.vim.
When some buffer-modifying action is performed, Neovim implicitly remembers the operator (e.g. d
), motion (e.g. iw
), and some other miscellaneous information. When the dot-repeat command is called, Neovim repeats that operator-motion combination. For example, if we type ci"text<Esc>
, then we replace the inner contents of some double quotes with text
, i.e. "hello world"
→ "text"
. Dot-repeating from here will do the same, i.e. "more samples"
→ "text"
.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- This assumes that you're testing with plenary, and your test file is in tests/[plugin]_spec.lua | |
-- Put this in `ftplugin/lua.lua` | |
vim.keymap.set("n", "<Leader>t", function() | |
-- Get the current path and traverse upwards until you find the folder that contains tests/ | |
local cur_path = vim.fn.expand("%:p:h") | |
while cur_path and vim.fn.finddir("tests", cur_path) == "" do | |
cur_path = cur_path:match("(.*)/.*") | |
end | |
if cur_path then |