Eu gostaria de ter uma exibição agradável e agradável de espaços em branco 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 um satisfatório...
Por isso tentarei resumir as informações coletadas e as soluções que encontrei.
Solução 1: destacar 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()
Prós:
- Fácil de usar
- Rápido
- Compatível com
cursorline
Contras:
- A cor escolhida não é compatí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:◦
Prós:
- Fácil de usar
- Rápido
Contras:
- Problema se
:set cursorline
ativado - A cor dedicada
list/trail
não é configurável. Tem que ser igual aos outros listchars
Solução 3: usando o recurso de ocultação
syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2
set concealcursor=nv
highlight Conceal ctermfg=red
Prós:
- Mais bonito que a primeira solução
Contras:
- O plano de fundo não é igual ao plano de 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 versões mais antigas 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, gostaria de encontrar uma solução onde:
- A cor final do destaque concorda com o esquema de cores escolhido
- Esta cor é claramente visível, mas não muito agressiva aos olhos
- Compatível com
cursorline
(fundo e primeiro plano)`- Compatível com outros plugins que podem usar ocultar
- O caractere final pode ser definido como qualquer caractere Unicode
Responder1
Em termos de desempenho, nada disso deve fazer diferença. O Vim fica atolado principalmente em padrões de sintaxe complexos; o padrão aqui é bastante simples.
Para fazer com que a cor de destaque esteja de acordo com o esquema de cores escolhido, utilize :hi link
um grupo existente; normalmente, isso seria Error
. É claro que tudo isso só importa se você mudar os esquemas de cores (bem diferentes) com frequência; caso contrário, usar cores adequadas diretamente (como na sua solução 1) também seria adequado.
Solução 1: destacar manualmente os espaços finais
Eu aceitaria isso, mas usando matchadd()
em vez de :match
; isso deixa o último para destaque personalizado. Além disso, clearmatches()
é muito grosseiro; ele excluitodoscorresponde e, portanto, pode afetar plug-ins. Você pode usar / dar uma olhada no meuPlug-in ShowTrailingWhitespacepara uma implementação limpa e poderosa (que também inclui exceções para determinados tipos de arquivos). Sim, é uma solução muito maior, mas ainda não notei nenhum impacto.
Solução 2: usando o recurso de lista
Este é um recurso útil por si só, e mantê-lo permanentemente tem efeitos no posicionamento do cursor nos caracteres Tab, então eu não recomendaria isso.
Solução 3: usando o recurso de ocultação
Isso certamente irá interferir em algumas sintaxes e plugins que usam o recurso. Péssima ideia.