1. 程式人生 > >vim自動開啟跳到上次的游標位置

vim自動開啟跳到上次的游標位置

某些情況下,你不得不停下當前檔案的編輯工作,退出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