Używanie zakładek Vima, takich jak bufory

366

Patrzyłem na możliwość używania zakładek w Vimie (z :tabe, :tabnewitp.) Jako zamiennik mojej obecnej praktyki posiadania wielu plików otwartych w tym samym oknie w ukrytych buforach.

Chciałbym, aby każdy odrębny plik, który otworzyłem, zawsze znajdował się na swojej karcie. Są jednak pewne rzeczy, które temu przeszkadzają. Jak to naprawić:

  1. Gdy polecenia takie jak gfi ^]przejdź do lokalizacji w innym pliku, plik otwiera się w nowym buforze na bieżącej karcie. Czy istnieje sposób, aby wszystkie tego rodzaju polecenia otworzyły plik na nowej karcie lub przełączyły się na istniejącą kartę z plikiem, jeśli jest już otwarty?

  2. Podczas przełączania buforów mogę użyć, :b <part of filename><tab> a to uzupełni nazwy plików w istniejących buforach. <part of filename>może nawet znajdować się w środku nazwy pliku zamiast na początku. Czy istnieje odpowiednik przełączania kart?

wcięcie
źródło

Odpowiedzi:

642

Stać! Stać! Stać.

Nie w taki sposób mają być używane karty Vima. W rzeczywistości są źle nazwani. Lepszą nazwą byłoby „rzutnia” lub „układ”, ponieważ taka jest karta - jest to inny układ okien wszystkich istniejących buforów.

Próba pokonania Vima w 1 zakładce == 1 bufor jest ćwiczeniem daremnym. Vim nie wie lub opieki i nie będą szanować go na wszystkich poleceń-zwłaszcza, cokolwiek, który wykorzystuje bufor quickfix ( :make, :grep, i :helpgrepsą te, które przychodzi na myśl), chętnie ignorują zaczepy i nic nie można zrobić, aby zatrzymać że.

Zamiast:

  • :set hidden
    Jeśli nie masz tego zestawu, zrób to. Sprawia, że ​​vim działa jak każdy inny edytor wielu plików na naszej planecie. Możesz edytować bufory, które gdzieś nie są widoczne w oknie.
  • Zastosowanie :bn, :bp, :b #, :b namei ctrl-6, aby przełączać się pomiędzy buforami. Lubię ctrl-6siebie (sam przełącza się na poprzednio używany bufor lub #ctrl-6przełącza na numer bufora #).
  • Służy :lsdo wyświetlania listy buforów lub wtyczki, takiej jak MiniBufExpl lub BufExplorer .
Zathrus
źródło
192
Dla mnie jest to błąd, a nie „błąd użytkownika”. Wyszukiwanie w Internecie „kart vim” wskazuje, że prawie wszyscy inni się z tobą nie zgadzają lub nie zdają sobie sprawy z „prawdziwego” sposobu korzystania z kart Vim. Ponadto, jeśli zakładki są tak naprawdę widokami „układu”, to dlaczego domyślnymi tytułami zakładek są bieżąca nazwa pliku? Gdybym chciał wielu widoków tego samego pliku, wszystkie tytuły moich kart miałyby tę samą nazwę (niezbyt pomocna?). Tak czy inaczej, domyślna implementacja kart w Vimie jest wadliwa.
cmcginty,
45
Co jeszcze zamierzasz pokazać w tytule karty? Pokazuje aktualną nazwę bufora (nie „nazwę pliku”). Możesz zmienić to, co wyświetla się w tytule karty.
aehlke,
46
@Casey: FWIW, kiedy po raz pierwszy wiedziałem o kartach Vima i musiałem owinąć wokół nich głowę i do czego służyły, dokładnie pomyślałem o definicji podanej przez Zathrusa. (Jestem nowicjuszem Vima). Więc nie, nie zgadzam się, że jest to taka zepsuta lub nieintuicyjna funkcja ... tym bardziej nie zgadzam się, że „o wszystkich” nie zgadza się (i myślę, że co najmniej jedna lub dwie referencje mogłyby nadać temu twierdzeniu większą wagę). Działa niesamowicie dobrze, gdy ma wiele jednoczesnych układów ekranu.
ata
17
Ten komentarz jest błędny, nie jestem pewien, dlaczego został oceniony lub zaakceptowany. Robince poniżej ma poprawną odpowiedź -: tab sball i: switchbuf są tym, czego szukasz.
Roel
38
+1 dla „Stop, stop, stop”. Vim to zarówno mentalność, jak i narzędzie. Ważne jest, aby nauczyć nowych użytkowników mentalności, aby mogli w pełni korzystać z narzędzia.
Cody Poll
273

Trochę się spóźniłem na imprezę tutaj, ale zdziwiłem się, że na tej liście nie zobaczyłem:

:tab sball - otwiera to nową kartę dla każdego otwartego bufora.

:help switchbuf- to kontroluje zachowanie przełączania buforów, spróbuj :set switchbuf=usetab,newtab. Powinno to oznaczać przejście do istniejącej karty, jeśli bufor jest otwarty, lub utworzenie nowej, jeśli nie.

robince
źródło
4
+1 dla switchbuf- set switchbuf=useopenjest wielki, aby uniknąć irytujących zachowań :make, :vimgrepi podobnych poleceń, który zmienia układ buforów w oknie, nawet jeśli bufor był już wyświetlany.
mMontu
3
dlaczego mi nie pasuje? po ustawieniu :se switchbuf=usetab,newtab, kiedy używany bndo przełączania bufora, nadal otwiera plik bufora na bieżącej karcie zamiast przełączania na istniejącą kartę? Czy jest coś nie tak?
zhiyelee
173

Vim :help windowdość dobrze wyjaśnia zamieszanie „tabulacje i bufory”.

Bufor to tekst pliku w pamięci.
Okno to rzutnia w buforze.
Strona zakładki to zbiór okien.

Otwieranie wielu plików odbywa się w vimie z buforami . W innych edytorach (np. Notepad ++) odbywa się to za pomocą kart, więc nazwa karty w vimie może być myląca.

Okna służą do dzielenia obszaru roboczego i wyświetlania wielu plików (buforów) na jednym ekranie. W innych edytorach można to osiągnąć przez otwarcie wielu okien GUI i zmianę ich rozmieszczenia na pulpicie.

Wreszcie w tej analogii strony kart vima odpowiadałyby wielu pulpitom, czyli różnym przegrupowaniom okien.

Jak help: tab-pagewyjaśnia vim , można użyć strony z zakładkami, gdy chce się tymczasowo edytować plik, ale nie chce niczego zmieniać w bieżącym układzie okien i buforów. W takim przypadku można użyć innej strony zakładki tylko w celu edycji tego konkretnego pliku.

Oczywiście musisz pamiętać, że wyświetlenie tego samego pliku na wielu stronach lub oknach kart spowodowałoby wyświetlenie tej samej kopii roboczej (bufora).

crenate
źródło
11
To jest naprawdę niesamowita odpowiedź, ale zajęło jej kilka lektur. bufory = zakładki, windows = okna GUI, zakładki strony = komputery stacjonarne mają jak dotąd najlepszy sens, że znalazłem dla kogoś, kto nie jest zaznajomiony z pojęciami
icc97
4
Zwykle myślę o nich jako o spojrzeniu przez okno do pokoju - buffer= obiekt , window= okienko i tab= okno . Mogę poruszać się po pokoju i zaglądać do niego z różnych okien ( tabs). Różne okna mogą mieć różną liczbę, rozmieszczenie i wielkość szyb . Ten sam obiekt można jednocześnie oglądać z różnych paneli w różnych oknach .
go2null
Jeśli jesteś zaznajomiony z paradygmatem Linux Workspaces i Windows, zobaczysz dziedzictwo vimużytkowania. Na początku było tylko okno . Menedżery okien pozwoliły następnie podzielić okna na panele (kafelki WM) lub na nakładające się panele (, pływające WM), ale nadal odnosiły się do każdego panelu jako okna. Teraz dodaj koncepcję obszaru roboczego, w którym panel może być wyświetlany w wielu obszarach roboczych. Zatem w tym paradygmacie buffer= aplikacja , window= okno i tab= przestrzeń robocza .
go2null
56

