Invólucro suave com 80 caracteres no Vim em janela de largura arbitrária


126

Quero usar o recurso de quebra automática de linha ( :set wrap) do Vim para quebrar algum código com 80 caracteres, independentemente da largura real da janela.

Ainda não consegui encontrar uma maneira de fazer isso - todo o invólucro macio parece amarrado à largura da janela

  • textwidthe wrapmarginsão ambos para quebra automática (eles inserem caracteres de nova linha no arquivo)
  • dividir verticalmente em várias janelas e usar :vertical resize 80(possivelmente com :set breakat=para permitir quebras em qualquer caractere) em uma delas meio que funciona (mesmo que seja um pouco tolo), mas é interrompido ao usar :set numbercomo os números de linha ocupam um número variável de colunas (dependendo no tamanho do arquivo) e fazem parte dos anos 80.

Existe alguma maneira de fazer isso no vim? Não parece promissor, de acordo com outras fontes .

No momento, minha aproximação é apenas ter /^.\{80}\zs.\+como minha pesquisa padrão, pelo menos é destacada. Pensei em adicionar um :syntaxitem para ele, mas ele quebrou quando se sobrepôs a outros itens de sintaxe, então deixei de lado essa ideia.


Na verdade, como você configurou uma pesquisa padrão?
Thethinman

Respostas:


37

Você poderia

  • defina uma largura mínima grande para a coluna de números de linha via :set numberwidth=6e
  • então você pode redimensionar sua janela com :set columns=86(ou com o mouse) para o tamanho adequado.

Se você editar um arquivo com um milhão de linhas, poderá ter problemas, mas isso é improvável. Você também está desperdiçando 6 colunas do espaço da tela. Portanto, ainda existem todos os tipos de problemas.

Você pode destacar a coluna 80 usando o :matchque diz aqui e aqui .

Além disso, não vejo como fazer isso. Parece que seria um bom recurso.


Infelizmente, o vim não mantém as colunas configuradas se a janela for redimensionada. Isso leva a uma situação infeliz com os gerenciadores de janelas lado a lado, onde não há uma boa maneira de quebrar suavemente para 80 colunas se a janela for muito larga.
gravitação

Isso funciona, mas não é pegajoso. Acho que o próximo passo é configurar um autocmd para manter as colunas no novo tamanho desejado para os tipos de arquivos que você deseja.
Xer0x 26/10/2015

1
Esta é a resposta certa, pois confirma que você não pode fazê-lo. E tenho certeza de que não sou o único que não quer redimensionar minha janela do terminal apenas por isso. Quero muito mais largura para usos que não sejam do vim.
Sridhar Sarnobat

20

Tente o seguinte:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

Você pode remover o if (&columns > 80) |se quiser sempre 80 colunas.


No meu terminal iTerm, isso diminui a janela. Não tenho certeza se isso é um problema no meu ambiente (vejo que você está fazendo algo com redimensionamento automático), mas, caso contrário, isso não é desejável. Obrigado pela sugestão embora.
Sridhar Sarnobat

O autocmd funcionou perfeitamente para mim (usando o terminal guake).
Mzcarlos #

Funciona como um encanto com o Tmux + NeoVim no Alacritty.
meh

16

Não tenho uma solução para o envoltório flexível, mas quanto à marcação de uma coluna, a partir do Vim 7.3 (lançado em 15/08/2010) :set colorcolumn=80 destacará a coluna 80. A cor dependerá do seu arquivo de sintaxe.

Veja Vim 80 coluna layout de preocupações , :h colorcolumn.


As cotações não são URL válidas, por isso faz sentido. O nome da âncora não deve conter caracteres de URL inválidos; o SO não deve corrigir erros de outros desenvolvedores do site.
Shadow Wizard é Ear For You

1
O Assistente de sombra está se referindo a uma revisão anterior da minha resposta, na qual me pergunto como colocar aspas simples em URLs usando o Markdown. Em seguida, ib sugeriu o uso de% 27, que funcionou. Obrigado ib.
ftvs

Descobriram recentemente como apenas para destacar colunas passado 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
rampion

A colorwidthcoisa é útil por outros motivos, por isso estou feliz por você ter postado isso.
Sridhar Sarnobat

2

Você já tentou 'linebreak'?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

3
Hmm ... mas breakaté apenas um padrão (não um comprimento), então eu não vejo como eu poderia usar isso para forçar envoltório macio a 80 ....
rampion

Hmmm, gostaria de saber se é possível criar um regex que corresponda a palavras cujo comprimento total (mais espaço em branco no meio) seja menor ou igual a n caracteres.
Shane Creighton-Young

@ ShaneCreighton-Young: ^.{,80}\bfaria por pessoas que usam guias suaves / expandidas. Note que é perl regex, não vim regex.
Mark K Cowan

0

Não existe uma boa maneira de fazer isso. Podemos cortar um improvisado setlocal softwrapcom autocmdse modificar @eborisch resposta. Se redimensionamos toda vez que inserimos um buffer, e redimensionamos para um comprimento específico quando a variável localsoftwrap é definida, obtemos o comportamento desejado.

Vamos supor que queremos envoltório macio para 80 colunas, podemos escrever o seguinte no .vimrc.

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

Para ativar o modo para um buffer específico, use os seguintes comandos:

let b:softwrap=1
set columns=80

Isso apenas transforma meus arquivos em rabiscos.
Suuuehgi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.