如何在 Vim 窗口中打开 Shell?

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

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

134172 次浏览

:vsp:sp-将 vim 分成两个实例,但是不能在其中一个实例中使用: shell。

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

如果只需要一些 shell 命令,那么可以使用 !在 vim 中创建任何 shell 命令

例如 :!./a.out

您可以使用 tmuxscreen(秒只能做水平分割没有补丁)分割您的终端。但是我不知道如何在两个窗格中都有一个 Vim 实例。

嗯,这取决于你的操作系统-实际上我没有测试它的微软视窗-但 康奎是最好的插件之一。

事实上,可以更好,但是很有效。

如果你还没有发现,你可以使用神奇的 屏幕插件

Conque 也是例外,但我发现屏幕更实用(例如,它不会“丢弃”你的缓冲区,你可以只发送你真正想要的命令,然后在你的缓冲区中编辑它们)

Shougo 的 VimShell,如果与新复杂缓存一起使用,它可以自动完成文件名

不完全是你所要求的,但你可能会对我的插件 Vim 笔记本感兴趣,它允许用户保持后台进程活动,并使其评估当前文档的一部分(并在文档中写入输出)。它打算用于笔记本风格的文档,其中包含要评估的代码片段。

你可能需要打开一个“屏幕”程序, 分割屏幕,一个开壳,另一个 Vim。 我没问题。

Neovim 和 Vim 8.2通过 :ter[minal]命令对此提供本机支持。

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

我目前正在使用 tmux。

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

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

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

我想这是一个相当古老的问题,但现在是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或更高版本,你可以通过使用 abc0特性在 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. 如果当前缓冲区是终端缓冲区,则切换到前一个缓冲区。