(local dmacro-key "<C-T>")
(local clear-key "<C-S-T>")
(var key-log "")
(var prev-macro nil)
(fn guess-macro [kl]
(for [i (/ (length kl) 2) (length kl)]
(let [curspan (kl:sub i)
srchspan (kl:sub 1 (- i 1))
[start end] (srchspan:find curspan 1 true)]
(when (and start end)
(set prev-macro (srchspan:sub start))
(srchspan:sub (+ end 1))))))
(fn key-logger [_ typed]
(let [readable-keycode (vim.fn.keytrans typed)]
(if (~= readable-keycode dmacro-key)
(set key-log (.. key-log readable-keycode))
(if (> (length key-log) 100)
(set key-log (key-log:sub (- (length key-log) 100))))
(set prev-macro nil))))
(vim.on_key key-logger)
(vim.keymap.set ["i" "n" "v" "o" "c" "t"] dmacro-key
#(vim.api.nvim_input (or prev-macro (guess-macro key-log) "")))
(vim.keymap.set ["i" "n" "v" "o" "c" "t"] clear-key
#(set key-log ""))
nil