【发布时间】:2011-02-16 11:40:43
【问题描述】:
我可以在 Vim 中使用 :shell 命令打开一个 shell,但是我不能在编辑文件的同时使用 shell。
有没有办法在多个窗口(或选项卡)中拆分 Vim,并在其中一个窗口中打开一个 shell?
【问题讨论】:
-
曾经有一个用于 vim 的 shell 补丁,但它不再编译 afaik。最接近真正的 shell 是使用 screen 或 tmux。这是我在 vim 中最想念的东西。
我可以在 Vim 中使用 :shell 命令打开一个 shell,但是我不能在编辑文件的同时使用 shell。
有没有办法在多个窗口(或选项卡)中拆分 Vim,并在其中一个窗口中打开一个 shell?
【问题讨论】:
Neovim 和 Vim 8.2 通过 :ter[minal] 命令本机支持此功能。
有关详细信息,请参阅文档中的 terminal-window。
【讨论】:
这取决于你的操作系统——实际上我没有在 MS Windows 上测试它——但Conque 是最好的插件之一。
实际上,它可以更好,但有效。
【讨论】:
:vsp 或 :sp - 将 vim 拆分为两个实例,但您不能只在其中一个实例中使用 :shell。
为什么不显示终端的另一个选项卡而不是 vim 的另一个选项卡。如果你喜欢这个想法,你可以试试:Ctrl-shift-t. 并在它们之间移动 Ctrl - pageup 和 Ctrl - pagedown
如果你只想要几个 shell 命令,你可以使用!在 vim 中创建任何 shell 命令
例如:!./a.out。
【讨论】:
vim 路径魔法::!./%
Ctrl——不管我想你的答案是 gnome-终端或类似的模拟器。
您可以使用tmux 或screen(第二个只能在没有补丁的情况下进行水平拆分)来拆分您的终端。但我不知道如何在两个窗格中都有一个 Vim 实例。
【讨论】:
如果你还没有发现,可以使用神奇的screen plugin。
Conque 也很特别,但我发现屏幕更实用(例如,它不会“乱扔”你的缓冲区,你可以在缓冲区中编辑它们后发送你真正想要的命令)
【讨论】:
我想这是一个相当老的问题,但现在是 2017 年。我们有 neovim,它是 vim 的一个分支,增加了终端支持。
所以调用:term 会打开一个终端窗口。与使用 tmux(终端多路复用器)相比,此解决方案的优点在于您将拥有与 vim 设置相同的窗口绑定。 neovim 与 vim 兼容,因此您基本上可以复制并粘贴您的.vimrc,它就可以工作了。
更多优点是您可以在打开的终端上切换到普通模式,并且可以进行基本的复制和编辑。我猜它对 git 提交也非常有用,因为缓冲区中的所有内容都可以在自动完成中使用。
我会更新这个答案,因为 vim 还计划发布终端支持,可能在 vim 8.1 中。您可以在此处关注进度: https://groups.google.com/forum/#!topic/vim_dev/Q9gUWGCeTXM
一旦发布,我相信这是比使用 tmux 更优越的设置。
【讨论】:
Shougo 的 VimShell,如果与 neocomplcache 一起使用,可以自动完成文件名
【讨论】:
绝对不是您要的,但您可能对我的插件vim-notebook 感兴趣,它允许用户保持后台进程处于活动状态并使其评估当前文档的一部分(并将输出写入文档)。它旨在用于包含要评估的代码片段的笔记本式文档。
【讨论】:
您可能想打开一个“屏幕”程序, 分屏,一个打开shell,另一个打开vim。 对我有用。
【讨论】:
我目前正在使用 tmux。
安装:sudo apt-get install tmux 运行它:tmux
Ctrl + b 后跟 Ctr + % :它将您的终端窗口分成垂直的两半。
Ctrl + "向左箭头 | 向右箭头" : 在终端之间移动。
【讨论】:
使用 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:
【讨论】: