You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何追踪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)

二、映射埋点保存数据的最优方式

  1. 异步轻量化写入:用vim.defer_fn()或vim.loop.write()实现异步IO,避免阻塞Neovim主线程,影响编辑体验。
  2. 无侵入式包装:通过替换原vim.keymap.set方法实现埋点,无需修改已有映射配置,降低维护成本。
  3. 结构化数据库存储:用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,可选择以下方案:

  1. 自定义统计脚本:基于上述埋点数据,编写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
  1. 社区轻量插件:部分插件专注Neovim本地统计,比如nvim-usage,可直接集成到配置中,自动追踪按键、映射及命令的使用情况,无需手动编写埋点逻辑。

  2. 自定义启动页展示:结合alpha-nvim等Dashboard插件,将统计数据渲染在启动页,实时查看使用习惯,比如展示每日使用时长、高频映射等。

内容的提问来源于stack exchange,提问作者Gonzalo Matheu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:02:45