Preocupações de layout de coluna do Vim 80

417

A maneira que eu faço indicação de 80 colunas no vim parece incorreta: set columns=80. Às vezes, também set textwidth, mas quero poder ver e antecipar o estouro de linha com a set columnsalternativa.

Isso tem alguns efeitos colaterais infelizes :

  1. Não posso ter set numbermedo de dividir arquivos com diferentes ordens de números de linha; ou seja, <100 arquivos de linha e> = 100 arquivos de linha exigirão dois set columnsvalores diferentes devido à coluna extra usada para a exibição de dígitos adicionais.
  2. Também inicio novas sessões (g) Vim em vez de dividir janelas verticalmente. Isso ocorre porque vsplitobriga-me a set columnscada vez que abro ou fecho um painel, portanto, iniciar uma nova sessão é menos trabalhoso.

Como você lida com a indicação de 80 caracteres quando deseja set numbersdividir verticalmente etc.?

cdleary
fonte
60
É considerado um bom estilo de código em muitos círculos; por exemplo, Guia de Estilo do Python (PEP8) recomenda 79 linhas de caráter: python.org/dev/peps/pep-0008
cdleary
4
Não é um absoluto "você deve ter 80 linhas de caracteres", mas torna mais agradável a leitura em alguns sistemas, como por exemplo, qualquer aplicativo baseado em console que não esteja sendo executado dentro de uma janela de console da GUI que pode ser redimensionada.
Matthew Scharley 24/10/08
47
@ David: Primeiro, é mais fácil de ler. Alguns estudos sugerem que um comprimento curto de linha (76 caracteres por linha) é o mais agradável e mais rápido de ser lido online. Você sabe disso: de repente, seus olhos estão na linha errada ao ler? Isso raramente acontece com 80 caracteres. Em segundo lugar, costumo editar ou diferenciar visualmente dois arquivos lado a lado no meu monitor de 1600 pixels de largura. Isso só funciona bem se o arquivo não tiver linhas com mais de 80 caracteres. Assim, costumo reformatar longas filas antes de poder trabalhar com eficiência.
nalply
25
O @davr é incrivelmente útil para editar vários arquivos lado a lado.
aehlke
2
Cometo muito menos erros nos códigos C / C ++ e JS desde que adotei uma largura de linha de 80 caracteres (a partir do estilo de codificação do kernel). Eu ocasionalmente transbordar lo por um casal, mas raramente ...
Mark K Cowan

Respostas:

586

Eu tenho isso configurado no meu .vimrc:

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

Isso destaca o fundo em um vermelho sutil para texto que ultrapassa o limite de 80 colunas (sutil no modo GUI, de qualquer maneira - no modo terminal é menos).

Simon Howard
fonte
3
Boa ideia! Alterei para "ctermbg = darkred" e "guibg = # FFD9D9" para atender melhor às minhas necessidades (fundo claro no modo gvim e escuro no modo cterm).
HS.
10
Eu acho que uma correção sutil é /\%81v.\+/ - por algum motivo, o. * Destaca lugares onde os caracteres não existem.
Cdleary 29/10/08
14
Eu acho que essa linha é um pouco melhor para a correspondência regex: match OverLength /\%>80v.\+/ Isso não destaca o caractere 'fim de linha' e também é mais intuitivo, pois você define o número como deseja o comprimento da linha a ser, não +1.
precisa
8
Por alguma razão, ele só funciona no buffer aberto pela primeira vez para mim (primeira janela do primeiro guia) no meu vim ...
lajarre
3
Confira stackoverflow.com/a/10993757/9822 se esta solução estiver funcionando apenas no seu primeiro buffer.
Jesse Vogt
769

A partir do vim 7.3, você pode usar set colorcolumn=80( set cc=80para abreviar).

Como as versões anteriores não suportam isso, meus .vimrcusos são:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

Consulte também a documentação online sobre a colorcolumnopção .

Jeremy W. Sherman
fonte
26
Você pode até mesmo automaticamente basear o valor de 'colorcolumn' on 'textwidth' com algo como: set cc = + 1
graywh
1
has ("colorcolumn") não funcionou para mim. Eu tive que usar existe ("& colorcolumn").
SpoonMeiser
5
Muito bom, exceto que o vim <7.1.40 não suporta matchadd.
Greg Jandl
19
você também pode alterar a cor da coluna comhighlight ColorColumn ctermbg=7
null_radix
2
Documentação para esta opção é a vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade
54

Maneira mais curta:

match ErrorMsg '\%>80v.\+'
Maksim Vi.
fonte
8
Eu realmente gosto disso porque não polui meu buffer com uma longa linha vertical! (Y)
Ionică Bizău
ErrorMsgé um highlight-group. Existem muitos grupos de destaque padrão no Vim que você pode usar com base na codificação de cores desejada para este caso.
crisron
49

Eu prefiro:

