Vim, ctags và quá tải


10

Có cách nào để làm cho nhảy vim để định nghĩa phù hợp đúng cách tự động trong trường hợp nhiều định nghĩa. Mã C ++ của chúng tôi sử dụng quá nhiều chức năng và quá trình xử lý ctags của vim dường như chưa sẵn sàng cho nó.

Ví dụ,

void abc(int a, int b) {

}

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

}

Kỳ lạ thay, ctrl]trên

abc(1,2,3);

định nghĩa thứ 1 chứ không phải định nghĩa đúng là định nghĩa thứ 2. Ngoài ra, g]lời nhắc cho các tùy chọn nhưng đó không phải là điều tôi đang tìm kiếm.

Cảm ơn

Câu trả lời:


4

Tài liệu ( :help ctrl-]) nói:

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] có thể không phải là những gì bạn đang tìm kiếm nhưng đó là điều tốt nhất bạn có thể nhận được ở Vim.

Về cơ bản, bạn không thể mong đợi ctags và Vim hiểu mã của mình, vì vậy bạn sẽ phải tìm một người lập chỉ mục thông minh hơn (như cscope, GNU GLOBAL hoặc một cái gì đó dựa trên tiếng kêu) hoặc sử dụng IDE thực tế.


1

tiếng kêu & vim-lsp

Tôi đã thử nghiệm clangdđể xem liệu các hàm quá tải có thực sự được phân biệt khi tìm định nghĩa chính xác từ một dòng mã trong đó một trong các hàm bị quá tải được sử dụng hay không. Trong cấu hình thử nghiệm tối thiểu của tôi bằng cách sử dụng plugin vim, vim-lspnó đã hoạt động.

Cấu hình tối thiểu

$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

Cài đặt trong vim-lspđó yêu cầu async.vimvào packpath 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/

Bây giờ cấu hình vim của bạn sẽ trông như thế (bỏ qua các tệp và thư mục được lồng sâu hơn)

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

5 directories, 1 file

Kiểm tra

Bây giờ hãy xem xét tệp 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;
}

Nhấn gdvào abccủa

  • abc(1,2) nhảy đến dòng đầu tiên và
  • abc(1,2,3) nhảy đến dòng thứ năm.

Môi trường và phiên bản:

  • vim: MacVim 8.1.950 (155); được cài đặt từ DMG từ github trên macOS 10.14.3
  • clangd: 7.0.0; được cài đặt với $ brew install llvm(không $PATHtheo mặc định, sử dụng đường dẫn tuyệt đối)
  • vim-lsp: e3f6933 (ngày 7 tháng 3 năm 2019) và async.vim: f301455 (ngày 13 tháng 2 năm 2019)

0

Như romanl đã nêu, ctagskhông thực sự hiểu mã, vì vậy điều tốt nhất có thể làm là chỉ cho bạn các chức năng chia sẻ tên bạn đang tìm kiếm.

Tuy nhiên, tôi tin rằng clang_completeplugin cung cấp chức năng bạn tìm kiếm. Nó sử dụng clangtrình biên dịch để tìm hàm thực sự khớp với hàm bạn đang tìm kiếm, và không chỉ một hàm có cùng tên. Nó sẽ ghi đè ctrl-]chức năng của ctags.

Tôi cũng đã thấy nó nói rằng YouCompleteMeám clang_completelỗi thời, nhưng như tôi vẫn chưa sử dụng nó bản thân mình, tôi không thể đảm bảo tiện ích của nó.

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


Tôi không thể nói về clang_complete , tuy nhiên, YCM không thể tìm thấy định nghĩa hàm được định nghĩa (sic) trong một đơn vị dịch thuật khác. Chúng tôi có (/ had) clang-indexer (không thực sự được duy trì) và một vài plugin khác. Ngày nay, tôi muốn kiểm tra clangd + plugin triển khai Giao thức máy chủ ngôn ngữ.
Luc Hermitte
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.