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

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

评论

相关:stackoverflow.com/q/1879219/1569

是:! 您在寻找什么?

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

要使用:term,要退出终端拆分,请使用ctrl W和:q

#1 楼

更新的答案(11年后...):

如果您选择使用该解决方案,我建议使用tmux代替下面原始答案中所建议的screen

Vim 8.1现在具有内置终端,可以使用:term命令打开该终端。这提供了与Vim其余功能的更完整的集成。


我肯定会推荐screen这样的东西。 Vim是文本编辑器,而不是外壳程序。
我可以使用Ctrl + AS来水平拆分当前窗口,或者在Ubuntu屏幕和其他修补版本中,可以使用Ctrl + A |(pipe)来垂直拆分。然后使用Ctrl + ATab(或在某些系统上等效的Ctrl + ACtrl + I,可能更容易键入)在窗口之间切换。还有其他命令可以更改窗口的大小和排列。
或者稍稍不先进的使用screen就是打开多个全屏窗口并在它们之间切换。这是我通常要做的,我偶尔只使用分屏功能。
如果您不熟悉GNU屏幕生存指南的问题,则有很多不错的提示。

评论


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

–枪
09年8月11日在3:30

我宁愿选择tmux而不是屏幕。

–tomaszkubacki
2011年9月2日,下午4:52

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

–稳定狗
13年2月3日,13:53



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

– osirisgothra
14年8月15日在20:19

由于新的vim 8.1功能“终端窗口”,因此应更新此答案。

–艾伦·加里多(Alan Garrido)
18年7月19日在19:01

#2 楼

从2011年8月开始过时

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

评论


:ConqueTerm bash ,vim ,:ConqueTerm bash ....递归恐怖!

–keflavich
2012年1月25日下午5:11

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

–内特·肯尼迪(Nate Kennedy)
2012年7月20日下午4:55

为了了解递归,您必须首先了解递归。

–稳定狗
13年2月3日在14:26

@ŁukaszNiemier VIMCEPTION

–塞巴斯蒂安·格里尼戈利(SebastiánGrignoli)
13年2月16日在2:06

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

–堤防
18年4月10日在15:14

#3 楼

