1

这是我的 darkerdesert.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

我需要提取用英文命名的颜色,例如“LightBlue”、“slategrey dark”。我的解决方案如下:

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

有了这个模式/[bf]g\=\K(?!\#)(.*)(?=gui)/,我只能得到之间的项目gui[bf]g=
所以我的问题是:如何匹配所有英文颜色名称?(goldenrod3,SeaGreen....等)

4

2 回答 2

2

您可以使用 regex 执行此操作/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"
于 2012-05-06T12:01:45.553 回答
1

A more obvious, but not necessary better solution:

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
于 2012-05-06T12:18:32.357 回答