我怎么能改变我的位置/顺序的当前标签在Vim?例如,如果我想重新定位我的当前标签是第一个标签?


当前回答

由于某种原因,函数答案不再适用于我。我怀疑与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>

其他回答

你的意思是移动当前标签吗?这可以使用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来移动当前标签。

由于某种原因,函数答案不再适用于我。我怀疑与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>

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

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

它也可以在纯tty模式Vim中工作,如果你设置了mouse=a并且有一个合适的终端(xterm和它的大多数模拟器,如gnome-terminal, terminal。app, iTerm2和PuTTY/KiTTY,以命名一个视图)。注意,鼠标点击列222以外的地方也需要set ttymouse=sgr;看在Vim,为什么我的鼠标不能工作超过220列?作为背景资料。

我已经编写了一个名为vim-tabber的插件,它提供了一些额外的功能,用于交换选项卡,移动它们,并添加内置选项卡操作命令的功能,同时在很大程度上保持与内置的兼容性。即使你选择不使用插件,在README中也有一些通用的标签使用信息。

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

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

移动当前标签到第n个位置

:tabm n

其中n是一个数字,表示位置(从0开始)


左/右移动标签

我认为更好的解决方案是将选项卡向左或向右移动到当前位置,而不是计算出您希望它在的新位置的数值。

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

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

向左使用:Alt + left 向右使用:Alt + right