Yanıtlar:
Özel sözdizimi kuralları ekleyebilir ve onlara @nospell
anahtar 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, python
dosyalar 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
UrlNoSpell
regex 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
.
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-mode
eklentisi yerine Python için Vim'ın varsayılan sözdizimi dosyası.
Python yorumları, dizeleri veya docstrings altındaki URI'leri vurgulamaktan kaçınmak python-mode
için, kullanıcıya özgü ~/.vim/after/syntax/python.vim
dosyanı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 link
her bir alt sözdizimi grubu için açıkça yeniden yazım yapmamızı sağlar .contained
Anahtar 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ı).containedin
anahtar 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.
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:
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`).re.sub
in: func:` re.sub`).Aşağıdakilerin bir kısmını veya tamamını kullanıcıya özgü ~/.vim/after/syntax/python.vim
dosyanı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!