vim, szybkie przełączanie między plikami za pomocą vanilla Vim (bez wtyczek)

103

Rozumiem, że ograniczenie się do waniliowego Vima (nie używającego wtyczek) ogranicza możliwości edytora, ale ponieważ często przełączam się między różnymi maszynami, często przenoszenie mojego środowiska wszędzie jest zbyt trudne. Chcę po prostu zostać w waniliowym Vimie.

Coś, co mnie powstrzymuje, to możliwość szybkiego przełączania się między plikami. I (wierzcie przynajmniej) mają dobre zrozumienie buforów , okien , zakładek , a także netrw ( Vex, Exitp).

Ale w edytorze, takim jak Sublime Text , mogę po prostu pisać ctrl- pi od razu znajduję się w pliku.

Wiem, że mogę zejść do powłoki, ale zastanawiam się, czy są jakieś inne „ukryte” sekrety szybkiego przełączania się między plikami w Vimie w oparciu o coś więcej niż tylko nazwę pliku.

Jonathan Brink
źródło
2
To nie jest odpowiedzią na Twoje pytanie, ale może skłonić Cię do rozważenia użycia wtyczek: dudarev.com/blog/keep-vim-settings-and-plugins-in-git-repo
ajwood
Osobiście synchronizuję swoje ustawienia z Dropbox. Jest niezgrabny, ale działa mniej więcej bez zastanawiania się. Jedyną wtyczką, której używam i wiem, że działa dobrze do tego, czego chcesz, jest Command-T ( github.com/wincent/Command-T ). Alternatywą może być Ctrl-P ( vim.org/scripts/script.php?script_id=3736 ).
FX
1
Czy widziałeś danielmiessler.com/study/vim ? Ma bardzo sprytną praktykę umieszczania swojego vimrc + wszystkich potrzebnych wtyczek na Github ... anmyw, gdzie idzie, może go sklonować i voila, Vim jest dokładnie taki, jak lubi. Genialny
bobox
6
@bobox, robią to dziesiątki tysięcy ludzi; nie ma w tym nic nadzwyczajnego.
romainl

Odpowiedzi:

236

Najbliższym odpowiednikiem („najbliższym”, a nie „dokładnym”) Ctrl+ ST2 Pjest wtyczka o nazwie, przygotuj się… CtrlP . Istnieją inne podobne wtyczki, takie jak Command-T lub FuzzyFinder .

Używam CtrlP i uwielbiam to, ale z całego serca popieram Twoją decyzję o przejściu na „brak wtyczek”. Nie jest to najłatwiejsza droga, ale na dłuższą metę się opłaci.


Otwieranie plików

Najbardziej podstawowym sposobem otwarcia pliku jest :e /path/to/filename. Na szczęście otrzymujesz uzupełnianie tabulatorów i symbole wieloznaczne: klasyczne *i specjalne **, co oznacza „dowolny podkatalog”.

Łącząc to wszystko, możesz:

:e **/*foo<Tab>

wybrać spośród wszystkich plików zawierających foow swojej nazwie w katalogu roboczym lub:

:e **/*foo/*bar<Tab>

aby wybrać spośród wszystkich plików zawierających barich nazwę w dowolnym podkatalogu zawierającym foojego nazwę, w dowolnym miejscu w katalogu roboczym.

Oczywiście, że pracuje dla :tabe[dit], :sp[lit]a :vs[plit]także.

Te polecenia są jednak ograniczone do jednego pliku. Służy :nextdo otwierania wielu plików:

:next **/*.js

i spójrz na :help arglist.


Skakanie między zderzakami

:b[uffer] jest podstawowym poleceniem przełączania bufora:

:b4         " switch to buffer number 4
:bn         " switch to next buffer in the buffer list
:bp         " switch to previous buffer in the buffer list
:bf         " switch to first buffer in the buffer list
:bl         " switch to last buffer in the buffer list
:b foo<Tab> " switch by buffer name with tab-completion
:b#         " switch to the alternate file

Zauważ, że wiele z tych poleceń i ich krewnych akceptuje liczbę.

Na :lspolecenie pokazuje listę załadowanych bufory. Jest to jednak trochę „specjalne”: bufory mają przypisany numer podczas ich tworzenia, więc możesz mieć listę, która wygląda jak 1 2 5po usunięciu buforów. Jest to trochę niezręczne, tak, i to sprawia, że ​​przełączanie się na bufor według jego numeru jest nieco zbyt kłopotliwe. Wolę przełączania przez częściowe nazwy, :b foo<Tab>lub na rowerze, :bn :bp.

