在做了grep并将其传递给vim然后退出之后,为什么我遇到这个奇怪的控制台出现故障?

时间:2011-01-23 17:56:52

标签: bash vim console ssh grep

我刚试过这个:

grep -RlI "id=\"kw\"" * | xargs vim

这给了我16个结果。它打开了Vim的第一个结果。我进行了第一次编辑并点击了:q,因为我不知道跳转到下一个文件的快捷方式。

它把我扔回控制台(我通过SSH连接到服务器)。我的控制台现在搞砸了。我输入的任何东西都看不到,而且无论何时我点击输入它似乎都会处理命令但是显示/视图被搞砸了所以

[meder@linode]已在我的控制台上标记,至少在中途。 reset什么也没做,因为它似乎搞砸了我真正的控制台。


任何人都可以提供没有同样缺点的解决方案吗?或者任何人都可以解释为什么:q出第一个文件搞砸了我的控制台?


背景信息:我的电脑是 Debian Ubuntu,我通过SSH连接到RHEL框。我打开的文件是text / ascii文件phtml / php文件,而不是一些带有疯狂字符的奇怪二进制文件。

以下是screenshot发生的事情

编辑#1:我刚刚再次键入reset,似乎工作正常。第一个reset没有用,我想是因为控制台在其中插入了一些空白字符?无论如何,我想解释这种奇怪的行为。

6 个答案:

答案 0 :(得分:3)

尝试:

vim -o `grep -RlI "id=\"kw\"" * `

答案 1 :(得分:2)

来自xargs的手册页:

     Undefined behavior may occur if utility reads from the standard input.

该行不在Linux手册页中,但它出现在我的Mac上。如果你想运行一个你打算读取标准输入的程序,通常的linux版xargs需要一个参数来从文件中读取它的输入:

   OPTIONS
       --arg-file=file, -a file
              Read items from file instead of standard input.
              If you use this option, stdin remains unchanged
              when commands are run.  Otherwise, stdin is
              redirected from /dev/null.

Vim旨在运行标准输入和标准输出连接到真实(这些天非常罕见)或伪tty设备。如果你不喜欢这种安排,就会发生奇怪的事情。

你的命令的根本问题是,当标准输入重定向到管道时,xargs无法运行带有“正常”标准输入的vim。因此vim模式更改和命令输入不是您所期望的。

您可以通过键入return,tilde和句点来解决此问题。这将强制你的ssh会话从你的结束关闭,你可以再次ssh,并运行“ps”来检查你应该杀死的背景中挂起的任何东西(1)。

答案 2 :(得分:1)

您可以使用:next:n转到下一个要编辑的文件。您还可以使用vim -o打开Vim中不同窗口中的所有匹配文件。

不知道为什么你的控制台搞砸了。我尝试使用你的命令,我的控制台很好。

答案 3 :(得分:1)

控制台选项由stty设置,因此您可能希望将其选项保存到bash变量并在vim退出后恢复它们,如下所示:

function vim()
{
    STTYOPTS="$(stty --save)"
    vim "$@"
    stty "${STTYOPTS}"
}

但是这可能是将zsh用于此任务的更好方法:如果将唯一行ttyctl -f放入~/.zshrc,则zsh将在程序退出后自动恢复终端选项。 ttyctl是内置的zsh,因此您无法在bash中使用它。

答案 4 :(得分:1)

其他人介绍了发生的事情以及该怎么做。至于为什么,对此的答案可能在于Vim从xargs命令接收到的输入并尝试执行,好像该输入来自终端。我不知道怎么说终端,但是你可以想象Vim得到了一些奇怪的命令,它们使它崩溃或者告诉它退出。同样,当您捕获二进制文件时会发生不可预测的事情。

Anway,我有另一个想法。您是否尝试使用vimgrep浏览与模式匹配的文件列表?

:vimgrep /id="kw"/ *
:copen

当前目录中所有文件中的id="kw" greps。 :copen会打开一个包含匹配列表的窗口。您可以浏览该列表,单击“输入”以跳转到文件位置。

enter image description here

有关详细信息,请参阅

:help grep
:help :vimgrep
:help :copen
:help quickfix

如果您确实需要-I选项,请参阅

:help :grep
:help 'grepprg'

另请参阅:Vim: Warning: Input is not from a terminal

答案 5 :(得分:1)

尝试使用... | xargs sh -c '...',然后从控制终端设备/dev/tty读取。

echo ~/.profile ~/.bashrc | xargs sh -c 'vim "$@" </dev/tty' dummy_script_name

# based on a tip by Laszlo Ersek on http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2010-03/msg00051.html
#find . -maxdepth 1 -type f | xargs sh -c 'rm -i "$@" </dev/tty' dummy_script_name