2009-09-22 2 views
77

VIM 만 사용하여 큰 프로젝트 (수백 개의 파일)를 어떻게 관리합니까?VIM에서 큰 프로젝트를 탐색하는 방법

개인적으로 작은 프로젝트보다 큰 문제가 발생하기 시작했습니다.

  • '파일로 이동'할 수있는 방법이 있습니까? 또 다른 파일에있을 때, '클래스 정의로 이동'에 대한 같은

내가 좀 모든 VIM의 기본을 알고, 그래서 스크립트 작성 또는 빠른 편집 일부 소스 코드를 사용하여 문제가 없습니다 . 하지만 파일 사이를 탐색해야 할 때 정말 지저분 해집니다.

+0

사용중인 언어는 무엇입니까? – LB40

+0

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

답변

29

VIM은 태그을 잘 지원합니다. 프로젝트의 태그 파일을 만들면 동일한 편집 세션 내에서 파일 건너 뛰기를 비롯하여 메서드, 클래스 등의 정의 나 선언으로 이동할 수 있습니다.

:help tags 

는, 쉘 프롬프트로 이동 C/C++에 대한 태그 파일을 생성 할 (I 시스템을 믿고있어이 * nix에서 스크립트/Cygwin에서) 및 입력

info ctags 

또는

ctags --help 
+2

Vim은 cscope도 지원합니다. cscope은 어떤 함수가 주어진 함수를 호출하는지 확인하는 것과 같은 일을 할 수있게합니다. 자세한 정보는': help cscope'를보십시오. 소개에 멋진 기능 목록이 있습니다 ("질문에 대답하도록 설계되었습니다"아래). – Cascabel

+1

불행히도 cscope는 C++에 대한 이해가 매우 제한되어 있습니다. –

12