W każdym razie, tutaj jest fajne mapowanie, które wyświetla wszystkie załadowane bufory i wypełnia monit, czekając, aż wpiszesz numer bufora i naciśnij <enter>:

nnoremap gb :ls<CR>:b<Space>

Dzięki temu mapowaniu przejście do innego bufora jest tak proste, jak:

gb
(quickly scanning the list)
3<CR>

lub:

gb
(quickly scanning the list)
foo<tab><CR>

Pomysł pochodzi z tego obrazu zaczerpniętego z kolekcji infografik Vima Bairui :

Latanie a jazda na rowerze

Vim ma również <C-^>(lub <C-6>na niektórych klawiaturach) - odpowiednik trybu normalnego :b#- przeskakiwanie między bieżącym a poprzednim buforem. Użyj go, jeśli często przełączasz się między dwoma buforami.

Przeczytaj wszystko o buforach w :help buffers.


Przejdź do deklaracji

W pliku możesz użyć gdlub gD.

W projekcie funkcja „tagów” ​​Vima jest twoim przyjacielem, ale będziesz potrzebować zewnętrznego indeksatora kodu, takiego jak ctags lub cscope. Najbardziej podstawowe polecenia to :tag fooi <C-]>z kursorem na nazwie metody. Oba narzędzia są dobrze zintegrowane Vima: patrz :help tags, :help ctagsi :help cscope.

Z tego co warto, intensywnie korzystam z nawigacji po tagach do poruszania się w projekcie (głównie używając CtrlP :CtrlPTagi :CtrlPBufTagpoleceń, ale też wbudowanych), a moją ulubioną „ogólną” metodą przełączania buforów jest nazwa.


Wdrażam plik config

Wielu użytkowników Vima poddaje swoją konfigurację kontroli wersji, co sprawia, że instalacja własnej konfiguracji na nowej maszynie jest bardzo szybka i łatwa. Pomyśl o tym.


EDYTOWAĆ

Kilka miesięcy temu musiałem pracować na zdalnym komputerze z przestarzałym Vimem. Mogłem zainstalować odpowiedniego Vima i sklonować swoją ukochaną konfigurację, ale tym razem zdecydowałem się podróżować lekko, aby „wyostrzyć piłę”. Szybko zbudowałem minimalistyczny .vimrci ponownie odwiedziłem kilka na wpół zapomnianych natywnych funkcji. Po tym koncercie zdecydowałem, że CtrlP nie jest tak konieczne i pozbyłem się go: natywne funkcje i niestandardowe mapowania nie są tak atrakcyjne, ale wykonują zadanie bez większych zależności.


Żonglowanie plikami

set path=.,**
nnoremap <leader>f :find *
nnoremap <leader>s :sfind *
nnoremap <leader>v :vert sfind *
nnoremap <leader>t :tabfind *

:findjest naprawdę świetnym poleceniem, gdy tylko będziesz set pathpoprawnie. Z moimi ustawieniami, ,ffoo<Tab>znajdzie foorekursywnie wszystkie pliki zawierające w bieżącym katalogu. Jest szybki, intuicyjny i lekki. Oczywiście korzystam z tego samego ukończenia i symboli wieloznacznych, co z :editprzyjaciółmi.

Aby proces był jeszcze szybszy, poniższe mapowania pozwalają mi na pominięcie całej części projektu i rekurencyjne wyszukiwanie plików w katalogu bieżącego pliku:

nnoremap <leader>F :find <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>S :sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>V :vert sfind <C-R>=expand('%:h').'/*'<CR>
nnoremap <leader>T :tabfind <C-R>=expand('%:h').'/*'<CR>

OSTRZEŻENIE! Ta pathopcja jest niezwykle potężna. Powyższa wartość - - .,**działa dla mnie, ale języki, których używam, nie mają standardowej biblioteki. Prawidłowa wartość zależy wyłącznie od Twoich potrzeb.


Żonglowanie buforami

set wildcharm=<C-z>
nnoremap <leader>b :buffer <C-z><S-Tab>
nnoremap <leader>B :sbuffer <C-z><S-Tab>