我不确定您要实现的目标(我从未使用过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'-保持我的编辑器和我的shell美观且独立。

评论


如果要将命令的输出复制到当前缓冲区::r!目录

–网络Oliveira
09年8月12日在19:03

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

–mvanle
2014年3月24日22:02



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

– jerry_sjtu
15年11月18日在4:18

好答案!为了进一步赞美它,我还要添加:r!注释中提到的命令[ENTER]。

–each
19年8月2日在13:49

#4 楼

解决这个问题的方法是:


用Ctrl + Z暂停Vim,在终端中播放,
然后返回到与Vim完全相同的位置只需输入命令fg即可。


评论


:bash是一种更好的方法

–0atman
2012年3月16日11:14



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

–亚当·米勒(Adam Miller)
13年1月12日在22:04

@Oatman为什么:!bash比Ctrl + z好? (就是想)

–塞巴斯蒂安·格里尼戈利(SebastiánGrignoli)
13 Feb 16'2:07



@SebastiánGrignoli,因为例如,使用Ctrl + Z可以移动到另一个文件夹,然后按ls依次转到git status等。Ctrl + Z是“暂停”,可以用fg“恢复”。但是,到目前为止,用:!bash只能一次运行一个命令,或者即使一次可以运行多个命令,这仍然不方便。因此总的来说,“ Ctrl + Z”要好得多

–狮子座
2013年6月6日4:17



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

–t3sture
17年12月17日在2:45

#5 楼

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

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

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

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

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

评论


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

– radke
17-10-24在13:36

可以使用:term垂直分割吗?

– Vitaly Zdanevich
17年11月8日在10:03

超!很棒,因为它是内置的终端,所以我们不会被更多的插件弄得一团糟。通过brew install vim --override-system-vi和:term完美升级到vim 8。感谢分享!

–LeOn-韩立
18-2-20在5:25



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

– dannyadam
18年5月25日在16:08



esc ctrl-w w允许您在Windows之间切换

–user1869582
20年4月9日,0:02

#6 楼

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

更新:

您可以在vim中映射ctrl+d来运行:sh,这使您可以在bash和vim之间快速切换。 br />
noremap <C-d> :sh<cr>

评论


我认为ctrl + z和fg稍快一些,因为在这种情况下不必键入:sh。

– Alex
16 Dec 6'在17:51

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

–InQβ
19-10-10在1:20

#7 楼

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

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

评论


这很完美,谢谢!您的回答更多是出于原始问题的精神

– Subelsky
19年6月12日在13:36

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

–椰子
19年6月13日在10:36

就像在普通终端中一样,退出将退出终端,然后使用:q关闭窗口

– Yossarian42
19年6月13日在12:31



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

– Flarn2006
19年6月24日在4:24

#8 楼

最终在2017年向vim添加了一个本机:terminal命令。

以下摘录自:terminal自述文件:


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

 :term bash


或运行构建命令:

 :term make myprogram


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


评论


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

– ArunMKumar
18年7月6日在4:54

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

– fjardon
18年7月6日在9:09

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

– ArunMKumar
18年7月10日在8:17

2017?你是说2018年?

– Flarn2006
18年3月3日,2:16

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

– dannyadam
20-4-24在22:03



#9 楼

:term
在Vim 8.1中已添加。
请记住,每当终端窗口处于活动状态时,大多数击键都将简单地传递给终端,而不具有其通常的功能。 Ctrl-W及其子命令是主要例外。要将文本^W输入到终端,请按Ctrl-W。您也可以按.打开Vim :命令行。其他Ctrl-W命令正常运行,因此无论当前选择哪种类型的窗口,管理窗口的功能都相同。

评论


它是在vim 8.1之前添加的。这只是vim 8.0.001没有的主要主要功能。这就是为什么它被宣传为vim 8.1新颖性。请参阅Daniel从2017年10月开始的答复以及fjardon在2018年4月得到的答复。-> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814

–卢克·赫米特(Luc Hermitte)
18年5月23日在6:39



#10 楼

这个问题已经很老了,但是对于那些发现它的人来说,有一个新的可能的解决方案: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

#11 楼

我知道我没有直接回答这个问题,但是我认为这是一个很好的方法。没有人提及tmux(或至少没有作为独立答案)。 Tmux是类似于屏幕的终端多路复用器。大多数
材料都可以在两个多路复用器中完成,但是afaik tmux可以更轻松地配置
。另外,tmux现在比
屏幕要活跃得多,并且周围有相当大的生态系统,例如可以帮助
进行配置的工具,例如

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

:call VimuxRunCommand("ls")

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

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

<Leader>vp :VimuxPromptCommand<CR>

因为还不够, vim-vroom:至少有6个“平台特定插件”:



vim-vroom:rspec,cucumber和test / unit的运行程序;通过g:vroom_use_vimux提供vimux支持


vimux-ruby-test:一组可轻松运行ruby测试的命令

vimux-cucumber:通过Vimux运行Cucumber功能

vim-turbux:使用tmux进行Turbo Ruby测试

vimux-pyutils:vimux的一组函数,允许在ipython中运行代码块

vimux -nose-test:在vimux中运行鼻子测试

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

评论


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

– Pablo Olmos de Aguilera C.
18-11-23在23:02



#12 楼

有人已经建议使用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。

评论


NeoVim确实允许您在普通/可视模式下从终端输出中导航和复制。我一直都这样做。使用NVIM 0.1.6-dev

–爱丽丝·希顿(Alice Heaton)
16-10-27在9:17

谢谢,我将尝试VimShell。不过,我已自由删除答案中的错误陈述。正如@Alice指出的那样,NeoVim的:terminal绝对可以做到这一点。

–康拉德·鲁道夫(Konrad Rudolph)
17年2月9日,11:10

:terminal在导航和编辑以及基本方式上不能与:VimShell相同。请参阅上面的说明编辑。

–user3751385
17-2-18在17:24



#13 楼

您可能想看看:sh命令(请参阅Vim中的:help sh)。

各种命令

评论


因此,请勿将zsh与vim一起使用。 set shell = / bin / sh将使vim在其命令中使用安静的shell。

–罗斯压机
2015年2月13日在18:18



#14 楼

不,您不能:

http://vimdoc.sourceforge.net/htmldoc/tips.html#shell-window

评论


不要采取splitvt的建议-它会破坏颜色控制代码,并使vim完全无法使用。

–new123456
2011年6月24日23:22

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

–trusktr
13年4月6日,下午1:53

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

–琥珀色
2014年2月26日在22:47



@Amber,是的,除了OP没有提到使用stock vim之外,还可以。

–阿尼什·拉马斯瓦米(Anish Ramaswamy)
2014年2月26日在22:50



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

–still_dreaming_1
2014年4月7日14:25

#15 楼

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

评论


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

–紫杉
09年8月6日14:38

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

–罗马
09年8月6日在16:52

Shougo / vimshell(github.com/Shougo/vimshell.vim)似乎运行良好。它确实需要构建一个动态库,但这非常简单(cd / vimproc; make)

–Wayne Walker
2015年10月27日在18:53

#16 楼

我现在使用它,您可以尝试。 VimShell

#17 楼

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

#18 楼

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

#19 楼

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

这篇文章将帮助您了解它们如何协同工作:“ Tmux和Vim —更好地在一起”。

通过这种方式,我们可以将Vim转换为功能强大的IDE

#20 楼

分割屏幕并运行命令term ++curwin以运行Vim缓冲区内的终端。以下命令可以同时为我工作:

:bo 10sp | term ++curwin