Vim의 자동 완성


257

간단히 말해서, 내가 찾고 있어요 작업 Vim 편집기에 대한 자동 완성 기능입니다. 나는 한 전에 주장 이 빔이 완전히 리눅스에서 IDE를 대체하고 확실히 사실이지만, 그것은 하나 개의 중요한 기능이 부족 : 자동 완성.

Ctrl+ N, Exuberant Ctags 통합 , Taglist , cppcompleteOmniCppComplete 에 대해 알고 있습니다. 아아, 이것들 중 어느 것도 "자동 완성 기능"에 대한 나의 설명과 맞지 않습니다.

  • CtrlN철자법을 잊어 버린 경우 + 는 잘 작동합니다 ( class또는) while. 오 잘
  • Ctags 는 기초를 제공하지만 많은 단점이 있습니다.
  • TaglistCtags 래퍼 일 뿐이 므로 대부분의 단점을 상속합니다 ( 선언 을 나열 하는 데는 효과적 임 ).
  • cppcomplete 는 약속 한대로 작동하지 않으며, 내가 잘못한 것을 파악할 수 없거나 올바르게 작동하고 제한이 설계에 따른 것인지 여부를 알 수 없습니다.
  • OmniCppCompletecppcomplete 와 동일한 문제가있는 것 같습니다. 즉 자동 완성이 제대로 작동하지 않습니다. 또한 tags파일을 다시 한 번 수동으로 업데이트해야합니다.

현대적이고 완전한 IDE조차도 C ++ 코드 완성을 제공하지 못한다는 사실을 알고 있습니다. 그렇기 때문에 지금까지이 분야에서 Vim의 부족을 받아 들였습니다. 그러나 기본적인 코드 완성 수준은 그리 많이 요구되지 않으며 실제로 생산적인 사용법에 필요하다고 생각합니다. 그래서 나는 적어도 다음을 달성 할 수있는 것을 찾고 있습니다.

  • 구문 인식 . cppcomplete 약속 (그러나 나에게 제공하지는 않음), 다음의 정확한 범위 인식 자동 완성 :

    variableName.abc
    variableName->abc
    typeName::abc
    

    그리고 실제로 다른 것은 전혀 쓸모가 없습니다.

  • 구성 가능성 . 소스 파일의 위치와 스크립트가 자동 완성 정보를 얻는 위치를 (쉽게) 지정해야합니다. 실제로 필자는 디렉토리에 필요한 포함 경로를 지정하는 Makefile을 가지고 있습니다. Eclipse는 그 안에있는 정보를 해석 할 수 있습니다. Vim 스크립트도 왜 그렇지 않습니까?

  • 최신 . 파일에서 무언가를 변경하자마자 자동 완성에 이것을 반영하기를 원합니다. 수동으로 트리거하고 싶지 않습니다ctags (또는 비슷한 것을). 또한, 변경해야 증분 나는 완전히 그냥 하나 개의 파일 변경 한 경우 즉, 받아 들일 수 에 대한 ctags전체 디렉토리 트리를 (거대 할 수있는) 재 구문 분석을.

아무것도 잊었습니까? 자유롭게 업데이트하십시오.

나는 많은 구성 및 / 또는 땜질에 익숙하지만 솔루션을 처음부터 프로그래밍하고 싶지 않으며 Vim 스크립트를 디버깅하는 데 좋지 않습니다.

마지막으로, Java 및 C #과 비슷한 것을 원하지만 ctags코드 파일을 구문 분석하고 Java와 C # 모두 색인을 작성 해야하는 사전 컴파일 된 거대한 프레임 워크가 있습니다. 불행히도 IDE없이 .NET을 개발 하는 것은 C ++보다 PITA보다 훨씬 더 큽니다.


4
이 질문을 한 지 오래되었습니다. 마침내 좋은 것을 찾았습니까? 수락 된 답변이 보이지 않기 때문에 묻습니다. 개인적으로 인정해야하지만 변수 / 함수 접두어를 사용했습니다. 예를 들어, 그들 모두는 sh(내 라이브러리에 있음을 의미)로 시작하고 내 클래스의 약어를 따릅니다. 예를 들어 shP위한 Parser클래스입니다. 그런 다음 shPCTRL + p (또는 원하는 경우 CTRL + n)를 작성하고 클래스 멤버를 마지막 사용에서 처음으로 (또는 CTRL + n 인 경우 첫 번째에서 마지막으로) 가져 오면됩니다.
Shahbaz

4
@Shahbaz 사실, 현재로서는 충분한 해결책이 없다고 확신합니다. clang_complete기술적으로 가장 건전하지만 결과 캐싱 부족 및 부분 컴파일로 인해 엄청나게 느립니다. 일부는 복잡하고 시간 소모적 인 설정이 필요하기 때문에 모든 답변을 시도하지는 않았다는 것을 인정해야합니다. clang이 마침내 개발자가 C ++ 소스에서 AST를 빌드 할 수있게되었으므로 사용 가능한 플러그인을 위해 숨을 참을 것입니다 (지금까지는 C ++에 대한 무료 무료 파서가 없었습니다).
Konrad Rudolph

2
clang_complete최근에 시도한 적이 있습니까? libclang이제 캐싱과 함께 사용할 수 있으므로 더 빨라야합니다.
Jan Larres

@Jan 정보를 주셔서 감사합니다. 내가 마지막으로 시도했을 때 libclang 지원은 여전히 ​​스케치 적이었습니다. 시간이되면 다시 시도해야합니다.
Konrad Rudolph

(편집 롤백 이유 : 제품 이름들이 속하지 않는 코드되지 않습니다 formatted like this.)
콘라드 루돌프

