Vim, ctags 및 과부하


10

여러 정의의 경우 vim이 올바른 일치하는 정의로 자동 이동 하는 방법이 있습니까? 우리의 C ++ 코드는 함수 오버로딩을 많이 사용하며 vim의 ctags 처리는 준비가되지 않은 것 같습니다.

예를 들어

void abc(int a, int b) {

}

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

}

이상하게도 ctrl]

abc(1,2,3);

첫 번째 정의로 넘어 가고 두 번째 인 올바른 정의가 아닙니다. 또한 g]옵션을 묻는 메시지가 표시되지만 원하는 것은 아닙니다.

감사

답변:


4

설명서 ( :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를 사용해야합니다.


1

클 랜드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;
}

누르면 gdabc

  • abc(1,2) 첫 줄로 점프
  • abc(1,2,3) 다섯 번째 줄로 이동합니다.

환경 및 버전 :

  • vimMacVim 8.1.950 (155); macOS 10.14.3의 github 에서 DMG에서 설치
  • clangd: 7.0.0; 함께 설치됨 $ brew install llvm( $PATH기본적으로 설정 되어 있지 않으며 절대 경로 사용)
  • vim-lsp: e3f6933 (2019 년 3 월 7 일) 및 async.vim: f301455 (2019 년 2 월 13 일)

0

romanl이 말했듯 ctags이 실제로 코드를 이해하지 못하므로 검색하는 이름을 공유하는 함수를 가리킬 수 있습니다.

그러나 clang_complete플러그인이 원하는 기능을 제공 한다고 생각합니다 . clang컴파일러를 사용 하여 동일한 이름을 공유하는 기능뿐만 아니라 실제로 검색하는 기능과 일치하는 기능을 찾습니다. 의 ctrl-]기능을 재정의합니다 ctags.

또한 낡은 YouCompleteMe렌더링으로 표시 clang_complete되었지만 아직 직접 사용하지 않으므로 유틸리티를 보장 할 수 없습니다.

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


clang_complete 에 대해 말할 수는 없지만 YCM은 다른 번역 단위에서 정의 된 함수 정의를 찾을 수 없습니다. 우리는 (/ had) clang-indexer (실제로는 유지되지 않음)와 몇 가지 다른 플러그인을 가지고 있습니다. 요즘 언어 서버 프로토콜을 구현하는 clangd + 플러그인을 확인하고 싶습니다.
Luc Hermitte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.