reenviar automáticamente las líneas al escribir rebajas en VIM


10

Muy a menudo, escribo rebajas en VIM, y habrá párrafos en esas rebajas. Para ayudar a mi edición, configuré mi Vim para ajustar una línea en 80 caracteres. Funciona bien si sigo escribiendo, pero el problema es que si necesito hacer alguna corrección, se vuelve muy molesto.

demostración (tomada de la lógica de primer orden de Wikipedia):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

Hasta aquí todo bien. Pero cuando reviso el artículo, podría decidir agregar algo en el medio, por ejemplo:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

la línea de aviso 3 es la que quiero ajustar. Si lo hago en VIM, necesitaré unir manualmente las líneas y volver a envolver todo el párrafo.

¿Alguien tiene idea de cómo hacer que VIM lo haga automáticamente?

Respuestas:


6

Aún más simple: el aindicador para 'formatoptions'permite el formateo automático de párrafos cada vez que se inserta o elimina texto. Ver :help fo-tablepara más detalles sobre 'formatoptions'banderas y :help autoformat.

:set formatoptions+=a

gqy gwformateará las líneas sobre las que se mueve el siguiente movimiento.

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

La diferencia entre los dos, es que gqdejará el cursor en el primer no en blanco de la última línea formateada. gwvolverá a colocar el cursor donde comenzó.

Puede reenviar fácilmente el párrafo en el que se encuentra actualmente su cursor gwap, o el documento completo gggwG, aunque eso moverá su cursor gracias al inicio gg.

Con un comando automático, puede hacer que el formateo se realice automáticamente. Aquí hay un ejemplo que formatea el párrafo actual al salir del modo de inserción:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

Hay otros desencadenantes de autocomando que puede encontrar que funcionan mejor para usted. Puede explorar las opciones a continuación :help autocmd-events. Los más relevantes están probablemente bajo el subtítulo "varios".


una palabra: genial!
Jason Hu

1

Me gustaría echar un vistazo :help 'textwidth'. Romperá automáticamente las líneas a medida que escribe. Sin embargo, esto no funciona si está editando la mitad de una línea.

Personalmente prefiero dejarlo textwidth, así que creé una función que se unirá automáticamente y dividirá un párrafo. (Básicamente lo formatea automáticamente a 80 caracteres) Se ve así:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

Luego tengo un mapeo para llamarlo cuando lo necesito:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

¡Esta función también funciona muy bien formatoptions+=jrpara formatear comentarios en código! Simplemente coloque el cursor en la primera línea que tenga más de 80 caracteres y llame a la función.

(Nota: no he hecho que esta función sea general para hacer longitudes que no sean 80, pero creo que solo necesita cambiar los 80 y 81 si desea que sea otra cosa)

Ver :help 'textwidth'y :help 'formatoptions'para más información.


Gracias por compartir. Cuando reviso su configuración, no se formatea automáticamente mientras escribo, ¿correcto? Si es así, entonces sigue siendo una solución subóptima, ¿no?
Jason Hu

textwidthse formateará automáticamente a medida que escribe. Mi función no lo hará. Prefiero controlar cuándo vim envuelve las cosas, por lo que funciona para mí. Pero si está buscando específicamente un formateador a medida que escribe, sí; no se ajusta a tu flujo de trabajo.
Tumbler41

1

En aras de la exhaustividad, me gustaría mencionar la opción basada en complementos.

Si usa algo como ALE que admite ejecutar sus memorias intermedias a través de un embellecedor al guardar, puede dejar que Prettier se encargue de volver a envolver su código.

Lo logré poniendo esto en ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... y poniendo esto en ~/.vimrc:

let g:ale_fix_on_save = 1
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.