タブを再配置するvimコマンドはありますか?


200

現在のタブの位置/順序を変更するにはどうすればよいVimですか?たとえば、現在のタブを最初のタブに再配置したい場合はどうすればよいですか?

回答:


271

:tabm相対引数またはゼロインデックスの絶対引数を使用してタブを再配置できます。

絶対の:

  • タブを位置iに移動: :tabm i

相対的:

  • タブのi位置を右に移動します。 :tabm +i
  • タブのi位置を左に移動します。 :tabm -i

これは比較的新しい機能です。それでうまくいかない場合は、vimを更新してみてください。


2
これは機能しません。:tabmは相対引数を受け入れませんが、実際には受け入れます。
ギャビン

6
:tabmvim 7.3では相対引数を受け入れるため、そうでない場合はvimを更新する必要があります。
多分彼女は2013

私はVIMを持っています-Vi IMproved 7.3(2010年8月15日、2013年4月2日コンパイル09:17:34)含まれるパッチ:1-547および+-サポートされていません。ドキュメントでは、ゼロまたは正の値を指定する必要があると述べています
Vladimir

6
絶対位置はゼロインデックスであることに注意してください。これは、vimが1インデックス付きのタブを表示するため、少し奇妙です(または、私のvim構成である可能性があります)
Elliot Foster 14

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.

現在のタブを左または右に移動する2つのキーバインディングがあります。とても便利な!

編集:ここに私の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を押して現在のタブを移動できます。


うーん...タブを左または右に1つ移動するにはスクリプトが必要ですか?貼り付けてもらえますか?
ギャビン

2
スクリプトを追加しました。これは役に立ちますか?
hochl

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

とに違いは+tabmoveありtabmove+ますか?ポジションは重要ですか?

4

マウスのサポートが有効になっている場合は、他の回答の細かい提案に加えて、マウスでタブをドラッグして移動することもできます。

GUIモードでGUIウィジェットのタブを使用するか、ターミナルスタイルのタブを使用するかに関係なく、MacVimおよびその他のGUI vim実装では、これがデフォルトでオンになっています。

set mouse=a適切な端末(ビューに名前を付けるためにgnome-terminal、Terminal.app、iTerm2、PuTTY / KiTTYなどのxtermおよびそのほとんどのエミュレーター)を所有していて、純粋なttyモードのVimでも動作します。列222を超えるマウスクリックも必要ですset ttymouse=sgr。参照でVimを、しないのはなぜ第二百二十コラム過去の私のマウスの仕事?その背景について。

私はvim-tabberと呼ばれるプラグインを作成しました。このプラグインは、タブの入れ替え、シフト、および組み込みのタブ操作コマンドの機能に追加するためのいくつかの追加機能を提供し、組み込みとの互換性を維持しています。プラグインを使用しないことを選択した場合でも、READMEに一般的なタブの使用法に関する情報があります。


マウスを使用してタブを再配置した後、マウスを使用してペインのサイズを変更できなくなりました。代わりに、マウスカーソルをクリックしてドラッグするたびに、マウスが「動かなくなった」ようにタブが再配置されます。ここで何が起こっているのかわかりますか?
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>

-tabmそして+tabm、私のvimの中で7.4は正しく、タブを移動しないでください。また、私:help tabmはこれを有効な構文としてリストしていません。だから私は最後をパブロの答えelse execute ...endifelseif a:direction == 1 execute "tabmove" s:current_tab else execute "tabmove" s:current_tab - 2 endif 使うことで置き換えました
cfi

開始/終了をラップするために、2つの関数と彼のコードクリーナーを使用して読み取りと保守を行ったため、このソリューションを自分で使用しています。ただの順序逆転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>

ラッピングケースを取り扱っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.