2012-02-22 91 views
22

在Vim中,我經常發現自己想要做一個快速žķžĴ跳轉到上一個或下一個摺疊在一個文件中。問題是,我經常想跳過所有打開的摺疊,並跳到最近的封閉摺疊。是否有可能跳到Vim中的關閉摺疊?

有沒有辦法做到這一點?我在手冊中沒有看到內置的鍵盤映射。

回答

22

讓我建議實現上述行爲的以下映射。

nnoremap <silent> <leader>zj :call NextClosedFold('j')<cr> 
nnoremap <silent> <leader>zk :call NextClosedFold('k')<cr> 
function! NextClosedFold(dir) 
    let cmd = 'norm!z' . a:dir 
    let view = winsaveview() 
    let [l0, l, open] = [0, view.lnum, 1] 
    while l != l0 && open 
     exe cmd 
     let [l0, l] = [l, line('.')] 
     let open = foldclosed(l) < 0 
    endwhile 
    if open 
     call winrestview(view) 
    endif 
endfunction 
+0

令人敬畏。奇蹟般有效。非常感謝! – David 2012-02-23 17:11:58

+0

@David:謝謝!我對代碼進行了重構,以簡化跳轉循環,並在所需方向沒有關閉摺疊的情況下將光標保持在原位。 (後者的行爲符合'zj' /'zk'命令的行爲,當在下面/上面找不到摺疊時。) – 2012-02-24 07:11:37

+0

@ib。你能否提供更改後的腳本? – 2016-08-23 09:57:23

-1

不,沒有(據我所知)一種構建方法來做到這一點。雖然有趣的想法。

如果我在此刻一段時間,我可能會嘗試找出一個辦法做到這一點 - 可惜的是,忙碌現在我可以建議你是看Detecting a folded line or an incremental search問題(特別是foldclosed功能)並嘗試自己做一個功能。檢查每一行,如果摺疊打開,跳過...沿着這些行。