将相邻的选项卡移动到分割窗口中?

45
有没有一种简单的方法将Vim中相邻的标签移动到当前窗口作为拆分窗口?
在查找时,我看到了一个邮件列表讨论,其中有人说这是Ctrl+W,T操作的反向,但并未提供解决方案。
2个回答

52

问题在于您的问题是一个标签与特定缓冲区无关联。在一个选项卡中,您可以有10个窗口并拥有许多缓冲区,因此"将选项卡移入分割"没有太多意义。

更有意义的做法是“在分屏中显示缓冲区x”,可以通过以下方式完成

:sb <name_of_buffer>

我会点赞,但这对我的情况有意义,因为我使用的插件在不同的选项卡中打开缓冲区。这些插件没有提供在分割窗口中打开它们的选项。 - mhitza
1
首先,MRU 允许我在当前窗口或新标签页中打开页面(没有拆分键)。 - mhitza
1
现在如何使用垂直分割来完成这个操作? - mas
1
太棒了!从 :sb 开始,你可以通过制表符浏览所有已打开的缓冲区,而无需输入它们的路径和文件名! - James M. Lay
2
@malan 晚了一年,但是对于未来的读者,你可以使用 :vert sb <buffer_name> 命令来进行垂直分割。 - Tariq C

9
我提供了两个解决方案,第一个我已经验证过并保证它有效。第二个,我将很快尝试。
第一种解决方案:安装这个插件http://www.vim.org/scripts/script.php?script_id=1961,只需创建文件夹~/.vim/plugin并将文件Tabmerge.vim下载到该文件夹中。然后,当你有两个标签页并且输入以下内容时:
:Tabmerge

你需要将两个标签合并为一个,水平分割并置于顶部。请查看链接以获取完整的使用指南。

或者,查看此页面http://vim.wikia.com/wiki/Move_current_window_between_tabs以获取将当前窗口移动到标签之间的两个函数的代码。这是这两个函数(我还没有尝试):
function MoveToPrevTab()
  "there is only one window
  if tabpagenr('$') == 1 && winnr('$') == 1
    return
  endif
  "preparing new window
  let l:tab_nr = tabpagenr('$')
  let l:cur_buf = bufnr('%')
  if tabpagenr() != 1
    close!
    if l:tab_nr == tabpagenr('$')
      tabprev
    endif
    sp
  else
    close!
    exe "0tabnew"
  endif
  "opening current buffer in new window
  exe "b".l:cur_buf
endfunc

并且

function MoveToNextTab()
  "there is only one window
  if tabpagenr('$') == 1 && winnr('$') == 1
    return
  endif
  "preparing new window
  let l:tab_nr = tabpagenr('$')
  let l:cur_buf = bufnr('%')
  if tabpagenr() < tab_nr
    close!
    if l:tab_nr == tabpagenr('$')
      tabnext
    endif
    sp
  else
    close!
    tabnew
  endif
  "opening current buffer in new window
  exe "b".l:cur_buf
endfunc

谢谢,tabmerge对我的需求已经足够了。 - mhitza
第二个选择对我来说更好。我已经在正常模式下将它们映射到mtmT,因为这与我用于导航选项卡的gtgT一致。此外,我使用了该页面中显示的垂直分割替代方案(vert topleft split而不是sp)。 - Sebastián Grignoli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接