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

Neovim init.lua如何配置实现打开文件自动定位上次关闭行号

Neovim 打开文件自动跳转至上次关闭行号的配置方法

功能说明

配置生效后,打开任意曾经编辑过的文件时,光标会自动定位到上次关闭文件时停留的行位置,同时会自动过滤无效跳转场景:

  • 上次光标停在文件第一行时不触发跳转
  • 文件被裁剪、上次标记的行号超出当前文件总行数时不触发跳转,避免报错

init.vim 可用的Vimscript实现

以下代码可以直接写入init.vim配置文件,重启Neovim后生效:

au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif

init.lua 等价实现

原生Lua API写法(Neovim 0.7及以上版本推荐)

完全使用Neovim内置Lua API实现,逻辑和Vimscript版本100%一致,无第三方依赖:

vim.api.nvim_create_autocmd("BufReadPost", {
  pattern = "*",
  callback = function()
    local last_cursor_line = vim.fn.line("'\"")
    local file_total_lines = vim.fn.line("$")
    -- 校验行号合法性后再跳转
    if last_cursor_line > 1 and last_cursor_line <= file_total_lines then
      vim.cmd.normal({ "g'\"", bang = true })
    end
  end,
})

代码逻辑对应说明:

  • 触发时机绑定BufReadPost事件,即文件内容加载到缓冲区完成后执行逻辑
  • '"'是Vim/Neovim内置的特殊位置标记,会自动存储每个文件上次退出时的光标位置
  • normal!的bang标记用于跳过用户自定义的按键映射,直接执行原生跳转逻辑,避免自定义映射导致跳转异常

全版本兼容写法

如果使用0.7以下的旧版本Neovim,可以直接把原Vimscript逻辑包裹在vim.cmd中执行,效果完全一致:

vim.cmd([[
  au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
]])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:33:32