Una manera fácil de alinear el texto en columnas es utilizar Tabular o Align plugin. Si ninguno de estos está listo, se pueden usar los siguientes comandos un tanto complicados (y un poco engorrosos) pero perfectamente operativos (para el caso en cuestión). 1,2
:let m=0|g/\ze -- /let m=max([m,searchpos(@/,'c')[1]])
:%s//\=repeat(' ',m-col('.'))
El propósito de la primera comando es para determinar el ancho de la columna para la izquierda del separador (que supongo que ser --
aquí). El ancho es calculado como un máximo de las longitudes del texto en la primera columna entre todas las líneas. El comando :global
se usa para enumerar las líneas que contienen el separador (las otras líneas no requieren alineación). El átomo \ze
ubicado justo después del comienzo del patrón, establece el final de la coincidencia en la misma posición donde se inicia (consulte :help \ze
). Cambiar los bordes de la coincidencia no afecta la forma en que funciona el comando :global
, el patrón está escrito de tal manera que coincida con las necesidades del siguiente comando de sustitución : dado que estos dos comandos podrían compartir el mismo patrón, ser omitido en el segundo.
El comando que se ejecuta en las líneas coincidentes,
:let m=max([m,searchpos(@/,'c')[1]])
llama a la función searchpos()
para buscar el patrón utilizado en la matriz :global
comando, y para obtener la posición de la columna del partido. El patrón se conoce como @/
utilizando el último registro de patrón de búsqueda (consulte :help "/
). Esto aprovecha el hecho de que el comando :global
actualiza el registro /
tan pronto como comienza a ejecutarse. La bandera c
pasado como el segundo argumento en la llamada searchpos()
permite que el partido en el primer carácter de una línea (:global
posiciones del cursor en el comienzo mismo de la línea para ejecutar un comando en), ya que podría ser que hay no hay texto a la izquierda del separador. La función searchpos()
devuelve una lista, el primer elemento es el número de línea de la posición coincidente, y el segundo es la posición de la columna.Si el comando se ejecuta en una línea, la línea coincide con el patrón del comando :global
que lo contiene. Como searchpos()
es para buscar el mismo patrón, definitivamente hay una coincidencia en esa línea. Por lo tanto, solo la columna que inicia la coincidencia está interesada, por lo que se obtiene extraído de la lista de devolución por el subíndice [1]
. Esta misma posición es igual al ancho del texto en la primera columna de la línea, más uno. Por lo tanto, m
se establece al máximo de su valor actual y esa posición de columna.
El segundo comando,
:%s//\=repeat(' ',m-col('.'))
almohadillas de la primera ocurrencia del separador en todas las líneas que contienen que, con el número de espacios que falta para que el texto antes del separador para tomar m
caracteres, menos uno. Este comando es un sustitución global de la sustitución de un intervalo vacío justo antes de que el separador (ver el comentario sobre el comando :global
arriba) con el resultado de la evaluación de la expresión (ver :help sub-replace-\=
)
repeat(' ',m-col('.'))
Los repeat()
repeticiones de funciones su primer argumento (como cadena) el número de veces dado en el segundo argumento. Como en cada sustitución el cursor es movido al inicio de la coincidencia de patrón, m-col('.')
es exactamente igual al cantidad de espacios necesarios para desplazar el separador a la derecha para alinear las columnas (col('.')
devuelve la posición actual de la columna del cursor).
continuación es una versión de una línea de este par de comandos.
:let m=0|exe'g/\ze -- /let m=max([m,searchpos(@/,"c")[1]])'|%s//\=repeat(' ',m-col('.'))
En revisiones anteriores de la respuesta de los comandos usados para ser tan sigue.
:let p=[0]|%s/^\ze\(.*\) -- /\=map(p,'max([v:val,len(submatch(1))+1])')[1:0]/
:exe'%s/\ze\%<'.p[0].'c -- /\=repeat(" ",'.p[0].'-col("."))'
Aquellos que estén interesados en estos comandos particulares pueden encontrar Descripción detallada en la historia de las ediciones.
posible duplicado de [¿Cómo insertar espacios hasta la columna X para alinear elementos en columnas?] (Http://stackoverflow.com/questions/6154306/how-to-insert-spaces-up-to-column- x-to-line-up-things-in-columns) – DocMax