VIM 만 사용하여 대규모 프로젝트 (수백 개의 파일)를 어떻게 관리합니까?
나는 개인적으로 작은 프로젝트보다 더 큰 문제를 겪기 시작합니다.
- 가급적 이름 완성으로 '파일로 이동'하는 방법이 있습니까?
- 다른 파일에있을 때 '클래스 정의로 이동'과 동일
나는 모든 VIM 기본 사항을 알고 있기 때문에 스크립트를 작성하거나 일부 소스 코드를 빠르게 편집하는 데 문제가 없습니다. 그러나 파일 사이를 탐색해야 할 때 정말 지저분합니다.
VIM 만 사용하여 대규모 프로젝트 (수백 개의 파일)를 어떻게 관리합니까?
나는 개인적으로 작은 프로젝트보다 더 큰 문제를 겪기 시작합니다.
나는 모든 VIM 기본 사항을 알고 있기 때문에 스크립트를 작성하거나 일부 소스 코드를 빠르게 편집하는 데 문제가 없습니다. 그러나 파일 사이를 탐색해야 할 때 정말 지저분합니다.
NERDTree
답변:
VIM은 태그에 대한 탁월한 지원을 제공 합니다 . 프로젝트에 대한 태그 파일을 만든 후에는 동일한 편집 세션 내에서 파일 건너 뛰기를 포함하여 메서드, 클래스 등의 정의 또는 선언으로 이동할 수 있습니다.
시험
:help tags
C / C ++ 용 태그 파일을 생성하려면 쉘 프롬프트로 이동하여 (시스템이 * nix / Cygwin이라고 가정합니다) 다음을 입력하십시오.
info ctags
또는
ctags --help
:help cscope
. 자세한 내용 은 참조 하십시오. 소개에 멋진 기능 목록이 있습니다 ( "다음과 같은 질문에 답하도록 설계되었습니다"아래).
저는 간단한 솔루션을 좋아합니다. 현재 가장 좋아하는 탐색 방법은 다음과 같습니다.
추가 ~/.vimrc.local
set path=$PWD/**
그런 다음 편집기에 입력하여 현재 작업 디렉토리 (pwd)에서 파일을 찾습니다.
:find user_spec.rb
파일 이름에 탭 완성을 사용하여 여러 선택 항목을 찾을 수도 있으므로이 TextMate 변환이 매우 만족 스럽습니다.
vim .
명령을 실행하기 전에 시도했습니다 : /
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)
표시 됩니다 (괄호는 일치하는 항목을 나타냄). 폴더 이름으로 만 고유 한 파일을 매우 쉽게 선택할 수 있습니다.
뿐만 아니라 귀중한 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의 검색 기능을 사용하여 완성됩니다.
Vim 7.3부터는 :find
명령에 파일 이름이 탭으로 완성됩니다.
당신이 당신의 설정이 경우 'path'
전체 프로젝트를 포함 할 옵션을 (아마도 사용 **
후, 당신은 사용할 수 있습니다, 재귀 적으로 검색 하위 디렉토리를 허용하는 와일드 카드) :find
, :sfind
, :tabfind
프로젝트의 모든 파일에 도착 완공 등의 명령을. 또한 gf
include 지시문과 같이 파일 이름이 텍스트에있는 경우 및 친구 와 직접 파일로 이동할 수 있습니다.
이 방법을 사용하면 특정 파일을 탐색하는 데 외부 도구 나 플러그인이 필요하지 않습니다. 그러나 그것은 확실히 빠르거나 사용하기 쉽지 않을 수 있으며 정의로 넘어갈 필요성을 해결하지 못합니다. 정의를 위해 다른 답변에서 제안하는 것처럼 ctags를 사용합니다.
FindFile을 사용 합니다. 프로젝트의 루트에서 vim을 열고 :FC .
플러그인을 실행 하면 cwd 아래의 모든 파일 이름이 캐시됩니다. 그런 다음 :FF
완성 메뉴를 열고 원하는 파일 이름 (또는 처음 몇 글자)을 입력 할 수 있습니다.
FC .
루트 디렉토리에서 :FF
입력하고 원하는 파일 이름을 입력하면 완료됩니다. 그래도 새 탭에서 시작하는 방법을 알아 내려고합니다 ..
:FC .
해당 디렉토리의 파일을 캐시 하도록 다시 실행해야합니다 .
열기 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이후 마지막 커서 위치로 돌아갑니다.gf
gF
3) API 조회 및 API 위치 탐색
[i
또는 [I
작업 공간을 벗어나지 않고 커서 아래의 단어에 대한 함수 서명을 조회하는 데 사용할 수 있습니다. [<Tab>
실제로 선언으로 이동합니다. 사용 Ctrl- 6마지막 위치로 돌아갑니다.
확장하지 않고 명령으로 path
파일 탐색을 시작하고 파일을 :Ex
탐색하고 열 수 있습니다. 그래도 나는 이것을 선호합니다 NerdTree
.
누군가가 더 나은 솔루션을 지적하여 무언가를 배울 수 있기를 바라지 만, NERDTree는 트리를 확장하는 한 이름 완성으로 특정 파일에 도달하는 데 유용했습니다. 파일을 가져와야 할 때의 명령은 다음과 같습니다.
, d / foo.pyo (여기서 foo.py는 파일 이름 임)
, d 트리를 열고 / 검색 모드로 들어가 파일의 이름 (또는 부분 이름, 정규식 등)을 입력 한 다음 o를 눌러 엽니 다.
물론 파일 이름을 충분히 입력하지 않았거나 중복이있는 경우 'n'을 몇 번 눌러야 할 수도 있습니다.
나는 그것에 대해 생각조차하지 않기 때문에 지금까지 내 근육 기억 에까지 도달했지만 이와 같은 NERDTree를 사용하는 약간의 해킹처럼 느껴진다는 것을 인정합니다.
물론 ctags도 사용하지만 커서 근처에 함수가 있고 다른 파일이나 다른 파일에서 정의를 가져와야 할 때만 유용합니다. 저는 "좋아요, 지금 기능 x에 대해 작업해야합니다"라고 말하고 ctags가 실제로 도움이 될 참조가없는 다른 파일로 이동해야하는 경우가 많습니다.
두 가지 플러그인을 사용하고 있습니다.
<c-w><m-down>
기본적으로 연결되는 태그 선택기의 두 가지 기능을 제공합니다 . 대신 유명한 태그리스트 플러그인을 확인하는 것이 좋습니다.둘 다 내 viml 라이브러리 lh-vim-lib가 필요합니다.
SourceCodeObedinece 사용해보십시오 . 이것은 C ++ 1Gb 소스 파일 프로젝트를 처리하기 위해 개발했습니다. 0scan
과 쌍으로 사용합니다 .