バッファを移動するのではなく、新しいタブに複製します


10

タブページのバッファを一時的に最大化してから、以前見ていた古いバッファ構成に戻したいことがよくあります。このようなことを行うための私の現在のワークフローは、使用している他のすべてのバッファーを閉じるか、<c-w>o現在表示しているバッファーを独自のタブに移動することです<c-w>T。2番目のアプローチの問題は、元のタブページからバッファが削除されることです。

私は3つのファイルを取り込むa.txtb.txtc.txtab、およびcそれぞれ。

% echo a > a.txt
% echo b > b.txt
% echo c > c.txt

これら3つのファイルすべてを1つのタブページで開くと、次のようになります。

ここに画像の説明を入力してください

その後、自分でa.txtタブに移動できます。ただし、a.txt元のタブページから削除されます。(つまり、これは後になります<c-w>Tgt

ここに画像の説明を入力してください

<c-w>T元のバッファーの内容を保持するために押したときに選択する機能が欲しいのですが、現在フォーカスされているバッファーのみを含む新しいタブページを作成し、新しいタブページをフォーカスします。作成した。つまり、<c-w>T元のタブページが保持され、現在a.txtは2つのタブページにあることを除いて、コマンドはほとんど同じです。

これを行う方法はありますか?

回答:


13

私にはわかりませんが、あなたは試すことができます:tab split(またはより短いバージョン:tab sp)。

:splitコマンドが表示され、ビューポートを複製する必要がありa.txtながら、:tab修飾子は、専用のタブページには、このビューポートを移動する必要があります。


の動作を変更したい場合はC-w T、次のように再マッピングできます。

nnoremap <C-w>T :tab split<CR>

より一般的には、ウィンドウを分割するコマンドを見つけるたびに、代わりに新しいタブページを作成する場合は、プレフィックスとしてを付けることができます:tab

たとえば、新しいタブページでヘルプバッファを読み取るために使用できます。

:tab help {your_topic}

デフォルトでは、新しいタブページは現在のタブページの後に表示されます。ただし、別の場所に表示したい場合:tabは、先頭にカウントを付けることができます。

たとえば、3番目のビューポートの後に現在のビューポートをタブページに複製するには、次のように入力します。

:3tab split

そしてそれを最初のものとして表示させるには:

:0tab split

詳細については、以下をご覧ください:h :tab

:[count]tab {cmd}                   *:tab*
        Execute {cmd} and when it opens a new window open a new tab
        page instead.  Doesn't work for |:diffsplit|, |:diffpatch|,
        |:execute| and |:normal|.
        If [count] is given the new tab page appears after the tab
        page [count] otherwise the new tab page will appear after the
        current one.
        Examples:

            :tab split      " opens current buffer in new tab page
            :tab help gt    " opens tab page with help for "gt"
            :.tab help gt   " as above
            :+tab help      " opens tab page with help after the next
                            " tab page
            :-tab help      " opens tab page with help before the
                            " current one
            :0tab help      " opens tab page with help before the
                            " first one
            :$tab help      " opens tab page with help after the last
                            " one

2

この問題のため、私はほとんどタブを避けてきましたが、今、私は欲しいタブの複製動作を持つ関数を持っています。私はそれをテストしましたが、本格的に使用し始めていません。このワークフローにはいくつかの隠れた欠点があるかもしれません。

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