2015-05-22 13 views
5

Zawsze, gdy przeglądam złożony kod w vimie i naciskam klawisz l, chcę, aby otwierał on ten fałd rekursywnie. W tym celu wykonałem następujące czynności: nmap l lzO. Co działało w porządku, pomijając fakt otrzymania E490: No fold found za każdym razem, gdy naciskałem l, ale nie w fałdach. Użyłem tej wymówki, aby poznać Vimscript i napisać dla niego funkcję i uniknąć błędu.Wywołanie klawiszy hjkl z wiersza komend vima:

Teraz brakuje mi części jak mogę wywołać komendę vim taką jak l lub lzO z wnętrza funkcji?

function! OpenFoldOrNot() 
    if foldclosed(line(".")) == -1 
     echo "just l" 
     l # TODO 
    else 
     echo "open fold" 
     lzO # TODO 
    endif 
endfunction 

nmap l :call OpenFoldOrNot()<CR> 

Odpowiedz

3

Spróbuj komendy normal. W tym przypadku będziesz potrzebował normal!, aby uniknąć rekurencyjnego wykonywania funkcji.

3

Można wypróbować następujące, używając komendy normal (mój vimscript jest bardzo zardzewiałą):

function! OpenFoldOrNot() 
    if foldclosed(line(".")) == -1 
     normal! l 
    else 
     normal! lzO 
    endif 
endfunction 

nmap l :call OpenFoldOrNot()<CR> 
+0

Nie ma potrzeby 'execute', chyba że masz zamiar użyć do druku formatu niektórych znaków specjalnych, takich jak' 'lub' '. – mMontu

+0

Ach tak, masz rację. Jak już powiedziałem, mój vimscript jest bardzo zardzewiały;) –

2

Alternatywnie można użyć map-wyrażenie, aby tego rodzaju zadania łatwiejsze.

nnoremap <expr> l foldclosed(line(".")) == -1 ? 'l' : 'lzO' 

W wyrażeniu mapie z prawej strony, {rhs}, mapowania jest wyrażeniem VimScript. Jest to oceniane w celu uzyskania tego, co należy wykonać. W twoim przypadku jest używany do określenia, czy mapowanie wywołuje l lub lz0.

Więcej Pomocy Zobacz:

:h :map-expression 
+0

Nie wiedziałem o wyrażeniu na mapie, dziękuję! –