Kiedy muszę jednocześnie pracować nad różnymi projektami, mam następujący przepływ pracy:
- Tworzę jedną kartę dla każdego projektu.
- W każdej zakładce otwieram pliki, które chcę edytować, co tworzy kilka buforów.
- Opcjonalnie, jeśli chcę zobaczyć dwa (lub więcej) plików w tym samym czasie, tworzę podzielone okna, więc mam zakładkę zawierającą różne okna, które pokazują jeden bufor.
Do nawigacji między moimi buforami tak naprawdę nie używam, :ls
a :b [name or number of buffer]
zamiast tego stworzyłem wygodne mapowania, które pozwalają mi przełączać się między buforami za pomocą :bnext
i:bprevious
Ten sposób pracy jest całkiem dobry, ale coś mi przeszkadza: bufory są wspólne dla kart.
Jeśli otworzyć file1
i file2
w tab1
i file3
w tab2
razie w tab1
używam kilka razy :bnext
Zobaczę file3
w tej karcie, która nie chce. Przepływ pracy, który chciałbym uzyskać, jest następujący :
- Uruchom vim (mam pierwszą kartę z buforem):
$ vim foo
- Dodaj bufor do tej zakładki:
:e bar
- Otwórz nową kartę i przejdź do niej:
:tabnew
- Otwórz nowy bufor w tej zakładce:
:e baz
- Jeśli pozostanę w tym buforze i zrobię to
:bnext
lub:bprevious
pozostanę wbaz
buforze (ponieważ jest to jedyny w tej zakładce) - Jeśli przejdę do poprzedniej karty
:tabprevious
i wykonam kilka razy:bnext
, przełączę się tylko między buforamifoo
i,bar
ale ich nie zobaczębaz
Oto moje pytanie: czy można powiązać zestaw buforów z kartą i sprawić, że vim nie zezwoli na dostęp do niektórych buforów z innej karty niż ta, w której mają być?
Uwaga: zdaję sobie sprawę, że użycie :b [myBuffer]
byłoby sposobem na utrzymanie bufora na karcie, ale kiedy mam 3 lub 4 pliki do edycji, czuję, że jestem naprawdę szybszy przy użyciu mapowań niż wpisywanie nazwy bufora (nawet jeśli mogę wpisz tylko kilka znaków pasujących do nazwy bufora) .
alt+tab
(lub nawet gorzej myszy) jest znacznie mniej łatwe niż przełączanie tabulatora w vimie.Odpowiedzi:
Nie znalazłem żadnej wtyczki, ale możesz napisać ją samodzielnie. Musisz nauczyć się tego vimscript. Właśnie zaimplementowałem funkcję, którą możesz przełączać między buforami w zakładce (jeszcze nie usunięto). Możesz skopiować to do swojego vimrc:
Zamknij vimrc i otwórz go ponownie. Aby znaleźć następny bufor, po prostu użyj
lub zdefiniuj własne polecenie lub mapowanie. Będzie to działać, dopóki nie zamkniesz ani nie usuniesz karty ani bufora. Nie będzie również działać dla wielu buforów. Dodanie tych funkcji wymagałoby więcej pracy, ale jest to z pewnością wykonalne.
źródło
Bufory mają charakter globalny i nic nie możesz na to poradzić oprócz pisania własnej warstwy abstrakcji na stronach kart, okien i buforów. Odpowiedź philolo1 pokazuje rozsądne podejście do problemu, ale szybko znajdziesz granice takiego „rozwiązania” i będziesz musiał zduplikować wiele wbudowanych funkcji, takich jak
:bufdo
lub alternatywny plik…Z drugiej strony „argumenty” mogą być lokalne dla okna, więc mogą być bardziej przydatne w twoim przepływie pracy niż „bufory” (w najściślejszym znaczeniu tego słowa):
Argumenty nie są tak elastyczne jak bufory, ale mogą stanowić bardziej niezawodną podstawę dla twojego przepływu pracy.
Jednak praca nad każdym projektem we własnej instancji Vima jest moim zdaniem jedynym praktycznym rozwiązaniem.
źródło
Z pewnym opóźnieniem myślę, że mogłem znaleźć zadowalającą (przynajmniej dla mnie!) Odpowiedź. Będziesz potrzebował dwóch wtyczek Shougo:
oraz mapę szybkiego dostępu do użycia zamiast
:ls
, aby wyświetlić (i wybrać) tylko bufory z bieżącej karty.Na przykład coś takiego:
Możesz teraz poruszać się po liście buforów kart bieżącego (
j
,k
), wybrać jeden (CR
), anulować (q
), przejść do trybu „wprowadzania” (wstawiania), aby szybko przefiltrować wybór bufora, wpisując kilka liter, a nawet nacisnąć,Tab
aby otworzyć listę akcji dla aktualnie wybranego elementu (np. aby otworzyć bufor powyżej aktualnie aktywnego) - krótko mówiąc, działasz w sposób ogólny „Jednoczę”.(zobacz także
:h unite_default_key_mappings
i Zjednaj pomoc ogólnie).A teraz ostatnia (jeszcze opcjonalna) sztuczka. Za pomocą altercmd możesz utworzyć własne
ls
polecenie z włączoną kartą (w oparciu o powyższą funkcjonalność Unite):... i za każdym razem, gdy trafisz
:ls
, Vim faktycznie uruchomi twoje polecenie.Należy zauważyć, że również nie będą musiały
:bn
albo:bp
ponieważ bufory Tab za przeglądanie i wybór są teraz to samo polecenie.źródło
Nie mogę komentować, ponieważ moje konto jest nowe, więc przepraszam za to, ale ++++ 1 dla ctrl-space.
Zostałem sprzedany, zanim dotarłem do połowy pomocy. Ctrlspace ma następującą strukturę:
Możesz więc zapisać obszar roboczy dla każdego projektu, nad którym pracujesz, a następnie natychmiast go załadować, kiedy tylko chcesz. Oznacza to, że za każdym razem, gdy zamkniesz vima, możesz zapisać wszystkie podziały bufora i tabulatorów.
Możesz także nazwać swoje karty. Jeśli to nie wystarczy, możesz bardzo łatwo zmienić katalogi robocze i utworzyć zakładki dla katalogów, których często używasz.
Ładnie łączy się z nerdtree, jeśli go używasz (chociaż szczerze mówiąc, prawdopodobnie nie poczujesz się tak, jakbyś go potrzebował po tygodniu z ctrlspace)
Rozważ ten przypadek użycia:
Masz projekt Polega na sadzeniu drzew. Są drzewa owocowe i drzewka pieniędzy. Drzewa pieniędzy zawierają dolary i centy, a drzewa owocowe jabłka i pomarańcze.
W tym przykładzie jabłka, pomarańcze, dolary i centy to „bufory”.
Ctrlspace pozwala oddzielić jabłka i pomarańcze do jednej „zakładki”, którą można nazwać „owocem” - ta etykieta pojawi się w linii tagu u góry okna. Podobnie dolary i centy trafiają do zakładki „pieniądze”.
Przestrzeń robocza „drzewa” zapisuje całą konfigurację i umożliwia natychmiastowy dostęp do niej za każdym razem, gdy otworzysz vima.
Teraz, gdy jestem świadomy jego istnienia, naprawdę nie wyobrażam sobie programowania obiektowego w vimie bez tej wtyczki. Na wszelki wypadek oto link: https://github.com/szw/vim-ctrlspace
źródło
W końcu postanowiłem stworzyć własną wtyczkę, aby rozwiązać mój problem, jest ona dostępna na github .
Użyłem pomysłu @ philolo1 i starałem się go ukończyć. W chwili pisania tej odpowiedzi wciąż jest w toku.
EDYCJA Nie utrzymuję już wtyczki, ponieważ mój przepływ pracy ewoluował i zdałem sobie sprawę, że buforowanie wiązania na karcie powoduje więcej problemów niż rozwiązuje.
Wtyczka wiąże bufory z kartami: gdy użytkownik otworzy bufor, jest on automatycznie „zapisywany” na karcie i nie można uzyskać do niego dostępu z innej karty.
Instalacja powinna być „przyjazna dla menedżera wtyczek” (przynajmniej działa dobrze z Vim-Plug i Vundle )
Niektóre z głównych funkcji to:
:NextBuf
i:PrevBuf
zamień:bn
i,:bN
aby zachować spójny stan kart:ListBuf
pozwala wyświetlić listę buforów w podobny sposób, z:ls
wyjątkiem tego, że są one rozdzielone na zakładki, a znak pozwala użytkownikowi łatwo zobaczyć, w której zakładce jest aktualnie.:ChangeBuf
zaakceptuj numer bufora lub nazwę bufora, aby automatycznie zmienić bufor i zmienić zakładkę:CloseBuf
:CloseTab
W przypadku innych operacji użytkownik powinien mieć możliwość korzystania z wbudowanych funkcji (jak
:tabopen
,:tabnext
itp ...)Dla każdego polecenia podano pewne domyślne odwzorowania, które można łatwo wyłączyć, dodając je
let g:betterTabsVim_map_keys = 0
do swojego.vimrc
.Próbowałem także utworzyć jawny plik pomocy (
:h betterTabs.txt
): nie jest jeszcze kompletny, ale użytkownicy powinni znaleźć minimum, aby korzystać z wtyczki.Nadal mam wiele testów, aby upewnić się, że wtyczka nie zakłóci żadnego natywnego zachowania.
Wreszcie, jeśli ktoś chce pomóc, zawsze jest możliwe, usuń problemy na stronie github lub utwórz żądania ściągania.
źródło
Sprawdź tę wtyczkę. Wydaje mi się, że idealnie pasuje do twoich potrzeb. https://github.com/szw/vim-ctrlspace
źródło