Wie bringt man Vim dazu, Nicht-ASCII-Zeichen hervorzuheben?

152

Ich versuche, Vim dazu zu bringen, Nicht-ASCII-Zeichen hervorzuheben. Gibt es eine verfügbare Einstellung, ein Regex-Suchmuster oder ein Plugin dafür?

Chutsu
quelle

Antworten:

290

Wenn []Sie bei Ihrer Suche den Bereich in einer Zeichenklasse verwenden, sollten Sie in der Lage sein , den hexadezimalen ASCII-Zeichenbereich auszuschließen und daher hlsearchalle anderen Zeichen außerhalb des ASCII-Bereichs hervorzuheben (vorausgesetzt, Sie haben sie aktiviert) :

/[^\x00-\x7F]

Dies führt zu einer negativen Übereinstimmung (via [^]) für Zeichen zwischen ASCII 0x00und ASCII 0x7F(0-127) und scheint in meinem einfachen Test zu funktionieren. Erweitern Sie für erweitertes ASCII natürlich den Bereich auf \xFFanstatt zu \x7Fverwenden /[^\x00-\xFF].

Sie können es auch dezimal ausdrücken über \d:

/[^\d0-\d127]

Wenn Sie etwas Spezifischeres benötigen, z. B. den Ausschluss nicht druckbarer Zeichen, müssen Sie diese Bereiche zur Zeichenklasse hinzufügen [].

Michael Berkowski
quelle
14
In Dezimalzahl:/[^\d0-\d127]
Bohr
@Bohr Das ist eine schöne Ergänzung. Ich werde es oben bearbeiten.
Michael Berkowski
großartig! hat den Tag gerettet! Eines der Einrückungszeichen wurde in meinen Python-Code eingefügt, und der Unicode-Fehler hat mich umgebracht. war unter den gleichen Zeichen, die vom Vim-Plugin verwendet wurden, schwer zu erkennen!
kollery
36

Ja, es gibt eine native Funktion zum Hervorheben von übereinstimmenden Zeichenfolgen. Machen Sie in Vim Folgendes:

:help highlight
:help syn-match

syn-match definiert eine Zeichenfolge, die zu einer Gruppe passt. highlightdefiniert die von der Gruppe verwendete Farbe. Denken Sie nur an die Syntaxhervorhebung für Ihre vimrc-Dateien.

Sie können also die folgenden Befehle in Ihrer .vimrc-Datei verwenden:

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
Steven Ding
quelle
Sie müssen die :Befehle in Ihrem vimrc nicht vor Befehle stellen.
FDinoff
termbgscheint in VIM 7.3, wie es auf Ubuntu Server 12.10 installiert ist, kein legaler Befehl zu sein.
Dotancohen
4
Dann termbgscheint dies kein legaler Parameter in VIM 7.3 zu sein, wie er auf Ubuntu Server 12.10 installiert ist.
Dotancohen
In der Tat kann ein normales Terminal termkeine Hintergrundfarbe haben, während ein Farbterminal dies ctermkann.
Dima Tisnek
termbg wurde entfernt, aber Sie können ctermfg, guifg usw. hinzufügen, um auch den Vordergrund zu steuern.
fatal_error
16

Für andere (von nun an weniger unglückliche) Leute, die über eine Suchmaschine hier landen und das Hervorheben von Nicht-ASCII-Zeichen nicht erreichen können, versuchen Sie Folgendes (fügen Sie dies in Ihre .vimrc ein):

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

Dies hat den zusätzlichen Vorteil, dass es nicht mit regulären (auf Dateityp [Dateierweiterung] basierenden) Syntaxdefinitionen kollidiert.

PAStheLoD
quelle
Ich bekomme 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
Obwohl das Ziel angegeben ist, nicht mit bereits definierten Syntaxdefinitionen in Konflikt zu stehen, können Sie es am Ende der letzten Zeile hinzufügen , wenn Sie dies möchten . Ich finde die Ablenkung wert (wenn Unicode erlaubt ist), die ursprüngliche Antwort hier fängt keine Dinge wie Nicht-ASCII-Code in einer Anweisung ein ...containedin=ALLau BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALLif
svenevs
1
Es ist immer sicherer, Ihre autocmd BufRead ....in eine Autogruppe in vim einzuschließen, es sei denn, Sie haben einen sehr guten Grund, nicht ...
Cbhihe
6

