vim隐藏多个角色

时间:2011-11-29 11:15:47

标签: vim unicode syntax-highlighting

实际上我想在haskell文件中显示-> (箭头后面有空格)。但我的印象是隐藏机制只能用->替换一个字符。不良影响是视觉上不好的压痕。

有没有办法实现这个目标?

感谢。

编辑:其实我用它,(来自haskell.vim(隐藏增强)插件)

syntax match hsNiceOperator "<-" conceal cchar=←

2 个答案:

答案 0 :(得分:16)

我在C中完全按照你的意愿行事。诀窍是分别隐藏每个角色,如下:

syn match ArrowHead contained ">" conceal cchar=▶
syn match ArrowTail contained "-" conceal cchar=─
syn match ArrowFull "->" contains=ArrowHead,ArrowTail

遗憾的是,您可能会发现ArrowHead或ArrowTail在ArrowFull之外匹配。这是因为现有的语法规则使用contains=ALLBUT,...或类似的东西。

要在C中修复此问题,我将ArrowTail和ArrowHead添加到cParenGroup群集中,这似乎可以防止出现任何问题。

syn cluster cParenGroup add=ArrowTail,ArrowHead

您可能需要为Haskell做类似的事情。

由于我根本不使用隐藏功能,所以我告诉Vim继续“隐藏”箭头:

set conceallevel=1 concealcursor=nvic

BTW如果您不喜欢隐藏字符的默认颜色,可以像这样更改它们:

hi conceal ctermfg=DarkBlue ctermbg=none guifg=DarkBlue guibg=none

答案 1 :(得分:1)

一个非常古老的问题,但是如果有人试图解决这个问题,我在以下方面取得了成功:

call matchadd('Conceal', '<-\&<', 10, -1, {'conceal':'←'})
call matchadd('Conceal', '<\zs-', 10, -1, {'conceal':' '})
hi Conceal        ctermbg=NONE ctermfg=red guifg=red

matchadd的第二个参数是<pattern>。查看:help pattern会告诉我们,pattern是一个或多个branches分隔的\|,而branch是一个或多个concats分隔的由\&。来自文档:“ [a branch与最后一个concat相匹配,但前提是所有前面的concats也与同一个位置相匹配。”

因此,在第一个调用中,我们指定一个带有两个分支的pattern(没有\|值),该分支由两个concats组成。第一个concat与全箭头匹配,第二个与箭头的第一个字符匹配。因此,最后一个concat<,它是与隐藏参数匹配的所有元素,但是只有在<出现在<-中时,这才匹配。第二个调用给出一个pattern,其中一个branch和一个concat。模式以<开头,但匹配由zero-width原子\zs重置,该原子重置下一个字符-的匹配,该字符用空格隐藏。 hi Conceal只是突出显示。

在我的测试中,<本身不会变成,而-本身也不会变成空格。

希望这对某人有帮助:)