如何将Vim的<expr>缩写命令转换为Neovim Lua实现?
在Neovim Lua中实现表达式插入缩写
问题分析
你之前用vim.cmd("iab <expr> r80= repeat('=', 80)")未生效,大概率是两个原因:要么是core/set.lua没被正确导入到主配置,要么是Vimscript命令的引号转义问题。
解决方案
方案1:修复Vim.cmd写法并确保配置加载
- 确认配置加载:检查你的
init.lua是否导入了core.set,如果没有,添加:
-- init.lua require('core.set')
如果core/init.lua已经负责导入其他core模块,确保它也包含了require('core.set')。
- 修正vim.cmd命令:调整引号避免转义冲突,二选一即可:
-- core/set.lua -- 方式A:用单引号包裹整个Vim命令,内部使用双引号 vim.cmd('iab <expr> r80= repeat("=", 80)') -- 方式B:转义双引号(适用于双引号包裹命令的场景) vim.cmd("iab <expr> r80= repeat(\"=\", 80)")
方案2:使用Neovim原生Lua API实现(推荐)
完全用Lua逻辑模拟表达式缩写的行为,不依赖Vimscript:
-- core/set.lua -- 创建自动命令组,避免重复注册 local abbrev_group = vim.api.nvim_create_augroup('CustomAbbrevs', { clear = true }) vim.api.nvim_create_autocmd('InsertCharPre', { group = abbrev_group, callback = function() local cursor = vim.api.nvim_win_get_cursor(0) local line = vim.api.nvim_get_current_line() local col = cursor[2] -- 检查当前输入的是=,且前三个字符为r80 if col >= 3 and line:sub(col - 3, col - 1) == 'r80' then -- 替换r80=为80个等号 vim.api.nvim_buf_set_text( 0, cursor[1] - 1, col - 4, cursor[1] - 1, col, {string.rep('=', 80)} ) -- 移动光标到等号末尾 vim.api.nvim_win_set_cursor(0, {cursor[1], col - 4 + 80}) end end, })
方案对比
- 方案1:简洁快速,直接复用原有Vim配置,适合迁移初期。
- 方案2:原生Lua实现,无Vimscript依赖,可扩展性更强,适合长期维护。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

