Verwenden von Vims Registerkarten wie Puffer


366

Ich habe an der Fähigkeit sieht Tabs in Vim zu verwenden (mit :tabe, :tabnewusw.) als Ersatz für meine derzeitige Praxis mit vielen Dateien im selben Fenster in versteckten Puffern öffnen.

Ich möchte, dass jede einzelne Datei, die ich geöffnet habe, immer in einem eigenen Tab angezeigt wird. Es gibt jedoch einige Dinge, die dem im Wege stehen. Wie behebe ich diese:

  1. Wenn Befehle wie gfund ^]zu einem Speicherort in einer anderen Datei springen, wird die Datei in einem neuen Puffer auf der aktuellen Registerkarte geöffnet. Gibt es eine Möglichkeit, alle diese Arten von Befehlen die Datei in einer neuen Registerkarte öffnen zu lassen oder zur vorhandenen Registerkarte mit der Datei zu wechseln, wenn diese bereits geöffnet ist?

  2. Beim Wechseln der Puffer kann ich verwenden :b <part of filename><tab> und es werden die Namen der Dateien in vorhandenen Puffern vervollständigt. <part of filename>kann sogar die Mitte eines Dateinamens anstelle des Anfangs sein. Gibt es ein Äquivalent zum Wechseln der Registerkarten?

Antworten:


642

Halt halt halt.

Auf diese Weise können die Registerkarten von Vim nicht verwendet werden. Tatsächlich sind sie falsch benannt. Ein besserer Name wäre "Ansichtsfenster" oder "Layout", da dies eine Registerkarte ist - es ist ein anderes Layout der Fenster aller Ihrer vorhandenen Puffer.

Der Versuch, Vim in 1 Tab == 1 Puffer zu schlagen, ist eine Übung der Sinnlosigkeit. Vim kennt oder Pflege nicht und es wird nicht auf alle Befehle in respektieren insbesondere alles, was die Quickfix - Puffer verwendet ( :make, :grep, und :helpgrepsind diejenigen , die in den Sinn) werden gerne Tabs ignorieren und es gibt nichts , Sie zu stoppen tun können Das.

Stattdessen:

  • :set hidden
    Wenn Sie dieses Set noch nicht haben, tun Sie dies. Damit funktioniert vim wie jeder andere Editor für mehrere Dateien auf dem Planeten. Sie können Puffer bearbeitet haben, die irgendwo in einem Fenster nicht sichtbar sind.
  • Verwenden :bn, :bp, :b #, :b name, und , ctrl-6um zwischen Puffern. Ich mag ctrl-6mich selbst (allein wechselt es zum zuvor verwendeten Puffer oder #ctrl-6wechselt zur Puffernummer #).
  • Verwenden Sie diese Option, um:ls Puffer oder ein Plugin wie MiniBufExpl oder BufExplorer aufzulisten .

192
Für mich ist dies ein Fehler, kein "Benutzerfehler". Das Durchsuchen des Webs nach "Vim-Registerkarten" zeigt an, dass fast alle anderen mit Ihnen nicht einverstanden sind oder die "echte" Art der Verwendung von Vim-Registerkarten nicht kennen. Wenn Registerkarten wirklich "Layout" -Ansichten sind, warum sind dann Standard-Registerkartentitel der aktuelle Dateiname? Wenn ich mehrere Ansichten derselben Datei haben möchte, haben alle meine Tab-Titel den gleichen Namen (nicht sehr hilfreich?). So oder so ist die Standard-Tab-Implementierung in Vim fehlerhaft.
cmcginty

45
Was werden Sie sonst noch im Tab-Titel anzeigen? Es zeigt den aktuellen Puffernamen (nicht "Dateiname"). Sie können ohnehin ändern, was im Tab-Titel angezeigt wird.
Aehlke

46
@Casey: FWIW, als ich zum ersten Mal von Vims Tabs wusste und meinen Kopf um sie wickeln musste und wofür sie waren, dachte ich genau an die Definition von Zathrus. (Ich bin übrigens ein Vim-Neuling). Also nein, ich stimme nicht zu, dass es ein so kaputtes oder nicht intuitives Feature ist ... noch weniger stimme zu, dass "über jeden" nicht einverstanden ist (und denke, dass mindestens ein oder zwei Refs der Behauptung mehr Gewicht verleihen könnten). Es funktioniert erstaunlich gut, wenn mehrere Bildschirmlayouts gleichzeitig angezeigt werden.
ata

17
Dieser Kommentar ist falsch, ich bin mir nicht sicher, warum er positiv bewertet oder akzeptiert wird. Robince unten hat die richtige Antwort -: tab sball und: switchbuf sind das, wonach Sie suchen.
Roel

