Configuración de ancho de texto específico del número de línea

9

Yo uso gvim para escribir correos electrónicos y uso tw=72para romper largas colas. Ahora también edito encabezados de correo básicos en el mismo documento, por ejemplo, estoy agregando destinatarios a mi correo. Ahora con tw=72él también se rompe cada vez después de 72 caracteres.

¿Cómo puedo configurar tw=0las primeras 4 líneas (esa es la parte del encabezado) y tw=72el resto del documento?

Mis formaciones se ven así, si eso es relevante:

set fo+=tcqn
mxmehl
fuente
textwidthse aplica a todo el búfer.
romainl
3
Ver también: Evitar que Vim rompa enlaces a mitad de etiqueta en el descuento . Se podría utilizar una solución similar para mensajes de correo electrónico, ya sea mediante la comprobación de si line('.') < 5, o comprobando si la línea comienza con un encabezado de correo electrónico (por ejemplo From: , To: , etc.).
Martin Tournoij
@Carpetsmoker Muchas gracias, esta fue la clave de la solución. Agregué mi respuesta completa con las modificaciones necesarias.
mxmehl

Respuestas:

6

Gracias al comentario de @ Carpetsmoker sobre mi pregunta, pude resolver esto exactamente como quería.

Con la siguiente función en .vimrc (o en mi caso en un archivo especial que solo se carga al editar mis correos electrónicos), tw se establece en 500 si el número de línea es menor que 5, de lo contrario es 72. Con au CursorMovedIesto se verifica cada vez que el cursor se mueve.

" Set tw to 500 if in the first 4 lines, else 500
au CursorMovedI * call ModifyTextWidth()   " execute when cursor has moved, use for all files
function! ModifyTextWidth()
    if line('.') < 5               " if line number smaller than 5
        setlocal textwidth=500     " use high tw setting
    else
        setlocal textwidth=72      " Otherwise use normal textwidth
    endif
endfunction

Si alguien planea implementar esto, considere reemplazar el comodín au CursorMovedI *con una ruta fija o sufijo de archivo.

mxmehl
fuente
4

Una alternativa más robusta a la respuesta de mxmehl.

Si usa filetype=mailVim, resaltará los encabezados por usted:

ingrese la descripción de la imagen aquí

Podemos usar la información de sintaxis para determinar si una línea es un encabezado y establecer el ancho de texto en consecuencia.

El nombre de la sintaxis de las cabeceras son mailHeaderKey, mailSubject, mailHeaderEmail, y mailHeader. Descubrí esto mirando /usr/share/vim/vim74/syntax/mail.vim.

La razón por la que prefiero esta solución es que no depende de números de línea arbitrarios, sino que funciona igualmente correcto para correos electrónicos con un encabezado y veinte encabezados.

augroup filetypes
    autocmd!

    autocmd FileType mail call s:mail()
augroup end

" Set up ft=mail
fun! s:mail()
    augroup ft_mail
        autocmd!
        autocmd CursorMoved,CursorMovedI *
            \  if index(["mailHeaderKey", "mailSubject", "mailHeaderEmail", "mailHeader"], synIDattr(synID(line('.'), col('.'), 1), 'name')) >= 0
            \|     setlocal textwidth=500
            \| else
            \|     setlocal textwidth=72
            \| endif
    augroup end
endfun
Martin Tournoij
fuente
2

Puede lograr esto usando autocmds. Puede incluirlos en su vimrc, pero generalmente es mejor incluirlos en un tipo de archivo, como se explica aquí .

Entonces podría usar lo siguiente:

augroup headerTw
   au!
   autocmd InsertEnter <buffer>
            \ if line('.') < 5 |
            \    setl tw=0 |
            \ endif
   autocmd InsertLeave <buffer>
            \ if line('.') < 5 |
            \    setl tw=72 |
            \ endif
augroup END

Si prefiere usarlo sin un complemento de tipo de archivo, deberá reemplazarlo <buffer>con un patrón de archivo.

La idea es cambiar el 'textwidth'cuando ingresas al modo de inserción y restaurarlo cuando lo dejas.

Si normalmente navega en el texto mientras está en modo de inserción (por ejemplo: usando las teclas de flecha), puede mejorarlo en función del enlace mencionado por @Carpetsmoke: evite que Vim rompa los enlaces a mitad de la etiqueta en el marcado.

mMontu
fuente
0

No creo que esto sea posible. Sin embargo, hay un par de soluciones.

  1. Podrías escribir tu encabezado y luego :set tw=72 . Como twno se aplica retroactivamente al texto que ya está en su búfer,

  2. Puede escribir todo con :set tw=0y luego, una vez que haya terminado, pasar a la línea 4 :set tw=72, y gqG. O, si no tiene ganas de hacerlo manualmente, puede macro o mapearlo. Por ejemplo, ambos funcionarían:

    let @r=":set tw=72<cr>4GgqG:set tw=0<cr>"
    nnoremap <silent> <leader>r :set tw=72<cr>4GgqG:set tw=0<cr>
    

    ("r" para "reformatear")

    Incluso podría configurar que esto suceda automáticamente cuando cierre vim, suponiendo que desea formatearlo cuando cierre vim, y que haya un tipo de archivo que use solo para correos electrónicos. Por ejemplo, si todos sus correos electrónicos tuvieran la .emailextensión, podría hacer lo siguiente:

    autocommand VimLeavePre *.email set tw=72 | exe "normal! 4GgqG" | w
    

    Por supuesto, tendría que cambiar *.emaila cualquier extensión de archivo que realmente use. Si utiliza algo así .txt, yo no recomiendo esto, ya que se hace un lío con todos los .txt archivos que tiene.

James
fuente