Wie binde ich eine Reihe von Puffern an eine Registerkarte?


14

Wenn ich gleichzeitig an verschiedenen Projekten arbeiten muss, habe ich den folgenden Workflow:

  • Ich erstelle eine Registerkarte für jedes Projekt.
  • In jeder Registerkarte öffne ich die Dateien, die ich bearbeiten möchte, was mehrere Puffer macht.
  • Optionnaly, wenn ich zwei (oder mehr) Dateien gleichzeitig sehen muss, erstelle ich geteilte Fenster, so dass ich eine Registerkarte mit verschiedenen Fenstern habe, die einen Puffer zeigt.

Zum Navigieren zwischen meinem Puffer uns nicht wirklich verwenden :lsund :b [name or number of buffer]stattdessen habe ich einige praktischen Zuordnungen erlauben mich zwischen den Puffern zu wechseln mit :bnextund:bprevious

Diese Art zu arbeiten ist ziemlich gut, aber etwas stört mich: Die Puffer werden zwischen den Registerkarten geteilt.

Wenn ich öffne file1und file2in tab1und file3in tab2, wenn tab1ich es mehrmals benutze, :bnextsehe ich file3in dieser Registerkarte, was ich nicht möchte. Der Workflow, den ich erhalten möchte, ist der folgende :

  • Starte vim (ich habe einen ersten Tab mit einem Puffer darin): $ vim foo
  • Fügen Sie dieser Registerkarte einen Puffer hinzu: :e bar
  • Öffne einen neuen Tab und wechsle dorthin: :tabnew
  • Öffnen Sie einen neuen Puffer in dieser Registerkarte: :e baz
  • Wenn ich in diesem Puffer bleibe und mache :bnextoder :bpreviousich bleibe im bazPuffer (da dies der einzige in diesem Tab ist)
  • Wenn ich in den vorherigen Tab gehe :tabpreviousund mehrmals ausführe, wechsle :bnextich nur zwischen foound barpuffere, sehe aber nichtsbaz

Hier kommt also meine Frage: Ist es möglich, einen Satz von Puffern an einen Tab zu binden und vim den Zugriff auf einige Puffer von einem anderen Tab als dem, in dem sie sein sollen, zu verweigern?

Hinweis: Mir ist bewusst, dass die Verwendung von :b [myBuffer]eine Möglichkeit ist, einen Puffer in einem Tab zu behalten. Wenn ich jedoch 3 oder 4 Dateien zum Bearbeiten habe, habe ich das Gefühl, dass ich meine Zuordnungen schneller verwende als den Puffernamen einzugeben (selbst wenn ich kann) Geben Sie nur einige Zeichen ein, die mit dem Namen des Puffers übereinstimmen .


1
Hier ist eine alte Diskussion, die die Vor- und Nachteile
VanLaser

@VanLaser: Danke für den Link, es ist eine interessante Diskussion! Tatsächlich schließe ich tmux und verschiedene vim-Instanzen ein, wenn ich auf meinem persönlichen Computer bin. Meine Frage ergibt sich aus der Tatsache, dass ich für meine professionelle Arbeit Windows verwenden muss und mir der Umgang mit den Fenstern wirklich nicht gefällt: Das Verwenden alt+tab(oder noch schlimmer das Verwenden der Maus) fühlt sich viel weniger einfach an als das Wechseln der Registerkarte in vim.
statox

1
Vielleicht kann vim-ctrlspace helfen - es kündigt pro Registerkarte Pufferlisten an; Ich benutze es aber nicht.
VanLaser

Antworten:


7

Mhh, ich habe da draußen kein Plugin gefunden, aber du könntest es selbst schreiben. Sie müssen Vimscript dafür lernen. Ich habe gerade die Funktionalität implementiert, mit der Sie in einem Tab zwischen den Puffern wechseln können (noch keine Löschung). Sie können dies in Ihr vimrc kopieren:

if !exists("g:WindowBufManager") 
  let g:WindowBufManager= {}
endif

function! StoreBufTab()
  if !has_key(g:WindowBufManager, tabpagenr())
    let  g:WindowBufManager[tabpagenr()] = []
  endif

  " add the new buffer to our explorer
  if index(g:WindowBufManager[tabpagenr()], bufname("%")) == -1 && bufname("%") != ""
    call add (g:WindowBufManager[tabpagenr()],bufname("%"))
  endif
endfunction

function! WindowBufManagerNext() 
  " find the next index of the buffer
  let s = index(g:WindowBufManager[tabpagenr()], bufname("%"))
  if (s!= -1)
    let s = (s +1) % len(g:WindowBufManager[tabpagenr()])
    execute 'b ' . g:WindowBufManager[tabpagenr()][s]
  endif
endfunction

augroup WindowBufManagerGroup
  autocmd! BufEnter * call StoreBufTab()
augroup END

