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


当前回答

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

来自maybeshewill和hochl的答案主要回答了这个问题——使用“: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.

关键词是“之后”。我怀疑这有时会让人们感到困惑。为什么?因为如果使用“:tabm3”将制表符移出第一个位置,随后键入“:tabm2”不会再次移动制表符。占用选项卡#3的文件现在占用选项卡#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"将产生不同的结果。

最后,如果你有一个好的keymap,相对的move +/-语法会更简单。

其他回答

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

来自maybeshewill和hochl的答案主要回答了这个问题——使用“: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.

关键词是“之后”。我怀疑这有时会让人们感到困惑。为什么?因为如果使用“:tabm3”将制表符移出第一个位置,随后键入“:tabm2”不会再次移动制表符。占用选项卡#3的文件现在占用选项卡#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"将产生不同的结果。

最后,如果你有一个好的keymap,相对的move +/-语法会更简单。

由于某种原因,函数答案不再适用于我。我怀疑与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中也有一些通用的标签使用信息。

使用:tabm可以使用相对参数或零索引绝对参数重新定位制表符。

绝对的:

移动制表符到位置i::tabm i

相对:

向右移动tab i的位置::tabm +i 将tab i的位置向左移动::tabm -i

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

下面是我的宏,使用@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>

它处理包装案例。