Como fazer com que o Vim destaque caracteres não-ascii?

153

Estou tentando fazer com que o Vim destaque caracteres não ASCII. Existe uma configuração disponível, padrão de pesquisa regex ou plug-in para fazer isso?

chutsu
fonte

Respostas:

291

Usando o intervalo em uma []classe de caracteres em sua pesquisa, você deve poder excluir o intervalo de caracteres hexadecimais ASCII, destacando, portanto, (supondo que você tenha hlsearchativado) todos os outros caracteres fora do intervalo ASCII:

/[^\x00-\x7F]

Isso fará uma correspondência negativa (via [^]) para caracteres entre ASCII 0x00e ASCII 0x7F(0-127) e parece funcionar no meu teste simples. Para ASCII estendido, é claro, estenda o intervalo até em \xFFvez de \x7Fusar /[^\x00-\xFF].

Você também pode expressá-lo em decimal via \d:

/[^\d0-\d127]

Se você precisar de algo mais específico, como exclusão de caracteres não imprimíveis, precisará adicionar esses intervalos à classe de caracteres [].

Michael Berkowski
fonte
14
Em decimal:/[^\d0-\d127]
Bohr
@ Bohr Essa é uma boa adição. Vou editá-lo acima.
Michael Berkowski 15/05
ótimo! salvou o dia! um dos caracteres de indentação foi colado no meu código python e o erro unicode começa a me matar. Foi difícil detectar entre o mesmo caractere usado pelo plugin vim!
kollery
36

Sim, há um recurso nativo para realçar as seqüências correspondentes. Dentro do Vim, faça:

:help highlight
:help syn-match

syn-matchdefine uma sequência que corresponde a cair em um grupo. highlightdefine a cor usada pelo grupo. Pense no realce da sintaxe para seus arquivos vimrc.

Portanto, você pode usar os comandos abaixo no seu arquivo .vimrc:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
Steven Ding
fonte
você não precisa colocar :na frente dos comandos no seu vimrc.
precisa saber é o seguinte
termbgnão parece ser um comando legal no VIM 7.3, instalado no Ubuntu Server 12.10.
dotancohen
4
Então termbg, não parece ser um parâmetro legal no VIM 7.3, instalado no Ubuntu Server 12.10.
dotancohen
De fato, o terminal regular termnão pode ter cor de fundo, enquanto o terminal colorido ctermpode.
Dima Tisnek
termbg removido, mas você pode adicionar ctermfg, guifg, etc. para também controlar o primeiro plano.
fatal_error
16

Para outras pessoas (a partir de agora menos azaradas) que acabam aqui por meio de um mecanismo de pesquisa e não conseguem destacar os caracteres não ASCII, tente o seguinte (coloque isso no seu .vimrc):

highlight nonascii guibg=Red ctermbg=1 term=standout
au BufReadPost * syntax match nonascii "[^\u0000-\u007F]"

Isso tem o benefício adicional de não colidir com definições de sintaxe regulares (tipo de arquivo [extensão de arquivo]).

PAStheLoD
fonte
Eu recebo o E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueLinux mint 17.3
Nasser
3
Embora o objetivo seja declarado de não conflitar com as definições de sintaxe já definidas, se você desejar , poderá adicioná containedin=ALL-lo ao final da última linha au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Acho que a pena distração-lo (quando unicode é permitido), a resposta original aqui se não pegar coisas como código não-ascii dentro de uma ifdeclaração ...
svenevs
1
É sempre mais seguro para incluir o seu autocmd BufRead ....em uma autogroup no vim, a menos que você tenha uma boa razão para não ...
Cbhihe
6

Esse regex também funciona. Foi o primeiro hit do google para "vim remove caracteres não-ascii" do briceolion.com e :set hlsearchdestacará:

/[^[:alnum:][:punct:][:space:]]/
Grant Bowman
fonte
1
A pergunta está pedindo para destacar caracteres não-ascii, não para removê-los .
chutsu
1
Obrigado por apontar isso, editei minha resposta. Não foi muito difícil ver que esse regex também responde à pergunta de uma maneira diferente de outras respostas. Minha resposta original foi a :%s/[^[:alnum:][:punct:][:space:]]//gcque destaca primeiro e depois a substitui.
Grant Bowman
4

Se você também estiver interessado nos caracteres não imprimíveis , use este:/[^\x00-\xff]/

Eu o uso em uma função:

 function! NonPrintable()
   setlocal enc=utf8
   if search('[^\x00-\xff]') != 0
     call matchadd('Error', '[^\x00-\xff]')
     echo 'Non printable characters in text'
   else
     setlocal enc=latin1
     echo 'All characters are printable'
   endif
 endfunction
Reman
fonte
Sua função não funciona aqui, não destaca e também atrapalha a codificação. Por que você está alterando a codificação local?
Werner
Tente mudar encpara fenc. Alterei a codificação porque minha codificação padrão é (foi em 2013) latin1. A função não destaca os caracteres não imprimíveis se o conjunto de caracteres for latin1. Veja também o destaque: você deve ter a chave ERRORno seu arquivo de sintaxe de cores. Este é o meu:hi Error guifg=Black guibg=Orange
Reman
2

Com base nas outras respostas sobre este tópico e na resposta que obtive aqui , adicionei isso ao meu .vimrc, para que eu possa controlar o destaque não-ascii digitando <C-w>1. Ele também mostra comentários internos, embora você precise adicionar o grupo de comentários para cada sintaxe de arquivo que usará. Ou seja, se você editar um arquivo zsh, precisará adicionar zshCommentà linha

au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment

caso contrário, ele não mostrará o caractere não-ascii (você também pode definir o contido em = ALL se quiser ter certeza de mostrar caracteres não-ascii em todos os grupos). Para verificar como o comentário é chamado em um tipo de arquivo diferente, abra um arquivo do tipo desejado e insira :syno vim, depois pesquise nos itens da sintaxe pelo comentário.

function HighlightNonAsciiOff()
  echom "Setting non-ascii highlight off"
  syn clear nonascii
  let g:is_non_ascii_on=0
  augroup HighlightUnicode
  autocmd!
  augroup end
endfunction

function HighlightNonAsciiOn()
  echom "Setting non-ascii highlight on"
  augroup HighlightUnicode
  autocmd!
  autocmd ColorScheme *
        \ syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment |
        \ highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline
  augroup end
  silent doautocmd HighlightUnicode ColorScheme
  let g:is_non_ascii_on=1
endfunction

function ToggleHighlightNonascii()
  if g:is_non_ascii_on == 1
    call HighlightNonAsciiOff()
  else
    call HighlightNonAsciiOn()
  endif
endfunction

silent! call HighlightNonAsciiOn()
nnoremap <C-w>1 :call ToggleHighlightNonascii()<CR>
Werner
fonte
1

De alguma forma, nenhuma das respostas acima funcionou para mim.

Então eu usei :1,$ s/[^0-9a-zA-Z,-_\.]//g

Ele mantém a maioria dos personagens que me interessam.

user2250246
fonte
1
Isso exclui os caracteres, onde o op pediu para destacar .
Bernhard Wagner
você não quer dizer [^ 0-9a-zA-Z, \ -_ \.], ie \ -?
ben26941
0

Alguém já respondeu à pergunta. No entanto, para outros que ainda estão tendo problemas, aqui está outra solução para destacar caracteres não-ascii nos comentários (ou qualquer grupo de sintaxe no assunto). Não é o melhor, mas é uma correção temporária.

Pode-se tentar:

:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
            \ highlight nonascii ctermfg=yellow guifg=yellow

Isso misturou peças de outras soluções. Você pode remover contained, mas, da documentação, pode haver um problema potencial de se recuperar novamente (como eu entendo). Para visualizar outros padrões definidos, a syn-containsseção o conteria.

:help syn-containedin
:help syn-contains 

Problema replicado de: defina o item para destacar maior prioridade no vim

nate
fonte