实际上我想在haskell文件中显示->
→
(箭头后面有空格)。但我的印象是隐藏机制只能用->
替换一个字符。不良影响是视觉上不好的压痕。
有没有办法实现这个目标?
感谢。
编辑:其实我用它,(来自haskell.vim
(隐藏增强)插件)
syntax match hsNiceOperator "<-" conceal cchar=←
答案 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
只是突出显示。
在我的测试中,<
本身不会变成←
,而-
本身也不会变成空格。
希望这对某人有帮助:)