highlight ColorColumn ctermbg=gray
set colorcolumn=80
wieczorek1990
fonte
Eu gosto deste. Usei preto em vez de cinza e era mais sutil, pois meu fundo é quase preto, mas não completamente.
Oscilação isópcica
30

A resposta de Simon Howard é ótima. Mas /\%81v.\+/falha ao destacar guias que excedem a coluna 81. Então, eu fiz um pequeno ajuste, com base nas coisas que encontrei no wiki do VIM e nas opções de cores do HS acima:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

E agora o VIM destacará qualquer coisa que exceda a coluna 80.

Z.Zen
fonte
2
Pode querer adicionar guifg=whiteno final lá.
Dan Bechard 23/05
17

insira a descrição da imagem aqui

Abordagem minimalista e sem exageros. Somente o 79º caractere de linhas muito longas é destacado. Ele supera alguns problemas comuns: funciona em novas janelas, as palavras que transbordam são destacadas corretamente.

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

Nota: observe que FileType scala,javaisso limita isso aos arquivos de origem Scala e Java. Você provavelmente desejará personalizar isso. Se você omitir, funcionaria em todos os tipos de arquivo.

Dominykas Mostauskis
fonte
Por que você adicionou um FileType scala,java? (não funciona para mim)
Dorian
1
@Dorian limita isso aos tipos de arquivo Scala e Java, porque esses eram os tipos de arquivo em que eu estava trabalhando na época. Eu esqueci de mencionar isso. Atualizando resposta.
Dominykas Mostauskis
Qual fonte você está usando na captura de tela? Acho muito agradável aos olhos.
Rook
@ Idigas: Concordo, e eu sinto que talvez Comic Sans pode ter sido uma má escolha quando eu originalmente criado PuTTY :)
Mark K Cowan
Não consegui que o trecho desta resposta funcionasse no Vim 7.4. (I removido do filtro FileType também.)
Mnebuerquo
13

Você também pode desenhar uma linha para ver o limite de 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

Resultado:

insira a descrição da imagem aqui

0x8BADF00D
fonte
13

Uma boa maneira de marcar apenas o primeiro caractere saindo dos limites especificados:

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

Da palestra de Damian Conway .

Shanded
fonte
7

As versões mais recentes do vim permitem um :set numberwidth=xvalor que define a largura da exibição do número da linha. Eu realmente não uso dobrável, etc, então eu não saberia disso. Desenhar uma linha vertical fina está além das habilidades de um aplicativo de console. O GVim pode permitir isso (eu não o uso, então não posso comentar lá).

Matthew Scharley
fonte
5

Receio que você tenha colocado restrições no conjunto de soluções que, assim, deixam você com o conjunto nulo.

O uso :set textwidth=80corrigirá todos os problemas mencionados, exceto que você não pode ver facilmente o limite de linhas chegando. Se você :set ruler, você ativará a exibição da posição x, y na barra de status, que poderá usar para ver em qual coluna está.

Além disso, não tenho certeza do que lhe dizer. É uma pena perder a coluna numérica, dobrar a coluna e dividir apenas porque você precisa :set columns=80.

Lucas Oman
fonte
Sim, eu tinha medo disso ... Eu esperava que houvesse uma maneira oculta de desenhar uma fina linha vertical, como nos editores mais orientados graficamente.
Cdcely
5

Você pode tentar isso:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

Isso configurará dois destaques em cada buffer, um para caracteres nas 8 colunas anteriores ao que &textwidthestiver definido e outro para caracteres além dessa coluna. Dessa forma, você tem alguma extensão de antecipação. É claro que você pode ajustá-lo para usar uma largura diferente se desejar mais ou menos antecipação (que você paga na forma de perda de sintaxe destacada nessas colunas).

Aristóteles Pagaltzis
fonte
3

Bem, olhando para as colunas: help, realmente não está sendo feito para mexer.

No console, geralmente é determinado pela configuração do console (ou seja, é detectado automaticamente); na GUI, ele determina (e é determinado por) a largura das janelas do gvim.

Normalmente, você apenas permite que consoles e gerenciadores de janelas realizem seus trabalhos comentando o set columns

Não sei ao certo o que você quer dizer com "ver e antecipar o estouro de linha". Se você deseja que o EOL seja inserido aproximadamente na coluna 80, use set textwidthou set wrapmargin; se você quiser apenas um quebra automática (ou seja, a linha está quebrada, mas não a EOL real), brinque com set linebreake set showbreak.

Ding-Yi Chen
fonte
2

este está fora do campo esquerdo, mas é um bom mapa para redimensionar sua divisão atual para 80 caracteres, se você tiver os números de linha:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 
ErichBSchulz
fonte
1

Você pode tentar isso para definir o tamanho da janela para permitir 80 caracteres de texto real. Isso ainda não funciona com divisões verticais.

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

Isso requer o vim 7+, 7.3 para o número relativo.

Mike L
fonte