2012-02-22 27 views
22

Trong Vim, tôi thường xuyên thấy mình muốn làm một cách nhanh chóng zk hay zj để nhảy tới lần trước hoặc sau trong một tập tin. Vấn đề là, tôi thường muốn bỏ qua tất cả các nếp gấp mở và chỉ cần nhảy tới lần đóng gần nhất.Có thể nhảy tới các nếp gấp trong Vim không?

Có cách nào để thực hiện việc này không? Tôi thấy không có sơ đồ bàn phím tích hợp trong sách hướng dẫn.

Trả lời

22

Hãy để tôi đề xuất các ánh xạ sau đây thực hiện hành vi được mô tả.

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

khiếp sợ. Làm việc như một say mê. Cảm ơn rất nhiều! – David

+0

@David: Cảm ơn! Tôi đã thực hiện tái cấu trúc trên mã để đơn giản hóa vòng lặp nhảy và giữ con trỏ tại chỗ nếu không có nếp gấp nào theo hướng mong muốn. (Hành vi thứ hai phù hợp với các lệnh 'zj' /' zk' khi không có nếp gấp nào được tìm thấy bên dưới/bên trên.) –

+0

@ib. bạn có thể vui lòng cung cấp kịch bản đã thay đổi không? –

-1

Không, không có (theo như tôi biết) một phương pháp xây dựng để làm điều đó. Ý tưởng thú vị, mặc dù.

Nếu tôi có một thời gian tại thời điểm này, tôi có thể cố gắng tìm ra một cách để làm điều đó - unfortunatelly, vì quá bận rộn ngày nay tất cả những gì có thể gợi ý bạn là nhìn vào các câu hỏi Detecting a folded line or an incremental search (đặc biệt là foldclosed chức năng) và cố tự làm một chức năng. Kiểm tra tất cả các dòng, nếu gấp được mở, bỏ qua ... một cái gì đó dọc theo những dòng.

Các vấn đề liên quan