Risposte:
Puoi aggiungere regole di sintassi personalizzate e dare loro la
@nospell
parola 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 python
file, 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
UrlNoSpell
regex all'interno delle pythonComment
corrispondenze.
Dobbiamo anche utilizzare highlight
per 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/*.vim
non 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
.
Martin Tournoij 'il contrario risposta eccellente non riesce a comportarsi come previsto per me - probabilmente a causa della mia leva diraol ' s fenomenale python-mode
plug-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.vim
file 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:
transparent
parola 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 link
per ciascun gruppo di sintassi figlio.contained
parola 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).containedin
parola 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ù.
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:
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`).re.sub
in: func:` re.sub`).Aggiungi alcune o tutte le seguenti informazioni al tuo ~/.vim/after/syntax/python.vim
file 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!