【问题标题】:find the correct end sequence for vim syntax region highlight找到 vim 语法区域高亮的正确结束序列
【发布时间】:2019-04-05 17:00:49
【问题描述】:

我有一个语法文件:

syn region matlabLoop
            \ matchgroup=matlabRepeat
            \ start="\<for\>"
            \ end="\<end\>"
            \ transparent
            \ fold
hi def link matlabRepeat        Repeat

当我在文件中使用它时,我得到以下信息(在 matlab 中 end 有多种用途。它可以结束循环/if/switch 语句或用作“数组中的最后一个条目”(-1在其他一些语言中),所以这里*end*将用于标记突出显示的单词,注意*符号不在程序中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

【问题讨论】:

    标签: vim syntax-highlighting vim-syntax-highlighting


    【解决方案1】:

    这不适用于单个 matlabLoop 区域。您还需要完整解析包含的if...end 结构;即整个条件块的另一个语法定义。或者您正在扩展现有的$VIMRUNTIME/syntax/matlab.vim 语法脚本(带折叠)?以下假设(但该解决方案也适用于独立的语法定义)。

    该语法脚本为end 定义了一个简单的关键字,因此它将匹配任何地方。如果要从匹配中排除 i:end,则需要使匹配更精确,例如带有否定的lookbehind断言(“前面不能有冒号”——我不懂Matlab语法,所以这只是对技术的建议,而不是完全正确的解决方案)。

    这是来自语法脚本的原始定义:

    syn keyword matlabConditional       else elseif end if otherwise
    

    为了删除end,我们必须清除它并重新定义:

    syntax clear matlabConditional
    syntax keyword matlabConditional else elseif if otherwise
    

    现在我们可以指定更精确的规范,使用:help /\@&lt;! 表示前面没有冒号,使用\&lt;...\&gt; 保持原始定义的关键字边界:

    syntax match matlabConditional ":\@<!\<end\>"
    

    如果您认为此扩展通常对语法有用,请向语法脚本作者提交补丁;他的联系信息在该文件的标题中。

    【讨论】:

    • 我正在开发一个基于 1.2 of the matlab syntax 版本的新语法文件,因为这比 vim 安装中包含的要好一些。我正在添加语法折叠,我遇到了很大的麻烦,错误的末端被检测为这些折叠的末端
    猜你喜欢
    • 2015-10-19
    • 2020-04-08
    • 2012-08-16
    • 1970-01-01
    • 2015-12-17
    • 2014-11-14
    • 2023-03-19
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多