W przeciwieństwie do niektórych innych odpowiedzi tutaj, mówię, że możesz używać zakładek w dowolny sposób. vim został zaprojektowany tak, aby był wszechstronny i dostosowywalny, zamiast zmuszać cię do pracy zgodnie z predefiniowanymi parametrami. Wszyscy wiemy, jak nasi programiści uwielbiają narzucać naszą „etykę” wszystkim innym, więc to osiągnięcie jest z pewnością główną cechą.

<C-w>gfjest tabulatorem równoważnym gfpoleceniu buforów . <C-PageUp>i <C-PageDown>będzie przełączać się między kartami. (W Byobu te dwa polecenia nigdy nie działają dla mnie, ale działają poza Byobu / tmux. Alternatywami są gti gT.) <C-w>TPrzeniesie bieżące okno na stronę nowej karty.

Jeśli wolisz, aby vim używał istniejącej karty, jeśli to możliwe, zamiast tworzyć duplikaty, dodaj :set switchbuf=usetabdo pliku .vimrc. Możesz dodać newtabdo listy ( :set switchbuf=usetab,newtab), aby wymusić otwieranie poleceń QuickFix wyświetlających błędy kompilacji w osobnych kartach. Wolę splitzamiast tego, co otwiera błędy kompilacji w podzielonym oknie.

Jeśli masz włączoną obsługę myszy :set mouse=a, możesz wchodzić w interakcje z kartami, klikając je. +Domyślnie jest też przycisk, który utworzy nową kartę.

Aby uzyskać dokumentację dotyczącą kart, wpisz :help tab-pagew trybie normalnym. (Po wykonaniu tej czynności możesz poćwiczyć przenoszenie okna do karty za pomocą <C-w>T.) Istnieje długa lista poleceń. Niektóre polecenia okna dotyczą kart, więc możesz również zajrzeć do tej dokumentacji za pośrednictwem :help windows.

Dodanie: 19.12.2013

Aby otworzyć wiele plików w vimie z każdym plikiem na osobnej karcie, użyj vim -p file1 file2 .... Jeśli jesteś podobny do mnie i zawsze zapominasz dodać -p, możesz dodać go na końcu, ponieważ vim postępuje zgodnie z regułami analizy składni opcji wiersza poleceń. Alternatywnie możesz dodać mapowanie aliasu bash vimdo vim -p.

Zenexer
źródło
3
+1, vim -pjednak pamiętaj, że domyślnie będzie wyświetlanych tylko do 10 kart. Dodatkowe pliki są ładowane do buforów, ale nie są wyświetlane na własnej karcie.
IanB
@IanB: jak ominąć domyślne ustawienie ograniczenia do 10 kart?
0xC0000022L
3
@ 0xC0000022L patrz tabpagemaxustawienie
IanB
14

Natrafiłem na ten sam problem. Chciałem, żeby karty działały jak bufory i nigdy nie udało mi się do nich dotrzeć. Rozwiązaniem, na które ostatecznie zdecydowałem, było sprawienie, by bufory zachowywały się jak tabulatory!

Sprawdź wtyczkę o nazwie Mini Buffer Explorer , po jej zainstalowaniu i skonfigurowaniu będziesz w stanie pracować z buforami wirtualnie w ten sam sposób co karty bez utraty funkcjonalności.

Dominic Dos Santos
źródło
10

To odpowiedź dla tych, którzy nie znają Vima i pochodzą z innych edytorów tekstu (w moim przypadku Sublime Text).

Przeczytałem wszystkie te odpowiedzi i wciąż nie było jasne. Jeśli je przeczytasz, wszystko zaczyna mieć sens, ale zajęło mi to wiele godzin przechodzenia między pytaniami.

Pierwszą rzeczą jest, jak wyjaśnili inni:

