某些情况下,你不得不停下当前文件的编辑工作,退出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 |
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
我的网站类型跟你的很像哦,可以交换一下友情链接么?
Sorry。
楼主,为什么我这么配置没有起作用?”autocmd”这个是要系统支持吗?
是的,你的Vim可能只是vim-tiny.
如果你使用Linux的话,试试安装vim-full或者vim-gnome试试。
不行的话试试加上这个选项set nocompatible
我能想到的原因只有这些了。
楼主.. 我用的是ubuntu的。 你说的vim插件我早就安装过了,而且“set nocompatible” 这个我也早在自己的.vimrc里写过了。 郁闷~~!