38
+1 für "Stop, Stop, Stop". Vim ist sowohl eine Mentalität als auch ein Werkzeug. Es ist wichtig, neuen Benutzern die Mentalität beizubringen, damit sie das Tool optimal nutzen können.
Cody Poll

273

Etwas spät zur Party hier, aber überrascht, dass ich Folgendes in dieser Liste nicht gesehen habe:

:tab sball - Dies öffnet eine neue Registerkarte für jeden geöffneten Puffer.

:help switchbuf- Dies steuert das Pufferumschaltverhalten. Versuchen Sie es :set switchbuf=usetab,newtab. Dies sollte bedeuten, dass Sie zur vorhandenen Registerkarte wechseln, wenn der Puffer geöffnet ist, oder wenn nicht, eine neue erstellen.


4
+1 für switchbuf- set switchbuf=useopenist groß , das lästige Verhalten zu vermeiden :make, :vimgrepund ähnliche Befehle, die die Puffer in der Fenster - Layout ändert sich auch dann , wenn der Puffer bereits angezeigt wurde.
mMontu

3
warum passt mir das nicht Nach dem Festlegen :se switchbuf=usetab,newtabwird bei einer Verwendung bnzum Wechseln des Puffers die Pufferdatei weiterhin in der aktuellen Registerkarte geöffnet, anstatt zur vorhandenen Registerkarte zu wechseln. Stimmt irgendetwas nicht?
Zhiyelee

173

Vim :help windowerklärt die Verwirrung "Tabs vs Puffer" ziemlich gut.

Ein Puffer ist der speicherinterne Text einer Datei.
Ein Fenster ist ein Ansichtsfenster in einem Puffer.
Eine Registerkarte ist eine Sammlung von Fenstern.

Das Öffnen mehrerer Dateien erfolgt in vim mit Puffern . In anderen Editoren (z. B. Notepad ++) erfolgt dies mit Registerkarten, sodass die Registerkarte "Name" in vim möglicherweise irreführend ist.

Windows dazu, den Arbeitsbereich aufzuteilen und mehrere Dateien (Puffer) zusammen auf einem Bildschirm anzuzeigen. In anderen Editoren kann dies erreicht werden, indem mehrere GUI-Fenster geöffnet und auf dem Desktop neu angeordnet werden.

Schließlich in dieser Analogie vim Registerkarten mehreren Desktops entsprechen, dh unterschiedlichen Neuanordnungen von Fenstern.

Als vim help: tab-page erklärt, kann eine Registerkarte verwendet werden, wenn eine Datei vorübergehend bearbeitet werden soll, aber nichts am aktuellen Layout von Fenstern und Puffern geändert werden soll. In einem solchen Fall kann eine andere Registerkarte nur zum Bearbeiten dieser bestimmten Datei verwendet werden.

Natürlich müssen Sie bedenken, dass das Anzeigen derselben Datei auf vielen Registerkarten oder Fenstern dazu führen würde, dass dieselbe Arbeitskopie (Puffer) angezeigt wird.


11
Dies ist eigentlich eine großartige Antwort, aber es dauerte ein paar Lesungen, um einen Sinn zu ergeben. Puffer = Registerkarten, Fenster = GUI-Fenster, Registerkarten = Desktops sind bisher am sinnvollsten, die ich für jemanden gefunden habe, der mit den Konzepten nicht vertraut ist
icc97

4
Ich neige dazu, sie als durch ein Fenster in einen Raum schauend zu betrachten - buffer= Objekt , window= Fenster und tab= Fenster . Ich kann mich im Raum bewegen und aus verschiedenen Fenstern hineinschauen ( tabs). Unterschiedliche Fenster können unterschiedliche Anzahl, Anordnung und Größe von haben Scheiben . Das gleiche Objekt kann gleichzeitig von verschiedenen betrachtet werden Scheiben in verschiedenen Fenstern .
go2null

Wenn Sie mit dem Linux-Arbeitsbereich und dem Windows-Paradigma vertraut sind, werden Sie das Erbe der vimVerwendung erkennen. Am Anfang war nur ein Fenster . Mit den Fenstermanagern konnten Sie die Fenster dann in Fenster (Kacheln von WM) oder in überlappende Fenster (schwebendes WM) aufteilen, aber sie bezeichneten jedes Fenster weiterhin als Fenster. Fügen Sie nun das Konzept eines Arbeitsbereichs hinzu, in dem der Bereich in mehreren Arbeitsbereichen angezeigt werden kann. In diesem Paradigma also buffer= App , window= Fenster und tab= Arbeitsbereich .
go2null

