Wie kann ich mehrere Registerkarten gleichzeitig öffnen?

14

Wenn ich benutze:

:tabedit file1 file2

Ich bekomme:

E172: Only one file name allowed

Gibt es eine Möglichkeit, :tabeditmit mehreren Dateinamen zu arbeiten? Oder eine andere Möglichkeit, mehrere Registerkarten gleichzeitig zu öffnen?

Martin Tournoij
quelle
1
Siehe auch: Wie Sie vim dazu bringen, beim Superuser SE
Kenorb
@kenorb Ja. Und es hat genau die gleiche Antwort bereits hier, außer ohne Erklärung, was es tut. Wie bringt die Verknüpfung mit dieser Funktion einen Mehrwert?
Martin Tournoij
Es gibt einige andere Antworten, und es können neue Antworten kommen. Zweitens gibt es dort nur wenige ähnliche verknüpfte / verwandte, sodass Benutzer auch von verwandten Onces mehr lernen können.
Kenorb
Ich habe diesen Einzeiler gelernt: :args *.c | tab all. Die andere Frage ist populärer als diese, daher ist es gut, sie auch zu verknüpfen.
Kenorb
Verwandte Themen: Öffnen Sie mehrere Dateien in neuen Registerkarten mit VIM bei Stapelüberlauf.
Mihai Capotă

Antworten:

10

In Anbetracht der Probleme und der Komplexität meiner anderen Antwort auf die "eingebaute" Art und Weise, indem ich die Argumentliste ändere, habe ich dazu eine eigene kleine Funktion hinzugefügt:

" Open multiple tabs at once
fun! OpenMultipleTabs(pattern_list)
    for p in a:pattern_list
        for c in glob(l:p, 0, 1)
            execute 'tabedit ' . l:c
        endfor
    endfor
endfun

command! -bar -bang -nargs=+ -complete=file Tabedit call OpenMultipleTabs([<f-args>])

Sie können jetzt verwenden :Tabedit *.vim. Diese Funktion erweitert alle Globbing-Muster und wird :tabedit <f>für jede Datei ausgeführt. Sie können so viele Pfadnamen hinzufügen, wie Sie möchten. Dies funktioniert beispielsweise wie folgt:

:Tabedit file.rb
:Tabedit *.c
:Tabedit file1.py file2.py _*.py
:Tabedit /etc/hosts file{1,2}.sh

Nun, und so weiter ...

Ich habe dies in einem kleinen globedit.vim Plugin, welches auch Befehl enthält für :Edit, :Splitusw.

Martin Tournoij
quelle
2
Tolle Funktion und Befehl! Einige Verbesserungen: (1) Verwenden Sie [<f-args>]anstelle von "<args>"-. Auf diese Weise ist der patternParameter eine Liste (Array) und Sie müssen die Zeichenfolge nicht manuell aufteilen. (2) Übergeben Sie als drittes Argument einen Wert ungleich Null glob(), damit eine Liste zurückgegeben wird. Dann können Sie auch hier das manuelle Teilen vermeiden. Sie werden übergeben müssen 0als zweites Argument , es zu überspringen , ohne das Verhalten zu beeinflussen: glob(l:p, 0, 1).
tommcdo
6

Soweit ich weiß, ist der einzige eingebaute Weg, dies zu tun:

:args *.vim
:tab all

Zunächst :argswird die Argumentliste durch die ersetzt. In der Argumentliste werden die Dateien aufgelistet, mit denen Sie Vim geöffnet haben. Das vim file1 file2bedeutet, dass die Argumentliste file1und enthält file2.
Wir können dies zur Laufzeit ändern und Vim öffnet einen Puffer für jeden neuen Eintrag in der Argumentliste.
Siehe :help argument-listfür weitere Informationen.

Der :allBefehl öffnet ein Fenster für jeden Eintrag in der Argumentliste, der :tabBefehl führt einen Befehl aus und öffnet eine neue Registerkarte, wenn der angegebene Befehl ein neues Fenster öffnen würde.

Vorbehalte

Diese Methode weist einige Einschränkungen auf.

Erstens gibt es keine Überprüfung auf Duplikate, sodass Sie zwei oder mehr Registerkarten für denselben Puffer haben können.

