Vim, tagag dan kelebihan beban

10

Apakah ada cara untuk membuat lompatan vim ke definisi pencocokan yang tepat secara otomatis dalam kasus beberapa definisi. Kode C ++ kami banyak menggunakan fungsi yang berlebihan dan penanganan ctag secara vim tampaknya tidak siap untuk itu.

Sebagai contoh,

void abc(int a, int b) {

}

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

}

Anehnya, ctrl]pada

abc(1,2,3);

Dibawa ke definisi 1 dan bukan definisi yang benar yang ke-2. Juga, g]meminta opsi tetapi bukan itu yang saya cari.

Terima kasih

yumoji
sumber

Jawaban:

4

Dokumentasi ( :help ctrl-]) mengatakan:

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] mungkin bukan yang Anda cari, tetapi itulah yang terbaik yang bisa Anda dapatkan di Vim.

Pada dasarnya, Anda tidak bisa berharap ctag dan Vim memahami kode Anda, jadi Anda harus mencari pengindeks yang lebih pintar (seperti cscope, GNU GLOBAL, atau sesuatu yang didasarkan pada dentang) atau menggunakan IDE yang sebenarnya.

romainl
sumber
1

clangd & vim-lsp

Saya telah menguji clangduntuk melihat apakah fungsi kelebihan beban sebenarnya dibedakan ketika mencari definisi yang benar dari baris kode di mana salah satu fungsi kelebihan digunakan. Dalam konfigurasi pengujian minimal saya menggunakan plugin vim vim-lspitu berhasil.

Konfigurasi Minimal

$MYVIMRC adalah

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

Instalasi vim-lspyang memerlukan async.vimpaket vim8

$ 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/

Sekarang konfigurasi vim Anda akan terlihat seperti (menghilangkan file dan folder yang bersarang lebih dalam)

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

5 directories, 1 file

Uji

Sekarang perhatikan 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;
}

Menekan gdpada abcdari

  • abc(1,2) melompat ke baris pertama, dan dari
  • abc(1,2,3) melompat ke baris kelima.

Lingkungan dan versi:

  • vim: MacVim 8.1.950 (155); diinstal dari DMG dari github di macOS 10.14.3
  • clangd: 7.0.0; diinstal dengan $ brew install llvm(tidak $PATHsecara default, gunakan jalur absolut)
  • vim-lsp: e3f6933 (7 Maret 2019) dan async.vim: f301455 (13 Feb 2019)
Hotschke
sumber
0

Seperti yang dinyatakan romanl, ctagstidak benar-benar memahami kode, jadi yang terbaik yang bisa dilakukan adalah mengarahkan Anda ke fungsi berbagi nama yang Anda cari.

Namun, saya percaya clang_completeplugin ini menyediakan fungsionalitas yang Anda cari. Itu menggunakan clangkompiler untuk menemukan fungsi yang benar-benar cocok dengan yang Anda cari, dan bukan hanya yang memiliki nama yang sama. Ini akan menimpa ctrl-]fungsi dari ctags.

Saya juga telah melihatnya menyatakan bahwa YouCompleteMemembuat clang_completeusang, tetapi karena saya belum menggunakannya sendiri, saya tidak dapat menjamin kegunaannya.

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

Gibbons Kristen
sumber
Saya tidak tahu tentang clang_complete , namun, YCM tidak dapat menemukan definisi fungsi yang didefinisikan (sic) di unit terjemahan lain. Kami memiliki (/ pernah) clang-indexer (tidak benar-benar dipertahankan), dan beberapa plugin lainnya. Saat ini, saya akan mengatakan untuk memeriksa clangd + plugins yang mengimplementasikan Language Server Protocol.
Luc Hermitte