VIM에서 대규모 프로젝트를 탐색하는 방법


87

VIM 만 사용하여 대규모 프로젝트 (수백 개의 파일)를 어떻게 관리합니까?

나는 개인적으로 작은 프로젝트보다 더 큰 문제를 겪기 시작합니다.

  • 가급적 이름 완성으로 '파일로 이동'하는 방법이 있습니까?
  • 다른 파일에있을 때 '클래스 정의로 이동'과 동일

나는 모든 VIM 기본 사항을 알고 있기 때문에 스크립트를 작성하거나 일부 소스 코드를 빠르게 편집하는 데 문제가 없습니다. 그러나 파일 사이를 탐색해야 할 때 정말 지저분합니다.


어떤 언어를 사용하고 있습니까?
LB40

언어에 구애받지 않는 솔루션을 선호하지만 C ++, PHP 및 Rails에 대한 지원이 필요합니다.
Jakub Arnold

어떤 대답을 받아들였습니까? @JakubArnold

@xetrasu 나는 사용 종료NERDTree
Jakub Arnold

답변:


33

VIM은 태그에 대한 탁월한 지원을 제공 합니다 . 프로젝트에 대한 태그 파일을 만든 후에는 동일한 편집 세션 내에서 파일 건너 뛰기를 포함하여 메서드, 클래스 등의 정의 또는 선언으로 이동할 수 있습니다.

시험

:help tags

C / C ++ 용 태그 파일을 생성하려면 쉘 프롬프트로 이동하여 (시스템이 * nix / Cygwin이라고 가정합니다) 다음을 입력하십시오.

info ctags

또는

ctags --help

2
Vim은 또한 cscope를 지원하므로 주어진 함수를 호출하는 함수를 찾을 수 있습니다 :help cscope. 자세한 내용 은 참조 하십시오. 소개에 멋진 기능 목록이 있습니다 ( "다음과 같은 질문에 답하도록 설계되었습니다"아래).
Cascabel

1
불행히도 cscope는 C ++에 대한 이해가 매우 제한적입니다.
Luc Hermitte

28

저는 간단한 솔루션을 좋아합니다. 현재 가장 좋아하는 탐색 방법은 다음과 같습니다.

추가 ~/.vimrc.local

