将现有窗口移至现有选项卡


14

有时我需要将窗口移到一个已经存在的选项卡中,并且我想知道是否存在可以执行此操作的命令/键盘快捷方式。我知道我可以关闭窗口,切换到选项卡,然后在新的拆分中打开它,但是我想知道是否有更短的方法来完成此操作。请注意,我想将其移动到现有标签页,而不是像新标签页一样<C-w>T


无法在标签之间移动窗口。
lcd047

嗯,那太糟糕了。我可能可以创建一些映射或命令来完成它。
EvergreenTree

我认为您最好的办法是保存所有窗口设置,然后在现有选项卡上重新创建它。
tommcdo

Answers:


10

尽管在当前选项卡页面中有命令可以移动现有窗口(即,通过旋转,调整大小和移动来影响窗口布局),但没有命令可以将窗口移动至另一个选项卡。

由于窗口只是已加载缓冲区的视口,因此您必须:

  1. 注意当前窗口中显示的缓冲区编号。
  2. :close! 窗户。
  3. 切换到现有的目标标签页。
  4. :sbuffer 重新打开它的缓冲区编号。

这样,您将丢失任何特定于窗口的选项。您也可以在脚本中保存和还原它们。


我认为情况就是如此。我可能会制作一个可以做到这一点的小脚本。
EvergreenTree

2
  1. 转到现有的目标标签
  2. 随便分割
  3. :b ab(使用Tab键完成其余操作)

ab只是随机字母,请替换为所需文件名的开头。:b制表符补全对我来说表现很好,通常只需要一个字母和1-2次Tab按键就可以找到正确的源缓冲区。

与Ingo相比,此方法的好处是无需注意或记住任何东西,这意味着较少的认知负担。无论如何,您已经知道的文件名。


2

下面定义的两个命令将所有缓冲区从右侧选项卡移至当前选项卡,然后关闭右侧选项卡。Mtabsp通过水平Mtabvsp拆分和垂直拆分来移动它们。使用命令之前,需要移动合并的选项卡。使用+tabm-tabm<n>tabm

设定

将以下vim脚本添加到您的vimrc

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

技术细节

函数Mtab接收一个参数vert。它确定当前选项卡是水平拆分还是垂直拆分。

通过以下步骤可以达到预期的结果:

  1. 我们暂时移至下一个标签
  2. 使用两个变量引用其选项卡号和缓冲区
  3. 返回当前标签
  4. 我们拆分选项卡并打开每个缓冲区
  5. 最后,我们关闭右侧选项卡

如果当前选项卡位于最后,则将忽略命令。


1

如果它是文件缓冲区(不适用于暂存缓冲区等),则可以:

  1. :let @f=@%ENTER —在源代码窗口中;
    • 这将用包含当前文件名的特殊寄存器%的内容替换常规寄存器f的内容。
    • 注意:我在文件中选择了寄存器f,但是您可以使用任何您喜欢的其他寄存器。
    • 您可以通过以下方式验证寄存器是否包含正确的路径: :echo @f
  2. (可选):Ctrl-WCtrl-Q—关闭旧窗口;
  3. gt/ gT—导航到目标选项卡(和窗口);
  4. Ctrl-Ws —随意拆分选项卡,以打开新窗口;
  5. :e␣Ctrl-RfENTER
    • 在新打开的窗口中,从寄存器f中存储的路径加载文件;
    • 注意:此处的␣字符标记规则的空格。

重要说明:如果路径包含空格或某些特殊字符,则最后一步将无法正常工作!:-(作为一种解决方法,以下稍长的命令应适用于带有空格的路径(尽管对于某些其他特殊字符它仍然可能失败):

  • :e␣"Ctrl-Rf"ENTER

(即引用Ctrl-R的结果f

受到lkraavingo-karkat的回答的启发


太棒了,我需要为Windows的“剪切和粘贴”设置映射到选项卡。
dragon788 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.