【问题标题】:How can I open a Shell inside a Vim Window?如何在 Vim 窗口中打开 Shell?
【发布时间】:2011-02-16 11:40:43
【问题描述】:

我可以在 Vim 中使用 :shell 命令打开一个 shell,但是我不能在编辑文件的同时使用 shell。

有没有办法在多个窗口(或选项卡)中拆分 Vim,并在其中一个窗口中打开一个 shell?

【问题讨论】:

  • 曾经有一个用于 vim 的 shell 补丁,但它不再编译 afaik。最接近真正的 shell 是使用 screen 或 tmux。这是我在 vim 中最想念的东西。

标签: vim shell window


【解决方案1】:

Neovim 和 Vim 8.2 通过 :ter[minal] 命令本机支持此功能。

有关详细信息,请参阅文档中的 terminal-window

【讨论】:

    【解决方案2】:

    这取决于你的操作系统——实际上我没有在 MS Windows 上测试它——但Conque 是最好的插件之一。

    实际上,它可以更好,但有效。

    【讨论】:

    • 如果您使用 Vundle 来管理插件,您可以将 Bundle 'jewes/Conque-Shell' 添加到您的 .vimrc 文件中,然后运行 ​​:BundleInstall 进行安装。
    • 需要注意的一点:在某些工作环境中,对 vi 的 +python 或 +python3 要求可能会成为杀手。
    • 这是更新后的网址(附截图):github.com/wkentaro/conque.vim
    【解决方案3】:

    :vsp:sp - 将 vim 拆分为两个实例,但您不能只在其中一个实例中使用 :shell。

    为什么不显示终端的另一个选项卡而不是 vim 的另一个选项卡。如果你喜欢这个想法,你可以试试:Ctrl-shift-t. 并在它们之间移动 Ctrl - pageupCtrl - pagedown

    如果你只想要几个 shell 命令,你可以使用!在 vim 中创建任何 shell 命令

    例如:!./a.out

    【讨论】:

    • 要运行当前打开的可执行文件,您可以像这样使用vim 路径魔法::!./%
    • 为什么不显示终端的另一个选项卡——不是每个人都在 GUI 上方的终端仿真器中使用 vim……来自Ctrl——不管我想你的答案是 gnome-终端或类似的模拟器。
    【解决方案4】:

    您可以使用tmuxscreen(第二个只能在没有补丁的情况下进行水平拆分)来拆分您的终端。但我不知道如何在两个窗格中都有一个 Vim 实例。

    【讨论】:

    • 如果你从 git 构建它,屏幕可以做垂直分割。
    【解决方案5】:

    如果你还没有发现,可以使用神奇的screen plugin

    Conque 也很特别,但我发现屏幕更实用(例如,它不会“乱扔”你的缓冲区,你可以在缓冲区中编辑它们后发送你真正想要的命令)

    【讨论】:

      【解决方案6】:

      我想这是一个相当老的问题,但现在是 2017 年。我们有 neovim,它是 vim 的一个分支,增加了终端支持。

      所以调用:term 会打开一个终端窗口。与使用 tmux(终端多路复用器)相比,此解决方案的优点在于您将拥有与 vim 设置相同的窗口绑定。 neovim 与 vim 兼容,因此您基本上可以复制并粘贴您的.vimrc,它就可以工作了。

      更多优点是您可以在打开的终端上切换到普通模式,并且可以进行基本的复制和编辑。我猜它对 git 提交也非常有用,因为缓冲区中的所有内容都可以在自动完成中使用。

      我会更新这个答案,因为 vim 还计划发布终端支持,可能在 vim 8.1 中。您可以在此处关注进度: https://groups.google.com/forum/#!topic/vim_dev/Q9gUWGCeTXM

      一旦发布,我相信这是比使用 tmux 更优越的设置。

      【讨论】:

      • 我认为它是在 Vim 8.0 中发布的
      【解决方案7】:

      Shougo 的 VimShell,如果与 neocomplcache 一起使用,可以自动完成文件名

      【讨论】:

        【解决方案8】:

        绝对不是您要的,但您可能对我的插件vim-notebook 感兴趣,它允许用户保持后台进程处于活动状态并使其评估当前文档的一部分(并将输出写入文档)。它旨在用于包含要评估的代码片段的笔记本式文档。

        【讨论】:

          【解决方案9】:

          您可能想打开一个“屏幕”程序, 分屏,一个打开shell,另一个打开vim。 对我有用。

          【讨论】:

          • 取消了-1,因为没有解释。另外,我测试了vim screen plugin方案,和mrcybul的方案没有太大区别。 @mrcybul:试图提供帮助的坦克。为避免被否决,请仔细阅读其他答案,并仅在您认为它带来新内容时添加您自己的答案。还包括为什么您的解决方案在某些情况下可能会更好。
          【解决方案10】:

          我目前正在使用 tmux。

          安装:sudo apt-get install tmux 运行它:tmux

          Ctrl + b 后跟 Ctr + % :它将您的终端窗口分成垂直的两半。

          Ctrl + "向左箭头 | 向右箭头" : 在终端之间移动。

          【讨论】:

            【解决方案11】:

            使用 Vim 8.0 或更高版本,您可以使用 terminal 功能在 vim 窗口中运行终端仿真器。顺便说一句,如果您想在 gVim 或 MacVim 中模拟现代 IDE 终端(如 VSCode 集成终端),您可以在 vimrc 中输入以下配置。

            set shell=/path/to/shell
            
            " Make sure to replace `sh.exe` in BufNr("sh.exe") with your shell executable.
            nnoremap <expr> <space> BufNr("sh.exe") > 0 ? (&buftype == 'terminal' ? '<c-^>' : ':b '. BufNr("sh.exe") . '<cr>') : ':terminal ++curwin<cr>'
            
            function! BufNr(pattern)
              let bufcount = bufnr("$")
              let currbufnr = 1
              let nummatches = 0
              let firstmatchingbufnr = 0
              while currbufnr <= bufcount
                if(bufexists(currbufnr))
                  let currbufname = bufname(currbufnr)
                  if(match(currbufname, a:pattern) > -1)
                    let nummatches += 1
                    let firstmatchingbufnr = currbufnr
                  endif
                endif
                let currbufnr = currbufnr + 1
              endwhile
              return firstmatchingbufnr
            endf
            

            现在您可以在正常模式(或您选择的任何映射)下使用space

            1. 如果终端尚不存在,则在当前窗口中打开终端。
            2. 如果当前缓冲区不是终端类型,则切换到终端缓冲区。
            3. 如果当前缓冲区是终端缓冲区,则切换到上一个缓冲区。

            【讨论】:

              猜你喜欢
              • 2012-06-12
              • 1970-01-01
              • 1970-01-01
              • 2015-02-25
              • 2022-01-22
              • 1970-01-01
              • 1970-01-01
              • 2023-02-26
              • 1970-01-01
              相关资源
              最近更新 更多