Vorhandenes Fenster auf vorhandene Registerkarte verschieben


13

Manchmal muss ich Fenster in eine bereits vorhandene Registerkarte verschieben, und ich habe mich gefragt, ob es eine Befehls- / Tastenkombination gibt, die dies ermöglicht. Ich weiß, dass ich das Fenster schließen, zum Tab wechseln und es dann in einem neuen Split öffnen kann, aber ich habe mich gefragt, ob es einen kürzeren Weg gibt, dies zu erreichen. Beachten Sie, dass ich es auf eine vorhandene Registerkarte verschieben möchte , nicht auf eine neue Registerkarte <C-w>T.


Es ist nicht möglich, Fenster über Registerkarten zu verschieben.
lcd047

Hmm, das ist schade. Wahrscheinlich könnte ich ein Mapping oder einen Befehl erstellen, der dies jedoch bewerkstelligen könnte.
EvergreenTree

Ich denke, das Beste, was Sie tun können, ist, alle Fenstereinstellungen zu speichern und sie dann auf der vorhandenen Registerkarte neu zu erstellen.
Montag,

Antworten:


10

Es gibt zwar Befehle zum Verschieben vorhandener Fenster auf der aktuellen Registerkarte (dh zum Beeinflussen des Fensterlayouts durch Drehen, Ändern der Größe und Verschieben), es gibt jedoch keine Befehle zum Verschieben eines Fensters auf eine andere Registerkarte.

Da ein Fenster nur ein Ansichtsfenster in einem geladenen Puffer ist, müssen Sie:

  1. Notieren Sie die im aktuellen Fenster angezeigte Puffernummer.
  2. :close! das Fenster.
  3. Wechseln Sie auf die vorhandene Zielregisterkarte.
  4. :sbuffer die Puffernummer zum erneuten Öffnen.

Sie verlieren dadurch alle fensterspezifischen Optionen. Sie können diese auch in einem Skript speichern und wiederherstellen.


Ich nahm an, dass dies der Fall war. Ich könnte wahrscheinlich ein kleines Skript schreiben, das genau das macht.
EvergreenTree

2
  1. Gehen Sie zur vorhandenen Zielregisterkarte
  2. Teilen Sie es auf, wie Sie möchten
  3. :b ab(Tab vervollständige den Rest)

abSind nur zufällige Buchstaben, ersetzen Sie diese durch den Anfang Ihres gewünschten Dateinamens. :bDie Tab-Vervollständigung hat sich für mich als sehr gut Taberwiesen. Normalerweise kann sie den richtigen Quellpuffer anhand von nur einem Buchstaben und 1-2 Tastendrücken finden.

Der Vorteil dieses Ansatzes gegenüber Ingo besteht darin, dass nichts bemerkt oder erinnert wird, was eine geringere kognitive Belastung bedeutet. Dateiname kennst du sowieso schon.


2

Die beiden unten definierten Befehle verschieben alle Puffer von der rechten Registerkarte auf die aktuelle Registerkarte und schließen dann die rechte Registerkarte. MtabspBewegt sie durch horizontales und Mtabvspvertikales Teilen . Sie müssen die zusammengeführte Registerkarte verschieben, bevor Sie die Befehle verwenden können. Verwenden Sie +tabm, -tabmoder <n>tabm.

Installieren

Fügen Sie das folgende vim-Skript zu Ihrem hinzu 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)

Technische Details

Die Funktion Mtab erhält einen Parameter vert. Hiermit wird festgelegt, ob die aktuelle Registerkarte horizontal oder vertikal geteilt wird.

Das gewünschte Ergebnis wird mit den folgenden Schritten erreicht:

  1. Wir wechseln vorübergehend zum nächsten Tab
  2. Verwenden Sie zwei Variablen, um die Registerkartennummer und die Puffer zu referenzieren
  3. Zurück zur aktuellen Registerkarte
  4. Wir teilen die Registerkarte und öffnen jeden Puffer
  5. Zum Schluss schließen wir die rechte Registerkarte

Wenn unser aktueller Tab der letzte ist, werden die Befehle ignoriert.


1

Wenn es eine ist Dateipuffer (wird nicht für Arbeit Kratzer Puffer etc.) können Sie:

  1. :let @f=@%ENTER - im Quellfenster;
    • Dies ersetzt den Inhalt des regulären Registers f durch den Inhalt des Sonderregisters % , das den aktuellen Dateinamen enthält.
    • Hinweis: Ich habe das Register f wie in der Datei ausgewählt , aber Sie können jedes andere Register verwenden, das Sie möchten.
    • Sie können überprüfen, ob das Register den richtigen Pfad enthält: :echo @f
  2. Optional: Ctrl-WCtrl-Q- um das alte Fenster zu schließen;
  3. gt/ gT- navigiere zur Zielregisterkarte (und zum Fenster);
  4. Ctrl-Ws - Teilen Sie die Registerkarte nach Belieben, um ein neues Fenster zu öffnen.
  5. :e␣Ctrl-RfENTER
    • Lädt im neu geöffneten Fenster eine Datei aus dem im Register f gespeicherten Pfad .
    • Hinweis: Das Zeichen ␣ markiert hier ein reguläres Leerzeichen.

Wichtiger Hinweis: Der letzte Schritt funktioniert nicht richtig, wenn der Pfad Leerzeichen oder einige Sonderzeichen enthält ! :-( Um dieses Problem zu umgehen, sollte der folgende, etwas längere Befehl für Pfade mit Leerzeichen funktionieren (obwohl er bei einigen anderen Sonderzeichen möglicherweise immer noch fehlschlägt):

  • :e␣"Ctrl-Rf"ENTER

(das heißt, das Ergebnis von Strg-R, f zu zitieren )

Inspiriert von Antworten von lkraav und ingo-karkat .


Das ist fantastisch, ich muss eine Zuordnung für "Ausschneiden und Einfügen" von Windows in Tabs einrichten.
dragon788
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.