luochen1990 / rainbow

Rainbow Parentheses Improved, shorter code, no level limit, smooth and fast, powerful configuration.
Apache License 2.0
1.78k stars 95 forks source link

[help] filetype 为 vim 的情况下,括号显示不符合预期 #148

Closed roachsinai closed 4 years ago

roachsinai commented 4 years ago

设置如下:

let g:rainbow_conf = {
\   'guifgs': ['firebrick', 'gold2', 'RoyalBlue2'],
\   'separately': {
\       'vim': {
\           'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/\[/ end=/\]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'],
\       },
\   }
\}

现在我遇到一个问题,就是在我的vimrc中我想添加一行注释(标识自己使用的某个配置的来源)比如:

{#@@ [How to use true colors in vim under tmux?](https://github.com/tmux/tmux/issues/1246) @@#}
if exists('+termguicolors')
  let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
  let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
  set termguicolors
endif

上面的代码断中第一行就是我用的注释,之所以使用{#@@ @@#}是我使用的dotfile管理软件dotdrop: Save your dotfiles once, deploy them everywhere在生成真实的vimrc的时候会删除那一行(注释无需在真实vimrc中出现)

而代码段中第一行会打乱rainbow插件的功能,括号颜色的显示就乱了:

image

可以看到图片中第一行最右侧的)}没有正确显示,而下面的所有括号颜色因此都没有显示正确的颜色。

当我删除超链接也就是将代码段的第一行修改为:{#@@ [How to use true colors in vim under tmux?]() @@#}的时候才正常:

image


我想知道的是,可不可能通过更新设置,在保留超链接的情况下(Markdown形式),括号仍正确的显示?

谢谢!

luochen1990 commented 4 years ago

看一下这段:https://github.com/luochen1990/rainbow#troubleshooting 看异常文本的各个部分上分别是哪项语法定义生效了。

luochen1990 commented 4 years ago

一种简单的处理办法就是不对这个注释里的内容做括号高亮了, 实现方式就是自己通过rainbow的高级配置重新定义括号,用 \zs 这种零宽匹配来向后看,只有后面不是 #@@{ 才当作括号处理。

roachsinai commented 4 years ago

emm,试了一下对于{#@@ [How to use true colors in vim under tmux?](https://github.com/tmux/tmux/issues/1246) @@#} 中的左括号(显示的匹配级别是hi<vimRainbow_lv1_p3> trans<vimRainbow_lv1_p3> lo<vimRainbow_lv1_p3>。本行后面的字符没有对应这个级别的字符。

然后高级配置应该是可行的。不过我刚才尝试的时候vim给试出问题了。一打开文件就 image

😃,这个问题好像更严重。

roachsinai commented 4 years ago

{\(#@@\)\@! 在vim中只匹配后面没有跟#@@{。但是将start修改为start=/{\(#@@\)\@!/不起作用。还得继续😃

luochen1990 commented 4 years ago

你得先会用正则,这个报错信息看起来是说你正则里用了 { 这个特殊字符导致正则语法不对,可能需要转义

roachsinai commented 4 years ago

image

现在使用{\(#@@\)\@!是实现了正则只匹配后面不跟#@@的效果。但是这个加到rainbow的高级配置中没有起作用(start=/{\(#@@\)\@!/)还是匹配了所有的{.

luochen1990 commented 4 years ago

可以用 syntax 命令看一下生成的语法规则是啥样的

roachsinai commented 4 years ago

emmm, 可以了,是高级配置里面有两个{,我之前只是设置了前一个,后一个也设置了就可以了。感谢!