如何在Vim内运行一个terminal?

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

我喜欢Emacs的一件事就是能够在Emacs中运行一个terminal。 这可能在Vim里面吗? 我知道你可以从Vim执行命令,但我希望能够在一个标签中运行一个terminal。

我肯定会推荐这样的screen 。 Vim是一个文本编辑器,而不是一个shell。

我将使用Ctrl + A S水平分割当前窗口,或者在Ubuntu的屏幕和其他修补版本中,可以使用Ctrl + A | (pipe)垂直分开。 然后使用Ctrl + A Tab (或在某些系统上等效, Ctrl + A Ctrl + I可能更容易input)在窗口之间切换。 还有其他的命令来改变窗口的大小和排列。

或者不太高级的screen使用只是打开多个全屏窗口并在它们之间切换。 这是我平时所做的,我只是偶尔使用分屏function。

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

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

我不确定你想要达到什么目的(我从来没有使用过Emacs),但是你可以在Vim里运行命令:

 :! somecommand [ENTER] 

如果你想input几个命令,或者在shell中玩一段时间,你总是可以使用:

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

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

Vim故意轻量级,缺乏非编辑types的function,就像在Vim窗格/选项卡中运行一个完整的shell一样,但是如上所述,有第三方插件如vim-shell可以让你做这样的事情。

通常情况下,如果我想在Vim和我的shell(Bash)之间切换,我只需按CTRL + Z来暂停Vim进程,在shell中播放,然后在返回Vim时键入'fg'和我的shell很好,分开。

解决这个问题的方法是用Ctrl + Z暂停Vim,在terminal中播放,然后用命令fg返回到Vim。

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

更新

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

noremap <Cd> :sh<cr>

这个问题相当古老,但对于那些发现它的人来说,有一个新的可能的解决scheme:Neovim包含一个完整的,一stream的terminal仿真器,它完全符合ConqueTerm的要求。 只需运行:term <your command here>

<C-\><Cn>将退出术语模式回到正常模式。 如果你像我一样喜欢逃避仍然退出术语模式,你可以添加到您的nvimrc:

 tnoremap <ESC><ESC> <C-\><CN> 

然后按ESC 两次将退出terminal模式回正常模式,所以你可以操纵仍在运行的命令正在写入的缓冲区。

虽然请记住,因为在发布这个答案的时候,nvim正处于重大的发展阶段,所以可能会增加另一种退出terminal模式的方式。 由于Ctrl + \ Ctrl + n几乎从任何模式切换到正常模式,我不认为这个答案会变成错误的,但请注意,如果它不起作用,这个答案可能会过时。

https://github.com/neovim/neovim

我知道我不是直接回答这个问题,但我认为这是一个好方法。 没有人提到tmux(或者至less不是一个独立的答案)。 Tmux是一个类似于屏幕的terminal多路复用器。 大多数东西都可以在两个多路复用器中完成,但是更简单的configuration。 此外tmux现在正在比屏幕更积极的发展,周围有一个相当大的生态系统,就像帮助configuration的工具一样。

另外对于vim来说,还有另一个插件: ViMUX ,它在两个工具之间的交互中有很大的帮助。 您可以通过

:call VimuxRunCommand("ls")

该命令在vim所在的当前窗格下面创build一个小的水平分割。

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

<Leader>vp :VimuxPromptCommand<CR>

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

  • vim-vroom :跑步者rspec,黄瓜和testing/单位; 通过g:vroom_use_vimux支持g:vroom_use_vimux
  • vimux-ruby-test :一组轻松运行rubytesting的命令
  • vimux-cucumber :通过Vimux运行黄瓜function
  • vim-turbux :使用tmux进行Turbo Rubytesting
  • vimux-pyutils : vimux的一组函数,允许在ipython中运行代码块
  • vimux-nose-test :在vimux中运行鼻子testing

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

有人已经build议https://github.com/Shougo/vimshell.vim ,但他们没有提到为什么。 因此,当我离开这个问题的时候,我浪费了很多其他的时间来尝试其他(更高的排名)选项。

首先/ vimshell是答案。 原因如下:

除了作为terminal模拟器外,VimShell还允许您以正常和可视模式浏览terminal输出。 因此,如果您运行的命令的结果输出,只想使用键盘复制和粘贴… VimShell涵盖了这一点。

没有提到的其他选项,包括NeoVim中的:terminal命令。 Neovim的terminal近在咫尺,但至less在以下方面有所下降:

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

  • 不支持modifiable = 1请参阅Github上的讨论 ,所以不能使用像vim-easymotion这样有用的插件。

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

不要浪费时间在其他选项,包括Neovim的:terminal。 去VimShell。

你可能想看一下:sh命令(参见:help sh Vim中的:help sh )。

各种命令

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

terminal窗口支持已添加到Vim 8.这是一个可选function,可以使用+terminalfunction编译Vim时启用。 如果你的Vim版本有terminal支持, :echo has('terminal')会输出“1”。

input:term将使您进入Terminal-Job模式,您可以按照预期使用terminal。

Terminal-Job模式下,按下Ctrl-W NCtrl-\ Ctrl-N将模式切换到Terminal-Normal ,允许移动光标,命令的运行方式类似于Vim的Normal模式。 要切换回terminal作业模式,请按i

其他答案在Neovim中提到了类似的function。

只有我知道的是通过使用vim-shell ,第三方补丁。

我现在用这个,你可以试试。 VimShell

尝试vterm ,这是一个非常充分的functionshell在vim中。 它的历史和function都比较小,还在开发中,但还是不错的