如何在Vim中运行终端?

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

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

392052 次浏览

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

我不确定你到底想要实现什么(我从未使用过Emacs),但你可以在Vim中通过键入以下命令来运行命令:

:! somecommand [ENTER]

如果你想输入几个命令,或者在shell中玩一会儿,你总是可以使用:

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

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

Vim是有意轻量级的,并且缺乏执行非编辑类型事情的能力,就像在Vim窗格/选项卡中运行一个完整的shell一样,但正如上面提到的,有第三方插件,如Vim -shell,允许您执行这类事情。

通常情况下,如果我想在Vim和shell (Bash)之间切换,我只需要按CTRL+Z来暂停Vim进程,在我的shell中玩,然后当我想返回Vim时键入'fg' -保持我的编辑器和shell良好且独立。

更新答案(11年后…):

  • 如果你选择使用该解决方案,我建议使用tmux而不是下面原始答案中建议的screen
  • Vim 8.1现在有一个内置的终端,可以用:term命令打开。这提供了与其余Vim特性更完整的集成。

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

我会使用Ctrl +一个年代来水平分割当前窗口,或者在Ubuntu的屏幕和其他补丁版本中,你可以使用Ctrl +一个|(管道)来垂直分割。然后使用Ctrl +一个选项卡(或在某些系统上等价地使用Ctrl +一个Ctrl +我,这可能更容易键入)在窗口之间切换。还有其他命令可以更改窗口的大小和排列。

或者,screen的一种不太高级的用法只是打开多个全屏窗口并在它们之间切换。这是我通常做的,我只是偶尔使用分屏功能。

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

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

各种命令 . b

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

  • 暂停Vim与Ctrl + Z
  • 在终点站玩,
  • 然后通过键入命令fg返回到你离开Vim的地方。

2011年8月过时

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

:sh然后Ctrl+D返回(bash)

更新:

你可以在vim中映射Ctrl+D来运行:sh,这允许你在bash和vim之间快速切换。

noremap <C-d> :sh<cr>

我知道我没有直接回答这个问题,但我认为这是一个 好方法。没有人提到tmux(或者至少没有作为一个 独立的回答)。Tmux是一种类似于屏幕的终端多路复用器。大多数 两种多路复用器都可以制作东西,但我认为这样更容易 配置。此外,tmux现在的开发比 屏幕上有相当大的生态系统围绕着它,比如有帮助的工具 配置,ecc.

同样对于vim,还有另一个插件:ViMUX,它在 两个工具之间的交互。

可以调用命令

:call VimuxRunCommand("ls")

该命令在当前窗格vim下面创建一个小的水平分割 。< / p >

它还可以让您从提示符运行,以防您不想运行 整个命令:< / p >

<Leader>vp :VimuxPromptCommand<CR>

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

这里有一个很好的“用例”:使用Vimux和Turbux与Spork和Guard随需测试

尝试vterm,这是vim中一个非常完整的功能shell。它的历史和清晰的功能略显缺陷,仍在开发中,但仍然相当不错

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

这个问题相当老了,但是对于那些发现它的人来说,有一个新的可能的解决方案:Neovim包含一个成熟的、一流的终端模拟器,它所做的正是ConqueTerm试图做的。简单地运行:term <your command here>

<C-\><C-n>将退出term模式返回正常模式。如果你像我一样,更喜欢escape仍然退出term模式,你可以把这个添加到你的nvimrc:

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

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

不过请记住,由于nvim在我发布这个答案的时候正在进行大量的开发,可能会添加另一种退出终端模式的方法。当Ctrl + \Ctrl + n从几乎任何模式切换到正常模式时,我不期望这个答案会出错,但请注意,如果它不起作用,这个答案可能已经过时了。

https://github.com/neovim/neovim

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

原因如下:

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

上面提到的其他选项,包括NeoVim中的:terminal命令,都不能做到这一点。Neovim的:terminal很接近,但至少在以下方面有不足

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

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

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

不要在其他选择上浪费时间,包括Neovim的:终端。用VimShell吧。

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

终端窗口支持被添加到Vim 8。这是一个可选特性,可以在使用+终端特性编译Vim时启用。如果你的Vim版本有终端支持,:echo has('terminal')将输出“1”。

输入:term将使您进入终端椎模式,在此模式下您可以按预期使用终端。

终端椎模式下,按Ctrl-W NCtrl-\ Ctrl-N将模式切换到Terminal-Normal,这允许光标移动,命令运行类似于Vim的正常的模式。要切换回终端椎模式,请按i

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

最终,一个本地:terminal命令在2017年被添加到vim中。

下面是来自:终端自述的摘录:

该特性用于在Vim窗口中运行终端模拟器。一个 作业可以连接到终端模拟器启动。例如, 运行shell:

 :term bash

或者运行build命令:

 :term make myprogram

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

:term

在Vim 8.1中添加。

请记住,每当终端窗口处于活动状态时,大多数击键将被简单地传递到终端,而不是具有它们通常的功能。Ctrl-W及其子命令是主要的例外。要向终端发送文字^W输入,请按Ctrl-W .。你也可以通过按Ctrl-W :打开Vim :命令行。其他Ctrl-W命令正常工作,因此无论当前选择的是什么类型的窗口,管理窗口的工作都是一样的。

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

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

