From f934a4128b89a897fbef095e1f01e214a5e762d5 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 31 Mar 2024 20:26:37 +0800 Subject: [PATCH] feat(recordkey): add recordkey plugin --- autoload/SpaceVim/mapping/space.vim | 4 ++ lua/spacevim/plugin/record-key.lua | 78 +++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 lua/spacevim/plugin/record-key.lua diff --git a/autoload/SpaceVim/mapping/space.vim b/autoload/SpaceVim/mapping/space.vim index 3365b0c29..1d516ed45 100644 --- a/autoload/SpaceVim/mapping/space.vim +++ b/autoload/SpaceVim/mapping/space.vim @@ -701,6 +701,10 @@ function! SpaceVim#mapping#space#init() abort else call SpaceVim#custom#SPC('nnoremap', ['a', 'o'], 'call SpaceVim#plugins#todo#list()', 'open-todo-manager', 1) endif + + if has('nvim-0.9.5') + call SpaceVim#custom#SPC('nnoremap', ['a', 'r'], 'lua require("spacevim.plugin.record-key").toggle()', 'toggle-record-keyboard', 1) + endif endfunction function! SpaceVim#mapping#space#def(m, keys, cmd, desc, is_cmd, ...) abort diff --git a/lua/spacevim/plugin/record-key.lua b/lua/spacevim/plugin/record-key.lua new file mode 100644 index 000000000..fced9cc78 --- /dev/null +++ b/lua/spacevim/plugin/record-key.lua @@ -0,0 +1,78 @@ +--============================================================================= +-- record-key.lua --- record key for nvim +-- Copyright (c) 2016-2022 Wang Shidong & Contributors +-- Author: Wang Shidong < wsdjeg@outlook.com > +-- URL: https://spacevim.org +-- License: GPLv3 +--============================================================================= + +local M = {} + +local timeout = 3000 + +local max_count = 5 + +local keys = {} + +local pos = 0 + +local enabled = false +local ns_is = vim.api.nvim_create_namespace('record-key') + +local function show_key(key) + local buf = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_lines(buf, 0, -1, false, { string.format('%8s', key) }) + + local winid = vim.api.nvim_open_win(buf, false, { + relative = 'editor', + width = 8, + height = 1, + row = vim.o.lines - 10 - pos * 3, + col = vim.o.columns - 25, + focusable = false, + noautocmd = true, + border = "single" + }) + vim.fn.setbufvar(buf, '&number', 0) + vim.fn.setbufvar(buf, '&relativenumber', 0) + vim.fn.setbufvar(buf, '&cursorline', 0) + vim.fn.setbufvar(buf, '&bufhidden', 'wipe') + vim.api.nvim_win_set_option(winid, 'winhighlight', 'NormalFloat:Normal') + vim.fn.timer_start(timeout, function() + if vim.api.nvim_win_is_valid(winid) then + vim.api.nvim_win_close(winid, true) + end + end, { ['repeat'] = 1 }) +end + +local function display() + pos = 0 + if #keys > max_count then + for i = 1, max_count, 1 do + show_key(keys[#keys - i + 1]) + pos = pos + 1 + end + else + for i = 1, #keys, 1 do + show_key(keys[#keys - i + 1]) + pos = pos + 1 + end + end +end + +local function on_key(key) + table.insert(keys, key) + display() +end + +function M.toggle() + if enabled then + vim.on_key(nil, ns_is) + enabled = false + else + vim.on_key(on_key, ns_is) + enabled = true + end +end + +return M