Jak wolisz przełączać się między buforami w Vimie?


92

Wypróbowałem MiniBufExplorer , ale zwykle kończy się na kilku oknach, które go wyświetlają lub całkowicie je zamykam. To, co chciałbym, to coś w rodzaju LustyJuggler z wyszukiwaniem przyrostowym, sposobem przełączania się między buforami w Emacsie. Na pewno istnieje taki scenariusz?

Odpowiedzi:


23

Używam wtyczki VIM Wincenta Colaiuty Command-T od kilku miesięcy. Wincent napisał części tego, które muszą być szybkie w C i muszę powiedzieć, że tak! Myślę, że jego logika dopasowywania wzorców plików jest nawet lepsza niż Command-T Textmate. Obejrzyj screencast .

Wtyczka Command-T dla VIM zapewnia niezwykle szybki, intuicyjny mechanizm otwierania plików przy minimalnej liczbie naciśnięć klawiszy. Nazywa się „Command-T”, ponieważ jest inspirowane oknem „Idź do pliku” powiązanym z Command-T w TextMate.

Pliki są wybierane przez wpisywanie znaków pojawiających się w ich ścieżkach i są porządkowane przez algorytm, który wie, że znaki pojawiające się w określonych lokalizacjach (na przykład bezpośrednio po separatorze ścieżki) powinny mieć większą wagę.

Łatwiejsze przełączanie buforów zawiera wiele przydatnych wskazówek. Zaadaptowałem następujące elementy do mojego .vimrc, które wykonuje automatyczne uzupełnianie nazwy bufora, mapuje najbardziej przydatne polecenia przełączania bufora na klawisze <Leader> i po lewej stronie wiersza głównego oraz pokazuje bieżący numer bufora w linii statusu :

"" Tab triggers buffer-name auto-completion
set wildchar=<Tab> wildmenu wildmode=full

let mapleader = ","

map <Leader>t :CommandT<Return>
map <Leader>a :bprev<Return>
map <Leader>s :bnext<Return>
map <Leader>d :bd<Return>
map <Leader>f :b 

"" Show the buffer number in the status line.
set laststatus=2 statusline=%02n:%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

Używam również MiniBufExplorer , który zapewnia zwięzłą listę każdego wymienionego bufora w jego własnej poziomej górze.


73

Kiedyś używałem kombinacji zakładek i wielu instancji gvima, zachowując grupy powiązanych plików jako zakładki w każdej instancji. Tak długo, jak nie skończyło się na zbyt wielu kartach w jednym przypadku, pasek kart pokazuje nazwę każdego edytowanego pliku na pierwszy rzut oka.

Następnie przeczytałem post Jamisa Bucka o tym, jak przeszedł z TextMate z powrotem na vim i nauczyłem się kilku świetnych sztuczek:

  • Ctrl-w si Ctrl-w v, aby podzielić bieżące okno
  • Ctrl-6, aby przełączać się między dwoma buforami w tym samym oknie.
  • niesamowity fuzzyfinder.vim, który umożliwia automatyczne uzupełnianie wyszukiwania plików w bieżącym katalogu lub w aktualnie otwartych buforach
  • Własne fuzzy_file_finder i fuzzyfinder_textmate Jamisa , które nieznacznie modyfikują sposób działania fuzzyfinder, zachowując się bardziej jak podobna funkcja w TextMate (o ile wiem, różnica polega na tym, że pasuje w dowolnym miejscu w nazwie pliku, a nie tylko od początku). Obejrzyj ten film, aby zobaczyć, jak to działa.

Teraz mam tylko jedną instancję gvim, zmaksymalizowaną i podzieloną na wiele okien, dzięki czemu mogę zobaczyć kilka plików jednocześnie. Powiązałem Ctrl-F z fuzzyfinder_textmate, więc teraz, jeśli napiszę (powiedzmy) Ctrl-F mod/usob, otworzy się app / models / user_observer.rb. Prawie nigdy więcej nie zawracam sobie głowy zakładkami.

Aktualizacja 2010/08/07

Chociaż fuzzyfinder_textmate pozostaje niesamowity, jak wskazuje Casey w komentarzach, nie jest już obsługiwany. Poza tym (i / lub fuzzyfinder.vim) działa trochę wolno i niestabilnie podczas pracy z dużymi projektami (wiele katalogów lub plików), więc szukałem alternatywy.

Na szczęście, nie wydaje się być bardzo miłą alternatywą w postaci Wincent Colaiuta „s wtyczki Command-T . Ma to bardzo podobne (jeśli nie nieco lepsze) zachowanie jak fuzzyfinder_textmate, ale jest zauważalnie szybsze; ma również fajne funkcje, takie jak możliwość otwarcia znalezionego pliku w podziale lub podziale pionowym. Dziękuję (i życzenia!) Davidowi Riversowi za wskazanie tego.


Tak, fuzzyfinder bardzo pasuje do tego, czego chcę.
Alexey Romanov