56

Im Gegensatz zu einigen anderen Antworten hier sage ich, dass Sie Registerkarten verwenden können, wie Sie möchten. vim wurde so konzipiert, dass es vielseitig und anpassbar ist, anstatt Sie zu zwingen, nach vordefinierten Parametern zu arbeiten. Wir alle wissen, wie sehr wir Programmierer es lieben, allen anderen unsere "Ethik" aufzuzwingen, daher ist diese Leistung sicherlich ein Hauptmerkmal.

<C-w>gfist das Tab-Äquivalent zum Pufferbefehl gf. <C-PageUp>und <C-PageDown>wechselt zwischen den Registerkarten. (In Byobu funktionieren diese beiden Befehle nie für mich, aber sie funktionieren außerhalb von Byobu / tmux. Alternativen sind gtund gT.) <C-w>TVerschiebt das aktuelle Fenster auf eine neue Registerkarte.

Wenn Sie möchten, dass vim nach Möglichkeit eine vorhandene Registerkarte verwendet, anstatt eine doppelte Registerkarte :set switchbuf=usetabzu erstellen , fügen Sie sie Ihrer .vimrc-Datei hinzu. Sie können newtabder Liste ( :set switchbuf=usetab,newtab) hinzufügen, um zu erzwingen, dass QuickFix-Befehle, die Kompilierungsfehler anzeigen, in separaten Registerkarten geöffnet werden. ich bevorzugesplit stattdessen, was die Kompilierungsfehler in einem geteilten Fenster öffnet.

Wenn Sie die Mausunterstützung aktiviert haben :set mouse=a, können Sie mit den Registerkarten interagieren, indem Sie darauf klicken. Es gibt auch ein+Standardmäßig Schaltfläche, mit der eine neue Registerkarte erstellt wird.

Geben Sie für die Dokumentation zu Registerkarten den :help tab-pagenormalen Modus ein. (Danach können Sie üben, ein Fenster mit auf eine Registerkarte zu verschieben <C-w>T.) Es gibt eine lange Liste von Befehlen. Einige der Fensterbefehle haben mit Registerkarten zu tun, daher möchten Sie möglicherweise auch diese Dokumentation über anzeigen :help windows.

Ergänzung: 2013-12-19

Verwenden Sie, um mehrere Dateien in vim mit jeder Datei auf einer separaten Registerkarte zu öffnen vim -p file1 file2 .... Wenn Sie wie ich sind und immer vergessen, etwas hinzuzufügen -p, können Sie es am Ende hinzufügen, da vim den normalen Parsing-Regeln für Befehlszeilenoptionen folgt. Alternativ können Sie ein Bash - Alias - Mapping hinzufügen vimzu vim -p.


3
+1 Beachten Sie vim -pjedoch, dass standardmäßig nur bis zu 10 Registerkarten angezeigt werden. Zusätzliche Dateien werden in Puffer geladen, aber nicht auf einer eigenen Registerkarte angezeigt.
IanB

@IanB: Wie überwinde ich die Standardeinstellung, sie auf 10 Registerkarten zu beschränken?
0xC0000022L

3
@ 0xC0000022L siehe tabpagemaxEinstellung
IanB

14

Ich bin auf das gleiche Problem gestoßen. Ich wollte, dass Tabs wie Puffer funktionieren, und ich schaffe es nie ganz, sie zu erreichen. Die Lösung, für die ich mich schließlich entschieden habe, bestand darin, Puffer wie Tabs zu verhalten!

Schauen Sie sich das Plugin namens Mini Buffer Explorer an . Sobald es installiert und konfiguriert ist, können Sie mit Puffern praktisch wie mit Registerkarten arbeiten, ohne an Funktionalität zu verlieren.


10

Dies ist eine Antwort für diejenigen, die mit Vim nicht vertraut sind und von anderen Texteditoren stammen (in meinem Fall Sublime Text).

Ich habe all diese Antworten durchgelesen und es war immer noch nicht klar. Wenn Sie sie genug durchlesen, beginnen die Dinge Sinn zu machen, aber ich habe Stunden gebraucht, um zwischen den Fragen hin und her zu gehen.

Das erste ist, wie andere erklärt haben:

Registerkarten klingen sehr nach Registerkarten , verhalten sich wie Registerkarten und sehen in den meisten anderen GUI-Editoren wie Registerkarten aus, sind es aber nicht. Ich denke, es ist ein schlechtes mentales Modell, das in Vim aufgebaut wurde und das leider die zusätzliche Leistung trübt, die Sie auf einer Registerkarte haben.

