当YAML映射键包含空格时,我该如何让Vim进行高亮显示?

3

我正在使用 Ubuntu Linux 上的 Vim 7.3。

当我编辑 YAML 文件时

This:
    fnordy fnord: fnord
    fnords: super fnord

"fnords"将被着色,但"fnordy fnords"不会。 fnords then fnordy fnord fnordy fnord then fnord 如何解决这个问题?我查看了我的/usr/share/vim/vim73/syntax/yaml.vim文件,但是我不理解它的足够程度来解决这个问题。
更新:
:color 
slate

:echo &ft
yaml

在行首的fnord: fnordy:yaml块映射键

在行首的fnordy fnord: fnord:yaml普通标量


你对语法高亮有什么期望?你是否认为引号是关联数组键中有效的字符? - steffen
你联系过语法脚本的作者了吗(他的地址可以在脚本头部找到)?!他可能最适合解释限制并实现修复。 - Ingo Karkat
@steffen,我的错 - 实际上我遇到的问题是空格。我以为我已经尝试过通过pyyaml运行该示例,但显然并没有。 - Wayne Werner
3个回答

2
由于 Steffen 的帮助,我比较了两个解析命令。
当前脚本如下:
execute 'syn match yamlBlockMappingKey /^\s*\zs'.s:ns_plain_out.'\ze\s*:\%(\s\|$\)/ '.
            \'nextgroup=yamlKeyValueDelimiter'

问题具体来说是 s:ns_plain_out,这是一个非空格模式。
所以我将模式改为匹配 任何字符:
execute 'syn match yamlBlockMappingKey /^\s*\zs.*\ze\s*:\%(\s\|$\)/ '.

这解决了特定的问题。


太棒了!非常感谢。顺便说一下,你可能想删除代码块末尾的 . - Jack O'Connor

1
在接受的答案基础上,以下是我在我的 .vimrc 文件中添加的内容,以便在不编辑任何核心 vim 文件的情况下解决此问题:
autocmd FileType yaml execute
      \'syn match yamlBlockMappingKey /^\s*\zs.*\ze\s*:\%(\s\|$\)/'

1
根据YAML规范,空格在映射键中是有效字符。请查看规范中的3.2.1.1和this example
我认为高亮显示是正确的。您在使用引号时在第一个值中有一个意外的换行符(就像this example中一样)。

显然,我对YAML的新手使用让我的问题变得混乱了。键中有空格?Vim的语法高亮认为这不是一个真正的键。无论是否有值(正确或不正确),都是如此。我已经更新了我的示例,并希望它是“干净”的YAML。 - Wayne Werner
不,实际上vim的语法高亮并没有显示它不是一个有效的键。 "no"被突出显示为一个特殊的单词,可能表示布尔值。因此,在我看来,在yaml.vim中没有需要修复的问题。 - steffen
在Debian和Windows的vim和gvim中,这里的所有三个键(四个单词)都被突出显示(This,fnordy fnord,fnords)。 - steffen
我在我的问题中添加了截图。 - Wayne Werner
你能把光标移动到每一行并展示 :echo synIDattr(synID(line("."),col("."),1),"name") 的结果吗?然后请展示 :color:echo &ft 的结果。 - steffen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接