set path=$PWD/**

그런 다음 편집기에 입력하여 현재 작업 디렉토리 (pwd)에서 파일을 찾습니다.

:find user_spec.rb

파일 이름에 탭 완성을 사용하여 여러 선택 항목을 찾을 수도 있으므로이 TextMate 변환이 매우 만족 스럽습니다.


1
이 솔루션은 : FC 및 플러그인보다 훨씬 간단합니다. '캐싱이 필요하지 않기 때문에 ... 감사!
Srikumar

1
Vim은 wd를 기본 디렉토리로 읽지 않습니다. 셸을 다시 시작했지만 여전히 작동하지 않습니다. 또한 vim .명령을 실행하기 전에 시도했습니다 : /
Adam Grant

13

NERDTree (디렉토리 사이드 바), FuzzyFinder Textmate (TextMate의 CMD + T와 같은 파일로 이동) 및 세션 (: h 세션)의 조합을 사용하여 대규모 프로젝트를 처리 할 수 ​​있습니다.

세션 도우미 플러그인을 사용하는 것이 좋습니다. 내가 사용하는 것을 언급하고 싶지만 아직 만족스럽지 않습니다. 그냥 구글 "vim 세션".

FuzzyFinder Textmate를 작동시킬 때 주목해야 할 점은 FuzzyFinder 플러그인, 특히 v2.16의 이전 버전에 의존한다는 것입니다. 더 높은 값이면 오류가 발생합니다. 그러나 그것은 분명히 문제의 가치가 있습니다. 이름 완성 기능은 없지만 검색이 현명하므로 검색 fro/time/actionsphp하면 파일이 apps/(fro)ntend/modules/(time)_tracking/actions/(actions).class.(php)표시 됩니다 (괄호는 일치하는 항목을 나타냄). 폴더 이름으로 만 고유 한 파일을 매우 쉽게 선택할 수 있습니다.


2
내가 더 좋아하고 설정하기 쉬운 새 플러그인을 찾았습니다 (적어도 제 경우에는) : CommandT . 훨씬 더 빨리.
donut

6
정력 스크립트에서 더 새롭고 강력한 도구, writter, 그래서 아무 외부 종속성은 ctrlp 에 의해 사용 야누스 프로젝트
alexandru.topliceanu

7

뿐만 아니라 귀중한 ctags 및 다양한 관련 명령. 또한 프로젝트 플러그인 없이는 살 수 없었기 때문에 관심있는 파일을 별도의 창에 프로젝트와 연결할 수 있습니다. 내 설정이 얼마나 많이 사용자 정의되었는지 기억할 수 없지만 Debug.c라는 소스 파일을 열려면 다음을 누르십시오.

<F12>     " Opens the project pane
/De       " Searches for "De", which is likely to be enough to find Debug.c or possibly Debug.h
<ENTER>   " Opens the selected file and closes the project pane

나는 종종 다음을 수행합니다.

:vsp      " Vertically split the window
<F12>     " Reopen project pane
#         " Search back to find previous entry with the same name (to find
            Debug.h if I was on Debug.c: my headers are in Headers/ and
            my source is in Source/, so the headers come earlier in the list
            than the source).  I use * to go the other way, obviously.
<ENTER>   " Open the header file in the other window and close the project window.

이 비교적 짧은 시퀀스를 사용하여 모든 파일을 열 수 있으며 수직 분할로 헤더입니다. 프로젝트 플러그인 창은 텍스트 파일이기 때문에 Vim의 검색 기능을 사용하여 완성됩니다.


4

Vim 7.3부터는 :find명령에 파일 이름이 탭으로 완성됩니다.

당신이 당신의 설정이 경우 'path'전체 프로젝트를 포함 할 옵션을 (아마도 사용 **후, 당신은 사용할 수 있습니다, 재귀 적으로 검색 하위 디렉토리를 허용하는 와일드 카드) :find, :sfind, :tabfind프로젝트의 모든 파일에 도착 완공 등의 명령을. 또한 gfinclude 지시문과 같이 파일 이름이 텍스트에있는 경우 및 친구 와 직접 파일로 이동할 수 있습니다.

이 방법을 사용하면 특정 파일을 탐색하는 데 외부 도구 나 플러그인이 필요하지 않습니다. 그러나 그것은 확실히 빠르거나 사용하기 쉽지 않을 수 있으며 정의로 넘어갈 필요성을 해결하지 못합니다. 정의를 위해 다른 답변에서 제안하는 것처럼 ctags를 사용합니다.


3

다른 포스터에서 권장하는대로 ctag를 사용하고 있다면 taglist 플러그인 을 확인하십시오 .

시간을내어 문서를 읽고 키 바인딩을 배우십시오. 다음은 TList 창에서 시작하는 데 도움이되는 몇 가지 사항입니다.

  • o-새 창에서 파일 열기
  • t-새 탭에서 파일 열기
  • [[또는 백 스페이스-목록의 이전 파일
  • ]] 또는 탭-목록의 다음 파일

3

무성한 ctags.

Ctrl-]를 사용하여 커서 아래의 태그로 이동합니다.


2

FindFile을 사용 합니다. 프로젝트의 루트에서 vim을 열고 :FC .플러그인을 실행 하면 cwd 아래의 모든 파일 이름이 캐시됩니다. 그런 다음 :FF완성 메뉴를 열고 원하는 파일 이름 (또는 처음 몇 글자)을 입력 할 수 있습니다.


와우 이것은 사용하기 가장 쉬운 플러그인과 같습니다. 제로 설정이 필요합니다 .. FC .루트 디렉토리에서 :FF입력하고 원하는 파일 이름을 입력하면 완료됩니다. 그래도 새 탭에서 시작하는 방법을 알아 내려고합니다 ..
tester

또한 이것을 사용하면 vim을 시작할 때마다 :FC .해당 디렉토리의 파일을 캐시 하도록 다시 실행해야합니다 .
테스터

다음은 업데이트와 FindFile.vim 버전의 :FT또는 :FindTabNew gist.github.com/1104884
테스터

2

열기 vim소스 파일의 루트에서 연장 path거기에 모든 하위 디렉토리를 포함하는 옵션을 선택합니다.
예를 들어 set path+=/usr/include/c++/**C ++ 헤더 및 set path+=**소스 디렉토리의 경우.

이것은 다음과 같은 많은 가능성을 열어줍니다.

1) 이름 또는 일부로 파일 열기

:find file_name

자동 완성 및 와일드 카드 확장을 :find안정적으로 사용할 수 있습니다 . 이름을 입력하면 이름을 찾습니다. 이것은 언어에 구애받지 않고 작동합니다.

2) cusror에서 파일을 탐색 :
당신은 같은 파일 경로를 가고 싶은 경우 #include "project/path/classA.h.

gf or gF  - go to file under cursor.   

Ctrl-- 또는 6이후 마지막 커서 위치로 돌아갑니다.gfgF

3) API 조회 및 API 위치 탐색

[i또는 [I작업 공간을 벗어나지 않고 커서 아래의 단어에 대한 함수 서명을 조회하는 데 사용할 수 있습니다. [<Tab>실제로 선언으로 이동합니다. 사용 Ctrl- 6마지막 위치로 돌아갑니다.


확장하지 않고 명령으로 path파일 탐색을 시작하고 파일을 :Ex탐색하고 열 수 있습니다. 그래도 나는 이것을 선호합니다 NerdTree.


1

누군가가 더 나은 솔루션을 지적하여 무언가를 배울 수 있기를 바라지 만, NERDTree는 트리를 확장하는 한 이름 완성으로 특정 파일에 도달하는 데 유용했습니다. 파일을 가져와야 할 때의 명령은 다음과 같습니다.

, d / foo.pyo (여기서 foo.py는 파일 이름 임)

, d 트리를 열고 / 검색 모드로 들어가 파일의 이름 (또는 부분 이름, 정규식 등)을 입력 한 다음 o를 눌러 엽니 다.

물론 파일 이름을 충분히 입력하지 않았거나 중복이있는 경우 'n'을 몇 번 눌러야 할 수도 있습니다.

나는 그것에 대해 생각조차하지 않기 때문에 지금까지 내 근육 기억 에까지 도달했지만 이와 같은 NERDTree를 사용하는 약간의 해킹처럼 느껴진다는 것을 인정합니다.

물론 ctags도 사용하지만 커서 근처에 함수가 있고 다른 파일이나 다른 파일에서 정의를 가져와야 할 때만 유용합니다. 저는 "좋아요, 지금 기능 x에 대해 작업해야합니다"라고 말하고 ctags가 실제로 도움이 될 참조가없는 다른 파일로 이동해야하는 경우가 많습니다.


3
좀 더 살펴 봤는데, fuzzyfinder는 프로젝트 검색에 좋은 아이디어처럼 보입니다.
중력

1

두 가지 플러그인을 사용하고 있습니다.

  • 명령 줄에서 파일 이름을 완성하는 searchInRuntime . fuzzyfinder 및 lookupfile과 유사합니다.
  • 완전히 실험적이고 문서화되지 않은 lh-tags . 파일 저장시 태그 파일의 자동 및 빠른 업데이트 (ing?)와 <c-w><m-down>기본적으로 연결되는 태그 선택기의 두 가지 기능을 제공합니다 . 대신 유명한 태그리스트 플러그인을 확인하는 것이 좋습니다.

둘 다 내 viml 라이브러리 lh-vim-lib가 필요합니다.


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