是否有vim命令来重定位选项卡?


200

如何更改当前标签页的位置/顺序Vim?例如,如果我想将当前标签页重新定位为第一个标签页?

Answers:


271

您可以:tabm使用相对或零索引的绝对参数来重新定位选项卡。

绝对:

  • 将标签移动到位置i: :tabm i

相对的:

  • 将标签i的位置向右移动: :tabm +i
  • 将标签i的位置向左移动: :tabm -i

这是一个相对较新的功能。因此,如果不起作用,请尝试更新您的vim。


2
这行不通。:tabm虽然确实应该接受相对参数,但它不接受。
加文

6
如果没有,应该更新vim,因为它:tabm在vim 7.3中接受相对参数。
也许她会

我有VIM-Vi IMproved 7.3(2010年8月15日,2013年4月2日编译,09:17:34)包含的修补程序:1-547和+-那里不支持,文档说我应该指定零或正值
Vladimir

6
请注意,绝对位置为零索引,这有点奇怪,因为vim显示选项卡为1索引(或者可能只是我的vim配置)
Elliot Foster

1
这无法处理包裹情况
Andy Ray

38

您是说移动当前标签页吗?使用tabmove可以使用。

:tabm[ove] [N]                                          *:tabm* *:tabmove*
            Move the current tab page to after tab page N.  Use zero to
            make the current tab page the first one.  Without N the tab
            page is made the last one.

我有两个键绑定,可将当前选项卡向左或向右移动。非常便利!

编辑:这是我的VIM宏。我不是一个很大的ViM编码器,所以也许可以做得更好,但这就是它的工作方式:

" Move current tab into the specified direction.
"
" @param direction -1 for left, 1 for right.
function! TabMove(direction)
    " get number of tab pages.
    let ntp=tabpagenr("$")
    " move tab, if necessary.
    if ntp > 1
        " get number of current tab page.
        let ctpn=tabpagenr()
        " move left.
        if a:direction < 0
            let index=((ctpn-1+ntp-1)%ntp)
        else
            let index=(ctpn%ntp)
        endif

        " move tab page.
        execute "tabmove ".index
    endif
endfunction

之后,您可以绑定密钥,例如在您的.vimrc

map <F9> :call TabMove(-1)<CR>
map <F10> :call TabMove(1)<CR>

现在,您可以通过按F9或F10移动当前选项卡。


嗯...所以向左或向右移动标签页需要脚本吗?可以贴吗?
加文

2
我添加了脚本。这对您有帮助吗?
hochl 2011年

25

我一直在寻找相同的东西,在一些帖子之后,我发现了一个比函数更简单的方法:

:execute "tabmove" tabpagenr() # Move the tab to the right
:execute "tabmove" tabpagenr() - 2 # Move the tab to the left

tabpagenr()返回实际的标签位置,tabmove使用索引。

我将右侧映射到Ctrl + L,将左侧映射到Ctrl + H:

map <C-H> :execute "tabmove" tabpagenr() - 2 <CR>
map <C-J> :execute "tabmove" tabpagenr() <CR>

1
仅供参考-FYI
Andy Ray

2
我不得不:execute "tabmove" tabpagenr() + 1 <CR>习惯于向右移动。对于MacVim 8.0.1420(144)
保罗·奥利佛

5

将当前选项卡移到第n 位置

:tabm n

n代表位置的数字在哪里(从零开始)


将标签向左/向右移动

我认为更好的解决方案是将选项卡向左或向右移动到当前位置,而不是弄清楚所需位置的数值。

noremap <A-Left>  :-tabmove<cr>
noremap <A-Right> :+tabmove<cr>

使用以上键盘映射,您将能够移动当前选项卡:

  • 使用: Alt +Left
  • 在右侧使用: Alt +Right

有什么区别+tabmovetabmove+?位置重要吗?

4

除了其他答案中的建议以外,如果启用了鼠标支持,您还可以简单地用鼠标拖动选项卡来移动它们。

在MacVim和其他GUI vim实现中,默认情况下处于启用状态,无论是在GUI模式下使用GUI窗口小部件选项卡还是终端样式选项卡。

如果您拥有set mouse=a一个合适的终端(它的xterm及其大多数仿真器,例如gnome-terminal,Terminal.app,iTerm2和PuTTY / KiTTY,可以命名一个视图),它也可以在纯tty模式的Vim中工作。请注意,还需要在222列之外单击鼠标set ttymouse=sgr。参见在Vim中,为什么我的鼠标不能在第220列上工作?作为背景。

我编写了一个名为vim-tabber的插件,该插件提供了一些附加功能,用于围绕选项卡交换,移动选项卡并增加内置选项卡操作命令的功能,同时仍与内置功能保持高度兼容。即使您选择不使用插件,自述文件中也有一些常规的标签用法信息。


使用鼠标重新排列选项卡后,我无法再使用鼠标调整窗格的大小。相反,每次单击并拖动鼠标光标时,选项卡都会重新排列,就像鼠标单击“卡住”一样。您有什么想法吗?
gmile

吉姆,我已经分别发布了问题:stackoverflow.com/questions/43734501/…–
gmile

1

由于某种原因,功能答案对我来说不再起作用。我怀疑与vim-ctrlspace有冲突。无论如何,函数答案中的数学运算都是不必要的,因为Vim可以使用内置函数左右移动制表符。我们只需要处理包装盒,因为Vim对用户不友好。

" Move current tab into the specified direction.
"
" @param direction -1 for left, 1 for right.
function! TabMove(direction)
    let s:current_tab=tabpagenr()
    let s:total_tabs = tabpagenr("$")

    " Wrap to end
    if s:current_tab == 1 && a:direction == -1
        tabmove
    " Wrap to start
    elseif s:current_tab == s:total_tabs && a:direction == 1
        tabmove 0
    " Normal move
    else
        execute (a:direction > 0 ? "+" : "-") . "tabmove"
    endif
    echo "Moved to tab " . tabpagenr() . " (previosuly " . s:current_tab . ")"
endfunction

" Move tab left or right using Command-Shift-H or L
map <D-H> :call TabMove(-1)<CR>
map <D-L> :call TabMove(1)<CR>

在我的vim 7.4中,-tabmand和+tabm不能正确移动选项卡。另外,my :help tabm并未将此列为有效语法。所以我取代了过去else execute ...endifelseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif 使用Pablo的答案
CFI

对于包装的开始/结束,我现在自己使用此解决方案,因为我使用了两个函数以及他的代码清理器来读取和维护。只是颠倒了tabmove和行中的-/ +符号的顺序execute
rld。

1

这是我的宏,使用来自@maybeshewill答案的相对参数:

" Shortcuts to move between tabs with Ctrl+Shift+Left/Right
function TabLeft()
   if tabpagenr() == 1
      execute "tabm"
   else
      execute "tabm -1"
   endif
endfunction

function TabRight()
   if tabpagenr() == tabpagenr('$')
      execute "tabm" 0
   else
      execute "tabm +1"
   endif
endfunction

map <silent><C-S-Right> :execute TabRight()<CR>
map <silent><C-S-Left> :execute TabLeft()<CR>

它处理包装盒。

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.