我刚试过这个:
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
没有用,我想是因为控制台在其中插入了一些空白字符?无论如何,我想解释这种奇怪的行为。
答案 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
会打开一个包含匹配列表的窗口。您可以浏览该列表,单击“输入”以跳转到文件位置。
有关详细信息,请参阅
:help grep
:help :vimgrep
:help :copen
:help quickfix
如果您确实需要-I
选项,请参阅
:help :grep
:help 'grepprg'
答案 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