Jak mogę przejść do definicji funkcji za pomocą vima? Na przykład za pomocą Visual Assist mogę wpisać Alt+ gpod funkcją i otworzy to menu kontekstowe z listą plików z definicjami.
Jak mogę zrobić coś takiego w vimie?
Jak mogę przejść do definicji funkcji za pomocą vima? Na przykład za pomocą Visual Assist mogę wpisać Alt+ gpod funkcją i otworzy to menu kontekstowe z listą plików z definicjami.
Jak mogę zrobić coś takiego w vimie?
Odpowiedzi:
Użyj tagów. Wygeneruj plik znaczników i powiedz vimowi, gdzie używa komendy: tags. Następnie możesz po prostu przejść do definicji funkcji, używając Ctrl-]
W tym pytaniu jest więcej sztuczek i wskazówek dotyczących tagów .
Jeśli wszystko jest zawarte w jednym pliku, istnieje polecenie gd
(jak w „definicji goto”), które zabierze Cię do pierwszego wystąpienia w pliku słowa pod kursorem, którym często jest definicja.
/
/
jest prawie zawsze nieprecyzyjne, ponieważ będzie pasować do wszystkich okazji. Dowiedziałem się, że faktycznie możesz zrobić, :tag <function_name>
aby przejść do definicji za pomocą ctags.
g* wykonuje przyzwoitą pracę bez ustawiania tagów.
Oznacza to, że typ g, *(lub po prostu *- patrz poniżej), aby wyszukać słowo pod kursorem (w tym przypadku nazwa funkcji). Następnie naciśnij, naby przejść do następnego (lub Shift- w nprzypadku poprzedniego) wystąpienia.
Nie przeskakuje bezpośrednio do definicji, biorąc pod uwagę, że to polecenie po prostu wyszukuje słowo pod kursorem, ale jeśli nie chcesz obecnie zajmować się konfigurowaniem tagów, możesz przynajmniej uratować się przed koniecznością ponownego -wpisz nazwę funkcji, aby wyszukać jej definicję.
--Edycja-- Chociaż od dawna używam g *, niedawno odkryłem dwa skróty do tych skrótów!
(a) *przejdzie do następnego wystąpienia słowa pod kursorem. (Nie trzeba wpisywać g
komendy „goto” w vi).
(b) #przechodzi do poprzedniego zdarzenia w podobny sposób.
N i n nadal działają, ale „#” jest często bardzo przydatne, aby rozpocząć wyszukiwanie początkowo w odwrotnym kierunku, na przykład podczas szukania deklaracji zmiennej pod kursorem.
*
i g*
to granice słów podczas wyszukiwania. *
wykonuje \<keyword\>
wyszukiwanie (tak jak \bkeyword\b
w regularnym wyrażeniu regularnym), podczas g*
wyszukiwania keyword
bez granic słów.
*
zajmie Ci średnio 50 trafień, zanim znajdziesz definicję.
Jak wspomniał Paul Tomblin, musisz używać tagów . Możesz również rozważyć użycie wtyczek do wyboru odpowiedniej lub podglądu definicji funkcji pod kursorem. Bez wtyczek będziesz miał problem z wybraniem jednej z setek przeciążonych metod „doAction”, ponieważ wbudowana obsługa ctags nie uwzględnia kontekstu - tylko nazwę.
Możesz także użyć cscope i jego funkcji „znajdź globalny symbol”. Ale twój vim musi zostać skompilowany z obsługą + cscope, która nie jest domyślną opcją kompilacji.
Jeśli wiesz, że funkcja jest zdefiniowana w bieżącym pliku, możesz użyć klawiszy „gD” w trybie normalnym, aby przejść do definicji symbolu pod kursorem.
Oto najczęściej pobierana wtyczka do nawigacji
http://www.vim.org/scripts/script.php?script_id=273
Oto jeden, który napisałem, aby wybrać kontekst, przechodząc do znacznika
http://www.vim.org/scripts/script.php?script_id=2507
Detailed description
sekcji #2507
skryptu jest uszkodzony. Czy możesz podać inny?
Inną popularną techniką jest umieszczanie nazwy funkcji w pierwszej kolumnie. Umożliwia to znalezienie definicji za pomocą prostego wyszukiwania.
int
main(int argc, char *argv[])
{
...
}
Powyższą funkcję można następnie znaleźć /^main
w pliku lub :grep -r '^main' *.c
w katalogu. Dopóki kod jest odpowiednio wcięty, jedynym identyfikatorem pojawiającym się na początku wiersza jest definicja funkcji.
Oczywiście, jeśli od tego momentu nie używasz tagów , powinieneś się wstydzić! Uważam jednak, że ten standard kodowania jest również pomocnym dodatkiem.
TL; DR:
Współczesnym sposobem jest użycie COC do uzupełnienia przypominającego inteligencję i jednego lub więcej serwerów językowych (LS) do przeskoczenia do definicji (i znacznie więcej). Aby uzyskać jeszcze więcej funkcji (ale nie jest to konieczne w przypadku przejścia do definicji), możesz zainstalować jeden lub więcej debuggerów i uzyskać pełną funkcjonalność IDE. Szybki start:
~/.vimrc
:
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'puremourning/vimspector'
call plug#end()
:source $MYVIMRC | PlugInstall
aby pobrać wtyczki VIMvim
i zadzwoń, :CocInstall coc-marketplace
aby uzyskać łatwy dostęp do rozszerzeń COC:CocList marketplace
i wyszukiwać serwery językowe, np .:
python
aby znaleźć coc-jedi
,php
aby znaleźć coc-phpls
itp.install_gadget.py --help
dostępne debuggery, np .:
./install_gadget.py --enable-python
,./install_gadget.py --force-enable-php
itp.Pełna odpowiedź:
Serwer językowy (LS) to osobna samodzielna aplikacja (jedna dla każdego języka programowania), która działa w tle i analizuje cały projekt w czasie rzeczywistym, udostępniając dodatkowe możliwości edytorowi (dowolnemu edytorowi, nie tylko vim
). Dostajesz rzeczy takie jak:
Komunikacja z serwerami językowymi odbywa się za pośrednictwem Language Server Protocol (LSP). Zarówno nvim
i vim8
(lub wyższy) obsługują LSP poprzez wtyczki, najpopularniejszym z nich jest Conquer of Completion (COC).
Lista aktywnie rozwijanych serwerów językowych i ich możliwości jest dostępna na stronie internetowej Lang Server . Nie wszystkie z nich są dostarczane przez rozszerzenia COC. Jeśli chcesz użyć jednego z nich, możesz samodzielnie napisać rozszerzenie COC lub ręcznie zainstalować LS i użyć kombinacji następujących wtyczek VIM jako alternatywy dla COC:
Komunikacja z debuggerami odbywa się za pośrednictwem protokołu debugowania (DAP). Najpopularniejszą wtyczką DAP dla VIM jest Vimspector .
Language Server Protocol (LSP) został stworzony przez Microsoft dla Visual Studio Code i wydany jako projekt open source z pozwoleniem MIT (standaryzowanym we współpracy z Red Hat i Codenvy). Później firma Microsoft wydała również Protokół adaptera debugowania (DAP). Każdy język obsługiwany przez VSCode jest obsługiwany w VIM.
Osobiście zalecam używanie serwerów językowych COC + dostarczonych przez rozszerzenia COC + ALE do dodatkowego przyciemniania (ale z wyłączoną obsługą LSP, aby uniknąć konfliktów z COC) + Vimspector + debuggery dostarczone przez Vimspector (zwane „gadżetami”) + następujące wtyczki VIM:
call plug#begin()
Plug 'neoclide/coc.nvim'
Plug 'dense-analysis/ale'
Plug 'puremourning/vimspector'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/nerdcommenter'
Plug 'sheerun/vim-polyglot'
Plug 'yggdroot/indentline'
Plug 'tpope/vim-surround'
Plug 'kana/vim-textobj-user'
\| Plug 'glts/vim-textobj-comment'
Plug 'janko/vim-test'
Plug 'vim-scripts/vcscommand.vim'
Plug 'mhinz/vim-signify'
call plug#end()
Możesz google każdego, aby zobaczyć, co robią.
1- zainstaluj żywiołowe ctagi. Jeśli używasz systemu OSX, ten artykuł pokazuje małą sztuczkę: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html
2- Jeśli chcesz uwzględnić tylko tagi plików tylko w swoim katalogu, uruchom to polecenie w swoim katalogu:
ctags -R
Spowoduje to utworzenie pliku „tagów”.
3- Jeśli używasz Ruby i chcesz dołączyć ctags do swoich klejnotów (było to dla mnie bardzo pomocne w RubyMotion i lokalnych klejnotach, które opracowałem), wykonaj następujące czynności:
ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`
kredyt: https://coderwall.com/p/lv1qww (Uwaga: pominąłem opcję -e, która generuje tagi dla emacsa zamiast vima)
4- Dodaj następujący wiersz do ~ / .vimrc
set autochdir
set tags+=./tags;
(Dlaczego średnik: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree )
5- Idź do słowa, które chcesz śledzić i naciśnij ctrl + ]
; jeśli chcesz wrócić, użyj ctrl+o
(źródło: https://stackoverflow.com/a/53929/226255 )
Na drugą odpowiedź Pawła: tak, ctags (szczególnie exuberant-ctags ( http://ctags.sourceforge.net/ )) są świetne. Dodałem to również do mojego vimrc, więc mogę użyć jednego pliku tagów dla całego projektu:
set tags=tags;/
Zainstaluj cscope
. Działa bardzo podobnie, ctags
ale mocniej. Aby przejść do definicji, zamiast Ctrl+ ]wykonaj Ctrl+ \+ g. Oczywiście możesz używać obu jednocześnie. Ale przy dużym projekcie (powiedzmy jądro Linuksa) cscope jest o wiele dalej.