2011-08-11 11 views
7

Czy Vim może automatycznie powiększyć zakładkę, gdy kursor jej dotknie?Czy istnieje sposób, aby rozwinąć Vim-składanie automatycznie, gdy umieścisz na nim kursor?

+1

dlaczego akceptujesz odpowiedź Eternisa, a nie moją? Nie tylko zaproponowałem to rozwiązanie (i jego jeszcze bardziej elegancką wersję, 'au CursorMoved, CursorMovedI * sil! Foldo') * wcześniej *, co wynika z historii wersji, ale także rozwinęło sposób na bardziej konsekwentne rozwiązywanie problemu. –

+0

Przepraszamy. Nie pamiętam, dlaczego to zrobiłem. Naprawiony. – dan

Odpowiedz

4

Zobacz opcję foldopen. Określa, które grupy poleceń będą prowadzić do otwarcia klapki, jeśli kursor zostanie przesunięty do zamkniętej klapki.

Zauważ, że ruchy pionowe nie otworzyć zamkniętą fałdę, choć. Ponadto nie ma ustawienia w foldopen, aby włączyć to zachowanie. Gdy pozycja hor jest ustawiona w opcji foldopen, aby otworzyć składaną, można użyć h, l lub innych poleceń ruchu poziomego . W przypadku, gdy jest to niezbędne do automatycznego otwierania fałdę w każdym ruchu kursora, który dotyka, można zbliżyć się do tego problemu przez manipulowanie pewnego podzbioru ruchu pionowego poleceń, jak to pokazano poniżej.

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 

niższej, ale nieco thriftier rozwiązaniem byłoby, aby otworzyć klapkę w każdym ruchu kursora.

autocmd CursorMoved,CursorMovedI * silent! foldopen 

Niestety to rozwiązanie nie jest ogólne. Po złożeniu kursora pod kursorem kursor zostanie umieszczony na pierwszym wierszu tego zagięcia. Jeśli zachowanie to jest pożądane, można postępować kierunku pionowym ruch i umieścić kursor w ostatniej linii zagięcia, kiedy kursor porusza się z dołu do góry.

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 

Klapka nie zostanie otwarta, jeśli ruch przeskoczy nad zakładką. Dla przykład 2j na linii tuż nad fałdą będzie umieścić kursor na linii właśnie po tej owczarni, a nie drugiej linii w nim.

+0

Przywróć rozwiązanie 'CursorMoved' z poprzednich wersji. –

1

:help fdo i ewentualnie :help fcl może pomóc. Mam ten wiersz w moim .vimrc:

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

wydaje się zrobić to, co chcesz. Można również dokonać autokomendy dla ruchu kursora:

au CursorMoved * call AutoOpen() 

wywołanie funkcji takich jak:

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

Jeśli chcesz to również pracować w trybie wstawiania, przeznaczenie:

au CursorMoved,CursorMovedI * call AutoOpen() 
+0

Niestety, to podejście ma wady (zobacz moją odpowiedź). –

+0

@ib: Wiem, że nie jest doskonały, ale nie rozumiem jego wad. Czy możesz rozwinąć? Dzięki. – Eelvex

+0

To oczywiste (i już opisane w mojej odpowiedzi, nawiasem mówiąc).Przesuń kursor do linii obok zamkniętej klapki i przesuń o jeden wiersz w górę (np. Za pomocą 'k'). Fałda zostanie otwarta, a kursor znajdzie się na pierwszym wierszu tego zagięcia, a nie na ostatnim, ponieważ powinien być logiczny (co oznacza semantykę pionowego ruchu linia po linii). Aby zobaczyć inną wadę, umieść kursor na linii tuż nad zamkniętą klapką i wpisz '2j'. Kursor przeskoczy całą fałdę, zostanie przesunięty nie o dwie linie w dół, ale o tyle linii, ile składa się. –

Powiązane problemy