如何在Vim内部运行终端?

时间:2009-08-06 01:36:31

标签: vim

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

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

23 个答案:

答案 0 :(得分:231)

2011年8月过时

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

答案 1 :(得分:183)

我不确定你想要实现的目标(我从未使用过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很好并且分开。

答案 2 :(得分:123)

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

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

答案 3 :(得分:114)

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

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

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

GNU Screen Survival Guide问题如果你不熟悉它,可以提供一些很好的提示。

答案 4 :(得分:79)

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

<强>更新

您可以在vim中映射ctrl+d以运行:sh,这样您就可以快速切换bash和vim。

noremap <C-d> :sh<cr>

答案 5 :(得分:69)

如果在您的Vim版本中启用,则可以使用:echo has('terminal')命令启动终端。

终端窗口支持已添加到Vim 8.这是一个可选功能,可以在使用+终端功能编译Vim时启用。如果您的Vim版本具有终端支持,:term将输出&#34; 1&#34;。

输入Ctrl-W N会将您置于 Terminal-Job 模式,您可以按预期使用终端。

终端作业模式下,按Ctrl-\ Ctrl-Ni可将模式切换为终端正常,从而可以移动光标以及与Vim的 Normal 模式类似的命令。要切换回终端作业模式,请按scale(1,-1)

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

答案 6 :(得分:30)

这个问题相当陈旧,但对于那些发现它的人来说,有一个新的可能解决方案: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

答案 7 :(得分:27)

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

以下摘自:terminal自述文件:

  

此功能用于在Vim窗口中运行终端仿真程序。一个   作业可以开始连接到终端仿真器。例如,到   运行shell:

 :term bash
     

或者运行build命令:

 :term make myprogram
     

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

答案 8 :(得分:21)

:term

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

答案 9 :(得分:17)

我知道我没有直接回答这个问题,但我认为这是一个问题 好方法。没有人提到过tmux(或者至少没有提到过 独立答案)。 Tmux是一种像屏幕一样的终端多路复用器。最 可以在两个多路复用器中制作东西,但是afaik tmux更容易 配置。此外,tmux现在正在积极发展 屏幕周围有一个很大的生态系统,就像有用的工具一样 配置,ecc。

同样对于vim,还有另一个插件:ViMUX,它有很多帮助 两种工具之间的相互作用。您可以使用以下命令调用命令:

:call VimuxRunCommand("ls")

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

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

<Leader>vp :VimuxPromptCommand<CR>

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

这是一个很好的“用例”:Tests on demand using Vimux and Turbux with Spork and Guard

答案 10 :(得分:13)

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

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

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

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

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

  • 不支持modifiable = 1查看a discussion on this at Github,因此无法使用vim-easymotion等有用的插件。

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

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

答案 11 :(得分:9)

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

Various commands

答案 12 :(得分:7)

答案 13 :(得分:4)

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

答案 14 :(得分:3)

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

答案 15 :(得分:3)

到目前为止,我已经尝试了很多这里提到的解决方案,我真正想要的是保持终端打开,同时在 VsCode 中编写类似的体验。然后我遇到了这个对我来说非常适合的解决方案。

安装前:

  • 我正在使用 Nvim 0.5,但我认为它适用于任何版本并且也在 vim 上进行了检查
  • 我使用的是 macOS Catalina 版本 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,请将 zsh 替换为 bash

步骤 -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

参考:

答案 16 :(得分:2)

试试vterm,这是vim中一个非常全功能的shell。它的历史和功能清晰,但仍在开发中,但它仍然很不错

答案 17 :(得分:2)

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

答案 18 :(得分:2)

如果您对快速回答感兴趣,这里是::vert term。它将垂直拆分您的屏幕并打开终端。

答案 19 :(得分:0)

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

const db = admin.firestore() 将在Vim内的另一个窗口中打开终端。

答案 20 :(得分:0)

我承认我并没有严格回答您的问题,但是在同一窗口中使用Vim和Terminals时,对我来说更好的方法是Tmux(类似于屏幕,类似于“在后台运行”) ,尽管此选项在拆分和制表符下效果更好)。

这篇文章将帮助您了解它们如何协同工作:'Tmux and Vim — even better together'

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

答案 21 :(得分:0)

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

:bo 10sp | term ++curwin

答案 22 :(得分:0)

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

只需输入::terminal。默认情况下,它会在当前标签上方打开一个标签。

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

  • :below terminal : 打开当前标签下的终端。
  • :below vertical terminal :始终垂直向右打开终端。

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

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

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

附注:

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

干杯!