Quebra de linha no Vim (preservando recuo)

92

Eu estava lendo este post que descreve como embrulhar palavras inteiras no vim. A solução aceita foi esta:

:set formatoptions=l
:set lbr

O que leva este texto (as guias são mostradas como \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Isso realiza um comportamento como este (as guias são mostradas como \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

No entanto, gostaria de redefinir essa função. Eu gostaria que a linha quebrada tivesse o mesmo número de abas na frente dela que a linha acima tem mais um. Ie:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Alguma ideia?

sessenta pés cara
fonte
34
+1 pelo esforço feito para tornar a pergunta o mais clara possível.
Jeffrey Jose
Você deseja que o texto seja quebrado suavemente na borda da janela ou quebrado quando a linha atingir um determinado comprimento? Eu acho que você quer hard-wrapping (onde uma nova linha é inserida em seu texto após a palavra "will"), mas é difícil dizer a partir de seus exemplos.
Bill Odom
@Bill, estou mais interessado em softwrapping, mas uma solução de hardwrapping também seria aceitável.
sixtyfootersdude
1
A funcionalidade que você deseja não está embutida no Vim. Porém, há um patch que chega perto: groups.google.com/group/vim_dev/web/vim-patches (é # 15, "Recuar corretamente as linhas quebradas").
Bill Odom de
Relacionado: VimCasts teve um bom episódio sobre o uso de utilitários Unix externos para lidar com este problema: vimcasts.org/e/18
Damien Wilson

Respostas:

18

O patch breakindent tem o que você procura. Eu o apliquei com sucesso usando as instruções encontradas neste tópico:

Patch Vim com o patch breakindent no OS X com Homebrew

Especificamente, a fórmula Homebrew de echristopherson.

Eu sei que este tópico é antigo, mas é popular no google e me deparei com ele várias vezes ao tentar encontrar uma solução.

EDIT: Este patch agora está incluído no vim como patch 7.4.338. Veja: https://retracile.net/blog/2014/07/18/18.00

No Yosemite (Mac OS X), usei o comando snowbound com hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 
Saída 42
fonte
o patch parece não funcionar com o macvim mais recente no homebrew? @ Exit42 como você fez isso funcionar?
nevado em
nvm. Compilei o macvim com homebrew sangramento avançadobrew install macvim --with-features=huge --override-system-vim --HEAD
nevado
1
Veja minha resposta abaixo: stackoverflow.com/questions/2828174/… Não há necessidade de um patch nas versões mais recentes do vim.
JoshuaD,
26

Isso não funcionou quando a pergunta foi feita originalmente, mas a partir de 25 de junho de 2014, funcionará. (Supondo que você atualize seu vim para uma versão mais recente do que essa data)

Adicione ao seu .vimrc:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

E é isso!

-

Algumas pessoas (inclusive eu) compartilham um único .vimrc em vários computadores. Nesse caso, é importante que esta linha seja robusta (para evitar mensagens de erro irritantes). Isso é um pouco melhor:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

Dessa forma, se você estiver em uma versão anterior do vim, não receberá uma mensagem de erro.

JoshuaD
fonte
Curiosamente, isso funciona no vim 7.4 do meu cygwin, mas não no 7.4 vim do meu Ubuntu. Estou supondo que precisa ser um pouco mais difundido, mas verá a adoção universal em breve.
JoshuaD
1
Funciona no Vim 7.4 @ ArchLinux.
Andy Mikhaylenko
1
Você pode usar este teste:if has("patch-7.4.354")
Lawrence Kesteloot
Isso não responde à pergunta sobre a observação de OP: o mesmo número de guias (...) mais um . É muito importante na minha opinião também, você pode querer manter recuo adicional e deslocar opticamente os segmentos embalados para a direita (listagens bem organizadas, notas, etc.);
sangrento
8

O melhor que você vai conseguir é a showbreakopção que colocará uma corda fixa na frente de cada linha embrulhada (eu uso set showbreak=...).

muito php
fonte
@AlexanderBird De acordo com :help 'showbreak', não, você não pode - showbreaké apenas uma string.
Rory O'Kane
4

Eu concordo com a resposta que diz que 'showbreak' é a melhor opção. Showbreak normalmente não permite que você coloque caracteres não imprimíveis (por exemplo, espaços ou tabulações) na string showbreak, então, como normalmente usado, ele apenas fornecerá um indicador ao longo da margem esquerda, ou seja, nenhum recuo real. Isso não é ótimo, uma vez que o objetivo principal do OP, eu acho, é dar às linhas quebradas um recuo para evitar que amontoem a área da margem esquerda e pareçam linhas próprias.

Portanto, uma maneira de adicionar um recuo (feio) usando showbreak é usar vários caracteres, por exemplo, ": set showbreak => --------------->". Isso resulta em algo parecido com isto:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Uma alternativa melhor pode ser usar caracteres de espaço não separáveis ​​(supondo que sua instância do Vim esteja habilitada para unicode), cada um dos quais pode ser inserido na string showbreak usando a sequência de teclas ctrl-v, 160. Dessa forma, você pode inserir uma string showbreak que está em branco no lado esquerdo e parece ser um recuo verdadeiro. Por exemplo, ": set showbreak =.......... >>" onde cada '.' no comando é na verdade um caractere de espaço não separável inserido pressionando ctrl-V, 160. Dessa forma, você acaba com um envoltório que é bem recuado, como este:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Você ainda não tem a capacidade de variar o nível de recuo de acordo com o recuo da linha anterior, mas pelo menos obtém um recuo limpo das linhas quebradas sem muita confusão visual ao longo da margem esquerda da janela. Ainda pode haver confusão se o recuo de uma linha quebrada for menor do que o início de uma linha real, mas isso talvez possa ser evitado tornando o "recuo" do showbreak bastante grande (ou seja, maior do que qualquer recuo comumente encontrado em seu código ), mas ainda pequeno o suficiente para fornecer espaço suficiente para uma quebra automática de texto legível. Para muitos usos, acho que um recuo showbreak de 40 ou 50 espaços faria isso muito bem.

Herbert Sitz
fonte
7
Você pode colocar espaços em showbreak escapando-los: :set showbreak=\ \ \ \ . Ainda não funciona para guias, no entanto.
Bill Odom