[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00735] Re: login shell を fdsh とした場合の fd の文字化けについて



 しらいです。

In Message-Id <20080113231519.0992fd02.yasushi_imao@imao.jp>
        Yasushi Imao <yasushi_imao@imao.jp>さんwrites:
> はじめまして、今尾といいます。

> ・fdsh をホストの login shell として指定してある
> ・デフォルトの文字コードを ja_JP.UTF-8 にしてある
> という環境下では、なぜか fd の起動をフルパスで指定しないと fd の日本語部
> 分が正常に表示されません。

 ううむ、FDclone は CUI 的に用いることを主眼に設計されてい
て、shell としての動作には若干の甘さが目立つかも知れません。
特に login shell になると環境が全く初期化されていませんから。


> どうも fd-unicd.tbl を見つけることができていないような印象ですが、設定な
> どで対処することは可能でしょうか?あるいはなにか他の対策をご教示いただく
> ことはできますでしょうか?

 普通に build すると FDclone の起動ディレクトリから各種テー
ブルを探そうとしますが、そもそもこの構成って多分に MS-DOS 文
化に毒されたもので、UNIX の世界では一般的ではないんですね。
 どうしてかと言うと、一番の問題点は UNIX では起動ディレクト
リを正確に知る汎用的な方法が存在しないからです。今時の OS だ
と /proc 以下を調べるなんて手もあるでしょうけどね。
 なので、十年以上前の公開当初からこの問題は多くの方に指摘さ
れていて、設計の見直しを迫られている点の一つでもあるんです。

 勿論、私もそういう声を無視して突っぱね続けて来た訳でもなく
て、その回答の一つが USEDATADIR という compile option です。
確か Debian 辺りではその設定で package 化してる筈です。
 config.h 辺りに「#define USEDATADIR」という一行を書いてお
くと、既定値だと /usr/local/share/fd に各種テーブルを置くよ
うな構成で build してくれます。
 既定値からの変更の可能で、Makefile.in にある DATADIR の値
を書換えるとそのディレクトリを使うようになります。

 login shell に使うような場合はこのような手段で構築したもの
を使った方が賢明だと思いますが、そうでない場合にもある程度は
検索可能にするために、ちょっと patch を作ってみました。
 多少探索範囲を広げた程度なので、全てのケースで login shell
に対応出来ている訳ではありませんが、ちょっとはましになると思
います。
 FD-2.09f に対する patch になってるので、試してみて下さい。

---- Cut Here ----
diff -u ../old/FD-2.09f/fd.h ./fd.h
--- ../old/FD-2.09f/fd.h	Sun Oct 28 00:00:00 2007
+++ ./fd.h	Mon Jan 14 01:10:44 2008
@@ -81,6 +81,7 @@
 #define	CMDLINE_DELIM	"\t\n &;()<>|"
 #endif
 
+#define	FDPROG		"fd"
 #define	FDSHELL		"fdsh"
 #define	FDENV		"FD_"
 #define	FDESIZ		strsize(FDENV)
diff -u ../old/FD-2.09f/main.c ./main.c
--- ../old/FD-2.09f/main.c	Sun Oct 28 00:00:00 2007
+++ ./main.c	Mon Jan 14 01:54:21 2008
@@ -37,9 +37,15 @@
 #define	harderr_t	int
 #endif
 
+#ifndef	BINDIR
+#define	BINDIR		"/usr/local/bin"
+#endif
 #ifndef	DATADIR
 #define	DATADIR		progpath
 #endif
+#ifndef	DEFPATH
+#define	DEFPATH		":/bin:/usr/bin"
+#endif
 
 #if	MSDOS
 # ifndef	BSPATHDELIM
@@ -173,6 +179,9 @@
 static int NEAR initoption __P_((int, char *CONST []));
 static int NEAR evaloption __P_((char *CONST []));
 static char *NEAR searchenv __P_((CONST char *, char *CONST []));
+#if	!MSDOS
+static char *NEAR searchexecname __P_((CONST char *, char *CONST []));
+#endif
 static VOID NEAR setexecname __P_((CONST char *));
 static VOID NEAR setexecpath __P_((CONST char *, char *CONST []));
 int main __P_((int, char *CONST [], char *CONST []));
@@ -1116,6 +1125,25 @@
 	return(NULL);
 }
 
+#if	!MSDOS
+static char *NEAR searchexecname(argv, envp)
+CONST char *argv;
+char *CONST envp[];
+{
+	CONST char *env;
+	char *cp;
+
+	if (!(env = searchenv(ENVPATH, envp))) env = DEFPATH;
+	if ((cp = searchexecpath(argv, env))) return(cp);
+	if (*argv == '-' && (cp = searchexecpath(++argv, env))) return(cp);
+	if (*argv == 'r' && (cp = searchexecpath(++argv, env))) return(cp);
+	if ((cp = searchexecpath(FDSHELL, env))) return(cp);
+	if ((cp = searchexecpath(FDPROG, env))) return(cp);
+
+	return(NULL);
+}
+#endif	/* !MSDOS */
+
 static VOID NEAR setexecname(argv)
 CONST char *argv;
 {
@@ -1157,9 +1185,8 @@
 	cp = argv;
 #else
 	if (strdelim(argv, 0)) cp = argv;
-	else if ((cp = searchenv(ENVPATH, envp)))
-		cp = tmp = searchexecpath(argv, cp);
-	if (!cp) progpath = strdup2(origpath);
+	else cp = tmp = searchexecname(argv, envp);
+	if (!cp) progpath = strdup2(BINDIR);
 	else
 #endif
 	{
diff -u ../old/FD-2.09f/mkmfsed.c ./mkmfsed.c
--- ../old/FD-2.09f/mkmfsed.c	Sun Oct 28 00:00:00 2007
+++ ./mkmfsed.c	Mon Jan 14 01:52:29 2008
@@ -103,10 +103,10 @@
 	printf("s:__DEFRC__:'\"'$(DEFRC)'\"':\n");
 
 #ifdef	USEDATADIR
-	printf("s:__TBLPATH__:-DDATADIR='\"'$(DATADIR)'\"':\n");
+	printf("s:__TBLPATH__:-DBINDIR='\"'$(BINDIR)'\"' -DDATADIR='\"'$(DATADIR)'\"':\n");
 	printf("s:__DATADIR__:$(DATADIR):g\n");
 #else
-	printf("s:__TBLPATH__::\n");
+	printf("s:__TBLPATH__:-DBINDIR='\"'$(BINDIR)'\"':\n");
 	printf("s:__DATADIR__:$(BINDIR):g\n");
 #endif
 
---- Cut Here ----

                                               しらい たかし