Powyższe mapowania zawierają listę dostępnych buforów w „dzikim menu” z pustym znakiem zachęty, co pozwala mi albo poruszać się po menu, <Tab>albo wpisać kilka liter i <Tab>ponownie zawęzić listę. Podobnie jak w przypadku powyższych mapowań plików, proces jest szybki i prawie bezproblemowy.

nnoremap <PageUp>   :bprevious<CR>
nnoremap <PageDown> :bnext<CR>

Te odwzorowania mówią same za siebie.


Żonglerka tagami

nnoremap <leader>j :tjump /

To odwzorowanie wykorzystuje wyszukiwanie regex zamiast wyszukiwania całych słów, więc mogę ,jba<Tab>znaleźć tag foobarbaz().

Tak, dopasowywanie rozmyte uzależnia, ale bez niego możesz być równie produktywny. I za ułamek ceny.


WIĘCEJ EDYTUJ

Kilka dodatkowych porad / wskazówek…


Opcje Wildmenu

„Dzikie menu”, włączone za pomocą set wildmenu, ułatwia nawigację po plikach / buforach . Jego zachowanie zależy od kilku opcji, które warto zbadać:

wildmode mówi Vimowi, jak chcesz, aby zachowywało się "wildmenu":

set wildmode=list:full

wildignore odfiltrowuje wszystkie cruft:

set wildignore=*.swp,*.bak
set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
set wildignore+=tags
set wildignore+=*.tar.*

wildignorecaseumożliwia wyszukiwanie fooi znajdowanie Foo:

set wildignorecase

Ślady pilników

augroup VIMRC
  autocmd!

  autocmd BufLeave *.css  normal! mC
  autocmd BufLeave *.html normal! mH
  autocmd BufLeave *.js   normal! mJ
  autocmd BufLeave *.php  normal! mP
augroup END

Niedawno znalazłem ten klejnot u kogoś innego ~/.vimrc. Tworzy znacznik pliku w dokładnym położeniu kursora za każdym razem, gdy opuszczasz bufor, dzięki czemu, gdziekolwiek jesteś, 'Jprzeskakuje do ostatniego edytowanego buforu JavaScript. Niesamowite.

romainl
źródło
2
+1. Nie miałem pojęcia o „dowolnym podkatalogu” w połączeniu z, :eale od teraz będę go często używać . Podziwiam pracę, która dostała się do Ctrl-P i mogę się z niej wiele nauczyć, ale to nie zadziałało dla mnie. Okazało się, że jest trochę powolny i jako taki przerywa mój tok myślenia podczas pracy (może to być mój system, moje ustawienia, ja, ale nie badałem)
Lieven Keersmaekers
2
**jest naprawdę świetny.
romainl
1
Chciałbym ponownie zagłosować za gbmapą. Kolejny, którego będę używał dużo. Wszystkie wtyczki bufora, które wypróbowałem (CtrlP, bufExplorer, ...) nie są tak szybkie jak ta ( oczywiście, oferują większą funkcjonalność, ale nie wystarczają, abym mógł ich używać) .
Lieven Keersmaekers
2
@LievenKeersmaekers, to gdzie mam go od i to jest, gdy głupi obraz pochodzi. Dzięki Bairui!
romainl
4
To może być najlepsza odpowiedź w historii.
craigp,
5

Odpowiedź w dużej mierze zależy od twoich preferencji i okoliczności. Kilka przykładów:

  • Jeśli są to głównie dwa pliki (np. Nagłówek C i plik implementacji), <C-^>jest to bardzo przydatne. Ogólnie rzecz biorąc, plik alternatywny to ważna koncepcja.
  • Jeśli używasz dużego okna edytora, okno :splitrozwiązuje problem ze zlokalizowaniem bufora zamiast zlokalizowania okna (po otwarciu wszystkich buforów). Możesz użyć, [N]<C-w><C-w>aby szybko się do niego przełączyć.
  • Jeśli potrafisz zapamiętać (kilka) numerów buforów, polecenia :[N]b[uffer]i :[N]sb[uffer]są całkiem przydatne; :lspodaje liczby.

Wtyczki (lub przynajmniej niestandardowe mapowania) mogą wiele poprawić, a na vim.org jest cała różnorodność na ten temat . Istnieją różne mechanizmy dystrybucji konfiguracji (Pathogen + GitHub, Dropbox, ...) lub możesz zdalnie edytować pliki serwera za pośrednictwem wtyczki netrw dostarczanej z Vimem.

