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

时间:2011-11-01 01:23:15

标签: vim

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

8 个答案:

答案 0 :(得分:239)

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

绝对的:

  • 将标签移至位置i::tabm i

相对

  • 将标签i移动到右侧::tabm +i
  • 将标签i移动到左侧::tabm -i

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

答案 1 :(得分:37)

您的意思是移动当前标签吗?这可以使用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 :(得分: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>

答案 3 :(得分:5)

将当前标签移至n th 位置

:tabm n

其中n是表示位置的数字(从零开始)

将标签移动到左/右

我认为更好的解决方案是将标签向左或向右移动到当前位置,而不是计算出您想要的新位置的数值。

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

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

  • 使用以下方式向左: Alt +
  • 右侧使用: Alt +

答案 4 :(得分:4)

除了其他答案中的精美建议外,如果您启用了鼠标支持,您还可以使用鼠标拖动标签移动它们。

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

它也适用于纯tty模式Vim,如果你有set mouse=a并且有一个合适的终端(xterm及其大多数模拟器,如gnome-terminal,Terminal.app,iTerm2和PuTTY / KiTTY,命名视图)。请注意,列222之外的鼠标点击也需要set ttymouse=sgr;有关背景信息,请参阅In Vim, why doesn't my mouse work past the 220th column?

我编写了一个名为vim-tabber的插件,它提供了一些额外的功能,用于交换选项卡,移动它们,并添加内置选项卡操作命令的功能,同时保持与内置程序基本兼容。即使您选择不使用该插件,也可以在自述文件中找到一些常规的标签使用信息。

答案 5 :(得分: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>

答案 6 :(得分: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>

它处理包装盒。

答案 7 :(得分:1)

这是一个很好的问题,加文,因为它很微妙。

maybeshewillhochl 的答案主要回答了这个问题——使用带有索引或相对 (+/-) 索引的“:tabm”。

但是请注意,这里可能会引起混淆,而其他一些答案可能已经错过了这一点。看看下面 hochl 包含的帮助文本:

   :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.

关键字是after。我怀疑这有时会让人们感到困惑。为什么?因为如果使用 ":tabm3" 将选项卡移出第一个位置,随后键入 ":tabm2" 不会再次移动选项卡。占据 tab#3 的文件现在占据了 tab#2 并且 ":tabm2" 不会改变顺序。

这是一张图表。选中的标签是每行中的 [file_c]。

file_a file_b [file_c] file_d
:tabm0
[file_c] file_a file_b file_d
:tabm3
file_a file_b [file_c] file_d
:tabm2
file_a file_b [file_c] file_d

":tabm" 命令可以认为是从 0 开始计数时将当前选项卡移动到当前占据位置的选项卡之后,其中选项卡 0 是最左边的选项卡,并且是虚构的。 ":tabmi" 不会移动到第 i 个位置 -- 如果移动,":tabm3" 和 ":tabm2" 会产生不同的结果。

最后,如果你有一个好的键盘映射,相对移动 +/- 语法会更简单。