¿Puedo justificar texto en Vim?


38

La única razón por la que alguna vez edité un archivo de texto en Pico o Nano, y no en Vim fue su comando "Justificar" ^J. Volvería a formatear un párrafo de texto, creando saltos de línea en los saltos de palabra para que el texto flote bien en la pantalla de ancho fijo: formatee el texto para que se ajuste a 80 columnas predefinidas, creando saltos de línea solo entre palabras. Como la función era limitada, era muy útil, ya sea formatear largos bloques de comentarios, archivos de documentación o simplemente reemplazar una línea interminable de parámetros con algo más legible.

¿Puedo hacer algo así en Vim?

Respuestas:


37

Puede usar los operadores gqo gwcombinados con un comando de movimiento. Por defecto, usa el fmtprograma (en Linux) para formatear el texto dado. Sin embargo, que yo sepa, no justifica las líneas, por lo que obtendrá márgenes rectos irregulares.

La forma en que lo uso es gwip(modo normal) con el cursor en un párrafo. Esto formateará el párrafo actual manteniendo el cursor en la misma posición. Lo uso de esta manera para asegurarme de que solo se formatee el párrafo actual. Al editar un archivo de texto, la emisión gwG(modo normal) al comienzo del archivo formateará todo el texto. Como buena práctica, asegúrese de dejar al menos una línea en blanco entre los párrafos.

Hay mucha configuración que se puede hacer. Para empezar, aquí hay un poco de ayuda correspondiente: :h gq, :h gw, :h fo(opciones de formato), :h fp(formato de programa), :h fo-table(Una explicación de las posibles opciones).


1
gq / gw es definitivamente el camino a seguir. para agregar a este mensaje, puede cambiar el programa de formato a la par para tener más opciones. Checkout vimcasts.org/episodes/formatting-text-with-par
Bambu

3
Por defecto, Vim no usa ningún programa externo, aunque puede elegir usar uno configurando la 'formatprg'opción.
jamessan

15

Hay un gran VimCast sobre este tema.

http://vimcasts.org/episodes/formatting-text-with-par/

Básicamente, necesitas instalar par:

$ brew install par
# or
$ sudo apt-get install par

Y luego, ya que desea que las columnas se envuelvan en 80 columnas:

:set formatprg=par\ -w80

Ahora puedes usar el gq operador, como en otras respuestas (por ejemplo gqip), y usará Par en lugar del formateador incorporado de Vim.

Par es bastante avanzado, y formateará comentarios como este muy bien:

/* This is a long */
/* multiline comment */

11

De :help usr_25:

JUSTIFYING TEXT                                                                 

Vim has no built-in way of justifying text.  However, there is a neat macro     
package that does the job.  To use this package, execute the following          
command:                                                                        

        :runtime macros/justify.vim                                             

This Vim script file defines a new visual command "_j".  To justify a block of  
text, highlight the text in Visual mode and then execute "_j".

Entonces, todo lo que tienes que hacer es correr

:ru macros/justify.vim

y luego escribe

_j

para justificar el texto en todo el archivo.

(Por supuesto, también puede agregar ru macros/justify.vima su .vimrc para no tener que escribirlo todo el tiempo).

Nota : esto no agrega saltos de línea para usted. Tienes que agregarlos manualmente con gq. Para esto, también debe establecer el textwidth(valor predeterminado es 0) a su valor deseado a través de

set textwidth=80

y, si lo desea, ajuste automático de texto configurando t-flag mediante

set formatoptions+=t

Si lo desea, puede configurar una asignación en su .vimrc para que haga todo por usted:

nnoremap <C-j> gggqG_j

Esto se mueve al comienzo del archivo ( gg), ajusta todas las líneas ( gqhasta G) y luego _justifica el texto.


Para ver más de cerca el formato, consulte: MANUAL DEL USUARIO DE VIM - Edición de texto formateado
Suuuehgi

Acabo de encontrar la :set fo+=aopción muy útil para el reformateo automático de todo el párrafo. Echa un vistazo a :help fo-tableotras opciones. También hay un buen video tutorial aquí .
Suuuehgi

+1 para una solución completamente integrada. El _jmapeo agregado por la macro parece justificar todo el archivo para mí, o puede limitarse con una selección visual lineal.
ches

5

Mientras que la ayuda de nano llama al ^Jcomando "Justificar", en realidad no justifica el texto, reformatea el texto rompiendo las líneas antes del margen derecho de la pantalla (o en alguna columna configurable, supongo).

Puede hacer lo mismo en VIM configurando la variable textwidth, desde :help 'textwidth':

Ancho máximo de texto que se está insertando. Se romperá una línea más larga después del espacio en blanco para obtener este ancho. Un valor cero deshabilita esto.

Es decir: mientras escribe, si una línea es más larga que los textwidthcaracteres, VIM ajustará la línea en el primer espacio para mantener la longitud de la línea menor o igual a textwidth.

Para que esto funcione, la opción formatoptionsdebe contener la letra t. Consulte :help 'formatoptions'y :help fo-tablelas opciones disponibles, por ejemplo, puede interesarle la copción de hacer que el formato funcione con comentarios.

Editar : se puede realizar la misma operación, sin la necesidad de poner ten formatoptions, usando el comando gw{motion}, se formatea el texto entre la posición actual del cursor y la posición del cursor después {motion}. El gwcomando está disponible también en modo visual, formatea el texto seleccionado.


1
Eso es bueno para escribir. ¿Puedo aplicar eso para texto preexistente?
SF.

3

Aquí hay dos opciones fáciles:

  1. con un bloque de texto seleccionado, escriba !fmt
  2. con el cursor al comienzo de un bloque, escriba !}fmt

Ambos envían un bloque de texto a Unix fmt, vea las man fmtopciones. Puede pasar argumentos de opción desde vim. Por ejemplo, para formatear un bloque de 50 caracteres de ancho, escriba !}fmt -w 50.


perdón por eso, arreglado ahora
kaan

También puede formatear todo el archivo escribiendo :%!fmty deshaciendo con uno solo usi no le gusta el resultado.
Comodín

-1

Marque el texto usando el comando visual y luego use:

:!par 40j 

donde 40 es el ancho de la columna y jsignifica justificar.


2
¡Bienvenido a nuestro sitio! Su pregunta es de baja calidad actualmente porque carece de explicaciones sobre la herramienta que está utilizando ( par) y por qué funciona su solución. Es posible que desee agregar más detalles para mejorar la calidad de su respuesta y hacerla más útil para futuros lectores.
statox
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.