From: Tomoyuki Chikanaga <nagachika00@...>
Date: 2012-01-12T12:16:41+09:00
Subject: [ruby-dev:45129] [ruby-trunk - Bug #5423] readlineの入力待機中に端末のウィンドウサイズ変更すると入力内容が乱れる


Issue #5423 has been updated by Tomoyuki Chikanaga.


元報告者と現象が同じかどうかわかりませんが、Ubuntu 10.04.3 で ruby 2.0.0dev (2012-01-10 trunk 34255) [i686-linux] + GNU Readline 6.1 で以下のような現象が確認できます。

$ echo $TERM
xterm
$ ruby -rreadline -e 'Readline.readline("> ")'
> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

↑端末の幅が 80 としてここで折り返す前まで文字を入力しておきます
その後端末の幅を小さくすると

> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

というように折り返されずにバッファの前半だけ表示された状態になります。
ここでさらに "bbb" と入力すると折り返されます

> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
b

また端末の幅を戻しても、表示されるのは切り詰められた状態のままですが、
実際にはバッファには空白になった右半分の文字も存在していて Ctrl-L で再描画すると描画されます。
また逆に起動後に端末の幅を拡げた時も、折り返し位置が変化しません。

上記の動作は提示されているパッチで直るようです。 なおわたしの環境でも SnowLeopard 上で MacPorts でインストールした GNU Readline を使った場合にはこの現象は発生しないようでした。
----------------------------------------
Bug #5423: readlineの入力待機中に端末のウィンドウサイズ変更すると入力内容が乱れる
https://bugs.ruby-lang.org/issues/5423

Author: Takuto Matsuu
Status: Feedback
Priority: Normal
Assignee: Kouji Takao
Category: 
Target version: 
ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux] 


Readline.readline("> ")の入力待機中にターミナルのウィンドウサイズを変更すると、
入力内容がウィンドウサイズ変更に合わせて変化せず、画面が乱れます。

readlineがSIGWINCHに反応しないように設定されているのが原因のようです。

revision 24140で追加されたrl_catch_sigwinch = 0;が該当部分になります。
rl_catch_signals=0を設定した場合でも、SIGWINCHは反応すべき(rl_catch_sigwinch=1)だと思います。

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 24139)
+++ ChangeLog	(revision 24140)
@@ -1,3 +1,11 @@
+Thu Jul 16 12:42:10 2009  NARUSE, Yui  <naruse@ruby-lang.org>
+
+	* ext/readline/readline.c (readline_readline): rl_free_line_state
+	  before rl_cleanup_after_signal.
+
+	* ext/readline/readline.c (Init_readline): set rl_catch_signals and
+	  rl_catch_signwinch as 0. [ruby-core:21884]
+
 Thu Jul 16 08:59:22 2009  Koichi Sasada  <ko1@atdot.net>
 
 	* node.h, vm_core.h, variable.c: rename global_entry to rb_global_entry.
Index: ext/readline/readline.c
===================================================================
--- ext/readline/readline.c	(revision 24139)
+++ ext/readline/readline.c	(revision 24140)
@@ -253,6 +253,7 @@
     if (status) {
 #if defined HAVE_RL_CLEANUP_AFTER_SIGNAL
         /* restore terminal mode and signal handler*/
+        rl_free_line_state();
         rl_cleanup_after_signal();
 #elif defined HAVE_RL_DEPREP_TERM_FUNCTION
         /* restore terminal mode */
@@ -1450,6 +1451,8 @@
 #elif defined HAVE_RL_EVENT_HOOK
     rl_event_hook = readline_event;
 #endif
+    rl_catch_signals = 0;
+    rl_catch_sigwinch = 0;
 #ifdef HAVE_RL_CLEAR_SIGNALS
     rl_clear_signals();
 #endif



-- 
http://bugs.ruby-lang.org/