vim 隐藏多个字符

问题描述 投票:14回答:2

其实我想展示的是 -> (箭头后面有一个空格)的haskell文件。但在我的印象中,conceal机制只适用于取代 -> 由一个字符。一个不理想的效果是视觉上不好缩进。

有什么方法可以实现吗?

谢谢。

编辑:其实我用的是这个,(来自 haskell.vim (隐蔽性增强)插件)

syntax match hsNiceOperator "<-" conceal cchar=←
vim unicode syntax-highlighting
2个回答
18
投票

我在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语言中解决这个问题,我在cParenGroup集群中添加了ArrowTail和ArrowHead,这似乎可以防止任何问题。

syn cluster cParenGroup add=ArrowTail,ArrowHead

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

因为我根本不使用conceal功能,所以我告诉Vim去 "隐藏 "所有的箭头。

set conceallevel=1 concealcursor=nvic

另外,如果你不喜欢conceal chars的默认颜色,你可以像这样改变它们。

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

0
投票

超级老的问题,但如果有人想弄清楚这个问题,我已经成功地完成了以下工作。

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 相隔 \|和a branch 是一个或多个 concats 相隔 \&. 从文档中可以看到: "[a branch] 匹配上一个 concat但前提是前面所有的 concats 也在同一位置匹配"。

所以在第一次调用中,我们指定了一个 pattern 有一个分支(没有 \| 值),由两个 concats. 第一个 concat 匹配完整的箭头,第二个匹配箭头的第一个字符。因此,最后一个 concat< 这就是conceal参数的所有匹配项,但这只有当 < 见于 <-. 第二个电话给出了 pattern 有一个 branch 和一个 concat. 该模式始于 < 但比赛会以 zero-width 原子 \zs 将匹配的字符重置在下一个字符,即 -,它被一个空间所掩盖。该 hi Conceal 只是高亮。

在我的测试中 < 孤掌难鸣 - 本身并没有变成一个空间。

希望这能帮助到大家:)

© www.soinside.com 2019 - 2024. All rights reserved.