2011-08-15 67 views
8

我經常在我的Vim會話中打開幾個緩衝區。這意味着我的跳轉列表存儲來自多個緩衝區的位置。但是,經常當我使用Ctrl-o跳轉到前一個位置時,我不想離開緩衝區並想要跳轉到當前緩衝區的「本地」位置。我該怎麼做呢?Vim:如何防止跳出當前緩衝區?

例子:如果我的跳轉列表看起來像以下:

4 10 1 ~/aaa.m 
3 20 1 ~/aaa.m 
2 12 2 ~/xxx.m 
1 15 1 ~/aaa.m 

我要跳到文件aaa.m的第15行第一次我按下Ctrl-O。重要的是,下次按下Ctrl-o時,我不想跳到文件xxx.m.相反,我想跳到文件aaa.m的第20行;也就是我之前在「當前」緩衝區中的位置。 Vim的默認行爲是帶我到文件xxx.m的第12行。關於如何實現這一點的任何想法?

+0

這可能是超級用戶的一個更好的問題,stackoverflow的問題(和答案)往往直接與編碼有關。 superuser.com由同一個人運行,但專注於使用軟件。 –

+4

@David Waters,no。 http://meta.stackexchange.com/q/25925/160504 – sidyll

+2

會使用'changelist'滿足您的需求嗎?你可以用'g;'和'g,'來回移動修改列表。 –

回答

9

請嘗試以下跳轉列表遍歷功能。它從 一個跳轉列表位置到另一個位置(使用按Ctrl + Ø按Ctrl + 取決於什麼重視backforw 參數有),如果當前位置是在停止先後步驟與緩衝區相同的緩衝區是從 開始的。如果無法找到與緩衝區有關的跳轉列表 位置,則該函數返回到跳轉列表在啓動前具有的位置。

function! JumpInFile(back, forw) 
    let [n, i] = [bufnr('%'), 1] 
    let p = [n] + getpos('.')[1:] 
    sil! exe 'norm!1' . a:forw 
    while 1 
     let p1 = [bufnr('%')] + getpos('.')[1:] 
     if n == p1[0] | break | endif 
     if p == p1 
      sil! exe 'norm!' . (i-1) . a:back 
      break 
     endif 
     let [p, i] = [p1, i+1] 
     sil! exe 'norm!1' . a:forw 
    endwhile 
endfunction 

要使用此功能作爲一個 Ctrl鍵+ø/Ctrl鍵 + 鎖定 - 更換到 當前緩衝區,如下所示它創建映射。

nnoremap <silent> <c-k> :call JumpInFile("\<c-i>", "\<c-o>")<cr> 
nnoremap <silent> <c-j> :call JumpInFile("\<c-o>", "\<c-i>")<cr> 
+0

eeck。那是生病的。和狡猾。給你分流游泳 – sehe

+0

感謝您編寫代碼,真正有趣的解決方案。它幾乎是有效的,有幾個小問題。首先,如果一個目錄位於我的跳轉列表中(這可能是因爲我瀏覽了一個目錄來打開一個文件),它會打開當前緩衝區中的netrw瀏覽器,然後卡在那裏。其次,當函數到達跳轉列表的末尾時,它會繼續在最後兩個位置之間跳轉(當按下「Ctrl + k」時)。它可能是通過跳轉列表循環,還是隻停留在最後一個位置? – vimgm

+0

@sehe:這對我來說也是不利的。 (並且我個人不會嘗試去掉默認跳轉列表的行爲。)但是,試圖找出解決這個問題的方法很有趣(也有點冒險)。 –

0

也許EnhancedJumps plugin將幫助。

安裝此插件後,只有在緊接着再次重複相同的跳轉命令時纔會跳轉到另一個緩衝區。