visual-mode – Columna de cursor en la selección visual

Pregunta:

¿Cuál es la forma correcta de obtener la columna del cursor después de realizar una selección visual?

Como ejemplo simple, considere el siguiente comando. Se necesita un rango y estoy tratando de obtener la columna para eventualmente pasar ambos a un filtro:

command! -range CursorColumn echo col('.')

y este búfer:

abc
def
ghi

Si el cursor está en c se inicia una selección visual en línea y se extiende hacia abajo hasta la tercera línea, el cursor está en i . Al cambiar al modo de línea de comandos y ejecutar el comando anterior, se emite 1 . Si la selección se inicia en i extiende hacia arriba c , entonces el comando echos 3 , que esperaría en ambos casos.

¿Cómo obtengo la columna del cursor independientemente de cómo se hizo la selección?

Mi caso de uso es que quiero pasar las líneas seleccionadas a un filtro. Al mismo tiempo, me gustaría pasar la columna en la que estaba el cursor como argumento:

command! -range MyFilter exe <line1>.",".<line2>."!myfilter ".col('.')

Editar: Hacer la selección en modo visual , en lugar de linewise-visual , muestra el comportamiento que quiero: obtengo la columna en la que estaba el cursor cuando ejecuto el comando sin importar cómo hice la selección.

Respuesta:

¿Cómo obtengo la columna del cursor independientemente de cómo se hizo la selección?

Dejémoslo claro: en este punto ya estás en el modo normal . Todo lo que puede obtener es el rango de selección, no la posición del cursor en el momento en que se realizó. Y entonces col('.') Devuelve correctamente la posición actual del cursor , no la anterior.

Su confusión se basa en una suposición incorrecta de que la posición del cursor se conserva en dicha transición del modo visual al normal. Eso no es cierto. Los médicos nunca dicen que Vim debería hacer esto. Y, de hecho, Vim normalmente mueve el cursor a la esquina superior de la selección antes de ejecutar un comando. Pero no siempre, en particular, mientras en el modo Visual-Line usando solo k y l para extender la selección, el cursor permanece en su lugar (las verdaderas condiciones pueden ser más complicadas, por supuesto).

Sin embargo, el punto es que tales cosas no están documentadas y deben verse como una especie de "comportamiento indefinido". No debe hacer ningún uso de él, especialmente en el modo linewise donde la columna del cursor debe ser totalmente irrelevante.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım