如何在Vim内部运行终端?

Eva*_*van 283 vim

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

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

Kyl*_*mek 231

从2011年8月开始过时

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

  • 为了理解递归,您必须首先了解递归. (45认同)
  • 使用Conque你可以在Vim里面的Vim里面运行Vim ... (41认同)
  • 这是我见过的最酷的事情. (39认同)
  • `:ConqueTerm bash <CR>`,`vim <CR>`,`:ConqueTerm bash` ....递归恐怖!! (21认同)
  • @ŁukaszNiemierVIMCEPTION (18认同)
  • 西霍迪利亚似乎是对的。我刚刚使用 --enable-pythoninterp 编译了 vim(cygwin 不使用 +python 分发 vim),并且在安装 ConqueTerm 后,我收到 #set_buffer_settings 的错误。我无法追踪该函数所在的位置,也无法了解该错误的含义。该消息包含有关无效参数“edit ++enc=utf-8 bash\ -\ 2”的声明。啊。 (2认同)
  • 与 zsh 一起使用,太棒了!D b (2认同)

Dav*_*dge 195

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

:! somecommand [ENTER]
Run Code Online (Sandbox Code Playgroud)

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

:! bash (or your favourite shell) [ENTER]
Run Code Online (Sandbox Code Playgroud)

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

Vim是故意轻量级的,缺乏执行非编辑类型的功能,就像在Vim窗格/选项卡中运行一个完整的shell一样,但如上所述,有第三方插件,如vim-shell,允许你做那种事.

通常,如果我想在Vim和我的shell(Bash)之间切换,我只需按CTRL+ Z来暂停Vim进程,在我的shell中玩,然后当我想回到Vim时键入'fg' - 保持我的编辑器和我的贝壳很好,分开.

  • 如果你想将命令的输出复制到当前缓冲区:: r!DIR (17认同)
  • 我同时使用Emacs和Vim(并且对Vim有更多经验).但是我发现通常同时使用两个视图更好更容易(一个用于查看您正在编辑的内容,另一个用于在交互式shell中工作 - 例如,用于测试您具有的配置更改的效果刚刚编辑过).当我需要密切监视的重要事项不会从屏幕上消失时(例如在Vim中使用Ctrl-Z或:shell时会发生什么),它还有助于我的认知,保留和心理工作流程. (6认同)

ptr*_*rin 133

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

  • Ctrl+ 暂停Vim Z,
  • 在终端玩,
  • 然后只需输入命令即可返回到Vim离开的位置fg.

  • ``:!bash``是一种更好的方式 (12认同)
  • @Oatman为什么`:!bash`比`Ctrl + z`更好?(就是想) (8认同)
  • @SebastiánGrignoli 因为例如使用`Ctrl+Z`,你可以移动到另一个文件夹,然后是`ls`,然后是`git status`,等等。`Ctrl+Z` 是一个“暂停”,你可以用`恢复“ fg`。但是使用 :!bash,据我目前所知,您一次只能运行一个命令,或者即使您可以一次运行多个命令,仍然不方便。所以总的来说,'Ctrl+Z'要好得多 (2认同)

