Jak powiązać zestaw buforów z kartą?

14

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, :lsa :b [name or number of buffer]zamiast tego stworzyłem wygodne mapowania, które pozwalają mi przełączać się między buforami za pomocą :bnexti:bprevious

Ten sposób pracy jest całkiem dobry, ale coś mi przeszkadza: bufory są wspólne dla kart.

Jeśli otworzyć file1i file2w tab1i file3w tab2razie w tab1używam kilka razy :bnextZobaczę file3w 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 :bnextlub :bpreviouspozostanę w bazbuforze (ponieważ jest to jedyny w tej zakładce)
  • Jeśli przejdę do poprzedniej karty :tabpreviousi wykonam kilka razy :bnext, przełączę się tylko między buforami fooi, barale 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) .

statox
źródło
1
Oto stara dyskusja podkreślająca zalety i wady takiego podejścia i sugerująca coś, co dziś można by przetłumaczyć jako: wiele instancji vim (jedna na projekt / listę buforów) + tmux: vim.1045645.n5.nabble.com/...
VanLaser,
@VanLaser: Dzięki za link jest to interesująca dyskusja! Właściwie to dołączam tmux i różne instancje vima, kiedy jestem na mojej osobistej maszynie. Moje pytanie wynika z faktu, że muszę korzystać z okien w mojej pracy zawodowej i naprawdę nie podoba mi się sposób obsługi okien: używanie alt+tab(lub nawet gorzej myszy) jest znacznie mniej łatwe niż przełączanie tabulatora w vimie.
statox
1
Może vim-ctrlspace może pomóc - reklamuje się według list buforów stron; Jednak nie używam tego.
VanLaser,

Odpowiedzi:

7

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:

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

Zamknij vimrc i otwórz go ponownie. Aby znaleźć następny bufor, po prostu użyj

:call WindowBufManagerNext()

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.

philolo1
źródło
Nie znalazłem też wtyczki i liczyłem na wbudowaną funkcję, ale wydaje się, że masz rację, prawdopodobnie będę musiał to zrobić sam. Dzięki za kod, którego mogę użyć, ma bazę do opracowania pełnej wtyczki.
statox
6

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 :bufdolub 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):

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

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.

romainl
źródło
Zgadzam się z pomysłem, że używanie oddzielnych instancji vima jest lepsze, gdy mogę go używać w terminalu, jak powiedziałem w innym komentarzu, że muszę korzystać z okien na moim profesjonalnym komputerze, a przełączanie się między instancjami gvim jest kłopotem z tym systemem operacyjnym . Przyjrzę się argumentom, których nigdy wcześniej nie użyłem i może to być dobre obejście, dzięki!
statox
2

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:

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

łącz - bufory na zakładkę

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ąć, Tababy 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_mappingsi Zjednaj pomoc ogólnie).


A teraz ostatnia (jeszcze opcjonalna) sztuczka. Za pomocą altercmd możesz utworzyć własne lspolecenie z włączoną kartą (w oparciu o powyższą funkcjonalność Unite):

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

... 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 :bnalbo :bpponieważ bufory Tab za przeglądanie i wybór są teraz to samo polecenie.

VanLaser
źródło
Spróbuję też tego rozwiązania. Na razie próbuję ctrl-space wspomnianego przez VanLasera w komentarzu, co jest całkiem dobre. Zobaczę, które rozwiązanie jest najwygodniejsze. Również +1 za wtyczkę altercmd, która jest całkiem fajna!
statox
2

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ę:

workspaces --> contain tabs --> contain buffers

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

szpinak
źródło
2

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:

  • Automatycznie obsługuj wiązanie buforów (użytkownik może je otworzyć tak jak wcześniej)
  • :NextBufi :PrevBufzamień :bni, :bNaby zachować spójny stan kart
  • :ListBufpozwala wyświetlić listę buforów w podobny sposób, z :lswyją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ę
  • Zamykanie bufora odbywa się za pomocą :CloseBuf
  • Zamykanie karty odbywa się za pomocą :CloseTab

W przypadku innych operacji użytkownik powinien mieć możliwość korzystania z wbudowanych funkcji (jak :tabopen, :tabnextitp ...)

Dla każdego polecenia podano pewne domyślne odwzorowania, które można łatwo wyłączyć, dodając je let g:betterTabsVim_map_keys = 0do 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.

statox
źródło
1

Sprawdź tę wtyczkę. Wydaje mi się, że idealnie pasuje do twoich potrzeb. https://github.com/szw/vim-ctrlspace

Alex T.
źródło
Rzeczywiście VanLaser wspomniał o tym w komentarzach i na początku nie patrzyłem na to wystarczająco blisko, ale wydaje się, że jest naprawdę dobry, próbuję go od kilku dni.
statox