この問題のため、私はほとんどタブを避けてきましたが、今、私は欲しいタブの複製動作を持つ関数を持っています。私はそれをテストしましたが、本格的に使用し始めていません。このワークフローにはいくつかの隠れた欠点があるかもしれません。
この関数の1つの問題は、前のバッファとウィンドウのペアの状態の一部が(set number
オンかどうかなど)複製されないことです。少し推測するc-w T
と、複製は実行されず、ウィンドウの親が変更されるだけなので、おそらくこの問題は発生しません。
Vimには、バッファー、タブ、ウィンドウなどの1から始まるリストがいくつかあります。私が知る限り、0
キーは行の先頭に移動するために使用され、結果として数値引数としてゼロを渡すことができないため、これらは1 から始まります。
この機能をエミュレートするために、3つのリストに関心があります。
- タブページのグローバルリスト
- ウィンドウの[タブページ]ごとのリスト
- バッファのグローバルリスト
この値をすべて保存してから、「tabnew」を使用して新しいタブを作成します。新しいタブは常に右側に作成されるため、タブの下にあるインデックスtabnew
が無効になることはありません。(ただし、これを行うためのより堅牢な方法がおそらくより良いでしょう)。
このtabnew
コマンドはまた、フォーカスを新しいタブとその中の1つのウィンドウに移動します。そこから、buffer
コマンドを使用して、元々フォーカスがあったバッファのビューを作成できます。
次に、元のタブの保存されたインデックスを使用して、フォーカスをそのタブに戻します。そして、主にパラノイアから抜け出し、そのタブ内のフォーカスを元のウィンドウに設定しました。Vimは非表示のタブでフォーカスされているウィンドウを覚えているようですが、それに依存するのは好きではありません。
(いくつかの文体上のポイント:明示的な数値変換0+
、グローバル変数、アサーションはすべて意図的なものです)
function! TabDuplicate()
" set vars, sanity checking
let g:tabdup_win = 0+ winnr()
let g:tabdup_buf = 0+ bufnr('%')
let g:tabdup_tabpage = 0+ tabpagenr()
call assert_true(g:tabdup_win > 0)
call assert_true(g:tabdup_buf > 0)
call assert_true(g:tabdup_tabpage > 0)
" make a new tab page,
" the new tab page will have focus
" none of the indices, which are all
" less than the current index, are
" invalidated by creating a new tab
execute "tabnew"
" visit the buffer we saved
execute "buffer " . g:tabdup_buf
" return to the original tab page
execute "tabnext " . g:tabdup_tabpage
" return focus to original window
execute g:tabdup_win . " windcmd w"
endfunction