Faça o Vim mostrar TODOS os espaços em branco como um personagem


772

Não consigo encontrar uma maneira de fazer o Vim mostrar todos os espaços em branco como um personagem. Tudo o que encontrei foi sobre guias, espaços à direita etc.


14
Também estou tentando resolver exatamente esse problema. Por favor, se você se deparar com isso, evite dar mais uma resposta envolvente :set list. Isso não responde à nossa pergunta. (Para outros participantes: a resposta de mrucci abaixo é útil, embora não seja uma solução real .) #
ELLIOTTCABLE

1
Para todos aqueles que dizem que os espaços são visíveis liste listcharsconsideram que um espaço está seguindo diretamente uma guia. Seria quase invisível nessa situação. Concordo que você pode pegar a maioria das situações, mas se seria bom ter um destaque adequado de todos os espaços.
Kevin Cox

11
Para novos visitantes: isso é resolvido nas versões mais recentes do vim! Veja a resposta de brettanomyces abaixo .
ELLIOTTCABLE

1
Relacionado (mas pilha de diferença): vi.stackexchange.com/questions/422/…
Pureferret 7/16

Respostas:


693

Como outros já disseram, você pode usar

:set list

que, em combinação com

:set listchars=...

exibir caracteres invisíveis.
Agora, não há uma opção explícita que você possa usar para mostrar espaços em branco, mas nos listchars, você pode definir um caractere para mostrar tudo, mas espaços em branco. Por exemplo, o meu se parece com isso

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<

então agora depois de usar

:set list

tudo o que não é mostrado explicitamente como outra coisa é, na verdade, um espaço em branco antigo e claro.

Como de costume, para entender como listcharsfunciona, use a ajuda. Ele fornece ótimas informações sobre quais caracteres podem ser exibidos (como espaço à direita, por exemplo) e como fazê-lo:

:help listchars

Pode ser útil adicionar uma alternância para que você possa ver as alterações na metade da edição facilmente (fonte: VIM: set list! Como uma alternância em .vimrc ):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>

4
"Tudo o que não é mostrado explicitamente como outra coisa"? Experimente os espaços unicode do intervalo U + 2000..U + 200A. Se a fonte de largura fixa suportar, eles serão mostrados como o espaço 0x20 normal.
ZyX 26/11/11

2
@ZyX - Eu não estava usando todo o Unicode, mas o conjunto de caracteres bastante comum em uso. Se você não estiver satisfeito com a resposta, sinta-se à vontade para sugerir melhorias.
Rook

20
@ckarbass -: set invlist
Rook

Ótima dica! Eu recomendo colocar a linha setcharchars no .vimrcarquivo, para que essa maneira bonita de exibir caracteres invisíveis possa ser facilmente ativada a :set listqualquer momento (sem pesquisar esta página novamente).
Melebius

8
@ckarbass Da mesma maneira que você alterna qualquer coisa no vim - adicionando um! até o fim. Assim se torna: set list!

275

A partir do patch 7.4.710, agora você pode definir um caractere para mostrar no lugar do espaço usando listchars!

:set listchars+=space:␣

Portanto, para mostrar TODOS os caracteres de espaço em branco como um caractere, você pode fazer o seguinte:

:set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
:set list

Discussão na lista de discussão: https://groups.google.com/forum/?fromgroups#!topic/vim_dev/pjmW6wOZW_Q


2
Isso é bem legal, mas estou me perguntando por que o personagem eol não fica colorido de maneira diferente, ao contrário dos outros.
CMCDragonkai

3
Eu tentei isso e recebi um erro no início. Descobriu-se que "espaço" não era uma opção válida na versão um pouco mais antiga do gvim que eu estava usando. A atualização do meu gvim resolveu meu problema. Para outras pessoas que estão recebendo um erro, digite :help listcharspara verificar se "espaço" é uma opção válida para "listchars". Caso contrário, atualize seu vim para o patch @brettanomyces especificado. Ou apenas deixe "espaço" fora do comando set se você não quiser ver espaços.
Niko Bellic

4
Eu uso Médio Dot do Unicode (U + 00B7) para caractere de espaço ( space:·), como parece que MS Word, Notepad ++, etc.
Dinei

1
@ user5359531 tente <ctrl-v> u2334 para inserir o caractere de caixa aberta unicode (␣). Veja sanctum.geek.nz/arabesque/special-characters-in-vim para mais detalhes
Brett Y

3
Digite <C-K>.Mno vim para ·. Veja :h digraphpara detalhes.
precisa saber é o seguinte

252

:set list para ativar.

