Vim and Ctags 팁과 요령 [닫기]


485

방금 Ctags를 설치했습니다 (오히려 또는 GVIM) 내 빔과 (C ++ 개발에 도움), 좋아하는 명령, 매크로, 바로 가기, 그것과 함께 이동 도움말을 찾을 싶습니다 ...

최고의 무기고를 공유하십시오. Vim 개발에서 C ++에 권장하는 다른 Vim 애드온은 무엇입니까?

EDIT 어떤 다른 추가에 당신이 Ctags는와 함께 사용해야합니까?

EDIT2 태그와 함께 사용하는 gVim의 버전은 무엇입니까? 차이가 있습니까?

EDIT3 대규모 프로젝트와 소규모 프로젝트 모두에서 프로그래밍 경험을 향상시키는 방법은 무엇입니까?


15
최상의 결과를 얻으려면 풍부한 ctags (현대 구현)를 사용하십시오. ctags.sourceforge.net
idbrii

17
아마도 그 케릭은 건설적이지 않습니까?
플로이드

27
하지만 closed as not constructive거의 2 년 전, 그것은 나에게 매우 건설적인
sazary

15
"이 질문은 큰 도움이 되었음에도 불구하고 Q & A의 StackOverflow 정책에 맞지 않습니다.이 질문과 답변이 Quora로 이동하고 완고하게 닫는 동안 사이트를 성장 시키십시오. 질문과 답변".
Diego Pino

2
나는 SO의 규칙에 따라 왜이 질문이 닫혔는지 이해합니다. 그러나 삭제에 대한> 300-upvote 답변으로> 400 upvote 질문을 표시하는 것은 심술 side은 부분에 약간의 영향을 미칩니다.
DevSolar

답변:


394

Ctrl+ ]- 정의에 이동
Ctrl+ T정의에서 점프 다시 -.
Ctrl+ W Ctrl+ ]-수평 분할에서 정의를 엽니 다

vimrc에이 줄을 추가하십시오
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+ \-새 탭 에서 정의 열기
Alt+ ]-수직 분할에서 정의 열기

태그가 생성 된 후 다음 키를 사용하여 기능에 태그를 지정하고 태그를 지정할 수 있습니다.

Ctrl+ Left MouseClick- 정의로 이동
Ctrl+ Right MouseClick정의에서 점프 다시 -


8
C-] => (컨트롤 키) 및] 키 C-T => (컨트롤 키) 및 T 키 초보자를위한 태그입니다. 새로운 탭 트릭에 감사드립니다
kumar

6
마찬가지로, 분할 후와 윈도우 Ctrl-w C-]당신이 할 수있는 C-w T새 탭에 그 분할을 변경 (Shift 키 t 일명).
dash-tom-bang

1
@Will 터미널에서 vim을 사용하는 경우 옵션 키가 alt 키처럼 동작하도록 터미널 환경 설정을 변경해야합니다. MacVim을 사용하는 경우이 줄을 vimrc 'set macmeta'에 추가하십시오. macmeta, : h macmeta에 대한 문서가 있습니다.
Amjith

17
g C-]매우 유용합니다. 여러 정의 중 하나를 선택할 수있는 빠른 대화 상자가 열립니다.
Vincenzo Pii

3
g]유용합니다. 태그 이름 위에 커서를 놓고을 눌러 g]일치하는 태그 목록을 얻을 수 있습니다.
zeekvfu

176

항상 내 .vimrc에 들어가는 한 줄 :

set tags=./tags;/

이것은 현재 디렉토리에서 "태그"를 찾고, 트리가 발견 될 때까지 루트쪽으로 트리를 작동시킵니다. IOW, 소스 트리의 루트가 아닌 소스 트리의 어느 곳에 나있을 수 있습니다.


37
뿌리까지 올라가는 것은 과도합니다. 난 단지 대신에 집까지가는 제안 : 태그 + = 태그를, $ HOME은
gotgenes

37
내가 작업하는 소스 트리가 항상 내 홈 디렉토리에있는 것은 아니며 $ HOME이 루트에서 두 디렉토리 떨어져있는 경향이 있습니다 ... 음, 디렉토리 조회를 두 번 더 감당할 수 있습니다. :)
uzi