Schließen Sie Ihr vimrc und öffnen Sie es erneut. Um den nächsten Puffer zu finden, verwenden Sie einfach

:call WindowBufManagerNext()

oder definieren Sie Ihren eigenen Befehl oder Zuordnung. Dies funktioniert, solange Sie eine Registerkarte oder einen Puffer nicht schließen oder löschen. Es funktioniert auch nicht für mehrere Puffer. Es würde etwas mehr Arbeit erfordern, um diese Funktionen hinzuzufügen, aber es ist definitiv machbar.


Ich habe auch kein Plugin gefunden und hoffte auf ein eingebautes Feature, aber es scheint, dass Sie Recht haben, ich muss es wahrscheinlich selbst tun. Vielen Dank für Ihren Code, den ich verwenden könnte. Er hat eine Basis, um ein vollständiges Plugin zu entwickeln.
statox

6

Puffer sind global und Sie können nichts dagegen tun, als Ihre eigene Abstraktionsebene über Registerkarten, Fenstern und Puffern zu schreiben. Die Antwort von philolo1 zeigt eine vernünftige Herangehensweise an das Problem, aber Sie finden schnell die Grenzen einer solchen "Lösung" und müssen viele integrierte Funktionen wie :bufdooder die alternative Datei duplizieren ...

"Argumente" hingegen können für ein Fenster lokal sein, sodass sie in Ihrem Workflow möglicherweise nützlicher sind als "Puffer" (im engeren Sinne des Wortes):

$ vim file1 file2
:tabnew
:argl file3 file4 file5
:n
:n
gt
:n
gt
:N
and so on…

Argumente sind nicht so flexibel wie Puffer, bieten jedoch möglicherweise eine zuverlässigere Grundlage für Ihren Workflow.

Aber die Arbeit an jedem Projekt in einer eigenen Vim-Instanz ist meiner Meinung nach die einzig praktikable Lösung.


Ich bin mit der Idee einverstanden, dass die Verwendung separater vim-Instanzen besser ist, wenn ich sie in einem Terminal verwenden kann, wie ich in einem anderen Kommentar sagte, dass ich Windows auf meinem professionellen Computer verwenden muss und das Wechseln zwischen gvim-Instanzen mit diesem Betriebssystem ein Problem ist . Ich werde einen Blick auf die Argumente werfen, die ich vorher noch nie benutzt habe, und das könnte eine gute Lösung sein, danke!
statox

2

Mit einiger Verspätung glaube ich, eine (zumindest für mich!) Zufriedenstellende Antwort gefunden zu haben. Sie benötigen zwei von Shougos Plugins:

und eine Schnellzugriffskarte, die anstelle von verwendet wird :ls, um nur Puffer auf der aktuellen Registerkarte anzuzeigen (und auszuwählen) .

Zum Beispiel so etwas wie:

nnoremap <leader>b :<C-u>Unite buffer_tab -no-split<CR>

unite - per tab puffer

Sie können jetzt durch die Pufferliste ( j, k) des aktuellen Registers navigieren , eine ( CR) auswählen , abbrechen ( q), in den Eingabemodus (Einfügen) wechseln, um die Pufferauswahl schnell durch Eingabe einiger Buchstaben zu filtern, oder die Aktionsliste durch Drücken Tabvon öffnen für das aktuell ausgewählte Element (z. B. um den Puffer über dem aktuell aktiven Element zu öffnen ) - kurz, Sie verhalten sich generisch wie "Unite".

(Siehe auch :h unite_default_key_mappingsund Hilfe allgemein vereinen).


Und jetzt zum letzten (noch optionalen) Trick. Mit altercmd können Sie Ihren eigenen, tabulatorgesteuertenls Befehl erstellen (basierend auf der oben genannten Unite-Funktionalität):

:command! LS Unite buffer_tab -no-split
:AlterCommand ls LS

... und jedes Mal :ls, wenn Sie drücken , führt Vim stattdessen Ihren Befehl aus.

Beachten Sie, dass Sie auch nicht :bnoder benötigen :bp, da die Anzeige und Auswahl der Puffer in den Registerkarten jetzt derselbe Befehl ist.


Ich werde diese Lösung auch versuchen. Im Moment versuche ich, den von VanLaser im Kommentar erwähnten Ctrl-Space zu testen, was ziemlich gut ist. Ich werde sehen, welche Lösung am bequemsten ist. Auch +1 für das altercmd-Plugin, das ziemlich cool ist!
statox

2

Ich kann keinen Kommentar abgeben, da mein Konto neu ist. Das tut mir leid, aber ++++ 1 für Strg-Leertaste.

Ich war verkauft, als ich es nach der Hälfte der Hilfe geschafft hatte. Ctrlspace hat eine Struktur wie diese:

workspaces --> contain tabs --> contain buffers

