如何在Vim内部运行终端?


303

我已经习惯了Emacs,但是我正在尝试Vim,看看我更喜欢哪一个。

我喜欢Emacs的一件事是能够在Emacs中运行终端。这可能在Vim内部吗?我知道您可以从Vim执行命令,但是我希望能够在选项卡中运行终端。



42
:! <command>你在找什么?
Takehin

47
从Vim 8.0开始,有一个:term命令可以在新的分割窗口中打开新的终端。如果对您不起作用,请检查vim --version | grep -o .terminal此功能是否可用(+terminal)或不可用(-terminal)。
Susam Pal '18

Answers:


123

我绝对会推荐这样screen的东西。Vim是文本编辑器,而不是外壳。

我会使用Ctrl+AS水平分割当前窗口,或者在Ubuntu的屏幕和其他修补版本中,可以使用Ctrl+A|(管道)垂直分割。然后使用Ctrl+ATab(或等效地在某些系统上,Ctrl+ACtrl+I可能更容易键入)在窗口之间切换。还有其他命令可以更改窗口的大小和排列。

或不那么高级的用途screen是打开多个全屏窗口并在它们之间切换。这是我通常所做的,我偶尔仅使用分屏功能。

GNU屏幕生存指南的问题有许多很好的提示,如果你不熟悉它的使用。


7
+1我只是最近才收到屏幕福音。我不知道我如何没有它。

118
我宁愿选择tmux而不是屏幕。
tomaszkubacki's

81
是的,当然可以运行屏幕,tmux或终结器,或者打开另一个窗口和alt标签,甚至可以使用通过脚踏板激活的KVM开关。但这不是重点-所有这些解决方案都牺牲了终端和VIM之间的集成,这就是为什么人们不愿意在此空间中寻找解决方案的原因。我什至不知道这个答案甚至是答案,更不用说顶级或公认的答案了。想我会去征服。
2013年

33
这是最高答案吗???您需要取消投票,然后投票否决下一个答案,这实际上可以回答您的问题。使用screen不会在vim中运行shell。这就像告诉某人启动另一个Shell。对于那些不断抛出“:!”的人 他已经说过,他知道如何执行命令,而这并不是他所要的。这里的嚣张气势如此之大,您可以用刀将其切开。
osirisgothra 2014年

6
由于新的vim 8.1功能Terminal Window
Alan Garrido '18

232

从2011年8月起过时

查看Conque Shell(也在GitHub上)。使您可以在vim中运行任何交互式程序,而不仅仅是shell。


21
:ConqueTerm bash <CR>vim <CR>:ConqueTerm bash...递归恐怖!
keflavich 2012年

1
psihodelia似乎是正确的。我刚刚使用--enable-pythoninterp编译了vim(cygwin并未使用+ python分发vim),并且在安装ConqueTerm之后,我从#set_buffer_settings中得到了一个错误。我还无法找到该函数的位置,也无法了解错误的含义。该消息包含有关无效参数“ edit ++ enc = utf-8 bash \-\ 2”的语句。啊
内特·肯尼迪

47
为了了解递归,您必须首先了解递归。
稳定狗2013年

19
@卢卡斯Niemier VIMCEPTION
塞巴斯蒂安Grignoli

1
似乎已不再支持此功能,有人可以替代吗?
dykeag '18

203

我不确定您要实现的目标(我从未使用过Emacs),但是您可以通过输入以下内容在Vim中运行命令:

:! somecommand [ENTER]

而且,如果您要键入几个命令或在shell中玩一会儿,则可以始终使用:

:! bash (or your favourite shell) [ENTER]

一旦命令或shell终止,您将可以选择按Enter返回到编辑器窗口

Vim特意是轻量级的,并且缺乏执行非编辑类型的功能的能力,就像在Vim窗格/选项卡中运行成熟的shell一样,但是如上所述,第三方插件(例如vim-shell)使您可以去做那种事情。

通常,如果我想在Vim和我的Shell(Bash)之间切换,我只需按CTRL+ Z暂停Vim进程,在我的Shell中播放,然后在我想回到Vim时键入'fg'-保持编辑器和我的外壳不错且分开。


17
如果要将命令的输出复制到当前缓冲区::r!dir
Cyber​​ Oliveira

6
我同时使用了Emacs和Vim(并且对Vim有更多的经验)。但是我发现,同时使用两个视图通常更好,更轻松(一个视图可以查看您正在编辑的内容,另一个视图可以在交互式外壳程序中工作-例如,测试您所做的配置更改的效果)刚刚编辑)。当我可能需要密切监视的重要事情没有在屏幕上消失时(例如在Vim中使用Ctrl-Z或:shell会发生的情况),这也有助于我的认知,保留和心理工作流程。
mvanle 2014年

这是一个很好的答案,它将节省很多时间。
jerry_sjtu 2015年

好答案!为了进一步补充它,我还将:r! command [ENTER]在评论中添加提及的内容。
Jeach

151

我解决这个问题的方法是:

  • 与暂停的Vim Ctrl+ Z
  • 在终端上玩
  • 然后只需输入命令返回到Vim的确切位置fg

14
:!bash是一种更好的方法
0atman 2012年

我认为他想要一种类似功能的Dreampie
Adam Miller

10
@Oatman为什么:!bash比这更好Ctrl+z?(只是想知道)
塞巴斯蒂安·格里戈诺利

2
@SebastiánGrignoli因为Ctrl+Z,例如,你可以移动到另一个文件夹,然后lsgit statusCtrl+Z是“暂停”,可以在“简历”用fg。但是,到目前为止,如我所知,使用:!bash时,您只能一次运行一个命令,或者即使一次可以运行多个命令,这仍然不方便。所以,总体来说,“按Ctrl + Z”要好得多
利奥

+1,因为这几乎可以在任何环境中使用。在我无法自定义的外部系统上工作,并通过廉价的PuTTY shell,这很好用。
t3sture

119

如果在您的Vim版本中启用,则可以使用以下:term命令启动终端。

终端窗口支持已添加到Vim 8中。它是一项可选功能,在使用+ terminal功能编译Vim时可以启用。如果您的Vim版本具有终端支持,:echo has('terminal')则将输出“ 1”。

输入后:term,您将进入“ 终端作业”模式,可以按预期使用终端。

Terminal-Job模式下,按Ctrl-W NCtrl-\ Ctrl-N将模式切换为Terminal-Normal,这类似于Vim的Normal模式,可移动光标并运行命令。要切换回终端作业模式,请按i

其他答案提到Neovim中的类似功能。


5
i从ctrl-wN浏览模式切换后如何切换回Terminal cmd模式的+1 。这甚至是tmux的杀手级功能,也可以在Windows上使用。
radke

1
是否可以使用进行垂直分割:term
Vitaly Zdanevich

1
超!很棒,因为它是内置的终端,所以我们不会把更多的插件弄乱。通过升级到vim 8 brew install vim --override-system-vi:term完美运行。感谢分享!
LeOn-韩立

18
@VitalyZdanevich,:vertical :term将与左侧窗口中的终端垂直分割。:vertical :botright :term将在右侧窗口中与终端垂直拆分。或者,您可以手动布置窗口,然后用于:term ++curwin在活动窗口中打开终端。
Daniel

esc ctrl-w w允许您在窗口之间切换
user1869582

87

:sh然后ctrl+d回到(bash)

更新

您可以ctrl+d在vim中映射为run :sh,这使您可以在bash和vim之间快速切换。

noremap <C-d> :sh<cr>


1
我认为ctrl+z而且fg速度稍快,因为您不必:sh在这种情况下键入。
亚历克斯

@Alex不,:sh如果您做地图,则不必键入。在之后noremap,您可以Ctrl+D从vim到sh,由于^D是EOF,它将终止sh,所以您将返回到vim。一键可在sh和vim 之间切换。
no1xsyzy

41

Vim 8.1的主要新功能是支持在Vim窗口中运行终端。

:term 将在Vim内的另一个窗口中打开终端。


2
这非常有效,谢谢!您的答案更多地是
出于

嗨,您知道如何退出此模式吗?
user3289737

2
就像在正常航站楼中一样,exit将退出航站楼,然后使用:q以关闭窗口
Yossarian42

2
@ user3289737或者,您可以连续两次按Ctrl + W在窗口之间切换。这并非特定于终端窗口,但效果也一样。
flarn2006 '19

39

最终:terminal在2017年将本机命令添加到了vim中。

这是摘录自:terminal自述文件:

此功能用于在Vim窗口中运行终端仿真器。可以开始将作业连接到终端仿真器。例如,运行一个shell:

 :term bash

或运行构建命令:

 :term make myprogram

该作业从Vim异步运行,该窗口将被更新以显示该作业的输出,同时也在另一个窗口中进行编辑。


终端在同一选项卡的缓冲区中运行。因此,如果您习惯于在vim中使用多个文件,则可能会遇到一些困难。交换缓冲区最终将到达终端,这是一个无法返回的点,您必须杀死终端。只要您知道这一点,就可以了。希望开发人员为此提供解决方法。
ArunMKumar '18年

1
@ArunMKumar使用[Ctrl + W]从终端“退出”,然后:bn照常执行。无需杀死终端,这也不是没有
归宿的方法

谢谢,伙计,完全错过了它。我已将:bn映射到某个键,它停止工作,再次恢复工作。是我不好
ArunMKumar '18年

2017?你是说2018年?
flarn2006 '18

1
@ flarn2006,关于2017年和2018年,Vim 8.1于2018年5月18日在vim.org上发布,其“主要功能”列为“支持在Vim窗口中运行终端”。该功能最早于2017年7月7日在补丁8.0.0693中可用。github.com/vim/vim/commit/...
丹尼尔·S·

32

这个问题已经很老了,但是对于那些发现它的人来说,有一个新的可能的解决方案:Neovim包含一个功能强大的一流终端仿真器,它确实可以完成ConqueTerm的工作。简单地运行:term <your command here>

<C-\><C-n>将退出学期模式回到正常模式。如果您像我一样,并且希望转义仍然退出术语模式,则可以将其添加到您的nvimrc中:

tnoremap <ESC><ESC> <C-\><C-N>

然后再按两次 ESC键将退出终端模式并返回正常模式,因此您可以操纵仍在运行的命令正在写入的缓冲区。

尽管要记住,由于我发布此答案时nvim的开发非常繁重,所以可以添加退出终端模式的另一种方法。当Ctrl+\Ctrl+n从几乎所有模式切换到普通模式时,我不希望这个答案会出错,但是请注意,如果它不起作用,那么这个答案可能会过时。

https://github.com/neovim/neovim


29

:term

此功能是Vim 8.1中新添加的,但是,此功能是在最近发布的,因此您可能需要进行更新才能使用。


它是在vim 8.1之前添加的。这只是vim 8.0.001没有的主要主要功能。这就是为什么它被宣传为vim 8.1新颖性。请参阅Daniel从2017年10月开始的答复以及fjardon在2018年
4

17

我知道我没有直接回答这个问题,但是我认为这是一个好方法。没有人提到过tmux(或者至少不是一个独立的答案)。Tmux是类似于屏幕的终端多路复用器。大多数东西都可以在两个多路复用器中完成,但是afaik tmux更加易于配置。另外,与屏幕相比,现在tmux的开发更加活跃,并且周围有相当大的生态系统,例如有助于配置的工具,例如ecc。

同样对于vim,还有另一个插件:ViMUX,在两个工具之间的交互中有很大帮助。您可以使用以下命令调用命令:

:call VimuxRunCommand("ls")

该命令在当前窗格vim所在的位置下方创建一个小的水平拆分。

如果您不想运行整个命令,它还可以让您从提示符处运行:

<Leader>vp :VimuxPromptCommand<CR>

由于还不够,至少有6个“特定于平台的插件”:

