重新连接到tmux/screen后键盘IO坏了

ste*_*-oh 7 x11 vim r gnu-screen tmux

通过ssh重新连接屏幕或tmux会话后,我经常会遇到两个问题:

  • vim标签完成被破坏. :e <Tab>生成:e ^I而不是建议文件.对于tags(:tj)也是如此.关闭并重新打开vim修复此问题,但代价是失去了vim状态.
  • R无法生成图形.我ssh -X -Y启用了X11 forwarding().关闭和重新开放并没有帮助.

我不能通过关闭我的ssh窗口并重新附加来故意重现问题.在重新连接之间没有网络连接的长时间段之后通常会观察到问题,并且通常分离是突然的(网络连接丢失).

Ada*_*atz 3

Vim 选项卡补全:

这是 screen/tmux 终端模拟器的问题。如果选项卡在您的 shell(例如 bash)中工作,这可能是 shell 的功劳;它知道为你映射控制序列,而 vim 不知道。据推测,您可以在 vim 中以类似的方式修复此问题,但随后您会在其他一些交互式程序中遇到此问题。

我无法与 tmux 对话,但对于屏幕,您应该更新 ~/.screenrc。我的,是从 Redhat 附带的默认版本(我不再使用它......)复制的,包括:

#xterm understands both im/ic and doesn't have a status line.
#Note: Do not specify im and ic in the real termcap/info file as
#some programs (e.g. vi) will not work anymore.
termcap  xterm hs@:cs=\E[%i%d;%dr:im=\E[4h:ei=\E[4l
terminfo xterm hs@:cs=\E[%i%p1%d;%p2%dr:im=\E[4h:ei=\E[4l
Run Code Online (Sandbox Code Playgroud)

请注意该评论,它可能表明您的问题。

对 vi 的另一个引用(可能来自 Redhat 的 screenrc,也可能不是)是:

# Yet another hack:
# Prepend/append register [/] to the paste if ^a^] is pressed.
# This lets me have autoindent mode in vi.
register [ "\033:se noai\015a"
register ] "\033:se ai\015a"
bind ^] paste [.]
Run Code Online (Sandbox Code Playgroud)

希望其中一个或两个都会有所帮助,否则我会为您指明正确的方向,以研究纠正屏幕/tmux 终端仿真所需的内容。也许LinuxQuestions.org 上screen、vimrc 和 bashrc的答案可以提供进一步帮助。


X11转发:

当您第一次启动屏幕时,$DISPLAY 会被继承。例如,我在我的电视服务器上利用了这一点;我在本地启动 screen ( DISPLAY=localhost:0),然后当我通过 SSH 连接到它时,我对 X 所做的任何操作都会在电视上弹出。显然,这根本不是您的用例;我只是想告诉您它是如何工作的,以便您能够理解解决方案。

如果您要重新连接到由旧 SSH 连接启动的 screen/tmux 会话,您可能会幸运地将其连接到同一个 X 显示(SSH 默认为 localhost:10.0,然后每次发现冲突时都会递增),但是听起来这不像是发生在你身上的事。(“localhost”部分是可选的,“.0”部分也是可选的。这些对于您的目的来说并不重要。 DISPLAY=:10与 相同DISPLAY=localhost:10.0

在连接到 screen/tmux 会话之前,请查看您的 $DISPLAY。

$ echo $DISPLAY
localhost:10.0
Run Code Online (Sandbox Code Playgroud)

然后,登录 screen/tmux 并将 $DISPLAY 设置为您之前看到的内容。

$ screen -r
$ export DISPLAY=localhost:10.0
Run Code Online (Sandbox Code Playgroud)

我不认为 screen 或 tmux 足够聪明,可以走得更远(想想我的电视服务器示例;这并不总是理想的,并要求 screen/tmux 测试 $DISPLAY,然后根据其可用性采取行动有点多),所以你必须手动执行此操作。

(如果你像我一样添加screen -r >/dev/null 2>&1到你的 ~/.bashrc 中,这可能会很烦人。我不会遇到这个问题,因为我尽可能避免 X11 转发,因为它像糖蜜一样慢,当然无法在 SSH 中生存断线。)