如何在Vim窗口中打开Shell?

时间:2010-05-06 16:36:39

标签: vim shell window

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

有没有办法在许多Windows(或标签页)中拆分Vim,并在其中一个中打开一个shell?

11 个答案:

答案 0 :(得分:45)

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

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

答案 1 :(得分:39)

Vim 8(和neovim)通过:ter[minal]命令本地支持此功能。 有关详细信息,请参阅文档中的terminal-window

答案 2 :(得分:18)

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

为什么不显示终端的另一个选项卡而不是vim的另一个选项卡。如果您喜欢这个想法,可以尝试:Ctrl-shift-t.并使用Ctrl - pageupCtrl - pagedown

在它们之间移动

如果您只想要几个shell命令,可以使用!

在vim中创建任何shell命令

例如:!./a.out

答案 3 :(得分:8)

如果您还没有发现,可以使用惊人的screen plugin

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

答案 4 :(得分:7)

您可以使用tmuxscreen(第二个只能进行水平拆分而无需补丁)来拆分您的终端。但我不知道在两个窗格中都有一个Vim实例的方法。

答案 5 :(得分:5)

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

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

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

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

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

答案 6 :(得分:3)

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

您可能想要打开“屏幕”程序, 分屏,一个打开外壳,另一个打开vim。 适合我。

答案 9 :(得分:0)

我目前正在使用tmux。

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

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

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

答案 10 :(得分:0)

在Vim 8.0或更高版本中,您可以使用const MyComponent = () => { const [firstQuery, setFirstQuery] = useState(''); const _onChange = query => setFirstQuery(query); return ( <Searchbar style={{marginTop: 60}} placeholder="Search" onChangeText={_onChange} value={firstQuery} /> ); } 功能在vim窗口中运行终端仿真器。顺便说一句,如果您想在gVim或MacVim中模拟现代IDE终端(例如VSCode集成终端),则可以在terminal中添加以下配置。

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

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