Gre*_*ill 118

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

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

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

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

  • 我宁愿选择tmux而不是屏幕. (101认同)
  • 是的,当然可以运行屏幕,或tmux或终结器,或打开另一个窗口和alt-tab,甚至可以使用用脚踏板激活的KVM开关.但这不是重点 - 所有这些解决方案都牺牲了终端和VIM之间的*集成*,这就是为什么人们会在这个领域寻找解决方案的原因.我不明白这个答案是如何答案的,更不用说顶部或接受的答案了.想想我会去尝试Conque. (72认同)
  • 这是怎么回答?你需要不投票并将下一个答案投票,这实际上回答了你的问题.使用屏幕不会在vim中运行shell.这就像告诉某人开始另一个shell.对于那些不断抛出":!"的人 他已经知道他知道如何执行命令,这不是他要求的......谢谢.傲慢如此厚实,你可以用刀切它. (31认同)
  • +1我刚刚收到了屏幕福音.我想知道没有它我是如何生活的. (7认同)
  • 由于新的vim 8.1功能[Terminal Window](https://www.vim.org/vim-8.1-released.php),因此应更新此答案。 (4认同)
  • 我的看法是一样的。这是一个不错的选择,但不能回答问题 (2认同)

Dan*_* S. 85

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

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

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

终端 - 作业模式下,按Ctrl-W NCtrl-\ Ctrl-N将模式切换到终端正常,这样可以移动光标,并且命令可以像Vim的正常模式一样运行.要切换回终端作业模式,请按i.

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

  • @VitalyZdanevich,`:vertical:term`将与左侧窗口中的终端垂直分开.`:vertical:botright:term`将在右侧窗口中与终端垂直分开.或者,您可以手动布局窗口,然后使用`:term ++ curwin`在活动窗口中打开终端. (14认同)
  • 从ctrl-wN浏览模式切换后,如何用`i`切换回终端cmd模式的+1.即使在tmux上,这也是一个杀手级功能,也适用于Windows. (3认同)
  • 是否可以使用`:term`进行垂直分割? (3认同)
  • 极好的!很棒的是,终端是内置的,这样我们就不用担心更多的插件了。通过 `brew install vim --override-system-vi` 升级到 vim 8,并且 `:term` 完美运行。感谢分享! (2认同)
  • esc ctrl-w w 允许您在窗口之间切换 (2认同)

tes*_*ter 84

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

更新:

你可以ctrl+d在vim中映射运行:sh,这允许你快速在bash和vim之间切换.

noremap <C-d> :sh<cr>

  • 我认为 `ctrl+z` 和 `fg` 稍微快一点,因为在这种情况下您不必输入 `:sh`。 (2认同)
  • @Alex 不,如果你做地图,你不必输入 `:sh` 。在`noremap`之后,你可以通过`Ctrl+D`从vim切换到`sh`,并且由于`^D`是EOF,它终止了`sh`,所以你会返回到vim。一键可以在 `sh` 和 vim 之间切换。 (2认同)

lah*_*ran 31

这个问题相当陈旧,但对于那些发现它的人来说,有一个新的可能的解决方案:Neovim包含一个完整的,一流的终端模拟器,它完全符合ConqueTerm所尝试的.简单地跑:term <your command here>.

<C-\><C-n>将退出术语模式回到正常模式.如果你喜欢我并且喜欢逃脱仍然退出术语模式,你可以将它添加到你的nvimrc:

tnoremap <ESC><ESC> <C-\><C-N>
Run Code Online (Sandbox Code Playgroud)

然后按ESC 两次将退出终端模式回到正常模式,这样你就可以操作仍在运行的命令写入的缓冲区.

虽然记住,因为当我发布这个答案时,nvim正在大力发展,可能会增加另一种退出终端模式的方法.由于Ctrl+\Ctrl+n几乎切换到普通模式的任何模式,我不认为这个答案会变成错的,但要注意,如果它不工作,这个答案可能是过时的.

https://github.com/neovim/neovim


fja*_*don 31

最终:terminal在2017年将一个本机命令添加到vim.

以下摘录自:终端自述文件:

此功能用于在Vim窗口中运行终端仿真程序.可以启动作业连接到终端仿真器.例如,要运行shell:

 :term bash
Run Code Online (Sandbox Code Playgroud)

或者运行build命令:

 :term make myprogram
Run Code Online (Sandbox Code Playgroud)

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

  • @ArunMKumar 使用 [Ctrl+W] 从终端“逃逸”,然后像往常一样执行 `:bn`。无需杀死终端,这不是一个不归路:) (2认同)

fla*_*006 25

:term

此功能是在Vim 8.1中新添加的,但是,该帖子刚刚发布,因此您可能需要更新才能使用它.


Pab*_* C. 17

我知道我没有直接回答这个问题,但我认为这是一个很好的方法.没人提到tmux(或者至少不是一个独立的答案).Tmux是一种像屏幕一样的终端多路复用器.大多数东西可以在两个多路复用器中制作,但是afaik tmux更容易配置.此外,tmux现在比屏幕更加活跃,并且周围有相当大的生态系统,比如有助于配置的工具,ecc.

