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

如何将Vim的<expr>缩写命令转换为Neovim Lua实现?

在Neovim Lua中实现表达式插入缩写

问题分析

你之前用vim.cmd("iab <expr> r80= repeat('=', 80)")未生效,大概率是两个原因:要么是core/set.lua没被正确导入到主配置,要么是Vimscript命令的引号转义问题。

解决方案

方案1:修复Vim.cmd写法并确保配置加载

  1. 确认配置加载:检查你的init.lua是否导入了core.set,如果没有,添加:
-- init.lua
require('core.set')

如果core/init.lua已经负责导入其他core模块,确保它也包含了require('core.set')。

  1. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 01:40:26