Ignorieren Sie URLs und E-Mail-Adressen in der Zauberdatei

11

Gibt es eine Möglichkeit, dass vim HTTP-URLs und E-Mail-Adressen nicht als Rechtschreibfehler kennzeichnet? Oder allgemeiner eine Möglichkeit, Regexe gültiger Schreibweisen aufzulisten?

noffle
quelle

Antworten:

14

Sie können benutzerdefinierte Syntaxregeln hinzufügen und ihnen das @nospellSchlüsselwort geben. Dadurch wird Vim angewiesen, die Rechtschreibprüfung nicht auf diese Syntaxübereinstimmung anzuwenden. Zum Beispiel:

:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell

Das Obige funktioniert für Textdateien und einige Dateitypen (z. B. Markdown), jedoch nicht für alle Dateitypen.

Beachten Sie, dass ich hier einen ziemlich einfachen regulären Ausdruck verwendet habe. Einige Alternativen finden Sie unter Wie analysiere ich URLs aus dem Text?


Für andere Dateitypen müssen Sie etwas mehr arbeiten. Beispielsweise sind für pythonDateien Kommentare in einer pythonComment Gruppe enthalten, von /usr/share/vim/vim74/syntax/python.vim:

syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell

Um dies zu überschreiben, müssen wir Folgendes tun:

:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment

Der Trick besteht darin, eine Liste zuvor übereinstimmender Syntaxübereinstimmungen hinzuzufügen, in denen unsere benutzerdefinierte Syntaxübereinstimmung enthalten sein kann. containedin=Dies weist Vim an, nach dem UrlNoSpellregulären Ausdruck in den pythonCommentÜbereinstimmungen zu suchen .

Wir müssen auch verwenden highlight, um die richtigen Farben festzulegen, da diese nicht vererbt werden.

Sie müssen dies an mehreren Stellen tun, beispielsweise für Python-Zeichenfolgen:

:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String

Wir benötigen 2 verschiedene Syntax-Übereinstimmungsgruppen, damit wir die richtige Syntaxhervorhebung anwenden können.

Natürlich müssen Sie für andere Dateitypen andere containedin=Syntaxübereinstimmungen verwenden ... Es gibt, AFAIK, keine "universelle" Lösung, aber das Nachschlagen der richtigen /usr/share/vim/vim74/syntax/*.vimsollte nicht allzu schwierig sein.


Beachten Sie, dass alle oben genannten Befehle nach den Syntaxdateien ausgeführt werden müssen . Es gibt zwei Möglichkeiten, dies zu tun:

  • Bei einer Befehls- oder Schlüsselzuordnung muss dies jedes Mal manuell aufgerufen werden. z.B

    fun! NoUrlSpell()
        if &filetype == 'python'
            :syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
            :highlight def link UrlNoSpellComment Comment
            :syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
            :highlight def link UrlNoSpellString String
        elseif &filetype == 'ruby'
            " ...
        else
            syn match   pythonComment   "#.*$" contains=pythonTodo,@Spell
        endif
    endfun
    command NoUrlSpell :call NoUrlSpell()
    
  • Geben Sie die Befehle in das Feld ein ~/.vim/after/syntax/[filetype].vim. Vim nimmt diese Dateien auf und führt sie nach den Standard-Syntaxdateien aus (siehe :) :help after-directory.

Martin Tournoij
quelle