2012-04-09 17 views
6

¿Cuál es la mejor manera de verificar en un vimscript qué modo visual está actualmente activo (bloque visual o visual)?Verificar el modo Visual

He leído sobre mode() pero no puedo hacerlo funcionar.
echo mode() no funciona para mí
if mode() == "v" no funciona para mí también.

+0

¿Qué desea hacer si el modo de bloque visual está activo? –

+0

'@Pavan, si el modo de bloque visual está activo, quiero calcular el inicio y el final del bloque (línea + columnas). Si el modo visual está activo, quiero calcular solo la línea de inicio y final de la selección visual, pero no las columnas. – Reman

+0

Comprobar ': help visualmode()'. – Raimondi

Respuesta

5

Mira la ayuda para mode(). La parte pertinente:

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

Se debería evaluar mode() == "\<C-V>" (literal ^V carácter), no mode() == "v", para comprobar si el modo visual en forma de bloques.

+0

Sí, lo sé, pero puedo no hagas que funcione No reconoce un bloque visual. ¿Cuál sería el código de línea de comando echo? – Reman

+0

¿Qué quiere decir con no poder hacer que funcione? ¿Cómo estás tratando de desencadenarlo? –

+0

'@Chris, así: 'if mode() ==" CTRL-V "| echo "bloque" | else | "echo no block" | endif' - No funciona tan bien en la línea de comando. – Reman

1

@Remonn ya lo dije en los comentarios, pero no estaba muy claro para mí. Así es como me las arreglé para ver los resultados:

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

entro en diferentes modos visuales y luego pulsa para ver F9.

Necesito un lanzamiento porque la línea -- VISUAL -- cubre cualquier mensaje de eco. ¿Alguien puede hacer eco en el modo VISUAL?

En general, creo que lo mejor que puede hacer cuando se necesitaría mode() es hacer dos aplicaciones diferentes, y luego o bien dos funciones diferentes que hacen cosas completamente diferentes:

function! Fnorm() 
endfunction 

function! Fvis() 
endfunction 

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

o una sola función y dar diferentes parámetros a ella en función de la asignación:

function! F(param) 
endfunction 

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

Otro truco relacionado es qué hacer si quieres hacer algo mientras está en modo visual, como mover el cursor. Lo mejor que puedo hacer es:

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

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

Recuerde que para hacer el mapeo en modo visual, usa 'v [no] remap' en lugar de' n [no] remap', y usted no quiero el '' allí si la selección es importante. Así que sus asignaciones se verían más como 'nnoremap : llame a Fnormal() ' y 'vnoremap : llame a Fvisual() '. cómo terminé aquí pero me di cuenta de este punto después de llegar aquí, defino mi función como 'función! F() rango' y luego hago' nnoremap : F() 'y' vnoremap : '<,'> F() '. –

Cuestiones relacionadas