Bash: 当出现“Vim:警告:输出不是终端”时如何杀死 Vim

36

有时候我会在命令行中犯错误,并在子shell中使用vim。

当然,这会锁定该终端窗口并输出一堆错误信息,其中主要的错误是:

Vim: Warning: Output not to a terminal

有没有办法让我配置vim,当它发生这种情况时自动关闭,并且不会挂起我的终端?

我知道我可以找到这个vim实例的进程ID并杀死它,但如果可能的话,我想要一个更好的解决方案,因为我通常会在不同的tmux面板/窗口中运行许多不同的vim实例。谢谢!


2
嗯,我不是要过分反对,但是询问如何使某物自动化,然后接受一个纯手动的答案似乎有点...令人惊讶。 - Charles Duffy
好观点 - 我忘记了那个,只是认为“无代码”解决方案可能对大多数人来说更容易 - 但你肯定是正确的,我会切换回你的答案;-) 谢谢! - Brad Parks
5个回答

47

我不知道有任何配置选项可以做到这一点,但当发生这种情况时,如果你输入:q<Enter>,它将退出vim。

此外,虽然Ctrl-C无法使用,但Ctrl-Z会将vim放到后台,然后您可以使用kill %1来杀死它。


我喜欢脚本的方法,但也很感激这个答案,因为我认为这在其他系统上也可以工作 - 尽管我觉得在某些锁定场景下我以前尝试过这种方法并没有帮助。我刚刚尝试了一下,做了类似这样的事情:vim $(vim /tmp/it.json),有时当我回忆起最后一个命令来编辑文件时,我没有先进行扩展。 - Brad Parks
2
@BradParks,对于 vim $(vim x) 这种情况,你可以通过输入 :q<Enter> 两次来退出。 - toth
在我的情况下,是 <ESC> 然后强制退出使用 :q<Enter> - wittich

31

或者vim的快捷键
ZQ
大写字母。您可以在正常模式下使用它 :-)


+1 Ctrl-ZCtrl-C都没用,它返回了一个消息“作业无法挂起”,什么也做不了。这个ZQ很有效,谢谢! - Rens Tillmann
ZQ为我解决了问题。 - Radagast

19
您可以很容易地防止它首先启动。考虑将以下函数定义放入您的.bashrc中:
vim() {
  [ -t 1 ] || { echo "Not starting vim without stdout to TTY!" >&2; return 1; }
  command vim "$@"
}

command内置命令可以防止递归,它确保调用外部命令(而不是再次调用函数)。

同样地,你可以创建一个脚本$HOME/bin/vim

#!/bin/sh
if [ -t 1 ]; then
  exec /usr/bin/vim "$@"
else
  echo "Not starting vim without stdout to TTY!" >&2
  exit 1
fi

$HOME/bin放在PATH的最前面,并让该代理程序(shim)执行工作,而不依赖于shell函数。


它是如何工作的?哪个程序会调用vim函数? - user2023370
@user2023370,“哪个程序”?用户的交互式shell。(如果该shell不是bash,则应根据情况将其放入不同的文件中)。 - Charles Duffy
@user2023370 制造了这个漏洞的程序员... 当漏洞出现在键盘和椅子之间时。;-) - F. Hauri - Give Up GitHub

12

即使它没有显示在标准输出中,您仍然可以输入以下内容并按Enter键:

  1. 键入以下内容 :q!

  2. 执行键盘上的回车/输入键


0
如果上述方法都不起作用,那么请尝试使用以下方法: 按一次esc,然后使用以下任一方法。
:qa

或者

SHIFT ZZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接