2016-10-06 33 views
1

我目前正在學習俄語,並且在西裏爾字母的編碼中有一個警告:有些看起來完全像ASCII。例。單詞「облако」(雲)既不包含「a」也不包含「o」,但它包含一個「а」和一個「о」。如果還沒有找到,請嘗試啓動瀏覽器搜索對話框,輸入「a」或「o」,使用一些突出顯示的所有功能,然後您會看到「а」和「о」兩者保持黑暗。如何匹配字詞中的特定字母

所以,現在我想在vim中強調這個問題。由於我使用的是混合語言文本文件,因此我不能只突出顯示每個ASCII字母(這很容易),而是希望包含至少一個西裏爾字母的所有單詞中的所有ASCII字母都以錯誤突出顯示。我目前的做法就是用這種匹配:

" Here, I use бакло as a shortcut for the list of all cyrillic letters, 
" this makes this a small self contained example for the word used in the 
" problem desctiption, without having the full list in all lines. 
" To get the file I actually have, run 
" :%s/бакло/ЖжФфЭэЗзЧчБбАаДдВЬвьЪъЫыСсЕеёНнЮюІіКкМмИиЙйПпЛлОоРрЯяГгТтЦцШшЩщХхУу/g 
syn match russianWordOk "[бакло]\+" 

syn match russianWordError "[бакло][a-zA-Z0-9_]\+"hs=s+1 
syn match russianWordError "[a-zA-Z0-9_]\+[бакло]"he=e-1 
syn match russianWordError "[бакло][a-zA-Z0-9_]\+[бакло]"hs=s+1,he=e-1 

然而,像»облaко«(現在是ASCII),高亮仍然將標誌着»обл«爲有效,»一個«爲無效,»к«因爲它不是關鍵字的一部分(它是匹配的russianWordError關鍵字的一部分),最後剩下的»о«再次有效。我想要的是讓整個單詞成爲匹配的russianWordError關鍵字的一部分,但仍然只是將「a」突出顯示爲非法。有沒有辦法,如果是的話,我該如何做到這一點?

回答

2

爲了只匹配全字,裏面換句話說沒有碎片,在\<\>包裹你的模式。這些斷言將基於Vim的'iskeyword'設置,並且應該沒問題。 (或者,您也可以通過\@<=\@=做其他的回顧後和向前斷言。)

syn match russianWordOk "\<[бакло]\+\>" 

我不會通過hs=/he=接近錯誤的ASCII字符的高亮顯示,但通過包含組。首先,找出不好的混合詞。至少有一個西裏爾字母,不管是在開頭,還是在結尾。其餘的是至少一個(即重複\%(...\)\+,否則你將只匹配單錯誤字)ASCII,潛在的其他cyrillics之間:

syn match russianWordBad "\<\%([бакло]*[a-zA-Z0-9_]\)\+[бакло]\+\>" contains=russianWordError 
syn match russianWordBad "\<[бакло]\+\%([a-zA-Z0-9_][бакло]*\)\+\>" contains=russianWordError 

這包含執行的ASCII語法組錯誤突出顯示。由於contained,它只在另一組內匹配(這裏:russianWordBad)。

syn match russianWordError "[a-zA-Z0-9_]" contained 
+0

「\%(」?)的含義是什麼? –

+1

它啓動一個非捕獲組,比'\('更有效。 –

相關問題