Come convincere Vim a evidenziare i caratteri non ascii?


153

Sto cercando di convincere Vim a evidenziare i caratteri non ASCII. Esiste un'impostazione, un modello di ricerca regex o un plugin disponibili per farlo?

Risposte:


291

Utilizzando l'intervallo in una []classe di caratteri nella ricerca, dovresti essere in grado di escludere l'intervallo di caratteri esadecimali ASCII, quindi evidenziando (supponendo che tu abbia hlsearchabilitato) tutti gli altri caratteri che si trovano al di fuori dell'intervallo ASCII:

/[^\x00-\x7F]

Questo farà una corrispondenza negativa (via [^]) per i caratteri tra ASCII 0x00e ASCII 0x7F(0-127) e sembra funzionare nel mio semplice test. Per ASCII esteso, ovviamente, estendere l'intervallo fino a \xFFanziché \x7Futilizzare /[^\x00-\xFF].

Puoi anche esprimerlo in decimali tramite \d:

/[^\d0-\d127]

Se hai bisogno di qualcosa di più specifico, come l'esclusione di caratteri non stampabili, dovrai aggiungere tali intervalli nella classe di caratteri [].


14
In decimale:/[^\d0-\d127]
Bohr,

@Bohr Questa è una bella aggiunta. Lo modificherò sopra.
Michael Berkowski,

grande! salvato il giorno! uno dei caratteri di rientro è stato incollato nel mio codice Python e l'errore Unicode inizia a uccidermi. è stato difficile rilevare tra lo stesso personaggio usato dal plugin vim!
Kollery,

36

Sì, esiste una funzione nativa per evidenziare le stringhe corrispondenti. All'interno di Vim, esegui:

:help highlight
:help syn-match

syn-matchdefinisce una stringa che corrisponde a un gruppo. highlightdefinisce il colore utilizzato dal gruppo. Pensa solo all'evidenziazione della sintassi per i tuoi file vimrc.

Quindi puoi usare i comandi seguenti nel tuo file .vimrc:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2

non è necessario inserire il :davanti ai comandi nel tuo vimrc.
FDinoff,

termbgnon sembra essere un comando legale in VIM 7.3 installato su Ubuntu Server 12.10.
dotancohen,

4
Quindi termbgnon sembra essere un parametro legale in VIM 7.3 installato su Ubuntu Server 12.10.
dotancohen,

In effetti, il terminale normale termnon può avere il colore di sfondo, mentre il terminale del colore ctermpuò.
Dima Tisnek,

rimosso termbg ma potresti aggiungere ctermfg, guifg, ecc per controllare anche il primo piano.
fatal_error,

16

Per altre persone (d'ora in poi meno sfortunate) che finiscono qui tramite un motore di ricerca e non riescono a realizzare l'evidenziazione di caratteri non ASCII, prova questo (inseriscilo nel tuo .vimrc):

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

Ciò ha l'ulteriore vantaggio di non scontrarsi con definizioni di sintassi regolari (basate sul tipo di file [estensione file]).


Ottengo 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 il

3
Sebbene l'obiettivo sia dichiarato di non essere in conflitto con le definizioni di sintassi già definite, se lo si desidera è possibile aggiungere containedin=ALLalla fine dell'ultima riga, rendendolo au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL. Trovo la distrazione vale la pena (quando unicode è consentito), la risposta originale qui non non prendere le cose come il codice non-ascii all'interno di una ifdichiarazione ...
svenevs

1
È sempre più sicuro racchiudere il tuo autocmd BufRead ....in un gruppo automatico in vim, a meno che tu non abbia un ottimo motivo per non ...
Cbhihe,

6

Anche questa regex funziona. È stato il primo hit di Google per "rimuovere i caratteri non ascii" da briceolion.com e con :set hlsearchevidenzierà:

/[^[:alnum:][:punct:][:space:]]/

1
La domanda è porre in evidenza i caratteri non ascii, non rimuoverli .
Chutsu,

1
Grazie per averlo sottolineato, ho modificato la mia risposta. Non è stato molto difficile vedere che questa regex risponde anche alla domanda in un modo diverso dalle altre risposte. La mia risposta originale è stata quella :%s/[^[:alnum:][:punct:][:space:]]//gcche prima evidenzia, poi sostituisce.
Grant Bowman,

4

Se sei interessato anche ai caratteri non stampabili , usa questo:/[^\x00-\xff]/

Lo uso in una funzione:

 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

La tua funzione non funziona qui, non si evidenzia e rovina anche la codifica. Perché stai modificando la codifica locale?
Werner,

Prova a passare enca fenc. Ho cambiato la codifica perché la mia codifica predefinita è (era nel 2013) latin1. La funzione non evidenzia i caratteri non stampabili se il set di caratteri è latino1. Per vedere l'evidenziazione devi avere la chiave ERRORnel tuo file di sintassi del colore. Questo è mio:hi Error guifg=Black guibg=Orange
Reman,

2

Sulla base delle altre risposte su questo argomento e della risposta che ho ricevuto qui, l' ho aggiunto al mio .vimrc, in modo da poter controllare l'evidenziazione non ascii digitando <C-w>1. Mostra anche i commenti interni, sebbene sia necessario aggiungere il gruppo di commenti per ogni sintassi del file che verrà utilizzata. Cioè, se modificherai un file zsh, dovrai aggiungere zshCommentalla riga

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

altrimenti non mostrerà il carattere non ascii (puoi anche impostare contenuta = ALL se vuoi essere sicuro di mostrare caratteri non ascii in tutti i gruppi). Per controllare come viene chiamato il commento su un diverso tipo di file, apri un file del tipo desiderato e inserisci :sysu vim, quindi cerca gli elementi della sintassi per il commento.

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>

1

In qualche modo nessuna delle risposte sopra ha funzionato per me.

Quindi ho usato :1,$ s/[^0-9a-zA-Z,-_\.]//g

Mantiene la maggior parte dei personaggi che mi interessano.


1
Ciò elimina i personaggi, in cui l'operazione ha richiesto l' evidenziazione .
Bernhard Wagner

non intendi [^ 0-9a-zA-Z, \ -_ \.], cioè \ -?
ben26941,

0

Qualcuno ha già risposto alla domanda. Tuttavia, per gli altri che hanno ancora problemi, ecco un'altra soluzione per evidenziare i caratteri non ascii nei commenti (o qualsiasi gruppo di sintassi nell'argomento). Non è il migliore, ma è una soluzione temporanea.

Si può provare:

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

Questo ha mescolato parti di altre soluzioni. È possibile rimuovere contained, ma, dalla documentazione, potrebbe esserci un potenziale problema di ricorrere se stesso (come ho capito). Per visualizzare altri schemi definiti, la syn-containssezione lo contiene.

:help syn-containedin
:help syn-contains 

Problema risolto da: imposta l'elemento su una priorità di evidenziazione più alta su vim

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.