나는 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] (https://wincent.com/products/command-t). 훨씬 더 빨리. – donut

+6

vim 스크립트에 새롭고 강력한 도구, 작성기가있어서 외부 종속성은 [janus 프로젝트]에서 사용하는 [ctrlp] (http://www.vim.org/scripts/script.php?script_id=3736)가 아닙니다. https://github.com/carlhuda/janus) –

1

나는 누군가가 더 좋은 해결책을 찾을 수 있도록 좀더 배우기를 바라고 있지만 NERDTree는 트리를 확장하는 한 이름 완성을 통해 특정 파일을 얻는 데 나에게 도움이되었습니다.

(foo.py 파일 이름입니다) D/foo.pyo

트리를 엽니 D/입력하는 검색 모드 : I 파일에 도착해야하는 명령은 같은 것입니다 , 파일의 이름 (또는 부분 이름, 정규식 또는 기타)을 입력 한 다음, o를 눌러 파일을 엽니 다.

물론 파일 이름을 충분히 입력하지 않았거나 중복 된 파일이 있으면 'n'번 누르십시오.

NERDTree를 사용하여 해킹을하는 것처럼 느껴진다는 것을 인정합니다.하지만 지금까지는 내 근육 기억 에까지 도달 했음에도 불구하고 생각하지 않습니다.

물론 나는 ctags도 사용하지만 커서 근처에있는 기능이 있고 다른 파일이나 그 밖의 파일에서 정의에 도달해야 할 때만 유용합니다. 많은 시간에 나는 "OK, 이제 feature x에서 작업 할 필요가있다"고 말하면서 ctags가 도움이 될만한 참조없이 다른 파일을 탐색해야합니다.

+3

더 자세히 살펴보면 퍼지 더 (fuzzyfinder)는 프로젝트 검색을위한 훌륭한 아이디어처럼 보입니다. – gravitation

1

난 내 두 플러그인을 사용하고 있습니다 :

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

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

7

뿐만 아니라 귀중한 ctags 및 다양한 관련 명령. 또한 project plugin 없이는 살 수 없기 때문에 프로젝트와 관련된 관심있는 파일을 별도의 창에 둘 수 있습니다. 내가 정의하는 방법을 내 설정의 많은 기억이 안나요,하지만 난 Debug.c라는 소스 파일을 열려면, I 횟수 :

<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의 검색 기능을 사용하여 완성 할 수 있습니다.

3

다른 포스터가 추천 한대로 ctags를 사용하는 경우 taglist 플러그인을 확인하십시오.

시간을 들여 문서를 읽고 키 바인딩을 확인하십시오. 여기에 몇 가지가 있습니다 (TList를 창에서) 시작하는됩니다

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

SourceCodeObedinece을보십시오. 이것은 C++ 1Gb 소스 파일 프로젝트를 처리하기 위해 개발 한 것입니다.
0scan와 쌍으로 사용합니다.

이 두 플러그인은 가장 널리 사용되는 Vim 탐색 도구 인 ctagscscope에 대한 래퍼입니다.

+0

C++ 코드에 적합합니까? cscope doesnt는 C++에서 제대로 작동합니다. –

2

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

+0

wow 이것은 사용하기 쉬운 플러그인과 같습니다. 제로 설정이 .. 루트 디렉토리에'FC .' 만 있으면': FF'를 입력하고 원하는 파일 이름을 입력하면 완료됩니다. 나는 새로운 탭을 어떻게 작동 시킬지 알아 내려고 노력 중이다 .. – tester

+0

이것을 사용하면 vim을 시작할 때마다 그 디렉토리에있는 파일을 캐시하기 위해': FC .'를 재실행해야한다. . – tester

+0

다음은': FT' 또는': FindTabNew'가있는 FindFile.vim의 업데이트 된 버전입니다 https://gist.github.com/1104884 – tester

2

Exuberant ctags.

커서 아래의 태그로 이동하려면 Ctrl-] 키를 사용하십시오.

22

내가 간단한 해결책을 좋아, 순간 이동하는 내가 가장 좋아하는 방법은 다음과 같습니다

은 (현재 작업 디렉토리에 어디서나 파일을 찾으려면 다음 편집기에서이 입력 ~/.vimrc.local

set path=$PWD/** 

에 추가 PWD)

:find user_spec.rb 

당신이 TextMate를 매우 행복 변환하고,뿐만 아니라 여러 선택 사항을 찾기 위해 파일 이름에 탭 완성 기능을 사용할 수 있습니다.

+1

이 솔루션은 FC 및 플러그인의 캐싱이 필요없고 .. 너는 내 하루의 아보카이드를 만들었다! 감사! – Srikumar

+0

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

4

Vim 7.3부터는 :find 명령에 파일 이름의 탭 완성이 있습니다.

그래서 당신은 (아마도 재귀 적으로 검색 하위 디렉토리를 허용하도록 ** 와일드 카드를 사용하여) 전체 프로젝트를 포함하여 'path' 옵션을 설정하면, 당신은 :find:sfind는, :tabfind는 등 완공 명령어는 모든 파일에 도착하는 데 사용할 수있는 프로젝트에서 예를 들어, include 지시문과 같이 파일 이름이 텍스트에있는 경우 gf 및 friends를 사용하여 직접 파일로 점프 할 수도 있습니다.

이 방법을 사용하면 특정 파일을 탐색 할 때 외부 도구 나 플러그인이 필요하지 않습니다. 물론, 사용하기 쉽고 빠르지는 않을지 모르지만 정의로 점프 할 필요는 없습니다. 정의에 대해서는 다른 답변에서 제안하는대로 ctags를 사용합니다.

1

소스 파일의 루트에서 vim을 열고 모든 서브 디렉토리를 포함하도록 path 옵션을 확장하십시오.
예를 들어, C++ 헤더의 경우 set path+=/usr/include/c++/**이고 소스 디렉토리의 경우 set path+=**입니다.

그러면 다음과 같은 가능성이 열립니다.

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

:find file_name 

당신은 안정적으로 :find와 자동 완성 및 와일드 카드 확장을 사용할 수 있습니다. 이것은 언어에 불가 지론합니다. cusror에서 파일을 탐색

2) :
당신이 #include "project/path/classA.h 같은 파일 경로를 이동합니다.

gf or gF - go to file under cursor. 

Ctrl 키 - 6-gf 또는 gF 또한

gd - go to definition for word under cursor within the file. 

언어 무관 한 후 다시 마지막 커서 위치로 와서.

3) API 조회와 API 위치

[i 또는 [I로 이동이 작업 공간을 떠나지 않고 커서 아래 단어를 함수 서명을 조회 할 수 있습니다. [<Tab> 실제로 선언에 가야합니다. Ctrl - 을 사용하여 마지막 위치로 돌아옵니다.


path을 확장하지 않고, 당신은 :Ex 명령으로 파일을 탐색 시작 탐색하고 파일을 열 수 있습니다. 나는 이것을 통해 NerdTree을 선호한다.

관련 문제