某些情况下,你不得不停下当前文件的编辑工作,退出Vim,处理其他的事情,然后重新打开Vim继续刚才的工作。我总是希望Vim打开某个文件的时候,光标停在上次关闭文件时所停留的位置。Vim的默认配置似乎也是这样的,但直到我添加了自己的~/.vimrc和各种插件、模板文件后,Vim的”记忆”似乎被抹去了。每次打开文件,光标总是在文件的第一个字节处闪烁。于是我只能使用’.或者`.使光标移动到最后修改过的地方,但是,你知道的,我的注意力并不是总在刚刚修改过的地方。通常,光标在哪里,我的瞳孔就朝向哪里。
这个问题折磨我好久了,我终于下决心要整治一下。我先把那些插件给禁掉,又把map的很多键也禁了,最后把自定义的.vimrc也清空了,但问题依旧……这让我很是无奈。
Google了半天,据说viminfo保存了文件的一些状态信息,包括光标信息。:h viminfo,得知’0保存了Vim上次退出时光标的位置信息。但’0还不是我想要的,因为它保存的是一个”全局”的位置信息。比如,我先打开foo.c,光标移动到非开头处,退出,再打开bar.c,移动到非开头处,退出,再打开foo.c,按下’0,Vim自动打开bar.c并跳到退出时的位置。
最后我决定开口求救。LinuxToy上的朋友帮我解决了这个问题。只需要vimrc里面加一个稍微复杂一点的autocmd就搞定了:
1 2 3 | if has("autocmd") au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif endif |
刚才翻看了Vim的全局配置/etc/vim/vimrc,里面有被注释的这么几行:
1 2 3 4 5 | " Uncomment the following to have Vim jump to the last position when " reopening a file "if has("autocmd") " au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif "endif |
见鬼了,这几行是被注释掉的,可为啥,我刚刚装好的Vim却会自动地定位光标呢?
更新
解释下上面的autocmd命令。首先,当打开任何文件时,首先判断上次退出该文件时光标所在行,如果不在第一行,那么执行exe命令,即:开头的命令,:normal! g'”命令是在normal模式下执行g'”,即将光标定位到上次退出文件时所在行。为了使光标准确定位至“某一行的某一列”,需要使用`来跳转至标记”,而不是’。最后,代码应该是,
1 2 3 4 5 6 | " Uncomment the following to have Vim jump to the last position when " reopening a file if has("autocmd") au BufReadPost * if line("`\"") > 1 && line("`\"") <= line("$") | exe "normal! g`\"" | endif " for simplicity, " au BufReadPost * exe "normal! g`\"", is Okay. endif |