这是一个很好的“用例”:使用Vimux和Turbux以及Spork和Guard进行按需测试


关心解释为什么它被否决了吗?(这是6年前的答案)
Pablo Olmos de Aguilera C.

13

有人已经建议使用https://github.com/Shougo/vimshell.vim,但是他们没有提及原因。因此,当我摆脱这个问题时,我浪费了很多其他时间来尝试其他(排名更高)的选项。

Shougo / vimshell是答案。原因如下:

除了作为终端仿真器之外,VimShell还允许您以正常和可视模式浏览终端输出。因此,如果您运行的命令导致您只想使用键盘进行复制和粘贴的输出... VimShell可以解决此问题。

提到的其他选项都没有,包括NeoVim中的:terminal命令。Neovim的:terminal接近,但截至2017年2月18日至少在以下方面未能实现:

  • 将光标移动到缓冲区的末尾,而不是像VimShell一样将光标保持在同一位置。浪费大量时间。

  • 不支持modifiable = 1在Github上关于这个的讨论,不能使用像vim-的EasyMotion如此有用的插件。

  • 不像Vimshell那样支持行号的显示。

不要在其他选项上浪费时间,包括Neovim的:terminal。与VimShell一起使用。


1
NeoVim确实允许您以普通/可视模式从终端输出中导航和复制。我一直都这样做。使用NVIM 0.1.6-dev
爱丽丝·希顿

谢谢,我将尝试VimShell。但是,我已经从答案中删除了错误的陈述。正如@Alice指出的那样,NeoVim :terminal绝对可以做到这一点。
康拉德·鲁道夫

:terminal:VimShell在导航和编辑方面,以及从根本上讲,不能做相同的事情。请参阅上面的说明编辑。
user3751385


8

2
不要提建议splitvt-它会弄乱颜色控制代码,使它vim完全无法使用。
new123456 2011年

12
“否”是一个不好的答案。更好的答案是“默认情况下不。” 从技术上讲,这是可以做到的,也许您需要编写新的源代码并自己进行编译,或者编写一个插件。这简单吗?也许不是,但是可以做到。简单地说“不”更像是说“不,我不会那样做”。
trusktr

2
@AnishRamaswamy仍然无法使用普通vim在vim缓冲区中运行shell(与emacs不同)。这就是OP的问题。
2014年

1
@Amber,是的,除了OP没有提到使用stock vim之外,还可以。
阿尼斯·拉马斯瓦米

3
有人应该编辑此答案以说您无法使用stock vim做到这一点。
still_dreaming_1 2014年

4

我知道的唯一方法是使用第三方补丁vim-shell


简单来说,vim-shell是一个补丁,而不是“附加组件”(至少对我而言,意味着它是脚本)。我还没有亲自尝试过它,但是不幸的是,Vim wiki上的vim-shell页面提示它不会与Vim 7.1+一起编译。
Yewge

更改为安抚脚步。:)(必须输入超过15个字符的字符。“固定”的时间不够长)
rom09年9

Shougo / vimshell(github.com/Shougo/vimshell.vim)似乎工作得很好。它确实需要构建一个动态库,但是它非常简单(cd <vim> / vimproc; make)
Wayne Walker


2

尝试使用vterm,这是vim中几乎所有功能的shell。它具有悠久的历史和明确的功能,但仍处于开发阶段,但仍然相当不错


2

假设您的vim版本+term首先支持命令,则将vim的shell设置为在一个命令中使用(例如set=/usr/bin/zsh),然后运行该命令+term(例如bo 15vs +term)。您可能需要对窗口进行一些其他操作(即删除一个窗口并旋转),但是您将拥有终端。


0

我承认我并没有严格回答您的问题,但是在同一窗口中使用Vim和Terminals时,对我来说更好的方法是Tmux(类似于屏幕,这是一种“在后台运行的软件”,尽管一种更适合使用拆分和制表符)。

这篇文章将帮助您了解它们是如何协同工作的:“ Tmux和Vim –更好的结合在一起”

这样我们可以将Vim转换为功能强大的IDE


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.