Sie können also für jedes Projekt, an dem Sie arbeiten, einen Arbeitsbereich speichern und ihn dann sofort laden, wann immer Sie möchten. Dies bedeutet, dass Sie bei jedem Schließen von vim alle Puffer- und Tabulatoraufteilungen speichern können.

Sie können Ihre Registerkarten auch benennen. Wenn dies nicht ausreicht, können Sie auch Arbeitsverzeichnisse ganz einfach ändern und Lesezeichen für Verzeichnisse erstellen, die Sie häufig verwenden.

Es passt gut zu nerdtree, wenn Sie das benutzen (obwohl Sie ehrlich gesagt wahrscheinlich nicht einmal das Gefühl haben, dass Sie es nach einer Woche mit ctrlspace brauchen).


Betrachten Sie diesen Anwendungsfall:

Sie haben ein Projekt. Es geht darum, Bäume zu pflanzen. Es gibt Obstbäume und Geldbäume. Geldbäume enthalten Dollar und Cent, während Obstbäume Äpfel und Orangen enthalten.

In diesem Beispiel sind Äpfel, Orangen, Dollar und Cent "Puffer".

Mit Ctrlspace können Sie Äpfel und Orangen in einem "Tab" trennen, den Sie als "Frucht" bezeichnen können. Dieses Etikett wird in der Tag-Zeile oben in Ihrem Fenster angezeigt. Ebenso werden Dollar und Cent in einen "Geld" -Reiter eingegeben.

Der Arbeitsbereich "Bäume" speichert diese gesamte Konfiguration und ermöglicht den sofortigen Zugriff, sobald Sie vim öffnen.


Jetzt, da ich mir seiner Existenz bewusst bin, kann ich mir wirklich nicht vorstellen, objektorientierte Entwicklung in vim ohne dieses Plugin durchzuführen. Für alle Fälle ist hier der Link: https://github.com/szw/vim-ctrlspace


2

Also endlich beschlossen, mein eigenes Plugin zu erstellen, um mein Problem zu lösen, es ist auf Github verfügbar .

Ich habe die Idee von @ philolo1 benutzt und versucht, sie zu vervollständigen. Während ich diese Antwort schreibe, ist sie noch in Arbeit.

BEARBEITEN Ich behalte das Plugin nicht mehr bei, während sich mein Workflow weiterentwickelt, und ich stellte fest, dass das Binden von Puffern an einen Tab mehr Probleme verursacht, als es löst.


Das Plugin bindet Puffer an Registerkarten: Wenn der Benutzer einen Puffer öffnet, wird er automatisch in der Registerkarte "gespeichert" und kann nicht von einer anderen Registerkarte aus aufgerufen werden.

Die Installation sollte "Plugin Manager-freundlich" sein (zumindest funktioniert es gut mit Vim-Plug und Vundle )

Einige der Hauptmerkmale sind:

  • Automatische Bearbeitung des Bindens von Puffern (der Benutzer kann sie wie zuvor öffnen)
  • :NextBufund :PrevBufersetzen :bnund :bNeinen konsistenten Zustand der Registerkarten zu halten
  • :ListBufErmöglicht es, die Puffer auf ähnliche Weise :lsaufzulisten, mit der Ausnahme, dass sie in Registerkarten getrennt sind und ein Zeichen den Benutzer leicht erkennen lässt, in welcher Registerkarte er sich gerade befindet.
  • :ChangeBuf Akzeptieren Sie eine Puffernummer oder einen Puffernamen, um den Puffer und die Registerkarte automatisch zu ändern
  • Das Schließen eines Puffers erfolgt mit :CloseBuf
  • Das Schließen eines Tabs erfolgt mit :CloseTab

Für andere Operationen soll der Benutzer in der Lage sein , die Funktionen in integrierten zu verwenden (wie :tabopen, :tabnextusw ...)

Für jeden Befehl werden einige Standardzuordnungen bereitgestellt, die durch Hinzufügen let g:betterTabsVim_map_keys = 0zu Ihrem einfach deaktiviert werden können .vimrc.

Ich habe auch versucht, eine explizite Hilfedatei ( :h betterTabs.txt) zu erstellen : Sie ist noch nicht vollständig, aber Benutzer sollten das Minimum finden, um das Plugin zu verwenden.

Ich muss noch viel testen, um sicherzustellen, dass das Plugin kein natives Verhalten beeinträchtigt.

Wenn jemand helfen möchte, ist es immer möglich, Probleme auf der Github-Seite zu erstellen oder Pull-Anfragen zu erstellen.


1

Schauen Sie sich dieses Plugin an. Mir scheint, es passt perfekt zu Ihren Bedürfnissen. https://github.com/szw/vim-ctrlspace


VanLaser hat es zwar in den Kommentaren erwähnt und ich habe es mir zunächst nicht genau genug angesehen, aber es scheint wirklich gut zu sein, ich habe es jetzt schon ein paar Tage versucht.
statox
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.