Ingo Karkat
źródło
4
Prawdopodobnie warto wspomnieć o ctagach, cscope, gtags, id i znajomych. Uważam, że używanie wielkich liter jest bardzo pomocne. Użyj, mAaby zapisać znak Ai `` A '', aby powrócić. Uważam, że netrw jest znacznie bardziej przydatne, gdy dowiedziałem się, :Rexktóry powrót do Explorera. :b, :ei wiele innych może używać symboli wieloznacznych, takich jak *i **. :bPolecenie może wziąć częściową nazwę pliku. Połącz to z <c-d>lub z dzikim menu, do którego możesz zajść całkiem daleko. Jeśli chodzi o wtyczki, możesz użyć czegoś specyficznego dla domeny, na przykład rail.vim, który zapewnia polecenia nawigacyjne specyficzne dla railsów lub czegoś bardziej ogólnego, jak CtrlP.
Peter Rincker
@PeterRincker: +1 za wzmiankę o znakach. Proponuję skonstruować odpowiedź z ocenami.
Helbreder
Co oznaczają <C - ^> i [N] <Cw> <Cw>?
Josh Desmond,
5

Czasami przydatne jest również sekwencyjne przeglądanie listy plików (np. Jeśli zrobiłeś coś takiego, jak vim *.phpotwieranie kilku plików jednocześnie). Następnie można użyć :n[ext](jak również :prev[ious], :fir[st]i :la[st]) do nawigacji (oprócz tego, co zostało zaproponowane w innych odpowiedzi).

chris
źródło
4

Możesz wykonać znak wieloznaczny w wierszu poleceń bez żadnych wtyczek. na przykład

:e src/**/foo*<tab>

pozwoli ci przejść przez wszystkie pliki zaczynające się od „foo” w drzewie katalogów pod ./src i wybrać ten, który chcesz edytować.

Jeśli już edytowałeś plik i nadal znajduje się w buforze, możesz się do niego przełączyć za pomocą:

:b foo<tab>

który przejdzie przez wszystkie bufory z „foo” w ścieżce. Może być konieczne ustawienie opcji wildmode i wildmenu, aby uzyskać pożądane zachowanie. mam

wildmode=longest:full
wildmenu

w moim .vimrc.

Dave Kirby
źródło
2

Jeśli jesteś na nazwie pliku i chcesz przejść do tego pliku, gfzrobi to za Ciebie. Lubię też używać ctags , które nie są wtyczką; po prostu budujesz tagi i możesz łatwo przeskakiwać po swojej bazie kodu.

gpojd
źródło
1

Jeśli chcesz przełączać się między plikami w edytorze vim, zobacz poniższą odpowiedź

Najpierw naciśnij Escklawisz, aby wyjść z trybu edycji.

Następnie wpisz, :eaby sprawdzić bieżącą ścieżkę pliku.

jeśli chcesz przejść do innego pliku, wpisz :e /path-of-file.txt/używając tego, który możesz przełączyć.

Jeśli chcesz przejść do poprzedniego pliku, po prostu wpisz, :e#który przełączy się na poprzednią ścieżkę pliku.

Amol Udage
źródło
0

Miałem ten sam problem z Vimem.

Ostatnią rzeczą, której chcę, jest poleganie na wtyczkach w zadaniu tak przyziemnym, jak przełączanie plików.

Dodałem następujące wiersze do .vimrc

set path+=**
set wildmenu

I BAM! Mogę teraz, :find any/filename/in/any/folder/o ile vim znajduje się w katalogu głównym projektu. Uzupełnianie zakładek działa. Symbole wieloznaczne działają!

Gdy pliki są już otwarte, aw tle znajduje się mnóstwo buforów (możesz użyć :lsdo wyświetlenia wszystkich buforów), uruchomienie :b any/file <TAB>spowoduje rozmyte wyszukiwanie wszystkich buforów i przeskoczy do wymaganego pliku. W przypadku, gdy nie jest unikalny, pojawi się dzikie menu zakładek (stąd druga linia w .vimrc), które można wybrać za pomocą tabulatora.

Moja odpowiedź pochodzi z tego niesamowitego filmu
https://www.youtube.com/watch?v=XA2WjJbmmoM&feature=youtu.be&t=489
Jest więcej sztuczek i polecam go obejrzeć.

Tak h
źródło