【问题标题】:keyboard IO broken after reattach to tmux/screen重新连接到 tmux/屏幕后键盘 IO 损坏
【发布时间】:2018-11-02 23:30:52
【问题描述】:

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

  • vim 选项卡完成被破坏。 :e <Tab> 生成 :e ^I 而不是建议文件。标签相同(:tj)。关闭并重新打开 vim 可以解决此问题,但代价是丢失 vim 状态。
  • R 无法生成图形。我启用了 X11 转发 (ssh -X -Y)。关闭并重新打开无济于事。

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

【问题讨论】:

    标签: r vim x11 tmux gnu-screen


    【解决方案1】:

    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
    

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

    另一个对 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 [.]
    

    希望其中一项或两项会有所帮助,否则我已经为您指明了正确的方向,以研究您需要什么来纠正您的屏幕/tmux 终端仿真。也许在 LinuxQuestions.org 上对screen, vimrc, and bashrc 的回答可以提供更多帮助。


    X11 转发:

    当您第一次启动屏幕时,$DISPLAY 会被继承。例如,我在我的电视服务器上利用了这一点;我在本地启动屏幕 (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
    

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

    $ screen -r
    $ export DISPLAY=localhost:10.0
    

    我认为 screen 或 tmux 都不够聪明,无法走得比这更远(想想我的电视服务器示例;这并不总是需要的,并要求 screen/tmux 测试 $DISPLAY 然后视情况而定它的可用性有点多),因此您必须手动执行此操作。

    (如果你像我一样在 ~/.bashrc 中添加 screen -r >/dev/null 2>&1,这可能会很烦人。我没有遇到这个问题,因为我尽量避免 X11 转发,因为它像糖蜜一样慢当然也不能幸免于 SSH 断开连接。)

    【讨论】:

      【解决方案2】:

      第二个问题看起来像一个 DISPLAY 变量。尝试 echo $DISPLAY 当您第一次登录并再次连接会话时。 如果它们不同(这是我怀疑的),setenv 或 export 将其设置为正确的值。

      至于第一个问题,请尝试查看您的 tmux.conf(或安装中的默认设置) 因为他们正在重新映射 <TAB> 开发版本中的有趣动作(如清除历史)所以也许 重新附加后,tmux 拥有事件而不是 vim。

      【讨论】:

        猜你喜欢
        • 2011-11-09
        • 1970-01-01
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多