Vim, ctags ve aşırı yükleme


11

Birden fazla tanım durumunda vim'in otomatik olarak doğru eşleme tanımına atlamasını sağlamanın bir yolu var mı ? C ++ kodumuz aşırı işlev aşırı yüklemesi kullanır ve vim'nin ctags kullanımı buna hazır görünmemektedir.

Örneğin,

void abc(int a, int b) {

}

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

}

Garip bir şekilde, ctrl]açık

abc(1,2,3);

doğru olan tanımı değil, 1. tanımı alır. Ayrıca, g]seçenekler ister ama aradığım şey bu değil.

Teşekkürler

Yanıtlar:


4

Dokümantasyon ( :help ctrl-]) diyor ki:

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] aradığınız şey olmayabilir, ancak Vim'de alabileceğiniz en iyisi budur.

Temel olarak, ctags ve Vim'in kodunuzu anlamasını bekleyemezsiniz , bu nedenle daha akıllı bir dizinleyici (cscope, GNU GLOBAL veya clang tabanlı bir şey gibi) aramanız veya gerçek bir IDE kullanmanız gerekir.


1

clangd ve vim- lsp

clangdAşırı yüklenmiş fonksiyonlardan birinin kullanıldığı bir kod satırından doğru tanımı ararken aşırı yüklenmiş fonksiyonların gerçekten ayırt edilip edilmediğini test ettim . Benim minimal test yapılandırmasında vim eklentisini kullanarak vim-lspçalıştı.

Minimum Yapılandırma

$MYVIMRC dır-dir

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

Montajı vim-lspgerektiriyor async.vimvim8 packpath içine

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

Şimdi vim yapılandırmanız şöyle görünmelidir (daha derin yuvalanmış dosya ve klasörleri atlamak)

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

5 directories, 1 file

Ölçek

Şimdi cpp dosyasını düşünün

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

Basmak gdüzerinde abcbir

  • abc(1,2) ilk satıra atlar ve
  • abc(1,2,3) beşinci satıra atlar.

Çevre ve sürümleri:

  • vim: MacVim 8.1.950 (155); dan DMG'den yüklü github MacOS 10.14.3 üzerinde
  • clangd: 7.0.0; yüklü $ brew install llvm( $PATHvarsayılan olarak değil , mutlak yol kullan)
  • vim-lsp: e3f6933 (7 Mar 2019) ve async.vim: f301455 (13 Şub 2019)

0

Romanl'ın belirttiği gibi, ctagskodu gerçekten anlamıyor, bu yüzden yapabileceği en iyi şey, aradığınız adı paylaşan işlevlere işaret etmektir.

Ancak, clang_completeeklentinin aradığınız işlevselliği sağladığına inanıyorum . Yalnızca clangaynı adı paylaşan işlevi değil, aradığınız işle gerçekten eşleşen işlevi bulmak için derleyiciyi kullanır. ctrl-]İşlevini geçersiz kılar ctags.

Ayrıca YouCompleteMe, clang_completemodası geçmiş kılanların ifade edildiğini gördüm , ancak henüz kendim kullanmadığım için, faydasını garanti edemiyorum.

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


Clang_complete hakkında anlatamam , ancak YCM başka bir çeviri biriminde (sic) tanımlı bir işlev tanımı bulamıyor. Clang-indexer (gerçekten korunmaz) ve birkaç eklentimiz var (/ vardı). Günümüzde, Dil Sunucusu Protokolü'nü uygulayan clangd + eklentilerini kontrol etmeyi söyleyebilirim.
Luc Hermitte
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.