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

[debian-users:30379] Re: xemacs21 で日本語 man ページが表示できない



At Sat, 27 Oct 2001 05:09:20 +0900,
Ippei Tamura wrote:
> > ?? lv で動いてますよ?
> > 
> > どうして直ったのかもう少し詳しいレポートを下さい。
> 
> 了解しました。すこし長くなりますが、もう一度、現象と私が行なった
> 試行錯誤について報告します。
> 
> 1. 現象
> * XEmacs21 で、M-x manual-entry hoge にて日本語訳が用意されている
>   man ページを開くことができない (英語の man ページしかないコマンドは
>   表示できる)。ミニバッファに '(cleaning...)' と表示されたきりになる 
>   (CPU の負荷は最大値キープ。C-g で脱出は可能)。
> 
> * この現象は、X 上で XEmacs を起動した場合のみであり、jfbterm 上から
>   起動した場合は、何ら問題なく日本語 man ページが表示される。
> 
> 2. 試行錯誤 らしきもの ;-)
> * X 上から XEmacs を起動し、shell モードに入る。そのコマンドプロンプト
>   から man コマンドを実行。結果は次の通り。
> 
> $PAGER=lv の場合
> ~$ echo $PAGER
> lv
> ~$ man man
> man(1) を再フォーマットしています。しばらくお待ちください...
> lv: emacs not found in termcap
> man: コマンドはステータス 65280 で終了しました: /usr/bin/zsoelim /tmp/zmanEI37Qc | /usr/bin/tbl | /usr/bin/nroff -mandoc -Tnippon | lv

なるほど。たしかに shell-mode で lv がエラーをはきますね。
これは TERM 絡みのようです。shell-mode で TERM=vt100 とし
て man man すると jless 同様に表示されると思います。

まず問題として言えるのは、emacsen が起動したときに TERM がemacs になっ
ているにも関わらず、/usr/lib/terminfo/e/emacs が存在しないので、エラー
が出ているということです(バグ?)。

また、lv はうまく表示できない端末だとエラー終了するのに対し、jless は
無理やり表示しようとするのが、この動作の違いになっているようです。この
問題はメールの最後につけたパッチをあてると解消されると思います。なんと
なくこのパッチをデフォルトであてておいた方が、エラー終了しなくて嬉しそ
うですが、いかがでしょうか?

> $PAGER=jless の場合
> ~$ echo $PAGER
> jless
> ~$ man man
> man(1) を再フォーマットしています。しばらくお待ちください...
> WARNING: terminal is not fully functional
> 
-  (press RETURN)
> 
> * この後、return キーを連打すれば、日本語 man ページの内容は
>   次のような不完全な整形ではあるが表示される。
> 
> 

man(1)                  Manual pager utils                 man(1)

これは terminfo が適切に設定されていないことに起因するようです。

> 3. 対処
> ここまで来た時点で、もしやと思い、~/.bashrc で環境変数 PAGER を
> jless に設定するように編集してから再起動して見たところ、無事、
> M-x man hoge にて日本語 man ページが表示された次第です。

shell-mode だと man -P<PAGER> man (<PAGER> に lv とか jless とか
いれる) するとすぐ違いが分かります。

> > pager に more や less を使った場合などを試さない限り jless で
> > あれば動く、または lv だから動かないという話にはなりませんね。
> 
> PAGER=less あるいは more のケースは試していませんでした :-p
> そこで、いま試してみたら結果は次の通りとなりました。
> PAGER=less -> ミニバッファに "man hoge not found" と表示され、
>               エラーとなる (英語の man ページは問題なし)。
> PAGER=more -> 問題なく表示可能。

私の環境では
		shell-mode		man-mode
	lv:	エラーで表示不能	OK  ← わたしのところでは OK です。
	less:	日本語が出なくて停止	OK                    
	jless:	崩れたまま無理やり表示	上記のエラーで動作せず
	more:	日本語出ないし崩れる	OK

man-mode で less が動作しないのも問題っぽいですね。

