vim - 找到 vim 语法区域高亮的正确结束顺序
问题描述
我有一个语法文件:
syn region matlabLoop
\ matchgroup=matlabRepeat
\ start="\<for\>"
\ end="\<end\>"
\ transparent
\ fold
hi def link matlabRepeat Repeat
当我在文件中使用它时,我得到以下信息(在 matlabend
中有多种用途。它可以结束循环/if/switch 语句或用作“数组中的最后一个条目”(在某些其他语言中为-1),所以这里*end*
将用于标记突出显示的单词,注意这些*
符号不在程序中 a end
)
a = rand(1,3); % something like [0.0123145 1 0.545341]
for i = 1:numel(a)
if numel(a(i:*end*)) ==numel(a)
fprintf('i is probably 1')
*end*
end
解决方案
这不能仅适用于该单个matlabLoop
区域。您还需要完整解析包含的if...end
结构;即整个条件块的另一个语法定义。或者您正在扩展现有的$VIMRUNTIME/syntax/matlab.vim
语法脚本(带有折叠)?以下假设(但该解决方案也适用于独立的语法定义)。
该语法脚本为 定义了一个简单的关键字end
,因此它将匹配任何地方。如果你想i:end
从匹配中排除,你需要使匹配更精确,例如使用否定的后向断言(“不能以冒号开头” - 我不知道 Matlab 语法,所以这只是关于技术,而不是完全正确的解决方案)。
这是语法脚本的原始定义:
syn keyword matlabConditional else elseif end if otherwise
为了删除end
,我们必须清除它并重新定义:
syntax clear matlabConditional
syntax keyword matlabConditional else elseif if otherwise
现在我们可以指定更精确的规范,使用:help /\@<!
前面没有冒号的断言,并\<...\>
保持原始定义的关键字边界:
syntax match matlabConditional ":\@<!\<end\>"
如果您认为此扩展通常对语法有用,请向语法脚本作者提交补丁;他的联系信息在该文件的标题中。
推荐阅读
- c# - 多角色授权处理程序 - 仅获取方法角色
- mysql - 在 MySQL 数据库 8.0.17 中选择行日期之间的差异
- javascript - 如何通过内部键的值(在 JS 中)访问嵌套字典的对象?
- swift - 如何将 NSView 定位在另一个 NSView 下方?
- qt - 按下返回登录按钮时窗口不关闭
- spring - SSO Spring Boot 和 keycloak
- firebase-tools - 无法从 git bash 运行 firebase 命令
- node.js - 成功运行 ng-serve 而没有“find module 'ng2-date-countdown'”错误
- vb.net - 关于打开默认浏览器的问题
- python - 是否可以按列名中的值对列进行排序?