2012-04-09 10 views
6

Qual è il modo migliore per verificare in un vimscript quale modalità visiva è attualmente attiva (blocco visivo o visivo)?Controllare la modalità visuale

Ho letto su mode() ma non riesco a farlo funzionare.
echo mode() non funziona per me
if mode() == "v" non funziona anche per me.

+0

Che cosa vuoi fare se la modalità di blocco visivo è attiva? –

+0

'@Pavan, se la modalità di blocco visivo è attiva, voglio calcolare l'inizio alla fine del blocco (riga + colonne). Se la modalità visiva è attiva, voglio calcolare solo la riga iniziale e finale della selezione visiva, ma non le colonne. – Reman

+0

Controlla ': aiuto visualmode()'. – Raimondi

risposta

5

Consultare la guida per mode(). La parte rilevante:

  v  Visual by character 
      V  Visual by line 
      CTRL-V Visual blockwise 

è necessario essere controllando mode() == "\<C-V>" (letterale ^V carattere), non mode() == "v", per verificare la modalità visiva a blocchi.

+0

Sì, lo so ma posso farlo funzionare. Non riconosce un blocco visivo. Quale sarebbe il codice della riga di comando echo? – Reman

+0

Cosa intendi per non essere in grado di farlo funzionare? Come stai cercando di attivarlo? –

+0

'@Chris, come questo: 'se mode() ==" CTRL-V "| echo "block" | altro | "echo no block" | endif' - Non funziona altrettanto bene nella riga di comando. – Reman

1

@Remonn l'ha già detto nei commenti, ma non era molto chiaro per me. Questo è come sono riuscito a vedere i risultati:

function! F() 
    normal! gv 
    throw mode() 
endfunction 
vnoremap <F9> <ESC>:call F()<CR> 

andare in diverse modalità visive e poi ha colpito F9 a vedere.

Ho bisogno di un lancio perché la riga -- VISUAL -- copre qualsiasi messaggio di eco. Qualcuno può echeggiare in modalità VISUAL?

In generale, penso che la cosa migliore da fare quando si avrebbe bisogno mode() è quello di fare due mappature differenti, e poi o due funzioni diverse che fanno cose completamente diverse:

function! Fnorm() 
endfunction 

function! Fvis() 
endfunction 

nnoremap <F9> :call Fnorm()<CR> 
nnoremap <F9> <ESC>:call Fvis()<CR>gv 

o una singola funzione e dare diversi parametri ad esso a seconda della mappatura:

function! F(param) 
endfunction 

nnoremap <F9> :call F(1)<CR> 
nnoremap <F9> <ESC>:call F(2)<CR>gv 

Un altro trucco correlato è che cosa fare se si vuole fare qualcosa mentre si è in modalità visiva, come spostare il cursore. Il meglio che posso fare è:

function! Fvis() 
    normal! gv 
    cursor(1, 1) 
endfunction 

nnoremap <F9> <ESC>:call Fvis()<CR>gv 
+0

Ricorda che per fare il mapping in modalità visuale, si usa 'v [no] rimappatura' invece di' n [no] rimappatura', e tu non voglio il '' se la selezione è importante, quindi i tuoi mapping sarebbero più simili a 'nnoremap : call Fnormal() ' e 'vnoremap : chiama Fvisual() '. Per le mie esigenze, e come sono finito qui ma ho capito questo punto dopo essere arrivato qui, definisco la mia funzione come 'funzione! F() range' e poi faccio' nnoremap : F() 'e' vnoremap : '<,'> F() '. –

Problemi correlati