我可以在Vim窗口中发布交互式shell吗?


17

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

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

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


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

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

考虑切换到Neovim。现在,它具有一个内置的终端模拟器,该模拟器运行良好,可以在vim缓冲区中打开。
扎克2015年

Answers:


16

有几个允许这样做的vim插件。我用的是ConqueGithub)。

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

:ConqueTermSplit bash

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

另外另一个插件是vimshell


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

3
@SF请参阅:help shell-window。(简短回答:否。)
muru,2015年

3

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

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

我认为有两种方法在这方面效果更好。

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

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


3

在其中:help shell-window我们可以了解有关在窗口中执行shell命令的信息:

对于在Vim内部的窗口中执行Shell的可能性存在疑问。

答案:你不能!

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

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

但是,您可以使用几种解决方案:

  • 使用screen它是专为那种事情,例如设计:

    • Ctrl+ aS水平分割当前窗口
    • Ctrl+ aTab在窗口之间切换
    • Ctrl+ aX删除当前区域
    • Ctrl+ aQ删除除一个区域外的所有区域

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

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

  • VIM-Shell-第三方补丁

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

  • vterm -vim中的终端仿真器。

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

  • Vimux-轻松与vim中的tmux交互。

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

  • 其他已经提到的:征服

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


如何摆脱分裂?:-/
0xc0de

请参阅:GNU屏幕拆分
kenorb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.