Dieser Regex funktioniert auch. Es war der erste Google-Hit für "vim entferne Nicht-ASCII-Zeichen" von briceolion.com und mit :set hlsearchwird hervorgehoben:

/[^[:alnum:][:punct:][:space:]]/
Grant Bowman
quelle
1
Die Frage lautet, Nicht-ASCII-Zeichen hervorzuheben und nicht zu entfernen .
Chutsu
1
Vielen Dank für den Hinweis, ich habe meine Antwort bearbeitet. Es war nicht schwer zu sehen, dass dieser Regex die Frage auch auf eine Weise beantwortet, die sich von anderen Antworten unterscheidet. Meine ursprüngliche Antwort war, :%s/[^[:alnum:][:punct:][:space:]]//gcwelche zuerst hervorhebt und dann ersetzt.
Grant Bowman
4

Wenn Sie sich auch für das nicht druckbare interessieren Zeichen verwenden Sie dieses:/[^\x00-\xff]/

Ich benutze es in einer Funktion:

 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
quelle
Ihre Funktion funktioniert hier nicht, sie wird nicht hervorgehoben und die Codierung wird ebenfalls durcheinander gebracht. Warum ändern Sie die lokale Codierung?
Werner
Versuche zu ändern enc zu fenc. Ich habe die Codierung geändert, da meine Standardcodierung latin1 ist (war 2013). Die Funktion hebt die nicht druckbaren Zeichen nicht hervor, wenn der Zeichensatz latin1 ist. Um die Hervorhebung zu sehen, müssen Sie den Schlüssel ERRORin Ihrer Farbsyntaxdatei haben. Dies ist meins:hi Error guifg=Black guibg=Orange
Reman
2

Basierend auf den anderen Antworten zu diesem Thema und der Antwort, die ich hier erhalten habe, habe ich diese zu meiner hinzugefügt .vimrc, damit ich die Hervorhebung ohne ASCII durch Eingabe steuern kann <C-w>1. Es werden auch interne Kommentare angezeigt, obwohl Sie die Kommentargruppe für jede verwendete Dateisyntax hinzufügen müssen. Das heißt, wenn Sie eine zsh-Datei bearbeiten, müssen Sie zshCommentsie der Zeile hinzufügen

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

Andernfalls wird das Nicht-ASCII-Zeichen nicht angezeigt (Sie können auch enthalten in = ALL festlegen, wenn Sie sicherstellen möchten, dass Nicht-ASCII-Zeichen in allen Gruppen angezeigt werden). Um zu überprüfen, wie der Kommentar für einen anderen Dateityp aufgerufen wird, öffnen Sie eine Datei des gewünschten Typs, geben Sie :syvim ein und suchen Sie in den Syntaxelementen nach dem Kommentar.

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
quelle
1

Irgendwie hat keine der oben genannten Antworten für mich funktioniert.

Also habe ich benutzt :1,$ s/[^0-9a-zA-Z,-_\.]//g

Es behält die meisten Charaktere, die mich interessieren.

user2250246
quelle
1
Dadurch werden die Zeichen gelöscht , bei denen die Operation zum Hervorheben aufgefordert wurde .
Bernhard Wagner
meinst du nicht [^ 0-9a-zA-Z, \ -_ \.], dh \ -?
Ben26941
0

Jemand hat die Frage bereits beantwortet. Für andere, die immer noch Probleme haben, ist hier eine andere Lösung, um Nicht-ASCII-Zeichen in Kommentaren (oder einer anderen Syntaxgruppe in der Angelegenheit) hervorzuheben. Es ist nicht das Beste, aber es ist eine vorübergehende Lösung.

Man kann versuchen:

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

Dies hat Mischteile aus anderen Lösungen. Sie können entfernen contained, aber aus der Dokumentation kann es ein potenzielles Problem geben, sich selbst zu rekursieren (wie ich verstehe). Um andere definierte Muster anzuzeigen, syn-containswürde der Abschnitt diese enthalten.

:help syn-containedin
:help syn-contains 

Repliziertes Problem von: Setzen Sie das Element auf vim auf eine höhere Hervorhebungspriorität

nate
quelle