Vim, ctags i przeciążanie

10

Czy istnieje sposób, aby uczynić vim skok do właściwej definicji pasującej automatycznie w przypadku wielu definicji. Nasz kod C ++ intensywnie wykorzystuje przeciążanie funkcji, a obsługa ctagów przez vima nie wydaje się na to gotowa.

Na przykład,

void abc(int a, int b) {

}

void abc(int a, int b, int c) {

}

O dziwo, ctrl]dalej

abc(1,2,3);

przejdzie do 1. definicji, a nie do poprawnej definicji, która jest 2.. Również g]podpowiedzi dla opcji, ale to nie to, co szukam.

Dzięki

yumoji
źródło

Odpowiedzi:

4

Dokumentacja ( :help ctrl-]) mówi:

When there are several matching tags for {ident}, jump
to the [count] one.  When no [count] is given the
first one is jumped to.

g] może nie być tym, czego szukasz, ale to najlepsze, co możesz uzyskać w Vimie.

Zasadniczo nie możesz oczekiwać, że ctags i Vim zrozumieją twój kod, więc będziesz musiał poszukać mądrzejszego indeksatora (takiego jak cscope, GNU GLOBAL lub czegoś opartego na clang) lub użyć rzeczywistego IDE.

romainl
źródło
1

clangd & vim-lsp

Testowałem, clangdaby sprawdzić, czy przeciążone funkcje są rzeczywiście rozróżniane, gdy szukamy poprawnej definicji z linii kodu, w której używana jest jedna z przeciążonych funkcji. W mojej minimalnej konfiguracji testowania przy użyciu wtyczki vim vim-lspdziałało.

Minimalna konfiguracja

$MYVIMRC jest

source $VIMRUNTIME/defaults.vim
if executable('/usr/local/Cellar/llvm/7.0.0/bin/clangd')
    augroup Clangd
        autocmd User lsp_setup call lsp#register_server({
            \ 'name': 'clangd',
            \ 'cmd': {server_info->['/usr/local/Cellar/llvm/7.0.0/bin/clangd']},
            \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp'],
            \ })
        autocmd FileType c,cpp,objc,objcpp nmap <buffer> gd <plug>(lsp-definition)
        autocmd FileType c,cpp,objc,objcpp setlocal omnifunc=lsp#complete
    augroup END
endif

Instalacja tego vim-lspwymaga async.vimw vim8 packpath

$ cd ~/.vim
$ git clone https://github.com/prabirshrestha/async.vim pack/prabirshrestha/start/async.vim/
$ git clone https://github.com/prabirshrestha/vim-lsp   pack/prabirshrestha/start/vim-lsp/

Teraz powinna wyglądać twoja konfiguracja vima (z pominięciem bardziej zagnieżdżonych plików i folderów)

~/.vim
❯ tree -L 4 -F
.
├── pack/
│   └── prabirshrestha/
│       └── start/
│           ├── async.vim/
│           └── vim-lsp/
└── vimrc

5 directories, 1 file

Test

Teraz rozważ plik cpp

void abc(int a, int b) {

}

void abc(int a, int b, int c) {

}

int main(int argc, char const *argv[])
{
    abc(1,2);
    abc(1,2,3);
    return 0;
}

Naciśnięcie gdna abcod

  • abc(1,2) przeskakuje do pierwszej linii i
  • abc(1,2,3) przeskakuje do piątej linii.

Środowisko i wersje:

  • vim: MacVim 8.1.950 (155); zainstalowany z DMG z github na macOS 10.14.3
  • clangd: 7.0.0; zainstalowany z $ brew install llvm( $PATHdomyślnie nie jest używany, użyj ścieżki bezwzględnej)
  • vim-lsp: e3f6933 (7 marca 2019 r.) i async.vim: f301455 (13 lutego 2019 r.)
Hotschke
źródło
0

Jak stwierdził Romanl, ctagstak naprawdę nie rozumie kodu, więc najlepiej może wskazać funkcje o wspólnej nazwie, której szukasz.

Uważam jednak, że clang_completewtyczka zapewnia funkcjonalność, której szukasz. Korzysta z clangkompilatora, aby znaleźć funkcję, która faktycznie odpowiada tej, której szukasz, a nie tylko o tej samej nazwie. Zastąpi to ctrl-]funkcjonalność ctags.

Widziałem również, że stwierdził, że YouCompleteMerenderowanie jest clang_completeprzestarzałe, ale ponieważ sam go jeszcze nie użyłem, nie mogę zagwarantować jego użyteczności.

clang_complete git repo: https://github.com/Rip-Rip/clang_complete

Christian Gibbons
źródło
Nie mogę powiedzieć o clang_complete , jednak YCM nie może znaleźć definicji funkcji zdefiniowanej (sic) w innej jednostce tłumaczeniowej. Mamy (/ had) clang-indexer (tak naprawdę nie obsługiwany) i kilka innych wtyczek. W dzisiejszych czasach powiedziałbym, aby sprawdzić wtyczki clangd + implementujące Language Server Protocol.
Luc Hermitte