Ignora URL e indirizzi e-mail nel file ortografico


12

C'è un modo per avere vim non contrassegnare URL HTTP e indirizzi e-mail come errori di ortografia? O, più in generale, un modo per elencare regex di ortografia valida?

Risposte:


16

Puoi aggiungere regole di sintassi personalizzate e dare loro la @nospellparola chiave, questo dirà a Vim di non applicare il controllo ortografico a questa corrispondenza di sintassi. Per esempio:

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

Quanto sopra funzionerà per file di testo e alcuni tipi di file (come markdown), ma non per tutti i tipi di file.

Nota che ho usato una regex abbastanza semplice qui; vedi Come posso analizzare gli URL dal testo per alcune alternative.


Per altri tipi di file, devi fare un po 'più di lavoro. Ad esempio, per i pythonfile, i commenti sono contenuti in un pythonComment gruppo, da /usr/share/vim/vim74/syntax/python.vim:

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

Per ignorare questo, dobbiamo fare:

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

Il trucco è aggiungere un elenco di corrispondenze di sintassi precedentemente abbinate in cui la nostra corrispondenza di sintassi personalizzata può essere contenuta in containedin=Questo dice a Vim di cercare la UrlNoSpellregex all'interno delle pythonCommentcorrispondenze.

Dobbiamo anche utilizzare highlightper impostare i colori corretti, poiché questi non sono ereditati.

Devi farlo in diversi punti, ad esempio per le stringhe Python:

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

Sono necessari 2 diversi gruppi di corrispondenza della sintassi in modo da poter applicare l'evidenziazione della sintassi corretta.