6
나는 uzi에 동의합니다. 내 cwd가 / home / me / programming / foo / bar / baz / bang / bam 인 경우 디렉토리 검색은 8 개에 불과합니다. 속도에 대한 허용 오차에 따라 다르지만 1 디렉토리를 조회하는 시간은 내 컴퓨터의 8과 크게 다르지 않습니다.
Nate Murray

1
그것은 / home에 약 8,000 개의 디렉토리가 있고 약간 느린 경향이 있기 때문에 시나리오에 따라 내 컴퓨터 중 하나에서 gotgenes 제안을 사용해야합니다.
jkerian

1
비슷한 것이 cscope있습니까?
szx

45

C 개발을위한 또 다른 유용한 플러그인은 cscope입니다. Ctags를 사용하여 정의로 이동할 수있는 것처럼 Cscope는 호출로 이동합니다. 함수로 합니다.

~ / bin / 디렉토리에 cscope가 있으면 .vimrc에 다음을 추가하고 g ^]를 사용하여 호출 함수로 이동하십시오 (: help cscope 참조).

if has("cscope")
    set csprg=~/bin/cscope
    set csto=0
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
        cs add cscope.out
        " else add database pointed to by environment
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif
endif

거의 잊어 버렸습니다 ... ctags와 마찬가지로 데이터베이스를 생성하고 주기적으로 업데이트해야합니다. 다음 스크립트를 사용합니다

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

여기서 'select_files'는 Makefile에서 C 및 헤더 파일 목록을 추출하는 또 다른 스크립트입니다. 이 방법으로 프로젝트에서 실제로 사용하는 파일 만 인덱싱합니다.


ctags보다 cscope의 장점은 무엇입니까? 그들은 서로를 칭찬합니까?
Whaledawg

4
그들은 서로를 보완합니다. Ctags는 기호 또는 함수의 정의를 찾습니다. Cscope는 함수를 호출하는 모든 장소를 찾을 수 있습니다. 둘 다 사용하면 큰 소스 트리에서 탐색이 매우 쉽습니다.
nimrodm

1
그러나 AFAIK cscope에는 C ++에 대한 이해가 제한되어 있습니다.
Luc Hermitte

그것은 제한적이고 그리 좋지 않습니다. 그러나 그것이 사용하는 것 (USAGES로 점프)에 대한 더 나은 대안은 없습니다. 가장 큰 문제는 함수 호출 (f)로 건너 뛰고 싶을 때 기호가 사용되는 곳으로 건너 뛰고 결과를 정신적으로 필터링해야한다는 것입니다.
Greg Rogers

2
내가 CTRL +를 누르면 @Whaledawg 예] 내 사운드 카드 : 출력에 "clap.wav"를 전송
파트 리 지오 Rullo

27

ctags 조회에 디렉토리를 추가 할 수 있습니다. 예를 들어, Qt4 용으로 작성된 ctags 색인이 있고 내 .vimrc에 있습니다.

set tags+=/usr/local/share/ctags/qt4


16

ALT- 왼쪽 및 ALT- 오른쪽을 사용하여 태그 스택을 팝 / 푸시합니다.

" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

당신이 사용하는 경우 hjkl운동 당신은 매핑 할 수 <M-h><M-l>대신.


ctrl-] 및 ctrl-t와 동일하지 않습니다. 귀하의 제안은 좀 더 깨끗합니다.

@ 사샤, 사면? 무슨 말을하는지 모르겠다. = X 참고로 이것은 : help에서도 작동합니다.
strager

2
나는 이것이 기본값보다 더 직관적이고 깨끗하다고 ​​생각합니다.
Ayman

1
@Ayman 그러나 hjkl 대 화살표 키를 사용하는 것과 같이 집에서 손을 옮길 필요가 없다는 원칙을 위반합니다.
TankorSmash

@TankorSmash, 어떤 원리?
트래 거

10

동일한 이름의 여러 정의

<C-w>g<C-]> 분할에서 정의를 열고 :tjump 나 정의로 이동하거나 여러 정의가있는 경우 선택할 정의 목록을 제공합니다.


2
첫 번째 명령과 마찬가지로 vim에는 :ptag미리보기 창에서 정의를 여는 명령이 있습니다.
idbrii

1
미리보기 창은 커서를 미리보기 창으로 이동하지 않고도 다른 창에서 : pc로 창을 닫을 수 있기 때문에 좋습니다.
Heikki Naski