Das größte Problem ist jedoch, dass alle Tabs durch die Argumentliste ersetzt werden. so dass Sie verloren alle vorhandenen Tabs.
Sie können diese leicht umgehen , indem Sie :argadd *.vimauf hinzufügen zu der Liste der Argumente, anstatt sie zu ersetzen; Befehle wie :editoder ändern :tabeditjedoch nicht die Argumentliste, und Sie verlieren diese Registerkarten, wenn Sie sie nicht zur Argumentliste hinzufügen (Sie haben sie jedoch immer noch in der Pufferliste). Möglicherweise möchten Sie auch nicht alle Elemente in Ihrer Argumentliste auf einer Registerkarte öffnen. Vielleicht möchten Sie nur zwei Dateien als zusätzliche Registerkarte öffnen.

Sie könnten dies vielleicht etwas verbessern, indem Sie zuerst alle derzeit geöffneten Tabs zur Argumentliste hinzufügen (was ich nicht wirklich zur Arbeit bringen kann), aber das ist noch lange nicht perfekt. Wenn eine Registerkarte zwei oder mehr Fenster enthält, werden diese trotzdem geändert ...

Martin Tournoij
quelle
Ich könnte mich irren, aber öffnet dies nicht einen zusätzlichen Tab (wie in meiner Frage zum Öffnen von Tabs standardmäßig zu sehen ist)?
muru
1
Wenn Sie sich auf meine Antwort zu dieser Frage beziehen, besteht der Unterschied darin, dass ich :argdo tabedit %eine neue Registerkarte für jedes Argument geöffnet habe. Wenn Sie mit einem Tab beginnen und n neue öffnen , erhalten Sie natürlich n + 1 Tabs. :tab allist eine viel bessere Lösung.
tommcdo
@tommcdo Ich sprach von Josh Petries Antwort . Du würdest doch keinem seiner Aliase passieren, oder? :)
muru
Haha, nein. Ich muss über eine andere Frage nachgedacht haben!
tommcdo
2

Sie können :nextstattdessen den Befehl verwenden, in Beispiel:

:n file1 file2

oder:

:n *.txt
Kenorb
quelle
Dies scheint das gleiche wie mit :args *.vim? Zumindest verhält es sich genauso und :help next_fdokumentiert es als dasselbe ...
Martin Tournoij
Es ist kürzer und einfacher und das hast du nicht erwähnt. Das Verhalten ist das gleiche, wie Sie in der Frage danach gefragt haben.
Kenorb
2

Über die Befehlszeile können Sie Folgendes verwenden:

vim file1 ... filen -p

Und wenn Sie vergessen haben, -pnoch zu verwenden , können Sie verwenden

:tab ball

Übrigens, vergessen Sie nicht, dass die Variable tabpagemax(Standardwert 10) die Anzahl der Registerkarten begrenzt, die Sie auf diese Weise öffnen können.

dsueiro
quelle
0

Sie können tatsächlich neue Registerkarten öffnen und Ihre aktuellen Registerkarten beibehalten, ohne neue Funktionen zu schreiben (siehe diese Antwort zum Stapelüberlauf ):

:args file1 file2 | argdo tabe

Möglicherweise möchten Sie :tabevorher eine neue leere Registerkarte ( ) öffnen, da die erste Datei in der aktuellen Registerkarte geöffnet wird. Außerdem bleibt ein zusätzlicher leerer Tab offen (um :help argdozu verstehen, warum).

Mihai Capota
quelle
Sie müssen auch die Syntaxhervorhebung korrigieren (aus irgendeinem Grund), wie im Link erläutert, und die letzte Registerkarte schließen, damit der Befehl 'full' lautet: :tabnew | args file1 file2 | argdo tabe | tabdo syntax onDrücken Sie die Eingabetaste, um die Eingabeaufforderung zu löschen, und geben Sie Folgendes ein :close, um die letzte zu entfernen ( leer) tab ... es ist sehr viel tippen und nur wert, wenn Sie viele tabs öffnen (für 2 oder 3 dateien :tabewäre es schneller, wenn Sie nur zweimal tippen).
Martin Tournoij