【问题标题】:How do I run a terminal inside of Vim?如何在 Vim 中运行终端?
【发布时间】:2010-11-17 05:14:39
【问题描述】:

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

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

【问题讨论】:

  • :! <command> 你在找什么?
  • 从 Vim 8.0 开始,有一个 :term 命令可以在新的拆分窗口中打开一个新的终端。如果它不适合您,请检查 vim --version | grep -o .terminal 以查看此功能是否可用 (+terminal) 或不可用 (-terminal)。
  • 使用:term,退出终端拆分,使用ctrl W:q

标签: vim


【解决方案1】:

【讨论】:

  • 不要采纳splitvt 的建议 - 它会破坏颜色控制代码并使vim 完全无法使用。
  • “否”是一个错误的答案。更好的答案是“默认情况下,不”。从技术上讲,是可以做到的,也许您需要编写新的源代码并自己编译,或者编写一个插件。这简单吗?也许不是,但可以做到。简单地说不更像是说“不,我不会这样做。”
  • @AnishRamaswamy 仍然无法使用普通 vim 在 vi​​m 缓冲区中运行 shell(与 emacs 不同)。这就是 OP 的问题所在。
  • @Amber,是的,除了 OP 没有提到使用股票 vim 之外,这很好。
  • 有人应该只是编辑这个答案,说你不能用股票 vim 做到这一点。
【解决方案2】:

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

【讨论】:

  • 为了迂腐,vim-shell 是一个补丁,而不是一个“附加组件”(至少对我来说,这意味着它是一个脚本)。我没有亲自尝试过,但不幸的是 Vim wiki 上的 vim-shell 页面表明它无法与 Vim 7.1+ 一起编译。
  • 改成安抚书呆子。 :)(必须输入超过 15 个字符的内容。“已修复”不够长)
  • Shougo/vimshell (github.com/Shougo/vimshell.vim) 似乎工作得很好。它确实需要构建一个动态库,但它非常简单(cd /vimproc; make)
【解决方案3】:

我不确定您想要实现的具体目标(我从未使用过 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 保持良好和分离。

【讨论】:

  • 如果你想将命令的输出复制到当前缓冲区::r!目录
  • 我同时使用 Emacs 和 Vim(并且对 Vim 有更多的经验)。但是我发现同时使用两个视图通常会更好也更容易(一个用于查看您正在编辑的内容,另一个用于在交互式外壳中工作 - 例如测试您拥有的配置更改的效果)刚刚编辑)。当我可能需要密切监视的重要事情不会从屏幕上消失时(例如在 Vim 中使用 Ctrl-Z 或 :shell 时会发生什么),它还有助于我的认知、保留和心理工作流程。
  • 这是一个很好的答案,可以节省我很多时间。
  • 不错的答案!为了进一步赞美它,我还要添加 cmets 中提到的:r! command [ENTER]
【解决方案4】:

更新答案(11 年后...):

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

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

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

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

如果您不熟悉 GNU Screen Survival Guide 问题的用法,您可以找到许多很好的提示。

【讨论】:

  • +1 我最近才收到屏幕福音。我想知道没有它我是如何生活的。
  • 我宁愿选择 tmux 而不是 screen。
  • 是的,当然可以运行 screen、tmux、terminator,或者打开另一个窗口和 alt-tab,甚至可以使用通过脚踏板激活的 KVM 开关。但这不是重点——所有这些解决方案都牺牲了终端和 VIM 之间的集成,这就是为什么人们会费心在这个领域寻找解决方案的原因。我不明白这个答案甚至是一个答案,更不用说顶级或接受的答案了。我想我会去试试 Conque。
  • 这是最佳答案???您需要取消投票并投票支持下一个答案,这实际上回答了您的问题。使用 screen 不会在 vim 中运行 shell。这就像告诉某人启动另一个shell。对于那些不断抛出“:!”的人他已经说过他知道如何执行命令,这不是他要求的……哎呀。这里的气焰太浓了,你可以用刀把它砍掉。
  • 由于 vim 8.1 的新功能Terminal Window,此答案应更新
【解决方案5】:

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

Various commands

【讨论】:

  • 所以不要在 vim 中使用 zsh。 set shell=/bin/sh 将使 vim 对其命令使用更安静的 shell。
【解决方案6】:

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

  • Ctrl + Z 暂停 Vim,
  • 在终端播放,
  • 然后只需键入命令fg 即可返回到您离开 Vim 的确切位置。

