(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