【问题标题】:Why does "locate filename | xargs vim" cause strange terminal behaviour?为什么“定位文件名 | xargs vim”会导致奇怪的终端行为?
【发布时间】:2023-03-11 00:03:01
【问题描述】:

当我执行“locate 50local.policy | xargs vim”时,我收到错误“Vim: Warnung: Die Eingabe kommt nicht von einem Terminal”(翻译:Vim:警告:输入不是来自终端)。

我可以使用 vim 成功编辑,但是在我关闭它之后,我的终端表现得很奇怪(我无法输入字母,并且当我点击 enter 时,shell 提示只会重复。 当我使用“xargs gedit”执行此操作时,它不会产生这些问题。

我使用带有 Gnome 3 和 Gnome-Terminal 3.0.1 的 Ubuntu 11.10。

【问题讨论】:

    标签: vim terminal xargs


    【解决方案1】:

    Vim 期望连接到一个真实的终端并发送相应的代码。

    重置终端
    reset
    

    最简单的解决方法:

    locate 50local.policy | xargs gvim
    

    基本原理 gui vim 不需要终端

    否则:

    vim $(locate 50local.policy)
    

    基本原理 vim 直接连接到终端启动(而不是作为xargs 下的子进程,后者又在连接到 stdin/stdout 的子 shell 中运行管道而不是终端)。 就像说

    vim /usr/some/dir/50local.policy /usr/local/some/dir/50local.policy
    

    或者

    您可以通过不使用参数启动 vim 而是添加来自 vim 的参数来避开这个问题!事实上,Vim 在运行 shell 方面比 shell 在运行 vim 方面要好得多。

    在 vim 中:

    :args `locate 50local.policy`
    :rewind
    

    这会将参数列表设置为在刻度之间从 shell 命令返回的文件; :rewind 然后转到该列表中的第一个文件。 如果您正在编辑多个匹配项,请尝试以下操作:

    :w|next
    

    这一系列命令(由 | 分隔)将当前缓冲区写入文件,然后转到 args 列表中的下一个文件。

    【讨论】:

    • 只是好奇:vim $(...) 和 OP 在做什么有什么区别?
    • @sidyll 在帖子中添加了基本原理
    • @sidyll OP 使用xargs 创建vim 进程,而在另一种情况下,该进程是从shell 创建的。
    • @sidyll 关键是 xargs 执行它stdin/out 未连接到终端(执行echo hello | vim - 有同样的问题)。
    • @eMPee584 感谢您的帮助编辑。我不能投票,但我会:)
    【解决方案2】:

    另一种选择是使用-o 选项执行xargs。从手册页:

    -o      Reopen stdin as /dev/tty in the child process before executing
            the command.  This is useful if you want xargs to run an interac-
            tive application.
    

    注意,-o 是 xargs 的 BSD 扩展。

    实现相同效果的更便携的方法是:

    xargs sh -c 'vim "$@" < /dev/tty' vim
    

    【讨论】:

      【解决方案3】:

      虽然“重置”解决了问题,但您也可以通过以下方式明确重新激活回显行为:

      stty echo
      

      【讨论】:

        猜你喜欢
        • 2011-06-07
        • 1970-01-01
        • 2014-05-06
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多