我知道我可以:!:r!执行外部命令,并可以选择将其输出插入文本。我什至可以执行:!sh,然后生成一个将一直存在的外壳,直到退出该外壳为止-但是,当该外壳处于活动状态时,Vim处于“睡眠状态”且无法访问。如果我想暂时返回Vim,我必须退出shell,并生成一个新的shell-不太有用。

我可以在另一端访问shell,方法是使用^ Z和通过bgfgjobs管理Vim作业。这更有意义,但从长远来看非常麻烦。我可以使用Screen(如果它不可用)(通常不可用),或者打开我的窗口管理器的几个窗口(然后按ssh依次从每个窗口中定位主机),以使vim和shell都位于远程主机上,这又很麻烦。 )

如果Vim允许我打开一个shell会话并将其保存在其(内部)窗口之一中,或者让我切换回它,那将是最愚蠢的。这样可能吗?

评论

因此,基本上,您想在:split中打开外壳程序,同时在另一个窗口中保留文件吗? ...这听起来像是tmux或屏幕的工作...

@Carpetsmoker:我经常无法控制远程系统上安装的内容,而且往往两者都不是,而Vim总是在那里。

考虑切换到Neovim。现在,它具有一个内置的终端仿真器,可以很好地运行,并且可以在vim缓冲区中打开。

如此处建议的,现在似乎出现了:terminal命令

#1 楼

有几个vim插件可以做到这一点。我使用Conque(Github)。

将其放入您的插件目录后,您需要做的是:

:ConqueTermSplit bash


在vim中将有一个交互式bash shell。然后,您可以使用常规的vim手势在窗口中执行其他操作。

另一个插件是vimshell。

评论


没有插件,没有办法做这样的事情吗?

– SF。
2015年2月6日,14:12

@SF参见:help shell-window。 (简短回答:否。)

–muru
2015年2月6日14:24



#2 楼

我相信使用VIM的插件并不是很好,尽管IMO vimshell最接近。但是,您需要了解这是一个两部分的问题。


VIM并非旨在执行此类操作,特别是麻烦的是能够执行任何长时间运行的任务,并且异步交谈而不阻塞VIM。在这种情况下,不仅是shell本身,而且是您可能在shell进程中执行的其他任务。
VIM的模态哲学不能很好地发挥我们与shell交互的方式。在外壳程序中,只有当前行是可编辑的,尽管您可以滚动查看带有外壳程序的历史记录的较旧文本,但无法对其进行编辑。这根本不符合VIM的原理,如果您按ESC键并返回到正常模式,将很难禁止用户返回并编辑上面的部分历史记录。

在我看来,有两种方法在这方面效果更好。


使用TMUX / Screen和Multiplex终端窗口同时具有vim和shell。这样,两者就可以很好地分开,但是您可以轻松地查看两者,并且可以在不影响彼此流程的情况下尽最大可能发挥作用。
使用tpope / vim-dispatch之类的插件您可以轻松地启动一个脱机命令,并使它们在实际的终端外壳中在后台异步运行,并在完成后将结果拉回到vim中。这也为您提供了两者之间相同的隔离级别,因此两者可以再次发挥出自己的最大能力,而不会踩到对方的脚趾。

我还要补充一点,那就是NeoVIM的核心目标之一是能够异步执行作业,因此NeoVIM可能会在这方面带来改变。但在那之前,这是我认为最好的。

#3 楼

:help shell-window中,我们可以了解有关在窗口中执行Shell命令的信息:
答案:你不能!

包括这将在Vim中添加很多代码,这是不这样做的一个很好的理由。毕竟,
Vim是编辑器,不应执行非编辑任务。
但是,要获得类似的信息,您可以尝试使用“ splitvt”程序拆分终端屏幕或显示窗口。

另一种方法是
“在BSD Unix系统上找到的“窗口”命令,该命令支持多个重叠的窗口。或“屏幕”程序。


,但是您可以使用的解决方案很少:



使用特别的screen为此类事物设计的,例如:



Ctrl + a,S可以水平拆分当前窗口


Ctrl + a,X可以删除当前区域

Ctrl + a,Q可以删除除一个区域之外的所有区域

有关更多信息,请参见:stackoverflow SE上的GNU屏幕生存指南

或者:GNU屏幕拆分,屏幕快速参考以获取更多详细信息。


VIM-Shell-第三方补丁


VIM-shell是VIM的扩展,具有分离的窗口,
,此修补程序使在这些窗口中启动shell成为可能。它
仅适用于POSIX系统



vterm-vim中的终端仿真器。


vterm的目标是为了在vim中提供unix终端的克隆,它可以直接使用而没有任何依赖性。

受tslime.vim的启发,该插件可让您将输入发送到tmux,vimux可以轻松地与vim中的tmux进行交互。


其他已经提到:征服

相关:如何在vim内运行终端?在stackoverflow

评论


如何摆脱分裂? :-/

– 0xc0de
15年7月31日在9:58

请参阅:GNU屏幕拆分

– Kenorb
15年7月31日在10:00