Vim, ctags и перегрузка

10

Есть ли способ заставить vim автоматически переходить к правильному определению соответствия в случае нескольких определений. Наш код C ++ интенсивно использует перегрузку функций, и обработка ctags в vim, похоже, не готова к этому.

Например,

void abc(int a, int b) {

}

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

}

Странно, ctrl]на

abc(1,2,3);

принимает к 1-му определению, а не к правильному определению, которое является 2-м. Кроме того, g]запрашивает варианты, но это не то, что я ищу.

Спасибо

yumoji
источник

Ответы:

4

В документации ( :help ctrl-]) говорится:

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] может быть не то, что вы ищете, но это лучшее, что вы можете получить в Vim.

По сути, вы не можете ожидать, что ctags и Vim поймут ваш код, поэтому вам придется искать более умный индексатор (например, cscope, GNU GLOBAL или что-то, основанное на clang) или использовать реальную IDE.

romainl
источник
1

clangd & vim-lsp

Я проверил, clangdчтобы увидеть, действительно ли перегруженные функции различаются при поиске правильного определения из строки кода, где используется одна из перегруженных функций. В моей минимальной конфигурации тестирования с использованием плагина vim vim-lspэто работало.

Минимальная конфигурация

$MYVIMRC является

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

Установка vim-lspкоторого требует async.vimв 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/

Теперь ваша конфигурация vim должна выглядеть следующим образом (исключая более глубоко вложенные файлы и папки)

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

5 directories, 1 file

Тестовое задание

Теперь рассмотрим файл 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;
}

Нажатие gdна abcиз

  • abc(1,2) переходит на первую строку, и из
  • abc(1,2,3) прыгает на пятую строчку.

Окружение и версии:

  • vim: MacVim 8.1.950 (155); установлен из DMG из github на macOS 10.14.3
  • clangd: 7.0.0; установлен с $ brew install llvm(не $PATHпо умолчанию, используйте абсолютный путь)
  • vim-lsp: e3f6933 (7 марта 2019 г.) и async.vim: f301455 (13 февраля 2019 г.)
Hotschke
источник
0

Как сказал Роман, ctagsон на самом деле не понимает код, поэтому лучшее, что он может сделать, это указать вам функции, разделяющие имя , по которому вы ищете.

Тем не менее, я считаю, что clang_completeплагин обеспечивает функциональность, которую вы ищете. Он использует clangкомпилятор для поиска функции, которая фактически соответствует той, которую вы ищете, а не только той, которая имеет то же имя. Это переопределит ctrl-]функциональность ctags.

Я также видел, что это заявило, что YouCompleteMeделает clang_completeустаревшим, но поскольку я еще не использовал это сам, я не могу гарантировать его полезность.

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

Кристиан Гиббонс
источник
Я не могу рассказать о clang_complete , однако YCM не может найти определение функции, определенное (sic) в другом модуле перевода. У нас есть (/ имел) clang-indexer (не поддерживается) и несколько других плагинов. В настоящее время я бы сказал, чтобы проверить плагины clangd +, реализующие протокол Language Server.
Люк Эрмит