Exibir espaços à direita no vim

10

Eu gostaria de ter uma exibição agradável e doce do espaço em branco à direita no meu terminal vim. Isso me permitiria removê-los antes de fechar o arquivo.

Estou ciente de que esta pergunta é bastante popular e já encontrei dezenas de respostas no SO. Infelizmente ainda não encontrei uma satisfatória ...

Então, tentarei resumir as informações coletadas e as soluções que encontrei.

Solução 1: realçar manualmente os espaços finais

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

Destacar os espaços em branco à direita

Prós:

  • Fácil de usar
  • Rápido
  • Compatível com cursorline

Contras:

  • Cor escolhida incompatível com outros esquemas de cores porque a cor é definida manualmente como red
  • Grandes blocos de fundo vermelho não são muito estéticos

Solução 2: usando o recurso de lista

set list
set listchars+=trail:◦

insira a descrição da imagem aqui insira a descrição da imagem aqui

Prós:

  • Fácil de usar
  • Rápido

Contras:

  • Problema se :set cursorlineativado
  • A cor dedicada para list/trailnão é configurável. Tem que ser o mesmo que os outros listchars

Solução 3: Usando o recurso ocultar

syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2 
set concealcursor=nv
highlight Conceal ctermfg=red

insira a descrição da imagem aqui insira a descrição da imagem aqui

Prós:

  • Mais bonita que a primeira solução

Contras:

  • O fundo não é o mesmo que o fundo da linha do cursor
  • Pode interferir com outras regras de ocultação
  • A cor escolhida nem sempre é compatível com o esquema de cores
  • Não é compatível com a versão mais antiga do Vim

Minha pergunta

Qual das soluções enumeradas é a mais adequada em termos de desempenho e compatibilidade e como posso obter todos os prós e nenhum dos contras?

Em outros termos, eu gostaria de encontrar uma solução em que:

  • A cor final de destaque concorda com o esquema de cores escolhido
  • Esta cor é claramente visível, mas não muito agressiva para os olhos
  • Compatível com cursorline(plano de fundo e primeiro plano) `
  • Compatível com outros plugins que podem usar ocultar
  • O caractere final pode ser definido como qualquer caractere Unicode
nowox
fonte
Se você não gosta de vermelho, escolha uma cor diferente. Se você deseja que a cor seja compatível com diferentes esquemas de cores, vincule-os a um nome de grupo de cores em vez de usar uma cor específica, por exemplo :hi link ExtraWhitespace CursorLine,. Veja :help hi-link.
Gardjohn

Respostas:

4

Em termos de desempenho, nada disso deve fazer diferença. O Vim fica atolado em padrões complexos de sintaxe; o padrão aqui é bastante simples.

Para fazer com que a cor de destaque esteja de acordo com o esquema de cores escolhido, use :hi linkpara um grupo existente; Normalmente, isso seria Error. Obviamente, nada disso importa apenas se você alternar frequentemente os esquemas de cores (bastante diferentes); caso contrário, usar cores adequadas diretamente (como na solução 1) também seria bom.

Solução 1: realçar manualmente os espaços finais

Eu iria para isso, mas usando em matchadd()vez de :match; isso deixa o último para realce personalizado. Além disso, clearmatches()é muito grosseiro; ele exclui todas as correspondências e, portanto, pode afetar os plugins. Você pode usar / dar uma olhada no meu plug-in ShowTrailingWhitespace para uma implementação limpa e poderosa (que também inclui exceções para certos tipos de arquivos). Sim, é uma solução muito maior, mas ainda não notei nenhum impacto.

Solução 2: usando o recurso de lista

Esse é um recurso útil por si só, e mantê-lo permanentemente afeta o posicionamento do cursor nos caracteres da guia, portanto, eu não recomendaria isso.

Solução 3: Usando o recurso ocultar

Isso certamente interferirá em algumas sintaxes e plugins usando o recurso. Péssima ideia.

Ingo Karkat
fonte
Portanto, pela sua resposta, entendo que existe uma solução que permite o uso de um caractere Unicode personalizado para marcar espaços extras. Esta questão é realmente mais complicada do que eu pensava inicialmente.
nowox 31/05
Certo, caracteres personalizados funcionam apenas com 'listchars'. Para mim, o destaque é mais do que suficiente (especialmente com cores agressivas).
Ingo Karkat