如何匹配单词中的特定字母

时间:2016-10-06 07:28:05

标签: vim vim-syntax-highlighting

我目前正在学习俄语,西里尔字母的编码有一点需要注意:有些看起来与ASCII完全相同。例。单词»облако«(云)既不包含“a”也不包含“o”,而是包含»а«和»о«。如果您尚未获得它,请尝试启动浏览器搜索对话框,输入»a«或»o«,使用一些突出显示所有功能,您将看到»а«和»о«两者保持黑暗。

所以,现在我想在vim中强调这个问题。由于我使用的是混合语言文本文件,我不能只突出显示每个ASCII字母(这很容易),而是希望所有包含至少一个西里尔字母的单词中的所有ASCII字母都突出显示错误。我目前的做法是使用这些匹配:

C:\oracleweblogic>java -jar fmw_12.2.1.1.0_wls_quick.jar
Launcher log file is C:\Users\ANANT\AppData\Local\Temp\OraInstall2016-10-06_12-4
6-22PM\launcher2016-10-06_12-46-22PM.log.
Extracting the installer . . . . . . . . . . . . . . . . . . . . . . . . . . . .
 . . . . . . . . . . . . . Done
Checking if CPU speed is above 300 MHz.   Actual 1696    Passed
Checking swap space: must be greater than 512 MB    Passed
Checking if this platform requires a 64-bit JVM.   Actual 64    Passed (64-bit n
ot required)
Checking temp space: must be greater than 300 MB.   Actual 42253 MB    Passed


Preparing to launch the Oracle Universal Installer from C:\Users\ANANT\AppData\L
ocal\Temp\OraInstall2016-10-06_12-46-22PM
Log: C:\Users\ANANT\AppData\Local\Temp\OraInstall2016-10-06_12-46-22PM\install20
16-10-06_12-46-22PM.log

*****************************************************


Distribution Name : Oracle Fusion Middleware 12c WebLogic and Coherence Develope
r
Distribution Version : 12.2.1.1.0

Oracle Home : C:\oracleweblogic\wls12210
Java Home : C:\Program Files\Java\jdk1.8.0_45

Note: Oracle Home not supplied (defaulted to <present working dir>\wls12210)

*****************************************************

Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
Skipping Software Updates
Starting check : CertifiedVersions
Expected result: One of 6.1,6.2,6.3,10.0
Actual Result: 6.3
Check complete. The overall result of this check is: Passed
CertifiedVersions Check: Success.

然而,就像在»облaко«(现在是ASCII)一样,突出显示仍然会将»обл«标记为有效,»a«标记为无效,»к«不作为关键字的一部分(它是匹配russianWordError关键字),最后剩余的»о«再次有效。我想要的是让整个单词成为匹配的russianWordError关键字的一部分,但仍然只有“a”被突出显示为非法。有没有办法,如果有,我该如何实现?

1 个答案:

答案 0 :(得分:2)

为了只匹配整个单词,而不是其他单词中的片段,请将您的模式包装在\<\>中。这些断言将基于Vim的'iskeyword'设置,应该没问题。 (或者,您可以通过\@<=\@=执行其他lookbehind和lookahead断言。)

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

我会通过hs= / he=来突出显示错误的ASCII字符,而是通过包含的组。首先,找出不好的混合词。必须至少有一封西里尔字母,无论是在开头还是在结尾。其余的至少有一个(即重复\%(...\)\+,否则你只会匹配单错误词)ASCII,其间可能是其他西里尔字母:

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