重新连接屏幕守护进程使退格终止整个行

时间:2014-01-02 15:00:07

标签: gnu-screen

作为设置桌面的启动脚本的一部分,我使用多个窗口初始化屏幕。我这样做是通过启动守护程序并发送-X screen-X stuff命令,最后重新附加-r

不幸的是,“创建守护进程和重新附加”方法使我创建的所有窗口都将退格转换为“杀死整行”操作。如果我使用C-c c在屏幕内创建新窗口,则新窗口不会出现此行为。这是一个屏幕错误,还是我可以做一些特殊的事情来解决这个问题?如果重要的话,我正在使用xfce4和ubuntu 12.10

Repro与以下内容:

screen -S -dm
screen -r

键入多个字符并按退格键。

2 个答案:

答案 0 :(得分:1)

我不确定我是否遇到了与你完全相同的问题,因为你的复制步骤对我没有用,但我确实在{{1}中有同样的不良行为}(退格杀死整行),并设法解决它。

对我来说,不知怎的,我反复进入screen的输出是这样的状态:

stty

这里有两点需要注意:

  1. 没有$ stty speed 9600 baud; lflags: echoe echok echoke echoctl iflags: -ixany -imaxbel ignpar oflags: tab3 cflags: cs8 -parenb -hupcl clocal eol eol2 erase2 kill min ^@ ^@ ^@ ^H 0 ,只有erase
  2. erase2已映射到kill
  3. #2解释了我的问题,虽然#1也需要修复。 通常情况下,^H是" kill line",但此处为^U

    如果我输入^H,我的终端会输出Ctrl-V, <backspace>。因此,由于上面的映射,导致^H(终止线)发生。

    这为我解决了这个问题:

    kill

    请注意,要输入$ stty kill ^U # now, backspace outputs a literal ^H to the screen, so... $ stty erase ^H ^H,您必须使用文字控制字符。我的终端分别使用^UCtrl-V, <backspace>执行此操作。

    我希望它有所帮助!

答案 1 :(得分:0)

我找到了解决这个问题的方法。

screen -r {session_name} -p 0 -X stuff "stty $(stty -g)"
screen -r {session_name} -p 0 -X stuff $'\n'
screen -r {session_name} -p 0 -X width $COLUMNS $LINES
screen -r {session_name} -p 0 -X stuff $'clear\n'

这将当前tty设置和“填充”它们进入窗口0上的屏幕会话,窗口0是首次启动时屏幕创建的默认窗口。然后它“填充”换行符以模拟按Enter键。

接下来的两行只是告诉屏幕初始列和行应该与主叫终端的列和行匹配,然后它清除会话的屏幕,这样当你附加到屏幕会话时,你的提示将位于左上角。我有问题,当连接到屏幕会话时,提示将在终端的中间。一个轻微的烦恼,但我想它消失了。

注意:如果从脚本中调用最后两行,则不会设置这些环境变量。您需要替换为 $(tput cols) $(tput lines)