另外对于vim,还有另一个插件:ViMUX,它可以帮助很多工具之间的交互.您可以使用以下命令调用命

:call VimuxRunCommand("ls")

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

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

<Leader>vp :VimuxPromptCommand<CR>

由于没有实现,至少有6个'平台特定插件':

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


Sam*_*Sam 16

自 2017 年以来,可以在 vim 中使用终端打开一个新选项卡,正如 @fjardon 所说:

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

如果您希望它在其他地方打开,您可以尝试以下选项:

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

您可以尝试这些,直到找到您喜欢的。之后,您可以在.vimrc配置文件中设置地图,对我来说,我使用:

nmap <leader>tt :below vertical terminal<CR>
Run Code Online (Sandbox Code Playgroud)

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

作为旁注:

  • Ctrl您可以使用+ W Ctrl+在选项卡(终端和其他缓冲区)之间切换W
  • Ctrl如果您想使用+复制命令并使用或W N进入正常终端模式,您可以在终端中进入可编辑模式。ia

干杯!


use*_*385 13

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

Shougo/vimshell就是答案.原因如下:

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

没有提到的其他选项,包括NeoVim中的:terminal命令.Neovim's:终端接近,但截至2017年2月18日至少有以下方式:

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

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

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

不要在其他选项上浪费时间,包括Neovim's:终端.使用VimShell.


Yos*_*n42 12

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

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

  • 这工作完美,谢谢!您的回答更符合原始问题的精神 (3认同)
  • 就像在普通终端中一样,`exit` 将从终端退出,然后使用 `:q` 关闭窗口 (2认同)
  • @user3289737 或者,您可以连续按两次 Ctrl+W 在窗口之间切换。这并非特定于终端窗口,但也适用。 (2认同)

小智 9

您可能想查看该:sh命令(请参阅:help shVim).

各种命令


Amb*_*ber 7

你不能:

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

  • "不"是一个糟糕的答案.一个更好的答案是"默认情况下,没有." 从技术上讲,它可以完成,也许你需要编写新的源代码并自己编译,或者编写一个插件.这简单吗?也许不是,但可以做到.简单地说"不"更像是在说"不,我不会这样做". (12认同)
  • 有人应该编辑这个答案,说你不能用stock vim做. (3认同)
  • 转移到:http://vimdoc.sourceforge.net/htmldoc/tips.html#shell-window (2认同)
  • 不要接受"splitvt"的建议 - 它会破坏颜色控制代码并使"vim"完全无法使用. (2认同)
  • @AnishRamaswamy仍然无法使用stock vim在vim缓冲区中运行shell(与emacs不同).这就是OP的问题所在. (2认同)

Dr *_*Neo 5

到目前为止,我已经尝试了这里提到的很多解决方案,我真正想要的是保持终端打开,同时在VsCode. 然后我发现了这个非常适合我的解决方案。

\n

安装前:

\n
    \n
  • 我正在使用Nvim 0.5,但我认为它可以适用于任何版本,并且还检查过vim
  • \n
  • 我使用的是 macOS Catalina 版本 10.15.7
  • \n
\n

设置您的集成终端

\n

步骤1-

\n
    \n
  • 使用名称myQuickTerminal.vim或任何您想要的名称创建一个脚本。
  • \n
  • 放入以下脚本
  • \n
