2017-03-30 17 views
1

我使用ruby curses包(ruby 2.1.5)。ruby​​:curses:不要在程序结束时清除屏幕?

在某些情况下,我想在屏幕在我的节目结束被清除,从而使Curses.stdscr的最终内容仍然是我的终端,当程序退出上显示。

我试过把电话拨到Curses.close_screen,但终端屏幕在退出时仍然被清除。

有没有什么办法可以告诉ruby中的curses在程序终止时不清除屏幕?

预先感谢您。

回答

1

捆绑红宝石诅咒模块缺少(许多)诅咒功能,如reset_shell_mode,这将是通常的方式来做到这一点:

reset_prog_modereset_shell_mode例程恢复 终端“程序”(in curses)或“shell”(出于 curses)的状态。这些都是由endwin(3x) 自动完成,并在endwin后,由doupdate,所以他们通常是 不叫。

或者,您可以使用MRuby(它提供了该功能)。

在任何一种情况下,像这样退出都可以让您的终端的特殊键设置为application mode。解决方法是发送转义序列(在终端数据库中发现为rmkx)。

+0

实际上,MRuby看起来确实是最好的管理方式。将捆绑的curses中的函数列表与MRuby函数列表进行比较,可以看到ruby curses捆绑包中不少缺失的函数。我将开始将我的程序转换为使用MRuby,并在几天内回复。 – HippoMan

+0

事实证明,我一直无法在我的Linux机器上获得MRuby的工作。 PDCurses不易编译,而且它也存在Linux ncurses的问题。最终,我可能会得到ncurses版本的工作,并重构一些MRuby代码,但现在我不需要那么做。在我的回答中所做的与额外的rmkx转义序列有关的内容目前为我完成了这项工作。 – HippoMan

0

我想通了:事实证明,如果我退出我的程序退出!而不是仅仅退出,没有任何curses的屏幕重置逻辑被调用,并且stdscr的最新内容仍保留在我的屏幕上。

我也做了以下调用Curses.init_screen前...

require 'termios' 
$orig_termios = Termios.tcgetattr($stdin) 

...我的退出前右发出这个命令! ...

Termios.tcsetattr($stdin, Termios::TCSANOW, $orig_termios) 

(我要接受这个答案,但我不能这样做了2天。我会在那个时候这样做)。