Strony z kartami przypominają tabulatory , zachowują się jak tabulatory i wyglądają podobnie jak tabulatory w większości innych edytorów GUI, ale nimi nie są. Myślę, że to zły model mentalny, który został zbudowany w Vimie, który niestety zachmurza dodatkową moc, którą masz na stronie zakładki.

Pierwszy opis, który zrozumiałem, pochodzi z odpowiedzi @ crenate, że są one równoważne wielu komputerom stacjonarnym. Patrząc na to, miałbyś tylko kilka otwartych pulpitów, ale wiele okien GUI było otwartych na każdym z nich.

Powiedziałbym, że są one podobne do innych edytorów / przeglądarek:

  1. Grupowanie kart
  2. Obszary robocze Sublime Text (tj. Lista otwartych plików, które masz w projekcie)

Widząc je w ten sposób, zdajesz sobie sprawę z ich siły, że możesz łatwo grupować zestawy plików (buforów) razem, np. Pliki CSS, HTML i JS na różnych stronach kart. Co jest naprawdę niesamowite.

Inne opisy, które uważam za mylące

Rzutnia

To jest bez sensu jak dla mnie. Rzutnia, która choć ma zdefiniowany słownik , słyszałem tylko w odniesieniu do okien Vima w :help windowdokumencie. Rzutnia nie jest terminem, który słyszałem w odniesieniu do edytorów takich jak Sublime Text, Visual Studio, Atom, Notepad ++. W rzeczywistości nigdy o nim nie słyszałem, dopóki nie zacząłem używać stron z kartami.

Jeśli przeglądasz strony z zakładkami, takie jak wiele pulpitów, to określanie pulpitu jako pojedynczego okna wydaje się dziwne.

Miejsca pracy

Być może ma to większy sens, definicja słownika jest następująca:

Miejsce do przechowywania danych do użytku tymczasowego.

To jest jak miejsce, w którym przechowujesz grupę buforów.

Początkowo nie brzmiałem jak koncepcja obszaru roboczego Sublime Text, która jest listą wszystkich plików, które otworzyłeś w swoim projekcie:

plik sublime-workspace, który zawiera dane specyficzne dla użytkownika, takie jak otwarte pliki i ich modyfikacje.

Jednak myśląc o tym więcej, tak naprawdę zgadza się. Jeśli uważasz stronę karty Vima za projekt Sublime Text, to dziwne wydaje się mieć tylko jeden plik w każdym projekcie i ciągle przełączać się między projektami. Dlatego użycie strony z kartami do otwarcia tylko jednego pliku jest dziwne.

Kolekcja okien

:help windowOdnosi się do stron zakładki w ten sposób. Ponadto wiele innych odpowiedzi korzysta z tej samej koncepcji. Jednak dopóki nie zobaczysz, czym jest okno vim, nie ma to większego sensu, jak budowanie zamku na piasku.

Jak wspomniałem powyżej, okno vim jest takie samo jak okno robocze i jest doskonale wyjaśnione w tym artykule linux.com :

Naprawdę użyteczną funkcją Vima jest możliwość podzielenia widocznego obszaru na jeden lub więcej plików, lub po prostu podzielenie okna, aby łatwiej zobaczyć dwa bity tego samego pliku. Dokumentacja Vima nazywa to wymiennie rzutnią lub oknem.

Być może znasz już tę funkcję, jeśli kiedykolwiek korzystałeś z funkcji pomocy Vima, używając: tematu pomocy lub naciskając klawisz F1. Po wprowadzeniu pomocy Vim dzieli rzutnię i otwiera dokumentację pomocy w górnej rzutni, pozostawiając dokument otwarty w dolnej rzutni.

Wydaje mi się dziwne, że strona karty jest nazywana kolekcją okien zamiast kolekcji buforów. Ale myślę, że możesz mieć dwie oddzielne strony z zakładkami, każda z wieloma oknami wskazującymi ten sam bufor, przynajmniej tak rozumiem do tej pory.

