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.