Yazım dosyasındaki URL'leri ve e-posta adreslerini yoksay


12

Vim'in HTTP URL'lerini ve e-posta adreslerini yazım hataları olarak işaretlememesinin bir yolu var mı? Veya daha genel olarak, geçerli yazımların normal ifadelerini listelemenin bir yolu mu?

Yanıtlar:


16

Özel sözdizimi kuralları ekleyebilir ve onlara @nospellanahtar kelimeyi verebilirsiniz ; bu, Vim'e bu sözdizimi eşleşmesine yazım denetimi uygulamamasını söyler. Örneğin:

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

Yukarıdaki metin dosyaları ve bazı dosya türleri (işaretleme gibi) için çalışır, ancak tüm dosya türleri için çalışmaz.

Burada oldukça basit bir normal ifade kullandığımı unutmayın; bazı alternatifler için URL'leri metinden nasıl ayrıştırabilirim konusuna bakın .


Diğer dosya türleri için biraz daha fazla iş yapmanız gerekir. Örneğin, pythondosyalar için yorumlar bir pythonComment grupta yer alır /usr/share/vim/vim74/syntax/python.vim:

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

Bunu geçersiz kılmak için şunları yapmamız gerekir:

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

Hüner bizim özel sözdizimi maçı ile bulunabilecek olan önceden eşleştirilmiş sözdizimi maç listesini eklemektir containedin=Bu aramaya Vim söyler UrlNoSpellregex içindepythonComment maçları.

Ayrıca highlight, miras alınmadığından doğru renkleri ayarlamak için de kullanmamız gerekir .

Bunu birkaç yerde yapmanız gerekir, örneğin Python dizeleri için:

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

Doğru sözdizimi vurgulamasını uygulayabilmemiz için 2 farklı sözdizimi eşleme grubuna ihtiyacımız var.

Tabii ki, diğer filestipler için başka containedin=sözdizimi eşleşmeleri kullanmanız gerekiyor ... AFAIK var, "evrensel" bir çözüm yok, ama doğru olanları aramak /usr/share/vim/vim74/syntax/*.vimçok zor olmamalı.


Yukarıdaki komutların hepsinin sözdizimi dosyalarından sonra yürütülmesi gerektiğini unutmayın ; Bunu yapmanın 2 yolu vardır:

  • Bir komuttan veya anahtar eşlemesinden, bunun her seferinde manuel olarak başlatılması gerekir. Örneğin

    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()
    
  • Komutları ~/.vim/after/syntax/[filetype].vim. Vim bu dosyaları alır ve varsayılan sözdizimi dosyalarından sonra yürütür (bkz:) :help after-directory.


3

Martin Tournoij 's aksi mükemmel cevap benim için beklendiği gibi davranmasına başarısız - muhtemelen nedeniyle benim kaldıraç diraol ' ın olağanüstü python-modeeklentisi yerine Python için Vim'ın varsayılan sözdizimi dosyası.

Python yorumları, dizeleri veya docstrings altındaki URI'leri vurgulamaktan kaçınmak python-modeiçin, kullanıcıya özgü ~/.vim/after/syntax/python.vimdosyanıza aşağıdaki özlü tek astarı ekleyin :

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

Bu kadar. Önemli olarak, bunun Martin cevabındaki on iki ayrı çizgiyi tek bir hatta sıkıştırdığını unutmayın . Nasıl? İlköğretim, sevgili Vim tabanlı Watson. Ekleriz:

  • transparentÜst sözdizimi (örneğin, yorumlar, dizeleri) bu çocuk sözdizimi için vurgulamak özelliklerini miras Vim talimatını anahtar kelime. Bu, highlight def linkher bir alt sözdizimi grubu için açıkça yeniden yazım yapmamızı sağlar .
  • containedAnahtar kelime, üst sözdizimi sınırları geçmiş uzanan bu çocuk sözdizimi önlenmesi (örneğin yorumlar için EOL, dizeleri dize sınırlayıcı).
  • Virgülle containedinanahtar kelimeye ayrılmış tüm üst sözdizimi grupları . .*Regex operatör bize akıllıca maç sağlar tüm Python dize sözdizimi grupları (yani pythonString, pythonUniString, pythonRawString, pythonUniRawString, pythonDocstring) minimal ağrı ve maksimal ileri uyumluluk.

Teknik olarak geçerli olmasına rağmen, Martin cevabına gömülü vimscript DRY (Kendinizi Tekrarlama) ilkesini ihlal eder. Daha fazla ayrıntı için bu benzer cevaba da bakınız .

Ama bekleyin ... dahası var.

Büyük Zafer İçin Unasked-for Geliştirmeler

Aslında bir şey yapmaya karar verdim ki Vim'in aşırı saf varsayılan yazım denetimi ve üçüncü taraf eklentileri (örneğin, koşulsuz yazım yerine tüm arabelleği denetleyen tüm arabelleği denetleyen Spelunker) tarafından yeterince rahatsız oldum ... bunun hakkında. </gasp>

Aşağıdaki iyi test edilmiş Vim snippet'i , Python yorumları ve dizelerinde aşağıdakilerin tümünü yazım denetimini akıllıca önler:

  • URI'ler (yukarıdaki gibi).
  • CamelCase tanımlayıcılar.
  • snake_case tanımlayıcılar.
  • UPPERCASE tanımlayıcılar.
  • @- önceden tanımlanmış tanımlayıcılar (ör @muhdecorator.).
  • "-denetelenmiş dosya türü dosya adları (ör "muh_module.py".).
  • :- sınırlandırılmış alt dizeler (örneğin, :func:in: func: `re.sub`).
  • `- sınırlandırılmış alt dizeler (örneğin, re.subin: func:` re.sub`).

Aşağıdakilerin bir kısmını veya tamamını kullanıcıya özgü ~/.vim/after/syntax/python.vimdosyanıza ekleyin ve Vim aslında RightStuff ™ 'ı bir kez kontrol ettiğinden zevkle nefes alın:

" 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

Tabii ki, yukarıdakilerin tümü, kendim de dahil hiç kimsenin koruyamayacağı ve hatta okuyamayacağı, Godzilla benzeri düzenli bir ifadeyle eşleşen tek bir astarla azaltılabilir (ve muhtemelen de). Herkesin akıl sağlığı için bunu yapmadım.

Olan birisi varsa değil bana istiyoruz diğer popüler dillere yukarıda genişleyen eklentisi bir GitHub barındırılan Vim yapmak, bu harika olurdu. Vim'in varsayılan yazım denetimi uygulaması neredeyse orada, millet; sadece açık kaynak topluluğunun yardımına ihtiyacı var.

O zamana kadar StackOverflow her zaman yanınızda olsun!


2
Burada cevaplar yazarken tüm Vim sözdizimini vurgulayan şeyi anladım. Dürüst olmak için ne yaptığımı her zaman bilmiyordum, bu yüzden özellikle bazı eski cevaplar optimalden daha az olabilir
Martin

Çok mütevazısın Martin. "Buzları kırmak" cevabınız olmasaydı, ben ve daha pek çoğu nereden başlayacağımı bile bilemezdik. Bu editör partisini başlattığınız için teşekkürler! Roma bir günde inşa edilmemiş olabilir, ama en azından şimdi bir kontrol edebiliriz.
Cecil Curry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.