如何在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几乎从任何模式切换到正常模式,我不认为这个答案会变成错误的,但请注意,如果它不起作用,这个答案可能会过时。
我知道我不是直接回答这个问题,但我认为这是一个好方法。 没有人提到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 N
或Ctrl-\ Ctrl-N
将模式切换到Terminal-Normal ,允许移动光标,命令的运行方式类似于Vim的Normal模式。 要切换回terminal作业模式,请按i
。
其他答案在Neovim中提到了类似的function。
只有我知道的是通过使用vim-shell ,第三方补丁。
我现在用这个,你可以试试。 VimShell
尝试vterm ,这是一个非常充分的functionshell在vim中。 它的历史和function都比较小,还在开发中,但还是不错的