如何追踪Neovim中按键映射与函数的使用情况?
Neovim使用行为追踪方案
一、如何了解常用按键、映射及函数
1. 捕获按键触发
使用Neovim内置的vim.on_key() API注册回调,实时记录所有按键的触发次数:
local key_stats = {} vim.on_key(function(key) local key_str = vim.fn.keytrans(key) key_stats[key_str] = (key_stats[key_str] or 0) + 1 -- 定期异步写入文件,避免阻塞主线程 vim.defer_fn(function() vim.fn.writefile({vim.json.encode(key_stats)}, vim.fn.stdpath('data') .. '/key_stats.json') end, 1000) end)
2. 追踪映射调用
通过包装vim.keymap.set方法,在映射触发时自动记录键位、模式及调用次数,无需修改原有配置:
local original_keymap_set = vim.keymap.set local keymap_stats = {} vim.keymap.set = function(mode, lhs, rhs, opts) original_keymap_set(mode, lhs, rhs, opts) local key_id = string.format('%s:%s', mode, lhs) keymap_stats[key_id] = (keymap_stats[key_id] or 0) + 1 -- 异步写入统计文件 vim.defer_fn(function() vim.fn.writefile({vim.json.encode(keymap_stats)}, vim.fn.stdpath('data') .. '/keymap_stats.json') end, 1000) end
3. 统计函数调用
对需要追踪的自定义函数做包装,添加调用次数统计逻辑:
local function wrap_tracked_func(func_name, func) local call_count = 0 return function(...) call_count = call_count + 1 -- 读取并更新函数统计数据 local func_stats = vim.fn.json_decode(vim.fn.readfile(vim.fn.stdpath('data') .. '/func_stats.json') or '{}') func_stats[func_name] = call_count vim.fn.writefile({vim.json.encode(func_stats)}, vim.fn.stdpath('data') .. '/func_stats.json') -- 执行原函数逻辑 return func(...) end end -- 使用示例:包装自定义函数 local my_custom_func = wrap_tracked_func('my_custom_func', function() print('执行自定义函数') end)
二、映射埋点保存数据的最优方式
- 异步轻量化写入:用
vim.defer_fn()或vim.loop.write()实现异步IO,避免阻塞Neovim主线程,影响编辑体验。 - 无侵入式包装:通过替换原
vim.keymap.set方法实现埋点,无需修改已有映射配置,降低维护成本。 - 结构化数据库存储:用SQLite替代JSON文件,更适合复杂查询(如按时间段统计),可借助
plenary.nvim的SQLite模块简化操作:
local sqlite = require('plenary.sqlite') local db = sqlite.open(vim.fn.stdpath('data') .. '/keymap_stats.db') db:create('keymaps', { mode = 'text', lhs = 'text', count = 'integer', last_used = 'integer' }) -- 映射包装函数中写入数据库 vim.keymap.set = function(mode, lhs, rhs, opts) original_keymap_set(mode, lhs, rhs, opts) local record = db:select('keymaps', {where = {mode = mode, lhs = lhs}})[1] if record then db:update('keymaps', { where = {mode = mode, lhs = lhs}, set = {count = record.count + 1, last_used = os.time()} }) else db:insert('keymaps', {mode = mode, lhs = lhs, count = 1, last_used = os.time()}) end end
三、聚焦Neovim的使用统计方案
如果不需要跨编辑器的Wakatime,可选择以下方案:
- 自定义统计脚本:基于上述埋点数据,编写Lua脚本生成终端报告,比如统计Top 10常用按键/映射:
-- 生成按键统计报告示例 local key_stats = vim.fn.json_decode(vim.fn.readfile(vim.fn.stdpath('data') .. '/key_stats.json') or '{}') local sorted_keys = vim.tbl_keys(key_stats) table.sort(sorted_keys, function(a, b) return key_stats[a] > key_stats[b] end) print('Top 10常用按键:') for i = 1, math.min(10, #sorted_keys) do print(string.format('%d. %s: %d次', i, sorted_keys[i], key_stats[sorted_keys[i]])) end
社区轻量插件:部分插件专注Neovim本地统计,比如
nvim-usage,可直接集成到配置中,自动追踪按键、映射及命令的使用情况,无需手动编写埋点逻辑。自定义启动页展示:结合
alpha-nvim等Dashboard插件,将统计数据渲染在启动页,实时查看使用习惯,比如展示每日使用时长、高频映射等。
内容的提问来源于stack exchange,提问作者Gonzalo Matheu
相关产品推荐
相关产品推荐

