Czy istnieje sposób, aby vim nie oznaczał adresów URL HTTP i adresów e-mail jako błędów pisowni? Lub, bardziej ogólnie, sposób na wyliczenie wyrażeń regularnych prawidłowych pisowni?
Czy istnieje sposób, aby vim nie oznaczał adresów URL HTTP i adresów e-mail jako błędów pisowni? Lub, bardziej ogólnie, sposób na wyliczenie wyrażeń regularnych prawidłowych pisowni?
Możesz dodać niestandardowe reguły składniowe i podać im
@nospell
słowo kluczowe, co powie Vimowi, aby nie stosował sprawdzania pisowni w tym dopasowaniu składni. Na przykład:
:syn match UrlNoSpell "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell
Powyższe będzie działać dla plików tekstowych i niektórych rodzajów plików (takich jak markdown), ale nie dla wszystkich rodzajów plików.
Zauważ, że użyłem tutaj dość prostego wyrażenia regularnego; zobacz Jak parsować adresy URL z tekstu w celu uzyskania alternatyw.
W przypadku innych typów plików musisz wykonać nieco więcej pracy. Na przykład w przypadku python
plików komentarze są zawarte w pythonComment
grupie z /usr/share/vim/vim74/syntax/python.vim
:
syn match pythonComment "#.*$" contains=pythonTodo,@Spell
Aby to zmienić, musimy wykonać:
:syn match UrlNoSpellComment "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonComment
:highlight def link UrlNoSpellComment Comment
Sztuką jest, aby dodać listę uprzednio dopasowanych meczów składniowych, w którym nasz zwyczaj mecz składnia może być zawarta z containedin=
Mówi Vima szukać
UrlNoSpell
regex w tych pythonComment
meczach.
Musimy również użyć, highlight
aby ustawić prawidłowe kolory, ponieważ nie są one dziedziczone.
Musisz to zrobić w wielu miejscach, na przykład dla ciągów Python:
:syn match UrlNoSpellString "\w\+:\/\/[^[:space:]]\+" contains=@NoSpell containedin=pythonString
:highlight def link UrlNoSpellString String
Potrzebujemy 2 różnych grup dopasowania składni, abyśmy mogli zastosować poprawne podświetlanie składni.
Oczywiście, dla innych typów plików musisz użyć innych containedin=
dopasowań składni ... Nie ma, AFAIK, żadnego „uniwersalnego” rozwiązania, ale wyszukiwanie właściwych nie /usr/share/vim/vim74/syntax/*.vim
powinno być zbyt trudne.
Zauważ, że wszystkie powyższe polecenia muszą zostać wykonane po plikach składni; można to zrobić na 2 sposoby:
Z polecenia lub mapowania klucza należy to wywoływać ręcznie za każdym razem. na przykład
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()
Umieść polecenia w ~/.vim/after/syntax/[filetype].vim
. Vim pobierze te pliki i uruchomi je po domyślnych plikach składniowych (patrz
:help after-directory
:).
Martin Tournoij „s inaczej doskonała odpowiedź nie zachowują się zgodnie z oczekiwaniami dla mnie - prawdopodobnie ze względu na mój dźwigni diraol ” s fenomenalny python-mode
wtyczki zamiast domyślnego pliku składnia Vima dla Pythona.
Aby uniknąć wyróżniania identyfikatorów URI w komentarzach, ciągach lub ciągach dokumentów Pythona poniżej python-mode
, dodaj następujący zwięzły jednowarstwowy ~/.vim/after/syntax/python.vim
plik specyficzny dla użytkownika :
syntax match NoSpellUriPython '\w\+:\/\/[^[:space:]]\+' transparent contained containedin=pythonComment,python.*String contains=@NoSpell
Otóż to. Co najważniejsze, należy zauważyć, że kompresuje to, co byłoby dwunastoma oddzielnymi liniami w odpowiedzi Martina, w jedną linię. W jaki sposób? Elementary, mój drogi Watsonie z Vima. Dodajemy:
transparent
kluczowe, instruujące Vima, aby odziedziczył właściwości podświetlenia tej składni potomnej po składni macierzystej (np. Komentarze, ciągi znaków). Pozwala nam to uniknąć jawnego przekształcania highlight def link
dla każdej podrzędnej grupy składni.contained
kluczowe, które zapobiega przekraczaniu przez tę składnię potomną granic jej macierzystej składni (np. EOL dla komentarzy, ograniczniki ciągów dla łańcuchów).containedin
słowa kluczowego. .*
Operator regex pozwala nam umiejętnie dopasować wszystkie grupy składniowe Python String (czyli pythonString
, pythonUniString
, pythonRawString
, pythonUniRawString
, pythonDocstring
) przy minimalnym bólu i maksymalną kompatybilność w przód.Mimo że technicznie poprawny, vimscript osadzony w odpowiedzi Martina narusza zasadę DRY (Don't Repeat Yourself). Zobacz także tę podobną odpowiedź, aby uzyskać więcej informacji .
Ale czekaj ... jest więcej.
Jestem wystarczająco zirytowany zarówno zbyt naiwnym domyślnym sprawdzaniem pisowni przez Vima, jak i wtyczkami innych firm (np. Spelunker , który bezwarunkowo sprawdza cały bufor, a nie tylko koduje komentarze i ciągi znaków), że postanowiłem ... faktycznie zrobić coś o tym. </gasp>
Dobrze przetestowane Vim snippet poniżej inteligentnie unika sprawdzanie pisowni wszystkich następujących ciągu Pythona komentarze i ciągów:
CamelCase
identyfikatory.snake_case
identyfikatory.UPPERCASE
identyfikatory.@
-prefiksowane identyfikatory (np @muhdecorator
.)."
-delimitowane nazwy plików (np "muh_module.py"
.).:
-delimitowane podciągi (np. :func:
in: func: `re.sub`).re.sub
in: func:` re.sub`).Dodaj niektóre lub wszystkie z poniższych do ~/.vim/after/syntax/python.vim
pliku specyficznego dla użytkownika i z trudem łapie oddech, gdy pisownia Vima sprawdza raz RightStuff ™:
" 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
Oczywiście, wszystkie powyższe można (i prawdopodobnie należy) sprowadzić do pojedynczego linijki pasującej do wyrażenia regularnego podobnego do Godzilli, którego nikt w tym ja nie byłby w stanie utrzymać ani nawet przeczytać. Dla zdrowia psychicznego nie zrobiłem tego.
Jeśli ktoś, kto nie jest mną, chciałby stworzyć wtyczkę Vima hostowaną przez GitHub, rozszerzającą powyższe na inne popularne języki, byłoby świetnie. Domyślnie implementacja sprawdzania pisowni Vima jest już prawie gotowa, ludzie; potrzebuje tylko pomocną dłoń społeczności open-source.
Do tego czasu niech StackOverflow będzie zawsze z Tobą!