Die erste Beschreibung, die ich verstanden habe, stammt aus der Antwort von @ crenate, dass sie mehreren Desktops entsprechen. In dieser Hinsicht haben Sie immer nur ein paar Desktops geöffnet, aber in jedem sind viele GUI-Fenster geöffnet.

Ich würde sagen, dass sie anderen Editoren / Browsern ähnlich sind:

  1. Tab-Gruppierungen
  2. Sublime Text-Arbeitsbereiche (dh eine Liste der geöffneten Dateien, die Sie in einem Projekt haben)

Wenn Sie sie so sehen, erkennen Sie die Leistungsfähigkeit, mit der Sie Dateigruppen (Puffer) einfach gruppieren können, z. B. Ihre CSS-Dateien, Ihre HTML-Dateien und Ihre JS-Dateien auf verschiedenen Registerkarten. Welches ist eigentlich ziemlich genial.

Andere Beschreibungen, die ich verwirrend finde

Ansichtsfenster

Das macht für mich keinen Sinn. Ein Ansichtsfenster, das zwar einen definierten Wörterbuchbegriff enthält , ich jedoch nur gehört habe, dass es sich im :help windowDokument auf Vim-Fenster bezieht . Viewport ist kein Begriff, den ich jemals in Bezug auf Editoren wie Sublime Text, Visual Studio, Atom, Notepad ++ gehört habe. Tatsächlich hatte ich für Vim noch nie davon gehört, bis ich anfing, Registerkarten zu verwenden.

Wenn Sie Registerkarten wie mehrere Desktops anzeigen, erscheint es seltsam, einen Desktop als einzelnes Fenster zu bezeichnen.

Arbeitsbereiche

Dies ist möglicherweise sinnvoller. Die Wörterbuchdefinition lautet:

Ein Speicher für die vorübergehende Verwendung.

Es ist also wie ein Ort, an dem Sie eine Gruppe von Puffern speichern.

Ich habe mich anfangs nicht wie das Konzept von Sublime Text für einen Arbeitsbereich angehört, bei dem es sich um eine Liste aller Dateien handelt, die Sie in Ihrem Projekt geöffnet haben:

Die Sublime-Workspace-Datei, die benutzerspezifische Daten enthält, z. B. die geöffneten Dateien und die Änderungen an den einzelnen.

Wenn man jedoch mehr darüber nachdenkt, stimmt dies tatsächlich zu. Wenn Sie eine Vim-Registerkarte wie ein Sublime Text-Projekt betrachten, erscheint es seltsam, in jedem Projekt nur eine Datei zu öffnen und zwischen Projekten zu wechseln. Daher ist es ungerade, eine Registerkarte zu verwenden, um nur eine Datei zu öffnen.

Sammlung von Fenstern

Das :help window verweist auf diese Weise auf Registerkarten. Plus zahlreiche andere Antworten verwenden das gleiche Konzept. Doch bis Sie sich ein Bild davon machen, was ein Vim-Fenster ist, nützt das nicht viel, wie das Bauen einer Burg auf Sand.

Wie oben erwähnt, entspricht ein VIM-Fenster einem Ansichtsfenster und ist in diesem Artikel auf linux.com hervorragend erklärt :

Eine wirklich nützliche Funktion in Vim ist die Möglichkeit, den sichtbaren Bereich auf eine oder mehrere Dateien aufzuteilen oder einfach das Fenster aufzuteilen, um zwei Bits derselben Datei einfacher anzuzeigen. In der Vim-Dokumentation wird dies austauschbar als Ansichtsfenster oder Fenster bezeichnet.

Möglicherweise sind Sie mit dieser Funktion bereits vertraut, wenn Sie die Hilfefunktion von Vim jemals mithilfe des Hilfethemas oder durch Drücken der Taste F1 verwendet haben. Wenn Sie die Hilfe eingeben, teilt Vim das Ansichtsfenster und öffnet die Hilfedokumentation im oberen Ansichtsfenster, wobei Ihr Dokument im unteren Ansichtsfenster geöffnet bleibt.

Ich finde es seltsam, dass eine Registerkarte als Sammlung von Fenstern anstelle einer Sammlung von Puffern bezeichnet wird. Aber ich denke, Sie können zwei separate Registerkarten mit jeweils mehreren Fenstern öffnen, die alle auf denselben Puffer zeigen. Zumindest verstehe ich das bisher.


