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

问题描述 投票:4回答:2

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

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

Repro具有以下内容:

screen -S -dm
screen -r

键入多个字符,然后按退格键。

gnu-screen
2个回答
1
投票

我不确定我是否有与你完全相同的问题,因为你的repro步骤对我不起作用,但我确实在screen中有相同的不良行为(退格会杀死整条线),并设法修复它。

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

$ 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       

这里有两点需要注意:

  1. 没有erase,只有erase2
  2. kill映射到^H

#2解释了我的问题,虽然#1也需要修复。通常,^U是“杀线”,但在这里它是^H而不是。

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

这为我修好了:

$ stty kill ^U
# now, backspace outputs a literal ^H to the screen, so...
$ stty erase ^H

请注意,为了输入^H^U,您必须使用文字控制字符。我分别在我的终端上用Ctrl-V, <backspace>Ctrl-V, Ctrl-U这样做。

我希望它有所帮助!


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设置并将它们“填充”到Window 0上的屏幕会话中,Window 0是首次启动时屏幕创建的默认窗口。然后它“填充”换行符来模拟按下输入。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.