さらに emacs20 だと
		shell-mode			man-mode
	lv:	同様のエラーで表示不能		OK (^H^H などが出る)
	less:	lv同様のエラー			上記エラーで動作せず
	jless:	なんとか出る			日本語が出ない
	more:	表示はされるが日本語が出ない	日本語が出ない

jless や more では日本語が出なくなってしまいました。
Bugs#55892 (xemacs21: In Japanese(LANG=ja_JP.ujis) environment,
manual-entry fuction lack a multi-byte character.) のせいかもしれない
です (が何故 lv ででるんだろう?).

> 4. 関連パッケージ
> ~$ dpkg -l | grep xemacs21
> ii  xemacs21       21.4.4-1       Editor and kitchen sink
> ii  xemacs21-bases 2001.07.09-2   Editor and kitchen sink -- compiled elisp su
> ii  xemacs21-bin   21.4.4-1       Editor and kitchen sink -- support binaries
> ii  xemacs21-mule- 21.4.4-1       Editor and kitchen sink -- Mule binary compi
> ii  xemacs21-mules 2001.07.09-1   Editor and kitchen sink -- Mule elisp suppor
> ii  xemacs21-suppo 21.4.4-1       Editor and kitchen sink -- architecture inde
> 
> ~$ dpkg -l | grep lv
> ii  lv             4.49.4-1       A Powerful Multilingual File Viewer
> 
> ~$ dpkg -l | grep jless
> ii  jless          358-iso254-1   A file pager program, similar to more(1) sup
> 
> とりあえず以上ですが、他に不足している情報ありましたら、
> 指示をお願いします。

これは単に PAGER のせいというよりは emacsen 側に terminfo が
ないという問題が大きそうです。各種 emacsen へ状況を BTS するのが
適切かと思います。

また、lv がエラーを吐くのは、先ほどのパッチで解決できるので、
希望があれば .deb につっこみます。

# emacsen で man や shell-mode を使っている人が
# そんなにいないので問題になっていない予感が… :-D

-- gotom


--- lv4494/src/console.c	Mon Jun 26 20:39:29 2000
+++ lv4494.new/src/console.c	Sat Oct 27 13:50:08 2001
@@ -291,9 +291,9 @@
   byte *term, *ptr;
 
   if( NULL == (term = getenv( "TERM" )) )
-    fprintf( stderr, "lv: environment variable TERM is required\n" ), exit( -1 );
+    fprintf( stderr, "lv: environment variable TERM is required\n" );
   if( 0 >= tgetent( entry, term ) )
-    fprintf( stderr, "lv: %s not found in termcap\n", term ), exit( -1 );
+    fprintf( stderr, "lv: %s not found in termcap\n", term );
 
   ConsoleGetWindowSize();
 
@@ -326,7 +326,7 @@
   cur_npage		= tgetstr( "kN", &ptr );
 
   if( NULL == cursor_address || NULL == clear_screen || NULL == clr_eol )
-    fprintf( stderr, "lv: termcap cm, cl, ce are required\n" ), exit( -1 );
+    fprintf( stderr, "lv: termcap cm, cl, ce are required\n" );
 
   if( NULL == insert_line || NULL == delete_line )
     no_scroll = TRUE;
@@ -339,11 +339,11 @@
   int state;
 
   if( NULL == (term = getenv( "TERM" )) )
-    fprintf( stderr, "lv: environment variable TERM is required\n" ), exit( -1 );
+    fprintf( stderr, "lv: environment variable TERM is required\n" );
 
   setupterm( term, 1, &state );
   if( 1 != state )
-    fprintf( stderr, "lv: cannot initialize terminal\n" ), exit( -1 );
+    fprintf( stderr, "lv: cannot initialize terminal\n" );
 
   ConsoleGetWindowSize();
 
@@ -355,7 +355,7 @@
   cur_npage		= key_npage;
 
   if( NULL == cursor_address || NULL == clear_screen || NULL == clr_eol )
-    fprintf( stderr, "lv: terminfo cursor_address, clr_eol are required\n" ), exit( -1 );
+    fprintf( stderr, "lv: terminfo cursor_address, clr_eol are required\n" );
 
   if( NULL == insert_line || NULL == delete_line )
     no_scroll = TRUE;