Vim, ctags та перевантаження


10

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

Наприклад,

void abc(int a, int b) {

}

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

}

Дивно, ctrl]на

abc(1,2,3);

приймає до першого визначення, а не правильного визначення, яке є 2-м. Крім того, g]підкаже варіанти, але це не те, що я шукаю.

Дякую

Відповіді:


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.


1

брязкальце & 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 р.)

0

Як зазначив romanl, 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-індексатор (насправді не підтримується) та кілька інших плагінів. Сьогодні я б сказав, щоб перевірити clangd + плагіни, що реалізують протокол Language Server.
Люк Ермітт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.