【讨论】:

  • :!bash 是一种更好的方法
  • 我想他想要一种梦幻般的功能
  • @Oatman 为什么:!bashCtrl+z 更好? (只是想知道)
  • @SebastiánGrignoli 因为以Ctrl+Z 为例,你可以移动到另一个文件夹,然后ls 然后git status 等等。Ctrl+Z 是一个“暂停”,你可以“继续” " 与fg。但是使用 :!bash,据我所知,一次只能运行一个命令,或者即使一次可以运行多个命令,仍然不方便。所以总的来说,“Ctrl+Z”要好得多
  • +1 因为这几乎适用于任何环境。在我无法自定义的外部系统上工作,并通过廉价的 PuTTY shell,效果很好。
【解决方案7】:

自 2011 年 8 月起已过时

查看Conque Shell(也在GitHub)。让您可以在 vim 中运行任何交互式程序,而不仅仅是 shell。

【讨论】:

  • :ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash....递归的恐怖!!
  • psihodelia 似乎是对的。我刚刚用--enable-pythoninterp 编译了vim(cygwin 不使用+python 分发vim)并且在安装ConqueTerm 之后,我从#set_buffer_settings 中得到一个错误。我无法追踪该函数的位置,也无法了解错误的含义。该消息包含有关无效参数“edit ++enc=utf-8 bash\ -\ 2”的声明。啊。
  • 要了解递归,首先要了解递归。
  • @Łukasz Niemier VIMCEPTION
  • 好像不再支持这个了,有人有替代的吗?
【解决方案8】:

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

更新

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

noremap <C-d> :sh<cr>

【讨论】:

  • 我认为 ctrl+zfg 稍微快一些,因为在这种情况下您不必输入 :sh
  • @Alex 不,如果你做地图,你不必输入:sh。在noremap 之后,您可以将Ctrl+D 从vim 转换为sh,并且由于^D 是EOF,它终止了sh,因此您将返回到vim。一键切换sh和vim。
【解决方案9】:

我知道我没有直接回答这个问题,但我认为这是一个 好办法。没有人提到 tmux(或者至少没有提到 独立答案)。 Tmux 是一个类似于 screen 的终端多路复用器。最多 可以在两个多路复用器中制作东西,但是 afaik tmux 更容易 进行配置。现在 tmux 的开发也比 屏幕周围有一个相当大的生态系统,比如可以提供帮助的工具 配置,ecc。

对于 vim,还有另一个插件:ViMUX,对 两种工具之间的交互。您可以使用以下命令调用命令:

:call VimuxRunCommand("ls")

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

如果您不想运行 整个命令:

<Leader>vp :VimuxPromptCommand<CR>

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

  • vim-vroom:rspec、黄瓜和测试/单元的运行器; vimux 支持通过g:vroom_use_vimux
  • vimux-ruby-test:一组用于轻松运行 ruby​​ 测试的命令
  • vimux-cucumber:通过 Vimux 运行 Cucumber Features
  • vim-turbux: 使用 tmux 进行 Turbo Ruby 测试
  • vimux-pyutils: vimux 的一组函数,允许在 ipython 中运行代码块
  • vimux-nose-test: 在 vi​​mux 中运行鼻子测试

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

【讨论】:

  • 想解释一下为什么它被否决了吗? (除了是 6 年前的答案)
【解决方案10】:

试试vterm,它是vim 内的一个功能齐全的shell。它的历史和清晰的功能有点小错误,仍在开发中,但它仍然很不错

