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-lsp
nó đã hoạt động.
Cấu hình tối thiểu
$MYVIMRC
Là
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.vim
và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 gd
vào abc
củ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 $PATH
theo 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)