:set nolist desabilitar.


11
Obrigado por nos mostrar como alternar entre os modos. Você pensaria que outras respostas avançadas ensinariam isso.
Jonathan Komar

1
sim, isso é útil. Eu gostaria que fosse a resposta principal, pois eu mesma encontrei essa resposta apenas para descobrir que ela já estava no site, fora de vista.
Ejoso

8
: set list!é melhor :)
skippr

@ Skippr Em que medida? É o mesmo número de pressionamentos de tecla, exceto que Shifte !são mais difíceis de digitar do que no. Se você o colocar no seu .vimrc, concordo que o formulário de exclusão é mais fácil de ler.
precisa

7
@ Dan Se você deseja ativar e desativar isso em um tempo relativamente curto, o :set list!fará sem que você precise entrar nolist. O !simplesmente faz o oposto do que está definido atualmente. Eu uso isso o tempo todo, especialmente quando :set paste!. Eu odeio pressionando a tecla de seta para encontrar :set pasteou :set nopastelol
skippr

188

Acho que outras respostas aqui são mais abrangentes, mas pensei em compartilhar um truque que costumo usar para diferenciar visualmente guias e espaços:

:syntax on
:set syntax=whitespace

Estas são regras de destaque de sintaxe para a linguagem de programação Whitespace - as guias são exibidas em verde e os espaços em vermelho. :)

Pode ser combinado com :set listo mencionado por muitas outras respostas, embora as guias sejam exibidas como ^ I sem luz verde, mas os espaços serão exibidos em vermelho.


7
Eu gosto deste, é bastante inteligente e se sente de alguma forma melhor do que a maioria das outras respostas. Não é realmente uma solução utilizável o tempo todo.
ComputerDruid

4
Prefiro métodos mais convencionais, mas estou marcando isso com +1 para inventividade.
Sietse van der Molen

28
Eu sabia que a linguagem seria útil para alguma coisa .
precisa saber é o seguinte

1
Você se importa com links para o arquivo de sintaxe .vim você está usando para destaque
SeldomNeedy

2
@SeldomNeedy, você não precisa baixar nada, as regras de destaque do espaço em branco são enviadas com o Vim há anos. Eles devem ser essencialmente integrados, a menos que você esteja usando uma versão estranha ou muito antiga do Vim.
Eliot

91

:set listmostrará todos os espaços em branco como um personagem. Tudo, exceto um espaço, parecerá diferente do seu estado normal, o que significa que, se você ainda vê um espaço antigo simples, é realmente um espaço antigo simples. :)


35
Desative isso com:set nolist
Greg K

6
E se você quiser ver o caractere de espaço, como no Sublime Text 2 com "show whitespace" ativado? Achei muito útil.
Olical

Não é o que eu vim aqui, mas muito útil. Obrigado.
harperville

4
Além disso, as opções sem podem ser alternadas !no final:set list!
baldrs

Eu uso um forro, :se hls | /\_spara isso. Obtém tudo, enquanto set listignora os espaços. Desligue novamente com :se nohls. Detalhes sobre este post: albertech.blogspot.com/2015/02/…
jar

73

Se você definir:

:highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none

e, em seguida, faça uma pesquisa por um espaço, cada caractere de espaço será mostrado como um caractere sublinhado.

Você pode usar este comando em uma função útil que alterna "sublinhado" de espaços.

set hls
let g:HLSpace = 1
let g:HLColorScheme = g:colors_name
function ToggleSpaceUnderscoring()
    if g:HLSpace
        highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none
        let @/ = " "
    else
        highlight clear
        silent colorscheme "".g:HLColorScheme
        let @/ = ""
    endif
    let g:HLSpace = !g:HLSpace
endfunction

Mapeie a função para uma tecla de atalho com:

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>

NB: Defina a função no vimrc após a definição do esquema de cores.


1
Bem, é um pouco complicado, mas está mais perto do que qualquer outra coisa até agora. Recompensa concedida! : D
ELLIOTTCABLE

45

Dependendo das regras de sintaxe para o buffer atual, algo como isto poderia funcionar:

:syn match WhiteSpace / / containedin=ALL conceal cchar=Æ
:setl conceallevel=2 concealcursor=nv

Isso precisa de um vim 7.3 com o recurso + ocultar

