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
相关产品推荐
相关产品推荐

