Ignoruj ​​adresy URL i adresy e-mail w pliku pisowni

12

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?

noffle
źródło

Odpowiedzi:

16

Możesz dodać niestandardowe reguły składniowe i podać im @nospellsł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 pythonplikó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ć UrlNoSpellregex w tych pythonCommentmeczach.

Musimy również użyć, highlightaby 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/*.vimpowinno 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
źródło
3

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-modewtyczki 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.vimplik 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:

  • Słowo transparentkluczowe, 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 linkdla każdej podrzędnej grupy składni.
  • Słowo containedkluczowe, 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).
  • Wszystkie nadrzędne grupy składniowe rozdzielane przecinkami do containedinsł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.

Unasked-for Improvements for Great Glory

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:

  • URI (jak wyżej).
  • 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`).
  • `-delimitowane podciągi (np. re.subin: func:` re.sub`).

Dodaj niektóre lub wszystkie z poniższych do ~/.vim/after/syntax/python.vimpliku 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ą!

Cecil Curry
źródło
2
W pewnym sensie doszedłem do tego, podkreślając składnię Vima, pisząc tutaj odpowiedzi. Szczerze mówiąc, nie zawsze wiedziałem, co robię, więc niektóre starsze odpowiedzi mogą być mniej niż optymalne 😅
Martin Tournoij
Jesteś zbyt skromny, Martin. Bez twojej odpowiedzi „przełamać lody” ja i wielu innych nie wiedziałbym nawet, od czego zacząć. Dziękujemy za rozpoczęcie tej imprezy dla redaktorów! Rzym mógł nie zostać zbudowany w ciągu jednego dnia, ale przynajmniej możemy to sprawdzić w jednym.
Cecil Curry