\n
"==============================================================================\n"\n" \xe2\x96\x92\xe2\x96\x88\xe2\x96\x80\xe2\x96\x80\xe2\x96\x88 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x91\xe2\x96\x88 \xe2\x96\x91\xe2\x96\x80\xe2\x96\x91 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x88 \xe3\x80\x80 \xe2\x96\x80\xe2\x96\x80\xe2\x96\x88\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x80\xe2\x96\x88 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x84\xe2\x96\x80\xe2\x96\x88 \xe2\x96\x91\xe2\x96\x80\xe2\x96\x91 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x80\xe2\x96\x84 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x80\xe2\x96\x88 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x91\n" \xe2\x96\x92\xe2\x96\x88\xe2\x96\x91\xe2\x96\x92\xe2\x96\x88 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x91\xe2\x96\x88 \xe2\x96\x80\xe2\x96\x88\xe2\x96\x80 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x91 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x84 \xe3\x80\x80 \xe2\x96\x91\xe2\x96\x92\xe2\x96\x88\xe2\x96\x91\xe2\x96\x91 \xe2\x96\x88\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x88\xe2\x96\x84\xe2\x96\x84\xe2\x96\x80 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x80\xe2\x96\x91\xe2\x96\x88 \xe2\x96\x80\xe2\x96\x88\xe2\x96\x80 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x91\xe2\x96\x88 \xe2\x96\x88\xe2\x96\x84\xe2\x96\x84\xe2\x96\x88 \xe2\x96\x88\xe2\x96\x91\xe2\x96\x91\n" \xe2\x96\x91\xe2\x96\x80\xe2\x96\x80\xe2\x96\x88\xe2\x96\x84 \xe2\x96\x91\xe2\x96\x80\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x91\xe2\x96\x80 \xe3\x80\x80 \xe2\x96\x91\xe2\x96\x92\xe2\x96\x88\xe2\x96\x91\xe2\x96\x91 \xe2\x96\x80\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x91\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x91\xe2\x96\x91\xe2\x96\x91\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x80\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x91\xe2\x96\x91\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x91\xe2\x96\x91\xe2\x96\x80 \xe2\x96\x80\xe2\x96\x80\xe2\x96\x80\n"\n"==============================================================================\n" " This is a script that will trigger a terminal quickly than the FloatTerminal\n" open new split panes to right and below\n"link: https://betterprogramming.pub/setting-up-neovim-for-web-development-in-2020-d800de3efacd\n"==============================================================================\nset splitright\nset splitbelow\n" turn terminal to normal mode with escape\ntnoremap <Esc> <C-\\><C-n>\n" start terminal in insert mode\nau BufEnter * if &buftype == \'terminal\' | :startinsert | endif\n" open terminal on ctrl+n\nfunction! OpenTerminal()\n  split term://zsh\n  resize 10\nendfunction\nnnoremap <leader> n :call OpenTerminal()<CR>\n\n
Run Code Online (Sandbox Code Playgroud)\n

注意:如果您出于特定原因想要运行 bash 而不是 zsh,则替换zshbash.

\n

第2步-

\n

让我们获取它,将其放入init.vimneovim 或 vim 的“.vimrc\”中

\n
source $HOME/.config/nvim/modules/mySpecialScripts/myQuickTerminal.vim\n
Run Code Online (Sandbox Code Playgroud)\n

这将在您保存和资源化时提前预加载,您可以使用它source $MYVIMRC来快速重新加载 init.vim 文件。

\n

步骤-3-

\n

正如您在脚本 n 中看到的那样,我进行了映射,以在新窗格中打开终端,我的是(空格键),一旦我单击(空格 + n),就会触发终端,我将喜欢在终端上编写代码被打开。

\n
    \n
  • 要退出终端中的插入模式,请按 Esc。\n现在,要切换到代码编辑器窗格,请使用 CTRL+w w。一旦打开两个以上的面板,此快捷方式就会变得烦人,因此我也添加了以下快捷方式。\n我也映射了这些快捷方式,以便在打开的窗格之间快速跳转,请使用这些
  • \n
\n
" Better window navigation\nnnoremap <C-h> <C-w>h\nnnoremap <C-j> <C-w>j\nnnoremap <C-k> <C-w>k\nnnoremap <C-l> <C-w>l\n
Run Code Online (Sandbox Code Playgroud)\n

选修的

\n

如果您希望终端使用 key 退出当前缓冲区。您可以使用

\n
tnoremap <Esc> <C-\\><C-n>:q!<CR>\n
Run Code Online (Sandbox Code Playgroud)\n

但因为我想在几个缓冲区之间切换,所以我在不关闭终端的情况下使用:

\n
tnoremap <Leader><Esc> <C-\\><C-n>:q!<CR>\n
Run Code Online (Sandbox Code Playgroud)\n

最终结果

\n
\n

在此输入图像描述

\n

参考:

\n\n