既存のウィンドウを既存のタブに移動する


13

場合によっては、既存のタブにウィンドウを移動する必要がありますが、これを実行できるコマンド/キーボードショートカットがあるかどうか疑問に思っていました。ウィンドウを閉じてタブに切り替えてから、新しい分割で開くことができることは知っていますが、これを実現するより短い方法があるのではないかと思っていました。新しいタブではなく、既存のタブに移動したいことに注意してください<C-w>T


ウィンドウをタブ間で移動することはできません。
lcd047

うーん、それは残念です。おそらく、それを達成できるマッピングまたはコマンドを作成できます。
EvergreenTree

あなたができる最善のことは、すべてのウィンドウ設定を保存してから、既存のタブで再作成することです。
tommcdo

回答:


10

現在のタブページで既存のウィンドウを移動するコマンドがあります(つまり、回転、サイズ変更、移動によってウィンドウレイアウトに影響します)が、ウィンドウを別のタブに移動するコマンドはありません。

ウィンドウはロードされたバッファへの単なるビューポートであるため、以下を行う必要があります。

  1. 現在のウィンドウに表示されるバッファ番号に注意してください。
  2. :close! 窓。
  3. 既存のターゲットタブページに切り替えます。
  4. :sbuffer 再度開くバッファ番号。

これにより、ウィンドウ固有のオプションが失われます。それらをスクリプトで保存および復元することもできます。


これが事実だと思いました。おそらく、まさにそれを行う小さなスクリプトを作成できます。
エバーグリーン

2
  1. 既存のターゲットタブに移動します
  2. あなたが望むようにそれを分割する
  3. :b ab(残りをタブで補完)

ab単なるランダムな文字で、目的のファイル名の先頭に置き換えます。:bタブ補完は非常にうまく機能しました。通常は、1文字と1〜2回のTabキー入力に基づいて適切なソースバッファーを見つけることができます。

Ingoに対するこのアプローチの利点は、何かに注目したり覚えたりすることができないことです。つまり、認知的負荷が少なくなります。とにかく知っているファイル名。


2

以下に定義する2つのコマンドは、すべてのバッファーを右側のタブから現在のタブに移動し、右側のタブを閉じます。Mtabsp水平にMtabvsp分割して移動し、垂直に分割します。コマンドを使用する前に、マージされたタブを移動する必要があります。使用+tabm-tabmまたは<n>tabm

セットアップ

以下にvimスクリプトを追加しますvimrc

function! Mtab(vert)
    if tabpagenr() == tabpagenr("$")
        return 0
    endif
    +tabnext
    let s:killed_tab = tabpagenr()
    let s:buf_list = tabpagebuflist()
    -tabnext
    for item in s:buf_list
        if a:vert
            vsp
        else
            sp
        endif
        execute "buf " . item
    endfor
    execute "tabclose " . s:killed_tab
endfunction

command! Mtabsp call Mtab(0)
command! Mtabvsp call Mtab(1)

技術的な詳細

関数Mtabは1つのパラメーターを受け取りますvert。現在のタブを水平または垂直に分割するかどうかを決定します。

望ましい結果は、次の手順で達成されます。

  1. 一時的に次のタブに移動します
  2. 2つの変数を使用して、タブ番号とバッファーを参照します
  3. 現在のタブに戻る
  4. タブを分割して各バッファーを開きます
  5. 最後に、右側のタブを閉じます

現在のタブが最後の場合、コマンドは無視されます。


1

ファイルバッファの場合(スクラッチバッファなどでは機能しません)、次のことができます。

  1. :let @f=@%ENTER —ソースウィンドウ内。
    • これにより、通常レジスタfの内容が、現在のファイル名を含む特殊レジスタ%の内容に置き換えられます。
    • 注:fileのようにレジスタfを選択しましたが、他の任意のレジスタを使用できます。
    • 次のコマンドで、レジスタに正しいパスが含まれていることを確認できます。 :echo @f
  2. オプション:Ctrl-WCtrl-Q—古いウィンドウを閉じます。
  3. gt/ gT—ターゲットタブ(およびウィンドウ)に移動します。
  4. Ctrl-Ws —任意の方法でタブを分割して、新しいウィンドウを開きます。
  5. :e␣Ctrl-RfENTER
    • 新しく開いたウィンドウで、レジスタfに保存されているパスからファイルをロードします。
    • 注:ここの␣文字は、通常のスペースを示します。

重要な注意:パスにスペースまたはいくつかの特殊文字が含まれている場合、最終ステップは正しく機能しません!:-(回避策として、次のわずかに長いコマンドは、スペースを含むパスで動作するはずです(ただし、他の特殊文字では失敗する場合があります):

  • :e␣"Ctrl-Rf"ENTER

(つまり、Ctrl-R、fの結果を引用します)

lkraavingo-karkatからの回答に触発されました


これは素晴らしいです。Windowsの「カットアンドペースト」のマッピングをタブに設定する必要があります。
dragon788
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.