Situación n.º 1: Acabo de seleccionar un bloque de texto. Luego escribo ": Comando", que invoca alguna función.Comprueba si hay una selección visual activa actual en Vim desde una función invocada por un comando
Situación n.º 2: No hay una selección visual actual (aunque es posible que haya hecho una selección de este tipo previamente en la sesión de edición). Escribo ": Comando", que invoca (la misma) función.
¿Existe alguna forma (robusta) de distinguir las dos situaciones anteriores de la función? Intenté mode()
, pero el problema es que en ambos casos estoy en modo comando, aunque en el primer caso ingresé al modo de comando desde el modo visual mientras que en el segundo estaba en el modo normal. Tal vez a través de la inspección de a:firstline
/a:lastline
/v:count
?
actualización - Caso de Uso ejemplo: ":Sum
". Si hay una selección visual actual, por ejemplo, una columna de números (selección de bloque) o un rango de líneas que contienen solo números, este comando hará eco de la suma de los números. De lo contrario, espera una lista de números separados por espacios como argumentos, y hará eco de la suma de esos números. Marco básico:
command! -nargs="*" -range Sum :call CalcSum(<f-args>)
function! CalcSum(...) range
" 1. collect numbers from visual selection if there is a current active selection
" 2. otherwise, if len(args) > 0, collect numbers from args
" 3. other cases (i.e., no selection and no args or both selection and args) handled reasonably
" 4. sum collection of numbers
" 5. return/echo result
endfunction
Los pasos (2) - (5) son sencillos. Estoy teniendo problemas con (1). Utilizo los marcadores "<"/"
>" para recrear los números de una selección visual. Pero solo quiero hacer esto si hay una selección visual actualmente resaltada/activa.
Tal vez toda mi lógica es incorrecta y hay una mejor manera de diseñar esta funcionalidad?
Gracias. Este parece el único enfoque posible. – Jeet