답변:


171

YouCompleteMe를 사용해보십시오 . 시맨틱 C / C ++ / Objective-C 완성을 제공하는 libclang 인터페이스를 통해 Clang을 사용합니다. clang_complete와 매우 유사하지만 퍼지 매칭과 함께 훨씬 더 빠릅니다.

위의 내용 외에도 YCM은 C #, Python, Go, TypeScript 등의 시맨틱 완성 기능을 제공합니다. 또한 시맨틱 지원이없는 언어의 경우 시맨틱 기반의 식별자 기반 완성 기능도 제공합니다.


69
사실, 나는이 해결책을 받아 들일 것입니다. 마지막으로 제공하는 플러그인. 나는 며칠 동안 그것을 사용 해왔다. 이 질문에 답하는 데 4 년 밖에 걸리지 않았습니다. ;-)
Konrad Rudolph

5
YouCompletMe valloric과 함께하는 멋진 직업! 축하
statquant

5
너무 나쁜 YouCompleteMe는 Windows에 설치하기에 완벽한 PITA입니다 :(
xx

2
@DrTwox 읽어보기 : "YCM이 Windows를 공식적으로 지원 하지는 않지만 Windows 를 사용할 수 없다는 의미는 아닙니다. Windows 설치 가이드 위키 페이지를 참조하십시오. 자유롭게 추가하십시오."
user456584

7
이 게시물은 경계선 자체 승격이므로 저자임을 언급해야합니다 (질문에 대답하지는 않지만 고지 사항을 포함해야합니다).
EntangledLoops

36

컴파일러 를 사용하여 C ++ 프로젝트에 대한 코드 완성을 제공 하는 clang_complete 도 있습니다. 이 플러그인에 대한 문제 해결 힌트 와 함께 다른 질문 이 있습니다.clang

플러그인은 프로젝트가 컴파일되는 한 상당히 잘 작동하는 것처럼 보이지만 대규모 프로젝트의 경우 태그 목록을 생성하기 위해 전체 컴파일을 시도하기 때문에 엄청나게 느립니다.


clang_complete플러그인은 Cygwin에서와 Windows에서 잘 작동합니다. 내가 없기 때문에 큰 프로젝트에 대해 말할 수 없습니다. :)
Lumi

libclang을 사용하는 clang_complete가 캐싱하는 것 같습니다. 그런 다음 허용되는 답변이어야합니다. Linux 커널에서 clang_complete를 사용해 보셨습니까? 커널에서 가장 좋은 색인 생성은 Eclipse CDT를 사용하는 것입니다. clang_complete가 커널을 처리 할 수 ​​있다면 아무것도 완료 할 수 있어야합니다.
dashesy

clang_complete는 내가 사용하는 최고의 Vim 플러그인입니다.
Cromulent

1
@Cromulent Ah, YouCompleteMe를 확인하십시오. 훨씬 좋습니다.
Konrad Rudolph

@KonradRudolph 감사합니다. 제가 그것을 확인해 보겠습니다.
Cromulent


6

방금 Eclim 프로젝트 가 다른 질문에 연결되어 있음을 발견했습니다 . 이것은 적어도 Java 통합의 경우 유망한 것으로 보입니다.


테스트 했습니까? 흥미로운 것 같습니다.
Pacane

@Pacane : 아뇨. 몇 달 만에 Java를 사용할 필요가 없었으며 실험 할 여가가 없었습니다.
Konrad Rudolph

1
Eclim은 Java를위한 훌륭한 솔루션 인 것 같습니다. 비록 Eclipse는 여전히 헤드리스 환경에서도로드 할 수있는 짐승입니다
Drupad Panchal

2
Java의 경우 Vrapper 를 사용할 수 있습니다 . 나는 훌륭한 자동 완성으로 보통 괜찮다는 것을 알았습니다. 가끔 텍스트를 많이 사용하는 편집을 위해 외부 도구로 실제 Vim을 시작할 수 있습니다.
kizzx2


2

intellisense와 같은 것을 찾고 있습니까?

insevim이이 문제를 해결하는 것 같습니다.

여기 스크린 샷으로 연결


2
이것이 내가 찾는 것입니다. 예. 불행히도 Windows에서만 실행됩니다 (OS X를 사용하고 있습니다). 또한, 마지막 업데이트는 2003 년경에 이루어진 것으로 보입니다. :-(
Konrad Rudolph

잘 당신은 소스 코드를 얻을 수 있습니다 :) 그렇지 않다면, 내가 생각할 수있는 유일한 것은 전복입니다 .. 또는 이것을보십시오 : ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop .net 물건을 위해 적어도 ..
Ric Tokyo

Ric, 귀하의 의견을 두 가지 별도의 답변으로 제공하십시오. 귀중한 것이며, 나는 그것들을 올바르게 존중하고 싶습니다! 즉, MonoDevelop는 현재 OS X에서 사용할 수 없으며 현재 OmniCppComplete를 찾고 있습니다.
Konrad Rudolph

이건 창문 뿐이야! :( 왜 당신은 VS가있는 Windows에서 이것을 원해야합니까. 나는 리눅스에서 해결책을 찾고 있습니다.
Nils

Nils : 모든 사람이 Visual Studio에 액세스 할 수있는 것은 아니며 많은 사람들이 Windows 환경에 적용 할 vi 기술을 가지고 있습니다. 리눅스로 향하는 포트가 있지만 현재 다운되었습니다. 어쨌든 무엇을 달성하려고합니까? 기본 자동 완성 기능이 필요하지 않습니까? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.