Configuração específica da largura do texto do número da linha

9

Eu uso o gvim para escrever e-mails e tw=72para quebrar longas filas. Agora eu também edito cabeçalhos básicos de correio no mesmo documento, por exemplo, estou adicionando destinatários ao meu correio. Agora com tw=72ele também quebra todas as vezes após 72 caracteres.

Como definir tw=0nas 4 primeiras linhas (que é a parte do cabeçalho) e tw=72no restante do documento?

Minhas formações são assim, se isso for relevante:

set fo+=tcqn
mxmehl
fonte
textwidthé aplicado a todo o buffer.
romainl
3
Veja também: Impedir que o Vim interrompa os links no meio da tag na remarcação . Você pode usar uma solução semelhante para e-mails, quer verificando se line('.') < 5, ou verificando se a linha começa com um cabeçalho de e-mail (por exemplo From: , To: , etc.).
Martin Tournoij 12/08/16
@Carpetsmoker Muito obrigado, essa foi a chave da solução. Eu adicionei minha resposta completa com as modificações necessárias.
Mxmehl

Respostas:

6

Graças ao comentário do @ Carpetsmoker na minha pergunta, consegui resolver isso exatamente como queria.

Com a seguinte função em .vimrc (ou no meu caso em um arquivo especial que só foi carregado ao editar meus e-mails), tw é definido como 500 se o número da linha for menor que 5, caso contrário, é 72. Com au CursorMovedIisso é verificado sempre que o cursor se move.

" 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

Se alguém planeja implementar isso, considere substituir o curinga au CursorMovedI *por um caminho fixo ou sufixo de arquivo.

mxmehl
fonte
4

Uma alternativa mais robusta à resposta de mxmehl.

Se você usa o filetype=mailVim, os cabeçalhos serão destacados para você:

insira a descrição da imagem aqui

Podemos usar as informações de sintaxe para determinar se uma linha é um cabeçalho e definir a largura do texto de acordo.

O nome sintaxe dos cabeçalhos são mailHeaderKey, mailSubject, mailHeaderEmail, e mailHeader. Eu descobri isso olhando /usr/share/vim/vim74/syntax/mail.vim.

A razão de eu preferir essa solução é que ela não depende de números de linha arbitrários, mas funciona igualmente corretamente para emails com um cabeçalho e vinte cabeçalhos.

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
fonte
2

Você pode conseguir isso usando autocmds. Você pode incluí-los no seu vimrc, mas geralmente é melhor incluí-los em um tipo de arquivo, conforme explicado aqui .

Então você pode usar o seguinte:

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

Se você preferir usá-lo sem um plug-in de tipo de arquivo, será necessário substituí-lo <buffer>por um padrão de arquivo.

A idéia é alterar 'textwidth'quando você entra no modo de inserção e restaurá-lo quando sair.

Se você costuma navegar no texto enquanto está no modo de inserção (por exemplo: usando as teclas de seta), pode aprimorá-lo com base no link mencionado por @Carpetsmoke: Impedir que o Vim interrompa os links no meio da tag na marcação.

mMontu
fonte
0

Eu não acredito que isso seja possível. No entanto, existem algumas soluções alternativas.

  1. Você pode escrever seu cabeçalho e depois :set tw=72 . Como twnão se aplica retroativamente ao texto que já está no seu buffer,

  2. Você pode digitar a coisa toda :set tw=0e, quando terminar, vá para a linha 4 :set tw=72, e gqG. Ou, se você não quiser fazer isso manualmente, poderá macro ou mapeá-lo. Por exemplo, ambos funcionariam:

    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 "reformatar")

    Você pode até configurar isso para acontecer automaticamente quando você fechar o vim, supondo que você queira que seja reformatado ao fechar o vim, e que exista um tipo de arquivo que você use apenas para e-mails. Por exemplo, se todos os seus e-mails tiverem a .emailextensão, você poderá:

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

    Claro, você teria que mudar *.emailpara qualquer extensão de arquivo que realmente usar. Se você usar algo como .txt, eu não recomendaria isso, pois ele mexerá com todos os .txt arquivos que você possui.

James
fonte