Hacer cálculos con el registro de expresión
Puede hacer cálculos tanto en modo normal como en modo inserción.
Modo normal
En modo normal, si escribe @=
su cursor se moverá a la línea de comando, donde puede ingresar cualquier expresión. Cuando presiona Intro, el resultado de la expresión se ejecutará como comandos de modo normal.
Por ejemplo, suponga que desea ir a la columna central de la línea actual. La llamada a la función col('$')
devuelve el número de columnas en la línea, por lo que podemos lograrlo escribiendo lo siguiente:
@=col('$')/2<CR>|
Cuando presiona enter, el cursor vuelve al búfer y vim espera a un operador (como |
) como si acabara de ingresar un número. Alternativamente, podría haber ingresado esto:
@=col('$')/2.'|'
... pero por supuesto eso es más bytes.
Modo de inserción
También puede usar el registro de expresión en modo de inserción presionando en <Ctrl-r>=
lugar de @=
. Funciona igual en modo normal, excepto que el resultado de la expresión que ingrese se ejecutará en modo de inserción. Por ejemplo, si escribiste<Ctrl-r>=col('$')<CR>
, el número de columnas en la línea actual se insertaría en el cursor como si lo hubiera escrito.
Para obtener más información sobre el registro de expresiones, escriba :help "=
.
Reutilizando expresiones
La última expresión que utilizó se almacena en el registro de la expresión, "=
. Escribir @=<CR>
en modo normal o <Ctrl-r>=<CR>
en modo de inserción evaluará la expresión nuevamente, permitiéndole usarlos de manera muy parecida a las macros.
Hacer cálculos en sustituciones
También puede evaluar expresiones al hacer sustituciones de expresiones regulares. Todo lo que tiene que hacer es comenzar su sustitución con \=
. Por ejemplo, suponga que desea numerar las líneas en este archivo:
foo
bar
baz
La llamada a la función line('.')
devuelve el número de línea actual, por lo que el trabajo es fácil. Ingresando esto:
:s/^/\=line('.').' '/g<CR>
... produce el resultado deseado:
1 foo
2 bar
3 baz
Para usar grupos capturados en tal expresión, puede usar la submatch()
función, donde, por ejemplo, submatch(0)
es equivalente a \0
una sustitución ordinaria, submatch(1)
es equivalente a \1
, etc. Esto, desafortunadamente, consume muchas teclas.
Para obtener más información sobre la sustitución de expresiones, escriba :help sub-replace-expression
.