1
Nach einem soliden Jahr der Vollzeitnutzung von Vim stieß ich schließlich auf einen Fall, in dem ich mehr als eine Registerkarte verwenden wollte. Derzeit funktionieren Puffer perfekt für mich, da ich in anderen Editoren Registerkarten verwenden würde. Aber mit einem großen Monitor habe ich eine ganze Reihe von 3-4 verschiedenen Puffern verglichen. Dann wollte ein Kollege, dass ich an anderer Stelle in der Codebasis nach Code suche. Anstatt meine Vergleichsfenster zu verlieren, könnte ich einfach eine neue Registerkarte erstellen, die es mir ermöglicht, eine separate Suche durchzuführen, wie ich es bei normaler Verwendung von Vim tun würde, und dann könnte ich die Registerkarte schließen, sobald ich fertig bin, und zu meiner ursprünglichen Gruppe zurückkehren
icc97

4

Betrachten: Hilfe-Registerkarten Es sieht nicht so aus, als ob vim so arbeiten möchte, wie Sie es tun ...

Puffer werden von mehreren Registerkarten gemeinsam genutzt, sodass es nicht möglich zu sein scheint, einen bestimmten Puffer so zu sperren, dass er nur auf einer bestimmten Registerkarte angezeigt wird.

Es ist jedoch eine gute Idee.

Sie könnten wahrscheinlich den gewünschten Effekt erzielen, indem Sie ein Terminal verwenden, das Registerkarten wie Multi-Gnome-Terminal unterstützt, und dann vim-Instanzen in jeder Terminal-Registerkarte ausführen. Nicht perfekt ...


Ich habe das versucht. Das Problem dabei ist, dass zerrissener Text nicht nur zwischen den Registerkarten des Terminals ausgetauscht werden kann, da es sich im Wesentlichen um zwei verschiedene Terminals / Shells handelt
puk

@puk: Probieren Sie das YankRing Vim Plugin. Es speichert zerrissenen Text in einer Datei, sodass er für mehrere Instanzen freigegeben werden kann.
Pixelastic

@ Pixelastic Ich habe hier eine geeignete Lösung gefunden, um in die Zwischenablage des Systems zu ziehen. Außerdem funktioniert Vim in einem Fall am besten. Ich hörte auf, es tun zu lassen, was ich wollte, und lernte, wie man vim richtig benutzt :-) stackoverflow.com/a/8757876/654789
puk

@puk: Danke, mir ist nicht in den Sinn gekommen, dass die Verwendung der System-Zwischenablage bedeutet, sie auch über vim-Instanzen hinweg zu teilen :)
pixelastic

4
  • Sie können Befehle zuordnen, die normalerweise Puffer bearbeiten, um Registerkarten zu bearbeiten, wie ich es mit gf in meiner .vimrc getan habe:

    map gf :tabe <cfile><CR>
    

    Ich bin sicher, dass Sie dasselbe mit [^ tun können

  • Ich glaube nicht, dass vim dies (noch) für Tabs unterstützt. Ich benutze gt und gT, um zur nächsten bzw. vorherigen Registerkarte zu wechseln. Sie können auch Ngt verwenden, wobei N die Registerkartennummer ist. Ein Ärger, den ich habe, ist, dass die Tab-Nummer standardmäßig nicht in der Tab-Zeile angezeigt wird. Um dies zu beheben, habe ich einige Funktionen am Ende meiner .vimrc-Datei eingefügt (ich habe hier nicht eingefügt , weil es lang ist und nicht richtig formatiert wurde).


<c-w>gföffnet den Dateinamen unter dem Cursor in einem neuen Tab
Peter Rincker

4

Ich verwende Puffer wie Tabs, das BufExplorer- Plugin und einige Makros:

" CTRL+b opens the buffer list
map <C-b> <esc>:BufExplorer<cr>

" gz in command mode closes the current buffer
map gz :bdelete<cr>

" g[bB] in command mode switch to the next/prev. buffer
map gb :bnext<cr>
map gB :bprev<cr>

Mit BufExplorer haben Sie oben keine Registerkartenleiste, aber auf der anderen Seite spart es Platz auf Ihrem Bildschirm. Außerdem können Sie unendlich viele Dateien / Puffer öffnen und die Pufferliste kann durchsucht werden ...


2

Wenn Sie möchten, dass Puffer wie Registerkarten funktionieren, lesen Sie das Tabline-Plugin .

Das verwendet ein einzelnes Fenster und fügt oben eine Linie hinzu, um die Registerkarten zu simulieren (nur die Liste der Puffer wird angezeigt). Dies kam vor langer Zeit heraus, als Registerkarten nur in GVim, nicht aber in der Befehlszeile vim unterstützt wurden. Da es nur mit Puffern arbeitet, lässt sich alles gut in den Rest von vim integrieren.

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.