2015-05-22 12 views
5

Ogni volta che sfoglio il codice piegato su vim e preme il tasto l, desidero che apra quella piega in modo ricorsivo. Per quello ho fatto quanto segue: nmap l lzO. Che ha funzionato bene, a parte il fatto di ottenere uno E490: No fold found ogni volta che premere l non in una piega. Ho usato quella scusa per conoscere Vimscript e scrivere una funzione per questo ed evitare l'errore.Chiamare le chiavi hjkl dalla riga di comando di vim

Ora, mi manca la parte di come è possibile chiamare un comando vim come l o lzO all'interno di una funzione?

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

nmap l :call OpenFoldOrNot()<CR> 

risposta

3

Prova il comando normal. Per questo caso è necessario normal! per evitare l'esecuzione ricorsiva della propria funzione.

3

Si potrebbe provare quanto segue, utilizzando il comando normal (la mia vimscript è molto arrugginito):

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

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

Non v'è alcuna necessità di 'execute', a meno che non si intende utilizzare il formato stampabile di alcuni caratteri speciali come' ' o' '. – mMontu

+0

Ah sì, hai ragione. Come ho detto, il mio vimscript è molto arrugginito;) –

2

In alternativa è possibile utilizzare una mappa-espressione per fare questo tipo di lavoro più facile.

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

In una mappa espressione destra, {rhs}, della mappatura è un'espressione VimScript. Questo viene valutato per ottenere cosa eseguire. Nel tuo caso viene utilizzato per determinare se la mappatura chiama l o lz0.

Per maggiori spiegazioni, vedi:

:h :map-expression 
+0

Non sapevo dell'espressione della mappa, grazie! –