:h CursorHold-example구성 가능한 시간 초과 후 미리보기 창에서 커서 아래에 항목에 대한 태그를 표시하는 ptag의 깔끔한 autocmd 트릭도 있습니다 .
dash-tom-bang

ptag가 : - : 내가 지금 구속했습니다 tjump : 함께이 동작을 결합겠습니까 사랑 이럴 tjump <CR> <의 Cw> <CR> 더 <] C> 이상 작동을위한 한
안드레아스 Fliesberg

:help멋진 때때로는 ... 볼 수있다 :help CTRL-W_g}:ptjump
안드레아스 Fliesberg에게

8

내가 가장 많이 사용하는 명령은 C-]이며 커서 아래의 함수 정의로 이동합니다. 더 자주 전화를 걸기 위해 더 자주 사용할 수 있습니다. 그 후, Co는 한 수준으로 돌아가고 Ci는 다시 더 깊어집니다.


16
Ct는 C-] 스택에서 한 레벨 뒤로 돌아가고 Co는 이동 후 이전 커서 위치로 돌아갑니다. 따라서 함수에 C-]를 누른 다음 페이지 아래로 내려 가면 Ct가 즉시 되돌아 가고 Co는 함수의 시작 부분으로 되돌아 간 다음 호출 돌아갑니다.
Greg Hewgill

6

태그 목록 플러그인이 필수 아이템 인 것을 발견했습니다 . 별도의 창에 알고있는 모든 태그 (열린 파일)가 나열되며 더 큰 파일을 쉽게 탐색 할 수 있습니다.

나는 주로 파이썬 개발에 사용하지만 C / C ++에만 더 좋을 수 있습니다.




4

내 .gvimrc 파일에 다음을 넣습니다. gvim이 시작될 때 언제든지 트리에서 태그 파일을 검색합니다.

function SetTags()
    let curdir = getcwd()

    while !filereadable("tags") && getcwd() != "/"
        cd ..
    endwhile

    if filereadable("tags")
        execute "set tags=" . getcwd() . "/tags"
    endif

    execute "cd " . curdir
endfunction

call SetTags()

그런 다음 소스 트리 맨 위에있는 다음과 같은 스크립트를 사용하여 태그 파일을 주기적으로 재생성합니다.

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -

7
방금 상향 검색을 다시 발명했습니다. : h 파일 검색을 참조하십시오. 참조 stackoverflow.com/questions/563616/vimctags-tips-and-tricks/...
gotgenes

2

나는 macos에서 vim을 사용하고 원래 ctags는 잘 작동하지 않으므로 최신 버전을 다운로드하고 구성하여 설치하십시오. ctgas를 / usr / local / bin / ctags에 설치합니다 (원본을 유지하기 위해)

"taglist
let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>

1

set tags+=./tags;/cscope에서 작동 하도록 위의 SetTags () 검색 기능을 수정했습니다 (동등한 대체해야 함 ). 작동하는 것 같습니다!

"cscope file-searching alternative
function SetCscope()
    let curdir = getcwd()

    while !filereadable("cscope.out") && getcwd() != "/"
            cd ..
                endwhile

    if filereadable("cscope.out")
            execute "cs add " . getcwd() . "/cscope.out"
                endif

    execute "cd " . curdir
    endfunction

call SetCscope()

3
gotgenes가 말했듯이, 당신은 방금 검색을 다시 발명했습니다. : h 파일 검색을 참조하십시오. 관련 예제는 이 플러그인 을 참조하십시오 .
idbrii

1

위의 SetCscope () 함수에 대한 또 다른 반복. "cscope.out"이 다음 디렉토리에 있지 않고 cscope pre-path가 일치하도록 설정합니다.

function s:FindFile(file)
    let curdir = getcwd()
    let found = curdir
    while !filereadable(a:file) && found != "/"
        cd ..
        let found = getcwd()
    endwhile
    execute "cd " . curdir
    return found
endfunction

if has('cscope')    
    let $CSCOPE_DIR=s:FindFile("cscope.out")
    let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out"
    if filereadable($CSCOPE_DB)
        cscope add $CSCOPE_DB $CSCOPE_DIR
    endif

    command -nargs=0 Cscope !cscope -ub -R &
endif

3
gotgenes가 말했듯이, 당신은 방금 검색을 다시 발명했습니다. : h 파일 검색을 참조하십시오. 관련 예제는 이 플러그인 을 참조하십시오 .
idbrii
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.