Atualização 24/10/2014 Para expandir um pouco sobre isso. É claro que é possível definir alguns destaques para os caracteres ocultos.

  • Você pode configurar a aparência dos caracteres ocultos. Para realçar, você precisa pelo menos uma vez configurar o grupo de destaque 'Ocultar' (consulte a ajuda em :h hl-ConcealIsso pode ser feito no seu esquema de cores e, em seguida, você não precisa reconfigurá-lo novamente. Mas isso afeta todos os caracteres ocultos (por exemplo, se o seu O script de sintaxe oculta mais alguns itens, eles serão exibidos como seus caracteres de espaço em branco).

    :hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE

  • Parece haver uma particularidade de que o Vim não destacará espaços, se o script de sintaxe usar a skipwhitepalavra - chave. Não haverá maneira de contornar (talvez isso seja corrigido, eu postei um patch )

  • Parece haver um patch flutuando, que permitirá personalizar a aparência dos espaços no listmodo. O mais recente no momento da escrita parece ser este . (Isso significa que você precisa criar seu próprio Vim para usá-lo).
  • As opções locais da janela conceallevele concealcursorsão. Isso significa que eles podem ser diferentes em janelas diferentes (e possivelmente também serão definidos por plugins de tipo de arquivo ou outros scripts de plug-in).
  • Os grupos de destaque de sintaxe precisam ser executados sempre que um arquivo de definição de sintaxe é recarregado. Isso pode ser feito usando um BufWinEnterou, possivelmente, também um Syntaxou mesmo FileTypeautocommand. (Eu não testei qual realmente funciona).

Os dois últimos itens significam que você precisará configurar alguns comandos automáticos que redefinem as regras de sintaxe e as opções correspondentes. Para o primeiro, convém configurar o destaque usando umColorScheme convém comando automático (para que os caracteres ocultos sempre tenham a mesma aparência, independentemente do que um esquema de cores realmente configure). Para uma solução completa, procure a resposta romana, que deve lhe dar um começo. Se você configurar uma função, poderá configurar facilmente um comando de alternância para ativar ou desativar o Realce especial.

Atualização 26/10/2014 Fiz um plug - in com esta pergunta.

Atualização 22/04/2015 Um patch foi incluído no Vim que torna isso possível usando a listopção Basta definir set list listchars+=space:␣ Isso funciona a partir do Vim 7.4.711


Isso funciona muito bem! Como isso pode ser adicionado .vimrc?
Eric Martindale

1
Como isso funciona no buffer atual, você provavelmente precisará agrupar isso em um comando automático. O BufEnter ou mesmo o autocommand de sintaxe podem funcionar para você:
Christian Brabandt

3
Æé uma escolha estranha de personagem para isso, por que não ·?
Marius Gedminas

1
Esta é realmente a resposta correta. Alguma idéia de como adicionar realce de sintaxe adequado a esse personagem? Eu preferiria que fosse um muito desbotada ·
ataque aéreo

@ChristianBrabandt, você tem um monte de arquivos relacionados ao nrrwrgn à direita que poluem seu repositório.
Romainl 27/10/2014

31

Eu uso isso

/\s
:set hlsearch

para destacar espaços em branco. Ele procura todos os espaços em branco e ativa o destaque para que eles saiam. No entanto, ele não imprime um caractere especial.


Solução mais simples imho. Grande emparelhado com um comando à pesquisa clara (eu uso nnoremap <leader><space> :noh<cr>)
Lenna

24

Se por espaços em branco você quer dizer o caractere '', minha sugestão seria apenas uma pesquisa / substituição. Como os outros sugeriram, set listaltera os caracteres que não são de impressão para um caractere visível que está configurado listchars.

Para mostrar explicitamente os espaços como algum outro caractere, algo semelhante ao abaixo deve fazer o truque:

:%s/ /█/g

Depois, desfaça a alteração para voltar novamente.

(para obter o █ I pressionado esta sequência de teclas exata: :%s/ /CTRL-KFB/g)


2
Gosto disso melhor do que as outras respostas, isso me parece inverso :set list, mudando o caráter visível ('espaço') para um _ que não se destaca '(??). Gostaria de saber se alguém pode usar isso dentro da partida, por exemplo, :match MyBlackBlockChar "appropriate_regexisso deve funcionar, não deveria?
Sudhi 11/11/11

As outras respostas são úteis, mas este é o primeiro que realmente responde à pergunta do OP +1
Alexx Roche

1
Ou :%s/\s/█/gpara todos os espaços em branco. Além disso, o :set hlsearchplus :&s/\s//gnpode ser útil.

16

Para realçar espaços, basta procurar por:

/ <espaço>

Notas:

  • <espaço> significa apenas digitar o caractere de espaço.
  • Ative o destaque dos resultados da pesquisa com: set hlsearch

    Para destacar espaços e tabulações:

    / [<espaço> <guia>]

    Uma maneira rápida de remover os destaques é procurar qualquer outra coisa: / asdf

    (basta digitar qualquer lista curta de caracteres aleatórios)


  • 1
    É o mesmo que a resposta postada três anos antes. Além disso,: noh é mais rápido que / asdf para texto não realçado. Ou você pode até definir f1 para: noh, uma vez que provavelmente o usará com frequência.

    @DrEval Supondo que você está se referindo a resposta de Benedikt Köppel na verdade é sutilmente diferente /<space>vs /\s. Eu acho que não é óbvio e mais rápido usar a sugestão aqui.
    icc97

    14

    O código abaixo é baseado na resposta de Christian Brabandt e parece fazer o que o OP deseja:

    function! Whitespace()
        if !exists('b:ws')
            highlight Conceal ctermbg=NONE ctermfg=240 cterm=NONE guibg=NONE guifg=#585858 gui=NONE
            highlight link Whitespace Conceal
            let b:ws = 1
        endif
    
        syntax clear Whitespace
        syntax match Whitespace / / containedin=ALL conceal cchar=·
        setlocal conceallevel=2 concealcursor=c
    endfunction
    
    augroup Whitespace
        autocmd!
        autocmd BufEnter,WinEnter * call Whitespace()
    augroup END
    

    Acrescente essas linhas à sua ~/.vimrce inicie uma nova sessão do Vim para ver a mágica ainda imperfeita acontecer.

    Sinta-se livre para editar as cores padrão e ocultar o caractere.


    Advertência: algo no *FuncBodygrupo de sintaxe em vários idiomas impede a exibição do ponto do meio. Não sei (ainda?) Como tornar essa solução mais confiável.


    Isso é o que eu quis dizer com "dependendo do grupo de sintaxe". Suspeito que este seja um problema com as palavras-chave syn em combinação com o sinalizador skipwhite.
    Christian Brabandt 23/10

    @ChristianBrabandt, sim, eu não poderia ir além do que você já fez, além de torná-lo "automático".
    Romainl

    1
    Sim, é o skipwhiteargumento nas regras de sintaxe que impede que o grupo de sintaxe corresponda (embora seja permitido que ele esteja contido em todos os grupos).
    Christian Brabandt

    Existe alguma maneira de fazer isso funcionar bem com os Guias de recuo , que adicionam antecedentes ao recuo? Eu suspeito que é uma questão de fazer com que isso não substitua a cor de fundo, mas isso parece não ser trivial.
    Mike

    Como desativar o mesmo quando o destaque do espaço em branco não é necessário? Procurando um tipo de comando de alternância curto.
    yuvaeasy

    11

    Fiquei frustrado com todas as outras respostas a essa pergunta, porque nenhuma delas destaca o caracter do espaço de uma maneira útil. A exibição de espaços como caracteres ajudaria particularmente os idiomas no formato de espaço em branco, onde misturar guias e espaços é prejudicial.

    Minha solução é mostrar guias e sublinhar vários espaços. É emprestado da resposta de mrucci e deste tutorial . Por usar destaque de sintaxe, é persistente:

    set list listchars=tab:\|\ 
    highlight Whitespace cterm=underline gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    autocmd ColorScheme * highlight Whitespace gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    match Whitespace /  \+/
    

    Usando isso, as guias são exibidas como |e espaços como _, o que facilita a identificação quando estou misturando estilos de código.

    A única desvantagem que encontrei é que esse snippet não ajusta a cor do plano de fundo para corresponder ao contexto (como em um comentário).


    8

    todas as respostas acima tentam tornar os espaços visíveis no vim. Se você realmente insiste em ter espaços visíveis como pontos, há outra abordagem ...

    Se não puder ser feito no vim, altere completamente sua fonte. Copiei a fonte Ubuntu One Mono e a editei usando o FontForge. Lembre-se de alterar o nome completo, a família, a família preferida e a fonte completa compatível (no FontFoge está em Nomes TTF nas informações da fonte), a fim de tê-la como uma fonte separada. Simplesmente edite o caractere de espaço para ter um ponto no meio e salve a fonte em ~ / .fonts Agora você pode usá-lo para o seu gvim ou para todo o terminal ... Copiei o "!" caractere, removeu a linha e moveu o ponto para o meio. Demorou um pouco mais de 5 minutos ...

    Nota: alterar o caractere de espaço (0x20) resulta no inconveniente de haver pontos em toda a tela do vim ... (mas separará os espaços das guias ...)


    2
    Isso pareceu uma abordagem muito boa até eu ler a nota sobre o preenchimento de pontos na tela inteira. : /
    friederbluemle

    3
    Pontos para a criatividade! :-)
    jpaugh 17/01

    7

    Não encontrei exatamente o que queria das respostas existentes. O código abaixo destacará todos os espaços finais em vermelho brilhante. Basta adicionar o seguinte ao seu.vimrc

    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()
    

    5
    :match CursorLine /\s\+/
    

    evita o bit "você precisa procurar por espaços para que eles apareçam", mas não é possível configurar o ataque para fazer coisas que não causam crepúsculo nos espaços. O CursorLine pode ser qualquer grupo de hilighting e, no tema padrão, é um sublinhado simples.


    Não sei dizer a diferença entre tabulações e espaços usando esse método, o que é muito ruim, mas eu amo que é uma linha única.
    Rustavore

    5

    Eu gosto de usar caracteres especiais para mostrar espaços em branco, é mais claro. Até um mapa para alternar é um recurso essencial, para uma verificação rápida.

    Você pode encontrar esses recursos em um script antigo do vim não atualizado desde 2004:

    vim-scripts/cream-showinvisibles@vim.org

    Graças ao projeto vim-scripts e vundle, você pode voltar à vida com este plugin

    vim-scripts / show de cremeinvisíveis @ github

    Melhor ainda, meus dois centavos sobre isso é adicionar um atalho configurável (em vez de predefinidoF4 )

    então adicione isso ao ~ / .vimrc

    Plugin 'albfan/cream-invisibles'
    
    let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error
    

    instalar plugin no vim

    :PluginInstall
    

    e ai vai


    5

    Para cobrir caracteres de espaço em branco Unicode:

    set list
    set listchars=tab:│\ ,nbsp:·
    highlight StrangeWhitespace guibg=Red ctermbg=Red
    " The list is from https://stackoverflow.com/a/37903645 (with `\t`, `\n`, ` `, `\xa0` removed):
    call matchadd('StrangeWhitespace', '[\x0b\x0c\r\x1c\x1d\x1e\x1f\x85\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]')
    

    O resultado:

    • somente o espaço ordinal (U + 0020) se parece com um espaço (" ")
    • a guia (U + 0009) se parece com " │ " (dois caracteres: um tubo longo e, em seguida, um espaço ordinal;colorscheme murphy )
    • o espaço sem quebra normal (U + 00A0) se parece com " ·" (um caractere; é cinza colorscheme murphy)
    • qualquer outro caractere de espaço em branco se parecerá com vermelho " "

    1
    Editado para adicionar "ctermbg = Red" para fazer meu terminal funcionar na coloração. Pessoalmente eu usei set listchars=tab:»\ ,space:·para sua referência.
    21418 Johnny Wong

    @JohnnyWong Obrigado pela atualização. Ele foi inicialmente rejeitado pelos revisores, mas verifiquei o código e (sem surpresa) funciona para gvime vim.
    22418 Kirill Bulygin

    1
    Resposta brilhante, é exatamente isso que eu precisava para capturar espaços estreitos e sem interrupção (Hex 202f) que não são renderizados no Safari e Firefox.
    precisa saber é o seguinte

    4

    Você poderia usar

    :set list
    

    para realmente ver a estrutura de uma linha. Você verá guias e novas linhas explicitamente. Quando você vê um espaço em branco, é realmente um espaço em branco.


    3

    destacar pesquisa

    :set hlsearch 
    

    em .vimrcque é

    e procure guias de espaço e retornos de carro

    / \|\t\|\r
    

    ou pesquise todos os caracteres de espaço em branco

    /\s
    

    de procurar todos os caracteres de espaço não em branco (os caracteres de espaço em branco não são mostrados, para que você veja os caracteres de espaço em branco entre as palavras, mas não os caracteres de espaço em branco à direita)

    /\S
    

    para mostrar todos os caracteres de espaço em branco à direita - no final da linha

    /\s$
    

    3

    Mantenha esses hacks no .vimrc como comentários, então no shell, simplesmente:

    echo '
      " how-to see the non-visible while spaces
      " :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
      " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
      " :set list
      " but hei how-to unset the visible tabs ?!
      " :set nolist
      ' >> ~/.vimrc
    

    1
    :se list
    :se nolist
    

    :seé suficiente, :setnão é necessário.


    1

    você também pode destacar os espaços (substituindo os espaços por um bloco):

    :%s/ /█/g
    

    (antes de escrever, desfaça-o)


    1

    Adicionar isso ao meu .vimrc funciona para mim. Apenas verifique se você não tem mais nada conflitante ..

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    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.