假设你的vim版本首先支持+term命令,设置vim在一个命令中使用shell(例如set=/usr/bin/zsh),然后运行命令+term(例如bo 15vs +term)。你可能需要对你的Windows做一些额外的操作(例如删除一个并旋转),但你会有你的终端。

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

这篇文章将帮助你理解它们是如何一起工作的:'Tmux和Vim -更好的组合'

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

分割屏幕并运行命令term ++curwin在Vim缓冲区中运行终端。下面的命令既能做到这一点,也对我有用:

:bo 10sp | term ++curwin

如果你对快速答案感兴趣,这里是::绿色的术语。它会垂直分割你的屏幕并打开终端。

到目前为止,我已经尝试了很多这里提到的解决方案,我真正想要的是保持终端开放,同时在VsCode中编码类似的体验。然后我发现了一个对我非常有效的解决方法。

在安装之前:

  • 我正在使用Nvim 0.5,但我认为它可以用于任何版本,并在vim上进行检查
  • 我使用的是macOS卡特琳娜10.15.7版

设置集成终端

步骤1 -

  • 创建一个名为myQuickTerminal.vim或任何你想要的名称的脚本。
  • 输入以下脚本
"==============================================================================
"
" ▒█▀▀█ █░░█ ░▀░ █▀▀ █░█   ▀▀█▀▀ █▀▀ █▀▀█ █▀▄▀█ ░▀░ █▀▀▄ █▀▀█ █░░
" ▒█░▒█ █░░█ ▀█▀ █░░ █▀▄   ░▒█░░ █▀▀ █▄▄▀ █░▀░█ ▀█▀ █░░█ █▄▄█ █░░
" ░▀▀█▄ ░▀▀▀ ▀▀▀ ▀▀▀ ▀░▀   ░▒█░░ ▀▀▀ ▀░▀▀ ▀░░░▀ ▀▀▀ ▀░░▀ ▀░░▀ ▀▀▀
"
"==============================================================================
" " This is a script that will trigger a terminal quickly than the FloatTerminal
" open new split panes to right and below
"link: https://betterprogramming.pub/setting-up-neovim-for-web-development-in-2020-d800de3efacd
"==============================================================================
set splitright
set splitbelow
" turn terminal to normal mode with escape
tnoremap <Esc> <C-\><C-n>
" start terminal in insert mode
au BufEnter * if &buftype == 'terminal' | :startinsert | endif
" open terminal on ctrl+n
function! OpenTerminal()
split term://zsh
resize 10
endfunction
nnoremap <leader> n :call OpenTerminal()<CR>


请注意:如果你想运行bash而不是zsh,那么用bash替换zsh

步骤2 -

让我们源它,把它放在init.vim为neovim或`。Vimrc '表示vim

source $HOME/.config/nvim/modules/mySpecialScripts/myQuickTerminal.vim

这将在你保存和资源它之前预加载,你可以使用source $MYVIMRC快速重新加载init。vim文件。

步骤3 -

我映射,你可以看到在脚本n打开一个终端在一个新的窗格,我是(空格键),一旦我点击(空格+ n)终端将被触发,我将享受写我的代码,而终端是打开的。

  • 按“Esc”键退出终端插入模式。 现在,要切换到代码编辑器窗格,使用CTRL+w w。一旦打开了两个以上的面板,这个快捷键就会变得很烦人,所以我也添加了以下快捷键。 为了在打开的窗格中快速跳转,我也映射了这些,使用这些
" Better window navigation
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l

可选

如果你想让你的终端用键退出当前缓冲区。你可以使用

tnoremap <Esc> <C-\><C-n>:q!<CR>

但是因为我想在我使用的几个缓冲区之间切换而不关闭我使用的终端:

tnoremap <Leader><Esc> <C-\><C-n>:q!<CR>

最终结果


enter image description here

参考:

  • < a href = " https://betterprogramming。pub /设置-了- neovim - - web -发展-在- 2020 d800de3efacd noreferrer“rel = > https://betterprogramming.pub/setting -了- neovim - - web -发展-在- 2020 d800de3efacd < / >

自2017年以来,在vim中使用终端打开一个新标签是可能的,正如@fjardon所说:

只需输入::terminal。默认情况下,它将在当前选项卡上方打开一个选项卡。

如果你想在其他地方打开它,你可以尝试以下选项:

  • :below terminal:打开当前选项卡下面的终端。
  • :below vertical terminal:始终垂直向右打开终端。

你可以玩这些,直到你找到你喜欢的。在此之后,你可以在你的.vimrc配置文件中设置一个映射,对我来说,我使用:

nmap <leader>tt :below vertical terminal<CR>

这样我可以输入<space>tt(空格我的领导键)来快速打开它。

作为旁注:

  • 你可以用Ctrl+ Ctrl+W在你的选项卡(终端和其他缓冲区)之间切换。
  • 如果你想用Ctrl+W N复制你的命令,然后用ia进入普通终端模式,你可以在终端中进入可编辑模式。

干杯!

使用vim 8.1.3741,只需键入:terminal在vim中启动一个终端。

尝试映射:nnoremap ]t :terminal<CR>来更快地做到这一点!