Jak przejść do wywołania funkcji?

14

Po wygenerowaniu pliku znaczników za pomocą exuberant-ctagsmogę przejść z wywołania funkcji do jego deklaracji, <C-]>co jest dość wygodne.

Moje pytanie brzmi: jak to zrobić w inny sposób? Kiedy kursor znajduje się na definicji funkcji, jak mogę przejść do linii, w których funkcja jest wywoływana?

Kiedy patrzę na plik wygenerowany przez ctags, widzę tylko informacje związane z lokalizacją definicji, a nie wywołań, czy to oznacza, że ​​nie mogę tego zrobić, że Vim jest sprytnym obejściem lub że muszę coś użyć inaczej niż exuberant-ctags?

statox
źródło
Ack lub Ag również będą działały i można łatwo znaleźć opakowania wtyczek dla tych narzędzi wiersza poleceń. Np. Github.com/mileszs/ack.vim i github.com/rking/ag.vim
dash-tom-bang

Odpowiedzi:

11

Nie można przejść do wywołań funkcji za pomocą ctags. W przypadku C / C ++ i Java istnieje cscopei ładnie integruje się z Vimem (patrz :help cscope). W przypadku innych języków może być możliwe znalezienie narzędzia, które generuje / eksportuje cscopebazy danych kompatybilne ( hscopedla Haskell oraz starscopedla Ruby, Go i JavaScript). Można również skorzystać cscopez GNU światowych baz danych, wskazując cscopeprgna gtags-cscope.

Na marginesie: jeśli nie zniechęca Cię czasem zagadkowe użycie języka Engrish ;;) prawdopodobnie prawdopodobnie zamiast tego używasz uniwersalnych tagówexuberant-ctags . Ten ostatni nie był aktualizowany od lat. Ten pierwszy jest aktywnie utrzymywanym widelcem.

Sato Katsura
źródło
Czy cscope obsługuje inne języki niż C / C ++ i Java?
edi9999,
@ edi9999 cscopesam obsługuje C / C ++, Lex i Yacc. Wsparcie dla Java jest marginalnie przydatne. Możesz uzyskać wsparcie dla (starego stylu) PHP i JavaScript z GNU global, za pomocą gtags-cscopenarzędzia. I, jak powiedziałem powyżej, istnieją inne indeksatory, które mogą eksportować cscopebazy danych kompatybilne.
Sato Katsura,
8

Nie możesz tego zrobić z ctags.

Wypróbuj ostrzejszą alternatywę, taką jak cscope (która ma nawet własną sekcję pomocy :):help cscope lub globalną .

romainl
źródło
Czy cscope obsługuje inne języki niż C / C ++ i Java?
edi9999,
Tak, przynajmniej PHP i JavaScript.
romainl
1
@romainl Nope, cscopesam nie obsługuje ani PHP, ani JavaScript. Możesz jednak indeksować pliki PHP i JavaScript za pomocą GNU global, a następnie uruchomić, gtags-cscopeaby użyć gtagspliku wynikowego z cscope.
Sato Katsura,
@SatoKatsura, tak, cscope obsługuje JavaScript (i CSS, podobno).
romainl
2
@romainl Należy rozważyć patrząc na cscope„s źródeł zamiast spekulować na podstawie szybkich eksperymentów. cscopema raczej zrelaksowany parser C. To wszystko, co ma i wszystko, co robi. Dzięki temu parserowi „obsługuje” wiele języków, dla odpowiednich wartości „wsparcia”. Konstrukty są rozpoznawane, dopóki wyglądają mniej więcej tak, jak C. Dlatego klasy Fi Java i nowsze konstrukcje PHP nie są rozpoznawane. Porównaj fi z gwiezdnym lunetą , który faktycznie pozwala dodawać nowe języki.
Sato Katsura
8

Możesz użyć polecenia grep Vima, aby przeszukać wszystkie pliki w swoim projekcie:

:grep! "\<<cword>\>" . -r
:copen

Umieśćmy to w kluczu:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Uważam, że to jedno kluczowe wyszukiwanie w całym projekcie jest bezcenne, gdy badam dużą, nieznaną bazę kodów.

\<i \>są sekwencjami regularnymi, które wskazują początek i koniec słowa, więc nie otrzymasz częściowych dopasowań. ( -wOpcja grep może być innym sposobem na osiągnięcie tego.)

Jest to jednak wyszukiwanie nieinteligentne , więc może dawać wyniki fałszywie dodatnie, jeśli to samo słowo pojawia się w niepowiązanych kontekstach.


Prawdę mówiąc, zamiast tego używam własnej zmodyfikowanej wersji wtyczki grep.vim . Jest to nieco łatwiejsze w użyciu:

  • Pozwala edytować wzorzec wyszukiwania, a także wiersz poleceń grep (dzięki czemu można kierować na określone foldery, takie jak src/ lib/zamiast .) i zapamiętuje zmiany.
  • Dodałem wsparcie dla Google csearch . Może to być znacznie szybsze niż grep, ponieważ tworzy indeks słów zamiast skanować każdy plik za każdym razem. W szczególności csearch używa nieco innego standardu wyrażenia regularnego, więc \bnależy go używać zamiast \<i \>.

Konfiguruję go i wykluczam niektóre standardowe pliki takie jak ten .

Aby uzyskać szybki dostęp, tworzę dwa skróty klawiszowe . F3pozwala mi edytować wiersz poleceń, F4używa wcześniej skonfigurowanego wiersza poleceń bez dodatkowych naciśnięć klawiszy. Mechanizm jest dość brzydki i przydałby się porządek, ale dobrze mi służył.

joeytwiddle
źródło