我可以在 Vim 中使用: shell 命令打开一个 shell,但是我不能在编辑文件的同时使用 shell。
有没有办法在多个 Windows (或选项卡)中分割 Vim,并在其中一个中打开一个 shell?
:vsp或 :sp-将 vim 分成两个实例,但是不能在其中一个实例中使用: shell。
:vsp
:sp
为什么不显示终端的另一个选项卡而不是另一个 Vim 选项卡。如果你喜欢这个想法,你可以试试: Ctrl-shift-t.和他们之间的移动与 Ctrl - pageup和 Ctrl - pagedown
Ctrl-shift-t.
Ctrl - pageup
Ctrl - pagedown
如果只需要一些 shell 命令,那么可以使用 !在 vim 中创建任何 shell 命令
!
例如 :!./a.out。
:!./a.out
您可以使用 tmux或 screen(秒只能做水平分割没有补丁)分割您的终端。但是我不知道如何在两个窗格中都有一个 Vim 实例。
tmux
screen
嗯,这取决于你的操作系统-实际上我没有测试它的微软视窗-但 康奎是最好的插件之一。
事实上,可以更好,但是很有效。
如果你还没有发现,你可以使用神奇的 屏幕插件。
Conque 也是例外,但我发现屏幕更实用(例如,它不会“丢弃”你的缓冲区,你可以只发送你真正想要的命令,然后在你的缓冲区中编辑它们)
Shougo 的 VimShell,如果与新复杂缓存一起使用,它可以自动完成文件名
不完全是你所要求的,但你可能会对我的插件 Vim 笔记本感兴趣,它允许用户保持后台进程活动,并使其评估当前文档的一部分(并在文档中写入输出)。它打算用于笔记本风格的文档,其中包含要评估的代码片段。
你可能需要打开一个“屏幕”程序, 分割屏幕,一个开壳,另一个 Vim。 我没问题。
Neovim 和 Vim 8.2通过 :ter[minal]命令对此提供本机支持。
8.2
:ter[minal]
有关详细信息,请参阅文档中的 terminal-window。
terminal-window
我目前正在使用 tmux。
安装: sudo apt-get install tmux 运行它: tmux
Ctrl + b 后面跟着 Ctr +% : 它将终端窗口分成两个垂直的半部分。
Ctrl + “箭头左 | 箭头右”: 在终端之间移动。
我想这是一个相当古老的问题,但现在是2017年。我们有 neovim,它是一个分叉的 vim,它添加了终端支持。
因此,调用 :term将打开一个终端窗口。与使用 tmux (终端多路复用器)相比,这种解决方案的优点在于,您将拥有与 vim设置相同的窗口绑定。Neovim 与 vim 兼容,所以你基本上可以复制粘贴你的 .vimrc,它只是工作。
:term
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中放置以下配置。
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(或者您选择的任何映射)来:
space