여러 정의의 경우 vim이 올바른 일치하는 정의로 자동 이동 하는 방법이 있습니까? 우리의 C ++ 코드는 함수 오버로딩을 많이 사용하며 vim의 ctags 처리는 준비가되지 않은 것 같습니다.
예를 들어
void abc(int a, int b) {
}
void abc(int a, int b, int c) {
}
이상하게도 ctrl]에
abc(1,2,3);
첫 번째 정의로 넘어 가고 두 번째 인 올바른 정의가 아닙니다. 또한 g]옵션을 묻는 메시지가 표시되지만 원하는 것은 아닙니다.
감사
답변
설명서 ( :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를 사용해야합니다.
답변
클 랜드 및 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
vim8 packpath에 vim-lsp
필요한 설치async.vim
$ 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)
다섯 번째 줄로 이동합니다.
환경 및 버전 :
답변
romanl이 말했듯 ctags
이 실제로 코드를 이해하지 못하므로 검색하는 이름을 공유하는 함수를 가리킬 수 있습니다.
그러나 clang_complete
플러그인이 원하는 기능을 제공 한다고 생각합니다 . clang
컴파일러를 사용 하여 동일한 이름을 공유하는 기능뿐만 아니라 실제로 검색하는 기능과 일치하는 기능을 찾습니다. 의 ctrl-]
기능을 재정의합니다 ctags
.
또한 낡은 YouCompleteMe
렌더링으로 표시 clang_complete
되었지만 아직 직접 사용하지 않으므로 유틸리티를 보장 할 수 없습니다.
clang_complete git repo : https://github.com/Rip-Rip/clang_complete