Jak poruszać się po dużym projekcie w VIM


86

Jak zarządzasz dużymi projektami (setkami plików) używając tylko VIM?

Osobiście zaczynam mieć problemy w każdym większym niż mały projekt.

  • czy jest jakiś sposób, aby szybko „przejść do pliku”, najlepiej z uzupełnieniem nazwy?
  • to samo z „przejdź do definicji klasy”, gdy znajduje się w innym pliku

Znam wszystkie podstawy VIM, więc nie mam problemu z używaniem go do pisania skryptów lub szybkiej edycji kodu źródłowego. Ale robi mi się naprawdę bałagan, gdy muszę nawigować między plikami.


Jakiego języka używasz?
— LB40

Wolałbym rozwiązanie niezależne od języka, ale potrzebuję wsparcia dla C ++, PHP i Railsów.
— Jakub Arnold

Którą odpowiedź zaakceptowałeś? @JakubArnold

@xetrasu Skończyło się na tymNERDTree
— Jakub Arnold

Odpowiedzi:


33

VIM ma doskonałą obsługę tagów . Po utworzeniu pliku tagów dla swojego projektu możesz przejść do definicji lub deklaracji metody, klasy itp., W tym przeskakiwać między plikami, a wszystko to w ramach tej samej sesji edycji.

Próbować

:help tags

Aby wygenerować plik tagów dla C / C ++, przejdź do zachęty powłoki (zakładam, że twój system to * nix / Cygwin) i wpisz

info ctags

lub

ctags --help

2
Vim obsługuje również cscope, co pozwoli ci na takie rzeczy, jak znalezienie funkcji wywołujących daną funkcję - zobacz, :help cscopeaby uzyskać informacje. We wstępie znajduje się fajna lista funkcji (pod nagłówkiem „Ma odpowiadać na takie pytania”).
— Cascabel

1
Niestety, cscope ma bardzo ograniczone zrozumienie C ++.
— Luc Hermitte

28

Lubię proste rozwiązania, obecnie moim ulubionym sposobem nawigacji jest:

Dodać do ~/.vimrc.local

