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)/を得ることができます。 だから私の質問は:英語の色名をすべて一致させる方法は?(goldenrod3、SeaGreen ....など)gui[bf]g=

4

2 に答える 2

2

正規表現でこれを行うことができます/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

より明白ですが、必ずしも必要ではないより良い解決策:

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 に答える