2011-08-11 18 views
7

Bạn có thể tự động mở rộng Vim khi con trỏ chạm vào nó không?Có cách nào để mở rộng Vim tự động khi bạn đặt con trỏ lên đó không?

+1

Tại sao bạn chấp nhận câu trả lời của Eelvex chứ không phải của tôi? Không chỉ tôi đề xuất giải pháp này (và phiên bản thậm chí còn tao nhã hơn, 'au CursorMoved, CursorMovedI * sil! Foldo') * sớm hơn *, vì nó rõ ràng từ lịch sử sửa đổi, nhưng cũng phát triển cách giải quyết vấn đề một cách nhất quán hơn. –

+0

Xin lỗi. Tôi không nhớ tại sao tôi lại làm thế. Đã sửa. – dan

Trả lời

4

Xem tùy chọn foldopen. Nó kiểm soát các nhóm lệnh nào sẽ dẫn đến mở màn hình đầu tiên nếu con trỏ được di chuyển vào một lần đóng.

Lưu ý rằng các chuyển động theo chiều dọc không mở được nếp gấp. Hơn nữa, không có cài đặt trong foldopen để bật hành vi này. Khi hor mục là được đặt trong tùy chọn foldopen, để mở màn hình đầu tiên, bạn có thể sử dụng h, l hoặc lệnh chuyển động ngang khác. Trong trường hợp nếu điều quan trọng là tự động mở lần trên bất kỳ chuyển động con trỏ nào chạm vào nó, người ta có thể tiếp cận vấn đề này bằng cách ánh xạ lại một số tập con của lệnh chuyển động thẳng đứng như được hiển thị bên dưới.

nnoremap <silent> j :<c-u>call MoveUpDown('j', +1, 1)<cr> 
nnoremap <silent> k :<c-u>call MoveUpDown('k', -1, 1)<cr> 
nnoremap <silent> gj :<c-u>call MoveUpDown('gj', +1, 1)<cr> 
nnoremap <silent> gk :<c-u>call MoveUpDown('gk', -1, 1)<cr> 
nnoremap <silent> <c-d> :<c-u>call MoveUpDown("\<lt>c-d>", +1, '&l:scroll')<cr> 
nnoremap <silent> <c-u> :<c-u>call MoveUpDown("\<lt>c-u>", -1, '&l:scroll')<cr> 
nnoremap <silent> <c-f> :<c-u>call MoveUpDown("\<lt>c-f>", +1, 'winheight("%")')<cr> 
nnoremap <silent> <c-b> :<c-u>call MoveUpDown("\<lt>c-b>", -1, 'winheight("%")')<cr> 
function! MoveUpDown(cmd, dir, ndef) 
    let n = v:count == 0 ? eval(a:ndef) : v:count 
    let l = line('.') + a:dir * n 
    silent! execute l . 'foldopen!' 
    execute 'norm! ' . n . a:cmd 
endfunction 

Một giải pháp kém hơn, nhưng tiết kiệm hơn sẽ là mở một nếp gấp trên mỗi chuyển động của con trỏ .

autocmd CursorMoved,CursorMovedI * silent! foldopen 

Thật không may, giải pháp này không phải là giải pháp chung. Sau khi gấp dưới con trỏ được mở, con trỏ được đặt trên hàng đầu tiên của nếp gấp đó. Nếu hành vi này là không mong muốn, người ta có thể thực hiện theo hướng dọc của một chuyển động và đặt con trỏ trên hàng cuối cùng của màn hình khi con trỏ đang di chuyển từ dưới lên.

autocmd CursorMoved,CursorMovedI * call OnCursorMove() 
function! OnCursorMove() 
    let l = line('.') 
    silent! foldopen 
    if exists('b:last_line') && l < b:last_line 
     norm! ]z 
    endif 
    let b:last_line = l 
endfunction 

Tuy nhiên, một lần sẽ không được mở nếu chuyển động nhảy qua màn hình đầu tiên. Đối với ví dụ , 2j trên dòng ngay trên màn hình đầu tiên sẽ đặt con trỏ trên dòng ngay sau lần đó, không phải dòng thứ hai trong đó.

+0

Đặt lại giải pháp 'CursorMoved' từ các bản sửa đổi trước đó. –

1

:help fdo và có thể :help fcl có thể giúp bạn. Tôi có dòng này trong vimrc của tôi:

set foldopen=block,hor,insert,jump,mark,percent,quickfix,search,tag,undo 
3
set foldopen=all 

dường như để làm những gì bạn muốn. Bạn cũng có thể làm cho một autocommand cho di chuyển con trỏ:

au CursorMoved * call AutoOpen() 

gọi một chức năng như:

function! AutoOpen() 
    if foldclosed(".") == line(".") 
    call feedkeys("zo") 
    endif 
endfunction 

Nếu bạn muốn điều này cũng làm việc trong chế độ chèn, sử dụng:

au CursorMoved,CursorMovedI * call AutoOpen() 
+0

Thật không may, phương pháp này có nhược điểm (xem câu trả lời của tôi). –

+0

@ib: Tôi biết nó không hoàn hảo nhưng tôi không hiểu những hạn chế. Bạn có thể xây dựng? Cảm ơn. – Eelvex

+0

Điều hiển nhiên (và đã được mô tả trong câu trả lời của tôi).Di chuyển con trỏ dòng bên cạnh một nếp gấp và di chuyển một dòng lên (với 'k', ví dụ). Các nếp gấp sẽ được mở ra và con trỏ sẽ xảy ra được trên dòng đầu tiên của lần đó, không phải trên một trong những cuối cùng vì nó phải được hợp lý (có nghĩa là ngữ nghĩa của dòng theo phong trào thẳng đứng dòng). Để thấy một hạn chế khác, đặt con trỏ trên dòng ngay trên một nếp gấp và gõ '2j'. Con trỏ sẽ nhảy qua toàn bộ nếp gấp, nó sẽ được di chuyển không phải là hai dòng xuống, nhưng như nhiều dòng như gấp có. –

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