Fuzzyfinder_textmate Jamisa uzupełnia vim. To naprawdę powinno stać się podstawową funkcją!
csexton

Wygląda na to, że Jami przestał pracować nad tym projektem. Może oryginalny autor wyciągnie te funkcje? weblog.jamisbuck.org/2009/1/28/…
cmcginty

Sam, dzięki za rekwizyty, które mi dałeś (w moje urodziny!): D
David Rivers

14
Wypróbuj wtyczkę ctrlp vim ( kien.github.com/ctrlp.vim ), która implementuje fuzzyfinder, ale ma tonę bardziej przydatnych funkcji :)
Philip

33

Używam podstaw - ' :ls' + ' :bn' / ' :bp' + ' :b <part-of-name>'


8
:-) Nigdy nie myślałem, że zobaczę "simple" i "': ls' + ': bn' / ': bp' + ': b <part-of-name>'" w tym samym zdaniu.
paxdiablo

16
Pax, nadal tego nie widzę. :-)
csexton

To, plus :map <c-n> :bn<cr>i :map <c-p> :bp<cr>, ponieważ C-ni C-psą szybkie w pisaniu i umożliwiają przełączanie między buforami, jeśli naciskasz je wielokrotnie. (Nigdy nie używałem ich zgodnie z ich pierwotnym przeznaczeniem). To tak, jakby przełączać się między kartami przeglądarki za pomocą skrótu C-PgUpi C-PgDnlub dowolnego innego skrótu, jaki ma przeglądarka.
Tobia

Ctrl + N to standard dla „Nowego pliku” w większości innych edytorów, a Ctrl + P to polecenie wklejania, więc dla większości ludzi będzie to naprawdę zagmatwane. Vim-unimpaired Tima Pope'a podaje [bza poprzedni bufor i ]bnastępny bufor. Plus mnóstwo innych gadżetów, które wykorzystują koncepcję ]następnego i [poprzedniego.
icc97

31

Lubię "ctrl-w s" i "ctlr-w v", aby podzielić okno. Następnie mapuję klawisze ruchu (h, j, k, l) z wciśniętym klawiszem Ctrl, aby poruszać się między podzielonymi oknami:

" Map ctrl-movement keys to window switching
map <C-k> <C-w><Up>
map <C-j> <C-w><Down>
map <C-l> <C-w><Right>
map <C-h> <C-w><Left>

Konieczność przesuwania ręki do klawiszy strzałek jest denerwująca.

Następnie ustawiłem kartę ctlr, aby przełączać się między buforami w bieżącym oknie (podobnie jak wiele innych środowisk):

" Switch to alternate file
map <C-Tab> :bnext<cr>
map <C-S-Tab> :bprevious<cr>

Działały one dla mnie całkiem nieźle przez ostatnie kilka lat, chociaż vim zawsze ma więcej sekretów, niż możesz wiedzieć.


3
Twój komentarz "przełącz na plik alternatywny" jest mylący, ponieważ Vim ma już plik alternatywny, jest to poprzedni plik, na którym byłeś i możesz łatwo przełączać bieżące (%) i alternatywne (#) pliki za pomocą ctrl-6.
graywh

10
Ponadto <Cw> z hjkl przełączy okna - klawisze strzałek nie są wymagane.
graywh

4
<CS-Tab> prosi o RSI. Zmapowałem <SJ> do :bpi <SK> do:bn
puk

3
Zmiana odwzorowania <SJ> wydaje się złym wyborem w normalnym trybie, ponieważ jest to powszechnie używane (do łączenia wierszy).
Michael Percy,

18
nmap <Leader>bb :ls<CR>:buffer<Space>

i nikt nie wspomniał o fajnej wtyczce ctrlp.vim . Za pomocą tej wtyczki możesz przeszukiwać bufor według nazwy.


Podoba mi się to mapowanie! Inteligentne i elastyczne.
ivan


5
imap <A-1> <Esc>:tabn 1<CR>i
imap <A-2> <Esc>:tabn 2<CR>i
imap <A-3> <Esc>:tabn 3<CR>i
imap <A-4> <Esc>:tabn 4<CR>i
imap <A-5> <Esc>:tabn 5<CR>i
imap <A-6> <Esc>:tabn 6<CR>i
imap <A-7> <Esc>:tabn 7<CR>i
imap <A-8> <Esc>:tabn 8<CR>i
imap <A-9> <Esc>:tabn 9<CR>i

map <A-1> :tabn 1<CR>
map <A-2> :tabn 2<CR>
map <A-3> :tabn 3<CR>
map <A-4> :tabn 4<CR>
map <A-5> :tabn 5<CR>
map <A-6> :tabn 6<CR>
map <A-7> :tabn 7<CR>
map <A-8> :tabn 8<CR>
map <A-9> :tabn 9<CR>

1
Najciekawsze w Vimie jest to, że możesz się czegoś nauczyć każdego dnia!
Luc M

Pytanie dotyczy buforów , a nie zakładek ... ale możesz :tab sballnajpierw lub zamiast używać :tabnpowinieneś użyć:buffer
pera

5

Ostatnio poszedłem bardziej minimalistycznie.

Aby cyklicznie korzystać z buforów ]bi [bod nieuszkodzonych: https://github.com/tpope/vim-unimpaired

Aby przeskoczyć bezpośrednio do otwartego bufora, po prostu użyj uzupełniania tabulatorów Vima z :b . Kilka liter wystarczy, aby dostać się do dowolnego otwartego bufora z jedną lub dwiema zakładkami.

Podobnie jak w przypadku otwartych buforów, których używam :e ze ścieżkami względnymi i zakończeniem tabulacji.

Ja też używam :lsCzasami aby zobaczyć, jakie bufory mam otwarte (i sprawdzić ich zmodyfikowany stan).

Aby pozbyć się bufora, używam go :bwdo czyszczenia bufora. Zwykle jednak robię tymczasowy podział i zmieniam bufory, aby zachować mój układ:bw również zamyka aktywne okno.

Wszystkie rzeczy, które wypróbowałem w minibufie, po prostu mnie irytowały i nie chcę, aby jakaś inteligentna rzecz otwierała dla mnie losowe pliki. Jeśli naprawdę potrzebuję czegoś poszukać, używam NERDtree ( :e .).

IDK, Ostatnio też porzuciłem Yankring (bo się schrzanił xp) i zacząłem używać rejestrów, a ostatnio zdecydowałem, że f/ truchy to najlepsza rzecz na świecie ...


To wszystko jest świetna rada. Mapowałem <leader>lldo :ls. Bardzo przydatne jest również upewnienie się, że masz set wildmenuw swoim, .vimrcponieważ wtedy otrzymasz małe menu, które zawiera wszystkie alternatywy dla:b
icc97

2

Doskonały Eksplorator bufora , be stał się tak silną pamięcią mięśniową, że chciałbym użyć go w innych aplikacjach. Uważam, że jest niezwykle szybki podczas aktywnego edytowania więcej niż dwóch plików.


2

Spędziłem sporo czasu na budowaniu mojego .vimrc do pracy z tym projektem HTML :: Mason, nad którym pracuję od czterech lat, więc mam dziwną mieszankę zakładek i podzielonych okien. Dla przyjemności oglądania:

map ;o :Sex <CR>
map <C-J> <C-W>j
map <C-K> <C-W>k
map <C-l> <C-W>l
map <C-h> <C-W>h
map ;] :tabnext<CR>
map ;[ :tabprev<CR>
map <C-t> :tabe +"browse ."<CR>
map <C-O> :NERDTreeToggle ~/curr/trunk/<CR>

2

Używam tselectbuffer . Jest naprawdę szybki iw przeciwieństwie do bufexplorer nie zajmuje miejsca w oknie. Ma również wyszukiwanie przyrostowe, próbowałem minibufexplorer i nawigacja w buforze była dla mnie trochę trudna.


Dzięki za wskaźnik, teraz używam obu. Wartości domyślne dla BufExplorer są ,be, ,bs, ,bv, więc odwzorowywane TSelectBuffer do ,bb.
Brady Trainor

2

Aby wyświetlić listę i przełączać się między buforami, których używam:

nnoremap <Leader>l :ls<CR>:b<space>

Aby przełączać się między buforami:

map <Leader>n :bn<CR>
map <Leader>p :bp<CR>

2

Zamapowałem <S-J>i <S-K>do :bpi :bnchociaż przyznaję, że nie używam go, ponieważ liczba plików jest większa niż 10. Następnie zmapowałem <C-J>i <C-K>na poprzednie i następne zakładki Gnome Terminal i zwykle uruchamiam 4 instancje vim dla każdego z 4 różne projekty, nad którymi pracuję. Nadal bardzo chciałbym, żeby następny i poprzedni bufor przeszedł do historii buforów, nad którymi pracowałem, a nie do kolejności na liście buforów.


2

Używam tselectbuffer. Jest naprawdę szybki iw przeciwieństwie do bufexplorer nie zajmuje miejsca w oknie. Ma również wyszukiwanie przyrostowe, próbowałem minibufexplorer i nawigacja w buforze była dla mnie trochę trudna.


0

używam prostych: vsplit z ^ W + w / ^ W + r i: tabnew z kombinacjami klawiszy Ctrl + Alt + PgUp / PgDown.


1
Muszę się zgodzić z tym, co powiedział tutaj Zathrus . Zakładki w Vimie (lub w Emacs z TabBar) po prostu nie działają tak jak w zwykłych interfejsach z zakładkami.
Alexey Romanov

0

Kiedy w sesji Vima jest otwartych kilka buforów, śledzenie buforów i odpowiadających im numerów buforów może być trudne. W takim przypadku przejście do innego pliku można ułatwić za pomocą prostej mapy:

: nnoremap (F5): bufory (CR): bufor (spacja)

vim.wikia.com

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.