【讨论】:

    【解决方案11】:

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

    【讨论】:

      【解决方案12】:

      这个问题相当老了,但对于那些发现它的人来说,有一个新的可能的解决方案:Neovim 包含一个成熟的一流终端仿真器,它完全符合 ConqueTerm 的尝试。只需运行:term <your command here>

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

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

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

      请记住,由于在我发布此答案时 nvim 正在大力开发,因此可能会添加另一种退出终端模式的方法。由于 Ctrl+\Ctrl+n 从几乎 any 模式切换到正常模式,我不希望这个答案会出错,但是请注意,如果它不起作用,则此答案可能已过时。

      https://github.com/neovim/neovim

      【讨论】:

        【解决方案13】:

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

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

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

        没有提到的其他选项,包括 NeoVim 中的 :terminal 命令。截至 2017 年 2 月 18 日,Neovim 的 :terminal 接近,但至少在以下方面

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

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

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

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

        【讨论】:

        • NeoVim 确实允许您在正常/可视模式下从终端输出导航和复制。我一直这样做。使用 NVIM 0.1.6-dev
        • 谢谢,我试试 VimShell。但是,我冒昧地从答案中删除了不正确的陈述。正如@Alice 所指出的,NeoVim 的:terminal 绝对可以做到这一点。
        • :terminal 在导航和编辑方面以及在基本方面都无法做到与:VimShell 相同。请参阅上面的解释编辑。
        【解决方案14】:

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

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

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

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

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

        【讨论】:

        • +1 了解如何在从 ctrl-w-N 浏览模式切换后使用 i 切换回终端 cmd 模式。即使在 tmux 上,这也是一个杀手级功能,并且也适用于 Windows。
        • 是否可以使用:term进行垂直分割?
        • 超级!内置终端很棒,所以我们不会弄乱更多插件。通过brew install vim --override-system-vi:term 升级到vim 8 完美运行。感谢分享!
        • @VitalyZdanevich, :vertical :term 将与左侧窗口中的终端垂直分割。 :vertical :botright :term 将与右侧窗口中的终端垂直分割。或者,您可以手动布局窗口,然后使用:term ++curwin 在活动窗口中打开终端。
        • esc ctrl-w w 允许你在窗口之间切换
        【解决方案15】:

        最终在 2017 年向 vim 添加了原生 :terminal 命令。

        这是:terminal自述文件的摘录:

        此功能用于在 Vim 窗口中运行终端仿真器。一种 可以连接到终端仿真器启动作业。例如,要 运行一个外壳:

         :term bash
        

        或者运行构建命令:

         :term make myprogram
        

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

        【讨论】:

        • 终端在同一选项卡的缓冲区中运行。所以如果你习惯在 vim 中使用多个文件,你可能会遇到一些困难。切换缓冲区最终会到达终端,从那里它是一个不归路,你必须杀死终端。只要您意识到这一点,就应该没问题。希望开发人员为此提供解决方法。
        • @ArunMKumar 使用 [Ctrl+W] 从终端“退出”,然后像往常一样执行:bn。无需杀死终端,这不是不归路:)
        • 谢谢,伙计,完全错过了。我已将 :bn 键映射到一个键,它停止工作,它又恢复了。这是我的错。
        • 2017 年?你是说 2018 年?
        • @flarn2006,关于 2017 年与 2018 年,Vim 8.1 于 2018 年 5 月 18 日在 vim.org 上发布,“支持在 Vim 窗口中运行终端”列为其“主要新功能” .该功能于 2017 年 7 月 7 日在补丁 8.0.0693 中首次提供。 github.com/vim/vim/commit/…
        【解决方案16】:

        :term

        在 Vim 8.1 中添加。

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

        【讨论】:

        • 它是在 vim 8.1 之前添加的。这只是 vim 8.0.001 所没有的主要大特性。这就是为什么它被宣传为 vim 8.1 的新奇事物。请参阅 Daniel 2017 年 10 月的回答和 fjardon 2018 年 4 月的回答。-> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
        • 不明白“要向终端发送文字 ^W 输入,请按 Ctrl-W ”的意思。你可以解释吗?谢谢
        • @abernier:当然。我的意思是,假设你正在 Vim 终端中运行一个程序,当你按下 Ctrl-W 时它会做一些事情。如果你只是按 Ctrl-W,程序不会看到它,因为 Vim 会取而代之。所以你要做的是,按下 Ctrl-W,然后按下句点 (.) 键,这将使终端中的程序看到 Ctrl-W。
        【解决方案17】:

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

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

        【讨论】:

        • 这很好用,谢谢!您的回答更符合原始问题的精神
        • 您好,您知道如何退出此模式吗?
        • 和普通终端一样,exit会退出终端,然后用:q关闭窗口
        • @user3289737 或者,您可以连续按两次 Ctrl+W 在窗口之间切换。这并不特定于终端窗口,但也同样有效。
        【解决方案18】:

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

        【讨论】:

          【解决方案19】:

          我承认我并没有严格回答您的问题,但是在同一窗口中使用 Vim 和终端时对我更有效的是 Tmux(类似于“在后台运行的软件”,类似于 screen ,虽然这个更适合拆分和制表符)。

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

          这样我们可以把 Vim 变成一个强大的 IDE

          【讨论】:

            【解决方案20】:

            分屏并运行命令term ++curwin 在 Vim 缓冲区内运行终端。以下命令对我有用并为我工作:

            :bo 10sp | term ++curwin
            

            【讨论】:

            • 好的提示,将屏幕放在所有打开的窗口下(至少它对我来说是这样)
            【解决方案21】:

            如果您有兴趣快速回答,这里是::vert term。它会垂直分割你的屏幕并打开终端。

            【讨论】:

              【解决方案22】:

              到目前为止,我已经尝试了很多这里提到的解决方案,我真正想要的是保持终端打开,同时在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
              

              可选

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

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

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

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

              最终结果


              参考:

              【讨论】:

              • 哇,你的字体被搞砸了。
              【解决方案23】:

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

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

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

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

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

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

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

              附注:

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

              干杯!

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-07-31
                • 1970-01-01
                • 2020-11-29
                • 2011-08-11
                • 2017-04-20
                • 2018-04-09
                相关资源
                最近更新 更多