본문 바로가기

Program Language and Algorithm

vi로 코딩하기~~vol.3 ctags의 활용

반응형
  이번엔 누구나 알듯한 ctags에 대해 다루도록 합니다..^^

  ctags는 속도가 빠른 vi에게 날개를 붙여 주는 프로그램이죠..^^
  ctags라는 날개를 얻음으로서 vi는 함수들 사이를 마구 마구 날아다닐 것입니다.

  vi의 장점은 숙련 되었을때 높은 에디트 능력과 속도를 제공한다는 데에 있습니다. 그 주요점은 검색&치환 입니다.windows를 사용할때 우린 검색 기능은 사용하지 않습니다. 드라이브 전체를 뒤지는 일이 있어도 윈도우의 내장 검색 기능은 무시해 버리죠...왜냐하면 한번 돌리면 퇴근해야 하니까요..ㅡㅡ;; 하지만 리눅스는 다릅니다. 현재 제 피씨의 하드 디스크는 320기가와 서브 백업용으로 1테라 입니다. 320기가는 거의 모든 영역을 사용하고 있구요. 하지만 리눅스의 검색명령을 내리고 키보드 옆에 커피를 몇 모금 마시고 나면 결과물이 나와 있습니다. 또 그 이후 검색은 몇초 걸리지도 않구요. (아마 내부적으로 태그를 사용하겠죠..^^) 이런 리눅스의 장점은 vi에서도 적용 됩니다. vi의 검색 및 치환 기능은 최고라고 해도 별 문제 없을 것입니다.(vol.1참조) ctags는 이런 기능의 확장이 됩니다.
  연관되는 함수의 태그를 생성해두고 사용자가 원할때 그 태그를 이용 원하는 함수로 이동시켜 주는게 ctags의 기능 입니다.

  일단 설치..^^
  sudo apt-get install ctags
  간단하죠..^^ 하지만 이걸로 끝일리는 없습니다. 우리는 프로그램을 짜면서 수많은 시스템 함수들을 사용합니다. ctags는 당연히 그녀석들의 태그도 가지고 있어야 겠죠..^^( 전 별로 시스템 쪽 태그는 사용하지 않습니다. 이 보다는 http://www.cplusplus.com/ 를 더 애용하는 편입니다. ) 웹에서 리눅스 커널 소스를 검색하시면 바로 찾으실수 있으실 거에요. 이 녀석을 원하는 곳에 풀어 놓으시고 폴더 안에서 ctag -R 명령을 내립니다. 이는 ctags가 사용할 tags 파일을 생성하는데 -R 옵션으로 인해서 제귀적(하위 폴더 포함) 생성을 하게 됩니다.
  자 폴더에 tags라는 이름의 파일이 생성 되었죠. 이제 vi가 이 tags파일에 접근하게 해줘야 겠죠..^^ 또 .vimrc파일 입니다.

set=./tags,/home/sbin550/workspace/kernel/linux-2.6.22.4/tags,../tags

  이녀석이 필요한 태그들을 링크하는 거죠..^^ 저같은 경우 시스템 커널의 소스가 제 workspace에 kernel이라는 폴더 안에 있군요. 이렇게 연결 해주셨으면 이제 ctags는 시스템 함수도 쉽게 찾아 줄것입니다.

  이제 vi를 쓰면서 ctags를 애용해 주시면 됩니다.
  사용법은 다음과 같습니다.

  :sts [함수명]
  :tj [함수명]

  입니다. printf함수를 찾고 싶다면 :tj printf라고 치면 되는 거죠. 그럼 유효한 함수 리스트가 디스플레이 되고 우린 그중 원하는 걸 선택하면 됩니다.sts와 tj의 차이는 창분할에 있습니다 tj는 현재 창이 이동하지만 sts는 창이 수평 분할 하게 됩니다. 전 이중 tj를 추천합니다. 왜냐하면 창이 분할 될 경우 창들 간 커서를 이동하는 명령을 이용하서 코딩해야 하는데 전....이게 귀찮아서 안쓰다 보니..ㅡㅡ;; 기억과 절교 했더군요....또 분할 된 화면을 좋아하는 프로그래머는 없지 않을까요....코드는 한번에 봐야 제맛이죠..^.~ 또 tj의 경우 이동 전 커서의 위치를 stack 에 넣어 둔답니다 그래서 언제든 돌아 가고 싶을때 "ctrl + t"만 눌러 주면 됩니다.^^
  이를 통해 우린 함수 사이로 마구 종횡무진 뛰어 다닐수 있습니다. 헌데 먼가 2%부족한 감이 있죠...:tj [함수명]입력하기 귀찮습니다. 그리고 저같은 경우 보통 함수 명도 모든 의미를 담아야한다는 주의 (sbin programming skill vol.2 참조) 이기 때문에 함수명이 상당히 깁니다. 이걸 언제 다 입력하고 있나요....제 .vimrc를 보시면 set tags 아래 추가적인 설정이 되어 있는 걸 보실 수 있으실 것입니다.
if version >= 500
     func! Sts()
         let st = expand("")
         exe "sts ".st
     endfunc
     nmap ,st : call Sts()
 
     func! Tj()
         let st = expand("")
         exe "tj ".st
     endfunc
     nmap ,tj :call Tj()
 endif
   bash로 출력했더니 이상한 값이 좀 변하거나 쓰래기 값이 들어 갔네요..>,.< 첫줄 gt는 if version >= 500 입니다.
   또 endif뒤의 명령은 무시해 주세요. 원본의 위의 스샷에 있죠...^^
 각각 sts와 tj를 쉽게 사용할 수 있도록 만들어 주는 펑션입니다. 이는 "유닉스.리눅스 프로그래밍 필수 유틸리티" 의 저자가 설정한 내역이구요..전...스크립트 언어를 잘 모릅니다...ㅜㅜ;; 곧 배워 둬야 겠다고 생각은 하고 있지만요... 제가 붙여 쓴 이상 설명도 불가능 한건 당연지사..^^ 여러분도 스크립트 언어를 공부하실게 아니시라면 특별히 분석하실 필요는 없겠죠..^^ 하지만 리눅스를 쓰면서 제가 느낀 바로는 언제 제대로 배워야 할듯한 언어 더군요..^^ 암튼 이녀석들을 .vimrc에 입력해 주세요. 이제 함수명을 다 입력하실 이유는 없습니다.
  원하는 함수를 호출 하는 부분에 커서를 위치 시킨후 ",tj"를 입력하세요. 머 매우 미약한 스크립트언어 이지만 제가 분석한 바로는 커서가 위치한 문자열을 기초로
  :tj [문자열]
  명령을 내려주는 거죠..^^ 그렇기 때문에 커서 아래에는 원하는 함수의 이름이 써있어야 합니다...^^
  또 하나 관련된 태그가 없습니다. 라는 메시지가 출력될 경우 "ctrl + shift +n"을 입력하세요..^^ 그럼 같은 폴더로 새로운 터미널이 뜨죠 거기서 입력합니다 ctags -R 당연히 내용은 tags파일을 새로 갱신하는 것입니다. 다시 창을 닫고 명령을 내리면 이동할 거에요...안되면 철자가 틀린거죠..^^

  vol 3.는 너무 짧네요..^^ 원체 ctags자체가 기능은 정말 좋지만 딱히 설명할 건 없는거 같아요..>,.< 이외 에도 ctags에는 만은 명령어(대략 20가지) 가 있지만 전 안쓰니까 설명도 안 합니다. 여러분도 한번 훌어 보시면 저와 같은 결론을 내리시게 될거 에요.
  정말 필요한 정보는 이렇죠
  원하는 함수에 커서를 두고 ,tj 입력시 함수 선언부로 이동
  "ctrl+t"를 누를 경우 이전 함수(,tj로 이동 진전 위치)로 이동

이상 입니다...^^

 그럼 vol.4에서는 cscope를 다루겠습니다.
반응형