Duplizieren Sie den Puffer in eine neue Registerkarte, anstatt ihn zu verschieben


10

Ich möchte häufig vorübergehend einen Puffer auf einer Registerkarte maximieren und dann zur alten Pufferkonfiguration zurückkehren, die ich mir angesehen habe. Mein aktueller Workflow, um so etwas zu tun, besteht entweder darin, alle anderen Puffer mit zu schließen <c-w>ooder den Puffer, den ich gerade betrachte, auf eine eigene Registerkarte zu verschieben <c-w>T. Das Problem beim zweiten Ansatz besteht darin, dass der Puffer von der ursprünglichen Registerkarte entfernt wird.

Ich bevölkern drei Dateien a.txt, b.txtund c.txtmit a, bund cjeweils.

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

Wenn ich alle drei Dateien auf einer Registerkarte öffne, wird Folgendes angezeigt.

Geben Sie hier die Bildbeschreibung ein

Dann kann ich selbst a.txtzu einem Tab wechseln . Wenn ich dies tue, wird a.txtes jedoch von der ursprünglichen Registerkarte entfernt. (Also das wäre nach a <c-w>Tgt)

Geben Sie hier die Bildbeschreibung ein

Ich möchte die Möglichkeit haben, zu dem Zeitpunkt zu wählen, zu dem ich gedrückt hätte <c-w>T, um den Inhalt des ursprünglichen Puffers beizubehalten, eine neue Registerkarte zu erstellen, die nur den aktuell fokussierten Puffer enthält, und dann die neue Registerkarte zu fokussieren, die ich gerade habe erstellt. Mit anderen Worten, ein Befehl ist fast genau so, <c-w>Taußer dass die ursprüngliche Registerkarte beibehalten wird und sich jetzt a.txtauf zwei Registerkarten befindet.

Gibt es eine Möglichkeit, dies zu tun?

Antworten:


13

Ich bin nicht sicher, aber Sie könnten es versuchen :tab split(oder die kürzere Version :tab sp).

Der :splitBefehl sollte das angezeigte Ansichtsfenster duplizieren a.txt, während der :tabModifikator dieses Ansichtsfenster auf eine dedizierte Registerkarte verschieben sollte.


Wenn Sie das Verhalten von ändern möchten C-w T, können Sie es folgendermaßen neu zuordnen:

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

Im Allgemeinen können Sie jedes Mal, wenn Sie einen Befehl finden, der das Fenster teilt, und stattdessen eine neue Registerkarte erstellen möchten, ihm ein Präfix voranstellen :tab.

Es kann zum Beispiel verwendet werden, um einen Hilfepuffer auf einer neuen Registerkarte zu lesen:

:tab help {your_topic}

Standardmäßig wird die neue Registerkarte nach der aktuellen angezeigt. Wenn Sie es jedoch an einer anderen Stelle anzeigen möchten, können Sie :tabeine Zählung voranstellen .

Um beispielsweise das aktuelle Ansichtsfenster auf einer Registerkarte nach der dritten zu duplizieren, können Sie Folgendes eingeben:

:3tab split

Und um es als erstes erscheinen zu lassen:

:0tab split

Weitere Informationen finden Sie unter :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

Ich habe Tabs wegen dieses Problems größtenteils vermieden, aber jetzt habe ich eine Funktion, die das gewünschte Verhalten beim Duplizieren von Tabs aufweist. Ich habe es getestet, aber noch nicht ernsthaft damit begonnen. Dieser Workflow weist möglicherweise einige versteckte Nachteile auf.

Ein Problem mit der Funktion besteht darin, dass ein Teil des Status aus dem vorherigen Puffer-Fenster-Paar nicht dupliziert wird (z. B. ob set numberaktiviert oder nicht). Wenn Sie ein bisschen spekulieren, c-w Ttritt dieses Problem wahrscheinlich nicht auf, da keine Duplizierung durchgeführt wird und das Fenster wahrscheinlich nur repariert wird.

Vim verfügt über einige 1-basierte Listen für Puffer, Registerkarten und Fenster. Soweit ich das beurteilen kann, basieren sie auf 1, da der 0Schlüssel verwendet wird, um an den Anfang einer Zeile zu gelangen, und daher das Übergeben von Null als numerisches Argument unmöglich ist.

Wir kümmern uns um drei Listen, um diese Funktionalität zu emulieren:

  • Die globale Liste der Registerkarten
  • Die Liste der Fenster auf der Registerkarte
  • Die globale Liste der Puffer

Wir speichern alle diese Werte und erstellen dann über "tabnew" einen neuen Tab. Neue Registerkarten werden immer rechts erstellt, sodass keiner der Indizes unter der Registerkarte, von der wir tabnewstammen, ungültig ist. (Ein robusterer Weg, dies zu tun, wäre wahrscheinlich besser).

Der tabnewBefehl verschiebt den Fokus auch auf die neue Registerkarte und das einzelne Fenster darin. Von dort aus können wir mit dem bufferBefehl eine Ansicht auf den Puffer erstellen, der ursprünglich den Fokus hatte.

Dann verwenden wir den gespeicherten Index der ursprünglichen Registerkarte, um den Fokus wieder auf diese Registerkarte zu setzen. Und dann, größtenteils aus Paranoia heraus, setzen wir den Fokus innerhalb dieser Registerkarte auf das ursprüngliche Fenster. Vim scheint sich zu erinnern, welches Fenster in nicht sichtbaren Registerkarten den Fokus hat, aber ich mag es nicht, mich darauf zu verlassen.

(Einige stilistische Punkte: Die explizite numerische Konvertierung 0+, globale Variablen und Zusicherungen sind alle beabsichtigt.)

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
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.