Ovviamente, per altri tipi di file è necessario utilizzare altre containedin=corrispondenze di sintassi ... Non esiste AFAIK, nessuna soluzione "universale", ma cercare quelle corrette /usr/share/vim/vim74/syntax/*.vimnon dovrebbe essere troppo difficile.


Si noti che tutti i comandi sopra devono essere eseguiti dopo i file di sintassi; ci sono 2 modi per farlo:

  • Da un comando o un mapping dei tasti, questo deve essere invocato manualmente ogni volta. per esempio

    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()
    
  • Inserisci i comandi in ~/.vim/after/syntax/[filetype].vim. Vim raccoglierà questi file e li eseguirà dopo i file di sintassi predefiniti (vedi:) :help after-directory.


3

Martin Tournoij 'il contrario risposta eccellente non riesce a comportarsi come previsto per me - probabilmente a causa della mia leva diraol ' s fenomenale python-modeplug-in piuttosto che file di sintassi di default di Vim per Python.

Per evitare di evidenziare gli URI nei commenti, nelle stringhe o nei documenti di Python in python-mode, aggiungi il seguente concatenamento one-liner al tuo ~/.vim/after/syntax/python.vimfile specifico dell'utente:

syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell

Questo è tutto. Fondamentalmente, nota che questo comprime quelle che sarebbero state dodici righe separate nella risposta di Martin in un'unica riga. Come? Elementare, il mio caro Watson basato su Vim. Noi aggiungiamo:

  • La transparentparola chiave, che indica a Vim di ereditare le proprietà di evidenziazione per questa sintassi figlio dalla sintassi principale (ad es. Commenti, stringhe). Questo ci consente di evitare di ripetere esplicitamente il riposizionamento highlight def linkper ciascun gruppo di sintassi figlio.
  • La containedparola chiave, che impedisce a questa sintassi figlio di estendersi oltre i limiti della sintassi principale (ad esempio, EOL per i commenti, delimitatori di stringa per le stringhe).
  • Tutti i gruppi di sintassi principali delimitati da virgole alla containedinparola chiave. L' .*operatore regex consente di abbinare abilmente tutti i gruppi di sintassi stringa Python (cioè pythonString, pythonUniString, pythonRawString, pythonUniRawString, pythonDocstring) con dolore minimo e massima compatibilità in avanti.

Sebbene tecnicamente valido, il vimscript incorporato nella risposta di Martin viola il principio DRY (Don't Repeat Yourself). Vedi anche questa risposta simile per ulteriori dettagli .

Ma aspetta ... c'è di più.

Miglioramenti non richiesti per la grande gloria

Sono sufficientemente infastidito da entrambi di Vim eccessivamente ingenui controllo ortografico predefinito e plugin di terze parti (ad esempio, Spelunker , che incondizionatamente magia controlli l'intero buffer piuttosto che limitarsi a commenti del codice e archi) che ho deciso ... di fare in realtà qualcosa a tale proposito. </gasp>

Il frammento di Vim ben collaudato di seguito evita in modo intelligente il controllo ortografico di tutto quanto segue nei commenti e nelle stringhe di Python:

  • URI (come sopra).
  • CamelCase identificatori.
  • snake_case identificatori.
  • UPPERCASE identificatori.
  • @-identificatori prefissati (ad es @muhdecorator.).
  • "-delimitati nomi di file filetyped (ad esempio, "muh_module.py").
  • :sottostringhe delimitate (ad es. :func:in: func: `re.sub`).
  • `sottostringhe delimitate (ad es. re.subin: func:` re.sub`).

Aggiungi alcune o tutte le seguenti informazioni al tuo ~/.vim/after/syntax/python.vimfile specifico dell'utente e rimani a bocca aperta mentre Vim controlla l'ortografia di RightStuff ™ per una volta:

" Avoid spell checking URIs.
syntax match NoSpellPythonUri /\v\w+:\/\/[^[:space:]]+/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking both CamelCase-formatted identifiers and uppercase
" identifiers. Since most languages (excluding Raku) prohibit Unicode in
" identifiers, these matches are intentionally confined to ASCII codepoints
" (e.g., "[A-Z]" rather than "[[:upper:]]").
syntax match NoSpellPythonCaps /\v<[A-Z]([A-Z0-9]{-1,}|[a-z0-9]+[A-Z0-9].{-})>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking snake_case-formatted identifiers.
syntax match NoSpellPythonSnake /\v<\w+_.{-1,}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking "@"-prefixed identifiers.
syntax match NoSpellPythonDecorator /\v\@[a-zA-Z].{-}>/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking ":"-delimited substrings.
syntax match NoSpellPythonColons /\v:[^:]+:/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking "`"-delimited substrings.
syntax match NoSpellPythonTicks /\v`[^`]+`/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

" Avoid spell checking '"'-delimited filetyped filenames matched as a
" double-quoted substring containing a filename prefix, a period, and one to
" four characters comprising a filetype.
syntax match NoSpellPythonPath /\v"[^"]+.[^"]{1,4}"/ transparent contained containedin=pythonComment,python.*String contains=@NoSpell

Naturalmente, tutto quanto sopra potrebbe (e forse dovrebbe) essere ridotto a una sola riga corrispondente a un'espressione regolare simile a Godzilla che nessuno, incluso me stesso, sarebbe mai in grado di mantenere o persino leggere. Per la sanità mentale di tutti, non l'ho fatto.

Se qualcuno che non sono io desidera creare un plug-in Vim ospitato da GitHub espandendo quanto sopra in altre lingue popolari, sarebbe semplicemente fantastico. L'implementazione predefinita del controllo ortografico di Vim è quasi lì, gente; ha solo bisogno di una mano dalla comunità open source.

Fino ad allora, StackOverflow sarà sempre con te!


2
Ho capito un po 'tutta questa sintassi di Vim evidenziando le cose mentre scrivevo le risposte qui. Non sempre sapevo cosa stavo facendo per essere onesto, quindi in particolare alcune delle risposte più vecchie potrebbero essere meno che ottimali 😅
Martin Tournoij

Sei troppo modesto, Martin. Senza la tua risposta "rompere il ghiaccio", io e molti altri non avremmo nemmeno saputo da dove cominciare. Grazie per aver iniziato questa festa degli editori! Roma potrebbe non essere stata costruita in un giorno, ma almeno possiamo fare un controllo ortografico in uno adesso.
Cecil Curry
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.