如何在 vim 中将这种颜色名称与 Perl 正则表达式匹配



这是我的黑暗沙漠.vim:

hi Cursor       guibg=#b3b3df   guifg=grey30    gui=bold
hi VertSplit    guibg=#505050   guifg=grey50    gui=none
hi Folded       guibg=#252525   guifg=gold3
hi FoldColumn   guibg=#252525   guifg=gold3
hi IncSearch    guifg=slategrey dark guibg=ghost white
hi LineNr       guifg=grey30
hi ModeMsg      guifg=goldenrod3
hi MoreMsg      guifg=SeaGreen Dark
hi NonText      guifg=LightBlue guibg=#252525
hi Question     guifg=#28a45c

我需要提取用英文命名的颜色,例如"浅蓝色","石板灰色深"。我的解决方案如下:

while (<DATA>) {
    print $1,"n" while /(?:[bf]g=K(?!#)(.*)(?=gui))/g;
}

使用模式/[bf]g=K(?!#)(.*)(?=gui)/,我只能在gui[bf]g=之间获取项目。
所以我的问题是:如何匹配所有英文颜色名称?(菊科植物3,海绿...等)

您可以使用

正则表达式/gui[fb]g=([^#]+?)s+(?=w+=|z)/g执行此操作。

下面是一些示例代码,用于演示它使用您自己的数据。

use strict;
use warnings;
while (<DATA>) {
  print join ', ', map qq("$_"), /gui[fb]g=([^#]+?)s+(?=w+=|z)/g;
  print "n";
}
__DATA__
hi Cursor       guibg=#b3b3df   guifg=grey30    gui=bold
hi VertSplit    guibg=#505050   guifg=grey50    gui=none
hi Folded       guibg=#252525   guifg=gold3
hi FoldColumn   guibg=#252525   guifg=gold3
hi IncSearch    guifg=slategrey dark guibg=ghost white
hi LineNr       guifg=grey30
hi ModeMsg      guifg=goldenrod3
hi MoreMsg      guifg=SeaGreen Dark
hi NonText      guifg=LightBlue guibg=#252525
hi Question     guifg=#28a45c

输出

"grey30"
"grey50"
"gold3"
"gold3"
"slategrey dark", "ghost white"
"grey30"
"goldenrod3"
"SeaGreen Dark"
"LightBlue"

一个更明显但不是必要的更好解决方案:

use strict;
my @c;  # colors
my @m;  # matches
while ( <DATA> ) {
  @m = /guifg=([w ]+?) *($|gui)/;  # trying to extract the FG color, if exists
  push(@c, $m[0]) if $m[0];
  @m = /guibg=([w ]+?) *($|gui)/;  # trying to extract the BG color, if exists
  push(@c, $m[0]) if $m[0];
}
map { print $_, "n", } @c;  # all color names are in @c, do whatever you want with them

最新更新