set path=$PWD/**

Następnie wpisz to w edytorze, aby znaleźć plik w dowolnym miejscu w bieżącym katalogu roboczym (pwd)

:find user_spec.rb

Możesz użyć uzupełniania tabulatorami w nazwach plików, aby znaleźć wiele opcji, dzięki czemu ta konwersja TextMate jest bardzo szczęśliwa.


1
To rozwiązanie jest znacznie prostsze niż: FC i wtyczki bo nie jest potrzebne buforowanie i ... sprawiłeś, że mój dzień jest awokatem! Dzięki!
— Srikumar

1
Vim nie czyta wd jako katalogu domyślnego. Zrestartowałem powłokę i nadal nie działa. Próbowałem też vim .przed wykonaniem polecenia: /
— Adam Grant

13

Używam kombinacji NERDTree (pasek boczny katalogu), FuzzyFinder Textmate (przejdź do pliku, jak CMD + T TextMate) i sesji (: sesje h), aby pomóc mi w radzeniu sobie z dużymi projektami.

Sugerowałbym użycie wtyczki pomocniczej dla niektórych sesji. Wspomniałbym, czego używam, ale jeszcze nie jestem z tego zadowolony. Tylko Google „sesje vimowe”.

Jedną rzeczą, na którą należy zwrócić uwagę przy uruchamianiu FuzzyFinder Textmate, jest to, że zależy to od starej wersji wtyczki FuzzyFinder, w szczególności v2.16. Cokolwiek wyższego, a otrzymasz błędy. Ale zdecydowanie warto. Chociaż nie ma uzupełniania nazw, jego wyszukiwanie jest inteligentne, więc jeśli fro/time/actionsphpgo wyszukam, wyświetli plik apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)(nawiasy wskazują, do czego pasuje). Ułatwia to wybieranie plików, które są unikalne tylko na podstawie nazwy folderu.


2
Znalazłem nową wtyczkę, która mi się bardziej podoba i jest łatwiejsza w konfiguracji (przynajmniej w moim przypadku): CommandT . O wiele szybciej.
— pączek

6
Nowsze, bardziej wydajne narzędzie, program do pisania w skrypcie vim, więc żadne zewnętrzne zależności nie są używane przez projekt janus przez ctrlp
— alexandru.topliceanu

7

Jak również bezcenne znaczniki CT i różne związane z nimi polecenia. Nie mogłem też żyć bez wtyczki projektu , która pozwala na umieszczenie interesujących Cię plików związanych z projektem w osobnym panelu. Nie pamiętam, jaka część mojej konfiguracji jest dostosowana, ale jeśli chcę otworzyć plik źródłowy o nazwie Debug.c, trafiłem:

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

Często wtedy robię:

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

Dzięki tej stosunkowo krótkiej sekwencji mogę otworzyć dowolny plik i jego nagłówek w podziale pionowym. Ponieważ okno wtyczki projektu jest tylko plikiem tekstowym, zakończenie jest osiągane przy użyciu możliwości wyszukiwania Vima.


4

Począwszy od Vim 7.3, :findpolecenie uzupełnia nazwy plików za pomocą tabulacji.

Więc jeśli można ustawić 'path'opcję, aby zawierał całego projektu (prawdopodobnie za pomocą **wieloznacznych, aby umożliwić rekurencyjnie przeszukaj podkatalogi), a następnie można użyć :find, :sfind, :tabfind, itd. Polecenia z zakończeniem dostać się do każdego pliku w projekcie. Pozwala to również na przeskakiwanie do plików bezpośrednio z gfprzyjaciółmi, jeśli nazwa pliku znajduje się w tekście, na przykład w dyrektywie include.

Dzięki tej metodzie do nawigacji do określonych plików nie są potrzebne żadne zewnętrzne narzędzia ani wtyczki. Chociaż, co prawda, może nie być tak szybki lub łatwy w użyciu i nie rozwiązuje potrzeby przeskakiwania do definicji. Do definicji używam ctagów, jak sugerują inne odpowiedzi.


3

Jeśli używasz ctagów zgodnie z zaleceniami innych plakatów, spójrz na wtyczkę taglist .

Poświęć trochę czasu na przeczytanie dokumentacji i nauczenie się skrótów klawiszowych. Oto kilka na początek (z okna TList):

  • o - otwórz plik w nowym oknie
  • t - otwórz plik w nowej karcie
  • [[lub backspace - poprzedni plik na liście
  • ]] lub tab - następny plik na liście

3

Bujne ctagi.

Użyj Ctrl-], aby przeskoczyć do znacznika pod kursorem.


2

Używam FindFile . Jeśli otworzysz Vima w katalogu głównym projektu i uruchomisz :FC .wtyczkę, będzie ona buforowała wszystkie nazwy plików pod twoim cwd. Następnie możesz :FFotworzyć menu uzupełniania i wpisać nazwę żądanego pliku (a raczej kilka pierwszych liter).


wow, to jest najłatwiejsza w użyciu wtyczka. Wymagana jest zerowa konfiguracja ... tylko FC .w katalogu głównym, a następnie :FFwprowadź, zacznij wpisywać żądaną nazwę pliku i gotowe. Ciągle próbuję wymyślić, jak uruchomić w nowych kartach…
— tester

Warto również zauważyć, że jeśli tego użyjesz, za każdym razem, gdy uruchomisz vima, będziesz musiał powtórzyć, :FC .aby buforować pliki w tym katalogu.
— tester

Oto zaktualizowana wersja FindFile.vim z :FTlub :FindTabNew gist.github.com/1104884
— tester

2

Otwieranie vimz katalogu głównego pliku źródłowego i rozszerzanie pathopcji, aby uwzględnić w nim wszystkie podkatalogi.
Na przykład set path+=/usr/include/c++/**dla nagłówków C ++ i set path+=**katalogu źródłowego.

To otwiera mnóstwo możliwości.

1) Otwieranie pliku według nazwy lub jej części

:find file_name

Możesz :findniezawodnie korzystać z automatycznego uzupełniania i rozszerzania symboli wieloznacznych . Wpisujesz nazwę, a ona zlokalizuje nazwę. To działa agnostyk językowy, jestem pewien, że ci się spodoba.

2) Nawigacja do plików znajdujących się pod cusror:
jeśli chcesz przejść do ścieżki pliku, takiej jak #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl- 6- powrót do ostatniej pozycji kursora po gflubgF

3) Wyszukiwanie API i nawigacja do lokalizacji API

[ilub [Imoże być używany do wyszukiwania podpisu funkcji pod kątem słowa pod kursorem bez opuszczania obszaru roboczego. [<Tab>faktycznie przejść do deklaracji. Użyj Ctrl-, 6aby wrócić do ostatniej lokacji.


Bez rozszerzania pathmożesz rozpocząć nawigację po plikach za pomocą :Expoleceń oraz nawigować i otwierać plik. Wolę jednak NerdTreeod tego.


1

Chociaż mam nadzieję, że ktoś wskaże lepsze rozwiązanie, abym mógł się czegoś nauczyć, NERDTree był dla mnie dobry, jeśli chodzi o dotarcie do określonych plików z uzupełnianiem nazw, o ile mam rozwinięte drzewo. Polecenie, gdy muszę dostać się do pliku, to coś takiego:

, d / foo.pyo (gdzie foo.py to nazwa pliku)

, d, aby otworzyć drzewo, / aby wejść w tryb wyszukiwania, nazwę (lub częściową nazwę, regex, lub cokolwiek) pliku, a następnie o, aby otworzyć.

Oczywiście może być konieczne kilkakrotne naciśnięcie klawisza „n”, jeśli nie wpisałeś wystarczającej ilości nazwy pliku lub są duplikaty.

Przyznaję, że przy użyciu NERDTree w ten sposób czuję się trochę jak włamanie, chociaż dotarło to już do mojej pamięci mięśniowej, że nawet o tym nie myślę.

Oczywiście używam też ctagów, ale są one przydatne tylko wtedy, gdy masz funkcję w pobliżu kursora i potrzebujesz dostać się do jej definicji w innym pliku lub czymś podobnym. Wiele razy mówię „OK, muszę teraz popracować nad funkcją x” i muszę przejść do innego pliku bez żadnych odniesień w pobliżu, w których ctagi naprawdę by pomogły.


3
Przyjrzałem się temu więcej, fuzzyfinder wygląda na świetny pomysł na wyszukiwanie projektów.
— grawitacja

1

Używam dwóch moich wtyczek:

  • searchInRuntime, który uzupełnia nazwy plików w wierszu poleceń. Jest w jakiś sposób podobny do fuzzyfindera i lookupfile,
  • tagi lh, które są całkowicie eksperymentalne i nieudokumentowane. Oferuje dwie funkcje: automatyczną i szybką aktualizację pliku znaczników przy zapisywaniu pliku oraz <c-w><m-down>domyślnie podłączony selektor znaczników . Możesz zamiast tego sprawdzić znaną wtyczkę taglist.

Oba wymagają mojej biblioteki viml lh-vim-lib.


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.