
Los comandos en VIM pueden tener como prefijo números, pero el esquema de numeración no es consistente para algunas operaciones.
Si antepone un número a los comandos de movimiento hacia la izquierda, abajo, arriba y hacia la derecha (H, J, K, L), el cursor saltará a la ubicación esperada; por ejemplo, 1L
se moverá un carácter hacia la derecha.
La línea actual se puede mover hacia arriba o hacia abajo usando :m+N
o :m-N
, sin embargo, debes usar :m-2
para obtener el efecto opuesto a :m+1
.
También estoy usando VSVim en Visual Studio 2019 y estoy usando los comandos gt
y gT
para cambiar entre pestañas. Si tengo tres pestañas abiertas y actualmente estoy en la primera pestaña (la más a la izquierda), 3gt
cambiaré a la tercera pestaña. Si estoy en la tercera pestaña (la más a la derecha), 2gT
volveré a la primera pestaña y 3gT
el resultado será permanecer en la misma pestaña.
¿Por qué hay que utilizar números diferentes para lograr efectos opuestos? ¿Es posible que se trate de un defecto de diseño que nunca se modificó?
Respuesta1
Su observación de que existen inconsistencias es precisa.
Si bien {count}
se usa con mayor frecuencia para repetir una acción, no siempre es así. A veces se toma como un número absoluto, por ejemplo, 47G
para ir a la línea 47, 35|
para ir a la columna 35 en la línea actual o 90%
para ir a una línea del 90% del archivo.
A veces, simplemente se usa para marcar diferentes versiones del mismo comando. Por ejemplo, CTRL-G
imprimirá información sobre el archivo abierto en el búfer actual. 1 CTRL-G
imprimirá esa información, pero mostrará la ruta completa al archivo. 2 CTRL-G
(o cualquier número de recuento mayor) imprimirá lo mismo y también incluirá el número del búfer en la salida. (Ver:help CTRL-G
para detalles.)
Abordando sus ejemplos específicos:
Si antepone un número a los comandos de movimiento hacia la izquierda, abajo, arriba y hacia la derecha (
hjkl
), el cursor saltará a la ubicación esperada; por ejemplo,1l
se moverá un carácter hacia la derecha.
Este es el uso típico de {count}
, como repetición del comando.
La línea actual se puede mover hacia arriba o hacia abajo usando
:m +N
o:m -N
, sin embargo, debes usar:m -2
para obtener el efecto opuesto a:m +1
.
Primero, esto no es realmente un {count}
, sino un {address}
. Este es realmente consistente (incluso si puede parecer extraño a primera vista). El :m
comando moverá la línea actualabajola línea especificada por la dirección.
Si está en la línea 47, debería :m 48
moverla debajo de la siguiente línea. Dado que la línea actual se movió, la que solía ser 48 ahora es 47 y la línea actual es 48. Si ahora desea volver a la ubicación original, necesita :m 46
, ya que vaabajola línea con la dirección. +1
es simplemente un atajo para 48 (comenzando en la línea 47) y -2
es solo una abreviatura de 46 (aunque ahora está en la línea 48). Tiene sentido, ¿verdad?
Si Vim hubiera decidido mover la líneaarribala dirección, si la dirección la precede, entonces el comportamiento de un comando como el que :m 46
dependería de si la línea actual estaba encima o debajo de ella y eso no sería genial. Entonces Vim decidió que la coherencia en este factor era más importante.
Estoy usando los comandos gt y gT para cambiar entre pestañas. Si tengo tres pestañas abiertas y actualmente estoy en la primera pestaña (la más a la izquierda), usar 3gt cambiará a la tercera pestaña. Si estoy en la tercera pestaña (la más a la derecha), entonces 2gT volverá a la primera pestaña, mientras que 3gT permanecerá en la misma pestaña.
Sí, esto es realmente inconsistente, pero hay una razón para ello.
Al implementar pestañas, los autores de Vim decidieron que era más importante tener una forma rápida de cambiar a la pestaña "N" en lugar de omitir pestañas "N". Es raro que necesites hacer esto último. Entonces decidieron usar {count}
como número de pestaña absoluto para el gt
comando.
Por otro lado, no hay mucha necesidad de que el gT
comando implemente elmismocomportamiento (ya tenía una pulsación de tecla más fácil para eso), por lo que el significado repetido de {count}
se dejó allí, por lo que si alguien quisiera omitir "N" pestañas, ese comando podría ayudar...
Tenga en cuenta que, de esta manera, es posible tener los tres comandos (pestaña siguiente, pestaña anterior, ir a la pestaña "N") tomando solo dos comandos, gt
y gT
tener menos comandos es algo importante, ya que Vim ya tiene demasiados. ¡Para que los recordemos!