comando vim para reestructurar / forzar texto a 80 columnas

240

Sé que hay formas de configurar automáticamente el ancho de texto en vim usando set textwidth(como las preocupaciones de diseño de columna Vim 80 ). Lo que estoy buscando es algo similar a =(el comando de línea de sangría) pero para ajustar a 80. El caso de uso es a veces editar texto con ancho de texto y después de unir líneas o eliminar / agregar texto sale mal envuelto.

Idealmente, este comando reorganizaría por completo las líneas que selecciono y cortaría las líneas largas mientras las agrego a las cortas. Un ejemplo:

long line is long!  
short

Después de ejecutar el comando (suponiendo que el ajuste era de 13 cols):

long line is  
long! short

Si esto no es posible con un verdadero comando vim, ¿tal vez haya un programa de línea de comandos que haga esto al que pueda canalizar la entrada?

Después de buscar, encontré esta referencia que tiene algunas opciones más: http://www.cs.swarthmore.edu/help/vim/reformatting.html

pollo malvado
fuente
99
También puede interesarle saber que Vim puede delegar el formato de texto a un programa externo, como el par . Hice un screencast que demuestra cómo formatear texto con par .
nelstrom
@nelstrom gracias, TIL sobre par. ¡Es fantástico!
Steven Lu
2
Cuando desea que el texto se vea delgada y recortar (? Bien cortado), siempre pensar en gq- Trimestral de caballero . (Disculpas por antropomorfizar al hombre, pero el mnemotécnico funciona.)
ruffin

Respuestas:

372

Establezca textwidthen 80 ( :set textwidth=80), vaya al inicio del archivo (se puede hacer con Ctrl- Homeo gg) y escriba gqG.

gqGformatea el texto comenzando desde la posición actual y hasta el final del archivo. Se unirá automáticamente a líneas consecutivas cuando sea posible. Puede colocar una línea en blanco entre dos líneas si no desea que esas dos se unan.

Michael Madsen
fuente
14
Y también funciona con selecciones visuales. Es decir, algo así como: V}gq. De esta manera, verá lo que va a formatear antes de formatearlo.
Plouff
66
Por cierto, ¿qué hace exactamente qpor sí mismo?
Richard-Degenne
1
¿Hay alguna manera de hacer esto con líneas que son solo una larga cadena de caracteres, sin espacios? EDITAR: He descubierto la utilidad "fold". Todavía me pregunto acerca de hacer esto en vi.
Donald Smith
77
usar en set tw=80lugar de set textwidth=80ahorrar tiempo
Yibo Yang
44
@dmranck Después de que set textwidth=76sus líneas se ajusten automáticamente mientras escribe. Mi queja es que no hace nada a las líneas existentes que se están editando. Pero V}gqes extremadamente útil en ese sentido. Vingresa al modo de selección visual, }selecciona hasta el siguiente salto de párrafo y gqejecuta el formateador actual en él (o se usa gwpara llamar explícitamente al formateador vi). Además, {seleccionará hacia arriba. Puede seleccionar todo el documento y el formato, ggVGgqaunque tal vez haya una manera más fácil. Guarde eso como una macro usando @para hacerlo más fácil. Se usa vipgqpara establecer el párrafo actual.
ktbiz
94

La solución de Michael es la clave, pero a menudo encuentro que quiero reformatear el resto del párrafo actual; para este comportamiento, use gq}.

Alex Hirzel
fuente
17
expandiendo esto, puede usar gq <motion> para formatear lo que quiera.
Dan Schnau
1
Además, la opción 'nojoinspaces' que evita que aparezcan dos espacios después de períodos cuando las líneas se unen en un límite de oración. Bueno cuando tu estilo tipográfico es espacios individuales entre oraciones en inglés.
Alex Hirzel
36

Se puede usar gqcon cualquier operador de movimiento. Por ejemplo, si solo desea volver a formatear al final de la línea actual (es decir, para ajustar la línea en la que está el cursor) puede usargq$

También puede volver a formatear seleccionando texto en modo visual (usando `v y moviéndose) y luego escribiendo gq.

También hay otras opciones para forzar el ajuste de líneas.

Si desea que vim ajuste sus líneas mientras inserta texto en ellas en lugar de tener que esperar hasta el final para reestructurar el texto, encontrará útiles estas opciones:

:set textwidth=80
:set wrapmargin=2

(No se desvía por wrapy linebreak, que solo formatea el texto que se muestra en la pantalla y no cambia el texto en el búfer)

JohnGH
fuente
99
De la wrapmarginayuda: cuando 'textwidth' no es cero, esta opción no se usa.
mmoya
21

Gracias a un comentario de DonaldSmith, encontré esto, ya que la textwidthopción no formateó mi larga línea de texto (estaba convirtiendo el juego con conversiones de hexadecimal a byte):

:%!fold -w 60

Eso reformuló todo el archivo (que era una línea para mí) en líneas de longitud 60.

shearn89
fuente
1
Esto esta muy bien. Todas las respuestas se centran en limitar el ancho de una línea cuando una línea se divide espacios en palabras. Esta solución funciona para palabras muy largas (secuencias de ADN).
pedrosaurio
1
Para las URL largas, esto es lo único que he encontrado que funciona. Ya soy nuevo sobre el ancho de texto, pero no romperá cadenas ininterrumpidas (lo que generalmente es algo bueno)
SkyLeach
13

Si está buscando una forma que no sea Vim , siempre están los comandos UNIX fmt y par .

Notas:

  • No puedo comentar sobre Unicode, puede o no comportarse de manera diferente.
  • @nelstrom ya ha mencionado el uso paren su webcast.

Así es como usaríamos ambos para su ejemplo.

$ echo -e 'long line is long!\nshort' > 3033423.txt
$ cat 3033423.txt
long line is long!
short
$ fmt -w 13 3033423.txt
long line is
long!  short
$ par 13gr 3033423.txt
long line is
long! short

Para usar desde el interior de Vim:

:%! fmt -w 13
:%! par 13gr

También puede establecer :formatprgpar o fmt y anular gq. Para más información, llame :help formatprgdentro de Vim.

Ehtesh Choudhury
fuente
9

Casi siempre lo uso gqen modo visual. Les digo a mis alumnos que significa "Gentlemens 'Quarterly", una revista para gente fastidiosa.

ncmathsadist
fuente