icc97
źródło
1
W końcu po solidnym roku używania Vima w pełnym wymiarze czasu natknąłem się na przypadek, w którym chciałem użyć więcej niż jednej strony z zakładkami. Obecnie bufory działają dla mnie idealnie, ponieważ używałbym kart w innych edytorach. Ale mając duży monitor porównywałem całą masę 3-4 różnych buforów. Potem kolega chciał, żebym szukał jakiegoś kodu gdzie indziej w bazie kodu. Zamiast stracić zestaw okien porównawczych, mógłbym po prostu utworzyć nową stronę z kartami, która następnie pozwoli mi przeprowadzić osobne wyszukiwanie, tak jak wtedy, gdy normalnie używam Vima, a następnie mogę zamknąć stronę z kartami po zakończeniu i wrócić do mojego początkowego zestawu
icc97
4

Patrząc: zakładki pomocy nie wygląda na to, że vim chce działać tak jak ty ...

Bufory są wspólne dla różnych kart, więc nie wydaje się możliwe zablokowanie danego bufora, aby pojawiał się tylko na określonej karcie.

To jednak dobry pomysł.

Prawdopodobnie można uzyskać pożądany efekt, używając terminala obsługującego karty, takiego jak multi-gnome-terminal, a następnie uruchamiając instancje vim na każdej karcie terminala. Jednak nie idealne ...

Mike G.
źródło
Próbowałem tego, problem z tym, poza tym, że utrudnianie nawigacji między kartami, polega na tym, że szarpany tekst nie może być dzielony między kartami terminali, ponieważ są to zasadniczo dwa różne terminale / powłoki
puk
@puk: Wypróbuj wtyczkę vank YankRing. Zapisuje szarpany tekst w pliku, dzięki czemu można go udostępniać w różnych instancjach vima.
pixelastic
@Pixelastic Znalazłem tutaj odpowiednie rozwiązanie do szarpania do schowka systemowego. Ponadto Vim działa najlepiej w jednym przypadku. Przestałem robić to, co chciałem i nauczyłem się, jak prawidłowo używać vima :-) stackoverflow.com/a/8757876/654789
puk
@puk: Dzięki, nie przyszło mi do głowy, że korzystanie ze schowka systemowego oznacza także dzielenie się nim między instancjami vima :)
pixelastic
4
  • Możesz mapować polecenia, które normalnie manipulują buforami, aby manipulować tabulatorami, tak jak zrobiłem z gf w moim .vimrc:

    map gf :tabe <cfile><CR>
    

    Jestem pewien, że możesz zrobić to samo z [^

  • Nie sądzę, że vim obsługuje to dla kart (jeszcze). Używam gt i gT, aby przejść odpowiednio do następnej i poprzedniej karty. Możesz także użyć Ngt, gdzie N jest numerem zakładki. Wkurza mnie to, że domyślnie numer karty nie jest wyświetlany w wierszu karty. Aby to naprawić, umieściłem kilka funkcji na końcu mojego pliku .vimrc (nie wkleiłem tutaj, ponieważ jest długi i nie został poprawnie sformatowany).

Lucas Oman
źródło
<c-w>gfotworzy nazwę pliku pod kursorem w nowej zakładce
Peter Rincker
4

Używam buforów takich jak tabulatory, używając wtyczki BufExplorer i kilku makr:

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

Z BufExplorer nie masz paska kart u góry, ale z drugiej strony oszczędza miejsce na ekranie, a ponadto możesz mieć nieskończoną liczbę plików / buforów otwartych, a listę buforów można przeszukiwać ...

jkramer
źródło
2

Jeśli chcesz, aby bufory działały jak tabulatory, sprawdź wtyczkę tabline .

To wykorzystuje pojedyncze okno i dodaje wiersz u góry, aby symulować zakładki (po prostu pokazując listę buforów). Wyszło to dawno temu, gdy tabulatory były obsługiwane tylko w GVimie, ale nie w vimie wiersza poleceń. Ponieważ działa tylko z buforami, wszystko dobrze integruje się z resztą vima.

thien.vuong
źródło