[Mew-dist 06630] patch: A new directive 'use' to IM config file
Makoto MATSUSHITA ( まつしたまこと )
matusita at example.com
1998年 10月 5日 (月) 20:09:04 JST
$HOME/.im/Config の書き方についての話,です.例えば,
・設定 X は,case A と case B で使いたい
・設定 Y は,case C と case D で使いたい
・case A〜D それぞれの設定(設定A〜D)も当然ある
という場合を考えます.この場合には
共通の設定
case A
設定A
case B
設定B
case C
設定C
case D
設定D
case A,B
設定X
case C,D
設定Y
とすれば良いことは良く知られています(よね).
しかし,この記述方法では「じゃあ,結局 case A の場合にはどういう設定にな
るの?」と思ったときに,全部の記述を自分で merge して確認することになって
しまいます(つまり,頭の中で「設定A」を「設定X」で上書きした時のことを考
えなければいけない).上記のように case ラベルが 4 種類程度なら良いですが,
いっぱい書いてある時には(一画面におさまらなくなった時など),ちょっと辛い
と思っていました.
これをなんとかするために,新たな directive である「use」を実装してみまし
た.IIJ-PPP を使われている方は,ppp.conf における load コマンドを想像し
ていただけるとイメージがつかめるかもしれません.
上記のような場合には,例えばこんな感じになります.
共通の設定
case X
設定X
case Y
設定Y
case A
設定A
use X
case B
設定B
use X
case C
設定C
use Y
case D
設定D
use Y
「どこがどう簡単になったねん」という話も多々ありますが‥‥以下,IM-101
に対する patch です.多分 IM-100 でもあたるでしょう(未確認).いちおう
case X,Y,Z
use A,B,C
などとやってもちゃんと動くようにしたつもり,です.一瞬だけ「use で後方参
照(その行より後に定義される case を参照)するのはあり?」とか思ってしまう
わけですが,もちろんできます(というか,そうした方が楽だった).
というわけで,動くように書いたつもりですが,嘘ついてたらごめんなさい.
-- -
Makoto `MAR' MATSUSHITA
--- IM/Config.pm.in.orig Wed Sep 23 18:20:21 1998
+++ IM/Config.pm.in Mon Oct 5 19:49:44 1998
@@ -297,6 +297,8 @@
my ($profile, @profiles);
my $prev_line = '';
my $case;
+ my $use;
+ my @USECASES;
my @prog_cfg;
@profiles = ('<DATA>', $IM_SYS_PROFILE, $IM_USER_PROFILE);
@@ -344,6 +346,11 @@
}
next;
}
+ if (/^use\s*(.*)/) {
+ ($use = $1) =~ s/\s*//g;
+ my @array = ($case, $use);
+ push(@USECASES, \@array);
+ }
if (/^(\*|[\w]+)\.(\w+)[:=]\s*(.*)$/) {
# Imls.Src=+inbox
if ($1 eq '*') {
@@ -374,6 +381,12 @@
foreach $array (@prog_cfg) {
set_value_cfg(@$array);
}
+ foreach $array (@USECASES) {
+ ($case, $use) = @$array;
+ foreach (split(',', $case)) {
+ set_selector($use, $_);
+ }
+ }
}
sub read_opt ($) {
@@ -444,8 +457,8 @@
}
}
-sub set_selector ($) {
- my $selector = shift;
+sub set_selector ($;$) {
+ my ($selector, $base) = @_;
my $s;
foreach $s (split(',', lc($selector))) {
@@ -454,9 +467,15 @@
im_err("no 'case $s' in config file.\n");
return -1;
} else {
- push(@SELECTORS, $s);
- foreach (keys(%{$s})){
- ${$_} = $s->{$_};
+ if (!defined($base) or $base eq 'default') {
+ push(@SELECTORS, $s) if !defined($base);
+ foreach (keys(%{$s})){
+ ${$_} = $s->{$_};
+ }
+ } else {
+ foreach (keys(%{$s})){
+ $base->{$_} = $s->{$_};
+ }
}
}
}
Mew-dist メーリングリストの案内